Gerenciando status no CrazyStack Node.js
Nesta aula, você aprenderá sobre a gestão de status, que é uma das partes importantes da aplicação de agendamento. A aula mostrará como implementar uma função chamada "statusIsValid", que é utilizada para validar se é possível mudar o status de um agendamento. Esta validação é importante para garantir a consistência dos dados na aplicação e evitar situações indesejadas. A função statusIsValid pode ser escrita de várias maneiras, mas, em geral, é uma verificação lógica que compara o status atual do agendamento com o status pretendido e retorna um valor booleano indicando se a mudança é válida ou não.
export const NEW_STATUS_ARRAY_THAT_NEEDS_APPOINTMENT_IN_FUTURE = [1, 2, 3, 5, 6, 7, 8];
export const NEW_STATUS_ARRAY_THAT_NEEDS_APPOINTMENT_IN_PAST = [9, 10, 11];
export const ACCEPTABLE_DIFFERENCE_IN_MINUTES_TO_RATE = 5000;
export const ACCEPTABLE_DIFFERENCE_IN_MINUTES_TO_CANCEL = -60;
export const ACCEPTABLE_DIFFERENCE_IN_MINUTES_TO_RESCHEDULE = -50;
export const CANCELLED_STATUS_ARRAY = [2, 3];
export const RESCHEDULE_STATUS_ARRAY = [5, 6];
export const RATED_STATUS_ARRAY = [11, 9];
import { differenceInMinutes } from "@/application/helpers/dateFns";
import { RequestData } from "@/slices/request/entities";
import {
NEW_STATUS_ARRAY_THAT_NEEDS_APPOINTMENT_IN_FUTURE,
NEW_STATUS_ARRAY_THAT_NEEDS_APPOINTMENT_IN_PAST,
ACCEPTABLE_DIFFERENCE_IN_MINUTES_TO_RATE,
ACCEPTABLE_DIFFERENCE_IN_MINUTES_TO_CANCEL,
ACCEPTABLE_DIFFERENCE_IN_MINUTES_TO_RESCHEDULE,
CANCELLED_STATUS_ARRAY,
RESCHEDULE_STATUS_ARRAY,
RATED_STATUS_ARRAY,
} from "@/application/constants";
export type StatusIsValidInput = {
currentRequest: RequestData;
newStatus: number;
};
export const statusIsValid = (statusIsValidInput: StatusIsValidInput): boolean => {
const { currentRequest, newStatus = 99 } = statusIsValidInput || {};
if (!currentRequest || newStatus < 0 || newStatus > 11) {
return false;
}
const { status, initDate: initDateAux } = currentRequest;
if (status === 0 && newStatus === 4) {
return true;
}
const initDate = new Date(initDateAux);
const differenceInMinutesBetweenAppointmentDateAndNow: number = differenceInMinutes(
new Date(),
initDate
);
const appointmentWasHappened = differenceInMinutesBetweenAppointmentDateAndNow > 0;
const cannotChangeStatusBecauseOfAppointmentDate =
(NEW_STATUS_ARRAY_THAT_NEEDS_APPOINTMENT_IN_FUTURE.includes(newStatus) &&
appointmentWasHappened) ||
(NEW_STATUS_ARRAY_THAT_NEEDS_APPOINTMENT_IN_PAST.includes(newStatus) &&
!appointmentWasHappened);
if (cannotChangeStatusBecauseOfAppointmentDate) {
return false;
}
const validStatusArray = getValidStatusForNewStatus(newStatus);
if (
CANCELLED_STATUS_ARRAY.includes(newStatus) &&
validStatusArray.includes(status) &&
differenceInMinutesBetweenAppointmentDateAndNow >
ACCEPTABLE_DIFFERENCE_IN_MINUTES_TO_CANCEL
) {
return false;
} else if (
RESCHEDULE_STATUS_ARRAY.includes(newStatus) &&
validStatusArray.includes(status) &&
differenceInMinutesBetweenAppointmentDateAndNow >
ACCEPTABLE_DIFFERENCE_IN_MINUTES_TO_RESCHEDULE
) {
return false;
} else if (
RATED_STATUS_ARRAY.includes(newStatus) &&
validStatusArray.includes(status) &&
differenceInMinutesBetweenAppointmentDateAndNow >
ACCEPTABLE_DIFFERENCE_IN_MINUTES_TO_RATE
) {
return false;
} else if (validStatusArray.includes(status)) {
return true;
}
return false;
};
export const getValidStatusForNewStatus = (newStatus: number): number[] => {
switch (newStatus) {
case 1:
case 2:
case 3:
return [0];
case 5:
case 6:
return [0, 1, 2, 3, 4, 7];
case 7:
case 8:
return [5, 6];
case 9:
return [1, 7];
case 10:
return [1, 7, 9];
case 11:
return [10];
default:
return [];
}
};
Esse código define uma função chamada "statusIsValid" que é utilizada para validar se é possível mudar o status de um agendamento. Ele usa várias constantes e funções auxiliares, como "differenceInMinutes" e "getValidStatusForNewStatus", para determinar se é possível mudar o status de um agendamento baseado na data e hora do agendamento, no status atual do agendamento e no novo status desejado. Também exporta algumas constantes relacionadas ao processo de agendamento, como "NEW_STATUS_ARRAY_THAT_NEEDS_APPOINTMENT_IN_FUTURE" e "ACCEPTABLE_DIFFERENCE_IN_MINUTES_TO_RATE". Isso é importante para garantir que os agendamentos sejam gerenciados de forma consistente e precisa, garantindo que os usuários não possam mudar o status de um agendamento de forma imprópria ou em momentos inapropriados.