From 40181a973ba7a20197bfbb6456886f5e8989a86b Mon Sep 17 00:00:00 2001 From: Alice Gaudon Date: Fri, 24 Jul 2020 16:13:15 +0200 Subject: [PATCH] Fix user schema --- .../migrations/FixUserMainEmailRelation.ts | 29 +++++++++++++++++++ src/auth/models/User.ts | 4 ++- src/auth/models/UserEmail.ts | 21 -------------- test/_migrations.ts | 2 ++ 4 files changed, 34 insertions(+), 22 deletions(-) create mode 100644 src/auth/migrations/FixUserMainEmailRelation.ts diff --git a/src/auth/migrations/FixUserMainEmailRelation.ts b/src/auth/migrations/FixUserMainEmailRelation.ts new file mode 100644 index 0000000..ab77fea --- /dev/null +++ b/src/auth/migrations/FixUserMainEmailRelation.ts @@ -0,0 +1,29 @@ +import Migration from "../../db/Migration"; +import {Connection} from "mysql"; + +export default class FixUserMainEmailRelation extends Migration { + public async install(connection: Connection): Promise { + await this.query(`ALTER TABLE users + ADD COLUMN main_user_email_id INT, + ADD FOREIGN KEY main_user_email_fk (main_user_email_id) REFERENCES user_emails (id)`, connection); + await this.query(`UPDATE users u LEFT JOIN user_emails ue ON u.id = ue.user_id + SET u.main_user_email_id=ue.id + WHERE ue.main = true`, connection); + await this.query(`ALTER TABLE user_emails + DROP COLUMN main`, connection); + } + + public async rollback(connection: Connection): Promise { + await this.query(`ALTER TABLE user_emails + ADD COLUMN main BOOLEAN DEFAULT false`, connection); + await this.query(`UPDATE user_emails ue LEFT JOIN users u ON ue.id = u.main_user_email_id + SET ue.main = true`, connection) + await this.query(`ALTER TABLE users + DROP FOREIGN KEY main_user_email_fk, + DROP COLUMN main_user_email_id`, connection); + } + + public registerModels(): void { + } + +} \ No newline at end of file diff --git a/src/auth/models/User.ts b/src/auth/models/User.ts index dd67de5..8155280 100644 --- a/src/auth/models/User.ts +++ b/src/auth/models/User.ts @@ -14,6 +14,7 @@ export default class User extends Model { public readonly id?: number = undefined; public name?: string = undefined; + public main_user_email_id?: number = undefined; public is_admin: boolean = false; public created_at?: Date = undefined; public updated_at?: Date = undefined; @@ -23,7 +24,7 @@ export default class User extends Model { foreignKey: 'user_id' }); - public readonly mainEmail = this.emails.cloneReduceToOne().constraint(q => q.where('main', true)); + public readonly mainEmail = this.emails.cloneReduceToOne().constraint(q => q.where('id', this.main_user_email_id)); public constructor(data: any) { super(data); @@ -31,6 +32,7 @@ export default class User extends Model { protected init(): void { this.setValidation('name').acceptUndefined().between(3, 64); + this.setValidation('main_user_email_id').acceptUndefined().exists(UserEmail, 'id'); if (User.isApprovalMode()) { this.setValidation('approved').defined(); } diff --git a/src/auth/models/UserEmail.ts b/src/auth/models/UserEmail.ts index fe99ed9..ced7eb2 100644 --- a/src/auth/models/UserEmail.ts +++ b/src/auth/models/UserEmail.ts @@ -9,7 +9,6 @@ export default class UserEmail extends Model { public readonly id?: number = undefined; public user_id?: number = undefined; public readonly email?: string = undefined; - private main?: boolean = undefined; public created_at?: Date = undefined; public readonly user = new OneModelRelation(this, ModelFactory.get(User), { @@ -17,8 +16,6 @@ export default class UserEmail extends Model { foreignKey: 'id' }); - private _wasSetToMain: boolean = false; - constructor(data: any) { super(data); } @@ -28,22 +25,4 @@ export default class UserEmail extends Model { this.setValidation('email').defined().regexp(EMAIL_REGEX).unique(this); this.setValidation('main').defined(); } - - protected async beforeSave(exists: boolean, connection: Connection) { - if (this._wasSetToMain) { - await query(`UPDATE ${this.table} SET main=false WHERE user_id=${this.user_id}`, null, connection); - this._wasSetToMain = false; - } - } - - public isMain(): boolean { - return Boolean(this.main); - } - - public setMain() { - if (!this.isMain()) { - this.main = true; - this._wasSetToMain = true; - } - } } diff --git a/test/_migrations.ts b/test/_migrations.ts index aa64fdd..2579d01 100644 --- a/test/_migrations.ts +++ b/test/_migrations.ts @@ -1,9 +1,11 @@ import CreateMigrationsTable from "../src/migrations/CreateMigrationsTable"; import CreateLogsTable from "../src/migrations/CreateLogsTable"; import CreateUsersAndUserEmailsTable from "../src/auth/migrations/CreateUsersAndUserEmailsTable"; +import FixUserMainEmailRelation from "../src/auth/migrations/FixUserMainEmailRelation"; export const MIGRATIONS = [ CreateMigrationsTable, CreateLogsTable, CreateUsersAndUserEmailsTable, + FixUserMainEmailRelation, ]; \ No newline at end of file