Skip to content

Commit 4564f72

Browse files
committed
fix: improve migrations
1 parent 529016d commit 4564f72

File tree

10 files changed

+19990
-1643
lines changed

10 files changed

+19990
-1643
lines changed

apps/api-gateway/src/modules/auth/auth.controller.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ class LoginResponseBody {
1616

1717
class RegisterRequestBody {
1818
@ApiProperty() email: string;
19+
@ApiProperty() username: string;
1920
@ApiProperty() password: string;
2021
@ApiProperty({ required: false }) name?: string;
2122
@ApiProperty({ required: false }) avatar?: string;
@@ -24,20 +25,23 @@ class RegisterRequestBody {
2425

2526
class RegisterResponseBody {
2627
@ApiProperty() id: string;
28+
@ApiProperty() username: string;
2729
@ApiProperty({ required: false }) email?: string;
2830
@ApiProperty({ required: false }) name?: string;
2931
@ApiProperty({ required: false }) avatar?: string;
3032
@ApiProperty({ required: false }) bio?: string;
3133

3234
constructor(params: {
3335
id: string;
34-
email?: string;
36+
email: string;
37+
username: string;
3538
name?: string;
3639
avatar?: string;
3740
bio?: string;
3841
}) {
3942
this.id = params.id;
4043
this.email = params.email;
44+
this.username = params.username;
4145
this.name = params.name;
4246
this.avatar = params.avatar;
4347
this.bio = params.bio;
@@ -65,6 +69,7 @@ export class AuthController {
6569
const user = await this.authService.registerNewUser(body);
6670
return new RegisterResponseBody({
6771
id: user.id,
72+
username: user.username,
6873
email: user.email,
6974
name: user.name,
7075
avatar: user.avatar,

apps/api-gateway/src/modules/auth/auth.service.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ export class AuthService {
3131

3232
async registerNewUser(params: {
3333
email: string;
34+
username: string;
3435
password: string;
3536
name?: string;
3637
avatar?: string;
@@ -63,6 +64,7 @@ export class AuthService {
6364

6465
const newUser = this.userRepo.create({
6566
email,
67+
username: params.username,
6668
name,
6769
avatar,
6870
bio,
Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import {
22
CreateDateColumn,
3-
PrimaryColumn,
43
PrimaryGeneratedColumn,
54
UpdateDateColumn,
65
} from 'typeorm';
@@ -9,12 +8,20 @@ import {
98
* Base entity which is extended by all entities in our application.
109
*/
1110
export abstract class YooBaseEntity {
12-
@PrimaryColumn('uuid', { length: 36, unique: true })
11+
@PrimaryGeneratedColumn('uuid')
1312
id: string;
1413

1514
@CreateDateColumn({ name: 'created_at' })
1615
createdAt: Date;
1716

1817
@UpdateDateColumn({ name: 'updated_at' })
1918
updatedAt: Date;
19+
20+
// @BeforeInsert()
21+
// ensureId(): void {
22+
// // MySQL schema uses char(36) without default; generate UUID in app if missing
23+
// if (!this.id) {
24+
// this.id = randomUUID();
25+
// }
26+
// }
2027
}

apps/api-gateway/src/modules/users/users.entity.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { YooBaseEntity } from '../commons/base.entity';
44

55
@Entity('users')
66
export class UserEntity extends YooBaseEntity {
7-
@Column({ length: 30, nullable: true, unique: true })
7+
@Column({ length: 30, nullable: true })
88
username: string;
99

1010
@Column({ length: 255, nullable: false, unique: true })
Lines changed: 215 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,215 @@
1+
import { MigrationInterface, QueryRunner } from 'typeorm';
2+
3+
export class UpdateUsernameField1763367521803 implements MigrationInterface {
4+
name = 'UpdateUsernameField1763367521803';
5+
6+
public async up(queryRunner: QueryRunner): Promise<void> {
7+
await queryRunner.query(
8+
`CREATE TABLE \`sessions\` (\`id\` varchar(36) NOT NULL, \`created_at\` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), \`updated_at\` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6), \`user_id\` varchar(255) NOT NULL, PRIMARY KEY (\`id\`)) ENGINE=InnoDB`,
9+
);
10+
await queryRunner.query(
11+
`CREATE TABLE \`user_followings\` (\`id\` varchar(36) NOT NULL, \`created_at\` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), \`updated_at\` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6), \`follower_id\` varchar(36) NULL, \`followee_id\` varchar(36) NULL, UNIQUE INDEX \`following_pair\` (\`follower_id\`, \`followee_id\`), PRIMARY KEY (\`id\`)) ENGINE=InnoDB`,
12+
);
13+
14+
await queryRunner.query(
15+
`CREATE UNIQUE INDEX \`REL_72ee375de524a1d87396f4f2a0\` ON \`passwords\` (\`user_id\`)`,
16+
);
17+
await queryRunner.query(
18+
`CREATE UNIQUE INDEX \`REL_377cc801732eb1c22bab5597c6\` ON \`posts\` (\`orig_post_id\`)`,
19+
);
20+
await queryRunner.query(
21+
`CREATE UNIQUE INDEX \`REL_77d932fee463f3a2985034ecec\` ON \`posts\` (\`reply_to_id\`)`,
22+
);
23+
}
24+
25+
public async down(queryRunner: QueryRunner): Promise<void> {
26+
await queryRunner.query(
27+
`ALTER TABLE \`likes\` DROP FOREIGN KEY \`FK_3f519ed95f775c781a254089171\``,
28+
);
29+
await queryRunner.query(
30+
`ALTER TABLE \`likes\` DROP FOREIGN KEY \`FK_741df9b9b72f328a6d6f63e79ff\``,
31+
);
32+
await queryRunner.query(
33+
`ALTER TABLE \`user_followings\` DROP FOREIGN KEY \`FK_fd3f4cdcd53452ea09ea506eb79\``,
34+
);
35+
await queryRunner.query(
36+
`ALTER TABLE \`user_followings\` DROP FOREIGN KEY \`FK_0cd7f9e9f2d4af466cc095952dc\``,
37+
);
38+
await queryRunner.query(
39+
`ALTER TABLE \`sessions\` DROP FOREIGN KEY \`FK_085d540d9f418cfbdc7bd55bb19\``,
40+
);
41+
await queryRunner.query(
42+
`ALTER TABLE \`posts\` DROP FOREIGN KEY \`FK_77d932fee463f3a2985034ecec3\``,
43+
);
44+
await queryRunner.query(
45+
`ALTER TABLE \`posts\` DROP FOREIGN KEY \`FK_377cc801732eb1c22bab5597c67\``,
46+
);
47+
await queryRunner.query(
48+
`ALTER TABLE \`posts\` DROP FOREIGN KEY \`FK_312c63be865c81b922e39c2475e\``,
49+
);
50+
await queryRunner.query(
51+
`ALTER TABLE \`passwords\` DROP FOREIGN KEY \`FK_72ee375de524a1d87396f4f2a02\``,
52+
);
53+
await queryRunner.query(
54+
`DROP INDEX \`REL_77d932fee463f3a2985034ecec\` ON \`posts\``,
55+
);
56+
await queryRunner.query(
57+
`DROP INDEX \`REL_377cc801732eb1c22bab5597c6\` ON \`posts\``,
58+
);
59+
await queryRunner.query(
60+
`DROP INDEX \`REL_72ee375de524a1d87396f4f2a0\` ON \`passwords\``,
61+
);
62+
await queryRunner.query(`ALTER TABLE \`likes\` DROP COLUMN \`user_id\``);
63+
await queryRunner.query(
64+
`ALTER TABLE \`likes\` ADD \`user_id\` char(36) NOT NULL`,
65+
);
66+
await queryRunner.query(`ALTER TABLE \`likes\` DROP COLUMN \`post_id\``);
67+
await queryRunner.query(
68+
`ALTER TABLE \`likes\` ADD \`post_id\` char(36) NOT NULL`,
69+
);
70+
await queryRunner.query(`ALTER TABLE \`likes\` DROP COLUMN \`updated_at\``);
71+
await queryRunner.query(
72+
`ALTER TABLE \`likes\` ADD \`updated_at\` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP`,
73+
);
74+
await queryRunner.query(`ALTER TABLE \`likes\` DROP COLUMN \`created_at\``);
75+
await queryRunner.query(
76+
`ALTER TABLE \`likes\` ADD \`created_at\` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP`,
77+
);
78+
await queryRunner.query(`ALTER TABLE \`likes\` DROP COLUMN \`id\``);
79+
await queryRunner.query(
80+
`ALTER TABLE \`likes\` ADD \`id\` char(36) NOT NULL`,
81+
);
82+
await queryRunner.query(
83+
`ALTER TABLE \`posts\` DROP INDEX \`IDX_77d932fee463f3a2985034ecec\``,
84+
);
85+
await queryRunner.query(
86+
`ALTER TABLE \`posts\` DROP COLUMN \`reply_to_id\``,
87+
);
88+
await queryRunner.query(
89+
`ALTER TABLE \`posts\` ADD \`reply_to_id\` char(36) NULL`,
90+
);
91+
await queryRunner.query(
92+
`ALTER TABLE \`posts\` DROP INDEX \`IDX_377cc801732eb1c22bab5597c6\``,
93+
);
94+
await queryRunner.query(
95+
`ALTER TABLE \`posts\` DROP COLUMN \`orig_post_id\``,
96+
);
97+
await queryRunner.query(
98+
`ALTER TABLE \`posts\` ADD \`orig_post_id\` char(36) NULL`,
99+
);
100+
await queryRunner.query(`ALTER TABLE \`posts\` DROP COLUMN \`author_id\``);
101+
await queryRunner.query(
102+
`ALTER TABLE \`posts\` ADD \`author_id\` char(36) NULL`,
103+
);
104+
await queryRunner.query(`ALTER TABLE \`posts\` DROP COLUMN \`updated_at\``);
105+
await queryRunner.query(
106+
`ALTER TABLE \`posts\` ADD \`updated_at\` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP`,
107+
);
108+
await queryRunner.query(`ALTER TABLE \`posts\` DROP COLUMN \`created_at\``);
109+
await queryRunner.query(
110+
`ALTER TABLE \`posts\` ADD \`created_at\` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP`,
111+
);
112+
await queryRunner.query(`ALTER TABLE \`posts\` DROP COLUMN \`id\``);
113+
await queryRunner.query(
114+
`ALTER TABLE \`posts\` ADD \`id\` char(36) NOT NULL`,
115+
);
116+
await queryRunner.query(`ALTER TABLE \`posts\` ADD PRIMARY KEY (\`id\`)`);
117+
await queryRunner.query(
118+
`ALTER TABLE \`users\` DROP INDEX \`IDX_97672ac88f789774dd47f7c8be\``,
119+
);
120+
await queryRunner.query(
121+
`ALTER TABLE \`users\` DROP INDEX \`IDX_fe0bb3f6520ee0469504521e71\``,
122+
);
123+
await queryRunner.query(
124+
`ALTER TABLE \`users\` CHANGE \`username\` \`username\` varchar(30) NOT NULL`,
125+
);
126+
await queryRunner.query(`ALTER TABLE \`users\` DROP COLUMN \`updated_at\``);
127+
await queryRunner.query(
128+
`ALTER TABLE \`users\` ADD \`updated_at\` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP`,
129+
);
130+
await queryRunner.query(`ALTER TABLE \`users\` DROP COLUMN \`created_at\``);
131+
await queryRunner.query(
132+
`ALTER TABLE \`users\` ADD \`created_at\` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP`,
133+
);
134+
await queryRunner.query(`ALTER TABLE \`users\` DROP COLUMN \`id\``);
135+
await queryRunner.query(
136+
`ALTER TABLE \`users\` ADD \`id\` char(36) NOT NULL`,
137+
);
138+
await queryRunner.query(`ALTER TABLE \`users\` ADD PRIMARY KEY (\`id\`)`);
139+
await queryRunner.query(
140+
`ALTER TABLE \`passwords\` DROP INDEX \`IDX_72ee375de524a1d87396f4f2a0\``,
141+
);
142+
await queryRunner.query(
143+
`ALTER TABLE \`passwords\` DROP COLUMN \`user_id\``,
144+
);
145+
await queryRunner.query(
146+
`ALTER TABLE \`passwords\` ADD \`user_id\` char(36) NOT NULL`,
147+
);
148+
await queryRunner.query(
149+
`ALTER TABLE \`passwords\` DROP COLUMN \`updated_at\``,
150+
);
151+
await queryRunner.query(
152+
`ALTER TABLE \`passwords\` ADD \`updated_at\` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP`,
153+
);
154+
await queryRunner.query(
155+
`ALTER TABLE \`passwords\` DROP COLUMN \`created_at\``,
156+
);
157+
await queryRunner.query(
158+
`ALTER TABLE \`passwords\` ADD \`created_at\` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP`,
159+
);
160+
await queryRunner.query(`ALTER TABLE \`passwords\` DROP COLUMN \`id\``);
161+
await queryRunner.query(
162+
`ALTER TABLE \`passwords\` ADD \`id\` char(36) NOT NULL`,
163+
);
164+
await queryRunner.query(
165+
`ALTER TABLE \`passwords\` ADD PRIMARY KEY (\`id\`)`,
166+
);
167+
await queryRunner.query(
168+
`DROP INDEX \`following_pair\` ON \`user_followings\``,
169+
);
170+
await queryRunner.query(`DROP TABLE \`user_followings\``);
171+
await queryRunner.query(`DROP TABLE \`sessions\``);
172+
await queryRunner.query(
173+
`CREATE INDEX \`IDX_likes_user\` ON \`likes\` (\`user_id\`)`,
174+
);
175+
await queryRunner.query(
176+
`CREATE INDEX \`IDX_likes_post\` ON \`likes\` (\`post_id\`)`,
177+
);
178+
await queryRunner.query(
179+
`CREATE INDEX \`IDX_posts_reply\` ON \`posts\` (\`reply_to_id\`)`,
180+
);
181+
await queryRunner.query(
182+
`CREATE INDEX \`IDX_posts_orig\` ON \`posts\` (\`orig_post_id\`)`,
183+
);
184+
await queryRunner.query(
185+
`CREATE INDEX \`IDX_posts_author\` ON \`posts\` (\`author_id\`)`,
186+
);
187+
await queryRunner.query(
188+
`CREATE UNIQUE INDEX \`UQ_users_username\` ON \`users\` (\`username\`)`,
189+
);
190+
await queryRunner.query(
191+
`CREATE UNIQUE INDEX \`UQ_users_email\` ON \`users\` (\`email\`)`,
192+
);
193+
await queryRunner.query(
194+
`CREATE UNIQUE INDEX \`UQ_passwords_user_id\` ON \`passwords\` (\`user_id\`)`,
195+
);
196+
await queryRunner.query(
197+
`ALTER TABLE \`likes\` ADD CONSTRAINT \`FK_likes_user\` FOREIGN KEY (\`user_id\`) REFERENCES \`users\`(\`id\`) ON DELETE CASCADE ON UPDATE NO ACTION`,
198+
);
199+
await queryRunner.query(
200+
`ALTER TABLE \`likes\` ADD CONSTRAINT \`FK_likes_post\` FOREIGN KEY (\`post_id\`) REFERENCES \`posts\`(\`id\`) ON DELETE CASCADE ON UPDATE NO ACTION`,
201+
);
202+
await queryRunner.query(
203+
`ALTER TABLE \`posts\` ADD CONSTRAINT \`FK_posts_reply\` FOREIGN KEY (\`reply_to_id\`) REFERENCES \`posts\`(\`id\`) ON DELETE SET NULL ON UPDATE NO ACTION`,
204+
);
205+
await queryRunner.query(
206+
`ALTER TABLE \`posts\` ADD CONSTRAINT \`FK_posts_orig\` FOREIGN KEY (\`orig_post_id\`) REFERENCES \`posts\`(\`id\`) ON DELETE SET NULL ON UPDATE NO ACTION`,
207+
);
208+
await queryRunner.query(
209+
`ALTER TABLE \`posts\` ADD CONSTRAINT \`FK_posts_author\` FOREIGN KEY (\`author_id\`) REFERENCES \`users\`(\`id\`) ON DELETE SET NULL ON UPDATE NO ACTION`,
210+
);
211+
await queryRunner.query(
212+
`ALTER TABLE \`passwords\` ADD CONSTRAINT \`FK_passwords_user\` FOREIGN KEY (\`user_id\`) REFERENCES \`users\`(\`id\`) ON DELETE CASCADE ON UPDATE NO ACTION`,
213+
);
214+
}
215+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { MigrationInterface, QueryRunner } from 'typeorm';
2+
3+
export class UpdateEmailField1763368695043 implements MigrationInterface {
4+
name = 'UpdateEmailField1763368695043';
5+
6+
public async up(queryRunner: QueryRunner): Promise<void> {
7+
await queryRunner.query(
8+
`ALTER TABLE \`users\` ADD UNIQUE INDEX \`IDX_97672ac88f789774dd47f7c8be\` (\`email\`)`,
9+
);
10+
}
11+
12+
public async down(queryRunner: QueryRunner): Promise<void> {}
13+
}

database/migrations/index.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
11
import { InitSchema1730001000000 } from './1730001000000-InitSchema';
2+
import { UpdateUsernameField1763367521803 } from './1763367521803-UpdateUsernameField';
23

34
// Migration chain: baseline schema
4-
export const migrations = [InitSchema1730001000000];
5+
export const migrations = [
6+
InitSchema1730001000000,
7+
UpdateUsernameField1763367521803,
8+
];

0 commit comments

Comments
 (0)