tariffs/src/handlers/tariff/index.ts

201 lines
5.0 KiB
TypeScript
Raw Normal View History

2022-12-21 20:06:04 +00:00
import { Types } from "mongoose";
import { TariffModel } from "@/models/tariff.model";
import { PrivilegeModel } from "@/models/privilege.model";
import { validateEmptyFields } from "@/utils/validate-empty-fields";
import { validateTariff } from "./helpers";
import type { FastifyReply } from "fastify";
import type { Privilege } from "@/types/models/privilege.type";
import type { CreateTariffRequest, GetTariffRequest, ReplaceTariffRequest, RemoveTariffRequest } from "./types";
2022-12-21 20:06:04 +00:00
export const getTariffs = async () => TariffModel.find({}).lean();
export const getTariff = async (request: GetTariffRequest, reply: FastifyReply) => {
const [requestParams, error] = validateEmptyFields(request.params || {}, ["id"]);
if (error) {
reply.status(400);
return error;
}
if (!Types.ObjectId.isValid(requestParams.id)) {
reply.status(400);
return new Error("invalid id");
}
const tariff = await TariffModel.findById(requestParams.id).lean();
if (!tariff) {
reply.status(404);
return new Error("tariff not found");
}
return tariff;
};
export const createTariff = async (request: CreateTariffRequest, reply: FastifyReply) => {
2022-12-25 20:10:23 +00:00
const [requestBody, error] = validateTariff(request.body);
2022-12-21 20:06:04 +00:00
if (error) {
reply.status(400);
return error;
}
2022-12-25 20:10:23 +00:00
for (const privilegeId of requestBody.privilegieIDArray) {
if (!Types.ObjectId.isValid(privilegeId)) {
2022-12-21 20:06:04 +00:00
reply.status(404);
2022-12-25 20:10:23 +00:00
return new Error(`privilege id <${privilegeId}> invalid`);
2022-12-21 20:06:04 +00:00
}
}
2022-12-25 20:10:23 +00:00
const privilegies = await PrivilegeModel.find({ privilegeId: requestBody.privilegieIDArray }).lean();
const privilegiesMap = requestBody.privilegieIDArray.reduce<Record<string, Privilege>>((accamulator, privilegeId) => {
const findedPrivilege = privilegies.find((privilege) => privilege.privilegeId === privilegeId);
if (!findedPrivilege) {
return accamulator;
}
accamulator[privilegeId] = findedPrivilege;
2022-12-21 20:06:04 +00:00
return accamulator;
}, {});
const newTariff = new TariffModel({
name: requestBody.name,
price: requestBody.price,
isCustom: requestBody.isCustom,
privilegies: privilegiesMap,
});
await newTariff.save();
return newTariff;
};
export const replaceTariff = async (request: ReplaceTariffRequest, reply: FastifyReply) => {
const [requestBody, error] = validateTariff(request.body || {});
if (error) {
reply.status(400);
return error;
}
if (!Types.ObjectId.isValid(request.params?.id || "")) {
reply.status(400);
return new Error("invalid id");
}
const tariff = await TariffModel.findById(request.params?.id);
if (!tariff) {
reply.status(404);
return new Error("tariff not found");
}
2022-12-25 20:10:23 +00:00
for (const privilegeId of requestBody.privilegieIDArray) {
if (!Types.ObjectId.isValid(privilegeId)) {
2022-12-21 20:06:04 +00:00
reply.status(404);
2022-12-25 20:10:23 +00:00
return new Error(`privilege id <${privilegeId}> invalid`);
2022-12-21 20:06:04 +00:00
}
}
2022-12-25 20:10:23 +00:00
const privilegies = await PrivilegeModel.find({ privilegeId: requestBody.privilegieIDArray }).lean();
const privilegiesMap = requestBody.privilegieIDArray.reduce<Record<string, Privilege>>((accamulator, privilegeId) => {
const findedPrivilege = privilegies.find((privilege) => privilege.privilegeId === privilegeId);
if (!findedPrivilege) {
return accamulator;
2022-12-21 20:06:04 +00:00
}
2022-12-25 20:10:23 +00:00
accamulator[privilegeId] = findedPrivilege;
2022-12-21 20:06:04 +00:00
return accamulator;
}, {});
await tariff.replaceOne({
name: requestBody.name,
price: requestBody.price,
isCustom: requestBody.isCustom,
privilegies: privilegiesMap,
});
return tariff;
};
export const removeTariff = async (request: RemoveTariffRequest, reply: FastifyReply) => {
const [{ id }, error] = validateEmptyFields(request.body || {}, ["id"]);
if (error) {
reply.status(400);
return error;
}
if (!Types.ObjectId.isValid(id)) {
reply.status(400);
return new Error("invalid id");
}
const tariff = await TariffModel.findByIdAndUpdate(id, {
$set: { isDeleted: true, deletedAt: new Date() },
}).lean();
if (!tariff) {
reply.status(404);
return new Error("tariff not found");
}
return tariff;
};
export const deleteTariff = async (request: RemoveTariffRequest, reply: FastifyReply) => {
const [{ id }, error] = validateEmptyFields(request.body || {}, ["id"]);
if (error) {
reply.status(400);
return error;
}
if (!Types.ObjectId.isValid(id)) {
reply.status(400);
return new Error("invalid id");
}
const tariff = await TariffModel.findByIdAndDelete(id).lean();
if (!tariff) {
reply.status(404);
return new Error("tariff not found");
}
return tariff;
};
export const restoreTariff = async (request: RemoveTariffRequest, reply: FastifyReply) => {
const [{ id }, error] = validateEmptyFields(request.body || {}, ["id"]);
if (error) {
reply.status(400);
return error;
}
if (!Types.ObjectId.isValid(id)) {
reply.status(400);
return new Error("invalid id");
}
const tariff = await TariffModel.findByIdAndUpdate(id, { $set: { isDeleted: false } }).lean();
if (!tariff) {
reply.status(404);
return new Error("tariff not found");
}
return tariff;
};