feat: 🚧 add basic boilerplate
This commit is contained in:
parent
1a41ca7684
commit
146517062a
6 changed files with 111 additions and 2 deletions
32
apps/taxes/graphql/subscriptions/OrderCancelled.graphql
Normal file
32
apps/taxes/graphql/subscriptions/OrderCancelled.graphql
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
fragment OrderCancelledSubscription on Order {
|
||||||
|
id
|
||||||
|
privateMetadata {
|
||||||
|
key
|
||||||
|
value
|
||||||
|
}
|
||||||
|
channel {
|
||||||
|
id
|
||||||
|
slug
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fragment OrderCancelledEventSubscription on Event {
|
||||||
|
__typename
|
||||||
|
... on OrderCancelled {
|
||||||
|
order {
|
||||||
|
...OrderCancelledSubscription
|
||||||
|
}
|
||||||
|
recipient {
|
||||||
|
privateMetadata {
|
||||||
|
key
|
||||||
|
value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
subscription OrderCancelledSubscription {
|
||||||
|
event {
|
||||||
|
...OrderCancelledEventSubscription
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,5 +1,6 @@
|
||||||
import { AuthData } from "@saleor/app-sdk/APL";
|
import { AuthData } from "@saleor/app-sdk/APL";
|
||||||
import {
|
import {
|
||||||
|
OrderCancelledEventSubscriptionFragment,
|
||||||
OrderCreatedSubscriptionFragment,
|
OrderCreatedSubscriptionFragment,
|
||||||
OrderFulfilledSubscriptionFragment,
|
OrderFulfilledSubscriptionFragment,
|
||||||
TaxBaseFragment,
|
TaxBaseFragment,
|
||||||
|
@ -50,4 +51,10 @@ export class AvataxWebhookService implements ProviderWebhookService {
|
||||||
|
|
||||||
return response;
|
return response;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async cancelOrder(payload: OrderCancelledEventSubscriptionFragment) {
|
||||||
|
// todo: implement
|
||||||
|
this.logger.debug("cancelOrder", payload);
|
||||||
|
return { ok: true };
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import { AuthData } from "@saleor/app-sdk/APL";
|
import { AuthData } from "@saleor/app-sdk/APL";
|
||||||
import {
|
import {
|
||||||
MetadataItem,
|
MetadataItem,
|
||||||
|
OrderCancelledEventSubscriptionFragment,
|
||||||
OrderCreatedSubscriptionFragment,
|
OrderCreatedSubscriptionFragment,
|
||||||
OrderFulfilledSubscriptionFragment,
|
OrderFulfilledSubscriptionFragment,
|
||||||
TaxBaseFragment,
|
TaxBaseFragment,
|
||||||
|
@ -55,6 +56,10 @@ class ActiveTaxProviderService implements ProviderWebhookService {
|
||||||
async fulfillOrder(payload: OrderFulfilledSubscriptionFragment) {
|
async fulfillOrder(payload: OrderFulfilledSubscriptionFragment) {
|
||||||
return this.client.fulfillOrder(payload);
|
return this.client.fulfillOrder(payload);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async cancelOrder(payload: OrderCancelledEventSubscriptionFragment) {
|
||||||
|
return this.client.cancelOrder(payload);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getActiveConnectionService(
|
export function getActiveConnectionService(
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
import { SyncWebhookResponsesMap } from "@saleor/app-sdk/handlers/next";
|
import { SyncWebhookResponsesMap } from "@saleor/app-sdk/handlers/next";
|
||||||
import {
|
import {
|
||||||
|
OrderCancelledEventSubscriptionFragment,
|
||||||
OrderCreatedSubscriptionFragment,
|
OrderCreatedSubscriptionFragment,
|
||||||
OrderFulfilledSubscriptionFragment,
|
OrderFulfilledSubscriptionFragment,
|
||||||
TaxBaseFragment,
|
TaxBaseFragment,
|
||||||
} from "../../../generated/graphql";
|
} from "../../../generated/graphql";
|
||||||
import { ChannelConfig } from "../channel-configuration/channel-config";
|
|
||||||
|
|
||||||
export type CalculateTaxesResponse = SyncWebhookResponsesMap["ORDER_CALCULATE_TAXES"];
|
export type CalculateTaxesResponse = SyncWebhookResponsesMap["ORDER_CALCULATE_TAXES"];
|
||||||
|
|
||||||
|
@ -14,4 +14,5 @@ export interface ProviderWebhookService {
|
||||||
calculateTaxes: (payload: TaxBaseFragment) => Promise<CalculateTaxesResponse>;
|
calculateTaxes: (payload: TaxBaseFragment) => Promise<CalculateTaxesResponse>;
|
||||||
createOrder: (payload: OrderCreatedSubscriptionFragment) => Promise<CreateOrderResponse>;
|
createOrder: (payload: OrderCreatedSubscriptionFragment) => Promise<CreateOrderResponse>;
|
||||||
fulfillOrder: (payload: OrderFulfilledSubscriptionFragment) => Promise<{ ok: boolean }>;
|
fulfillOrder: (payload: OrderFulfilledSubscriptionFragment) => Promise<{ ok: boolean }>;
|
||||||
|
cancelOrder: (payload: OrderCancelledEventSubscriptionFragment) => Promise<any>;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,8 @@
|
||||||
import { OrderCreatedSubscriptionFragment, TaxBaseFragment } from "../../../generated/graphql";
|
import {
|
||||||
|
OrderCancelledEventSubscriptionFragment,
|
||||||
|
OrderCreatedSubscriptionFragment,
|
||||||
|
TaxBaseFragment,
|
||||||
|
} from "../../../generated/graphql";
|
||||||
import { Logger, createLogger } from "../../lib/logger";
|
import { Logger, createLogger } from "../../lib/logger";
|
||||||
import { TaxJarCalculateTaxesAdapter } from "./calculate-taxes/taxjar-calculate-taxes-adapter";
|
import { TaxJarCalculateTaxesAdapter } from "./calculate-taxes/taxjar-calculate-taxes-adapter";
|
||||||
import { TaxJarClient } from "./taxjar-client";
|
import { TaxJarClient } from "./taxjar-client";
|
||||||
|
@ -42,4 +46,10 @@ export class TaxJarWebhookService implements ProviderWebhookService {
|
||||||
async fulfillOrder() {
|
async fulfillOrder() {
|
||||||
return { ok: true };
|
return { ok: true };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async cancelOrder(payload: OrderCancelledEventSubscriptionFragment) {
|
||||||
|
// todo: implement
|
||||||
|
this.logger.debug("cancelOrder", payload);
|
||||||
|
return { ok: true };
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
54
apps/taxes/src/pages/api/webhooks/order-cancelled.ts
Normal file
54
apps/taxes/src/pages/api/webhooks/order-cancelled.ts
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
import { SaleorAsyncWebhook } from "@saleor/app-sdk/handlers/next";
|
||||||
|
import {
|
||||||
|
OrderCancelledEventSubscriptionFragment,
|
||||||
|
UntypedOrderCancelledSubscriptionDocument,
|
||||||
|
} from "../../../../generated/graphql";
|
||||||
|
import { saleorApp } from "../../../../saleor-app";
|
||||||
|
import { createLogger } from "../../../lib/logger";
|
||||||
|
import { getActiveConnectionService } from "../../../modules/taxes/get-active-connection-service";
|
||||||
|
import { WebhookResponse } from "../../../modules/app/webhook-response";
|
||||||
|
export const config = {
|
||||||
|
api: {
|
||||||
|
bodyParser: false,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
type OrderCancelledPayload = Extract<
|
||||||
|
OrderCancelledEventSubscriptionFragment,
|
||||||
|
{ __typename: "OrderCancelled" }
|
||||||
|
>;
|
||||||
|
|
||||||
|
export const orderCancelledAsyncWebhook = new SaleorAsyncWebhook<OrderCancelledPayload>({
|
||||||
|
name: "OrderCancelled",
|
||||||
|
apl: saleorApp.apl,
|
||||||
|
event: "ORDER_CANCELLED",
|
||||||
|
query: UntypedOrderCancelledSubscriptionDocument,
|
||||||
|
webhookPath: "/api/webhooks/order-cancelled",
|
||||||
|
});
|
||||||
|
|
||||||
|
export default orderCancelledAsyncWebhook.createHandler(async (req, res, ctx) => {
|
||||||
|
const logger = createLogger({ event: ctx.event });
|
||||||
|
const { payload } = ctx;
|
||||||
|
const webhookResponse = new WebhookResponse(res);
|
||||||
|
|
||||||
|
logger.info("Handler called with payload");
|
||||||
|
|
||||||
|
try {
|
||||||
|
const appMetadata = payload.recipient?.privateMetadata ?? [];
|
||||||
|
const channelSlug = payload.order?.channel.slug;
|
||||||
|
const taxProvider = getActiveConnectionService(channelSlug, appMetadata, ctx.authData);
|
||||||
|
|
||||||
|
logger.info("Fetched taxProvider");
|
||||||
|
|
||||||
|
if (!payload.order) {
|
||||||
|
return webhookResponse.error(new Error("Insufficient order data"));
|
||||||
|
}
|
||||||
|
await taxProvider.cancelOrder(payload);
|
||||||
|
|
||||||
|
logger.info("Order cancelled");
|
||||||
|
|
||||||
|
return webhookResponse.success();
|
||||||
|
} catch (error) {
|
||||||
|
return webhookResponse.error(new Error("Error while fulfilling tax provider order"));
|
||||||
|
}
|
||||||
|
});
|
Loading…
Reference in a new issue