first commit

This commit is contained in:
luoyangwei
2026-06-06 00:49:07 +08:00
commit 2b860d201e
134 changed files with 22773 additions and 0 deletions
+91
View File
@@ -0,0 +1,91 @@
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<string, number>,
);
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<AppUser>();
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,
};
}