import { databaseTimeToDate } from "$lib/Utility/time"; import sb from "../../sb"; export interface Badge { id: number; post: string; image: string; hidden: boolean; shadow_hidden: boolean; click_count: number; time?: string; description?: string | null; category?: string | null; source?: string | null; designer?: string | null; } export interface BadgeInput { post?: string; image?: string; description?: string | null; time?: string; category?: string | null; hidden?: boolean; source?: string | null; designer?: string | null; } const getPagination = (page: number, size: number) => { const from = page ? page * (size ? +size : 3) : 0; return { from, to: page ? from + size - 1 : size - 1 }; }; export const getUserBadges = async ( userId: number, page = 0, size = -1, ): Promise => { const { from, to } = getPagination(page, size); let query = sb.from("user_badges").select("*").eq("user_id", userId); if (size !== -1) query = query.range(from, to); const { data, error } = await query; if (error) return []; return data.sort((a, b) => databaseTimeToDate((a as Badge).time ?? "").getTime() > databaseTimeToDate((b as Badge).time ?? "").getTime() ? -1 : 1, ) as Badge[]; }; export const addUserBadge = async (userId: number, badge: BadgeInput) => { const { post, image, description, time, category, hidden, source, designer } = badge; if (post === undefined || image === undefined) return; if (time) { await sb.from("user_badges").insert({ user_id: userId, post, image, description, time, category, hidden, source, designer, }); } else { await sb.from("user_badges").insert({ user_id: userId, post, image, description, category, hidden, source, designer, }); } }; export const removeUserBadge = async (userId: number, id: number) => { if (!isNaN(id)) await sb.from("user_badges").delete().eq("id", id).eq("user_id", userId); }; export const updateUserBadge = async ( userId: number, id: number, badge: BadgeInput, ) => { if (badge.post === undefined || badge.image === undefined) return; await sb .from("user_badges") .update({ post: badge.post, image: badge.image, description: badge.description, category: badge.category, time: badge.time, hidden: badge.hidden, source: badge.source, designer: badge.designer, }) .eq("id", id) .eq("user_id", userId); }; export const renameCategory = async ( userId: number, oldName: string, newName: string, ) => await sb .from("user_badges") .update({ category: newName }) .eq("category", oldName) .eq("user_id", userId); export const removeAllUserBadges = async (userId: number) => await sb.from("user_badges").delete().eq("user_id", userId); export const migrateCategory = async ( userId: number, oldName: string, newName: string, ) => await sb .from("user_badges") .update({ category: newName }) .eq("category", oldName) .eq("user_id", userId); export const setShadowHidden = async (userId: number, shadowHide: boolean) => await sb .from("user_badges") .update({ shadow_hidden: shadowHide }) .eq("user_id", userId); export const setShadowHiddenBadge = async (id: number, shadowHide: boolean) => await sb .from("user_badges") .update({ shadow_hidden: shadowHide }) .eq("id", id); export const incrementClickCount = async (id: number) => await sb.rpc("user_badges_increment_click_count", { user_badge_id: id });