70 lines
2.9 KiB
JavaScript
70 lines
2.9 KiB
JavaScript
import { normalizeEmail } from '../../lib/auth.js'
|
|
import { prisma } from '../../lib/prisma.js'
|
|
|
|
export async function registerAdminProfileRoutes(fastify) {
|
|
fastify.get('/api/admin/profile', { preHandler: [fastify.verifyAdmin] }, async (request, reply) => {
|
|
const userId = request.user.sub
|
|
const user = await prisma.user.findUnique({ where: { id: userId } })
|
|
if (!user) return reply.code(404).send({ error: 'Пользователь не найден' })
|
|
return {
|
|
id: user.id,
|
|
email: user.email,
|
|
displayName: user.displayName,
|
|
avatar: user.avatar,
|
|
avatarStyle: user.avatarStyle,
|
|
}
|
|
})
|
|
|
|
fastify.get('/api/admin/avatar', async (request, reply) => {
|
|
const adminEmail = normalizeEmail(process.env.ADMIN_EMAIL)
|
|
if (!adminEmail || !adminEmail.includes('@')) return reply.code(404).send({ error: 'Администратор не найден' })
|
|
|
|
const user = await prisma.user.findUnique({ where: { email: adminEmail } })
|
|
if (!user) return reply.code(404).send({ error: 'Администратор не найден' })
|
|
|
|
return {
|
|
avatar: user.avatar,
|
|
avatarStyle: user.avatarStyle,
|
|
}
|
|
})
|
|
|
|
fastify.patch('/api/admin/profile', { preHandler: [fastify.verifyAdmin] }, async (request, reply) => {
|
|
const userId = request.user.sub
|
|
const nameRaw = request.body?.displayName
|
|
const displayName =
|
|
nameRaw === undefined ? undefined : nameRaw === null ? null : nameRaw === '' ? null : String(nameRaw).trim()
|
|
const avatarRaw = request.body?.avatar
|
|
const avatar = avatarRaw === null || avatarRaw === undefined ? undefined : String(avatarRaw).trim()
|
|
const avatarStyleRaw = request.body?.avatarStyle
|
|
const avatarStyle =
|
|
avatarStyleRaw === null || avatarStyleRaw === undefined ? undefined : String(avatarStyleRaw).trim()
|
|
|
|
if (displayName !== undefined && displayName !== null && displayName.length > 40)
|
|
return reply.code(400).send({ error: 'Имя/ник максимум 40 символов' })
|
|
if (avatar !== undefined && avatar.length > 200000) return reply.code(400).send({ error: 'Аватар слишком большой' })
|
|
if (avatarStyle !== undefined && avatarStyle !== '' && avatarStyle.length > 30) {
|
|
return reply.code(400).send({ error: 'Стиль аватара слишком длинный' })
|
|
}
|
|
|
|
const data = {}
|
|
if (displayName !== undefined) {
|
|
data.displayName = displayName && displayName.length ? displayName : null
|
|
}
|
|
if (avatar !== undefined) {
|
|
data.avatar = avatar === '' ? null : avatar
|
|
}
|
|
if (avatarStyle !== undefined) {
|
|
data.avatarStyle = avatarStyle === '' ? null : avatarStyle
|
|
}
|
|
|
|
const updated = await prisma.user.update({ where: { id: userId }, data })
|
|
return {
|
|
id: updated.id,
|
|
email: updated.email,
|
|
displayName: updated.displayName,
|
|
avatar: updated.avatar,
|
|
avatarStyle: updated.avatarStyle,
|
|
}
|
|
})
|
|
}
|