sinProject-Inc/talk

View on GitHub
src/routes/api/avatar/[user_id=user_id]/+server.ts

Summary

Maintainability
A
0 mins
Test Coverage
/* eslint-disable @typescript-eslint/naming-convention */

import { logger } from '$lib/app/logger'
import { Repository } from '$lib/app/repository'
import { Email } from '$lib/auth/email'
import { Avatar } from '$lib/avatar/avatar'
import { UserId } from '$lib/user/user_id'
import { AvatarExtension } from '@prisma/client'
import { json, type RequestHandler } from '@sveltejs/kit'

export const GET: RequestHandler = async ({ params, locals }): Promise<Response> => {
    try {
        const user_id = UserId.from_string(params['user_id'])
        const email = new Email(locals.user.email)
        const user = await Repository.user.find_unique(email)

        if (!user) throw new Error('user is null')

        const extension = user.avatar_extension
        const content_type = extension === AvatarExtension.jpg ? AvatarExtension.jpeg : extension

        const avatar = await Avatar.from_user_id(user_id, extension)
        const image = avatar.data

        const response = new Response(image, {
            headers: {
                'Content-Type': `image/${content_type}`,
                'Content-Length': image.length.toString(),
            },
            status: 200,
        })

        return response
    } catch (error) {
        logger.error(`[avatar] Failed to find avatar: ${params['user_id']}]`, error)

        return json({ error: (error as Error).message })
    }
}