mirror of
https://github.com/Litlyx/litlyx
synced 2025-12-10 07:48:37 +01:00
97 lines
3.4 KiB
TypeScript
97 lines
3.4 KiB
TypeScript
import { ProjectModel, TProject } from "@schema/project/ProjectSchema";
|
|
import { TUser, UserModel } from "@schema/UserSchema";
|
|
import { TProjectLimit } from "~/shared/schema/project/ProjectsLimits";
|
|
|
|
export type TAdminUserProjectInfo = TUser & {
|
|
projects: (TProject & {
|
|
limits: TProjectLimit[],
|
|
visits: number,
|
|
events: number,
|
|
sessions: number
|
|
})[],
|
|
}
|
|
|
|
export default defineEventHandler(async event => {
|
|
|
|
const userData = getRequestUser(event);
|
|
if (!userData?.logged) return;
|
|
if (!userData.user.roles.includes('ADMIN')) return;
|
|
|
|
const { page, limit, sortQuery } = getQuery(event);
|
|
|
|
const pageNumber = parseInt(page as string);
|
|
const limitNumber = parseInt(limit as string);
|
|
|
|
const users = await UserModel.aggregate([
|
|
{
|
|
$lookup: {
|
|
from: "projects",
|
|
localField: "_id",
|
|
foreignField: "owner",
|
|
pipeline: [
|
|
{
|
|
$lookup: {
|
|
from: "project_limits",
|
|
localField: "_id",
|
|
foreignField: "project_id",
|
|
as: "limits"
|
|
}
|
|
},
|
|
{
|
|
$lookup: {
|
|
from: "visits",
|
|
localField: "_id",
|
|
foreignField: "project_id",
|
|
pipeline: [
|
|
{
|
|
$count: "total_visits"
|
|
}
|
|
],
|
|
as: "visit_data"
|
|
}
|
|
},
|
|
{
|
|
$lookup: {
|
|
from: "events",
|
|
localField: "_id",
|
|
foreignField: "project_id",
|
|
pipeline: [
|
|
{
|
|
$count: "total_events"
|
|
}
|
|
],
|
|
as: "event_data"
|
|
}
|
|
},
|
|
{
|
|
$lookup: {
|
|
from: "sessions",
|
|
localField: "_id",
|
|
foreignField: "project_id",
|
|
pipeline: [
|
|
{
|
|
$count: "total_sessions"
|
|
}
|
|
],
|
|
as: "session_data"
|
|
}
|
|
},
|
|
{ $addFields: { visits: { $ifNull: [{ $arrayElemAt: ["$visit_data.total_visits", 0] }, 0] } } },
|
|
{ $addFields: { events: { $ifNull: [{ $arrayElemAt: ["$event_data.total_events", 0] }, 0] } } },
|
|
{ $addFields: { sessions: { $ifNull: [{ $arrayElemAt: ["$session_data.total_sessions", 0] }, 0] } }, },
|
|
{ $unset: "visit_data" },
|
|
{ $unset: "event_data" },
|
|
{ $unset: "session_data" }
|
|
|
|
],
|
|
as: "projects"
|
|
},
|
|
},
|
|
{ $sort: JSON.parse(sortQuery as string) },
|
|
{ $skip: pageNumber * limitNumber },
|
|
{ $limit: limitNumber }
|
|
]);
|
|
|
|
return users as TAdminUserProjectInfo[];
|
|
|
|
}); |