From 537c3498b24a714fc6929b41c51c00f11071f63b Mon Sep 17 00:00:00 2001 From: nitesh Date: Tue, 12 Nov 2024 17:50:37 +0530 Subject: [PATCH 1/6] package.json and bun.lock changes --- bun.lockb | Bin 188272 -> 196315 bytes package.json | 1 + 2 files changed, 1 insertion(+) diff --git a/bun.lockb b/bun.lockb index a1514967e2371ace911de890789febab295eb35e..17a6ba766815c42ab9f97cae40ba60a9725af347 100755 GIT binary patch delta 39470 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 WaM!QI%9{#9MSHtVX6a(Dr2hlVsx0aN delta 34507 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 diff --git a/package.json b/package.json index 262348c..6aae745 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ }, "dependencies": { "@hono/zod-openapi": "^0.17.0", + "@node-rs/argon2": "^2.0.0", "@oslojs/crypto": "^1.0.1", "@oslojs/encoding": "^1.1.0", "@scalar/hono-api-reference": "^0.5.159", From 06236e5bbea887b3ae34e5d28098af1425e68181 Mon Sep 17 00:00:00 2001 From: nitesh Date: Thu, 14 Nov 2024 21:44:59 +0530 Subject: [PATCH 2/6] Create Group changes --- src/app.ts | 3 +- src/modules/group/group.handler.ts | 47 +++++++++++++++++++ src/modules/group/group.index.ts | 7 +++ src/modules/group/group.repository.ts | 15 ++++++ src/modules/group/group.routes.ts | 66 +++++++++++++++++++++++++++ 5 files changed, 137 insertions(+), 1 deletion(-) create mode 100644 src/modules/group/group.handler.ts create mode 100644 src/modules/group/group.index.ts create mode 100644 src/modules/group/group.repository.ts create mode 100644 src/modules/group/group.routes.ts diff --git a/src/app.ts b/src/app.ts index 2ef2552..ba3c751 100644 --- a/src/app.ts +++ b/src/app.ts @@ -2,11 +2,12 @@ import { configureOpenAPI } from "./common/lib/configure-open-api.lib"; import { createApp } from "./common/lib/create-app.lib"; import { authRouter } from "./modules/auth/auth.index"; import { categoryRouter } from "./modules/categories/category.index"; +import { groupRouters } from "./modules/group/group.index"; import { healthCheckRouter } from "./modules/health-check/health-check.index"; export const app = createApp(); -const routesV1 = [authRouter, categoryRouter]; +const routesV1 = [authRouter, categoryRouter, groupRouters]; configureOpenAPI(app); diff --git a/src/modules/group/group.handler.ts b/src/modules/group/group.handler.ts new file mode 100644 index 0000000..04b46f8 --- /dev/null +++ b/src/modules/group/group.handler.ts @@ -0,0 +1,47 @@ +import type { AppRouteHandler } from "@/common/lib/types"; +import type { TSelectGroupSchema } from "@/db/schemas/group.model"; + +import * as HTTPStatusCodes from "@/common/utils/http-status-codes.util"; + +import type { TCreateGroupRoute } from "./group.routes"; + +import { createGroupRepository } from "./group.repository"; + +export const createGroup: AppRouteHandler = async ( + c, +) => { + const user = c.get("user"); + const payload = c.req.valid("json"); + + if (!user) { + return c.json( + { + success: false, + message: "You are not authorized, please login", + }, + HTTPStatusCodes.UNAUTHORIZED, + ); + } + + let group: TSelectGroupSchema | null = null; + group = await createGroupRepository(payload); + + if (!group) { + return c.json( + { + success: false, + message: "Failed to create group", + }, + HTTPStatusCodes.INTERNAL_SERVER_ERROR, + ); + } + + return c.json( + { + success: true, + message: "Group created successfully", + data: group, + }, + HTTPStatusCodes.CREATED, + ); +}; diff --git a/src/modules/group/group.index.ts b/src/modules/group/group.index.ts new file mode 100644 index 0000000..03a94f3 --- /dev/null +++ b/src/modules/group/group.index.ts @@ -0,0 +1,7 @@ +import { createRouter } from "@/common/lib/create-app.lib"; + +import * as handlers from "./group.handler"; +import * as routes from "./group.routes"; + +export const groupRouters = createRouter() + .openapi(routes.createGroupRoute, handlers.createGroup); diff --git a/src/modules/group/group.repository.ts b/src/modules/group/group.repository.ts new file mode 100644 index 0000000..24abb37 --- /dev/null +++ b/src/modules/group/group.repository.ts @@ -0,0 +1,15 @@ +import type { TInsertGroupSchema } from "@/db/schemas/group.model"; + +import { db } from "@/db/adapter"; +import groupModel from "@/db/schemas/group.model"; + +export async function createGroupRepository( + groupPayload: TInsertGroupSchema, +) { + const [group] = await db + .insert(groupModel) + .values(groupPayload) + .returning(); + + return group; +} diff --git a/src/modules/group/group.routes.ts b/src/modules/group/group.routes.ts new file mode 100644 index 0000000..8ac4f6e --- /dev/null +++ b/src/modules/group/group.routes.ts @@ -0,0 +1,66 @@ +import { createRoute } from "@hono/zod-openapi"; +import { z } from "zod"; + +import { AuthRoles } from "@/common/enums"; +import jsonContentRequired from "@/common/helpers/json-content-required.helper"; +import { jsonContent } from "@/common/helpers/json-content.helper"; +import { authMiddleware, checkRoleGuard, requireAuth } from "@/common/middlewares/auth.middleware"; +import * as HTTPStatusCodes from "@/common/utils/http-status-codes.util"; +import { insertGroupSchema, selectGroupSchema } from "@/db/schemas/group.model"; + +const tags = ["Groups"]; + +export const createGroupRoute = createRoute({ + tags, + method: "post", + path: "/groups", + middleware: [ + authMiddleware(), + requireAuth(), + checkRoleGuard(AuthRoles.ADMIN, AuthRoles.USER), + ] as const, + request: { + body: jsonContentRequired( + insertGroupSchema.omit({ + id: true, + status: true, + createdAt: true, + updatedAt: true, + }), + "Group creation", + ), + }, + responses: { + [HTTPStatusCodes.CREATED]: jsonContent( + z.object({ + success: z.boolean().default(true), + message: z.string(), + data: selectGroupSchema, + }), + "Group created successfully", + ), + [HTTPStatusCodes.BAD_REQUEST]: jsonContent( + z.object({ + success: z.boolean().default(false), + message: z.string(), + }), + "Validation error(s)", + ), + [HTTPStatusCodes.UNAUTHORIZED]: jsonContent( + z.object({ + success: z.boolean().default(false), + message: z.string(), + }), + "You are not authorized, please login", + ), + [HTTPStatusCodes.INTERNAL_SERVER_ERROR]: jsonContent( + z.object({ + success: z.boolean().default(false), + message: z.string(), + }), + "Failed to create the group", + ), + }, +}); + +export type TCreateGroupRoute = typeof createGroupRoute; From 299a845276b359f446525090d361ca5f7cfb9fc8 Mon Sep 17 00:00:00 2001 From: nitesh Date: Fri, 15 Nov 2024 09:34:35 +0530 Subject: [PATCH 3/6] Delete Group changes --- src/modules/group/group.handler.ts | 44 ++++++++++++++++++--- src/modules/group/group.index.ts | 3 +- src/modules/group/group.repository.ts | 13 +++++++ src/modules/group/group.routes.ts | 56 ++++++++++++++++++++++++++- 4 files changed, 109 insertions(+), 7 deletions(-) diff --git a/src/modules/group/group.handler.ts b/src/modules/group/group.handler.ts index 04b46f8..537478f 100644 --- a/src/modules/group/group.handler.ts +++ b/src/modules/group/group.handler.ts @@ -3,13 +3,11 @@ import type { TSelectGroupSchema } from "@/db/schemas/group.model"; import * as HTTPStatusCodes from "@/common/utils/http-status-codes.util"; -import type { TCreateGroupRoute } from "./group.routes"; +import type { TCreateGroupRoute, TDeleteGroupRoute } from "./group.routes"; -import { createGroupRepository } from "./group.repository"; +import { createGroupRepository, deleteGroupRepository } from "./group.repository"; -export const createGroup: AppRouteHandler = async ( - c, -) => { +export const createGroup: AppRouteHandler = async (c) => { const user = c.get("user"); const payload = c.req.valid("json"); @@ -45,3 +43,39 @@ export const createGroup: AppRouteHandler = async ( HTTPStatusCodes.CREATED, ); }; + +export const deleteGroup: AppRouteHandler = async (c) => { + const user = c.get("user"); + const params = c.req.valid("param"); + + if (!user) { + return c.json( + { + success: false, + message: "You are not authorized, please login", + }, + HTTPStatusCodes.UNAUTHORIZED, + ); + } + + let deletedGroupId: string | null = null; + deletedGroupId = await deleteGroupRepository(params.id); + + if (!deletedGroupId) { + return c.json( + { + success: false, + message: `Group with ${params.id} not found`, + }, + HTTPStatusCodes.NOT_FOUND, + ); + } + + return c.json( + { + success: true, + message: `Group with ${deletedGroupId} deleted successfully`, + }, + HTTPStatusCodes.OK, + ); +}; diff --git a/src/modules/group/group.index.ts b/src/modules/group/group.index.ts index 03a94f3..dee2e31 100644 --- a/src/modules/group/group.index.ts +++ b/src/modules/group/group.index.ts @@ -4,4 +4,5 @@ import * as handlers from "./group.handler"; import * as routes from "./group.routes"; export const groupRouters = createRouter() - .openapi(routes.createGroupRoute, handlers.createGroup); + .openapi(routes.createGroupRoute, handlers.createGroup) + .openapi(routes.deleteGroupRoute, handlers.deleteGroup); diff --git a/src/modules/group/group.repository.ts b/src/modules/group/group.repository.ts index 24abb37..4ca8269 100644 --- a/src/modules/group/group.repository.ts +++ b/src/modules/group/group.repository.ts @@ -1,3 +1,5 @@ +import { eq } from "drizzle-orm"; + import type { TInsertGroupSchema } from "@/db/schemas/group.model"; import { db } from "@/db/adapter"; @@ -13,3 +15,14 @@ export async function createGroupRepository( return group; } + +export async function deleteGroupRepository( + groupId: string, +) { + const [deletedGroups] = await db + .delete(groupModel) + .where(eq(groupModel.id, groupId)) + .returning(); + + return deletedGroups?.id || null; +} diff --git a/src/modules/group/group.routes.ts b/src/modules/group/group.routes.ts index 8ac4f6e..b81341d 100644 --- a/src/modules/group/group.routes.ts +++ b/src/modules/group/group.routes.ts @@ -13,7 +13,7 @@ const tags = ["Groups"]; export const createGroupRoute = createRoute({ tags, method: "post", - path: "/groups", + path: "/group", middleware: [ authMiddleware(), requireAuth(), @@ -63,4 +63,58 @@ export const createGroupRoute = createRoute({ }, }); +export const deleteGroupRoute = createRoute({ + tags, + method: "delete", + path: "group/:id", + middleware: [ + authMiddleware(), + requireAuth(), + checkRoleGuard(AuthRoles.ADMIN, AuthRoles.USER), + ] as const, + request: { + params: z.object({ + id: z.string(), + }), + }, + responses: { + [HTTPStatusCodes.OK]: jsonContent( + z.object({ + success: z.boolean().default(true), + message: z.string(), + }), + "Group deleted successfully", + ), + [HTTPStatusCodes.NOT_FOUND]: jsonContent( + z.object({ + success: z.boolean().default(false), + message: z.string(), + }), + "Group with id does not exist", + ), + [HTTPStatusCodes.UNAUTHORIZED]: jsonContent( + z.object({ + success: z.boolean().default(false), + message: z.string(), + }), + "You are not authorized, please login", + ), + [HTTPStatusCodes.FORBIDDEN]: jsonContent( + z.object({ + success: z.boolean().default(false), + message: z.string(), + }), + "You are not allowed to perform this action", + ), + [HTTPStatusCodes.INTERNAL_SERVER_ERROR]: jsonContent( + z.object({ + success: z.boolean().default(false), + message: z.string(), + }), + "Something went wrong, please try again later", + ), + }, +}); + export type TCreateGroupRoute = typeof createGroupRoute; +export type TDeleteGroupRoute = typeof deleteGroupRoute; From a634f5c28bee5bf979ce80693f24c6f3d5a55d8c Mon Sep 17 00:00:00 2001 From: nitesh Date: Fri, 15 Nov 2024 15:10:12 +0530 Subject: [PATCH 4/6] logger addition and let-> const review changes --- src/modules/group/group.handler.ts | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/modules/group/group.handler.ts b/src/modules/group/group.handler.ts index 537478f..a180038 100644 --- a/src/modules/group/group.handler.ts +++ b/src/modules/group/group.handler.ts @@ -10,8 +10,10 @@ import { createGroupRepository, deleteGroupRepository } from "./group.repository export const createGroup: AppRouteHandler = async (c) => { const user = c.get("user"); const payload = c.req.valid("json"); + const logger = c.get("logger"); if (!user) { + logger.debug("User is not authorized to create group"); return c.json( { success: false, @@ -21,10 +23,10 @@ export const createGroup: AppRouteHandler = async (c) => { ); } - let group: TSelectGroupSchema | null = null; - group = await createGroupRepository(payload); + const group: TSelectGroupSchema | null = await createGroupRepository(payload); if (!group) { + logger.debug("Failed to create group"); return c.json( { success: false, @@ -34,6 +36,8 @@ export const createGroup: AppRouteHandler = async (c) => { ); } + logger.debug(`Group created successfully with name ${group.name}`); + return c.json( { success: true, @@ -47,8 +51,10 @@ export const createGroup: AppRouteHandler = async (c) => { export const deleteGroup: AppRouteHandler = async (c) => { const user = c.get("user"); const params = c.req.valid("param"); + const logger = c.get("logger"); if (!user) { + logger.debug("User is not authorized to delete group"); return c.json( { success: false, @@ -58,10 +64,10 @@ export const deleteGroup: AppRouteHandler = async (c) => { ); } - let deletedGroupId: string | null = null; - deletedGroupId = await deleteGroupRepository(params.id); + const deletedGroupId: string | null = await deleteGroupRepository(params.id); if (!deletedGroupId) { + logger.debug(`Group with ${params.id} not found`); return c.json( { success: false, @@ -71,6 +77,8 @@ export const deleteGroup: AppRouteHandler = async (c) => { ); } + logger.debug(`Group with ${deletedGroupId} deleted successfully`); + return c.json( { success: true, From 3814682b64adbb6bf733b11b3fedc131b9d9086c Mon Sep 17 00:00:00 2001 From: nitesh Date: Fri, 15 Nov 2024 19:18:44 +0530 Subject: [PATCH 5/6] error debugger addition --- src/modules/group/group.handler.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/modules/group/group.handler.ts b/src/modules/group/group.handler.ts index a180038..fb077b6 100644 --- a/src/modules/group/group.handler.ts +++ b/src/modules/group/group.handler.ts @@ -13,7 +13,7 @@ export const createGroup: AppRouteHandler = async (c) => { const logger = c.get("logger"); if (!user) { - logger.debug("User is not authorized to create group"); + logger.error("User is not authorized to create group"); return c.json( { success: false, @@ -26,7 +26,7 @@ export const createGroup: AppRouteHandler = async (c) => { const group: TSelectGroupSchema | null = await createGroupRepository(payload); if (!group) { - logger.debug("Failed to create group"); + logger.error("Failed to create group"); return c.json( { success: false, @@ -54,7 +54,7 @@ export const deleteGroup: AppRouteHandler = async (c) => { const logger = c.get("logger"); if (!user) { - logger.debug("User is not authorized to delete group"); + logger.error("User is not authorized to delete group"); return c.json( { success: false, @@ -67,7 +67,7 @@ export const deleteGroup: AppRouteHandler = async (c) => { const deletedGroupId: string | null = await deleteGroupRepository(params.id); if (!deletedGroupId) { - logger.debug(`Group with ${params.id} not found`); + logger.error(`Group with ${params.id} not found`); return c.json( { success: false, From a505fdfab6f77f79801154a3ec87e75a0b6806c8 Mon Sep 17 00:00:00 2001 From: nitesh Date: Fri, 15 Nov 2024 19:22:25 +0530 Subject: [PATCH 6/6] upadted package.json --- package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package.json b/package.json index 6b1353f..dc53445 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,6 @@ }, "dependencies": { "@hono/zod-openapi": "^0.17.0", - "@node-rs/argon2": "^2.0.0", "@oslojs/crypto": "^1.0.1", "@oslojs/encoding": "^1.1.0", "@scalar/hono-api-reference": "^0.5.159",