fix architecture and write new tests

This commit is contained in:
root
2026-06-10 00:40:19 -04:00
parent 560da1cadf
commit 80a597bc10
377 changed files with 84020 additions and 1337 deletions
+27 -10
View File
@@ -44,6 +44,23 @@ type MenuAuditQuery = {
pageSize: number
}
type EvaluatedMenuItem = {
id: string
systemKey: string | null
label: string
itemType: MenuItemType
routeOrUrl: string | null
icon: string | null
parentId: string | null
openInNewTab: boolean
isRequired: boolean
isActive: boolean
displayOrder: number
source: 'company' | 'subscription' | 'none'
visible: boolean
reasons: string[]
}
const EMPLOYEE_ROLES: EmployeeRole[] = ['OWNER', 'MANAGER', 'AGENT']
const MENU_AUDIT_RESOURCES = ['MenuItem', 'MenuSubscriptionAssignment', 'MenuCompanyAssignment', 'MenuRoleVisibility']
const MENU_ITEM_TYPES_WITHOUT_ROUTE = new Set([
@@ -245,7 +262,7 @@ export async function getMenuItem(id: string) {
export async function createMenuItem(input: MenuItemInput, admin: AdminActor) {
await assertMenuItemPayload(input)
const created = await prisma.$transaction(async (tx) => {
const created = await prisma.$transaction(async (tx: any) => {
const menuItem = await tx.menuItem.create({
data: {
systemKey: normalizeNullableString(input.systemKey) ?? undefined,
@@ -276,7 +293,7 @@ export async function updateMenuItem(id: string, input: MenuItemInput, admin: Ad
const before = await loadMenuItemDetail(id)
await assertMenuItemPayload(input, id)
const updated = await prisma.$transaction(async (tx) => {
const updated = await prisma.$transaction(async (tx: any) => {
const menuItem = await tx.menuItem.update({
where: { id },
data: {
@@ -451,13 +468,13 @@ async function getMenuEvaluationContext(companyId: string, role: EmployeeRole, e
const currentPlan = company.subscription?.plan ?? null
const currentPlanName = currentPlan as Plan | null
const evaluated = menuItems.map((item) => {
const evaluated: EvaluatedMenuItem[] = (menuItems as any[]).map((item: any) => {
const defaultsToAllSubscriptions = item.subscriptionAssignments.length === 0
const subscriptionAssignment = item.subscriptionAssignments.find(
(assignment) => assignment.isActive && (!currentPlan || assignment.plan === currentPlan),
(assignment: any) => assignment.isActive && (!currentPlan || assignment.plan === currentPlan),
)
const companyAssignment = item.companyAssignments.find((assignment) => assignment.isActive)
const roleAllowed = item.roleVisibilities.length === 0 || item.roleVisibilities.some((visibility) => visibility.role === role)
const companyAssignment = item.companyAssignments.find((assignment: any) => assignment.isActive)
const roleAllowed = item.roleVisibilities.length === 0 || item.roleVisibilities.some((visibility: any) => visibility.role === role)
const subscriptionEntitled = Boolean(subscriptionAssignment || (defaultsToAllSubscriptions && currentPlan))
const entitled = Boolean(subscriptionEntitled || companyAssignment)
const visible = Boolean(item.isActive && entitled && roleAllowed && employeeIsActive)
@@ -482,8 +499,8 @@ async function getMenuEvaluationContext(companyId: string, role: EmployeeRole, e
return {
id: item.id,
systemKey: item.systemKey,
label: item.label,
itemType: item.itemType,
label: item.label ?? '',
itemType: item.itemType as MenuItemType,
routeOrUrl: item.routeOrUrl,
icon: item.icon,
parentId: item.parentId,
@@ -523,8 +540,8 @@ function buildMenuTree(items: Array<{
byId.set(item.id, {
id: item.id,
systemKey: item.systemKey,
label: item.label,
itemType: item.itemType,
label: item.label ?? '',
itemType: item.itemType as MenuItemType,
routeOrUrl: item.routeOrUrl,
icon: item.icon,
parentId: item.parentId,