All files / lib/lambda/user-management updateUserRoles.ts

100% Statements 19/19
90% Branches 9/10
100% Functions 2/2
100% Lines 19/19

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            1x       1x 6x 6x 1x     5x 1x           4x 4x 4x   4x 1x           3x   3x   3x                                 1x         2x 2x             1x  
import { APIGatewayEvent } from "aws-lambda";
import { produceMessage } from "libs/api/kafka";
import { response } from "libs/handler-lib";
import { BaseUserRoleRequest, baseUserRoleRequestSchema } from "shared-types/events/legacy-user";
import { z } from "zod";
 
export const updatedRolesSchema = z.object({
  updatedRoles: z.array(baseUserRoleRequestSchema),
});
 
export const updateUserRoles = async (event: APIGatewayEvent) => {
  const topicName = process.env.topicName as string;
  if (!topicName) {
    throw new Error("Topic name is not defined");
  }
 
  if (!event?.body) {
    return response({
      statusCode: 400,
      body: { message: "Event body required" },
    });
  }
 
  try {
    const eventBody = typeof event.body === "string" ? JSON.parse(event.body) : event.body;
    const safeEventBody = updatedRolesSchema.safeParse(eventBody);
 
    if (!safeEventBody.success && safeEventBody.error) {
      return response({
        statusCode: 400,
        body: { message: "Incorrect role object format", error: safeEventBody.error.message },
      });
    }
 
    await Promise.all(
      safeEventBody.data.updatedRoles.map(async (updatedRole: BaseUserRoleRequest) => {
        console.log("Producing message for:", updatedRole.email, updatedRole.role);
 
        await produceMessage(
          topicName,
          `${updatedRole.email}_${updatedRole.territory}_${updatedRole.role}`,
          JSON.stringify({
            email: updatedRole.email,
            status: updatedRole.status,
            territory: updatedRole.territory,
            role: updatedRole.role,
            doneByEmail: updatedRole.doneByEmail,
            doneByName: updatedRole.doneByName,
            date: Date.now(),
            eventType: updatedRole.eventType,
          }),
        );
      }),
    );
 
    return response({
      statusCode: 200,
      body: { message: "Roles have been updated." },
    });
  } catch (err: unknown) {
    console.log("An error occurred: ", err);
    return response({
      statusCode: 500,
      body: { message: "Internal server error" },
    });
  }
};
 
export const handler = updateUserRoles;