Merge pull request #1 from Danakcorp/mrtz

Mrtz
This commit is contained in:
morteza-mortezai
2025-09-28 12:27:37 +03:30
committed by GitHub
7 changed files with 304 additions and 1 deletions
@@ -1,6 +1,6 @@
import rateLimit from "express-rate-limit";
import { inject } from "inversify";
import { controller, httpDelete, httpPatch, httpPost, requestBody, requestParam } from "inversify-express-utils";
import { controller, httpDelete, httpGet, httpPatch, httpPost, requestBody, requestParam } from "inversify-express-utils";
import { HttpStatus } from "../../../common";
import { BaseController } from "../../../common/base/controller";
@@ -86,4 +86,14 @@ export class AdminBrandController extends BaseController {
const data = await this.brandService.deleteById(id);
return this.response({ data });
}
@ApiOperation("get brand detail")
@ApiResponse("successful", HttpStatus.Ok)
@ApiParam("id", "id of brand")
@ApiAuth()
@httpGet("/:id", Guard.authAdmin())
public async getBrand(@requestParam("id") id: string) {
const data = await this.brandService.getBrandDetail(id);
return this.response({ data });
}
}
@@ -228,4 +228,24 @@ export class AdminOrderController extends BaseController {
const { pager } = this.paginate(data.count);
return this.response({ pager, orders: data.orders, priceRange });
}
@ApiOperation("get an order details of user")
@ApiResponse("successful", HttpStatus.Ok)
@ApiParam("orderId", "id of order", true)
@ApiAuth()
@httpGet("/:orderId/user", Guard.authAdmin(), Guard.checkAdminPermissions([PermissionEnum.ORDER]))
public async getUserOrderDetail(@requestParam("orderId") orderId: string) {
const data = await this.orderService.getUserOrderDetailAsAdmin(+orderId);
return this.response(data);
}
@ApiOperation("get an order details of seller")
@ApiResponse("successful", HttpStatus.Ok)
@ApiParam("orderId", "id of order", true)
@ApiAuth()
@httpGet("/:orderId/seller", Guard.authAdmin(), Guard.checkAdminPermissions([PermissionEnum.ORDER]))
public async getSellerOrderDetail(@requestParam("orderId") orderId: string) {
const data = await this.orderService.getSellerOrderDetailAsAdmin(+orderId);
return this.response(data);
}
}
@@ -59,4 +59,14 @@ export class AdminWarrantyController extends BaseController {
const data = await this.warrantyService.deleteById(+id);
return this.response(data);
}
@ApiOperation("get warranty with its id")
@ApiResponse("successful", HttpStatus.Ok)
@ApiParam("id", "id of warranty")
@ApiAuth()
@httpDelete("/:id", Guard.authAdmin())
public async getWarranty(@requestParam("id") id: string) {
const data = await this.warrantyService.getWarranty(id);
return this.response(data);
}
}
+9
View File
@@ -117,6 +117,15 @@ class BrandService {
async getPendingBrandsCount() {
return await this.brandRepo.getPendingBrandsCount();
}
async getBrandDetail(id: string) {
const brand = await this.brandRepo.model.findOne({ _id: id, deleted: false }).populate("category");
if (!brand) throw new BadRequestError(BrandMessage.NotFound);
return {
brand,
};
}
}
export { BrandService };
+198
View File
@@ -1641,6 +1641,204 @@ class OrderItemRepo extends BaseRepository<IOrderItem> {
]);
}
async getSellerOrderDetailForAdminPanel(orderId: number, shopIds: Types.ObjectId[]) {
return this.model.aggregate([
{
$match: {
order: orderId,
shop: { $in: shopIds },
},
},
{
$lookup: {
from: "orders",
localField: "order",
foreignField: "_id",
as: "order",
},
},
{
$unwind: "$order",
},
{
$lookup: {
from: "cartpayments",
localField: "order.payment",
foreignField: "_id",
as: "order.payment",
},
},
{
$unwind: "$order.payment",
},
{
$lookup: {
from: "paymentmethods",
localField: "order.payment.payment_method",
foreignField: "_id",
as: "order.payment.payment_method",
},
},
{
$unwind: "$order.payment.payment_method",
},
{
$lookup: {
from: "users",
localField: "order.user",
foreignField: "_id",
as: "order.user",
},
},
{
$unwind: "$order.user",
},
{
$unwind: "$shipmentItems",
},
{
$lookup: {
from: "products",
localField: "shipmentItems.product",
foreignField: "_id",
as: "shipmentItems.product",
},
},
{
$unwind: "$shipmentItems.product",
},
{
$lookup: {
from: "productvariants",
localField: "shipmentItems.variant",
foreignField: "_id",
as: "shipmentItems.variant",
},
},
{
$unwind: "$shipmentItems.variant",
},
{
$lookup: {
from: "warranties",
localField: "shipmentItems.variant.warranty",
foreignField: "_id",
as: "shipmentItems.variant.warranty",
},
},
{
$unwind: {
path: "$shipmentItems.variant.warranty",
preserveNullAndEmptyArrays: true,
},
},
{
$lookup: {
from: "colors",
localField: "shipmentItems.variant.color",
foreignField: "_id",
as: "shipmentItems.variant.color",
},
},
{
$unwind: {
path: "$shipmentItems.variant.color",
preserveNullAndEmptyArrays: true,
},
},
{
$lookup: {
from: "sizes",
localField: "shipmentItems.variant.size",
foreignField: "_id",
as: "shipmentItems.variant.size",
},
},
{
$unwind: {
path: "$shipmentItems.variant.size",
preserveNullAndEmptyArrays: true,
},
},
{
$lookup: {
from: "meterages",
localField: "shipmentItems.variant.meterage",
foreignField: "_id",
as: "shipmentItems.variant.meterage",
},
},
{
$unwind: {
path: "$shipmentItems.variant.meterage",
preserveNullAndEmptyArrays: true,
},
},
{
$lookup: {
from: "shipments",
localField: "shipper",
foreignField: "_id",
as: "shipper",
},
},
{
$unwind: "$shipper",
},
{
$group: {
_id: "$order._id",
user: { $first: "$order.user" },
payment: { $first: "$order.payment" },
shipmentAddress: { $first: "$order.shipmentAddress" },
orderStatus: { $first: "$order.orderStatus" },
createdAt: { $first: "$order.createdAt" },
orderItems: {
$first: {
_id: "$_id",
order_id: "$order._id",
shop: "$shop",
shipper: "$shipper",
totalSellingPrice: "$totalSellingPrice",
totalRetailPrice: "$totalRetailPrice",
totalShipmentCost: "$totalShipmentCost",
totalPaymentPrice: "$totalPaymentPrice",
itemsCount: "$itemsCount",
trackCode: "$trackCode",
postingDate: "$postingDate",
postingReceipt: "$postingReceipt",
status: "$status",
},
},
shipmentItems: {
$push: {
_id: "$shipmentItems._id",
product: "$shipmentItems.product",
variant: "$shipmentItems.variant",
quantity: "$shipmentItems.quantity",
cancelled_quantity: "$shipmentItems.cancelled_quantity",
returned_quantity: "$shipmentItems.returned_quantity",
selling_price: "$shipmentItems.selling_price",
retail_price: "$shipmentItems.retail_price",
discount_percent: "$shipmentItems.discount_percent",
shipmentCost: "$shipmentItems.shipmentCost",
},
},
// totalSellingPrice: { $sum: { $multiply: ["$shipmentItems.selling_price", "$shipmentItems.quantity"] } },
// totalRetailPrice: { $sum: { $multiply: ["$shipmentItems.retail_price", "$shipmentItems.quantity"] } },
// totalShipmentCost: { $sum: "$shipmentItems.shipmentCost" },
// itemsCount: { $sum: "$shipmentItems.quantity" },
},
},
{
$addFields: {
"orderItems.shipmentItems": "$shipmentItems",
// totalPaymentPrice: { $add: ["$totalSellingPrice", "$totalShipmentCost"] },
},
},
]);
}
async getSellerSalesStats(shopId: string, queries: { start?: string; end?: string }) {
// Parse the date range from queries, converting from Persian to Gregorian if necessary
const startDate = queries.start ? new Date(TimeService.convertPersianToGregorian(queries.start)) : null;
+47
View File
@@ -322,6 +322,29 @@ class OrderService {
}
//#######################################################
//#######################################################
async getUserOrderDetailAsAdmin(orderId: number) {
const { order } = await this.validateAdminUserOrder(orderId);
const doc = await this.orderRepo.getUserOrderDetail(orderId, order.user._id.toString());
const cleanedOrder = SellerOrdersDTO.transformOrder(doc[0]);
return { order: cleanedOrder };
}
//#######################################################
//#######################################################
async getSellerOrderDetailAsAdmin(orderId: number) {
const { shopIds } = await this.validateAdminSellerOrder(orderId);
const doc = await this.orderItemRepo.getSellerOrderDetailForAdminPanel(orderId, shopIds);
const cleanedOrder = SellerOrdersDTO.transformOrder(doc[0]);
return { order: cleanedOrder };
}
//#######################################################
//#######################################################
async getSellerSalesStats(sellerId: string, queries: { start: string; end: string }) {
const shop = await this.shopRepo.model.findOne({ owner: sellerId });
if (!shop) throw new BadRequestError(ShopMessage.ShopNotFound);
@@ -365,6 +388,30 @@ class OrderService {
return { order, orderItems };
}
//#######################################################
//#######################################################
private async validateAdminUserOrder(orderId: number) {
const order = await this.orderRepo.model.findOne({ _id: orderId });
if (!order) throw new BadRequestError(OrderMessage.NotFound);
const orderItems = await this.orderItemRepo.model.find({ order: order._id });
if (!orderItems || orderItems.length === 0) throw new BadRequestError(OrderMessage.OrderItemsNotFound);
return { order, orderItems };
}
//#######################################################
//#######################################################
private async validateAdminSellerOrder(orderId: number) {
const order = await this.orderRepo.model.findOne({ _id: orderId }).lean();
if (!order) throw new BadRequestError(OrderMessage.NotFound);
const orderItems = await this.orderItemRepo.model.find({ order: orderId }).lean();
const shopIds = orderItems.map((item) => item.shop._id);
const orderItem = await this.orderItemRepo.model.findOne({ shop: { in: shopIds }, order: order._id });
if (!orderItem) throw new BadRequestError(OrderMessage.OrderItemsNotFound);
return { order, orderItem, shopIds };
}
//#######################################
//#######################################
+9
View File
@@ -61,6 +61,15 @@ class WarrantyService {
async getPendingWarranties() {
return await this.warrantyRepo.pendingWarranties();
}
async getWarranty(id: string) {
const warranty = await this.warrantyRepo.model.findOne({ _id: id, deleted: false });
if (!warranty) throw new BadRequestError(CommonMessage.NotValidId);
return {
warranty,
};
}
}
export { WarrantyService };