diff --git a/apps/passport-client/components/screens/LoginScreens/OneClickLoginScreen.tsx b/apps/passport-client/components/screens/LoginScreens/OneClickLoginScreen.tsx index 40e35bb438..ce52e01924 100644 --- a/apps/passport-client/components/screens/LoginScreens/OneClickLoginScreen.tsx +++ b/apps/passport-client/components/screens/LoginScreens/OneClickLoginScreen.tsx @@ -1,5 +1,7 @@ +import { requestGenericIssuanceTicketPreviews } from "@pcd/passport-interface"; import { useCallback, useEffect } from "react"; import { useParams } from "react-router-dom"; +import { appConfig } from "../../../src/appConfig"; import { useDispatch, useSelf } from "../../../src/appHooks"; import { MaybeModal } from "../../modals/Modal"; import { AppContainer } from "../../shared/AppContainer"; @@ -37,6 +39,20 @@ export function OneClickLoginScreen(): JSX.Element | null { // code, // targetFolder // }); + + const result = await requestGenericIssuanceTicketPreviews( + appConfig.zupassServer, + email, + code + ); + + console.log(result); + + if (result.success) { + console.log(result.value); + } else { + console.error(result.error); + } } catch (err) { await dispatch({ type: "error", diff --git a/apps/passport-server/src/routing/routes/genericIssuanceRoutes.ts b/apps/passport-server/src/routing/routes/genericIssuanceRoutes.ts index cbd71cae01..49849dcb29 100644 --- a/apps/passport-server/src/routing/routes/genericIssuanceRoutes.ts +++ b/apps/passport-server/src/routing/routes/genericIssuanceRoutes.ts @@ -21,7 +21,8 @@ import { PodboxTicketActionRequest, PodboxTicketActionResponseValue, PollFeedRequest, - PollFeedResponseValue + PollFeedResponseValue, + TicketPreviewResultValue } from "@pcd/passport-interface"; import { SerializedSemaphoreGroup } from "@pcd/semaphore-group-pcd"; import { sleep } from "@pcd/util"; @@ -667,4 +668,20 @@ export function initGenericIssuanceRoutes( res.json(result satisfies GenericIssuanceSendPipelineEmailResponseValue); } ); + + app.post( + "/generic-issuance/api/ticket-previews/:email/:orderCode", + async (req, res) => { + checkGenericIssuanceServiceStarted(genericIssuanceService); + const email = checkUrlParam(req, "email"); + const orderCode = checkUrlParam(req, "orderCode"); + + const result = await genericIssuanceService.handleGetTicketPreview( + email, + orderCode + ); + + res.json(result satisfies TicketPreviewResultValue); + } + ); } diff --git a/apps/passport-server/src/services/generic-issuance/GenericIssuanceService.ts b/apps/passport-server/src/services/generic-issuance/GenericIssuanceService.ts index e635054fa3..3ccc0a39e5 100644 --- a/apps/passport-server/src/services/generic-issuance/GenericIssuanceService.ts +++ b/apps/passport-server/src/services/generic-issuance/GenericIssuanceService.ts @@ -20,7 +20,8 @@ import { PodboxTicketActionRequest, PodboxTicketActionResponseValue, PollFeedRequest, - PollFeedResponseValue + PollFeedResponseValue, + TicketPreviewResultValue } from "@pcd/passport-interface"; import { RollbarService } from "@pcd/server-shared"; import { Request } from "express"; @@ -345,4 +346,21 @@ export class GenericIssuanceService { public async getEdgeCityBalances(): Promise { return getEdgeCityBalances(this.context.dbPool); } + + public async handleGetTicketPreview( + email: string, + orderCode: string + ): Promise { + return { + tickets: [ + { + name: "Test", + email: "test@test.com", + ticketSecret: "test", + eventName: "Test Event", + productName: "Test Product" + } + ] + } satisfies TicketPreviewResultValue; + } } diff --git a/packages/lib/passport-interface/src/RequestTypes.ts b/packages/lib/passport-interface/src/RequestTypes.ts index 6f715fe361..bc33479938 100644 --- a/packages/lib/passport-interface/src/RequestTypes.ts +++ b/packages/lib/passport-interface/src/RequestTypes.ts @@ -1236,3 +1236,13 @@ export type OneClickEmailResponseValue = { */ values: Record; }; + +export type TicketPreviewResultValue = { + tickets: Array<{ + name: string; + email: string; + ticketSecret: string; + eventName: string; + productName: string; + }>; +}; diff --git a/packages/lib/passport-interface/src/api/requestGenericIssuanceTicketPreviews.ts b/packages/lib/passport-interface/src/api/requestGenericIssuanceTicketPreviews.ts new file mode 100644 index 0000000000..6003b6dca4 --- /dev/null +++ b/packages/lib/passport-interface/src/api/requestGenericIssuanceTicketPreviews.ts @@ -0,0 +1,33 @@ +import urlJoin from "url-join"; +import { TicketPreviewResultValue } from "../RequestTypes"; +import { APIResult } from "./apiResult"; +import { httpPostSimple } from "./makeRequest"; + +/** + * Asks the server to fetch the pipeline definition corresponding to the + * given pipeline ID. Requires cookies, as this is part of generic issuance + * user authentication. + */ +export async function requestGenericIssuanceTicketPreviews( + zupassServerUrl: string, + email: string, + orderCode: string +): Promise { + return httpPostSimple( + urlJoin( + zupassServerUrl, + `/generic-issuance/api/ticket-previews`, + encodeURIComponent(email), + encodeURIComponent(orderCode) + ), + async (resText) => ({ + value: JSON.parse(resText) as TicketPreviewResultValue, + success: true + }), + {}, + true + ); +} + +export type GenericIssuanceTicketPreviewResponse = + APIResult; diff --git a/packages/lib/passport-interface/src/index.ts b/packages/lib/passport-interface/src/index.ts index 0577c23aab..d398158b97 100644 --- a/packages/lib/passport-interface/src/index.ts +++ b/packages/lib/passport-interface/src/index.ts @@ -29,6 +29,7 @@ export * from "./api/requestGenericIssuanceSemaphoreGroup"; export * from "./api/requestGenericIssuanceSemaphoreGroupRoot"; export * from "./api/requestGenericIssuanceSendPipelineEmail"; export * from "./api/requestGenericIssuanceSetManualCheckInState"; +export * from "./api/requestGenericIssuanceTicketPreviews"; export * from "./api/requestGenericIssuanceUpsertPipeline"; export * from "./api/requestGenericIssuanceValidSemaphoreGroup"; export * from "./api/requestIssuanceServiceEnabled";