All files / server/src/features/serial serialRepository.ts

79.54% Statements 35/44
80% Branches 8/10
100% Functions 5/5
78.57% Lines 33/42

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 88 89 90 91 92 93 94 95 96 97 98 99 100                              44x 423x 423x 423x 423x                 44x     33x   33x 42x 42x   42x 42x       42x 2x 2x   40x   40x     33x 33x 33x       33x 40x 40x               40x     33x                 44x       52x 52x               52x 44x 44x   32x 8x    
import generator from "generate-serial-number";
import { MongoDbError } from "shared/types/api/errors";
import { formatSerial } from "shared/utils/formatSerial";
import {
  Result,
  makeErrorResult,
  makeSuccessResult,
} from "shared/utils/result";
import {
  SerialModel,
  SerialSchemaDb,
} from "server/features/serial/serialSchema";
import { Serial } from "server/types/serialTypes";
import { logger } from "server/utils/logger";
 
export const removeSerials = async (): Promise<Result<void, MongoDbError>> => {
  logger.info("MongoDB: remove ALL serials from db");
  try {
    await SerialModel.deleteMany({});
    return makeSuccessResult();
  } catch (error) {
    logger.error(
      new Error("MongoDB: Error removing serials", { cause: error }),
    );
    return makeErrorResult(MongoDbError.UNKNOWN_ERROR);
  }
};
 
export const saveSerials = async (
  count: number,
): Promise<Result<Serial[], MongoDbError>> => {
  const serials: Serial[] = [];
  // create serials
  for (let i = 1; i <= count; i += 1) {
    const serial = generator.generate(10);
    const rawSerials = serials.map((s) => s.serial);
 
    const findSerialResult = await findSerial(serial);
    Iif (!findSerialResult.ok) {
      return makeErrorResult(MongoDbError.UNKNOWN_ERROR);
    }
 
    if (findSerialResult.value || rawSerials.includes(serial)) {
      i -= 1;
      continue;
    }
    serials.push(new SerialModel({ serial }));
 
    logger.info(`MongoDB: Created new serial: ${formatSerial(serial)}`);
  }
 
  try {
    const response = await SerialModel.create(serials);
    logger.info(
      `MongoDB: Serials data saved. (${serials.length} serials saved)`,
    );
 
    const results = response.flatMap((serial) => {
      const result = SerialSchemaDb.safeParse(serial);
      Iif (!result.success) {
        logger.error(
          new Error(`Error validating saveSerials DB value`, {
            cause: result.error,
          }),
        );
        return [];
      }
      return result.data;
    });
 
    return makeSuccessResult(results);
  } catch (error) {
    logger.error(
      new Error("MongoDB: Error saving serials data", { cause: error }),
    );
    return makeErrorResult(MongoDbError.UNKNOWN_ERROR);
  }
};
 
export const findSerial = async (
  serial: string,
): Promise<Result<boolean, MongoDbError>> => {
  let response;
  try {
    response = await SerialModel.findOne({ serial }).lean();
  } catch (error) {
    logger.error(
      new Error(`MongoDB: Error finding serial ${serial}`, { cause: error }),
    );
    return makeErrorResult(MongoDbError.UNKNOWN_ERROR);
  }
 
  if (!response) {
    logger.debug(`MongoDB: Serial ${serial} not found`);
    return makeSuccessResult(false);
  }
  logger.debug(`MongoDB: Found serial ${serial}`);
  return makeSuccessResult(true);
};