import hash from '@adonisjs/core/services/hash' import { compose } from '@adonisjs/core/helpers' import { withAuthFinder } from '@adonisjs/auth/mixins/lucid' import { DbAccessTokensProvider } from '@adonisjs/auth/access_tokens' import { BaseModel, column, manyToMany } from '@adonisjs/lucid/orm' import type { ManyToMany } from '@adonisjs/lucid/types/relations' import { DateTime } from 'luxon' import Role from '#base_modules/Role/model/role' import Permission from '#base_modules/Permission/model/permission' import Tenant from '#base_modules/Tenant/model/tenant' const AuthFinder = withAuthFinder(() => hash.use('scrypt'), { uids: ['email'], passwordColumnName: 'password', }) const ComposedModel = compose(BaseModel, AuthFinder) as typeof BaseModel export default class Admins extends ComposedModel { static searchable = { string: ['email', 'first_name', 'last_name'], number: ['id'], } @column({ isPrimary: true, columnName: 'id' }) declare id: number @column({ columnName: 'first_name' }) declare firstName: string | null @column({ columnName: 'last_name' }) declare lastName: string | null @column({ columnName: 'email' }) declare email: string @column({ columnName: 'status' }) declare status: 'active' | 'inactive' @column({ serializeAs: null, columnName: 'password' }) declare password: string @column.dateTime({ autoCreate: true, columnName: 'created_at' }) declare createdAt: DateTime @column.dateTime({ autoCreate: true, autoUpdate: true, columnName: 'updated_at' }) declare updatedAt: DateTime | null @manyToMany(() => Role, { pivotTable: 'admin_roles', pivotForeignKey: 'admin_id', pivotRelatedForeignKey: 'role_id', }) declare roles: ManyToMany @manyToMany(() => Tenant, { pivotTable: 'admin_tenants', pivotForeignKey: 'admin_id', pivotRelatedForeignKey: 'tenant_id', }) declare tenants: ManyToMany declare permissions: Permission[] static accessTokens = DbAccessTokensProvider.forModel(Admins) async loadPermissions() { this.permissions = await Permission.query() .join('role_permissions', 'permissions.id', 'role_permissions.permission_id') .join('admin_roles', 'role_permissions.role_id', 'admin_roles.role_id') .where('admin_roles.admin_id', this.id) .exec() return this } }