From e9b02dea08bffb6f84f29eb2c78949e599cca2b6 Mon Sep 17 00:00:00 2001 From: Kirill Date: Sun, 25 Dec 2022 20:28:47 +0000 Subject: [PATCH] feat(tariff/privilege): remove handlers & docs --- src/handlers/account/index.ts | 54 +++++++++++++++++++++++ src/handlers/privilege/index.ts | 58 +++++++++++++++++++++++-- src/handlers/privilege/types.ts | 6 +++ src/handlers/tariff/index.ts | 73 +++++++++++++++++++++++++++++++- src/handlers/tariff/types.ts | 6 +++ src/routes/account.routes.ts | 25 +++++++++-- src/routes/privilege.routes.ts | 3 ++ src/routes/tariff.routes.ts | 25 +++++++++-- src/swagger/account/index.ts | 32 +++++++++++++- src/swagger/account/responses.ts | 7 +++ src/swagger/privilege/index.ts | 7 +++ src/swagger/tariff/index.ts | 35 ++++++++++++++- src/swagger/tariff/responses.ts | 9 ++++ 13 files changed, 327 insertions(+), 13 deletions(-) diff --git a/src/handlers/account/index.ts b/src/handlers/account/index.ts index 5dea59c..9999a27 100644 --- a/src/handlers/account/index.ts +++ b/src/handlers/account/index.ts @@ -81,3 +81,57 @@ export const setAccountRole = async (request: SetAccountRoleRequest, reply: Fast return account; }; + +export const removeAccount = async (request: FastifyRequest, reply: FastifyReply) => { + if (!Types.ObjectId.isValid(request.user.id)) { + reply.status(400); + return new Error("invalid user id"); + } + + const account = await AccountModel.findOneAndUpdate( + { userId: request.user.id }, + { $set: { isDeleted: true, deletedAt: new Date() } } + ).lean(); + + if (!account) { + reply.status(404); + return new Error("account not found"); + } + + return account; +}; + +export const deleteAccount = async (request: FastifyRequest, reply: FastifyReply) => { + if (!Types.ObjectId.isValid(request.user.id)) { + reply.status(400); + return new Error("invalid user id"); + } + + const account = await AccountModel.findByIdAndDelete({ userId: request.user.id }).lean(); + + if (!account) { + reply.status(404); + return new Error("account not found"); + } + + return account; +}; + +export const restoreAccount = async (request: FastifyRequest, reply: FastifyReply) => { + if (!Types.ObjectId.isValid(request.user.id)) { + reply.status(400); + return new Error("invalid user id"); + } + + const account = await AccountModel.findOneAndUpdate( + { userId: request.user.id }, + { $set: { isDeleted: false } } + ).lean(); + + if (!account) { + reply.status(404); + return new Error("account not found"); + } + + return account; +}; diff --git a/src/handlers/privilege/index.ts b/src/handlers/privilege/index.ts index 9fa82d4..d57d865 100644 --- a/src/handlers/privilege/index.ts +++ b/src/handlers/privilege/index.ts @@ -11,6 +11,7 @@ import type { RegisterPrivilegeRequest, GetPrivilegeRequest, RegisterPrivilegiesRequest, + RemovePrivilegeRequest, } from "./types"; export const registerPrivilegies = async (request: RegisterPrivilegiesRequest, reply: FastifyReply) => { @@ -182,6 +183,32 @@ export const replacePrivilege = async (request: RegisterPrivilegeRequest, reply: updatedAt: new Date(), }); + return Promise.all(replacePrivilegeRequests); +}; + +export const removePrivilege = async (request: GetPrivilegeRequest, reply: FastifyReply) => { + const [requestParams, error] = validateEmptyFields(request.params || {}, ["privilegeId"]); + + if (error) { + reply.status(400); + return error; + } + + if (!Types.ObjectId.isValid(requestParams.privilegeId)) { + reply.status(400); + return new Error("invalid id"); + } + + const privilege = await PrivilegeModel.findOneAndUpdate( + { privilegeId: requestParams.privilegeId }, + { $set: { isDeleted: true, deletedAt: new Date() } } + ); + + if (!privilege) { + reply.status(404); + return new Error("privilege not found"); + } + return privilege; }; @@ -229,21 +256,21 @@ export const replacePrivilegies = async (request: RegisterPrivilegiesRequest, re return Promise.all(replacePrivilegeRequests); }; -export const removePrivilege = async (request: GetPrivilegeRequest, reply: FastifyReply) => { - const [requestParams, error] = validateEmptyFields(request.params || {}, ["privilegeId"]); +export const removePrivilege = async (request: RemovePrivilegeRequest, reply: FastifyReply) => { + const [{ privilegeId }, error] = validateEmptyFields(request.body || {}, ["privilegeId"]); if (error) { reply.status(400); return error; } - if (!Types.ObjectId.isValid(requestParams.privilegeId)) { + if (!Types.ObjectId.isValid(privilegeId)) { reply.status(400); return new Error("invalid id"); } const privilege = await PrivilegeModel.findOneAndUpdate( - { privilegeId: requestParams.privilegeId }, + { privilegeId }, { $set: { isDeleted: true, deletedAt: new Date() } } ); @@ -254,3 +281,26 @@ export const removePrivilege = async (request: GetPrivilegeRequest, reply: Fasti return privilege; }; + +export const restorePrivilege = async (request: RemovePrivilegeRequest, reply: FastifyReply) => { + const [{ privilegeId }, error] = validateEmptyFields(request.body || {}, ["privilegeId"]); + + if (error) { + reply.status(400); + return error; + } + + if (!Types.ObjectId.isValid(privilegeId)) { + reply.status(400); + return new Error("invalid id"); + } + + const privilege = await PrivilegeModel.findOneAndUpdate({ privilegeId }, { $set: { isDeleted: false } }); + + if (!privilege) { + reply.status(404); + return new Error("privilege not found"); + } + + return privilege; +}; diff --git a/src/handlers/privilege/types.ts b/src/handlers/privilege/types.ts index 4d9d533..9d12026 100644 --- a/src/handlers/privilege/types.ts +++ b/src/handlers/privilege/types.ts @@ -31,3 +31,9 @@ export type GetPrivilegeRequest = FastifyRequest<{ privilegeId?: string; }; }>; + +export type RemovePrivilegeRequest = FastifyRequest<{ + Body?: { + privilegeId?: string; + }; +}>; diff --git a/src/handlers/tariff/index.ts b/src/handlers/tariff/index.ts index c5a2a92..575fe25 100644 --- a/src/handlers/tariff/index.ts +++ b/src/handlers/tariff/index.ts @@ -9,7 +9,7 @@ import { validateTariff } from "./helpers"; import type { FastifyReply } from "fastify"; import type { Privilege } from "@/types/models/privilege.type"; -import type { CreateTariffRequest, GetTariffRequest, ReplaceTariffRequest } from "./types"; +import type { CreateTariffRequest, GetTariffRequest, ReplaceTariffRequest, RemoveTariffRequest } from "./types"; export const getTariffs = async () => TariffModel.find({}).lean(); @@ -127,3 +127,74 @@ export const replaceTariff = async (request: ReplaceTariffRequest, reply: Fastif 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; +}; diff --git a/src/handlers/tariff/types.ts b/src/handlers/tariff/types.ts index b2f73c1..d521405 100644 --- a/src/handlers/tariff/types.ts +++ b/src/handlers/tariff/types.ts @@ -7,6 +7,12 @@ export type GetTariffRequest = FastifyRequest<{ }; }>; +export type RemoveTariffRequest = FastifyRequest<{ + Body?: { + id?: string; + }; +}>; + export type CreateTariffRequest = FastifyRequest<{ Body?: TariffMessage; }>; diff --git a/src/routes/account.routes.ts b/src/routes/account.routes.ts index 355bcaa..fc992c2 100644 --- a/src/routes/account.routes.ts +++ b/src/routes/account.routes.ts @@ -1,13 +1,32 @@ import { Router } from "@/server/router"; -import { createAccount, getAccount, setAccountRole, getAllAccounts } from "@/handlers/account"; +import { + createAccount, + getAccount, + setAccountRole, + getAllAccounts, + deleteAccount, + removeAccount, + restoreAccount, +} from "@/handlers/account"; import { verifyUser } from "@/handlers/auth/middleware"; -import { createAccountSchema, getAccountSchema, setAccountRoleSchema, getAccountsSchema } from "@/swagger/account"; +import { + createAccountSchema, + getAccountSchema, + setAccountRoleSchema, + getAccountsSchema, + removeAccountSchema, + restoreAccountSchema, + deleteAccountSchema, +} from "@/swagger/account"; export const setAccountRoutes = (router: Router): void => { router.get("/", getAllAccounts, { schema: getAccountsSchema }); router.get("/:userId", getAccount, { schema: getAccountSchema }); router.post("/", createAccount, { preHandler: [verifyUser], schema: createAccountSchema }); - router.post("/role", setAccountRole, { preHandler: [verifyUser], schema: setAccountRoleSchema }); + router.post("/restore", restoreAccount, { preHandler: [verifyUser], schema: restoreAccountSchema }); + router.patch("/role", setAccountRole, { preHandler: [verifyUser], schema: setAccountRoleSchema }); + router.delete("/", removeAccount, { preHandler: [verifyUser], schema: removeAccountSchema }); + router.delete("/delete", deleteAccount, { preHandler: [verifyUser], schema: deleteAccountSchema }); }; diff --git a/src/routes/privilege.routes.ts b/src/routes/privilege.routes.ts index 3be9da2..d9dbfa0 100644 --- a/src/routes/privilege.routes.ts +++ b/src/routes/privilege.routes.ts @@ -10,6 +10,7 @@ import { registerPrivilegies, removePrivilege, replacePrivilegies, + restorePrivilege, } from "@/handlers/privilege"; import { @@ -22,6 +23,7 @@ import { replacePrivilegeSchema, replacePrivilegiesSchema, removePrivilegeSchema, + restorePrivilegeSchema, } from "@/swagger/privilege"; export const setPrivilegeRoutes = (router: Router): void => { @@ -31,6 +33,7 @@ export const setPrivilegeRoutes = (router: Router): void => { router.get("/service/:serviceKey", getServicePrivilegies, { schema: getServicePrivilegiesSchema }); router.post("/", registerPrivilege, { schema: registerPrivilegeSchema }); router.post("/many", registerPrivilegies, { schema: registerPrivilegiesSchema }); + router.post("/restore/", restorePrivilege, { schema: restorePrivilegeSchema }); router.put("/", replacePrivilege, { schema: replacePrivilegeSchema }); router.put("/many", replacePrivilegies, { schema: replacePrivilegiesSchema }); router.delete("/", removePrivilege, { schema: removePrivilegeSchema }); diff --git a/src/routes/tariff.routes.ts b/src/routes/tariff.routes.ts index 96946ce..645af9f 100644 --- a/src/routes/tariff.routes.ts +++ b/src/routes/tariff.routes.ts @@ -1,13 +1,32 @@ import { Router } from "@/server/router"; -import { createTariff, replaceTariff, getTariff, getTariffs } from "@/handlers/tariff"; +import { + createTariff, + replaceTariff, + getTariff, + getTariffs, + removeTariff, + restoreTariff, + deleteTariff, +} from "@/handlers/tariff"; import { verifyUser } from "@/handlers/auth/middleware"; -import { getTariffSchema, getTariffsSchema, createTariffsSchema, replaceTariffsSchema } from "@/swagger/tariff"; +import { + getTariffSchema, + getTariffsSchema, + createTariffsSchema, + replaceTariffsSchema, + removeTariffsSchema, + restoreTariffsSchema, + deleteTariffsSchema, +} from "@/swagger/tariff"; export const setTariffRoutes = (router: Router): void => { - router.get("/:id", getTariff, { schema: getTariffSchema }); router.get("/", getTariffs, { schema: getTariffsSchema }); + router.get("/:id", getTariff, { schema: getTariffSchema }); router.post("/", createTariff, { preHandler: [verifyUser], schema: createTariffsSchema }); + router.post("/restore", restoreTariff, { preHandler: [verifyUser], schema: restoreTariffsSchema }); router.put("/:id", replaceTariff, { preHandler: [verifyUser], schema: replaceTariffsSchema }); + router.delete("/", removeTariff, { preHandler: [verifyUser], schema: removeTariffsSchema }); + router.delete("/delete", deleteTariff, { preHandler: [verifyUser], schema: deleteTariffsSchema }); }; diff --git a/src/swagger/account/index.ts b/src/swagger/account/index.ts index 0cc8b1a..cf9730b 100644 --- a/src/swagger/account/index.ts +++ b/src/swagger/account/index.ts @@ -1,5 +1,11 @@ import { getAccountParams, setAccountRoleBody } from "./inputs"; -import { getAccountResponse, createAccountResponse, setAccountRoleResponse, getAccountsResponse } from "./responses"; +import { + getAccountResponse, + createAccountResponse, + setAccountRoleResponse, + getAccountsResponse, + removeRoleResponse, +} from "./responses"; import type { SwaggerSchema } from "@/types/swagger.type"; @@ -32,3 +38,27 @@ export const setAccountRoleSchema: SwaggerSchema = { response: setAccountRoleResponse, security: [{ bearer: [] }], }; + +export const removeAccountSchema: SwaggerSchema = { + summary: "Удаление аккаунта", + description: "Помечает аккаунт удалённым, но не удаляет его из БД", + tags: ["account"], + response: removeRoleResponse, + security: [{ bearer: [] }], +}; + +export const deleteAccountSchema: SwaggerSchema = { + summary: "Удаление аккаунта", + description: "Удаляет аккаунт из БД окончательно", + tags: ["account"], + response: removeRoleResponse, + security: [{ bearer: [] }], +}; + +export const restoreAccountSchema: SwaggerSchema = { + summary: "Восстановление аккаунта", + description: "Восстанавливает аккаунт, который не был удалён окончательно", + tags: ["account"], + response: removeRoleResponse, + security: [{ bearer: [] }], +}; diff --git a/src/swagger/account/responses.ts b/src/swagger/account/responses.ts index 8dcf95e..54ae070 100644 --- a/src/swagger/account/responses.ts +++ b/src/swagger/account/responses.ts @@ -31,3 +31,10 @@ export const setAccountRoleResponse: Record = { 401: swaggerError(401, "invalid token"), 404: swaggerError(404, "user not found"), }; + +export const removeRoleResponse: Record = { + 200: account, + 400: swaggerError(400, "invalid user id"), + 401: swaggerError(401, "invalid token"), + 404: swaggerError(404, "user not found"), +}; diff --git a/src/swagger/privilege/index.ts b/src/swagger/privilege/index.ts index d26c44b..caaf5fd 100644 --- a/src/swagger/privilege/index.ts +++ b/src/swagger/privilege/index.ts @@ -75,3 +75,10 @@ export const removePrivilegeSchema: SwaggerSchema = { body: getPrivilegeParams, response: removePrivilegeResponse, }; + +export const restorePrivilegeSchema: SwaggerSchema = { + summary: "Восстановление привилегии", + tags: ["privilege"], + body: getPrivilegeParams, + response: removePrivilegeResponse, +}; diff --git a/src/swagger/tariff/index.ts b/src/swagger/tariff/index.ts index 6684998..0d8de50 100644 --- a/src/swagger/tariff/index.ts +++ b/src/swagger/tariff/index.ts @@ -1,5 +1,11 @@ import { getTariffParams, tariffBody, replaceTariffParams } from "./inputs"; -import { getTariffReponse, getTariffsReponse, createTariffReponse, replaceTariffReponse } from "./responses"; +import { + getTariffReponse, + getTariffsReponse, + createTariffReponse, + replaceTariffReponse, + removeTariffReponse, +} from "./responses"; import type { SwaggerSchema } from "@/types/swagger.type"; @@ -23,6 +29,7 @@ export const createTariffsSchema: SwaggerSchema = { security: [{ bearer: [] }], response: createTariffReponse, }; + export const replaceTariffsSchema: SwaggerSchema = { summary: "Замена тарифа", tags: ["tariff"], @@ -31,3 +38,29 @@ export const replaceTariffsSchema: SwaggerSchema = { security: [{ bearer: [] }], response: replaceTariffReponse, }; + +export const removeTariffsSchema: SwaggerSchema = { + summary: "Удаление тарифа", + description: "Помечает тариф удалённым, но не удаляет его из БД", + tags: ["tariff"], + body: getTariffParams, + security: [{ bearer: [] }], + response: removeTariffReponse, +}; + +export const deleteTariffsSchema: SwaggerSchema = { + summary: "Удаление тарифа", + description: "Удаляет тариф из БД окончательно", + tags: ["tariff"], + body: getTariffParams, + security: [{ bearer: [] }], + response: removeTariffReponse, +}; + +export const restoreTariffsSchema: SwaggerSchema = { + summary: "Восстановление тарифа", + tags: ["tariff"], + body: getTariffParams, + security: [{ bearer: [] }], + response: removeTariffReponse, +}; diff --git a/src/swagger/tariff/responses.ts b/src/swagger/tariff/responses.ts index c2039a2..ead2bc7 100644 --- a/src/swagger/tariff/responses.ts +++ b/src/swagger/tariff/responses.ts @@ -21,11 +21,20 @@ export const getTariffsReponse: Record = { export const createTariffReponse: Record = { 200: tariff, 400: swaggerError(400, "invalid 'price' value"), + 401: swaggerError(400, "invalid user id"), 404: swaggerError(404, "privilege with id not found"), }; export const replaceTariffReponse: Record = { 200: tariff, 400: swaggerError(400, "invalid id"), + 401: swaggerError(400, "invalid user id"), + 404: swaggerError(404, "tariff not found"), +}; + +export const removeTariffReponse: Record = { + 200: tariff, + 400: swaggerError(400, "invalid id"), + 401: swaggerError(400, "invalid user id"), 404: swaggerError(404, "tariff not found"), };