/* * Copyright (C) 2026 Fluxer Contributors * * This file is part of Fluxer. * * Fluxer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Fluxer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with Fluxer. If not, see . */ import type {ChannelID, MemeID, MessageID, UserID} from '@fluxer/api/src/BrandedTypes'; import {mapFavoriteMemeToResponse} from '@fluxer/api/src/favorite_meme/FavoriteMemeModel'; import type {FavoriteMemeService} from '@fluxer/api/src/favorite_meme/FavoriteMemeService'; import type {User} from '@fluxer/api/src/models/User'; import {UnknownFavoriteMemeError} from '@fluxer/errors/src/domains/core/UnknownFavoriteMemeError'; import type { CreateFavoriteMemeBodySchema, CreateFavoriteMemeFromUrlBodySchema, FavoriteMemeListResponse, FavoriteMemeResponse, UpdateFavoriteMemeBodySchema, } from '@fluxer/schema/src/domains/meme/MemeSchemas'; interface FavoriteMemeListParams { userId: UserID; } interface FavoriteMemeCreateFromUrlParams { user: User; data: CreateFavoriteMemeFromUrlBodySchema; } interface FavoriteMemeCreateFromMessageParams { user: User; channelId: ChannelID; messageId: MessageID; data: CreateFavoriteMemeBodySchema; } interface FavoriteMemeGetParams { userId: UserID; memeId: MemeID; } interface FavoriteMemeUpdateParams { user: User; memeId: MemeID; data: UpdateFavoriteMemeBodySchema; } interface FavoriteMemeDeleteParams { userId: UserID; memeId: MemeID; } export class FavoriteMemeRequestService { constructor(private readonly favoriteMemeService: FavoriteMemeService) {} async listFavoriteMemes(params: FavoriteMemeListParams): Promise { const memes = await this.favoriteMemeService.listFavoriteMemes(params.userId); return memes.map((meme) => mapFavoriteMemeToResponse(meme)); } async createFromUrl(params: FavoriteMemeCreateFromUrlParams): Promise { const {user, data} = params; const meme = await this.favoriteMemeService.createFromUrl({ user, url: data.url, name: data.name, altText: data.alt_text ?? undefined, tags: data.tags ?? undefined, klipySlug: data.klipy_slug ?? undefined, tenorSlugId: data.tenor_slug_id ?? undefined, }); return mapFavoriteMemeToResponse(meme); } async createFromMessage(params: FavoriteMemeCreateFromMessageParams): Promise { const {user, channelId, messageId, data} = params; const meme = await this.favoriteMemeService.createFromMessage({ user, channelId, messageId, attachmentId: data.attachment_id?.toString(), embedIndex: data.embed_index ?? undefined, name: data.name, altText: data.alt_text ?? undefined, tags: data.tags ?? undefined, }); return mapFavoriteMemeToResponse(meme); } async getFavoriteMeme(params: FavoriteMemeGetParams): Promise { const meme = await this.favoriteMemeService.getFavoriteMeme(params.userId, params.memeId); if (!meme) { throw new UnknownFavoriteMemeError(); } return mapFavoriteMemeToResponse(meme); } async updateFavoriteMeme(params: FavoriteMemeUpdateParams): Promise { const {user, memeId, data} = params; const meme = await this.favoriteMemeService.update({ user, memeId, name: data.name ?? undefined, altText: data.alt_text === undefined ? undefined : data.alt_text, tags: data.tags ?? undefined, }); return mapFavoriteMemeToResponse(meme); } async deleteFavoriteMeme(params: FavoriteMemeDeleteParams): Promise { await this.favoriteMemeService.delete(params.userId, params.memeId); } }