forked from BRETT/BRETT
45 lines
1.4 KiB
TypeScript
45 lines
1.4 KiB
TypeScript
import { asc, count } from 'drizzle-orm'
|
|
import { comments, uploads, users } from '../../db/schema'
|
|
|
|
export default defineEventHandler(async () => {
|
|
const db = useDb()
|
|
|
|
const rows = await db
|
|
.select({
|
|
id: users.id,
|
|
name: users.name,
|
|
color: users.color,
|
|
avatar: users.avatar,
|
|
cardEffect: users.cardEffect,
|
|
cardEffectColor: users.cardEffectColor, cardVignette: users.cardVignette,
|
|
cardBorderEffect: users.cardBorderEffect,
|
|
cardBorderEffectColor: users.cardBorderEffectColor,
|
|
createdAt: users.createdAt,
|
|
})
|
|
.from(users)
|
|
.orderBy(asc(users.id))
|
|
|
|
const [uploadStats, commentStats] = await Promise.all([
|
|
db.select({ userId: uploads.userId, count: count() }).from(uploads).groupBy(uploads.userId),
|
|
db.select({ userId: comments.userId, count: count() }).from(comments).groupBy(comments.userId),
|
|
])
|
|
const uploadCount = new Map(uploadStats.map(s => [s.userId, s.count]))
|
|
const commentCount = new Map(commentStats.map(s => [s.userId, s.count]))
|
|
|
|
return rows.map(u => ({
|
|
id: u.id,
|
|
name: u.name,
|
|
color: u.color,
|
|
avatarUrl: avatarUrl(u.avatar),
|
|
cardEffect: u.cardEffect,
|
|
cardEffectColor: u.cardEffectColor, cardVignette: u.cardVignette,
|
|
cardBorderEffect: u.cardBorderEffect,
|
|
cardBorderEffectColor: u.cardBorderEffectColor,
|
|
createdAt: u.createdAt,
|
|
stats: {
|
|
uploads: uploadCount.get(u.id) ?? 0,
|
|
comments: commentCount.get(u.id) ?? 0,
|
|
},
|
|
}))
|
|
})
|