swaf/src/auth/models/User.ts

58 lines
2.1 KiB
TypeScript

import config from "config";
import Model from "../../db/Model.js";
import {ManyModelRelation} from "../../db/ModelRelation.js";
import MysqlConnectionManager from "../../db/MysqlConnectionManager.js";
import AddApprovedFieldToUsersTableMigration from "../migrations/AddApprovedFieldToUsersTableMigration.js";
import UserApprovedComponent from "./UserApprovedComponent.js";
import UserEmail from "./UserEmail.js";
import UserNameComponent from "./UserNameComponent.js";
export default class User extends Model {
/**
* If true, new users are unapproved by default.
*/
public static isApprovalMode(): boolean {
return config.get<boolean>('auth.approval_mode') &&
MysqlConnectionManager.hasMigration(AddApprovedFieldToUsersTableMigration);
}
public readonly id?: number = undefined;
public main_email_id?: number = undefined;
public is_admin: boolean = false;
public created_at?: Date = undefined;
public updated_at?: Date = undefined;
public readonly emails = new ManyModelRelation(this, UserEmail, {
localKey: 'id',
foreignKey: 'user_id',
});
public readonly mainEmail = this.emails.cloneReduceToOne().constraint(q => q.where('id', this.main_email_id));
protected init(): void {
this.setValidation('name').acceptUndefined().between(3, 64);
this.setValidation('main_email_id').acceptUndefined().exists(UserEmail, 'id');
if (User.isApprovalMode()) {
this.setValidation('approved').defined();
}
this.setValidation('is_admin').defined();
}
public isApproved(): boolean {
return !User.isApprovalMode() || this.as(UserApprovedComponent).approved;
}
public getPersonalInfoFields(): { name: string, value: string }[] {
const fields: { name: string, value: string }[] = [];
const nameComponent = this.asOptional(UserNameComponent);
if (nameComponent && nameComponent.hasName()) {
fields.push({
name: 'Name',
value: nameComponent.getName(),
});
}
return fields;
}
}