Merge branch 'dev' into 'staging'

Dev

See merge request pena-services/hub_admin_backend_service!40
This commit is contained in:
Mikhail 2023-06-13 15:03:25 +00:00
commit e77860e96e

@ -1,219 +1,212 @@
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 { Eloquent } from "@/types/models/eloquent.type";
import type { import type {
CreateTariffRequest, CreateTariffRequest,
GetTariffRequest, GetTariffRequest,
ReplaceTariffRequest, ReplaceTariffRequest,
RemoveTariffRequest, RemoveTariffRequest,
GetTariffsResponse, GetTariffsResponse,
GetTariffsRequest, GetTariffsRequest,
} from "./types"; } from "./types";
export const getTariffs = async (request: GetTariffsRequest): Promise<GetTariffsResponse> => { export const getTariffs = async (request: GetTariffsRequest): Promise<GetTariffsResponse> => {
const { page, limit } = determinePaginationParameters(request?.query ?? {}); const { page, limit } = determinePaginationParameters(request?.query ?? {});
const tariffsCount = await TariffModel.countDocuments(); const tariffsCount = await TariffModel.countDocuments();
const totalPages = Math.ceil(tariffsCount / limit); const totalPages = Math.ceil(tariffsCount / limit);
const offset = (page - 1) * 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) => { export const getTariff = async (request: GetTariffRequest, reply: FastifyReply) => {
const [requestParams, error] = validateEmptyFields(request.params ?? {}, ["id"]); const [requestParams, error] = validateEmptyFields(request.params ?? {}, ["id"]);
if (error) { if (error) {
void reply.status(400); void reply.status(400);
return error; return error;
} }
if (!Types.ObjectId.isValid(requestParams.id)) { if (!Types.ObjectId.isValid(requestParams.id)) {
void reply.status(400); void reply.status(400);
return new Error("invalid id"); return new Error("invalid id");
} }
const tariff = await TariffModel.findById(requestParams.id).lean(); const tariff = await TariffModel.findById(requestParams.id).lean();
if (!tariff) { if (!tariff) {
void reply.status(404); void reply.status(404);
return new Error("tariff not found"); return new Error("tariff not found");
} }
return tariff; return tariff;
}; };
export const createTariff = async (request: CreateTariffRequest, reply: FastifyReply) => { export const createTariff = async (request: CreateTariffRequest, reply: FastifyReply) => {
const [requestBody, error] = validateTariff(request.body); const [requestBody, error] = validateTariff(request.body);
if (error) { if (error) {
void reply.status(400); void reply.status(400);
return error; return error;
} }
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({ privilegeId: 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 privilegeIDs = requestBody.privilegies.map(({ privilegeId }) => privilegeId); description: privilege.description,
amount: privilege.amount,
const privilegies = await PrivilegeModel.find({ privilegeId: privilegeIDs }).lean(); type: privilege.type,
const cleanPrivilegies = privilegies.map<Omit<Privilege, keyof Eloquent>>((privilege) => ({ value: privilege.value,
name: privilege.name, price: privilege.price,
privilegeId: privilege.privilegeId, }));
serviceKey: privilege.serviceKey,
description: privilege.description, const newTariff = new TariffModel({
amount: privilege.amount, name: requestBody.name,
type: privilege.type, price: requestBody.price,
value: privilege.value, isCustom: requestBody.isCustom,
price: privilege.price, 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({ privilegeId: 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 privilegeIDs = requestBody.privilegies.map(({ privilegeId }) => privilegeId); description: privilege.description,
amount: privilege.amount,
const privilegies = await PrivilegeModel.find({ privilegeId: privilegeIDs }).lean(); type: privilege.type,
const cleanPrivilegies = privilegies.map<Omit<Privilege, keyof Eloquent>>((privilege) => ({ value: privilege.value,
name: privilege.name, price: privilege.price,
privilegeId: privilege.privilegeId, }));
serviceKey: privilege.serviceKey,
description: privilege.description, await tariff.replaceOne({
amount: privilege.amount, name: requestBody.name,
type: privilege.type, price: requestBody.price,
value: privilege.value, isCustom: requestBody.isCustom,
price: privilege.price, privilegies: cleanPrivilegies,
})); });
await tariff.replaceOne({ return tariff;
name: requestBody.name, };
price: requestBody.price,
isCustom: requestBody.isCustom, export const removeTariff = async (request: RemoveTariffRequest, reply: FastifyReply) => {
privilegies: cleanPrivilegies, const [{ id }, error] = validateEmptyFields(request.body ?? {}, ["id"]);
});
if (error) {
return tariff; void reply.status(400);
}; return error;
}
export const removeTariff = async (request: RemoveTariffRequest, reply: FastifyReply) => {
const [{ id }, error] = validateEmptyFields(request.body ?? {}, ["id"]); if (!Types.ObjectId.isValid(id)) {
void reply.status(400);
if (error) { return new Error("invalid id");
void reply.status(400); }
return error;
} const tariff = await TariffModel.findByIdAndUpdate(id, {
$set: { isDeleted: true, deletedAt: new Date() },
if (!Types.ObjectId.isValid(id)) { }).lean();
void reply.status(400);
return new Error("invalid id"); if (!tariff) {
} void reply.status(404);
return new Error("tariff not found");
const tariff = await TariffModel.findByIdAndUpdate(id, { }
$set: { isDeleted: true, deletedAt: new Date() },
}).lean(); return tariff;
};
if (!tariff) {
void reply.status(404); export const deleteTariff = async (request: RemoveTariffRequest, reply: FastifyReply) => {
return new Error("tariff not found"); const [{ id }, error] = validateEmptyFields(request.body ?? {}, ["id"]);
}
if (error) {
return tariff; void reply.status(400);
}; return error;
}
export const deleteTariff = async (request: RemoveTariffRequest, reply: FastifyReply) => {
const [{ id }, error] = validateEmptyFields(request.body ?? {}, ["id"]); if (!Types.ObjectId.isValid(id)) {
void reply.status(400);
if (error) { return new Error("invalid id");
void reply.status(400); }
return error;
} const tariff = await TariffModel.findByIdAndDelete(id).lean();
if (!Types.ObjectId.isValid(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.findByIdAndDelete(id).lean(); return tariff;
};
if (!tariff) {
void reply.status(404); export const restoreTariff = async (request: RemoveTariffRequest, reply: FastifyReply) => {
return new Error("tariff not found"); const [{ id }, error] = validateEmptyFields(request.body ?? {}, ["id"]);
}
if (error) {
return tariff; void reply.status(400);
}; return error;
}
export const restoreTariff = async (request: RemoveTariffRequest, reply: FastifyReply) => {
const [{ id }, error] = validateEmptyFields(request.body ?? {}, ["id"]); if (!Types.ObjectId.isValid(id)) {
void reply.status(400);
if (error) { return new Error("invalid id");
void reply.status(400); }
return error;
} const tariff = await TariffModel.findByIdAndUpdate(id, { $set: { isDeleted: false } }).lean();
if (!Types.ObjectId.isValid(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.findByIdAndUpdate(id, { $set: { isDeleted: false } }).lean(); return tariff;
};
if (!tariff) {
void reply.status(404);
return new Error("tariff not found");
}
return tariff;
};