All files / resources/api/v2 text.ts

0% Statements 0/65
0% Branches 0/1
0% Functions 0/1
0% Lines 0/65

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87                                                                                                                                                                             
import {
  LambdaApiFunction,
  handleResourceApi
} from './_base';
import {
  validateRequest
} from './_utils';
 
import {
  api200Body, generateApi400Body
} from '@/types/api/_shared';
import {
  FullTextObject, UpdateTextSeenApi, updateTextSeenApiBodyValidator,
  updateTextSeenApiParamsValidator
} from '@/types/api/texts';
import {
  TABLE_TEXT, typedUpdate
} from '@/utils/backend/dynamoTyped';
import { getLogger } from '@/utils/common/logger';
 
const logger = getLogger('text');
 
const PATCH: LambdaApiFunction<UpdateTextSeenApi> = async function (event) {
  logger.trace('PATCH', ...arguments);
 
  // Validate the request
  const {
    params,
    body,
    validationErrors,
  } = validateRequest<UpdateTextSeenApi>({
    paramsRaw: event.pathParameters,
    paramsValidator: updateTextSeenApiParamsValidator,
    bodyRaw: event.body,
    bodyParser: 'json',
    bodyValidator: updateTextSeenApiBodyValidator,
  });
  if (
    params === null ||
    body === null ||
    validationErrors.length > 0
  ) {
    return [
      400,
      generateApi400Body(validationErrors),
    ];
  }
 
  // Update the message
  try {
    await typedUpdate<FullTextObject>({
      TableName: TABLE_TEXT,
      Key: {
        datetime: params.id,
      },
      ExpressionAttributeNames: {
        '#csLooked': 'csLooked',
        '#csLookedTime': 'csLookedTime',
      },
      ExpressionAttributeValues: {
        ':csLooked': [ body.phone, ],
        ':csLookedTime': [ Date.now(), ],
        ':csLookedPhone': body.phone,
        ':blankList': [],
      },
      ConditionExpression: 'NOT contains(#csLooked, :csLookedPhone)',
      UpdateExpression: 'SET #csLooked = list_append(if_not_exists(#csLooked, :blankList), :csLooked), #csLookedTime = list_append(if_not_exists(#csLookedTime, :blankList), :csLookedTime)',
    });
  } catch (e: any) { // eslint-disable-line @typescript-eslint/no-explicit-any
    if (
      !('name' in e) ||
      e.name !== 'ConditionalCheckFailedException'
    ) {
      throw e;
    }
  }
 
  return [
    200,
    api200Body,
  ];
};
 
export const main = handleResourceApi.bind(null, {
  PATCH,
});