feat: improve user serialization

This commit is contained in:
Nathan Lamy 2026-02-25 00:29:27 +01:00
parent 4bebf4af4d
commit 77213340b6
2 changed files with 33 additions and 49 deletions

View file

@ -10,11 +10,16 @@ export default class UserController {
// GET /users/@me
async me({ auth }: HttpContext) {
const user = auth.user!
return {
success: true,
data: {
...auth.user?.serialize(),
email: auth.user!.email || '',
...user.serialize(),
firstName: user.firstName,
lastName: user.lastName,
email: user.email,
preferences: user.preferences,
pastStudentId: user.pastStudentId,
},
}
}
@ -52,7 +57,14 @@ export default class UserController {
await user.save()
return {
success: true,
data: user,
data: {
...user.serialize(),
firstName: user.firstName,
lastName: user.lastName,
email: user.email,
preferences: user.preferences,
pastStudentId: user.pastStudentId,
},
}
}
@ -70,7 +82,14 @@ export default class UserController {
return response.notFound({ message: 'User not found' })
}
return { success: true, data: user }
return {
success: true,
data: {
...user.serialize(),
preferences: user.preferences,
pastStudentId: user.pastStudentId,
},
}
}
// POST /merge-student
@ -81,6 +100,13 @@ export default class UserController {
user.pastStudentId = pastStudentId
await user.save()
return { success: true, data: user }
return {
success: true,
data: {
...user.serialize(),
preferences: user.preferences,
pastStudentId: user.pastStudentId,
},
}
}
}

View file

@ -1,55 +1,14 @@
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.includes('/users/@me')
this.serializeExtras = isUsersRoute
const serialized = super.serialize()
if (!isUsersRoute) {
delete serialized.pastStudentId
delete serialized.extras
}
if (isMeRoute) {
console.log('Serializing full name for /users/@me route')
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()
@column({ serializeAs: null })
declare pastStudentId: number | null
@column()
@ -72,9 +31,8 @@ export default class User extends BaseModel {
@column({ serializeAs: null })
declare extras: Record<string, any>
@computed()
@computed({ serializeAs: null })
get preferences(): { name: string; emoji: string; color: string }[] {
if (!this.serializeExtras) return []
return this.extras?.preferences || []
}