| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- import { FulfillmentHandler, LanguageCode, OrderLine, TransactionalConnection } from '@vendure/core';
- import { In } from 'typeorm';
- let connection: TransactionalConnection;
- /**
- * @description
- * This is a fulfillment handler for digital products which generates a download url
- * for each digital product in the order.
- */
- export const digitalFulfillmentHandler = new FulfillmentHandler({
- code: 'digital-fulfillment',
- description: [
- {
- languageCode: LanguageCode.en,
- value: 'Generates product keys for the digital download',
- },
- ],
- args: {},
- init: injector => {
- connection = injector.get(TransactionalConnection);
- },
- createFulfillment: async (ctx, orders, lines) => {
- const digitalDownloadUrls: string[] = [];
- const orderLines = await connection.getRepository(ctx, OrderLine).find({
- where: {
- id: In(lines.map(l => l.orderLineId)),
- },
- relations: {
- productVariant: true,
- },
- });
- for (const orderLine of orderLines) {
- if (orderLine.productVariant.customFields.isDigital) {
- // This is a digital product, so generate a download url
- const downloadUrl = await generateDownloadUrl(orderLine);
- digitalDownloadUrls.push(downloadUrl);
- }
- }
- return {
- method: 'Digital Fulfillment',
- trackingCode: 'DIGITAL',
- customFields: {
- downloadUrls: digitalDownloadUrls,
- },
- };
- },
- });
- function generateDownloadUrl(orderLine: OrderLine) {
- // This is a dummy function that would generate a download url for the given OrderLine
- // by interfacing with some external system that manages access to the digital product.
- // In this example, we just generate a random string.
- const downloadUrl = `https://example.com/download?key=${Math.random().toString(36).substring(7)}`;
- return Promise.resolve(downloadUrl);
- }
|