229 lines
6.5 KiB
TypeScript
229 lines
6.5 KiB
TypeScript
import {
|
|
MigrationInterface,
|
|
QueryRunner,
|
|
Table,
|
|
TableForeignKey,
|
|
} from 'typeorm';
|
|
|
|
export class InitialSchema1719600000000 implements MigrationInterface {
|
|
name = 'InitialSchema1719600000000';
|
|
|
|
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
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<void> {
|
|
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"`);
|
|
}
|
|
}
|