route.ts 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. import { NextRequest, NextResponse } from "next/server";
  2. import { bagistoFetch } from "@/utils/bagisto";
  3. import {
  4. CREATE_ADD_PRODUCT_IN_CART,
  5. REMOVE_CART_ITEM,
  6. UPDATE_CART_ITEM,
  7. GET_CART_ITEM,
  8. CREATE_CART_TOKEN,
  9. CREATE_MERGE_CART,
  10. GET_CHECKOUT_ADDRESSES,
  11. GET_CHECKOUT_SHIPPING_RATES,
  12. GET_CHECKOUT_PAYMENT_METHODS,
  13. CREATE_CHECKOUT_ADDRESS,
  14. CREATE_CHECKOUT_SHIPPING_METHODS,
  15. CREATE_CHECKOUT_PAYMENT_METHODS,
  16. CREATE_CHECKOUT_ORDER,
  17. // CREATE_PRODUCT_REVIEW,
  18. CREATE_PAYMENT_INITIATE,
  19. CREATE_SAVE_CHECKOUT_CART,
  20. GET_ORDER_DETAILS,
  21. CREATE_CANCEL_ORDER,
  22. // GET_PRODUCT_BY_URL_KEY,
  23. } from "@/graphql";
  24. const ALLOWED_OPERATIONS: Record<string, any> = {
  25. createAddProductInCart: CREATE_ADD_PRODUCT_IN_CART,
  26. RemoveCartItem: REMOVE_CART_ITEM,
  27. UpdateCartItem: UPDATE_CART_ITEM,
  28. GetCartItem: GET_CART_ITEM,
  29. CreateCart: CREATE_CART_TOKEN,
  30. createMergeCart: CREATE_MERGE_CART,
  31. collectionGetCheckoutAddresses: GET_CHECKOUT_ADDRESSES,
  32. CheckoutShippingRates: GET_CHECKOUT_SHIPPING_RATES,
  33. CheckoutPaymentMethods: GET_CHECKOUT_PAYMENT_METHODS,
  34. createCheckoutAddress: CREATE_CHECKOUT_ADDRESS,
  35. CreateCheckoutShippingMethod: CREATE_CHECKOUT_SHIPPING_METHODS,
  36. CreateCheckoutPaymentMethod: CREATE_CHECKOUT_PAYMENT_METHODS,
  37. CreateCheckoutOrder: CREATE_CHECKOUT_ORDER,
  38. // CreateProductReview: CREATE_PRODUCT_REVIEW,
  39. CreatePaymentInitiate: CREATE_PAYMENT_INITIATE, // 创建订单
  40. CreateSaveCheckoutCart: CREATE_SAVE_CHECKOUT_CART,
  41. GetOrderDetails: GET_ORDER_DETAILS, // 获取订单详情
  42. CreateCancelOrder: CREATE_CANCEL_ORDER
  43. };
  44. // const QUERY_OPERATIONS: Record<string, any> = {
  45. // GetProductById: GET_PRODUCT_BY_URL_KEY,
  46. // }
  47. interface FetchOption {
  48. query: string;
  49. variables?: Record<string, any>;
  50. cache?: RequestCache;
  51. takeAuthorization?: boolean;
  52. operationName?: string;
  53. }
  54. // 需要authorization的operation
  55. function authorizationOperations(body: Record<string, any>): FetchOption {
  56. const { operationName, variables } = body;
  57. const query = ALLOWED_OPERATIONS[operationName];
  58. const finalVariables = variables;
  59. return {
  60. query,
  61. variables: finalVariables,
  62. takeAuthorization: true,
  63. cache: "no-store",
  64. // operationName
  65. }
  66. }
  67. // 不需要authorization的operation
  68. function notAuthorizationOperations(body: Record<string, any>): FetchOption {
  69. const { query, variables } = body;
  70. // const query = bodyGraphqlQuery;
  71. return {
  72. query,
  73. variables,
  74. cache: "no-store",
  75. takeAuthorization: false,
  76. // operationName
  77. }
  78. }
  79. export async function POST(req: NextRequest) {
  80. try {
  81. const body = await req.json();
  82. const { operationName } = body;
  83. if (!operationName) {
  84. return NextResponse.json(
  85. { message: "Invalid or unauthorized operation: " + (operationName || "missing") },
  86. { status: 400 }
  87. );
  88. }
  89. let fetchOption: FetchOption = notAuthorizationOperations(body);
  90. if(ALLOWED_OPERATIONS[operationName]) {
  91. fetchOption = authorizationOperations(body);
  92. }
  93. const response = await bagistoFetch<any>(fetchOption);
  94. return NextResponse.json(response.body,{
  95. status: response.status
  96. });
  97. } catch (error) {
  98. return NextResponse.json(
  99. {
  100. errors:[
  101. {
  102. message: error instanceof Error ? error.message : "Network error"
  103. }
  104. ],
  105. data:null
  106. },
  107. { status:500 }
  108. );
  109. }
  110. }