export async function parseAndStoreLink()

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