ad9287b804
- Introduced authenticated shopping state and atomic checkout process without creating orders or payments. - Reused existing components from previous phases including identities, addresses, catalogues, pricing, and inventory. - Developed cart architecture to support one active cart per user with unique items per variant. - Implemented dynamic cart pricing with various precedence rules for promotions and coupons. - Created a wishlist feature that exposes only visible active products without reserving inventory. - Integrated inventory validation to ensure availability of items before adding to cart. - Developed a checkout architecture that locks the cart, revalidates pricing and shipping, and reserves inventory. - Added shipping zones, methods, and rates with configurable options for international shipping and duty/tax boundaries. - Implemented checkout snapshots to capture immutable checkout details. - Introduced idempotency for checkout requests to prevent duplicate processing. - Added functionality for coupon integration and business checkout validation. - Established permissions for managing shipping zones, methods, and rates. - Created comprehensive unit tests covering various aspects of the shopping and checkout processes. - Added cron job for handling checkout expiry reconciliation. - Created migration script to set up new database tables and constraints for carts, checkout sessions, and shipping.
110 lines
6.3 KiB
JavaScript
110 lines
6.3 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);
|
|
|
|
/* Associations */
|
|
Object.keys(db).forEach(model => {
|
|
if (db[model].associate) {
|
|
db[model].associate(db);
|
|
}
|
|
});
|
|
|
|
|
|
|
|
|
|
module.exports = db;
|