import { column, BaseModel, SnakeCaseNamingStrategy, belongsTo, BelongsTo } from '@ioc:Adonis/Lucid/Orm'; import User from './User'; import { DateTime } from 'luxon'; import dayjs from 'dayjs'; import Encryption from '@ioc:Adonis/Core/Encryption'; export default class TotpSecret extends BaseModel { public static namingStrategy = new SnakeCaseNamingStrategy(); public static table = 'totp_secrets'; // public static fillable: string[] = ['value', 'label', 'type', 'relation']; @column({ isPrimary: true, }) public id: number; @column({}) public user_id: number; // @column() // public twoFactorSecret: string; @column({ serializeAs: null, consume: (value: string) => (value ? JSON.parse(Encryption.decrypt(value) ?? '{}') : null), prepare: (value: string) => Encryption.encrypt(JSON.stringify(value)), }) public twoFactorSecret?: string | null; // serializeAs: null removes the model properties from the serialized output. @column({ serializeAs: null, consume: (value: string) => (value ? JSON.parse(Encryption.decrypt(value) ?? '[]') : []), prepare: (value: string[]) => Encryption.encrypt(JSON.stringify(value)), }) public twoFactorRecoveryCodes?: string[] | null; @column({}) public state: number; @column.dateTime({ serialize: (value: Date | null) => { // return value ? moment(value).format('MMMM Do YYYY, HH:mm:ss') : value; return value ? dayjs(value).format('MMMM D YYYY HH:mm a') : value; }, autoCreate: true, }) public created_at: DateTime; @column.dateTime({ serialize: (value: Date | null) => { return value ? dayjs(value).format('MMMM D YYYY HH:mm a') : value; }, autoCreate: true, autoUpdate: true, }) public updated_at: DateTime; @belongsTo(() => User, { foreignKey: 'user_id', }) public user: BelongsTo; }