cityssm/mini-shop-db

View on GitHub
updateOrderAsPaid.ts

Summary

Maintainability
A
30 mins
Test Coverage
import * as sqlPool from "@cityssm/mssql-multi-pool";

import type { MiniShopConfig, StoreValidatorReturn } from "./types";

import { _isOrderFoundAndPaid } from "./isOrderFoundAndPaid.js";


import debug from "debug";
const debugSQL = debug("mini-shop-db:updateOrderAsPaid");


export const _updateOrderAsPaid = async (config:MiniShopConfig,
  validOrder: StoreValidatorReturn): Promise<boolean> => {

  if (!validOrder.isValid) {
    return false;
  }

  // Check if the order can be marked as paid

  const order = await _isOrderFoundAndPaid(config, validOrder.orderNumber, validOrder.orderSecret);

  if (!order.found) {
    return false;

  } else if (order.paid) {
    return true;
  }

  try {
    const pool = await sqlPool.connect(config.mssqlConfig);

    await pool.request()
      .input("paymentID", validOrder.paymentID)
      .input("orderID", order.orderID)
      .query("update MiniShop.Orders" +
        " set paymentID = @paymentID," +
        " paymentTime = getdate()" +
        " where orderID = @orderID");

    if (validOrder.paymentData) {

      for (const dataName of Object.keys(validOrder.paymentData)) {

        await pool.request()
          .input("orderID", order.orderID)
          .input("dataName", dataName)
          .input("dataValue", validOrder.paymentData[dataName] || "")
          .query("insert into MiniShop.PaymentData (orderID, dataName, dataValue)" +
            " values (@orderID, @dataName, @dataValue)");
      }
    }

    return true;

  } catch (error) {
    debugSQL(error);
  }

  return false;
};


export default _updateOrderAsPaid;