|
|
|
@@ -105,27 +105,33 @@ export function resolveAllSectionAccess(input: {
|
|
|
|
|
return out;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** ابعاد پرشدهٔ یک قانون با OR؛ خالی = null */
|
|
|
|
|
function unionFacets<T>(facets: T[]): T | { OR: T[] } | null {
|
|
|
|
|
if (!facets.length) return null;
|
|
|
|
|
return facets.length === 1 ? facets[0]! : { OR: facets };
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function buildContactRuleWhere(
|
|
|
|
|
rule: DataAccessRule,
|
|
|
|
|
ctx: { userId: string; teamPeerIds: string[] | null },
|
|
|
|
|
): Prisma.PersonWhereInput | null {
|
|
|
|
|
const and: Prisma.PersonWhereInput[] = [];
|
|
|
|
|
const ids = ownerIdList(rule, ctx);
|
|
|
|
|
const facets: Prisma.PersonWhereInput[] = [];
|
|
|
|
|
if (rule.owners?.length) {
|
|
|
|
|
if (!ids.length) return null;
|
|
|
|
|
and.push(ids.length === 1 ? { ownerId: ids[0]! } : { ownerId: { in: ids } });
|
|
|
|
|
const ids = ownerIdList(rule, ctx);
|
|
|
|
|
if (ids.length) {
|
|
|
|
|
facets.push(ids.length === 1 ? { ownerId: ids[0]! } : { ownerId: { in: ids } });
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// groupIds دیگر فیلتر دسترسی نیست؛ دید گروه فقط از مسئولگروه (personViaGroupAssignee)
|
|
|
|
|
if (rule.sources?.length) {
|
|
|
|
|
and.push({
|
|
|
|
|
facets.push({
|
|
|
|
|
OR: [{ importSource: { in: rule.sources } }, { sourceRef: { in: rule.sources } }],
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
if (rule.moods?.length) {
|
|
|
|
|
and.push({ mood: { in: rule.moods } });
|
|
|
|
|
facets.push({ mood: { in: rule.moods } });
|
|
|
|
|
}
|
|
|
|
|
if (!and.length) return null;
|
|
|
|
|
return and.length === 1 ? and[0]! : { AND: and };
|
|
|
|
|
return unionFacets(facets);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function orParts<T>(parts: T[]): T | { OR: T[] } | { id: string } {
|
|
|
|
@@ -177,26 +183,26 @@ export function customersCompanyWhere(
|
|
|
|
|
if (!sectionHasDataAccessLimits(section)) return {};
|
|
|
|
|
const parts: Prisma.CompanyWhereInput[] = [];
|
|
|
|
|
for (const rule of section.rules ?? []) {
|
|
|
|
|
const and: Prisma.CompanyWhereInput[] = [];
|
|
|
|
|
// حال مشتری روی شرکت معنا ندارد؛ فقط مالک/منبع
|
|
|
|
|
if (rule.moods?.length && !rule.owners?.length && !rule.sources?.length) continue;
|
|
|
|
|
const facets: Prisma.CompanyWhereInput[] = [];
|
|
|
|
|
if (rule.owners?.length) {
|
|
|
|
|
const ids = ownerIdList(rule, {
|
|
|
|
|
userId: actor.userId,
|
|
|
|
|
teamPeerIds: actor.teamPeerIds ?? null,
|
|
|
|
|
});
|
|
|
|
|
if (!ids.length) continue;
|
|
|
|
|
and.push(ids.length === 1 ? { ownerId: ids[0]! } : { ownerId: { in: ids } });
|
|
|
|
|
if (ids.length) {
|
|
|
|
|
facets.push(ids.length === 1 ? { ownerId: ids[0]! } : { ownerId: { in: ids } });
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// groupIds دیگر فیلتر دسترسی نیست؛ دید گروه فقط از مسئولگروه (companyViaGroupAssignee)
|
|
|
|
|
if (rule.sources?.length) {
|
|
|
|
|
and.push({
|
|
|
|
|
facets.push({
|
|
|
|
|
OR: [{ importSource: { in: rule.sources } }, { sourceRef: { in: rule.sources } }],
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
if (rule.moods?.length && !rule.owners?.length && !rule.sources?.length) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
if (!and.length) continue;
|
|
|
|
|
parts.push(and.length === 1 ? and[0]! : { AND: and });
|
|
|
|
|
const w = unionFacets(facets);
|
|
|
|
|
if (w) parts.push(w);
|
|
|
|
|
}
|
|
|
|
|
parts.push(companyViaGroupAssignee(actor.userId));
|
|
|
|
|
return orParts(parts);
|
|
|
|
@@ -210,27 +216,28 @@ export function leadsDeepWhere(
|
|
|
|
|
if (!sectionHasDataAccessLimits(section)) return {};
|
|
|
|
|
const parts: Prisma.LeadWhereInput[] = [];
|
|
|
|
|
for (const rule of section.rules ?? []) {
|
|
|
|
|
const and: Prisma.LeadWhereInput[] = [];
|
|
|
|
|
const facets: Prisma.LeadWhereInput[] = [];
|
|
|
|
|
if (rule.owners?.length) {
|
|
|
|
|
const ids = ownerIdList(rule, {
|
|
|
|
|
userId: actor.userId,
|
|
|
|
|
teamPeerIds: actor.teamPeerIds ?? null,
|
|
|
|
|
});
|
|
|
|
|
if (!ids.length) continue;
|
|
|
|
|
and.push(ids.length === 1 ? { assigneeId: ids[0]! } : { assigneeId: { in: ids } });
|
|
|
|
|
if (ids.length) {
|
|
|
|
|
facets.push(ids.length === 1 ? { assigneeId: ids[0]! } : { assigneeId: { in: ids } });
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (rule.stageIds?.length) {
|
|
|
|
|
and.push({ stageId: { in: rule.stageIds } });
|
|
|
|
|
facets.push({ stageId: { in: rule.stageIds } });
|
|
|
|
|
}
|
|
|
|
|
if (rule.sources?.length) {
|
|
|
|
|
and.push({
|
|
|
|
|
facets.push({
|
|
|
|
|
OR: rule.sources.map((s) => ({
|
|
|
|
|
source: { equals: s, mode: 'insensitive' as const },
|
|
|
|
|
})),
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
if (!and.length) continue;
|
|
|
|
|
parts.push(and.length === 1 ? and[0]! : { AND: and });
|
|
|
|
|
const w = unionFacets(facets);
|
|
|
|
|
if (w) parts.push(w);
|
|
|
|
|
}
|
|
|
|
|
return orParts(parts);
|
|
|
|
|
}
|
|
|
|
@@ -243,28 +250,29 @@ export function dealsDeepWhere(
|
|
|
|
|
if (!sectionHasDataAccessLimits(section)) return {};
|
|
|
|
|
const parts: Prisma.DealWhereInput[] = [];
|
|
|
|
|
for (const rule of section.rules ?? []) {
|
|
|
|
|
const and: Prisma.DealWhereInput[] = [];
|
|
|
|
|
const facets: Prisma.DealWhereInput[] = [];
|
|
|
|
|
if (rule.owners?.length) {
|
|
|
|
|
const ids = ownerIdList(rule, {
|
|
|
|
|
userId: actor.userId,
|
|
|
|
|
teamPeerIds: actor.teamPeerIds ?? null,
|
|
|
|
|
});
|
|
|
|
|
if (!ids.length) continue;
|
|
|
|
|
and.push({
|
|
|
|
|
OR: [
|
|
|
|
|
{ ownerId: { in: ids } },
|
|
|
|
|
{ assignees: { some: { id: { in: ids } } } },
|
|
|
|
|
],
|
|
|
|
|
});
|
|
|
|
|
if (ids.length) {
|
|
|
|
|
facets.push({
|
|
|
|
|
OR: [
|
|
|
|
|
{ ownerId: { in: ids } },
|
|
|
|
|
{ assignees: { some: { id: { in: ids } } } },
|
|
|
|
|
],
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (rule.pipelineIds?.length) {
|
|
|
|
|
and.push({ pipelineId: { in: rule.pipelineIds } });
|
|
|
|
|
facets.push({ pipelineId: { in: rule.pipelineIds } });
|
|
|
|
|
}
|
|
|
|
|
if (rule.stageIds?.length) {
|
|
|
|
|
and.push({ stageId: { in: rule.stageIds } });
|
|
|
|
|
facets.push({ stageId: { in: rule.stageIds } });
|
|
|
|
|
}
|
|
|
|
|
if (!and.length) continue;
|
|
|
|
|
parts.push(and.length === 1 ? and[0]! : { AND: and });
|
|
|
|
|
const w = unionFacets(facets);
|
|
|
|
|
if (w) parts.push(w);
|
|
|
|
|
}
|
|
|
|
|
return orParts(parts);
|
|
|
|
|
}
|
|
|
|
@@ -277,32 +285,33 @@ export function activitiesDeepWhere(
|
|
|
|
|
if (!sectionHasDataAccessLimits(section)) return {};
|
|
|
|
|
const parts: Prisma.ActivityWhereInput[] = [];
|
|
|
|
|
for (const rule of section.rules ?? []) {
|
|
|
|
|
const and: Prisma.ActivityWhereInput[] = [];
|
|
|
|
|
const facets: Prisma.ActivityWhereInput[] = [];
|
|
|
|
|
if (rule.owners?.length) {
|
|
|
|
|
const ids = ownerIdList(rule, {
|
|
|
|
|
userId: actor.userId,
|
|
|
|
|
teamPeerIds: actor.teamPeerIds ?? null,
|
|
|
|
|
});
|
|
|
|
|
if (!ids.length) continue;
|
|
|
|
|
and.push({
|
|
|
|
|
OR: [
|
|
|
|
|
{ assigneeId: { in: ids } },
|
|
|
|
|
{ assignees: { some: { id: { in: ids } } } },
|
|
|
|
|
{ participantIds: { hasSome: ids } },
|
|
|
|
|
],
|
|
|
|
|
});
|
|
|
|
|
if (ids.length) {
|
|
|
|
|
facets.push({
|
|
|
|
|
OR: [
|
|
|
|
|
{ assigneeId: { in: ids } },
|
|
|
|
|
{ assignees: { some: { id: { in: ids } } } },
|
|
|
|
|
{ participantIds: { hasSome: ids } },
|
|
|
|
|
],
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (rule.boardIds?.length) {
|
|
|
|
|
and.push({ boardId: { in: rule.boardIds } });
|
|
|
|
|
facets.push({ boardId: { in: rule.boardIds } });
|
|
|
|
|
}
|
|
|
|
|
if (rule.stageIds?.length) {
|
|
|
|
|
and.push({ stageId: { in: rule.stageIds } });
|
|
|
|
|
facets.push({ stageId: { in: rule.stageIds } });
|
|
|
|
|
}
|
|
|
|
|
if (rule.typeIds?.length) {
|
|
|
|
|
and.push({ typeDefId: { in: rule.typeIds } });
|
|
|
|
|
facets.push({ typeDefId: { in: rule.typeIds } });
|
|
|
|
|
}
|
|
|
|
|
if (!and.length) continue;
|
|
|
|
|
parts.push(and.length === 1 ? and[0]! : { AND: and });
|
|
|
|
|
const w = unionFacets(facets);
|
|
|
|
|
if (w) parts.push(w);
|
|
|
|
|
}
|
|
|
|
|
return orParts(parts);
|
|
|
|
|
}
|
|
|
|
@@ -321,34 +330,35 @@ export function notesDeepWhere(
|
|
|
|
|
if (!sectionHasDataAccessLimits(section)) return personalGate;
|
|
|
|
|
const parts: Prisma.NoteWhereInput[] = [];
|
|
|
|
|
for (const rule of section.rules ?? []) {
|
|
|
|
|
const and: Prisma.NoteWhereInput[] = [];
|
|
|
|
|
const facets: Prisma.NoteWhereInput[] = [];
|
|
|
|
|
if (rule.owners?.length) {
|
|
|
|
|
const ids = ownerIdList(rule, {
|
|
|
|
|
userId: actor.userId,
|
|
|
|
|
teamPeerIds: actor.teamPeerIds ?? null,
|
|
|
|
|
});
|
|
|
|
|
if (!ids.length) continue;
|
|
|
|
|
and.push({
|
|
|
|
|
OR: [
|
|
|
|
|
{ authorId: { in: ids } },
|
|
|
|
|
{
|
|
|
|
|
deal: {
|
|
|
|
|
OR: [
|
|
|
|
|
{ ownerId: { in: ids } },
|
|
|
|
|
{ assignees: { some: { id: { in: ids } } } },
|
|
|
|
|
],
|
|
|
|
|
if (ids.length) {
|
|
|
|
|
facets.push({
|
|
|
|
|
OR: [
|
|
|
|
|
{ authorId: { in: ids } },
|
|
|
|
|
{
|
|
|
|
|
deal: {
|
|
|
|
|
OR: [
|
|
|
|
|
{ ownerId: { in: ids } },
|
|
|
|
|
{ assignees: { some: { id: { in: ids } } } },
|
|
|
|
|
],
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
{ person: { ownerId: { in: ids } } },
|
|
|
|
|
{ company: { ownerId: { in: ids } } },
|
|
|
|
|
],
|
|
|
|
|
});
|
|
|
|
|
{ person: { ownerId: { in: ids } } },
|
|
|
|
|
{ company: { ownerId: { in: ids } } },
|
|
|
|
|
],
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (rule.sources?.length) {
|
|
|
|
|
and.push({ noteType: { in: rule.sources } });
|
|
|
|
|
facets.push({ noteType: { in: rule.sources } });
|
|
|
|
|
}
|
|
|
|
|
if (!and.length) continue;
|
|
|
|
|
parts.push(and.length === 1 ? and[0]! : { AND: and });
|
|
|
|
|
const w = unionFacets(facets);
|
|
|
|
|
if (w) parts.push(w);
|
|
|
|
|
}
|
|
|
|
|
return {
|
|
|
|
|
AND: [personalGate, orParts(parts)],
|
|
|
|
@@ -363,26 +373,27 @@ export function ticketsDeepWhere(
|
|
|
|
|
if (!sectionHasDataAccessLimits(section)) return {};
|
|
|
|
|
const parts: Prisma.TicketWhereInput[] = [];
|
|
|
|
|
for (const rule of section.rules ?? []) {
|
|
|
|
|
const and: Prisma.TicketWhereInput[] = [];
|
|
|
|
|
const facets: Prisma.TicketWhereInput[] = [];
|
|
|
|
|
if (rule.owners?.length) {
|
|
|
|
|
const ids = ownerIdList(rule, {
|
|
|
|
|
userId: actor.userId,
|
|
|
|
|
teamPeerIds: actor.teamPeerIds ?? null,
|
|
|
|
|
});
|
|
|
|
|
if (!ids.length) continue;
|
|
|
|
|
and.push({
|
|
|
|
|
OR: [{ assigneeId: { in: ids } }, { reporterId: { in: ids } }],
|
|
|
|
|
});
|
|
|
|
|
if (ids.length) {
|
|
|
|
|
facets.push({
|
|
|
|
|
OR: [{ assigneeId: { in: ids } }, { reporterId: { in: ids } }],
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (rule.sources?.length) {
|
|
|
|
|
and.push({
|
|
|
|
|
facets.push({
|
|
|
|
|
status: {
|
|
|
|
|
in: rule.sources as Array<'open' | 'in_progress' | 'waiting' | 'resolved' | 'closed'>,
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
if (!and.length) continue;
|
|
|
|
|
parts.push(and.length === 1 ? and[0]! : { AND: and });
|
|
|
|
|
const w = unionFacets(facets);
|
|
|
|
|
if (w) parts.push(w);
|
|
|
|
|
}
|
|
|
|
|
return orParts(parts);
|
|
|
|
|
}
|
|
|
|
@@ -395,28 +406,29 @@ export function projectsDeepWhere(
|
|
|
|
|
if (!sectionHasDataAccessLimits(section)) return {};
|
|
|
|
|
const parts: Prisma.ProjectCardWhereInput[] = [];
|
|
|
|
|
for (const rule of section.rules ?? []) {
|
|
|
|
|
const and: Prisma.ProjectCardWhereInput[] = [];
|
|
|
|
|
const facets: Prisma.ProjectCardWhereInput[] = [];
|
|
|
|
|
if (rule.owners?.length) {
|
|
|
|
|
const ids = ownerIdList(rule, {
|
|
|
|
|
userId: actor.userId,
|
|
|
|
|
teamPeerIds: actor.teamPeerIds ?? null,
|
|
|
|
|
});
|
|
|
|
|
if (!ids.length) continue;
|
|
|
|
|
and.push({
|
|
|
|
|
OR: [
|
|
|
|
|
{ ownerId: { in: ids } },
|
|
|
|
|
{ assignees: { some: { id: { in: ids } } } },
|
|
|
|
|
],
|
|
|
|
|
});
|
|
|
|
|
if (ids.length) {
|
|
|
|
|
facets.push({
|
|
|
|
|
OR: [
|
|
|
|
|
{ ownerId: { in: ids } },
|
|
|
|
|
{ assignees: { some: { id: { in: ids } } } },
|
|
|
|
|
],
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (rule.boardIds?.length) {
|
|
|
|
|
and.push({ boardId: { in: rule.boardIds } });
|
|
|
|
|
facets.push({ boardId: { in: rule.boardIds } });
|
|
|
|
|
}
|
|
|
|
|
if (rule.stageIds?.length) {
|
|
|
|
|
and.push({ stageId: { in: rule.stageIds } });
|
|
|
|
|
facets.push({ stageId: { in: rule.stageIds } });
|
|
|
|
|
}
|
|
|
|
|
if (!and.length) continue;
|
|
|
|
|
parts.push(and.length === 1 ? and[0]! : { AND: and });
|
|
|
|
|
const w = unionFacets(facets);
|
|
|
|
|
if (w) parts.push(w);
|
|
|
|
|
}
|
|
|
|
|
return orParts(parts);
|
|
|
|
|
}
|
|
|
|
@@ -429,20 +441,21 @@ export function routinesDeepWhere(
|
|
|
|
|
if (!sectionHasDataAccessLimits(section)) return {};
|
|
|
|
|
const parts: Prisma.RoutineTaskWhereInput[] = [];
|
|
|
|
|
for (const rule of section.rules ?? []) {
|
|
|
|
|
const and: Prisma.RoutineTaskWhereInput[] = [];
|
|
|
|
|
const facets: Prisma.RoutineTaskWhereInput[] = [];
|
|
|
|
|
if (rule.owners?.length) {
|
|
|
|
|
const ids = ownerIdList(rule, {
|
|
|
|
|
userId: actor.userId,
|
|
|
|
|
teamPeerIds: actor.teamPeerIds ?? null,
|
|
|
|
|
});
|
|
|
|
|
if (!ids.length) continue;
|
|
|
|
|
and.push(ids.length === 1 ? { assigneeId: ids[0]! } : { assigneeId: { in: ids } });
|
|
|
|
|
if (ids.length) {
|
|
|
|
|
facets.push(ids.length === 1 ? { assigneeId: ids[0]! } : { assigneeId: { in: ids } });
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (rule.typeIds?.length) {
|
|
|
|
|
and.push({ categoryId: { in: rule.typeIds } });
|
|
|
|
|
facets.push({ categoryId: { in: rule.typeIds } });
|
|
|
|
|
}
|
|
|
|
|
if (!and.length) continue;
|
|
|
|
|
parts.push(and.length === 1 ? and[0]! : { AND: and });
|
|
|
|
|
const w = unionFacets(facets);
|
|
|
|
|
if (w) parts.push(w);
|
|
|
|
|
}
|
|
|
|
|
return orParts(parts);
|
|
|
|
|
}
|
|
|
|
|