65 lines
1.8 KiB
TypeScript
65 lines
1.8 KiB
TypeScript
import type { Route } from '@/types';
|
|
import ofetch from '@/utils/ofetch';
|
|
|
|
import { baseUrl, gqlEndpoint, parseItem } from './utils';
|
|
|
|
const handler = async (ctx) => {
|
|
const { uid } = ctx.req.param();
|
|
const limit = ctx.req.query('limit') ? Number.parseInt(ctx.req.query('limit'), 10) : 20;
|
|
const response = await ofetch(gqlEndpoint, {
|
|
method: 'POST',
|
|
body: {
|
|
query: `{
|
|
user(input: {userName: "${uid}"}) {
|
|
displayName
|
|
avatar
|
|
info {
|
|
description
|
|
}
|
|
articles(input: {first: ${limit}}) {
|
|
edges {
|
|
node {
|
|
shortHash
|
|
title
|
|
content
|
|
createdAt
|
|
author {
|
|
displayName
|
|
}
|
|
tags {
|
|
content
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}`,
|
|
},
|
|
});
|
|
|
|
const user = response.data.user;
|
|
|
|
return {
|
|
title: `Matters | ${user.displayName}`,
|
|
link: `${baseUrl}/@${uid}`,
|
|
description: user.info.description,
|
|
image: user.avatar,
|
|
item: user.articles.edges.map(({ node }) => parseItem(node)),
|
|
};
|
|
};
|
|
|
|
export const route: Route = {
|
|
path: '/author/:uid',
|
|
name: 'Author',
|
|
example: '/matters/author/robertu',
|
|
parameters: { uid: "Author id, can be found at author's homepage url" },
|
|
maintainers: ['Cerebrater', 'xosdy'],
|
|
handler,
|
|
radar: [
|
|
{
|
|
source: ['matters.town/:uid'],
|
|
target: (params) => `/matters/author/${params.uid.slice(1)}`,
|
|
},
|
|
],
|
|
};
|