in typescript/src/link/link.ts [85:133]
export async function parseAndStoreLink<A, B>(
httpRequest: APIGatewayProxyEvent,
parsePayload: (request: APIGatewayProxyEvent) => A,
toUserSubscription: (userId: string, payload: A) => UserSubscription[],
toSqsPayload: (payload: A) => SubscriptionCheckData[],
): Promise<APIGatewayProxyResult> {
try {
if (httpRequest.headers && getAuthToken(httpRequest.headers)) {
const payload: A = parsePayload(httpRequest);
const resolution: UserIdResolution = await getUserId(httpRequest.headers);
switch (resolution.status) {
case 'incorrect-token': {
return HTTPResponses.UNAUTHORISED;
}
case 'incorrect-scope': {
return HTTPResponses.FORBIDDEN;
}
case 'missing-identity-id': {
return HTTPResponses.INVALID_REQUEST;
}
case 'success': {
const userId = resolution.userId as string;
const insertCount = await persistUserSubscriptionLinks(
toUserSubscription(userId, payload),
);
const sqsCount = await enqueueUnstoredPurchaseToken(
toSqsPayload(payload),
);
console.log(
`put ${insertCount} links in the DB, and sent ${sqsCount} subscription refs to SQS`,
);
return HTTPResponses.OK;
}
}
} else {
return HTTPResponses.INVALID_REQUEST;
}
} catch (error) {
console.error('Internal Server Error', error);
const message = (error as Error).message;
if (
typeof message === 'string' &&
message.includes('Provided list of item keys contains duplicates')
) {
console.error('Request body: ' + (httpRequest.body ?? ''));
}
return HTTPResponses.INTERNAL_ERROR;
}
}