Files
alrahma_sunday_school_api/apps/api/dist/modules/admin/admin.schemas.js
T
2026-06-11 03:22:12 -04:00

361 lines
19 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.menuCompanyParamSchema = exports.menuPlanParamSchema = exports.menuItemIdParamSchema = exports.menuAuditLogQuerySchema = exports.menuPreviewSchema = exports.menuCompanyAssignmentsSchema = exports.menuPlanAssignmentsSchema = exports.menuItemStatusSchema = exports.menuItemSchema = exports.promotionIdParamSchema = exports.planFeatureIdParamSchema = exports.promotionUpdateSchema = exports.promotionCreateSchema = exports.planFeatureUpdateSchema = exports.planFeatureCreateSchema = exports.pricingUpdateSchema = exports.homepageUpdateSchema = exports.billingRefundSchema = exports.billingCreditNoteSchema = exports.billingReasonSchema = exports.retryBillingInvoiceSchema = exports.payBillingInvoiceSchema = exports.createBillingInvoiceSchema = exports.billingLineItemInputSchema = exports.billingAccountUpdateSchema = exports.invoiceIdParamSchema = exports.billingAccountIdParamSchema = exports.companyIdParamSchema = exports.idParamSchema = exports.marketplaceHomepageConfigSchema = exports.adminCompanyUpdateSchema = exports.companyStatusSchema = exports.adminPermissionsSchema = exports.adminRoleSchema = exports.updateAdminSchema = exports.createAdminSchema = exports.permissionSchema = exports.invoicesQuerySchema = exports.billingQuerySchema = exports.notificationsQuerySchema = exports.auditLogQuerySchema = exports.rentersQuerySchema = exports.companiesQuerySchema = exports.totpVerifySchema = exports.resetPasswordSchema = exports.forgotPasswordSchema = exports.loginSchema = void 0;
const zod_1 = require("zod");
exports.loginSchema = zod_1.z.object({
email: zod_1.z.string().email().max(255).trim().toLowerCase(),
password: zod_1.z.string().max(128),
totpCode: zod_1.z.string().length(6).optional(),
recoveryCode: zod_1.z.string().min(8).max(32).optional(),
});
exports.forgotPasswordSchema = zod_1.z.object({
email: zod_1.z.string().email().max(255).trim().toLowerCase(),
});
exports.resetPasswordSchema = zod_1.z.object({
token: zod_1.z.string().min(1),
password: zod_1.z.string().min(8).max(128),
});
exports.totpVerifySchema = zod_1.z.object({
code: zod_1.z.string().length(6),
});
exports.companiesQuerySchema = zod_1.z.object({
q: zod_1.z.string().optional(),
status: zod_1.z.string().optional(),
plan: zod_1.z.string().optional(),
page: zod_1.z.coerce.number().int().min(1).default(1),
pageSize: zod_1.z.coerce.number().int().min(1).max(100).default(20),
});
exports.rentersQuerySchema = zod_1.z.object({
q: zod_1.z.string().optional(),
blocked: zod_1.z.string().optional(),
page: zod_1.z.coerce.number().int().min(1).default(1),
pageSize: zod_1.z.coerce.number().int().min(1).max(100).default(20),
});
exports.auditLogQuerySchema = zod_1.z.object({
adminId: zod_1.z.string().optional(),
action: zod_1.z.string().optional(),
companyId: zod_1.z.string().optional(),
entityId: zod_1.z.string().optional(),
page: zod_1.z.coerce.number().int().min(1).default(1),
pageSize: zod_1.z.coerce.number().int().min(1).max(100).default(50),
});
exports.notificationsQuerySchema = zod_1.z.object({
channel: zod_1.z.string().optional(),
status: zod_1.z.string().optional(),
companyId: zod_1.z.string().optional(),
page: zod_1.z.coerce.number().int().min(1).default(1),
pageSize: zod_1.z.coerce.number().int().min(1).max(200).default(50),
});
exports.billingQuerySchema = zod_1.z.object({
q: zod_1.z.string().optional(),
status: zod_1.z.string().optional(),
plan: zod_1.z.string().optional(),
page: zod_1.z.coerce.number().int().min(1).default(1),
pageSize: zod_1.z.coerce.number().int().min(1).max(100).default(20),
});
exports.invoicesQuerySchema = zod_1.z.object({
page: zod_1.z.coerce.number().int().min(1).default(1),
pageSize: zod_1.z.coerce.number().int().min(1).max(100).default(20),
});
exports.permissionSchema = zod_1.z.object({
resource: zod_1.z.enum(['COMPANIES', 'COMPANY_EMPLOYEES', 'SUBSCRIPTIONS', 'PAYMENTS', 'OFFERS', 'RENTERS', 'ADMIN_USERS', 'AUDIT_LOGS', 'PLATFORM_METRICS']),
actions: zod_1.z.array(zod_1.z.enum(['READ', 'CREATE', 'UPDATE', 'DELETE', 'SUSPEND', 'IMPERSONATE'])).min(1),
});
exports.createAdminSchema = zod_1.z.object({
email: zod_1.z.string().email().trim().toLowerCase(),
firstName: zod_1.z.string().min(1).max(100).trim(),
lastName: zod_1.z.string().min(1).max(100).trim(),
role: zod_1.z.enum(['SUPER_ADMIN', 'ADMIN', 'SUPPORT', 'FINANCE', 'VIEWER']),
password: zod_1.z.string().min(8),
permissions: zod_1.z.array(exports.permissionSchema).optional(),
});
exports.updateAdminSchema = zod_1.z.object({
email: zod_1.z.string().email().trim().toLowerCase().optional(),
firstName: zod_1.z.string().min(1).max(100).trim().optional(),
lastName: zod_1.z.string().min(1).max(100).trim().optional(),
role: zod_1.z.enum(['SUPER_ADMIN', 'ADMIN', 'SUPPORT', 'FINANCE', 'VIEWER']).optional(),
password: zod_1.z.string().min(8).optional(),
isActive: zod_1.z.boolean().optional(),
});
exports.adminRoleSchema = zod_1.z.object({
role: zod_1.z.enum(['SUPER_ADMIN', 'ADMIN', 'SUPPORT', 'FINANCE', 'VIEWER']),
});
exports.adminPermissionsSchema = zod_1.z.object({
permissions: zod_1.z.array(exports.permissionSchema),
});
exports.companyStatusSchema = zod_1.z.object({
status: zod_1.z.enum(['ACTIVE', 'SUSPENDED', 'CANCELLED']),
reason: zod_1.z.string().optional(),
});
const nullableString = zod_1.z.union([zod_1.z.string(), zod_1.z.null()]).optional();
const nullableEmail = zod_1.z.union([zod_1.z.string().email(), zod_1.z.null()]).optional();
const nullableUrl = zod_1.z.union([zod_1.z.string().url(), zod_1.z.null()]).optional();
const nullableDate = zod_1.z.union([zod_1.z.string().datetime(), zod_1.z.string().regex(/^\d{4}-\d{2}-\d{2}$/), zod_1.z.null()]).optional();
exports.adminCompanyUpdateSchema = zod_1.z.object({
company: zod_1.z.object({
name: zod_1.z.string().min(1).optional(), slug: zod_1.z.string().min(1).optional(),
email: zod_1.z.string().email().optional(), phone: nullableString,
status: zod_1.z.enum(['PENDING', 'TRIALING', 'ACTIVE', 'PAST_DUE', 'SUSPENDED', 'CANCELLED']).optional(),
subscriptionPaymentRef: nullableString,
address: zod_1.z.object({
streetAddress: nullableString,
city: nullableString,
country: nullableString,
zipCode: nullableString,
legalName: nullableString,
legalForm: nullableString,
companyEmail: nullableEmail,
managerName: nullableString,
iceNumber: nullableString,
operatingLicenseNumber: nullableString,
operatingLicenseIssuedAt: nullableString,
operatingLicenseIssuedBy: nullableString,
fax: nullableString,
yearsActive: nullableString,
representativeName: nullableString,
representativeTitle: nullableString,
responsibleName: nullableString,
responsibleRole: nullableString,
responsibleIdentityNumber: nullableString,
responsibleQualification: nullableString,
responsiblePhone: nullableString,
responsibleEmail: nullableEmail,
}).optional(),
}).optional(),
subscription: zod_1.z.object({
plan: zod_1.z.enum(['STARTER', 'GROWTH', 'PRO']).optional(),
billingPeriod: zod_1.z.enum(['MONTHLY', 'ANNUAL']).optional(),
status: zod_1.z.enum(['TRIALING', 'ACTIVE', 'PAST_DUE', 'CANCELLED', 'UNPAID']).optional(),
currency: zod_1.z.literal('MAD').optional(),
trialStartAt: nullableDate, trialEndAt: nullableDate,
currentPeriodStart: nullableDate, currentPeriodEnd: nullableDate,
cancelledAt: nullableDate, cancelAtPeriodEnd: zod_1.z.boolean().optional(),
}).optional(),
brand: zod_1.z.object({
displayName: zod_1.z.string().min(1).optional(), tagline: nullableString,
subdomain: zod_1.z.string().min(1).optional(), customDomain: nullableString,
publicEmail: nullableEmail, publicPhone: nullableString, publicAddress: nullableString,
publicCity: nullableString, publicCountry: nullableString, websiteUrl: nullableUrl,
whatsappNumber: nullableString, defaultLocale: zod_1.z.string().min(2).optional(),
defaultCurrency: zod_1.z.literal('MAD').optional(),
isListedOnMarketplace: zod_1.z.boolean().optional(),
homePageConfig: zod_1.z.any().optional(),
menuConfig: zod_1.z.any().optional(),
}).optional(),
contractSettings: zod_1.z.object({
legalName: nullableString, registrationNumber: nullableString, taxId: nullableString,
terms: zod_1.z.string().optional(),
fuelPolicyType: zod_1.z.enum(['FULL_TO_FULL', 'FULL_TO_EMPTY', 'SAME_TO_SAME', 'PREPAID', 'FREE']).optional(),
lateFeePerHour: zod_1.z.number().int().nullable().optional(), taxRate: zod_1.z.number().nullable().optional(),
signatureRequired: zod_1.z.boolean().optional(), showTax: zod_1.z.boolean().optional(),
}).optional(),
accountingSettings: zod_1.z.object({
reportingPeriod: zod_1.z.enum(['WEEKLY', 'MONTHLY', 'QUARTERLY', 'ANNUAL']).optional(),
fiscalYearStart: zod_1.z.number().int().min(1).max(12).optional(),
currency: zod_1.z.literal('MAD').optional(),
accountantEmail: nullableEmail, accountantName: nullableString,
autoSendReport: zod_1.z.boolean().optional(),
reportFormat: zod_1.z.enum(['PDF', 'CSV', 'BOTH']).optional(),
}).optional(),
});
const marketplaceMetricSchema = zod_1.z.object({ value: zod_1.z.string().min(1), label: zod_1.z.string().min(1) });
const marketplacePillarSchema = zod_1.z.object({ title: zod_1.z.string().min(1), body: zod_1.z.string().min(1) });
const marketplaceStepSchema = zod_1.z.object({ step: zod_1.z.string().min(1), title: zod_1.z.string().min(1), body: zod_1.z.string().min(1) });
const marketplaceSectionSchema = zod_1.z.enum(['hero', 'surface', 'pillars', 'audiences', 'features', 'steps', 'closing']);
const marketplaceHomepageContentSchema = zod_1.z.object({
sections: zod_1.z.array(marketplaceSectionSchema).min(1),
heroKicker: zod_1.z.string().min(1), heroTitle: zod_1.z.string().min(1), heroBody: zod_1.z.string().min(1),
startTrial: zod_1.z.string().min(1), exploreVehicles: zod_1.z.string().min(1),
surfaceLabel: zod_1.z.string().min(1), surfaceTitle: zod_1.z.string().min(1), surfaceBody: zod_1.z.string().min(1),
liveLabel: zod_1.z.string().min(1), trustedFleets: zod_1.z.string().min(1), brandedFlows: zod_1.z.string().min(1), multiTenant: zod_1.z.string().min(1),
companyKicker: zod_1.z.string().min(1), companyTitle: zod_1.z.string().min(1), companyBody: zod_1.z.string().min(1),
renterKicker: zod_1.z.string().min(1), renterTitle: zod_1.z.string().min(1), renterBody: zod_1.z.string().min(1),
pillars: zod_1.z.array(marketplacePillarSchema).length(3),
metrics: zod_1.z.array(marketplaceMetricSchema).length(3),
featureLabel: zod_1.z.string().min(1), features: zod_1.z.array(zod_1.z.string().min(1)).min(1),
stepsTitle: zod_1.z.string().min(1), steps: zod_1.z.array(marketplaceStepSchema).length(3), stepLabel: zod_1.z.string().min(1),
readyKicker: zod_1.z.string().min(1), readyTitle: zod_1.z.string().min(1), readyBody: zod_1.z.string().min(1),
viewPricing: zod_1.z.string().min(1), createWorkspace: zod_1.z.string().min(1),
});
exports.marketplaceHomepageConfigSchema = zod_1.z.object({
en: marketplaceHomepageContentSchema,
fr: marketplaceHomepageContentSchema,
ar: marketplaceHomepageContentSchema,
});
exports.idParamSchema = zod_1.z.object({
id: zod_1.z.string().min(1),
});
exports.companyIdParamSchema = zod_1.z.object({
companyId: zod_1.z.string().min(1),
});
exports.billingAccountIdParamSchema = zod_1.z.object({
billingAccountId: zod_1.z.string().min(1),
});
exports.invoiceIdParamSchema = zod_1.z.object({
invoiceId: zod_1.z.string().min(1),
});
exports.billingAccountUpdateSchema = zod_1.z.object({
legalName: zod_1.z.string().min(1).max(255).optional(),
billingEmail: zod_1.z.string().email().optional(),
billingAddress: zod_1.z.any().optional(),
taxId: zod_1.z.union([zod_1.z.string().max(120), zod_1.z.null()]).optional(),
taxExempt: zod_1.z.boolean().optional(),
invoiceTerms: zod_1.z.enum(['DUE_ON_RECEIPT', 'NET_7', 'NET_15', 'NET_30', 'NET_45', 'NET_60']).optional(),
netTermsDays: zod_1.z.number().int().min(0).max(365).optional(),
});
exports.billingLineItemInputSchema = zod_1.z.object({
type: zod_1.z.enum([
'SUBSCRIPTION_FEE',
'SEAT_FEE',
'USAGE_FEE',
'SETUP_FEE',
'DISCOUNT',
'TAX',
'CREDIT',
'PRORATION',
'REFUND_ADJUSTMENT',
'MANUAL_ADJUSTMENT',
'PROFESSIONAL_SERVICES',
'CANCELLATION_FEE',
]),
description: zod_1.z.string().min(1).max(255),
quantity: zod_1.z.number().int().positive().max(100000),
unitAmount: zod_1.z.number().int(),
periodStart: nullableDate,
periodEnd: nullableDate,
});
exports.createBillingInvoiceSchema = zod_1.z.object({
subscriptionId: zod_1.z.union([zod_1.z.string(), zod_1.z.null()]).optional(),
invoiceType: zod_1.z.enum([
'SUBSCRIPTION_INITIAL',
'SUBSCRIPTION_RENEWAL',
'TRIAL_CONVERSION',
'SUBSCRIPTION_UPGRADE',
'SUBSCRIPTION_DOWNGRADE_CREDIT',
'USAGE_BASED',
'ONE_TIME',
'MANUAL',
'CORRECTION',
'CANCELLATION_FEE',
]),
currency: zod_1.z.string().min(3).max(8).optional(),
dueAt: nullableDate,
isSubscriptionBlocking: zod_1.z.boolean().optional(),
adminReason: zod_1.z.union([zod_1.z.string().max(500), zod_1.z.null()]).optional(),
lineItems: zod_1.z.array(exports.billingLineItemInputSchema).min(1),
});
exports.payBillingInvoiceSchema = zod_1.z.object({
amount: zod_1.z.number().int().positive().optional(),
paymentMethodId: zod_1.z.union([zod_1.z.string(), zod_1.z.null()]).optional(),
providerPaymentId: zod_1.z.union([zod_1.z.string(), zod_1.z.null()]).optional(),
});
exports.retryBillingInvoiceSchema = zod_1.z.object({
paymentMethodId: zod_1.z.union([zod_1.z.string(), zod_1.z.null()]).optional(),
});
exports.billingReasonSchema = zod_1.z.object({
reason: zod_1.z.string().min(1).max(500),
});
exports.billingCreditNoteSchema = zod_1.z.object({
amount: zod_1.z.number().int().positive(),
reason: zod_1.z.string().min(1).max(500),
});
exports.billingRefundSchema = zod_1.z.object({
amount: zod_1.z.number().int().positive(),
reason: zod_1.z.string().min(1).max(500),
});
exports.homepageUpdateSchema = zod_1.z.object({
homepage: exports.marketplaceHomepageConfigSchema,
});
exports.pricingUpdateSchema = zod_1.z.object({
entries: zod_1.z.array(zod_1.z.object({
plan: zod_1.z.enum(['STARTER', 'GROWTH', 'PRO']),
billingPeriod: zod_1.z.enum(['MONTHLY', 'ANNUAL']),
amount: zod_1.z.number().int().positive(),
})).min(1),
});
const planFeatureSchema = zod_1.z.object({
plan: zod_1.z.enum(['STARTER', 'GROWTH', 'PRO']),
label: zod_1.z.string().min(1).max(120),
sortOrder: zod_1.z.number().int().min(0).default(0),
});
exports.planFeatureCreateSchema = planFeatureSchema;
exports.planFeatureUpdateSchema = planFeatureSchema.partial();
exports.promotionCreateSchema = zod_1.z.object({
code: zod_1.z.string().min(2).max(30).regex(/^[A-Z0-9_-]+$/, 'Code must be uppercase A-Z, 0-9, _ or -'),
name: zod_1.z.string().min(1).max(100),
description: zod_1.z.string().max(500).optional(),
discountType: zod_1.z.enum(['PERCENTAGE', 'FIXED']),
discountValue: zod_1.z.number().int().positive(),
plans: zod_1.z.array(zod_1.z.enum(['STARTER', 'GROWTH', 'PRO'])),
periods: zod_1.z.array(zod_1.z.enum(['MONTHLY', 'ANNUAL'])),
maxUses: zod_1.z.number().int().positive().nullable().optional(),
validFrom: zod_1.z.string().datetime(),
validUntil: zod_1.z.string().datetime().nullable().optional(),
isActive: zod_1.z.boolean().default(true),
});
exports.promotionUpdateSchema = exports.promotionCreateSchema.partial();
exports.planFeatureIdParamSchema = zod_1.z.object({ featureId: zod_1.z.string().min(1) });
exports.promotionIdParamSchema = zod_1.z.object({ promotionId: zod_1.z.string().min(1) });
const employeeRoleSchema = zod_1.z.enum(['OWNER', 'MANAGER', 'AGENT']);
const planSchema = zod_1.z.enum(['STARTER', 'GROWTH', 'PRO']);
const menuItemTypeSchema = zod_1.z.enum(['INTERNAL_PAGE', 'EXTERNAL_LINK', 'PARENT_MENU', 'SECTION_LABEL', 'DIVIDER']);
exports.menuItemSchema = zod_1.z.object({
systemKey: zod_1.z.string().trim().min(1).max(120).optional().nullable(),
label: zod_1.z.string().trim().min(1).max(120),
itemType: menuItemTypeSchema,
routeOrUrl: zod_1.z.string().trim().max(400).optional().nullable(),
icon: zod_1.z.string().trim().max(120).optional().nullable(),
parentId: zod_1.z.string().trim().min(1).optional().nullable(),
displayOrder: zod_1.z.number().int().min(0).default(0),
openInNewTab: zod_1.z.boolean().default(false),
isRequired: zod_1.z.boolean().default(false),
isActive: zod_1.z.boolean().default(true),
roles: zod_1.z.array(employeeRoleSchema).default([]),
subscriptionPlans: zod_1.z.array(zod_1.z.object({
plan: planSchema,
displayOrder: zod_1.z.number().int().min(0).optional(),
isActive: zod_1.z.boolean().optional(),
})).default([]),
companyAssignments: zod_1.z.array(zod_1.z.object({
companyId: zod_1.z.string().trim().min(1),
displayOrder: zod_1.z.number().int().min(0).optional(),
isActive: zod_1.z.boolean().optional(),
})).default([]),
});
exports.menuItemStatusSchema = zod_1.z.object({
isActive: zod_1.z.boolean(),
});
exports.menuPlanAssignmentsSchema = zod_1.z.object({
assignments: zod_1.z.array(zod_1.z.object({
plan: planSchema,
displayOrder: zod_1.z.number().int().min(0).optional(),
isActive: zod_1.z.boolean().optional(),
})).min(1),
});
exports.menuCompanyAssignmentsSchema = zod_1.z.object({
assignments: zod_1.z.array(zod_1.z.object({
companyId: zod_1.z.string().trim().min(1),
displayOrder: zod_1.z.number().int().min(0).optional(),
isActive: zod_1.z.boolean().optional(),
})).min(1),
});
exports.menuPreviewSchema = zod_1.z.object({
companyId: zod_1.z.string().trim().min(1),
role: employeeRoleSchema,
});
exports.menuAuditLogQuerySchema = zod_1.z.object({
page: zod_1.z.coerce.number().int().min(1).default(1),
pageSize: zod_1.z.coerce.number().int().min(1).max(100).default(20),
});
exports.menuItemIdParamSchema = zod_1.z.object({
id: zod_1.z.string().min(1),
});
exports.menuPlanParamSchema = zod_1.z.object({
id: zod_1.z.string().min(1),
plan: planSchema,
});
exports.menuCompanyParamSchema = zod_1.z.object({
id: zod_1.z.string().min(1),
companyId: zod_1.z.string().min(1),
});
//# sourceMappingURL=admin.schemas.js.map