76 lines
2.3 KiB
TypeScript
Executable File
76 lines
2.3 KiB
TypeScript
Executable File
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<typeof Role>
|
|
|
|
@manyToMany(() => Tenant, {
|
|
pivotTable: 'admin_tenants',
|
|
pivotForeignKey: 'admin_id',
|
|
pivotRelatedForeignKey: 'tenant_id',
|
|
})
|
|
declare tenants: ManyToMany<typeof Tenant>
|
|
|
|
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
|
|
}
|
|
}
|