Initial content

This commit is contained in:
Adam Freeman
2024-05-29 18:54:49 +01:00
parent 2dbc1a8088
commit 5215a1d919
1944 changed files with 203378 additions and 0 deletions
@@ -0,0 +1,38 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.BaseRepo = void 0;
const sequelize_1 = require("sequelize");
const config_1 = require("../../config");
const models_1 = require("./models");
const fs_1 = require("fs");
const config = (0, config_1.getConfig)("catalog:orm_repo");
const logging = config.logging
? { logging: console.log, logQueryParameters: true }
: { logging: false };
class BaseRepo {
sequelize;
constructor() {
this.sequelize = new sequelize_1.Sequelize({ ...config.settings, ...logging });
this.initModelsAndDatabase();
}
async initModelsAndDatabase() {
(0, models_1.initializeModels)(this.sequelize);
if (config.reset_db) {
await this.sequelize.drop();
await this.sequelize.sync();
await this.addSeedData();
}
else {
await this.sequelize.sync();
}
}
async addSeedData() {
const data = JSON.parse((0, fs_1.readFileSync)(config.seed_file).toString());
await this.sequelize.transaction(async (transaction) => {
await models_1.SupplierModel.bulkCreate(data.suppliers, { transaction });
await models_1.CategoryModel.bulkCreate(data.categories, { transaction });
await models_1.ProductModel.bulkCreate(data.products, { transaction });
});
}
}
exports.BaseRepo = BaseRepo;
@@ -0,0 +1,11 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.CatalogRepoImpl = void 0;
const core_1 = require("./core");
const queries_1 = require("./queries");
const storage_1 = require("./storage");
const order_queries_1 = require("./order_queries");
const order_storage_1 = require("./order_storage");
const CatalogRepo = (0, storage_1.AddStorage)((0, queries_1.AddQueries)(core_1.BaseRepo));
const RepoWithOrders = (0, order_storage_1.AddOrderStorage)((0, order_queries_1.AddOrderQueries)(CatalogRepo));
exports.CatalogRepoImpl = RepoWithOrders;
@@ -0,0 +1,29 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.initializeCatalogModels = void 0;
const sequelize_1 = require("sequelize");
const catalog_models_1 = require("./catalog_models");
const primaryKey = {
id: { type: sequelize_1.DataTypes.INTEGER, autoIncrement: true, primaryKey: true }
};
const initializeCatalogModels = (sequelize) => {
catalog_models_1.ProductModel.init({
...primaryKey,
name: { type: sequelize_1.DataTypes.STRING },
description: { type: sequelize_1.DataTypes.STRING },
price: { type: sequelize_1.DataTypes.DECIMAL(10, 2) }
}, { sequelize });
catalog_models_1.CategoryModel.init({
...primaryKey,
name: { type: sequelize_1.DataTypes.STRING }
}, { sequelize });
catalog_models_1.SupplierModel.init({
...primaryKey,
name: { type: sequelize_1.DataTypes.STRING }
}, { sequelize });
catalog_models_1.ProductModel.belongsTo(catalog_models_1.CategoryModel, { foreignKey: "categoryId", as: "category" });
catalog_models_1.ProductModel.belongsTo(catalog_models_1.SupplierModel, { foreignKey: "supplierId", as: "supplier" });
catalog_models_1.CategoryModel.hasMany(catalog_models_1.ProductModel, { foreignKey: "categoryId", as: "products" });
catalog_models_1.SupplierModel.hasMany(catalog_models_1.ProductModel, { foreignKey: "supplierId", as: "products" });
};
exports.initializeCatalogModels = initializeCatalogModels;
@@ -0,0 +1,13 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.SupplierModel = exports.CategoryModel = exports.ProductModel = void 0;
const sequelize_1 = require("sequelize");
class ProductModel extends sequelize_1.Model {
}
exports.ProductModel = ProductModel;
class CategoryModel extends sequelize_1.Model {
}
exports.CategoryModel = CategoryModel;
class SupplierModel extends sequelize_1.Model {
}
exports.SupplierModel = SupplierModel;
@@ -0,0 +1,13 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.initializeCustomerModels = void 0;
const sequelize_1 = require("sequelize");
const customer_models_1 = require("./customer_models");
const initializeCustomerModels = (sequelize) => {
customer_models_1.CustomerModel.init({
id: { type: sequelize_1.DataTypes.INTEGER, autoIncrement: true, primaryKey: true },
name: { type: sequelize_1.DataTypes.STRING },
email: { type: sequelize_1.DataTypes.STRING }
}, { sequelize });
};
exports.initializeCustomerModels = initializeCustomerModels;
@@ -0,0 +1,7 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.CustomerModel = void 0;
const sequelize_1 = require("sequelize");
class CustomerModel extends sequelize_1.Model {
}
exports.CustomerModel = CustomerModel;
@@ -0,0 +1,16 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.initializeModels = exports.SupplierModel = exports.CategoryModel = exports.ProductModel = void 0;
const catalog_helpers_1 = require("./catalog_helpers");
const customer_helpers_1 = require("./customer_helpers");
const order_helpers_1 = require("./order_helpers");
var catalog_models_1 = require("./catalog_models");
Object.defineProperty(exports, "ProductModel", { enumerable: true, get: function () { return catalog_models_1.ProductModel; } });
Object.defineProperty(exports, "CategoryModel", { enumerable: true, get: function () { return catalog_models_1.CategoryModel; } });
Object.defineProperty(exports, "SupplierModel", { enumerable: true, get: function () { return catalog_models_1.SupplierModel; } });
const initializeModels = (sequelize) => {
(0, catalog_helpers_1.initializeCatalogModels)(sequelize);
(0, customer_helpers_1.initializeCustomerModels)(sequelize);
(0, order_helpers_1.initializeOrderModels)(sequelize);
};
exports.initializeModels = initializeModels;
@@ -0,0 +1,30 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.initializeOrderModels = void 0;
const sequelize_1 = require("sequelize");
const order_models_1 = require("./order_models");
const customer_models_1 = require("./customer_models");
const _1 = require(".");
const primaryKey = {
id: { type: sequelize_1.DataTypes.INTEGER, autoIncrement: true, primaryKey: true }
};
const initializeOrderModels = (sequelize) => {
order_models_1.OrderModel.init({
...primaryKey, shipped: sequelize_1.DataTypes.BOOLEAN
}, { sequelize });
order_models_1.ProductSelectionModel.init({
...primaryKey,
quantity: sequelize_1.DataTypes.INTEGER, price: sequelize_1.DataTypes.DECIMAL(10, 2)
}, { sequelize });
order_models_1.AddressModel.init({
...primaryKey,
street: sequelize_1.DataTypes.STRING, city: sequelize_1.DataTypes.STRING,
state: sequelize_1.DataTypes.STRING, zip: sequelize_1.DataTypes.STRING,
}, { sequelize });
order_models_1.OrderModel.belongsTo(customer_models_1.CustomerModel, { as: "customer" });
order_models_1.OrderModel.belongsTo(order_models_1.AddressModel, { foreignKey: "addressId", as: "address" });
order_models_1.OrderModel.belongsToMany(order_models_1.ProductSelectionModel, { through: "OrderProductJunction",
foreignKey: "orderId", as: "selections" });
order_models_1.ProductSelectionModel.belongsTo(_1.ProductModel, { as: "product" });
};
exports.initializeOrderModels = initializeOrderModels;
@@ -0,0 +1,13 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.AddressModel = exports.ProductSelectionModel = exports.OrderModel = void 0;
const sequelize_1 = require("sequelize");
class OrderModel extends sequelize_1.Model {
}
exports.OrderModel = OrderModel;
class ProductSelectionModel extends sequelize_1.Model {
}
exports.ProductSelectionModel = ProductSelectionModel;
class AddressModel extends sequelize_1.Model {
}
exports.AddressModel = AddressModel;
@@ -0,0 +1,24 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.AddOrderQueries = void 0;
const order_models_1 = require("./models/order_models");
const customer_models_1 = require("./models/customer_models");
const queryConfig = {
include: [
{ model: order_models_1.AddressModel, as: "address" },
{ model: customer_models_1.CustomerModel, as: "customer" }
],
raw: true, nest: true
};
function AddOrderQueries(Base) {
return class extends Base {
getOrder(id) {
return order_models_1.OrderModel.findByPk(id, queryConfig);
}
getOrders(excludeShipped) {
return order_models_1.OrderModel.findAll(excludeShipped ?
{ ...queryConfig, where: { shipped: false } } : queryConfig);
}
};
}
exports.AddOrderQueries = AddOrderQueries;
@@ -0,0 +1,38 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.AddOrderStorage = void 0;
const order_models_1 = require("./models/order_models");
const customer_models_1 = require("./models/customer_models");
function AddOrderStorage(Base) {
return class extends Base {
storeOrder(order) {
return this.sequelize.transaction(async (transaction) => {
const { id, shipped } = order;
const [stored] = await order_models_1.OrderModel.upsert({ id, shipped }, { transaction });
if (order.customer) {
const [{ id }] = await customer_models_1.CustomerModel.findOrCreate({
where: { email: order.customer.email },
defaults: order.customer,
transaction
});
stored.customerId = id;
}
if (order.address) {
const [{ id }] = await order_models_1.AddressModel.findOrCreate({
where: { ...order.address },
defaults: order.address,
transaction
});
stored.addressId = id;
}
await stored.save({ transaction });
if (order.selections) {
const sels = await order_models_1.ProductSelectionModel.bulkCreate(order.selections, { transaction });
await stored.setSelections(sels, { transaction });
}
return stored;
});
}
};
}
exports.AddOrderStorage = AddOrderStorage;
@@ -0,0 +1,49 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.AddQueries = void 0;
const models_1 = require("./models");
const sequelize_1 = require("sequelize");
function AddQueries(Base) {
return class extends Base {
async getProducts(params) {
const opts = {};
if (params?.page && params.pageSize) {
opts.limit = params?.pageSize,
opts.offset = (params.page - 1) * params.pageSize;
}
if (params?.searchTerm) {
const searchOp = { [sequelize_1.Op.like]: "%" + params.searchTerm + "%" };
opts.where = {
[sequelize_1.Op.or]: { name: searchOp, description: searchOp }
};
}
if (params?.category) {
opts.where = {
...opts.where, categoryId: params.category
};
}
const result = await models_1.ProductModel.findAndCountAll({
include: [
{ model: models_1.SupplierModel, as: "supplier" },
{ model: models_1.CategoryModel, as: "category" }
],
raw: true, nest: true,
...opts
});
const categories = await this.getCategories();
return { products: result.rows, totalCount: result.count, categories };
}
getCategories() {
return models_1.CategoryModel.findAll({ raw: true, nest: true });
}
getSuppliers() {
return models_1.SupplierModel.findAll({ raw: true, nest: true });
}
getProductDetails(ids) {
return models_1.ProductModel.findAll({
where: { id: { [sequelize_1.Op.in]: ids } }, raw: true, nest: true,
});
}
};
}
exports.AddQueries = AddQueries;
@@ -0,0 +1,37 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.AddStorage = void 0;
const models_1 = require("./models");
function AddStorage(Base) {
return class extends Base {
storeProduct(p) {
return this.sequelize.transaction(async (transaction) => {
if (p.category) {
p.category = await this.storeCategory(p.category);
}
if (p.supplier) {
p.supplier = await this.storeSupplier(p.supplier);
}
const [stored] = await models_1.ProductModel.upsert({
id: p.id, name: p.name, description: p.description,
price: p.price, categoryId: p.category?.id,
supplierId: p.supplier?.id
}, { transaction });
return stored;
});
}
async storeCategory(c, transaction) {
const [stored] = await models_1.CategoryModel.upsert({
id: c.id, name: c.name
}, { transaction });
return stored;
}
async storeSupplier(s, transaction) {
const [stored] = await models_1.SupplierModel.upsert({
id: s.id, name: s.name
}, { transaction });
return stored;
}
};
}
exports.AddStorage = AddStorage;