Fix user schema
This commit is contained in:
parent
c0dd48d064
commit
40181a973b
29
src/auth/migrations/FixUserMainEmailRelation.ts
Normal file
29
src/auth/migrations/FixUserMainEmailRelation.ts
Normal file
@ -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<void> {
|
||||||
|
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<void> {
|
||||||
|
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 {
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -14,6 +14,7 @@ export default class User extends Model {
|
|||||||
|
|
||||||
public readonly id?: number = undefined;
|
public readonly id?: number = undefined;
|
||||||
public name?: string = undefined;
|
public name?: string = undefined;
|
||||||
|
public main_user_email_id?: number = undefined;
|
||||||
public is_admin: boolean = false;
|
public is_admin: boolean = false;
|
||||||
public created_at?: Date = undefined;
|
public created_at?: Date = undefined;
|
||||||
public updated_at?: Date = undefined;
|
public updated_at?: Date = undefined;
|
||||||
@ -23,7 +24,7 @@ export default class User extends Model {
|
|||||||
foreignKey: 'user_id'
|
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) {
|
public constructor(data: any) {
|
||||||
super(data);
|
super(data);
|
||||||
@ -31,6 +32,7 @@ export default class User extends Model {
|
|||||||
|
|
||||||
protected init(): void {
|
protected init(): void {
|
||||||
this.setValidation('name').acceptUndefined().between(3, 64);
|
this.setValidation('name').acceptUndefined().between(3, 64);
|
||||||
|
this.setValidation('main_user_email_id').acceptUndefined().exists(UserEmail, 'id');
|
||||||
if (User.isApprovalMode()) {
|
if (User.isApprovalMode()) {
|
||||||
this.setValidation('approved').defined();
|
this.setValidation('approved').defined();
|
||||||
}
|
}
|
||||||
|
@ -9,7 +9,6 @@ export default class UserEmail extends Model {
|
|||||||
public readonly id?: number = undefined;
|
public readonly id?: number = undefined;
|
||||||
public user_id?: number = undefined;
|
public user_id?: number = undefined;
|
||||||
public readonly email?: string = undefined;
|
public readonly email?: string = undefined;
|
||||||
private main?: boolean = undefined;
|
|
||||||
public created_at?: Date = undefined;
|
public created_at?: Date = undefined;
|
||||||
|
|
||||||
public readonly user = new OneModelRelation<UserEmail, User>(this, ModelFactory.get(User), {
|
public readonly user = new OneModelRelation<UserEmail, User>(this, ModelFactory.get(User), {
|
||||||
@ -17,8 +16,6 @@ export default class UserEmail extends Model {
|
|||||||
foreignKey: 'id'
|
foreignKey: 'id'
|
||||||
});
|
});
|
||||||
|
|
||||||
private _wasSetToMain: boolean = false;
|
|
||||||
|
|
||||||
constructor(data: any) {
|
constructor(data: any) {
|
||||||
super(data);
|
super(data);
|
||||||
}
|
}
|
||||||
@ -28,22 +25,4 @@ export default class UserEmail extends Model {
|
|||||||
this.setValidation('email').defined().regexp(EMAIL_REGEX).unique(this);
|
this.setValidation('email').defined().regexp(EMAIL_REGEX).unique(this);
|
||||||
this.setValidation('main').defined();
|
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,11 @@
|
|||||||
import CreateMigrationsTable from "../src/migrations/CreateMigrationsTable";
|
import CreateMigrationsTable from "../src/migrations/CreateMigrationsTable";
|
||||||
import CreateLogsTable from "../src/migrations/CreateLogsTable";
|
import CreateLogsTable from "../src/migrations/CreateLogsTable";
|
||||||
import CreateUsersAndUserEmailsTable from "../src/auth/migrations/CreateUsersAndUserEmailsTable";
|
import CreateUsersAndUserEmailsTable from "../src/auth/migrations/CreateUsersAndUserEmailsTable";
|
||||||
|
import FixUserMainEmailRelation from "../src/auth/migrations/FixUserMainEmailRelation";
|
||||||
|
|
||||||
export const MIGRATIONS = [
|
export const MIGRATIONS = [
|
||||||
CreateMigrationsTable,
|
CreateMigrationsTable,
|
||||||
CreateLogsTable,
|
CreateLogsTable,
|
||||||
CreateUsersAndUserEmailsTable,
|
CreateUsersAndUserEmailsTable,
|
||||||
|
FixUserMainEmailRelation,
|
||||||
];
|
];
|
Loading…
Reference in New Issue
Block a user