mirror of
https://github.com/diced/zipline.git
synced 2025-12-05 20:40:12 -08:00
* feat(theme): add midnight orange theme * feat(files): Added more files to one page & filter by views * feat(ThemeProvider): Added bigger radius for moderner look fix(auth): When title to long it fits now better fix(api): Fixed user favorties not showing right * fix(auth) * feat(theme): add midnight blue theme change(file): updated it 15 files per page * changed(theme): midnight_orange: add missing colors * little improvement on the theme files
98 lines
2.1 KiB
TypeScript
Executable File
98 lines
2.1 KiB
TypeScript
Executable File
import { prisma } from '@/lib/db';
|
|
import { userMiddleware } from '@/server/middleware/user';
|
|
import fastifyPlugin from 'fastify-plugin';
|
|
|
|
export type ApiUserStatsResponse = {
|
|
filesUploaded: number;
|
|
favoriteFiles: number;
|
|
views: number;
|
|
avgViews: number;
|
|
storageUsed: number;
|
|
avgStorageUsed: number;
|
|
urlsCreated: number;
|
|
urlViews: number;
|
|
|
|
sortTypeCount: { [type: string]: number };
|
|
};
|
|
|
|
export const PATH = '/api/user/stats';
|
|
export default fastifyPlugin(
|
|
(server, _, done) => {
|
|
server.get(PATH, { preHandler: [userMiddleware] }, async (req, res) => {
|
|
const aggFile = await prisma.file.aggregate({
|
|
where: {
|
|
userId: req.user.id,
|
|
},
|
|
_count: {
|
|
_all: true,
|
|
},
|
|
_sum: {
|
|
views: true,
|
|
size: true,
|
|
},
|
|
_avg: {
|
|
views: true,
|
|
size: true,
|
|
},
|
|
});
|
|
|
|
const favCount = await prisma.file.count({
|
|
where: {
|
|
userId: req.user.id,
|
|
favorite: true,
|
|
},
|
|
});
|
|
|
|
const aggUrl = await prisma.url.aggregate({
|
|
where: {
|
|
userId: req.user.id,
|
|
},
|
|
_count: {
|
|
_all: true,
|
|
},
|
|
_avg: {
|
|
views: true,
|
|
},
|
|
_sum: {
|
|
views: true,
|
|
},
|
|
});
|
|
|
|
const sortType = await prisma.file.findMany({
|
|
where: {
|
|
userId: req.user.id,
|
|
},
|
|
select: {
|
|
type: true,
|
|
},
|
|
});
|
|
|
|
const sortTypeCount = sortType.reduce(
|
|
(acc, cur) => {
|
|
if (acc[cur.type]) acc[cur.type] += 1;
|
|
else acc[cur.type] = 1;
|
|
|
|
return acc;
|
|
},
|
|
{} as { [type: string]: number },
|
|
);
|
|
|
|
return res.send({
|
|
filesUploaded: aggFile._count._all ?? 0,
|
|
favoriteFiles: favCount ?? 0,
|
|
views: aggFile._sum.views ?? 0,
|
|
avgViews: aggFile._avg.views ?? 0,
|
|
storageUsed: Number(aggFile._sum.size ?? 0),
|
|
avgStorageUsed: Number(aggFile._avg.size ?? 0),
|
|
urlsCreated: aggUrl._count._all ?? 0,
|
|
urlViews: aggUrl._sum.views ?? 0,
|
|
|
|
sortTypeCount,
|
|
});
|
|
});
|
|
|
|
done();
|
|
},
|
|
{ name: PATH },
|
|
);
|