f920ca8920
- Added models for support messages, SLA policies, tickets, ticket events, and ticket links. - Created routes for help, help admin, newsletter, recommendations, and support for both customer and admin. - Developed services for help, marketing (newsletter), and recommendations. - Introduced support service for ticket management, including creation, replies, transitions, and attachments. - Added validation schemas for support recommendations and ticket management. - Implemented a cron job for support reconciliation and recommendation cleanup. - Created migration for new support and recommendation database tables. - Added unit tests for validation and policy checks related to Phase 10 features.
346 lines
11 KiB
JavaScript
346 lines
11 KiB
JavaScript
/**
|
|
* Copyright (c) 2026 Niolla
|
|
* All rights reserved.
|
|
*
|
|
* This source code is proprietary and confidential.
|
|
* Unauthorized copying, modification, distribution, or use
|
|
* of this file, via any medium, is strictly prohibited.
|
|
*/
|
|
|
|
// app/models/index.js
|
|
|
|
const { Sequelize, DataTypes } = require("sequelize");
|
|
const dbConfig = require("../config/db.config");
|
|
|
|
const loggingOption =
|
|
process.env.NODE_ENV === "development" ? console.log : false;
|
|
|
|
const sequelize = new Sequelize(dbConfig.DB, dbConfig.USER, dbConfig.PASSWORD, {
|
|
host: dbConfig.HOST,
|
|
port: dbConfig.PORT,
|
|
dialect: dbConfig.DIALECT,
|
|
pool: dbConfig.pool,
|
|
logging: loggingOption,
|
|
});
|
|
|
|
const db = {};
|
|
|
|
db.Sequelize = Sequelize;
|
|
db.sequelize = sequelize;
|
|
|
|
/* Register db models */
|
|
|
|
// User and Authentication
|
|
db.User = require("./user/user.model")(sequelize, DataTypes);
|
|
db.Customer = require("./user/customer.model")(sequelize, DataTypes);
|
|
db.BusinessCustomer = require("./user/businessCustomer.model")(
|
|
sequelize,
|
|
DataTypes,
|
|
);
|
|
db.AuthSession = require("./user/authSession.model")(sequelize, DataTypes);
|
|
db.UserIdentity = require("./user/userIdentity.model")(sequelize, DataTypes);
|
|
db.UserActivity = require("./activities/userActivities.model")(
|
|
sequelize,
|
|
DataTypes,
|
|
);
|
|
db.Profile = require("./user/profile.model")(sequelize, DataTypes);
|
|
db.Address = require("./user/address.model")(sequelize, DataTypes);
|
|
db.BusinessApplication = require("./user/businessApplication.model")(
|
|
sequelize,
|
|
DataTypes,
|
|
);
|
|
db.BusinessContact = require("./user/businessContact.model")(
|
|
sequelize,
|
|
DataTypes,
|
|
);
|
|
db.BusinessCreditAccount = require("./user/businessCreditAccount.model")(
|
|
sequelize,
|
|
DataTypes,
|
|
);
|
|
db.SettlementTerm = require("./user/settlementTerm.model")(
|
|
sequelize,
|
|
DataTypes,
|
|
);
|
|
|
|
// Uploads
|
|
db.Upload = require("./upload/upload.model")(sequelize, DataTypes);
|
|
|
|
// Roles and Permissions
|
|
db.roles = require("./permission/role.model")(sequelize, DataTypes);
|
|
db.permission = require("./permission/permission.model")(sequelize, DataTypes);
|
|
db.rolePermission = require("./permission/rolePermission.model")(
|
|
sequelize,
|
|
DataTypes,
|
|
);
|
|
db.userPermission = require("./permission/userPermission.model")(
|
|
sequelize,
|
|
DataTypes,
|
|
);
|
|
db.UserRole = require("./permission/userRole.model")(sequelize, DataTypes);
|
|
|
|
// Document Management
|
|
db.Document = require("./document/document.model")(sequelize, DataTypes);
|
|
db.DocumentType = require("./document/documentType.model")(
|
|
sequelize,
|
|
DataTypes,
|
|
);
|
|
|
|
// Reference Numbers
|
|
db.referenceNumber = require("./referenceNumbers/referenceNumber.model")(
|
|
sequelize,
|
|
DataTypes,
|
|
);
|
|
|
|
// Notifications
|
|
db.notification = require("./notification/notification.model")(
|
|
sequelize,
|
|
DataTypes,
|
|
);
|
|
db.userNotification = require("./notification/userNotification.model")(
|
|
sequelize,
|
|
DataTypes,
|
|
);
|
|
db.NotificationDelivery = require("./notification/notificationDelivery.model")(
|
|
sequelize,
|
|
DataTypes,
|
|
);
|
|
|
|
// Catalogue and localized content
|
|
db.Brand = require("./catalogue/brand.model")(sequelize, DataTypes);
|
|
db.Category = require("./catalogue/category.model")(sequelize, DataTypes);
|
|
db.CategoryTranslation = require("./catalogue/categoryTranslation.model")(
|
|
sequelize,
|
|
DataTypes,
|
|
);
|
|
db.Product = require("./catalogue/product.model")(sequelize, DataTypes);
|
|
db.ProductTranslation = require("./catalogue/productTranslation.model")(
|
|
sequelize,
|
|
DataTypes,
|
|
);
|
|
db.ProductCategory = require("./catalogue/productCategory.model")(
|
|
sequelize,
|
|
DataTypes,
|
|
);
|
|
db.ProductVariant = require("./catalogue/productVariant.model")(
|
|
sequelize,
|
|
DataTypes,
|
|
);
|
|
db.ProductOption = require("./catalogue/productOption.model")(
|
|
sequelize,
|
|
DataTypes,
|
|
);
|
|
db.ProductOptionValue = require("./catalogue/productOptionValue.model")(
|
|
sequelize,
|
|
DataTypes,
|
|
);
|
|
db.VariantOptionValue = require("./catalogue/variantOptionValue.model")(
|
|
sequelize,
|
|
DataTypes,
|
|
);
|
|
db.ProductAttribute = require("./catalogue/productAttribute.model")(
|
|
sequelize,
|
|
DataTypes,
|
|
);
|
|
db.ProductMedia = require("./catalogue/productMedia.model")(
|
|
sequelize,
|
|
DataTypes,
|
|
);
|
|
db.Collection = require("./catalogue/collection.model")(sequelize, DataTypes);
|
|
db.CollectionTranslation = require("./catalogue/collectionTranslation.model")(
|
|
sequelize,
|
|
DataTypes,
|
|
);
|
|
db.CollectionProduct = require("./catalogue/collectionProduct.model")(
|
|
sequelize,
|
|
DataTypes,
|
|
);
|
|
db.SizeGuide = require("./catalogue/sizeGuide.model")(sequelize, DataTypes);
|
|
db.ProductRelation = require("./catalogue/productRelation.model")(
|
|
sequelize,
|
|
DataTypes,
|
|
);
|
|
db.ProductReview = require("./catalogue/productReview.model")(
|
|
sequelize,
|
|
DataTypes,
|
|
);
|
|
db.Warehouse = require("./inventory/warehouse.model")(sequelize, DataTypes);
|
|
db.InventoryBalance = require("./inventory/inventoryBalance.model")(
|
|
sequelize,
|
|
DataTypes,
|
|
);
|
|
db.InventoryTransaction = require("./inventory/inventoryTransaction.model")(
|
|
sequelize,
|
|
DataTypes,
|
|
);
|
|
db.InventoryReservation = require("./inventory/inventoryReservation.model")(
|
|
sequelize,
|
|
DataTypes,
|
|
);
|
|
db.InventoryTransfer = require("./inventory/inventoryTransfer.model")(
|
|
sequelize,
|
|
DataTypes,
|
|
);
|
|
db.BusinessTier = require("./pricing/businessTier.model")(sequelize, DataTypes);
|
|
db.VariantBusinessPrice = require("./pricing/variantBusinessPrice.model")(
|
|
sequelize,
|
|
DataTypes,
|
|
);
|
|
db.BusinessPriceTier = require("./pricing/businessPriceTier.model")(
|
|
sequelize,
|
|
DataTypes,
|
|
);
|
|
db.Promotion = require("./merchandising/promotion.model")(sequelize, DataTypes);
|
|
db.PromotionTarget = require("./merchandising/promotionTarget.model")(
|
|
sequelize,
|
|
DataTypes,
|
|
);
|
|
db.Coupon = require("./merchandising/coupon.model")(sequelize, DataTypes);
|
|
db.Banner = require("./merchandising/banner.model")(sequelize, DataTypes);
|
|
db.BannerTranslation = require("./merchandising/bannerTranslation.model")(
|
|
sequelize,
|
|
DataTypes,
|
|
);
|
|
db.Cart = require("./shopping/cart.model")(sequelize, DataTypes);
|
|
db.CartItem = require("./shopping/cartItem.model")(sequelize, DataTypes);
|
|
db.WishlistItem = require("./shopping/wishlistItem.model")(
|
|
sequelize,
|
|
DataTypes,
|
|
);
|
|
db.CheckoutSession = require("./shopping/checkoutSession.model")(
|
|
sequelize,
|
|
DataTypes,
|
|
);
|
|
db.CheckoutItem = require("./shopping/checkoutItem.model")(
|
|
sequelize,
|
|
DataTypes,
|
|
);
|
|
db.ShippingZone = require("./shipping/shippingZone.model")(
|
|
sequelize,
|
|
DataTypes,
|
|
);
|
|
db.ShippingZoneRegion = require("./shipping/shippingZoneRegion.model")(
|
|
sequelize,
|
|
DataTypes,
|
|
);
|
|
db.ShippingMethod = require("./shipping/shippingMethod.model")(
|
|
sequelize,
|
|
DataTypes,
|
|
);
|
|
db.ShippingRate = require("./shipping/shippingRate.model")(
|
|
sequelize,
|
|
DataTypes,
|
|
);
|
|
db.Order = require("./commerce/order.model")(sequelize, DataTypes);
|
|
db.OrderItem = require("./commerce/orderItem.model")(sequelize, DataTypes);
|
|
db.Payment = require("./commerce/payment.model")(sequelize, DataTypes);
|
|
db.PaymentAttempt = require("./commerce/paymentAttempt.model")(
|
|
sequelize,
|
|
DataTypes,
|
|
);
|
|
db.PaymentWebhookEvent = require("./commerce/paymentWebhookEvent.model")(
|
|
sequelize,
|
|
DataTypes,
|
|
);
|
|
db.Invoice = require("./commerce/invoice.model")(sequelize, DataTypes);
|
|
db.Refund = require("./commerce/refund.model")(sequelize, DataTypes);
|
|
db.RefundItem = require("./commerce/refundItem.model")(sequelize, DataTypes);
|
|
db.ReturnRequest = require("./commerce/returnRequest.model")(
|
|
sequelize,
|
|
DataTypes,
|
|
);
|
|
db.ReturnItem = require("./commerce/returnItem.model")(sequelize, DataTypes);
|
|
db.CouponRedemption = require("./commerce/couponRedemption.model")(
|
|
sequelize,
|
|
DataTypes,
|
|
);
|
|
db.RiderProfile = require("./logistics/riderProfile.model")(
|
|
sequelize,
|
|
DataTypes,
|
|
);
|
|
db.Shipment = require("./logistics/shipment.model")(sequelize, DataTypes);
|
|
db.ShipmentItem = require("./logistics/shipmentItem.model")(
|
|
sequelize,
|
|
DataTypes,
|
|
);
|
|
db.ShipmentAssignment = require("./logistics/shipmentAssignment.model")(
|
|
sequelize,
|
|
DataTypes,
|
|
);
|
|
db.ShipmentEvent = require("./logistics/shipmentEvent.model")(
|
|
sequelize,
|
|
DataTypes,
|
|
);
|
|
db.ShipmentProof = require("./logistics/shipmentProof.model")(
|
|
sequelize,
|
|
DataTypes,
|
|
);
|
|
db.LoyaltyAccount = require("./loyalty/loyaltyAccount.model")(
|
|
sequelize,
|
|
DataTypes,
|
|
);
|
|
db.LoyaltyTier = require("./loyalty/loyaltyTier.model")(sequelize, DataTypes);
|
|
db.LoyaltyTierHistory = require("./loyalty/loyaltyTierHistory.model")(
|
|
sequelize,
|
|
DataTypes,
|
|
);
|
|
db.LoyaltyEarnRule = require("./loyalty/loyaltyEarnRule.model")(
|
|
sequelize,
|
|
DataTypes,
|
|
);
|
|
db.LoyaltyLedgerEntry = require("./loyalty/loyaltyLedgerEntry.model")(
|
|
sequelize,
|
|
DataTypes,
|
|
);
|
|
db.LoyaltyPointAllocation = require("./loyalty/loyaltyPointAllocation.model")(
|
|
sequelize,
|
|
DataTypes,
|
|
);
|
|
db.LoyaltyReward = require("./loyalty/loyaltyReward.model")(
|
|
sequelize,
|
|
DataTypes,
|
|
);
|
|
db.LoyaltyRedemption = require("./loyalty/loyaltyRedemption.model")(
|
|
sequelize,
|
|
DataTypes,
|
|
);
|
|
db.Referral = require("./loyalty/referral.model")(sequelize, DataTypes);
|
|
db.CustomerCouponEntitlement =
|
|
require("./loyalty/customerCouponEntitlement.model")(sequelize, DataTypes);
|
|
db.BusinessCreditLedgerEntry =
|
|
require("./wholesale/businessCreditLedgerEntry.model")(sequelize, DataTypes);
|
|
db.BusinessSettlement = require("./wholesale/businessSettlement.model")(
|
|
sequelize,
|
|
DataTypes,
|
|
);
|
|
db.BusinessSettlementItem = require("./wholesale/businessSettlementItem.model")(
|
|
sequelize,
|
|
DataTypes,
|
|
);
|
|
db.PaymentAllocation = require("./wholesale/paymentAllocation.model")(
|
|
sequelize,
|
|
DataTypes,
|
|
);
|
|
db.SupportCategory = require("./support/supportCategory.model")(sequelize, DataTypes);
|
|
db.SupportTicket = require("./support/supportTicket.model")(sequelize, DataTypes);
|
|
db.SupportMessage = require("./support/supportMessage.model")(sequelize, DataTypes);
|
|
db.SupportTicketEvent = require("./support/supportTicketEvent.model")(sequelize, DataTypes);
|
|
db.SupportTicketLink = require("./support/supportTicketLink.model")(sequelize, DataTypes);
|
|
db.SupportAttachment = require("./support/supportAttachment.model")(sequelize, DataTypes);
|
|
db.SupportSlaPolicy = require("./support/supportSlaPolicy.model")(sequelize, DataTypes);
|
|
db.SupportEscalation = require("./support/supportEscalation.model")(sequelize, DataTypes);
|
|
db.HelpCategory = require("./help/helpCategory.model")(sequelize, DataTypes);
|
|
db.HelpCategoryTranslation = require("./help/helpCategoryTranslation.model")(sequelize, DataTypes);
|
|
db.HelpArticle = require("./help/helpArticle.model")(sequelize, DataTypes);
|
|
db.HelpArticleTranslation = require("./help/helpArticleTranslation.model")(sequelize, DataTypes);
|
|
db.NewsletterSubscription = require("./marketing/newsletterSubscription.model")(sequelize, DataTypes);
|
|
db.ProductInteractionEvent = require("./recommendation/productInteractionEvent.model")(sequelize, DataTypes);
|
|
|
|
/* Associations */
|
|
Object.keys(db).forEach((model) => {
|
|
if (db[model].associate) {
|
|
db[model].associate(db);
|
|
}
|
|
});
|
|
|
|
module.exports = db;
|