All files / server/src/features/settings/utils removeHiddenProgramItemsFromUsers.ts

87.5% Statements 21/24
75% Branches 9/12
100% Functions 4/4
87.5% Lines 21/24

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                    39x     9x     9x 4x     5x   5x 8x       8x   395x   2x       395x   2x     395x       1x           394x     5x 8x         5x 8x       8x       5x    
import { resetDirectSignupsByProgramItemIds } from "server/features/direct-signup/directSignupRepository";
import {
  findUsers,
  updateUsersByUsername,
} from "server/features/user/userRepository";
import { logger } from "server/utils/logger";
import { MongoDbError } from "shared/types/api/errors";
import { User } from "shared/types/models/user";
import { Result, makeSuccessResult } from "shared/utils/result";
 
export const removeHiddenProgramItemsFromUsers = async (
  hiddenProgramItemIds: readonly string[],
): Promise<Result<void, MongoDbError>> => {
  logger.info("Remove hidden program items from users");
 
  // Clearing the hidden list is a valid state - there is just nothing to clean up
  if (hiddenProgramItemIds.length === 0) {
    return makeSuccessResult();
  }
 
  logger.info(`Found ${hiddenProgramItemIds.length} hidden program items`);
 
  const usersResult = await findUsers();
  Iif (!usersResult.ok) {
    return usersResult;
  }
 
  const usersToUpdate: User[] = usersResult.value.flatMap<User>((user) => {
    // Lottery signups to remove
    const lotterySignups = user.lotterySignups.filter(
      (lotterySignup) =>
        !hiddenProgramItemIds.includes(lotterySignup.programItemId),
    );
 
    // Favorite program items to remove
    const favoriteProgramItemIds = user.favoriteProgramItemIds.filter(
      (favoriteProgramItemId) =>
        !hiddenProgramItemIds.includes(favoriteProgramItemId),
    );
 
    if (
      user.lotterySignups.length !== lotterySignups.length ||
      user.favoriteProgramItemIds.length !== favoriteProgramItemIds.length
    ) {
      return {
        ...user,
        lotterySignups,
        favoriteProgramItemIds,
      };
    }
    return [];
  });
 
  const updateUsersResult = await updateUsersByUsername(usersToUpdate);
  Iif (!updateUsersResult.ok) {
    return updateUsersResult;
  }
 
  const resetSignupsByProgramItemIdsResult =
    await resetDirectSignupsByProgramItemIds(hiddenProgramItemIds);
  Iif (!resetSignupsByProgramItemIdsResult.ok) {
    return resetSignupsByProgramItemIdsResult;
  }
 
  logger.info(
    "Hidden program items removed from users and direct signups reset",
  );
 
  return makeSuccessResult();
};