diff --git a/src/modules/user/controller/getUserByEmail.controller.ts b/src/modules/user/controller/getUserByEmail.controller.ts index e69de29..4f7b63c 100644 --- a/src/modules/user/controller/getUserByEmail.controller.ts +++ b/src/modules/user/controller/getUserByEmail.controller.ts @@ -0,0 +1,18 @@ +import { Context } from "elysia"; +import { getUserByIdSchema } from "../schemas/getUserById.schema"; +import { mainErrorHandler } from "../../../helpers/error/handler"; +import { getUserByEmailService } from "../services/http/getUserByEmail.service"; +import { returnReadResponse } from "../../../helpers/callback/httpResponse"; +import { getUserOptionsSchema } from "../schemas/getUserOptions.schema"; + +export const getUserByEmailController = async (ctx: Context) => { + try { + const params = getUserByIdSchema.parse(ctx.params); + const options = getUserOptionsSchema.parse(ctx.query); + const getUserByEmail = await getUserByEmailService(params.email, options); + + return returnReadResponse(ctx.set, 200, "User data found", getUserByEmail); + } catch (error) { + return mainErrorHandler(ctx.set, error); + } +}; diff --git a/src/modules/user/index.ts b/src/modules/user/index.ts index c834ec5..56170b6 100644 --- a/src/modules/user/index.ts +++ b/src/modules/user/index.ts @@ -1,7 +1,7 @@ import Elysia from "elysia"; import { createUserViaRegisterController } from "./controller/createUserViaRegister.controller"; +import { getUserByEmailController } from "./controller/getUserByEmail.controller"; -export const userModule = new Elysia({ prefix: "/users" }).post( - "/", - createUserViaRegisterController -); +export const userModule = new Elysia({ prefix: "/users" }) + .post("/", createUserViaRegisterController) + .get("/e/:email", getUserByEmailController); diff --git a/src/modules/user/repositories/read/findUserByEmail.repository.ts b/src/modules/user/repositories/read/findUserByEmail.repository.ts index e69de29..322eacd 100644 --- a/src/modules/user/repositories/read/findUserByEmail.repository.ts +++ b/src/modules/user/repositories/read/findUserByEmail.repository.ts @@ -0,0 +1,14 @@ +import { userModel } from "../../user.model"; +import { getUserDataOptions } from "../../user.types"; + +export const findUserByEmailRepository = async ( + email: string, + options: getUserDataOptions +) => { + return await userModel.findUnique({ + where: { + email, + }, + omit: {}, + }); +}; diff --git a/src/modules/user/schemas/checkUserPassword.schema.ts b/src/modules/user/schemas/checkUserPassword.schema.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/modules/user/schemas/editUser.schema.ts b/src/modules/user/schemas/editUser.schema.ts deleted file mode 100644 index 9079ae1..0000000 --- a/src/modules/user/schemas/editUser.schema.ts +++ /dev/null @@ -1,24 +0,0 @@ -import Joi from "joi"; - -export const editUserSchema = Joi.object({ - name: Joi.string() - .min(4) - .max(255), - username: Joi.string() - .min(4) - .max(255), - birthdate: Joi.date(), - gender: Joi.string().valid("male", "female"), - phoneCC: Joi.string() - .min(2) - .max(2), - phoneNumber: Joi.string() - .min(7) - .max(15), - bioProfile: Joi.string().max(300), - deletedAt: Joi.date(), - - // validate in helper - avatar: Joi.any(), - commentBackground: Joi.any(), -}); diff --git a/src/modules/user/schemas/getUserById.schema.ts b/src/modules/user/schemas/getUserById.schema.ts new file mode 100644 index 0000000..17a18a6 --- /dev/null +++ b/src/modules/user/schemas/getUserById.schema.ts @@ -0,0 +1,5 @@ +import z from "zod"; + +export const getUserByIdSchema = z.object({ + email: z.email(), +}); diff --git a/src/modules/user/schemas/getUserOptions.schema.ts b/src/modules/user/schemas/getUserOptions.schema.ts new file mode 100644 index 0000000..6450518 --- /dev/null +++ b/src/modules/user/schemas/getUserOptions.schema.ts @@ -0,0 +1,20 @@ +import z from "zod"; + +const includeEnum = z.enum( + ["preference", "roles"], + "option: include value didn't match with enum types" +); + +export const getUserOptionsSchema = z.object({ + verbosity: z + .enum( + ["exists", "basic", "full"], + "option: verbosity value didn't match with enum types" + ) + .optional(), + include: z.preprocess((val) => { + if (Array.isArray(val)) return val; + if (typeof val === "string") return [val]; + return []; + }, z.array(includeEnum).optional()), +}); diff --git a/src/modules/user/services/http/createUserViaRegister.service.ts b/src/modules/user/services/http/createUserViaRegister.service.ts index 46da8f2..3687e33 100644 --- a/src/modules/user/services/http/createUserViaRegister.service.ts +++ b/src/modules/user/services/http/createUserViaRegister.service.ts @@ -1,7 +1,7 @@ -import { ErrorForwarder } from "../../../helpers/error/instances/forwarder"; -import { hashPassword } from "../../../helpers/security/password/hash"; -import { createUserViaRegisterRepository } from "../repositories/create/createUserViaRegister.repository"; -import { createUserViaRegisterInput } from "../user.types"; +import { ErrorForwarder } from "../../../../helpers/error/instances/forwarder"; +import { hashPassword } from "../../../../helpers/security/password/hash"; +import { createUserViaRegisterRepository } from "../../repositories/create/createUserViaRegister.repository"; +import { createUserViaRegisterInput } from "../../user.types"; export const createUserViaRegisterService = async ( payload: createUserViaRegisterInput diff --git a/src/modules/user/services/http/getUserByEmail.service.ts b/src/modules/user/services/http/getUserByEmail.service.ts new file mode 100644 index 0000000..4ff5636 --- /dev/null +++ b/src/modules/user/services/http/getUserByEmail.service.ts @@ -0,0 +1,8 @@ +import { getUserDataOptions } from "../../user.types"; + +export const getUserByEmailService = async ( + email: string, + options: getUserDataOptions +) => { + return email; +}; diff --git a/src/modules/user/user.types.ts b/src/modules/user/user.types.ts index 996de8f..b0fa55d 100644 --- a/src/modules/user/user.types.ts +++ b/src/modules/user/user.types.ts @@ -5,7 +5,7 @@ export interface getUserDataService { } export interface getUserDataOptions { verbosity?: "exists" | "basic" | "full"; - include?: ("preference" | "role")[]; + include?: ("preference" | "roles")[]; } export interface createUserViaRegisterInput {