HotTRDealsBackend/services/avatar.service.js
2026-02-09 21:47:55 +00:00

57 lines
1.4 KiB
JavaScript

const fs = require("fs")
const { uploadImage } = require("./uploadImage.service")
const { makeWebp } = require("../utils/processImage")
const { validateImage } = require("../utils/validateImage")
const userDB = require("../db/user.db")
const { setUserPublicInRedis } = require("./redis/userPublicCache.service")
async function updateUserAvatar(userId, file) {
if (!file) {
throw new Error("No file uploaded")
}
validateImage({
mimetype: file.mimetype,
size: file.size,
})
const buffer = fs.readFileSync(file.path)
const webpBuffer = await makeWebp(buffer, { quality: 80 })
const imageUrl = await uploadImage({
path: `avatars/${userId}_${Date.now()}.webp`,
fileBuffer: webpBuffer,
contentType: "image/webp",
})
fs.unlinkSync(file.path)
const updated = await updateAvatarUrl(userId, imageUrl)
await setUserPublicInRedis(updated, { ttlSeconds: 60 * 60 })
return updated
}
async function updateAvatarUrl(userId, imageUrl) {
return userDB.updateUser(
{ id: userId },
{ avatarUrl: imageUrl },
{
select: {
id: true,
username: true,
avatarUrl: true,
userBadges: {
orderBy: { earnedAt: "desc" },
select: {
earnedAt: true,
badge: { select: { id: true, name: true, iconUrl: true, description: true } },
},
},
},
}
)
}
module.exports = { updateUserAvatar }