feat: 🚧 add basic boilerplate

This commit is contained in:
Adrian Pilarczyk 2023-07-27 17:16:13 +02:00
parent 1a41ca7684
commit 146517062a
6 changed files with 111 additions and 2 deletions

View 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
}
}

View file

@ -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 };
}
} }

View file

@ -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(

View file

@ -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>;
} }

View file

@ -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 };
}
} }

View 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"));
}
});