From e689fe3666724ac1b5c03464e620a86ae2ec0f3b Mon Sep 17 00:00:00 2001 From: William Melo Date: Sat, 18 Jun 2022 13:56:24 -0300 Subject: [PATCH] #20: Throws error when receives data with datetime before the last one --- pages/api/session/[sessionId]/index.ts | 37 +++++++++++++++++++------- utils/error.ts | 13 +++++++++ 2 files changed, 41 insertions(+), 9 deletions(-) create mode 100644 utils/error.ts diff --git a/pages/api/session/[sessionId]/index.ts b/pages/api/session/[sessionId]/index.ts index 9e12515..21fed73 100644 --- a/pages/api/session/[sessionId]/index.ts +++ b/pages/api/session/[sessionId]/index.ts @@ -1,6 +1,7 @@ import { NextApiRequest, NextApiResponse } from "next"; import admin from "../../../../config/firebase"; import { ICoordinatesData } from "../../../../models/ICoordinatesData"; +import { CustomError, ErrorCode } from "../../../../utils/error"; import { createEntity } from "./entity"; import { getEntity } from "./entity/[entityId]"; @@ -54,18 +55,34 @@ const storeCoordinatesData = async ( await db.runTransaction(async (transaction) => { const coordinatesCollection = sessionRef.collection("coordinates"); - const coordinatesRef = coordinatesCollection.doc( - `${coordinatesData.date}T${coordinatesData.time}` - ); - const { statusCode } = await getEntity(sessionId, coordinatesData.id); - if (statusCode === 404) { - await createEntity(sessionId, { - id: coordinatesData.id, - label: coordinatesData.id, + const [lastRecordDoc] = ( + await coordinatesCollection.orderBy("date", "desc").limit(1).get() + ).docs; + const lastRecordData = lastRecordDoc.data() as ICoordinatesData; + + const isNewRecordBeforeLastOne = + lastRecordData.date >= coordinatesData.date && + lastRecordData.time >= coordinatesData.time; + if (isNewRecordBeforeLastOne) { + throw new CustomError({ + code: ErrorCode.DATE_AND_TIME_AFTER_PREVIOUS_ONE, + message: `New coordinates date and time should be after ${lastRecordDoc.id}.`, }); + } else { + const coordinatesRef = coordinatesCollection.doc( + `${coordinatesData.date}T${coordinatesData.time}` + ); + + const { statusCode } = await getEntity(sessionId, coordinatesData.id); + if (statusCode === 404) { + await createEntity(sessionId, { + id: coordinatesData.id, + label: coordinatesData.id, + }); + } + transaction.create(coordinatesRef, coordinatesData); } - transaction.create(coordinatesRef, coordinatesData); }); }; @@ -86,6 +103,8 @@ const addCoordinateToSession = async ( const message = "Once one coordinate is allowed for each date and time."; console.error(message, err); return { statusCode: 400, message }; + } else if (err.code === ErrorCode.DATE_AND_TIME_AFTER_PREVIOUS_ONE) { + return { statusCode: 400, message: err.message }; } const message = `Error while adding coordinate to session ${sessionId}.`; console.error(message, err); diff --git a/utils/error.ts b/utils/error.ts new file mode 100644 index 0000000..50f0957 --- /dev/null +++ b/utils/error.ts @@ -0,0 +1,13 @@ +export enum ErrorCode { + DATE_AND_TIME_AFTER_PREVIOUS_ONE, +} + +export class CustomError extends Error { + public code: ErrorCode; + + constructor(err: { code: ErrorCode; message: string }) { + super(); + this.code = err.code; + this.message = err.message; + } +}