import { MigrationInterface, QueryRunner, Table, TableForeignKey, } from 'typeorm'; export class InitialSchema1719600000000 implements MigrationInterface { name = 'InitialSchema1719600000000'; public async up(queryRunner: QueryRunner): Promise { await queryRunner.query( `CREATE TYPE "public"."users_role_enum" AS ENUM('admin', 'salon-owner', 'customer')`, ); await queryRunner.createTable( new Table({ name: 'users', columns: [ { name: 'id', type: 'uuid', isPrimary: true, generationStrategy: 'uuid', default: 'gen_random_uuid()', }, { name: 'firstName', type: 'varchar', length: '100' }, { name: 'lastName', type: 'varchar', length: '100' }, { name: 'mobile', type: 'varchar', length: '11', isUnique: true }, { name: 'role', type: 'users_role_enum', default: `'customer'`, }, { name: 'createdAt', type: 'timestamp', default: 'now()' }, { name: 'updatedAt', type: 'timestamp', default: 'now()' }, ], }), true, ); await queryRunner.createTable( new Table({ name: 'salons', columns: [ { name: 'id', type: 'uuid', isPrimary: true, generationStrategy: 'uuid', default: 'gen_random_uuid()', }, { name: 'name', type: 'varchar', length: '200' }, { name: 'description', type: 'text', isNullable: true }, { name: 'address', type: 'varchar', length: '500' }, { name: 'phone', type: 'varchar', length: '11' }, { name: 'ownerId', type: 'uuid' }, { name: 'createdAt', type: 'timestamp', default: 'now()' }, { name: 'updatedAt', type: 'timestamp', default: 'now()' }, ], }), true, ); await queryRunner.createForeignKey( 'salons', new TableForeignKey({ columnNames: ['ownerId'], referencedTableName: 'users', referencedColumnNames: ['id'], onDelete: 'CASCADE', }), ); await queryRunner.createTable( new Table({ name: 'customers', columns: [ { name: 'id', type: 'uuid', isPrimary: true, generationStrategy: 'uuid', default: 'gen_random_uuid()', }, { name: 'userId', type: 'uuid', isUnique: true }, { name: 'dateOfBirth', type: 'date' }, { name: 'address', type: 'varchar', length: '500' }, { name: 'createdAt', type: 'timestamp', default: 'now()' }, { name: 'updatedAt', type: 'timestamp', default: 'now()' }, ], }), true, ); await queryRunner.createForeignKey( 'customers', new TableForeignKey({ columnNames: ['userId'], referencedTableName: 'users', referencedColumnNames: ['id'], onDelete: 'CASCADE', }), ); await queryRunner.createTable( new Table({ name: 'otps', columns: [ { name: 'id', type: 'uuid', isPrimary: true, generationStrategy: 'uuid', default: 'gen_random_uuid()', }, { name: 'mobile', type: 'varchar', length: '11' }, { name: 'code', type: 'varchar' }, { name: 'expiresAt', type: 'timestamp' }, { name: 'attempts', type: 'int', default: 0 }, { name: 'verified', type: 'boolean', default: false }, { name: 'createdAt', type: 'timestamp', default: 'now()' }, ], indices: [{ columnNames: ['mobile'] }], }), true, ); await queryRunner.createTable( new Table({ name: 'refresh_tokens', columns: [ { name: 'id', type: 'uuid', isPrimary: true, generationStrategy: 'uuid', default: 'gen_random_uuid()', }, { name: 'userId', type: 'uuid' }, { name: 'tokenHash', type: 'varchar' }, { name: 'expiresAt', type: 'timestamp' }, { name: 'revokedAt', type: 'timestamp', isNullable: true }, { name: 'createdAt', type: 'timestamp', default: 'now()' }, ], }), true, ); await queryRunner.createForeignKey( 'refresh_tokens', new TableForeignKey({ columnNames: ['userId'], referencedTableName: 'users', referencedColumnNames: ['id'], onDelete: 'CASCADE', }), ); await queryRunner.createTable( new Table({ name: 'permissions', columns: [ { name: 'id', type: 'uuid', isPrimary: true, generationStrategy: 'uuid', default: 'gen_random_uuid()', }, { name: 'code', type: 'varchar', isUnique: true }, { name: 'description', type: 'varchar' }, ], }), true, ); await queryRunner.createTable( new Table({ name: 'user_permissions', columns: [ { name: 'id', type: 'uuid', isPrimary: true, generationStrategy: 'uuid', default: 'gen_random_uuid()', }, { name: 'userId', type: 'uuid' }, { name: 'permissionId', type: 'uuid' }, ], uniques: [{ columnNames: ['userId', 'permissionId'] }], }), true, ); await queryRunner.createForeignKey( 'user_permissions', new TableForeignKey({ columnNames: ['userId'], referencedTableName: 'users', referencedColumnNames: ['id'], onDelete: 'CASCADE', }), ); await queryRunner.createForeignKey( 'user_permissions', new TableForeignKey({ columnNames: ['permissionId'], referencedTableName: 'permissions', referencedColumnNames: ['id'], onDelete: 'CASCADE', }), ); } public async down(queryRunner: QueryRunner): Promise { await queryRunner.dropTable('user_permissions', true); await queryRunner.dropTable('permissions', true); await queryRunner.dropTable('refresh_tokens', true); await queryRunner.dropTable('otps', true); await queryRunner.dropTable('customers', true); await queryRunner.dropTable('salons', true); await queryRunner.dropTable('users', true); await queryRunner.query(`DROP TYPE "public"."users_role_enum"`); } }