first commit
This commit is contained in:
@@ -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,
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user