92 lines
2.3 KiB
TypeScript
92 lines
2.3 KiB
TypeScript
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,
|
|
};
|
|
}
|