@infuro/cms-core 1.0.45 → 1.0.47
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -2
- package/dist/admin.cjs +4249 -2872
- package/dist/admin.d.cts +24 -4
- package/dist/admin.d.ts +24 -4
- package/dist/admin.js +3179 -1804
- package/dist/api.cjs +41 -39
- package/dist/api.d.cts +10 -4
- package/dist/api.d.ts +10 -4
- package/dist/api.js +9 -7
- package/dist/auth.cjs +55 -51
- package/dist/auth.d.cts +6 -3
- package/dist/auth.d.ts +6 -3
- package/dist/auth.js +3 -3
- package/dist/{chunk-KFFB6EMZ.js → chunk-2HU5R2JE.js} +2 -0
- package/dist/chunk-2IAXTKQN.cjs +19 -0
- package/dist/chunk-2KUCQVAQ.js +936 -0
- package/dist/chunk-3K5AIEIZ.js +256 -0
- package/dist/{chunk-SPQFNIYJ.cjs → chunk-4PMK3RNA.cjs} +2 -0
- package/dist/{chunk-X6UQFV4X.cjs → chunk-77NUXO6A.cjs} +14 -12
- package/dist/chunk-BXYZDMTZ.cjs +953 -0
- package/dist/chunk-DBPSJYLZ.js +47 -0
- package/dist/chunk-EIZKW2PF.js +13 -0
- package/dist/chunk-HY3AXLOI.cjs +265 -0
- package/dist/{chunk-X47PBV4I.js → chunk-JE22VP6S.js} +1 -0
- package/dist/{chunk-DN65KDIA.js → chunk-JIWUVQ6B.js} +14 -13
- package/dist/{chunk-HT5DI3XW.cjs → chunk-KOTXDSQB.cjs} +1 -0
- package/dist/chunk-L3525VXI.js +243 -0
- package/dist/{chunk-22FFHLTO.cjs → chunk-LMJ7RKPF.cjs} +421 -150
- package/dist/chunk-OY2YTBMP.cjs +50 -0
- package/dist/{chunk-TAHX46EI.cjs → chunk-Q3HQEM4R.cjs} +15 -7
- package/dist/chunk-V25RDUOU.cjs +248 -0
- package/dist/{chunk-ZMRQ72F6.cjs → chunk-VUQFARRT.cjs} +10 -10
- package/dist/{chunk-MVXLRANV.js → chunk-W42UZLQO.js} +1977 -891
- package/dist/{chunk-F5XFHYTG.cjs → chunk-XUCKZPML.cjs} +2088 -991
- package/dist/{chunk-I6NH72MO.js → chunk-YC4NUZCS.js} +10 -2
- package/dist/{chunk-NNQBWDCI.js → chunk-YXH2UUEZ.js} +418 -146
- package/dist/{chunk-BLR6H5GL.js → chunk-ZF2RQWXB.js} +4 -4
- package/dist/cli.cjs +9 -4
- package/dist/cli.js +9 -4
- package/dist/{email-queue-TPZWLTIV.cjs → email-queue-6NJY6HNM.cjs} +7 -5
- package/dist/email-queue-OI2HSCGE.js +4 -0
- package/dist/{emit-order-notification-trigger-IVLWKKJL.js → emit-order-notification-trigger-6XX7LSC4.js} +1 -1
- package/dist/{emit-order-notification-trigger-D2N3KFHL.cjs → emit-order-notification-trigger-NASG7ZEO.cjs} +3 -3
- package/dist/erp-order-invoice-3GXDE443.js +3 -0
- package/dist/erp-order-invoice-EYYNR526.cjs +24 -0
- package/dist/{event-order-defaults-EMWBIGL3.cjs → event-order-defaults-7Z3UZOEH.cjs} +9 -9
- package/dist/{event-order-defaults-SDRNAZHC.js → event-order-defaults-XQ3IDPD7.js} +1 -1
- package/dist/hooks.cjs +43 -0
- package/dist/hooks.d.cts +10 -1
- package/dist/hooks.d.ts +10 -1
- package/dist/hooks.js +39 -1
- package/dist/index.cjs +429 -298
- package/dist/index.d.cts +317 -30
- package/dist/index.d.ts +317 -30
- package/dist/index.js +17 -13
- package/dist/migrations/1781810000000-OrderItemsVariantId.ts +44 -0
- package/dist/migrations/1781900000000-UserInviteStatusToken.ts +46 -0
- package/dist/migrations/1782000000000-ComboSlug.ts +58 -0
- package/dist/migrations/1782100000000-DiscountDeviceType.ts +20 -0
- package/dist/migrations/1782200000000-VendorTeamProfiles.ts +233 -0
- package/dist/migrations/1782300000000-AddTypeToOrderNotificationBindings.ts +75 -0
- package/dist/order-inventory-2MYRKEPC.cjs +39 -0
- package/dist/order-inventory-76V4XIGW.js +2 -0
- package/dist/{order-notification-dispatcher-XWIJYDGA.js → order-notification-dispatcher-6WNG24NY.js} +4 -2
- package/dist/{order-notification-dispatcher-RU7BTGGX.cjs → order-notification-dispatcher-6XSU3AR7.cjs} +6 -4
- package/dist/{rbac-debug-db-2SGNLANF.js → rbac-debug-db-6EMIVMGF.js} +1 -1
- package/dist/{rbac-debug-db-4Z6A425H.cjs → rbac-debug-db-6PWTLBEL.cjs} +2 -2
- package/dist/retire-soft-deleted-unique-5VXBA5XX.cjs +15 -0
- package/dist/retire-soft-deleted-unique-NXQIH4BC.js +2 -0
- package/dist/theme.cjs +6 -1
- package/dist/theme.d.cts +4 -1
- package/dist/theme.d.ts +4 -1
- package/dist/theme.js +3 -1
- package/package.json +5 -4
- package/src/admin/admin.css +34 -24
- package/dist/chunk-5ELSW2UP.js +0 -150
- package/dist/chunk-PNOKNSG2.cjs +0 -222
- package/dist/chunk-WEMDMVHQ.js +0 -216
- package/dist/chunk-XW5ATPRW.cjs +0 -155
- package/dist/email-queue-CGZBVVAS.js +0 -2
- package/dist/erp-order-invoice-3YISSOWW.js +0 -3
- package/dist/erp-order-invoice-ZR5F2KTA.cjs +0 -12
package/dist/index.js
CHANGED
|
@@ -1,22 +1,25 @@
|
|
|
1
|
-
export { emitOrderNotificationTrigger, fireOrderNotificationTrigger } from './chunk-
|
|
2
|
-
import { checkMultiVendorEnabled, loadUserVendorContext, getPublicSettingsGroup, BlogGeneratorService } from './chunk-
|
|
3
|
-
export { Address, Attendee, Attribute, BLOG_GENERATOR_AGENT_NAME, BLOG_GENERATOR_DEFAULT_SYSTEM_INSTRUCTION, BLOG_GENERATOR_DEFAULT_VALIDATION_RULES, BLOG_GENERATOR_LLM_AGENT_SLUG, BLOG_GENERATOR_MARKDOWN_ARTICLE_SEPARATOR, BLOG_METADATA_ENRICHER_AGENT_NAME, BLOG_METADATA_ENRICHER_DEFAULT_SYSTEM_INSTRUCTION, BLOG_METADATA_ENRICHER_DEFAULT_VALIDATION_RULES, BLOG_METADATA_ENRICHER_LLM_AGENT_SLUG, Blog, BlogGeneratorService, Brand, CMS_ENTITY_MAP, Cart, CartItem, Category, ChatConversation, ChatMessage, Collection, Combo, ComboItem, Comment, Config, Contact, Currency, CurrencyExchange, Customer, Customer_Contacts, Discount, DiscountRules, Event, EventProduct, Form, FormField, FormSubmission, JobSchedule, JobScheduleRun, KnowledgeBaseChunk, KnowledgeBaseDocument, LlmAgent, Media, MessageTemplate, Order, OrderAddresses, OrderDiscounts, OrderItem, OrderNotificationBinding, OrderNotificationTrigger, OtpChallenge, Page, PasswordResetToken, Payment, Permission, Product, ProductAttribute, ProductCategory, ProductConfig, ProductVariant, RefundPolicy, RefundRequest, RssArticle, RssFeed, Seo, Tag, Tax, User, UserGroup, Vendor, VendorCustomer, VendorRole, VendorRolePermission, VendorUser, Wishlist, WishlistItem, ZIP_MIME_TYPES, applyApprovalStatusSideEffects, applyEventApprovalStatusSideEffects, applyRotatingVendorInvite, applyVendorCustomersContactFilter, applyVendorEventCreateApproval, applyVendorProductCreateApproval, assertCaptchaOk, assertContactAllowedForVendorOrder, assertEventApprovalUpdate, assertProductApprovalUpdate, buildBlogMetadataUserPrompt, buildCronFromSchedule, buildRssUserPromptFromFeeds, buildVendorInviteLink, calculateOrderRefundPreview, calculateRefundFromPolicy, checkEventsEnabled, checkMultiVendorEnabled, contactIsVendorCustomer, countRecentOtpSends, createAnalyticsHandlers, createBlogBySlugHandler, createChangePasswordHandler, createCmsApiHandler, createCmsApp, createCmsAppWithMessaging, createCrudByIdHandler, createCrudHandler, createDashboardStatsHandler, createEcommerceAnalyticsHandler, createEventOrderMessageTemplateHandlers, createForgotPasswordHandler, createFormBySlugHandler, createInviteAcceptHandler, createJobScheduleHandlers, createLlmAgentKnowledgeHandlers, createMediaZipExtractHandler, createMessageTemplateRowLoader, createOtpChallenge, createSetPasswordHandler, createSettingsApiHandlers, createSocialMediaHandlers, createStorefrontApiHandler, createUploadHandler, createUserAuthApiRouter, createUserAvatarHandler, createUserProfileHandler, createUsersApiHandlers, createVendorDashboardHandler, createVendorOnboardHandlers, customerPhoneForEmail, customerPhoneForUser, daysBeforeEventStart, describeEventTierPolicy, ensureCustomerForUser, ensureCustomerRecord, ensureMessagingPluginsOnCms, ensureScheduleQueueWorker, ensureVendorCustomerForOrderContact, ensureVendorCustomersForOrder, findActiveRefundPolicyForVendor, findVendorByInviteToken, formatTierRange, generateNumericOtp, getPublicSettingsGroup, getRequireEventApproval, getRequireProductApproval, getRssArticleSummaryFromItem, getVendorCatalogCreateFlags, hashOtpCode, hydrateVendorSessionUser, invalidateEventsCache, invalidateMultiVendorCache, invalidateRequireEventApprovalCache, invalidateRequireProductApprovalCache, invalidateVendorCatalogCreateFlagsCache, isCustomerTypeContact, isSyntheticCustomerPhone, isZipMedia, linkUnclaimedContactToUser, llmAgentToChatAgentOptions, loadSettingsGroupFromDb, loadUserVendorContext, mergeGuardrailsIntoSystemPrompt, messagingPlugins, metaFetchUserManagedPages, metaPostPageFeed, metaPostPagePhoto, metaResolvePageAccessToken, normalizeCustomerPhone, normalizePhoneE164, normalizeRefundTiers, overlayCmsPlugins, parseBlogGeneratorAgentContent, parseBlogGeneratorModelOutput, parseBlogMetadataEnrichmentJson, parseLlmAgentValidationRules, pgBossScheduleNameForId, queueErpCreateContactIfEnabled, queueJobScheduleNow, queuePlugin, queueSms, registerJobRunnerWorker, registerMessagingQueueProcessors, registerSmsQueueProcessor, relativePathFromMediaParentId, resolveBlogCategoryIdByName, resolveSettingsEncryptionKey, resolveVendorIdForContactCheck, sanitizeMediaFolderPath, sanitizeStorageSegment, sendVendorOnboardEmails, simpleDecrypt, simpleEncrypt, syncJobScheduleToPgBoss, validateRefundTiers, validateScheduleInput, validateUserMessageAgainstAgentRules, validateUserMessageAgainstStructuredRules, verifyAndConsumeOtpChallenge, verifyOtpCodeHash, whatsappPlugin, wrapGetCmsWithMessaging } from './chunk-
|
|
4
|
-
|
|
5
|
-
export {
|
|
1
|
+
export { emitOrderNotificationTrigger, fireOrderNotificationTrigger } from './chunk-JE22VP6S.js';
|
|
2
|
+
import { checkMultiVendorEnabled, loadUserVendorContext, getPublicSettingsGroup, BlogGeneratorService } from './chunk-W42UZLQO.js';
|
|
3
|
+
export { Address, Attendee, Attribute, BLOG_GENERATOR_AGENT_NAME, BLOG_GENERATOR_DEFAULT_SYSTEM_INSTRUCTION, BLOG_GENERATOR_DEFAULT_VALIDATION_RULES, BLOG_GENERATOR_LLM_AGENT_SLUG, BLOG_GENERATOR_MARKDOWN_ARTICLE_SEPARATOR, BLOG_METADATA_ENRICHER_AGENT_NAME, BLOG_METADATA_ENRICHER_DEFAULT_SYSTEM_INSTRUCTION, BLOG_METADATA_ENRICHER_DEFAULT_VALIDATION_RULES, BLOG_METADATA_ENRICHER_LLM_AGENT_SLUG, Blog, BlogGeneratorService, Brand, CMS_ENTITY_MAP, Cart, CartItem, Category, ChatConversation, ChatMessage, Collection, Combo, ComboItem, Comment, Config, Contact, Currency, CurrencyExchange, Customer, Customer_Contacts, Discount, DiscountRules, Event, EventProduct, Form, FormField, FormSubmission, JobSchedule, JobScheduleRun, KnowledgeBaseChunk, KnowledgeBaseDocument, LlmAgent, Media, MessageTemplate, Order, OrderAddresses, OrderDiscounts, OrderItem, OrderNotificationBinding, OrderNotificationTrigger, OtpChallenge, Page, PasswordResetToken, Payment, Permission, Product, ProductAttribute, ProductCategory, ProductConfig, ProductVariant, RefundPolicy, RefundRequest, RssArticle, RssFeed, Seo, Tag, Tax, User, UserGroup, Vendor, VendorCustomer, VendorRole, VendorRolePermission, VendorUser, VendorUserProfile, Wishlist, WishlistItem, ZIP_MIME_TYPES, applyApprovalStatusSideEffects, applyEventApprovalStatusSideEffects, applyRotatingVendorInvite, applyVendorCustomersContactFilter, applyVendorEventCreateApproval, applyVendorProductCreateApproval, assertCaptchaOk, assertContactAllowedForVendorOrder, assertEventApprovalUpdate, assertProductApprovalUpdate, buildBlogMetadataUserPrompt, buildCronFromSchedule, buildRssUserPromptFromFeeds, buildUserInviteLink, buildVendorInviteLink, calculateOrderRefundPreview, calculateRefundFromPolicy, checkAndIncrementDiscountUsage, checkEventsEnabled, checkMultiVendorEnabled, completeUserInviteAccept, consumeAppliedDiscountUsages, contactIsVendorCustomer, countDiscountOrdersForContact, countRecentOtpSends, createAnalyticsHandlers, createBlogBySlugHandler, createChangePasswordHandler, createCmsApiHandler, createCmsApp, createCmsAppWithMessaging, createCrudByIdHandler, createCrudHandler, createDashboardStatsHandler, createEcommerceAnalyticsHandler, createEventOrderMessageTemplateHandlers, createForgotPasswordHandler, createFormBySlugHandler, createInviteAcceptHandler, createJobScheduleHandlers, createLlmAgentKnowledgeHandlers, createMediaZipExtractHandler, createMessageTemplateRowLoader, createOtpChallenge, createSetPasswordHandler, createSettingsApiHandlers, createSocialMediaHandlers, createStorefrontApiHandler, createUploadHandler, createUserAuthApiRouter, createUserAvatarHandler, createUserProfileHandler, createUsersApiHandlers, createVendorDashboardHandler, createVendorOnboardHandlers, customerPhoneForEmail, customerPhoneForUser, daysBeforeEventStart, decrementDiscountUsage, describeEventTierPolicy, ensureCustomerForUser, ensureCustomerRecord, ensureMessagingPluginsOnCms, ensureScheduleQueueWorker, ensureVendorCustomerForOrderContact, ensureVendorCustomersForOrder, findActiveRefundPolicyForVendor, findUserByInviteToken, findVendorByInviteToken, formatTierRange, generateNumericOtp, getPublicSettingsGroup, getRequireEventApproval, getRequireProductApproval, getRssArticleSummaryFromItem, getVendorCatalogCreateFlags, hashOtpCode, hydrateVendorSessionUser, invalidateEventsCache, invalidateMultiVendorCache, invalidateRequireEventApprovalCache, invalidateRequireProductApprovalCache, invalidateVendorCatalogCreateFlagsCache, isCustomerTypeContact, isMaxPerUserUsageReached, isMaxTotalUsageReached, isSyntheticCustomerPhone, isZipMedia, linkUnclaimedContactToUser, llmAgentToChatAgentOptions, loadSettingsGroupFromDb, loadUserVendorContext, mergeGuardrailsIntoSystemPrompt, messagingPlugins, metaFetchUserManagedPages, metaPostPageFeed, metaPostPagePhoto, metaResolvePageAccessToken, newUserInviteToken, normalizeCustomerPhone, normalizePhoneE164, normalizeRefundTiers, overlayCmsPlugins, parseBlogGeneratorAgentContent, parseBlogGeneratorModelOutput, parseBlogMetadataEnrichmentJson, parseLlmAgentValidationRules, pgBossScheduleNameForId, queueErpCreateContactIfEnabled, queueJobScheduleNow, queuePlugin, queueSms, recordDiscountUsage, registerJobRunnerWorker, registerMessagingQueueProcessors, registerSmsQueueProcessor, relativePathFromMediaParentId, resolveBlogCategoryIdByName, resolveSettingsEncryptionKey, resolveVendorIdForContactCheck, sanitizeMediaFolderPath, sanitizeStorageSegment, sendVendorOnboardEmails, simpleDecrypt, simpleEncrypt, syncJobScheduleToPgBoss, validateRefundTiers, validateScheduleInput, validateUserMessageAgainstAgentRules, validateUserMessageAgainstStructuredRules, verifyAndConsumeOtpChallenge, verifyOtpCodeHash, whatsappPlugin, wrapGetCmsWithMessaging } from './chunk-W42UZLQO.js';
|
|
4
|
+
export { deductInventoryForConfirmedOrder, mergeInventoryLines, orderInventorySnapshotFromRow, orderStatusHoldsStock, reconcileOrderInventoryBetweenSnapshots, restoreInventoryForCancelledOrder, validateInventoryForConfirmedOrderLines, validateInventoryForOrderBecomingConfirmed } from './chunk-3K5AIEIZ.js';
|
|
5
|
+
export { activeUniqueValueExists, retireSoftDeletedUniqueValue } from './chunk-DBPSJYLZ.js';
|
|
6
|
+
import { parseEmailRecipientsFromConfig } from './chunk-YXH2UUEZ.js';
|
|
7
|
+
export { EmailService, buildEventOrderTemplateVariables, emailPlugin, emailTemplates, initWhatsappTriggerDispatcher, joinRecipientsForSend, parseEmailRecipientsFromConfig, queueWhatsApp, registerWhatsAppQueueProcessor, renderEmail, renderLayout, resendOrderNotification, serializeEmailRecipients } from './chunk-YXH2UUEZ.js';
|
|
6
8
|
export { KNOWN_NOTIFICATION_TRIGGERS, notificationTriggerEmitter } from './chunk-HCIRL37O.js';
|
|
7
9
|
import './chunk-JXF23MPG.js';
|
|
8
|
-
import './chunk-
|
|
9
|
-
|
|
10
|
-
|
|
10
|
+
import { queueOrderPlacedEmails } from './chunk-L3525VXI.js';
|
|
11
|
+
export { queueEmail, queueOrderPlacedEmails, queueVendorOnboardEmails, registerEmailQueueProcessor } from './chunk-L3525VXI.js';
|
|
12
|
+
import { mergeEmailLayoutCompanyDetails } from './chunk-2KUCQVAQ.js';
|
|
13
|
+
export { INVOICE_TEMPLATE_IDS, INVOICE_TEMPLATE_OPTIONS, buildLocalInvoicePdfForOrder, generateLocalInvoicePdf, getCompanyDetailsFromSettings, isOrderEligibleForInvoiceEmail, mergeEmailLayoutCompanyDetails, normalizeInvoiceTemplateId, resolveInvoiceAssetUrl, resolveOrderInvoicePdfBytes, streamOrderInvoicePdf } from './chunk-2KUCQVAQ.js';
|
|
11
14
|
import './chunk-MQBT33IV.js';
|
|
12
15
|
import './chunk-CRFV5WJK.js';
|
|
13
|
-
export { EVENT_ORDER_MESSAGE_TEMPLATE_DEFAULTS, EVENT_ORDER_TEMPLATE_KEY, EVENT_ORDER_TEMPLATE_VARIABLES, resolveEventOrderTemplate } from './chunk-
|
|
16
|
+
export { EVENT_ORDER_MESSAGE_TEMPLATE_DEFAULTS, EVENT_ORDER_TEMPLATE_KEY, EVENT_ORDER_TEMPLATE_VARIABLES, resolveEventOrderTemplate } from './chunk-2HU5R2JE.js';
|
|
14
17
|
import { PgBossService } from './chunk-GO7PPYNU.js';
|
|
15
18
|
export { JOB_RUNNER_QUEUE, PgBossService } from './chunk-GO7PPYNU.js';
|
|
16
|
-
export { createCmsMiddleware, defaultPublicApiMethods, getNextAuthOptions, getStorefrontNextAuthOptions, isAuthDebugClientEnabled, isAuthDebugEnabled, logAuth, logAuthClient, nextAuthCookieDebugInfo, seedAdministratorPermissions, summarizeSessionUserForLog } from './chunk-
|
|
17
|
-
export { OPEN_ENDPOINTS, PERMISSION_REQUIRED_ENDPOINTS, RBAC_ADMIN_ONLY_ENTITIES, canManageRoles, createAuthHelpers, createCmsAuthBundle, getRequiredPermission, isOpenEndpoint, isPublicMethod, sessionHasEntityAccess } from './chunk-
|
|
18
|
-
import { isSuperAdmin, isVendorGroupName } from './chunk-
|
|
19
|
-
export { ADMIN_GROUP_NAME, SUPER_ADMIN_GROUP_ID, VENDOR_ADMIN_GROUP_ID, VENDOR_OWNER_GROUP_NAME, VENDOR_SCOPED_STORE_ENTITIES, VENDOR_STORE_RBAC_ENTITIES, canManageVendorRoles, canManageVendorTeam, canOnboardVendors, explainSessionEntityAccess, getPermissionableEntityKeys, hasEntityPermission, isPlatformAdministrator, isRbacDebugEnabled, isSuperAdmin, isSuperAdminGroupName, isVendorAdmin, isVendorGroupName, isVendorOwner, isVendorPortalUser, isVendorStaff, logEntityAccessDecision, logRbac, permissionRowsToRecord, resolveVendorScopeFromSessionUser, summarizeEntityPerms, vendorPortalFlagsFromUser } from './chunk-
|
|
19
|
+
export { createCmsMiddleware, defaultPublicApiMethods, getNextAuthOptions, getStorefrontNextAuthOptions, isAuthDebugClientEnabled, isAuthDebugEnabled, logAuth, logAuthClient, nextAuthCookieDebugInfo, seedAdministratorPermissions, summarizeSessionUserForLog } from './chunk-YC4NUZCS.js';
|
|
20
|
+
export { OPEN_ENDPOINTS, PERMISSION_REQUIRED_ENDPOINTS, RBAC_ADMIN_ONLY_ENTITIES, canManageRoles, createAuthHelpers, createCmsAuthBundle, getRequiredPermission, isOpenEndpoint, isPublicMethod, sessionHasEntityAccess } from './chunk-ZF2RQWXB.js';
|
|
21
|
+
import { isSuperAdmin, isVendorGroupName } from './chunk-JIWUVQ6B.js';
|
|
22
|
+
export { ADMIN_GROUP_NAME, SUPER_ADMIN_GROUP_ID, VENDOR_ADMIN_GROUP_ID, VENDOR_GROUP_NAME, VENDOR_OWNER_GROUP_NAME, VENDOR_SCOPED_STORE_ENTITIES, VENDOR_STORE_RBAC_ENTITIES, canManageVendorRoles, canManageVendorTeam, canOnboardVendors, explainSessionEntityAccess, getPermissionableEntityKeys, hasEntityPermission, isPlatformAdministrator, isRbacDebugEnabled, isSuperAdmin, isSuperAdminGroupName, isVendorAdmin, isVendorGroupName, isVendorOwner, isVendorPortalUser, isVendorStaff, logEntityAccessDecision, logRbac, permissionRowsToRecord, resolveVendorScopeFromSessionUser, summarizeEntityPerms, vendorPortalFlagsFromUser } from './chunk-JIWUVQ6B.js';
|
|
20
23
|
export { queueErpPaidOrderForOrderId } from './chunk-TDV6EJHV.js';
|
|
21
24
|
import { erpSafeWebhookUrl, logErp, warnErp, errorErp } from './chunk-SYBOCAWB.js';
|
|
22
25
|
export { queueErp, registerErpQueueProcessor } from './chunk-SYBOCAWB.js';
|
|
@@ -2258,6 +2261,7 @@ async function sendOrderPlacedEmailsAfterConfirmation(orderId, deps) {
|
|
|
2258
2261
|
const salesTeamEmails = parseEmailRecipientsFromConfig(emailSettings.salesTeamEmails ?? emailSettings.salesTeamEmail);
|
|
2259
2262
|
const cms = await deps.getCms();
|
|
2260
2263
|
await queueOrderPlacedEmails(cms, {
|
|
2264
|
+
orderId,
|
|
2261
2265
|
orderNumber: o.orderNumber,
|
|
2262
2266
|
total: o.total,
|
|
2263
2267
|
subtotal: o.subtotal,
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { MigrationInterface, QueryRunner } from 'typeorm';
|
|
2
|
+
|
|
3
|
+
export class OrderItemsVariantId1781810000000 implements MigrationInterface {
|
|
4
|
+
name = 'OrderItemsVariantId1781810000000';
|
|
5
|
+
|
|
6
|
+
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
7
|
+
await queryRunner.query(`
|
|
8
|
+
ALTER TABLE "order_items"
|
|
9
|
+
ADD COLUMN IF NOT EXISTS "variantId" integer
|
|
10
|
+
`);
|
|
11
|
+
await queryRunner.query(`
|
|
12
|
+
CREATE INDEX IF NOT EXISTS "IDX_order_items_variantId"
|
|
13
|
+
ON "order_items" ("variantId")
|
|
14
|
+
`);
|
|
15
|
+
// Best-effort FK when product_variants exists
|
|
16
|
+
await queryRunner.query(`
|
|
17
|
+
DO $$
|
|
18
|
+
BEGIN
|
|
19
|
+
IF EXISTS (
|
|
20
|
+
SELECT 1 FROM information_schema.tables
|
|
21
|
+
WHERE table_name = 'product_variants'
|
|
22
|
+
) AND NOT EXISTS (
|
|
23
|
+
SELECT 1 FROM information_schema.table_constraints
|
|
24
|
+
WHERE constraint_name = 'FK_order_items_variant'
|
|
25
|
+
) THEN
|
|
26
|
+
ALTER TABLE "order_items"
|
|
27
|
+
ADD CONSTRAINT "FK_order_items_variant"
|
|
28
|
+
FOREIGN KEY ("variantId") REFERENCES "product_variants"("id")
|
|
29
|
+
ON DELETE SET NULL ON UPDATE NO ACTION;
|
|
30
|
+
END IF;
|
|
31
|
+
END $$;
|
|
32
|
+
`);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
36
|
+
await queryRunner.query(`
|
|
37
|
+
ALTER TABLE "order_items" DROP CONSTRAINT IF EXISTS "FK_order_items_variant"
|
|
38
|
+
`);
|
|
39
|
+
await queryRunner.query(`DROP INDEX IF EXISTS "IDX_order_items_variantId"`);
|
|
40
|
+
await queryRunner.query(`
|
|
41
|
+
ALTER TABLE "order_items" DROP COLUMN IF EXISTS "variantId"
|
|
42
|
+
`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { MigrationInterface, QueryRunner } from 'typeorm';
|
|
2
|
+
|
|
3
|
+
export class UserInviteStatusToken1781900000000 implements MigrationInterface {
|
|
4
|
+
name = 'UserInviteStatusToken1781900000000';
|
|
5
|
+
|
|
6
|
+
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
7
|
+
await queryRunner.query(`
|
|
8
|
+
DO $$ BEGIN
|
|
9
|
+
CREATE TYPE "users_invitestatus_enum" AS ENUM ('pending', 'active');
|
|
10
|
+
EXCEPTION WHEN duplicate_object THEN NULL;
|
|
11
|
+
END $$
|
|
12
|
+
`);
|
|
13
|
+
|
|
14
|
+
await queryRunner.query(`
|
|
15
|
+
ALTER TABLE "users"
|
|
16
|
+
ADD COLUMN IF NOT EXISTS "inviteStatus" "users_invitestatus_enum" NOT NULL DEFAULT 'active'
|
|
17
|
+
`);
|
|
18
|
+
await queryRunner.query(`
|
|
19
|
+
ALTER TABLE "users"
|
|
20
|
+
ADD COLUMN IF NOT EXISTS "inviteToken" character varying
|
|
21
|
+
`);
|
|
22
|
+
|
|
23
|
+
// Existing users with a password are active; password-less users are pending invites.
|
|
24
|
+
await queryRunner.query(`
|
|
25
|
+
UPDATE "users"
|
|
26
|
+
SET "inviteStatus" = CASE
|
|
27
|
+
WHEN "password" IS NOT NULL AND TRIM("password") <> '' THEN 'active'::"users_invitestatus_enum"
|
|
28
|
+
ELSE 'pending'::"users_invitestatus_enum"
|
|
29
|
+
END
|
|
30
|
+
WHERE "deleted" = false
|
|
31
|
+
`);
|
|
32
|
+
|
|
33
|
+
await queryRunner.query(`
|
|
34
|
+
CREATE INDEX IF NOT EXISTS "IDX_users_inviteToken"
|
|
35
|
+
ON "users" ("inviteToken")
|
|
36
|
+
WHERE "inviteToken" IS NOT NULL
|
|
37
|
+
`);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
41
|
+
await queryRunner.query(`DROP INDEX IF EXISTS "IDX_users_inviteToken"`);
|
|
42
|
+
await queryRunner.query(`ALTER TABLE "users" DROP COLUMN IF EXISTS "inviteToken"`);
|
|
43
|
+
await queryRunner.query(`ALTER TABLE "users" DROP COLUMN IF EXISTS "inviteStatus"`);
|
|
44
|
+
await queryRunner.query(`DROP TYPE IF EXISTS "users_invitestatus_enum"`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { MigrationInterface, QueryRunner } from 'typeorm';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Add combos.slug (unique per vendor), backfill from name.
|
|
5
|
+
*/
|
|
6
|
+
export class ComboSlug1782000000000 implements MigrationInterface {
|
|
7
|
+
name = 'ComboSlug1782000000000';
|
|
8
|
+
|
|
9
|
+
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
10
|
+
await queryRunner.query(`
|
|
11
|
+
ALTER TABLE "combos"
|
|
12
|
+
ADD COLUMN IF NOT EXISTS "slug" character varying
|
|
13
|
+
`);
|
|
14
|
+
|
|
15
|
+
// Slugify name; empty → combo-{id}
|
|
16
|
+
await queryRunner.query(`
|
|
17
|
+
UPDATE "combos"
|
|
18
|
+
SET "slug" = CASE
|
|
19
|
+
WHEN NULLIF(TRIM(BOTH '-' FROM LOWER(REGEXP_REPLACE(COALESCE(TRIM("name"), ''), '[^a-zA-Z0-9]+', '-', 'g'))), '') IS NULL
|
|
20
|
+
THEN 'combo-' || "id"::text
|
|
21
|
+
ELSE TRIM(BOTH '-' FROM LOWER(REGEXP_REPLACE(COALESCE(TRIM("name"), ''), '[^a-zA-Z0-9]+', '-', 'g')))
|
|
22
|
+
END
|
|
23
|
+
WHERE "slug" IS NULL OR TRIM("slug") = ''
|
|
24
|
+
`);
|
|
25
|
+
|
|
26
|
+
// Deduplicate within vendor (append -id when collisions remain)
|
|
27
|
+
await queryRunner.query(`
|
|
28
|
+
WITH ranked AS (
|
|
29
|
+
SELECT
|
|
30
|
+
id,
|
|
31
|
+
"vendorId",
|
|
32
|
+
slug,
|
|
33
|
+
ROW_NUMBER() OVER (PARTITION BY "vendorId", slug ORDER BY id) AS rn
|
|
34
|
+
FROM "combos"
|
|
35
|
+
WHERE deleted = false OR deleted IS NULL
|
|
36
|
+
)
|
|
37
|
+
UPDATE "combos" c
|
|
38
|
+
SET slug = c.slug || '-' || c.id::text
|
|
39
|
+
FROM ranked r
|
|
40
|
+
WHERE c.id = r.id AND r.rn > 1
|
|
41
|
+
`);
|
|
42
|
+
|
|
43
|
+
await queryRunner.query(`
|
|
44
|
+
ALTER TABLE "combos"
|
|
45
|
+
ALTER COLUMN "slug" SET NOT NULL
|
|
46
|
+
`);
|
|
47
|
+
|
|
48
|
+
await queryRunner.query(`
|
|
49
|
+
CREATE UNIQUE INDEX IF NOT EXISTS "UQ_combos_vendor_slug"
|
|
50
|
+
ON "combos" ("vendorId", "slug")
|
|
51
|
+
`);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
55
|
+
await queryRunner.query(`DROP INDEX IF EXISTS "UQ_combos_vendor_slug"`);
|
|
56
|
+
await queryRunner.query(`ALTER TABLE "combos" DROP COLUMN IF EXISTS "slug"`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { MigrationInterface, QueryRunner } from 'typeorm';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Add discount_rules.type value `deviceType` (Web / Mobile condition; admin-only for now).
|
|
5
|
+
*/
|
|
6
|
+
export class DiscountDeviceType1782100000000 implements MigrationInterface {
|
|
7
|
+
name = 'DiscountDeviceType1782100000000';
|
|
8
|
+
|
|
9
|
+
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
10
|
+
await queryRunner.query(`
|
|
11
|
+
ALTER TYPE "public"."discount_rules_type_enum"
|
|
12
|
+
ADD VALUE IF NOT EXISTS 'deviceType'
|
|
13
|
+
`);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
17
|
+
// Postgres cannot easily remove a single enum value; leave as no-op.
|
|
18
|
+
void queryRunner;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
import type { MigrationInterface, QueryRunner } from 'typeorm';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Vendor team/profiles redesign:
|
|
5
|
+
* - Rename user group "Vendor Owner" → "Vendor"
|
|
6
|
+
* - Create vendor_user_profiles
|
|
7
|
+
* - Add vendor_users.vendorUserProfileId; backfill profiles + vendorRoleId
|
|
8
|
+
* - Drop vendor_users.role and vendors.pan
|
|
9
|
+
*/
|
|
10
|
+
export class VendorTeamProfiles1782200000000 implements MigrationInterface {
|
|
11
|
+
name = 'VendorTeamProfiles1782200000000';
|
|
12
|
+
|
|
13
|
+
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
14
|
+
await queryRunner.query(`
|
|
15
|
+
UPDATE "user_groups"
|
|
16
|
+
SET "name" = 'Vendor'
|
|
17
|
+
WHERE "name" = 'Vendor Owner' AND "deleted" = false
|
|
18
|
+
`);
|
|
19
|
+
|
|
20
|
+
await queryRunner.query(`
|
|
21
|
+
CREATE TABLE IF NOT EXISTS "vendor_user_profiles" (
|
|
22
|
+
"id" SERIAL PRIMARY KEY,
|
|
23
|
+
"name" character varying NOT NULL,
|
|
24
|
+
"email" character varying NOT NULL,
|
|
25
|
+
"phone" character varying,
|
|
26
|
+
"aadhaarNo" character varying,
|
|
27
|
+
"panNo" character varying,
|
|
28
|
+
"addressLine1" character varying,
|
|
29
|
+
"addressLine2" character varying,
|
|
30
|
+
"city" character varying,
|
|
31
|
+
"state" character varying,
|
|
32
|
+
"postalCode" character varying,
|
|
33
|
+
"createdAt" TIMESTAMP NOT NULL DEFAULT now(),
|
|
34
|
+
"updatedAt" TIMESTAMP NOT NULL DEFAULT now()
|
|
35
|
+
)
|
|
36
|
+
`);
|
|
37
|
+
|
|
38
|
+
const hasProfileFk = (await queryRunner.query(`
|
|
39
|
+
SELECT 1 FROM information_schema.columns
|
|
40
|
+
WHERE table_name = 'vendor_users' AND column_name = 'vendorUserProfileId'
|
|
41
|
+
LIMIT 1
|
|
42
|
+
`)) as unknown[];
|
|
43
|
+
if (!hasProfileFk.length) {
|
|
44
|
+
await queryRunner.query(`
|
|
45
|
+
ALTER TABLE "vendor_users"
|
|
46
|
+
ADD COLUMN "vendorUserProfileId" integer
|
|
47
|
+
`);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// One profile per membership (loop keeps vu.id ↔ profile.id aligned)
|
|
51
|
+
await queryRunner.query(`
|
|
52
|
+
DO $$
|
|
53
|
+
DECLARE
|
|
54
|
+
r RECORD;
|
|
55
|
+
new_id integer;
|
|
56
|
+
is_owner boolean;
|
|
57
|
+
BEGIN
|
|
58
|
+
FOR r IN
|
|
59
|
+
SELECT
|
|
60
|
+
vu.id AS vu_id,
|
|
61
|
+
vu.role AS vu_role,
|
|
62
|
+
vu."vendorRoleId" AS vendor_role_id,
|
|
63
|
+
COALESCE(NULLIF(TRIM(u.name), ''), COALESCE(NULLIF(TRIM(u.email), ''), 'Vendor user')) AS pname,
|
|
64
|
+
COALESCE(NULLIF(TRIM(u.email), ''), CONCAT('vendor-user-', vu.id, '@placeholder.local')) AS pemail,
|
|
65
|
+
NULLIF(TRIM(u.phone), '') AS pphone,
|
|
66
|
+
v.pan AS vpan,
|
|
67
|
+
v."addressLine1" AS a1,
|
|
68
|
+
v."addressLine2" AS a2,
|
|
69
|
+
v.city AS city,
|
|
70
|
+
v.state AS state,
|
|
71
|
+
v."postalCode" AS postal,
|
|
72
|
+
COALESCE(vr."isOwnerRole", false) AS role_is_owner
|
|
73
|
+
FROM "vendor_users" vu
|
|
74
|
+
INNER JOIN "users" u ON u.id = vu."userId"
|
|
75
|
+
INNER JOIN "vendors" v ON v.id = vu."vendorId"
|
|
76
|
+
LEFT JOIN "vendor_roles" vr ON vr.id = vu."vendorRoleId"
|
|
77
|
+
WHERE vu."vendorUserProfileId" IS NULL
|
|
78
|
+
ORDER BY vu.id
|
|
79
|
+
LOOP
|
|
80
|
+
is_owner := (r.vu_role = 'owner') OR (r.role_is_owner = true);
|
|
81
|
+
INSERT INTO "vendor_user_profiles" (
|
|
82
|
+
"name", "email", "phone", "aadhaarNo", "panNo",
|
|
83
|
+
"addressLine1", "addressLine2", "city", "state", "postalCode",
|
|
84
|
+
"createdAt", "updatedAt"
|
|
85
|
+
) VALUES (
|
|
86
|
+
r.pname,
|
|
87
|
+
r.pemail,
|
|
88
|
+
r.pphone,
|
|
89
|
+
NULL,
|
|
90
|
+
CASE WHEN is_owner THEN NULLIF(TRIM(r.vpan), '') ELSE NULL END,
|
|
91
|
+
CASE WHEN is_owner THEN r.a1 ELSE NULL END,
|
|
92
|
+
CASE WHEN is_owner THEN r.a2 ELSE NULL END,
|
|
93
|
+
CASE WHEN is_owner THEN r.city ELSE NULL END,
|
|
94
|
+
CASE WHEN is_owner THEN r.state ELSE NULL END,
|
|
95
|
+
CASE WHEN is_owner THEN r.postal ELSE NULL END,
|
|
96
|
+
now(),
|
|
97
|
+
now()
|
|
98
|
+
) RETURNING id INTO new_id;
|
|
99
|
+
UPDATE "vendor_users" SET "vendorUserProfileId" = new_id WHERE id = r.vu_id;
|
|
100
|
+
END LOOP;
|
|
101
|
+
END $$;
|
|
102
|
+
`);
|
|
103
|
+
|
|
104
|
+
// Ensure vendorRoleId for legacy rows (while role column still exists)
|
|
105
|
+
await queryRunner.query(`
|
|
106
|
+
UPDATE "vendor_users" vu
|
|
107
|
+
SET "vendorRoleId" = vr.id
|
|
108
|
+
FROM "vendor_roles" vr
|
|
109
|
+
WHERE vu."vendorId" = vr."vendorId"
|
|
110
|
+
AND vu."vendorRoleId" IS NULL
|
|
111
|
+
AND vr.deleted = false
|
|
112
|
+
AND vu.role = 'owner'
|
|
113
|
+
AND vr."isOwnerRole" = true
|
|
114
|
+
`);
|
|
115
|
+
|
|
116
|
+
await queryRunner.query(`
|
|
117
|
+
UPDATE "vendor_users" vu
|
|
118
|
+
SET "vendorRoleId" = vr.id
|
|
119
|
+
FROM "vendor_roles" vr
|
|
120
|
+
WHERE vu."vendorId" = vr."vendorId"
|
|
121
|
+
AND vu."vendorRoleId" IS NULL
|
|
122
|
+
AND vr.deleted = false
|
|
123
|
+
AND vu.role IS DISTINCT FROM 'owner'
|
|
124
|
+
AND vr.name = 'Viewer'
|
|
125
|
+
AND vr."isSystem" = true
|
|
126
|
+
`);
|
|
127
|
+
|
|
128
|
+
await queryRunner.query(`
|
|
129
|
+
UPDATE "vendor_users" vu
|
|
130
|
+
SET "vendorRoleId" = vr.id
|
|
131
|
+
FROM "vendor_roles" vr
|
|
132
|
+
WHERE vu."vendorId" = vr."vendorId"
|
|
133
|
+
AND vu."vendorRoleId" IS NULL
|
|
134
|
+
AND vr.deleted = false
|
|
135
|
+
AND vr."isOwnerRole" = false
|
|
136
|
+
AND vr."isSystem" = true
|
|
137
|
+
AND vr.name = 'Manager'
|
|
138
|
+
`);
|
|
139
|
+
|
|
140
|
+
const nullProfiles = (await queryRunner.query(`
|
|
141
|
+
SELECT COUNT(*)::int AS c FROM "vendor_users" WHERE "vendorUserProfileId" IS NULL
|
|
142
|
+
`)) as Array<{ c: number }>;
|
|
143
|
+
if (Number(nullProfiles[0]?.c ?? 0) > 0) {
|
|
144
|
+
throw new Error('VendorTeamProfiles migration: some vendor_users still lack vendorUserProfileId');
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
await queryRunner.query(`
|
|
148
|
+
ALTER TABLE "vendor_users"
|
|
149
|
+
ALTER COLUMN "vendorUserProfileId" SET NOT NULL
|
|
150
|
+
`);
|
|
151
|
+
|
|
152
|
+
const fkExists = (await queryRunner.query(`
|
|
153
|
+
SELECT 1 FROM pg_constraint WHERE conname = 'FK_vendor_users_vendorUserProfileId' LIMIT 1
|
|
154
|
+
`)) as unknown[];
|
|
155
|
+
if (!fkExists.length) {
|
|
156
|
+
await queryRunner.query(`
|
|
157
|
+
ALTER TABLE "vendor_users"
|
|
158
|
+
ADD CONSTRAINT "FK_vendor_users_vendorUserProfileId"
|
|
159
|
+
FOREIGN KEY ("vendorUserProfileId") REFERENCES "vendor_user_profiles"("id")
|
|
160
|
+
ON DELETE RESTRICT
|
|
161
|
+
`);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
const roleCol = (await queryRunner.query(`
|
|
165
|
+
SELECT 1 FROM information_schema.columns
|
|
166
|
+
WHERE table_name = 'vendor_users' AND column_name = 'role'
|
|
167
|
+
LIMIT 1
|
|
168
|
+
`)) as unknown[];
|
|
169
|
+
if (roleCol.length) {
|
|
170
|
+
await queryRunner.query(`ALTER TABLE "vendor_users" DROP COLUMN "role"`);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
const panCol = (await queryRunner.query(`
|
|
174
|
+
SELECT 1 FROM information_schema.columns
|
|
175
|
+
WHERE table_name = 'vendors' AND column_name = 'pan'
|
|
176
|
+
LIMIT 1
|
|
177
|
+
`)) as unknown[];
|
|
178
|
+
if (panCol.length) {
|
|
179
|
+
await queryRunner.query(`ALTER TABLE "vendors" DROP COLUMN "pan"`);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
184
|
+
const panCol = (await queryRunner.query(`
|
|
185
|
+
SELECT 1 FROM information_schema.columns
|
|
186
|
+
WHERE table_name = 'vendors' AND column_name = 'pan'
|
|
187
|
+
LIMIT 1
|
|
188
|
+
`)) as unknown[];
|
|
189
|
+
if (!panCol.length) {
|
|
190
|
+
await queryRunner.query(`ALTER TABLE "vendors" ADD COLUMN "pan" character varying`);
|
|
191
|
+
await queryRunner.query(`
|
|
192
|
+
UPDATE "vendors" v
|
|
193
|
+
SET pan = p."panNo"
|
|
194
|
+
FROM "vendor_users" vu
|
|
195
|
+
INNER JOIN "vendor_user_profiles" p ON p.id = vu."vendorUserProfileId"
|
|
196
|
+
INNER JOIN "vendor_roles" vr ON vr.id = vu."vendorRoleId" AND vr."isOwnerRole" = true
|
|
197
|
+
WHERE vu."vendorId" = v.id AND p."panNo" IS NOT NULL
|
|
198
|
+
`);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
const roleCol = (await queryRunner.query(`
|
|
202
|
+
SELECT 1 FROM information_schema.columns
|
|
203
|
+
WHERE table_name = 'vendor_users' AND column_name = 'role'
|
|
204
|
+
LIMIT 1
|
|
205
|
+
`)) as unknown[];
|
|
206
|
+
if (!roleCol.length) {
|
|
207
|
+
await queryRunner.query(`
|
|
208
|
+
ALTER TABLE "vendor_users"
|
|
209
|
+
ADD COLUMN "role" character varying NOT NULL DEFAULT 'staff'
|
|
210
|
+
`);
|
|
211
|
+
await queryRunner.query(`
|
|
212
|
+
UPDATE "vendor_users" vu
|
|
213
|
+
SET "role" = 'owner'
|
|
214
|
+
FROM "vendor_roles" vr
|
|
215
|
+
WHERE vu."vendorRoleId" = vr.id AND vr."isOwnerRole" = true
|
|
216
|
+
`);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
await queryRunner.query(`
|
|
220
|
+
ALTER TABLE "vendor_users" DROP CONSTRAINT IF EXISTS "FK_vendor_users_vendorUserProfileId"
|
|
221
|
+
`);
|
|
222
|
+
await queryRunner.query(`
|
|
223
|
+
ALTER TABLE "vendor_users" DROP COLUMN IF EXISTS "vendorUserProfileId"
|
|
224
|
+
`);
|
|
225
|
+
await queryRunner.query(`DROP TABLE IF EXISTS "vendor_user_profiles"`);
|
|
226
|
+
|
|
227
|
+
await queryRunner.query(`
|
|
228
|
+
UPDATE "user_groups"
|
|
229
|
+
SET "name" = 'Vendor Owner'
|
|
230
|
+
WHERE "name" = 'Vendor' AND "deleted" = false
|
|
231
|
+
`);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { MigrationInterface, QueryRunner } from 'typeorm';
|
|
2
|
+
|
|
3
|
+
export class AddTypeToOrderNotificationBindings1782300000000
|
|
4
|
+
implements MigrationInterface
|
|
5
|
+
{
|
|
6
|
+
name = 'AddTypeToOrderNotificationBindings1782300000000';
|
|
7
|
+
|
|
8
|
+
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
9
|
+
// 1. Create the audience type enum.
|
|
10
|
+
await queryRunner.query(`
|
|
11
|
+
CREATE TYPE "order_notification_bindings_type_enum" AS ENUM ('customers', 'vendors', 'admin')
|
|
12
|
+
`);
|
|
13
|
+
|
|
14
|
+
// 2. Add the type column, defaulting existing rows to 'customers'.
|
|
15
|
+
await queryRunner.query(`
|
|
16
|
+
ALTER TABLE "order_notification_bindings"
|
|
17
|
+
ADD COLUMN "type" "order_notification_bindings_type_enum" NOT NULL DEFAULT 'customers'
|
|
18
|
+
`);
|
|
19
|
+
|
|
20
|
+
// 3. Drop old unique constraint on (triggerKey, channel).
|
|
21
|
+
await queryRunner.query(`
|
|
22
|
+
DO $$
|
|
23
|
+
DECLARE
|
|
24
|
+
old_constraint_name text;
|
|
25
|
+
BEGIN
|
|
26
|
+
SELECT con.conname INTO old_constraint_name
|
|
27
|
+
FROM pg_constraint con
|
|
28
|
+
JOIN pg_class rel ON rel.oid = con.conrelid
|
|
29
|
+
WHERE rel.relname = 'order_notification_bindings'
|
|
30
|
+
AND con.contype = 'u'
|
|
31
|
+
AND con.conname LIKE '%triggerKey_channel%'
|
|
32
|
+
LIMIT 1;
|
|
33
|
+
|
|
34
|
+
IF old_constraint_name IS NOT NULL THEN
|
|
35
|
+
EXECUTE format('ALTER TABLE "order_notification_bindings" DROP CONSTRAINT %I', old_constraint_name);
|
|
36
|
+
END IF;
|
|
37
|
+
END $$;
|
|
38
|
+
`);
|
|
39
|
+
|
|
40
|
+
// 4. Add new composite unique constraint on (triggerKey, channel, type).
|
|
41
|
+
await queryRunner.query(`
|
|
42
|
+
ALTER TABLE "order_notification_bindings"
|
|
43
|
+
ADD CONSTRAINT "UQ_order_notification_bindings_triggerKey_channel_type" UNIQUE ("triggerKey", "channel", "type")
|
|
44
|
+
`);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
48
|
+
// 1. Drop composite unique constraint.
|
|
49
|
+
await queryRunner.query(`
|
|
50
|
+
ALTER TABLE "order_notification_bindings"
|
|
51
|
+
DROP CONSTRAINT "UQ_order_notification_bindings_triggerKey_channel_type"
|
|
52
|
+
`);
|
|
53
|
+
|
|
54
|
+
// 2. Remove vendor/admin audience rows prior to rollback.
|
|
55
|
+
await queryRunner.query(`
|
|
56
|
+
DELETE FROM "order_notification_bindings" WHERE "type" != 'customers'
|
|
57
|
+
`);
|
|
58
|
+
|
|
59
|
+
// 3. Drop type column.
|
|
60
|
+
await queryRunner.query(`
|
|
61
|
+
ALTER TABLE "order_notification_bindings" DROP COLUMN "type"
|
|
62
|
+
`);
|
|
63
|
+
|
|
64
|
+
// 4. Restore original unique constraint on (triggerKey, channel).
|
|
65
|
+
await queryRunner.query(`
|
|
66
|
+
ALTER TABLE "order_notification_bindings"
|
|
67
|
+
ADD CONSTRAINT "UQ_order_notification_bindings_triggerKey_channel" UNIQUE ("triggerKey", "channel")
|
|
68
|
+
`);
|
|
69
|
+
|
|
70
|
+
// 5. Drop enum type.
|
|
71
|
+
await queryRunner.query(`
|
|
72
|
+
DROP TYPE "order_notification_bindings_type_enum"
|
|
73
|
+
`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkHY3AXLOI_cjs = require('./chunk-HY3AXLOI.cjs');
|
|
4
|
+
require('./chunk-USNT2KNT.cjs');
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
Object.defineProperty(exports, "deductInventoryForConfirmedOrder", {
|
|
9
|
+
enumerable: true,
|
|
10
|
+
get: function () { return chunkHY3AXLOI_cjs.deductInventoryForConfirmedOrder; }
|
|
11
|
+
});
|
|
12
|
+
Object.defineProperty(exports, "mergeInventoryLines", {
|
|
13
|
+
enumerable: true,
|
|
14
|
+
get: function () { return chunkHY3AXLOI_cjs.mergeInventoryLines; }
|
|
15
|
+
});
|
|
16
|
+
Object.defineProperty(exports, "orderInventorySnapshotFromRow", {
|
|
17
|
+
enumerable: true,
|
|
18
|
+
get: function () { return chunkHY3AXLOI_cjs.orderInventorySnapshotFromRow; }
|
|
19
|
+
});
|
|
20
|
+
Object.defineProperty(exports, "orderStatusHoldsStock", {
|
|
21
|
+
enumerable: true,
|
|
22
|
+
get: function () { return chunkHY3AXLOI_cjs.orderStatusHoldsStock; }
|
|
23
|
+
});
|
|
24
|
+
Object.defineProperty(exports, "reconcileOrderInventoryBetweenSnapshots", {
|
|
25
|
+
enumerable: true,
|
|
26
|
+
get: function () { return chunkHY3AXLOI_cjs.reconcileOrderInventoryBetweenSnapshots; }
|
|
27
|
+
});
|
|
28
|
+
Object.defineProperty(exports, "restoreInventoryForCancelledOrder", {
|
|
29
|
+
enumerable: true,
|
|
30
|
+
get: function () { return chunkHY3AXLOI_cjs.restoreInventoryForCancelledOrder; }
|
|
31
|
+
});
|
|
32
|
+
Object.defineProperty(exports, "validateInventoryForConfirmedOrderLines", {
|
|
33
|
+
enumerable: true,
|
|
34
|
+
get: function () { return chunkHY3AXLOI_cjs.validateInventoryForConfirmedOrderLines; }
|
|
35
|
+
});
|
|
36
|
+
Object.defineProperty(exports, "validateInventoryForOrderBecomingConfirmed", {
|
|
37
|
+
enumerable: true,
|
|
38
|
+
get: function () { return chunkHY3AXLOI_cjs.validateInventoryForOrderBecomingConfirmed; }
|
|
39
|
+
});
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { deductInventoryForConfirmedOrder, mergeInventoryLines, orderInventorySnapshotFromRow, orderStatusHoldsStock, reconcileOrderInventoryBetweenSnapshots, restoreInventoryForCancelledOrder, validateInventoryForConfirmedOrderLines, validateInventoryForOrderBecomingConfirmed } from './chunk-3K5AIEIZ.js';
|
|
2
|
+
import './chunk-SHUYVCID.js';
|
package/dist/{order-notification-dispatcher-XWIJYDGA.js → order-notification-dispatcher-6WNG24NY.js}
RENAMED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
export { initWhatsappTriggerDispatcher, resendOrderNotification } from './chunk-
|
|
1
|
+
export { initWhatsappTriggerDispatcher, resendOrderNotification } from './chunk-YXH2UUEZ.js';
|
|
2
2
|
import './chunk-HCIRL37O.js';
|
|
3
|
-
import './chunk-
|
|
3
|
+
import './chunk-L3525VXI.js';
|
|
4
|
+
import './chunk-2KUCQVAQ.js';
|
|
4
5
|
import './chunk-CRFV5WJK.js';
|
|
6
|
+
import './chunk-JC6DLWTE.js';
|
|
5
7
|
import './chunk-SHUYVCID.js';
|
|
@@ -1,18 +1,20 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkLMJ7RKPF_cjs = require('./chunk-LMJ7RKPF.cjs');
|
|
4
4
|
require('./chunk-UCKN4BBY.cjs');
|
|
5
|
-
require('./chunk-
|
|
5
|
+
require('./chunk-V25RDUOU.cjs');
|
|
6
|
+
require('./chunk-BXYZDMTZ.cjs');
|
|
6
7
|
require('./chunk-OOTLNH63.cjs');
|
|
8
|
+
require('./chunk-UPLVMVRX.cjs');
|
|
7
9
|
require('./chunk-USNT2KNT.cjs');
|
|
8
10
|
|
|
9
11
|
|
|
10
12
|
|
|
11
13
|
Object.defineProperty(exports, "initWhatsappTriggerDispatcher", {
|
|
12
14
|
enumerable: true,
|
|
13
|
-
get: function () { return
|
|
15
|
+
get: function () { return chunkLMJ7RKPF_cjs.initWhatsappTriggerDispatcher; }
|
|
14
16
|
});
|
|
15
17
|
Object.defineProperty(exports, "resendOrderNotification", {
|
|
16
18
|
enumerable: true,
|
|
17
|
-
get: function () { return
|
|
19
|
+
get: function () { return chunkLMJ7RKPF_cjs.resendOrderNotification; }
|
|
18
20
|
});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunk77NUXO6A_cjs = require('./chunk-77NUXO6A.cjs');
|
|
4
4
|
var chunkUSNT2KNT_cjs = require('./chunk-USNT2KNT.cjs');
|
|
5
5
|
|
|
6
6
|
// src/auth/rbac-debug-db.ts
|
|
@@ -27,7 +27,7 @@ async function loadDbPermissionsForUser(dataSource, userId) {
|
|
|
27
27
|
return {
|
|
28
28
|
groupId,
|
|
29
29
|
groupName,
|
|
30
|
-
dbEntityPerms:
|
|
30
|
+
dbEntityPerms: chunk77NUXO6A_cjs.summarizeEntityPerms(chunk77NUXO6A_cjs.permissionRowsToRecord(permRows))
|
|
31
31
|
};
|
|
32
32
|
}
|
|
33
33
|
chunkUSNT2KNT_cjs.__name(loadDbPermissionsForUser, "loadDbPermissionsForUser");
|