Files
litlyx/dashboard/server/api/members/list.ts
2025-11-28 16:49:20 +01:00

83 lines
2.3 KiB
TypeScript

import { EventModel } from "@schema/metrics/EventSchema";
import { Redis } from "~/server/services/CacheService";
import { executeTimelineAggregation } from "~/server/services/TimelineService";
import { TeamMemberModel, TeamMemberRole, TPermission } from "~/shared/schema/TeamMemberSchema";
import { TUser, UserModel } from "~/shared/schema/UserSchema";
export type MemberWithPermissions = {
id: string | null,
email: string,
role: TeamMemberRole,
pending: boolean,
me: boolean,
permission: TPermission
}
export default defineEventHandler(async event => {
const ctx = await getRequestContext(event, 'pid');
const { project_id, user_id, user_email, project } = ctx;
const result: MemberWithPermissions[] = [];
const members = await TeamMemberModel.find({ project_id });
result.push({
id: user_id,
email: user_email,
role: 'OWNER',
me: user_id === project.owner.toString(),
pending: false,
permission: {
webAnalytics: true,
domains: ['*'],
ai: true,
events: true
}
})
for (const member of members) {
let userMember: TUser | null;
if (member.user_id) {
userMember = await UserModel.findOne({ _id: member.user_id });
} else {
userMember = await UserModel.findOne({ email: member.email });
}
const permission: TPermission = {
webAnalytics: member.permission?.webAnalytics || false,
events: member.permission?.events || false,
ai: member.permission?.ai || false,
domains: member.permission?.domains || []
}
if (userMember) {
result.push({
id: member.id,
email: userMember.email || member.email || 'NO_EMAIL',
role: member.role,
pending: member.pending,
me: user_id === ((userMember as any).id.toString() || member.user_id || 'NO_ID'),
permission
})
} else {
result.push({
id: member.id,
email: member.email ?? 'error',
role: member.role,
pending: member.pending,
me: false,
permission: member.permission
})
}
}
return result;
});