@tomei/product
Version:
NestJS package for product module
217 lines (196 loc) • 6.35 kB
text/typescript
import { LoginUser } from '@tomei/sso';
import { ProductProductCategoryRepository } from './product-product-category.repository';
import { ApplicationConfig } from '@tomei/config';
import { SettingsCategoryModel } from '../../entities/settings-category.entity';
import { ProductBase } from '../../base';
import { ProductCategory } from '../category-product/category-product';
import cuid from '../../helpers/cuid';
import { ActionEnum, Activity } from '@tomei/activity-history';
import { ObjectBase } from '@tomei/general';
export class ProductProductCategory extends ObjectBase {
ObjectId: string;
ObjectName: string;
TableName: string;
ObjectType = 'ProductProductCategory';
private static _Repository = new ProductProductCategoryRepository();
static async CheckProductAssignToCategory(
Code: string,
dbTransaction: any,
): Promise<boolean> {
try {
const options = {
where: {
Code: Code,
},
transaction: dbTransaction,
};
const result = await ProductProductCategory._Repository.findOne(options);
if (result) {
return true;
} else {
return false;
}
} catch (error) {
throw error;
}
}
static async listCategoryAssignedToProduct(
ProductId: string,
loginUser: LoginUser,
page: number = 1,
rows: number = 10,
dbTransaction?: any,
): Promise<any> {
const limit = rows;
const offset = (page - 1) * rows;
try {
const systemCode =
ApplicationConfig.getComponentConfigValue('system-code');
const isPrivileged = await loginUser.checkPrivileges(
systemCode,
'Product - List Category',
);
if (!isPrivileged) {
throw new Error('You do not have permission to list product category.');
}
const options = {
where: {
ProductId: ProductId,
},
include: [
{
model: SettingsCategoryModel,
},
],
distinct: true,
limit,
offset,
transaction: dbTransaction,
};
const data =
await ProductProductCategory._Repository.findAndCountAll(options);
const result = {
count: data.count,
rows: data.rows.map((item: any) => {
return {
Code: item.Code,
Name: item.Category.Name,
Description: item.Category.Description,
Status: item.Category.Status,
ParentCode: item.Category.ParentCode,
CodePath: item.Category.CodePath,
CreatedAt: item.Category.CreatedAt,
UpdatedAt: item.Category.UpdatedAt,
CreatedById: item.Category.CreatedById,
UpdatedById: item.Category.UpdatedById,
};
}),
};
return result;
} catch (error) {
throw error;
}
}
static async assignProductToCategoryProduct(
product: ProductBase,
ProductCategory: ProductCategory,
loginUser: LoginUser,
dbTransaction?: any,
): Promise<any> {
try {
const systemCode =
ApplicationConfig.getComponentConfigValue('system-code');
const isPrivileged = await loginUser.checkPrivileges(
systemCode,
'Product - Assign Category',
);
if (!isPrivileged) {
throw new Error(
'You do not have permission to assign product category.',
);
}
const ProductCategoryId = cuid();
const options = {
ProductCategoryId: ProductCategoryId,
ProductId: product.ProductId,
Code: ProductCategory.Code,
};
await ProductProductCategory._Repository.create(options, dbTransaction);
const entityValueAfter = {
ProductCategoryId: ProductCategoryId,
ProductId: product.ProductId,
Code: ProductCategory.Code,
};
const activity = new Activity();
activity.ActivityId = cuid();
activity.Action = ActionEnum.CREATE;
activity.Description = 'Asssign Product to Category Product';
activity.EntityType = 'ProductProductCategory';
activity.EntityId = ProductCategoryId;
activity.EntityValueBefore = JSON.stringify({});
activity.EntityValueAfter = JSON.stringify(entityValueAfter);
await activity.create(loginUser.ObjectId, dbTransaction);
return {
MessageCode: 'ProductCategoryAssigned',
Message: 'Product added to Product Category.',
};
} catch (error) {
throw error;
}
}
static async unassignedProductFromCategory(
product: ProductBase,
ProductCategory: ProductCategory,
loginUser: LoginUser,
dbTransaction?: any,
): Promise<any> {
try {
const systemCode =
ApplicationConfig.getComponentConfigValue('system-code');
const isPrivileged = await loginUser.checkPrivileges(
systemCode,
'Product - Unassigned Category',
);
if (!isPrivileged) {
throw new Error(
'You do not have permission to unassign product category.',
);
}
const options = {
where: {
ProductId: product.ProductId,
Code: ProductCategory.Code,
},
transaction: dbTransaction,
};
const result = await ProductProductCategory._Repository.findOne(options);
if (!result) {
throw new Error('Product Category not found.');
}
await ProductProductCategory._Repository.delete(
result.ProductCategoryId,
dbTransaction,
);
const entityValueBefore = {
ProductCategoryId: result.ProductCategoryId,
ProductId: result.ProductId,
Code: result.Code,
};
const activity = new Activity();
activity.ActivityId = cuid();
activity.Action = ActionEnum.DELETE;
activity.Description = 'Unassign Product from Category Product';
activity.EntityType = 'ProductProductCategory';
activity.EntityId = result.ProductCategoryId;
activity.EntityValueBefore = JSON.stringify(entityValueBefore);
activity.EntityValueAfter = JSON.stringify({});
await activity.create(loginUser.ObjectId, dbTransaction);
return {
MessageCode: 'ProductCategoryUnassigned',
Message: 'Product unassigned from Product Category.',
};
} catch (error) {
throw error;
}
}
}