fix: use amount from request

This commit is contained in:
Kirill 2023-06-16 18:55:13 +00:00
parent 866d821d9d
commit 9b212aa529

@ -1,219 +1,230 @@
import { Types } from "mongoose"; import { Types } from "mongoose";
import { TariffModel } from "@/models/tariff.model"; import { TariffModel } from "@/models/tariff.model";
import { PrivilegeModel } from "@/models/privilege.model"; import { PrivilegeModel } from "@/models/privilege.model";
import { validateEmptyFields } from "@/utils/validate-empty-fields"; import { validateEmptyFields } from "@/utils/validate-empty-fields";
import { determinePaginationParameters } from "@/utils/determine-pagination-parameters"; import { determinePaginationParameters } from "@/utils/determine-pagination-parameters";
import { validateTariff } from "./helpers"; import { validateTariff } from "./helpers";
import type { FastifyReply } from "fastify"; import type { FastifyReply } from "fastify";
import type { Privilege } from "@/types/models/privilege.type"; import type { Privilege } from "@/types/models/privilege.type";
import type { Eloquent } from "@/types/models/eloquent.type"; import type { Tariff } from "@/types/models/tariff.type";
import type { import type { Eloquent } from "@/types/models/eloquent.type";
CreateTariffRequest, import type {
GetTariffRequest, CreateTariffRequest,
ReplaceTariffRequest, GetTariffRequest,
RemoveTariffRequest, ReplaceTariffRequest,
GetTariffsResponse, RemoveTariffRequest,
GetTariffsRequest, GetTariffsResponse,
} from "./types"; GetTariffsRequest,
} from "./types";
export const getTariffs = async (request: GetTariffsRequest): Promise<GetTariffsResponse> => {
const { page, limit } = determinePaginationParameters(request?.query ?? {}); export const getTariffs = async (request: GetTariffsRequest): Promise<GetTariffsResponse> => {
const { page, limit } = determinePaginationParameters(request?.query ?? {});
const tariffsCount = await TariffModel.countDocuments();
const tariffsCount = await TariffModel.countDocuments();
const totalPages = Math.ceil(tariffsCount / limit);
const offset = (page - 1) * limit; const totalPages = Math.ceil(tariffsCount / limit);
const offset = (page - 1) * limit;
const tariffs = await TariffModel.find({}).sort({ createdAt: "desc" }).skip(offset).limit(limit).lean();
const tariffs = await TariffModel.find({}).sort({ createdAt: "desc" }).skip(offset).limit(limit).lean();
return { tariffs, totalPages };
}; return { tariffs, totalPages };
};
export const getTariff = async (request: GetTariffRequest, reply: FastifyReply) => {
const [requestParams, error] = validateEmptyFields(request.params ?? {}, ["id"]); export const getTariff = async (request: GetTariffRequest, reply: FastifyReply) => {
const [requestParams, error] = validateEmptyFields(request.params ?? {}, ["id"]);
if (error) {
void reply.status(400); if (error) {
return error; void reply.status(400);
} return error;
}
if (!Types.ObjectId.isValid(requestParams.id)) {
void reply.status(400); if (!Types.ObjectId.isValid(requestParams.id)) {
return new Error("invalid id"); void reply.status(400);
} return new Error("invalid id");
}
const tariff = await TariffModel.findById(requestParams.id).lean();
const tariff = await TariffModel.findById(requestParams.id).lean();
if (!tariff) {
void reply.status(404); if (!tariff) {
return new Error("tariff not found"); void reply.status(404);
} return new Error("tariff not found");
}
return tariff;
}; return tariff;
};
export const createTariff = async (request: CreateTariffRequest, reply: FastifyReply) => {
const [requestBody, error] = validateTariff(request.body); export const createTariff = async (request: CreateTariffRequest, reply: FastifyReply): Promise<Tariff> => {
const [requestBody, error] = validateTariff(request.body);
if (error) {
void reply.status(400); if (error) {
return error; void reply.status(400);
} throw error;
}
for (const privilege of requestBody.privilegies) {
if (!Types.ObjectId.isValid(privilege.privilegeId)) { for (const privilege of requestBody.privilegies) {
void reply.status(404); if (!Types.ObjectId.isValid(privilege.privilegeId)) {
return new Error(`privilege id <${privilege.privilegeId}> invalid`); void reply.status(404);
} throw new Error(`privilege id <${privilege.privilegeId}> invalid`);
} }
}
const privilegeIDs = requestBody.privilegies.map(({ privilegeId }) => privilegeId);
const privilegiesMap = new Map(requestBody.privilegies.map((privilege) => [privilege.privilegeId, privilege]));
const privilegies = await PrivilegeModel.find({ _id: privilegeIDs }).lean(); const privilegeIDs = requestBody.privilegies.map(({ privilegeId }) => privilegeId);
const cleanPrivilegies = privilegies.map<Omit<Privilege, keyof Eloquent>>((privilege) => ({ const privilegies = await PrivilegeModel.find({ privilegeId: privilegeIDs }).lean();
name: privilege.name,
privilegeId: privilege.privilegeId, const cleanPrivilegies = privilegies.map<Omit<Privilege, keyof Eloquent>>((privilege) => {
serviceKey: privilege.serviceKey, const currentPrivilege = privilegiesMap.get(privilege.privilegeId);
description: privilege.description,
amount: privilege.amount, return {
type: privilege.type, name: privilege.name,
value: privilege.value, privilegeId: privilege.privilegeId,
price: privilege.price, serviceKey: privilege.serviceKey,
})); description: privilege.description,
amount: currentPrivilege?.amount ?? 0,
const newTariff = new TariffModel({ type: privilege.type,
name: requestBody.name, value: privilege.value,
price: requestBody.price, price: privilege.price,
isCustom: requestBody.isCustom, };
privilegies: cleanPrivilegies, });
});
const newTariff = new TariffModel({
await newTariff.save(); name: requestBody.name,
price: requestBody.price,
return newTariff; isCustom: requestBody.isCustom,
}; privilegies: cleanPrivilegies,
});
export const replaceTariff = async (request: ReplaceTariffRequest, reply: FastifyReply) => {
const [requestBody, error] = validateTariff(request.body ?? {}); await newTariff.save();
if (error) { return newTariff;
void reply.status(400); };
return error;
} export const replaceTariff = async (request: ReplaceTariffRequest, reply: FastifyReply) => {
const [requestBody, error] = validateTariff(request.body ?? {});
if (!Types.ObjectId.isValid(request.params?.id || "")) {
void reply.status(400); if (error) {
return new Error("invalid id"); void reply.status(400);
} return error;
}
const tariff = await TariffModel.findById(request.params?.id);
if (!Types.ObjectId.isValid(request.params?.id || "")) {
if (!tariff) { void reply.status(400);
void reply.status(404); return new Error("invalid id");
return new Error("tariff not found"); }
}
const tariff = await TariffModel.findById(request.params?.id);
for (const privilege of requestBody.privilegies) {
if (!Types.ObjectId.isValid(privilege.privilegeId)) { if (!tariff) {
void reply.status(404); void reply.status(404);
return new Error(`privilege id <${privilege.privilegeId}> invalid`); return new Error("tariff not found");
} }
}
for (const privilege of requestBody.privilegies) {
const privilegeIDs = requestBody.privilegies.map(({ privilegeId }) => privilegeId); if (!Types.ObjectId.isValid(privilege.privilegeId)) {
void reply.status(404);
const privilegies = await PrivilegeModel.find({ _id: privilegeIDs }).lean(); return new Error(`privilege id <${privilege.privilegeId}> invalid`);
const cleanPrivilegies = privilegies.map<Omit<Privilege, keyof Eloquent>>((privilege) => ({ }
name: privilege.name, }
privilegeId: privilege.privilegeId,
serviceKey: privilege.serviceKey, const privilegiesMap = new Map(requestBody.privilegies.map((privilege) => [privilege.privilegeId, privilege]));
description: privilege.description, const privilegeIDs = requestBody.privilegies.map(({ privilegeId }) => privilegeId);
amount: privilege.amount, const privilegies = await PrivilegeModel.find({ privilegeId: privilegeIDs }).lean();
type: privilege.type,
value: privilege.value, const cleanPrivilegies = privilegies.map<Omit<Privilege, keyof Eloquent>>((privilege) => {
price: privilege.price, const currentPrivilege = privilegiesMap.get(privilege.privilegeId);
}));
return {
await tariff.replaceOne({ name: privilege.name,
name: requestBody.name, privilegeId: privilege.privilegeId,
price: requestBody.price, serviceKey: privilege.serviceKey,
isCustom: requestBody.isCustom, description: privilege.description,
privilegies: cleanPrivilegies, amount: currentPrivilege?.amount ?? 0,
}); type: privilege.type,
value: privilege.value,
return tariff; price: privilege.price,
}; };
});
export const removeTariff = async (request: RemoveTariffRequest, reply: FastifyReply) => {
const [{ id }, error] = validateEmptyFields(request.body ?? {}, ["id"]); await tariff.replaceOne({
name: requestBody.name,
if (error) { price: requestBody.price,
void reply.status(400); isCustom: requestBody.isCustom,
return error; privilegies: cleanPrivilegies,
} });
if (!Types.ObjectId.isValid(id)) { return tariff;
void reply.status(400); };
return new Error("invalid id");
} export const removeTariff = async (request: RemoveTariffRequest, reply: FastifyReply) => {
const [{ id }, error] = validateEmptyFields(request.body ?? {}, ["id"]);
const tariff = await TariffModel.findByIdAndUpdate(id, {
$set: { isDeleted: true, deletedAt: new Date() }, if (error) {
}).lean(); void reply.status(400);
return error;
if (!tariff) { }
void reply.status(404);
return new Error("tariff not found"); if (!Types.ObjectId.isValid(id)) {
} void reply.status(400);
return new Error("invalid id");
return tariff; }
};
const tariff = await TariffModel.findByIdAndUpdate(id, {
export const deleteTariff = async (request: RemoveTariffRequest, reply: FastifyReply) => { $set: { isDeleted: true, deletedAt: new Date() },
const [{ id }, error] = validateEmptyFields(request.body ?? {}, ["id"]); }).lean();
if (error) { if (!tariff) {
void reply.status(400); void reply.status(404);
return error; return new Error("tariff not found");
} }
if (!Types.ObjectId.isValid(id)) { return tariff;
void reply.status(400); };
return new Error("invalid id");
} export const deleteTariff = async (request: RemoveTariffRequest, reply: FastifyReply) => {
const [{ id }, error] = validateEmptyFields(request.body ?? {}, ["id"]);
const tariff = await TariffModel.findByIdAndDelete(id).lean();
if (error) {
if (!tariff) { void reply.status(400);
void reply.status(404); return error;
return new Error("tariff not found"); }
}
if (!Types.ObjectId.isValid(id)) {
return tariff; void reply.status(400);
}; return new Error("invalid id");
}
export const restoreTariff = async (request: RemoveTariffRequest, reply: FastifyReply) => {
const [{ id }, error] = validateEmptyFields(request.body ?? {}, ["id"]); const tariff = await TariffModel.findByIdAndDelete(id).lean();
if (error) { if (!tariff) {
void reply.status(400); void reply.status(404);
return error; return new Error("tariff not found");
} }
if (!Types.ObjectId.isValid(id)) { return tariff;
void reply.status(400); };
return new Error("invalid id");
} export const restoreTariff = async (request: RemoveTariffRequest, reply: FastifyReply) => {
const [{ id }, error] = validateEmptyFields(request.body ?? {}, ["id"]);
const tariff = await TariffModel.findByIdAndUpdate(id, { $set: { isDeleted: false } }).lean();
if (error) {
if (!tariff) { void reply.status(400);
void reply.status(404); return error;
return new Error("tariff not found"); }
}
if (!Types.ObjectId.isValid(id)) {
return tariff; void reply.status(400);
}; return new Error("invalid id");
}
const tariff = await TariffModel.findByIdAndUpdate(id, { $set: { isDeleted: false } }).lean();
if (!tariff) {
void reply.status(404);
return new Error("tariff not found");
}
return tariff;
};