api/app/models/user.ts
2026-02-25 00:04:44 +01:00

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
}