import { createSupabaseServiceRoleClient } from "@/lib/supabase/service-role"; import type { AppUser, AppUserStatus } from "@/types/app/user"; export type AdminAppUser = AppUser & { favorite_count: number; }; const adminUserSelect = "id,email,display_name,avatar_url,auth_provider,status,phone,wechat_openid,wechat_unionid,last_login_at,disabled_at,created_at,updated_at"; export async function listAdminAppUsers() { const supabase = createSupabaseServiceRoleClient(); const { data, error } = await supabase .from("wg_app_users") .select(adminUserSelect) .order("created_at", { ascending: false }) .limit(100); if (error) { throw error; } const users = (data ?? []) as AppUser[]; if (users.length === 0) { return []; } const { data: favorites, error: favoritesError } = await supabase .from("wg_user_favorites") .select("user_id") .in( "user_id", users.map((user) => user.id), ); if (favoritesError) { throw favoritesError; } const favoriteCountByUserId = (favorites ?? []).reduce( (counts, favorite) => { counts[favorite.user_id] = (counts[favorite.user_id] ?? 0) + 1; return counts; }, {} as Record, ); return users.map((user) => ({ ...user, favorite_count: favoriteCountByUserId[user.id] ?? 0, })); } export async function updateAdminAppUserStatus({ status, userId, }: { status: AppUserStatus; userId: string; }) { const supabase = createSupabaseServiceRoleClient(); const { data, error } = await supabase .from("wg_app_users") .update({ status, disabled_at: status === "disabled" ? new Date().toISOString() : null, }) .eq("id", userId) .select(adminUserSelect) .single(); if (error) { throw error; } const { data: favorites, error: favoritesError } = await supabase .from("wg_user_favorites") .select("user_id") .eq("user_id", userId); if (favoritesError) { throw favoritesError; } return { ...data, favorite_count: favorites?.length ?? 0, }; }