Skip to content

Commit 4e36b2e

Browse files
committed
feat: query/site/users
1 parent 569811f commit 4e36b2e

3 files changed

Lines changed: 78 additions & 10 deletions

File tree

api/query.ts

Lines changed: 45 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -411,19 +411,62 @@ export default async (req: VercelRequest, res: VercelResponse) => {
411411
ctx.status = 400
412412
ctx.message = 'Missing siteUrl'
413413
return false
414-
} else if (isValidUrl(ctx.req.query.siteUrl as string)) {
414+
} else if (!isValidUrl(ctx.req.query.siteUrl as string)) {
415415
ctx.status = 400
416416
ctx.message = 'Invalid siteUrl'
417417
return false
418418
}
419419
})
420-
.action((ctx) => {
420+
.action(async (ctx) => {
421421
const { siteUrl } = ctx.req.query
422422
const aggregate: Document[] = [
423423
{
424424
$match: { siteUrl },
425425
},
426+
{
427+
$group: {
428+
_id: {
429+
userName: '$userName',
430+
siteUrl: '$siteUrl',
431+
siteName: '$siteName',
432+
},
433+
count: { $sum: 1 },
434+
},
435+
},
436+
{
437+
$group: {
438+
_id: {
439+
userName: '$_id.userName',
440+
},
441+
count: { $sum: '$count' },
442+
userName: { $first: '$_id.userName' },
443+
siteUrl: { $first: '$_id.siteUrl' },
444+
siteName: { $first: '$_id.siteName' },
445+
},
446+
},
447+
{
448+
$project: {
449+
_id: false,
450+
},
451+
},
452+
{ $sort: ctx.sort },
453+
{ $limit: ctx.limit + 1 },
454+
{ $skip: ctx.offset },
426455
]
456+
const users = await ctx.col.aggregate(aggregate).toArray()
457+
458+
let hasNext = false
459+
if (users.length > ctx.limit) {
460+
hasNext = true
461+
users.pop()
462+
}
463+
464+
ctx.body = {
465+
query: users,
466+
hasNext,
467+
offset: ctx.offset,
468+
limit: ctx.limit,
469+
}
427470
})
428471

429472
return router.init(req, res)

docs/api-collections.http

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,18 @@ GET {{ENDPOINT}}/query/site
3535
&project=*
3636
&sort=!_total
3737

38+
### Query site users
39+
GET {{ENDPOINT}}/query/site/users
40+
# required {string}
41+
?siteUrl=https://zh.moegirl.org.cn/
42+
# {number}
43+
&offset=0
44+
# {number}
45+
&limit=5
46+
# {'*' | string}
47+
&project=*
48+
&sort=!count
49+
3850
### Search users
3951
GET {{ENDPOINT}}/search/user
4052
# required {string}

src/view/site.vue

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ h1(v-else) {{ site.siteName }}
3939
.key User
4040
.val Count
4141
.list-item.card(
42-
v-for='(user, index) in site.users.sort((a, b) => b.count - a.count)'
42+
v-for='(user, index) in users.sort((a, b) => b.count - a.count)'
4343
)
4444
.val(style='flex: 0; padding: 0 1rem') {{ index + 1 }}
4545
.key
@@ -68,15 +68,13 @@ const site = ref<{
6868
siteUrl: string
6969
_total: number
7070
features: any[]
71-
users: { userName: string; count: number }[]
7271
}>({
7372
siteName: '',
7473
siteUrl: '',
7574
_total: 0,
7675
features: [],
77-
users: [],
7876
})
79-
const users = ref<{ userName: string; count: number }[]>()
77+
const users = ref<{ userName: string; count: number }[]>([])
8078
const loading = ref<boolean>(true)
8179
const route = useRoute()
8280
@@ -93,14 +91,29 @@ function initSite() {
9391
loading.value = false
9492
const [query] = data.body.query
9593
site.value = query
96-
users.value = (query.users as { userName: string; count: number }[]).sort(
97-
(a, b) => b.count - a.count
98-
)
99-
setTitle(query.siteName, 'wiki data')
94+
setTitle(query.siteName, 'wiki')
95+
initUsers()
10096
})
10197
.finally(() => {})
10298
}
10399
100+
function initUsers() {
101+
axios
102+
.get(`${API_BASE}/query/site/users`, {
103+
params: {
104+
siteUrl: route.query.siteUrl,
105+
limit: 100,
106+
sort: '!count',
107+
prop: 'userName|count',
108+
},
109+
})
110+
.then(({ data }) => {
111+
const { query } = data.body
112+
users.value = query
113+
})
114+
.finally(() => {})
115+
116+
104117
onMounted(() => {
105118
setTitle('wiki data')
106119
initSite()

0 commit comments

Comments
 (0)