85 lines
2 KiB
TypeScript
85 lines
2 KiB
TypeScript
import { DateTime } from 'luxon'
|
|
import { BaseModel, column, computed } from '@adonisjs/lucid/orm'
|
|
import { DbRememberMeTokensProvider } from '@adonisjs/auth/session'
|
|
import { HttpContext } from '@adonisjs/core/http'
|
|
|
|
export default class User extends BaseModel {
|
|
serializeExtras = true
|
|
|
|
serialize() {
|
|
const ctx = HttpContext.get()
|
|
|
|
if (!ctx) {
|
|
this.serializeExtras = false
|
|
const serialized = super.serialize()
|
|
delete serialized.pastStudentId
|
|
delete serialized.extras
|
|
return serialized
|
|
}
|
|
|
|
const requestUrl = ctx.request.url()
|
|
const isUsersRoute = requestUrl.startsWith('/users')
|
|
const isMeRoute = requestUrl === '/users/@me'
|
|
|
|
this.serializeExtras = isUsersRoute
|
|
|
|
const serialized = super.serialize()
|
|
if (!isUsersRoute) {
|
|
delete serialized.pastStudentId
|
|
delete serialized.extras
|
|
}
|
|
|
|
if (isMeRoute) {
|
|
serialized.firstName = this.firstName
|
|
serialized.lastName = this.lastName
|
|
}
|
|
|
|
if (this.serializeExtras) {
|
|
serialized.preferences = this.preferences
|
|
} else {
|
|
delete serialized.preferences
|
|
}
|
|
|
|
return serialized
|
|
}
|
|
|
|
static rememberMeTokens = DbRememberMeTokensProvider.forModel(User)
|
|
|
|
@column({ isPrimary: true })
|
|
declare id: number
|
|
|
|
@column()
|
|
declare pastStudentId: number | null
|
|
|
|
@column()
|
|
declare className: string
|
|
|
|
@column({ serializeAs: null })
|
|
declare firstName: string
|
|
|
|
@column({ serializeAs: null })
|
|
declare lastName: string
|
|
|
|
@computed()
|
|
get fullName() {
|
|
return `${this.firstName} ${this.lastName}`
|
|
}
|
|
|
|
@column({ serializeAs: null })
|
|
declare email: string
|
|
|
|
@column({ serializeAs: null })
|
|
declare extras: Record<string, any>
|
|
|
|
@computed()
|
|
get preferences(): { name: string; emoji: string; color: string }[] {
|
|
if (!this.serializeExtras) return []
|
|
return this.extras?.preferences || []
|
|
}
|
|
|
|
@column.dateTime({ autoCreate: true })
|
|
declare createdAt: DateTime
|
|
|
|
@column.dateTime({ autoCreate: true, autoUpdate: true })
|
|
declare updatedAt: DateTime | null
|
|
}
|