Browse Source

проверка нет ли товара в чужих заказах

Vadim 2 months ago
parent
commit
2e32ecb7d9

+ 30 - 2
src/modules/client/shop/c-orders-controller.ts

@@ -35,14 +35,42 @@ class ClientOrdersController {
       throw ApiError.BadRequest("cartNotFound", "Корзина не найдена");
     }
 
-    // проверяем нет ли товаров из козины в другом заказе
-    const isExist = cart.items.find((i) => i.orderId);
+    // проверяем нет ли товаров из козины в другом моём заказе
+    const isExist = cart.items.filter((i) => i.orderId).find((i) => i.orderId);
     if (isExist)
       throw ApiError.BadRequest(
         "cartItemsExistInOrder",
         "Товары из корзины уже находятся в заказе",
       );
 
+    // проверка нет ли товаров в чужих заказах
+    for (const product of cart.items) {
+      if (product.productType === "ACTIVITY_REGISTRATION") {
+        const isItemExist = await ordersService.checkItemInOrders({
+          productId: product.productId,
+          activity_reg_id: product.activityRegId,
+        });
+
+        if (isItemExist)
+          throw ApiError.BadRequest(
+            "itemAlreadyInOrder",
+            `Товар ${product.name} уже у кого-то в активном заказе`,
+          );
+      }
+      if (product.productType === "ACTIVITY_PARTICIPANT") {
+        const isItemExist = await ordersService.checkItemInOrders({
+          productId: product.productId,
+          activity_reg_id: product.activityRegId,
+          pe_member_id: product.peMemberId,
+        });
+        if (isItemExist)
+          throw ApiError.BadRequest(
+            "itemAlreadyInOrder",
+            `Товар ${product.name} уже у кого-то в активном заказе`,
+          );
+      }
+    }
+
     const { orderId, payment } = await updPool.transaction(async (tr) => {
       // Создаем заказ
       const order = await ordersService.createOrder(tr, {

+ 64 - 35
src/modules/client/shop/cart/c-cart-controller.ts

@@ -4,6 +4,7 @@ import { cartService } from "./cart-service.js";
 import sessionService from "#modules/client/users/auth/services/session-service.js";
 import { ApiError } from "#exceptions/api-error.js";
 import { RouterUtils } from "#utils/router-utils.js";
+import { ordersService } from "../orders-service.js";
 
 class ClientCartController {
   async addItemToCart(req: Request, res: Response) {
@@ -34,8 +35,38 @@ class ClientCartController {
         "Тип товара не совпадает",
       );
 
-    // проверка на наличие корзины пользователя
+    // проверка на наличие товара в наличии
+    // if (realProduct.stockQuantity < product.) {
+    //   throw ApiError.BadRequest("notEnoughStock", "Недостаточно товара в наличии");
+    // }
+
+    // проверка нет ли товара в чужих заказах
+    if (product.productType === "ACTIVITY_REGISTRATION") {
+      const isItemExist = await ordersService.checkItemInOrders({
+        productId: product.productId,
+        activity_reg_id: product.activityRegId,
+      });
+
+      if (isItemExist)
+        throw ApiError.BadRequest(
+          "itemAlreadyInOrder",
+          "Товар уже у кого-то заказе",
+        );
+    }
+    if (product.productType === "ACTIVITY_PARTICIPANT") {
+      const isItemExist = await ordersService.checkItemInOrders({
+        productId: product.productId,
+        activity_reg_id: product.activityRegId,
+        pe_member_id: product.peMemberId,
+      });
+      if (isItemExist)
+        throw ApiError.BadRequest(
+          "itemAlreadyInOrder",
+          "Товар уже у кого-то заказе",
+        );
+    }
 
+    // проверка на наличие корзины пользователя
     const cart = await cartService.getCart(
       user ? { userId: user.userId } : { cartId: cartId! },
       true,
@@ -56,40 +87,38 @@ class ClientCartController {
       if (cartItem) {
         throw ApiError.BadRequest("itemAlreadyInCart", "Товар уже в корзине");
       }
-      // в корзине нет такого товара
-      else {
-        switch (product.productType) {
-          case "SHOP_ORDER":
-          case "TICKET": {
-            await cartService.addItemToCart({
-              productType: product.productType,
-              cartId: cart.cartId,
-              productId: realProduct.productId,
-              priceAtAddition: realProduct.price,
-            });
-            break;
-          }
-          case "ACTIVITY_REGISTRATION": {
-            await cartService.addItemToCart({
-              productType: product.productType,
-              cartId: cart.cartId,
-              productId: realProduct.productId,
-              priceAtAddition: realProduct.price,
-              activityRegId: product.activityRegId,
-            });
-            break;
-          }
-          case "ACTIVITY_PARTICIPANT": {
-            await cartService.addItemToCart({
-              productType: product.productType,
-              cartId: cart.cartId,
-              productId: realProduct.productId,
-              priceAtAddition: realProduct.price,
-              activityRegId: product.activityRegId,
-              peMemberId: product.peMemberId,
-            });
-            break;
-          }
+
+      switch (product.productType) {
+        case "SHOP_ORDER":
+        case "TICKET": {
+          await cartService.addItemToCart({
+            productType: product.productType,
+            cartId: cart.cartId,
+            productId: realProduct.productId,
+            priceAtAddition: realProduct.price,
+          });
+          break;
+        }
+        case "ACTIVITY_REGISTRATION": {
+          await cartService.addItemToCart({
+            productType: product.productType,
+            cartId: cart.cartId,
+            productId: realProduct.productId,
+            priceAtAddition: realProduct.price,
+            activityRegId: product.activityRegId,
+          });
+          break;
+        }
+        case "ACTIVITY_PARTICIPANT": {
+          await cartService.addItemToCart({
+            productType: product.productType,
+            cartId: cart.cartId,
+            productId: realProduct.productId,
+            priceAtAddition: realProduct.price,
+            activityRegId: product.activityRegId,
+            peMemberId: product.peMemberId,
+          });
+          break;
         }
       }
 

+ 22 - 0
src/modules/client/shop/orders-service.ts

@@ -626,6 +626,28 @@ class OrdersService {
       throw error; // Пробрасываем ошибку дальше
     }
   }
+
+  async checkItemInOrders({
+    productId,
+    activity_reg_id,
+    pe_member_id,
+  }: {
+    productId: string;
+    activity_reg_id?: string;
+    pe_member_id?: string;
+  }) {
+    return selPool.exists(sql.unsafe`
+      select
+        ci.product_id "productId"
+      from
+        shop.order_items ci
+      where
+        ci.product_id = ${productId} and
+        (ci.status = 'PENDING_PAYMENT' or ci.status = 'PAID')
+        ${activity_reg_id ? sql.fragment`and ci.activity_reg_id = ${activity_reg_id}` : sql.fragment``}
+        ${pe_member_id ? sql.fragment`and ci.pe_member_id = ${pe_member_id}` : sql.fragment``}
+    `);
+  }
 }
 
 export const ordersService = new OrdersService();