From 487a4c0747e253338a9b90dd73970568d78c3a6b Mon Sep 17 00:00:00 2001 From: OfrenDialsa Date: Fri, 12 Dec 2025 23:49:00 +0700 Subject: [PATCH] major fix: conflicted joi --- .../authentications/swagger/authentication.js | 10 ++ .../http/api/comments/swagger/comments.js | 48 +++++--- .../http/api/likes/swagger/likes.js | 10 ++ .../http/api/replies/swagger/replies.js | 11 ++ src/Interfaces/http/api/threads/handler.js | 114 ++++++++++-------- .../http/api/threads/swagger/threads.js | 41 ++++--- .../http/api/users/swagger/users.js | 12 +- 7 files changed, 163 insertions(+), 83 deletions(-) diff --git a/src/Interfaces/http/api/authentications/swagger/authentication.js b/src/Interfaces/http/api/authentications/swagger/authentication.js index 7dabbcf..5c5b3ef 100644 --- a/src/Interfaces/http/api/authentications/swagger/authentication.js +++ b/src/Interfaces/http/api/authentications/swagger/authentication.js @@ -11,6 +11,16 @@ const postAuthentication = { username: Joi.string().required().description("Username user"), password: Joi.string().required().description("Password user"), }), + + failAction: (request, h, err) => { + return h + .response({ + status: "fail", + message: err.message, + }) + .code(400) + .takeover(); + }, }, response: { diff --git a/src/Interfaces/http/api/comments/swagger/comments.js b/src/Interfaces/http/api/comments/swagger/comments.js index 3d65f73..507bb1a 100644 --- a/src/Interfaces/http/api/comments/swagger/comments.js +++ b/src/Interfaces/http/api/comments/swagger/comments.js @@ -1,23 +1,35 @@ -const Joi = require('joi'); +const Joi = require("joi"); const postAddComment = { - auth: 'forumapi_jwt', - tags: ['api', 'Comments'], - description: 'Menambah komentar pada sebuah thread', - notes: 'User harus login (JWT). Komentar akan ditambahkan ke thread tertentu.', + auth: "forumapi_jwt", + tags: ["api", "Comments"], + description: "Menambah komentar pada sebuah thread", + notes: + "User harus login (JWT). Komentar akan ditambahkan ke thread tertentu.", validate: { params: Joi.object({ - thread_id: Joi.string().required().description('ID thread target'), + thread_id: Joi.string().required().description("ID thread target"), }), payload: Joi.object({ - content: Joi.string().required().description('Isi komentar'), + content: Joi.string().required().description("Isi komentar"), }), + + failAction: (request, h, err) => { + return h + .response({ + status: "fail", + message: err.message, + }) + .code(400) + .takeover(); + }, }, response: { schema: Joi.object({ - status: Joi.string().valid('success').required(), + status: Joi.string().valid("success").required(), + message: Joi.string().required(), data: Joi.object({ addedComment: Joi.object({ id: Joi.string().required(), @@ -25,27 +37,29 @@ const postAddComment = { owner: Joi.string().required(), }), }), - }).label('AddCommentResponse'), + }).label("AddCommentResponse"), }, }; const deleteComment = { - auth: 'forumapi_jwt', - tags: ['api', 'Comments'], - description: 'Menghapus komentar dari thread', - notes: 'User harus login. Hanya pemilik komentar yang dapat menghapus.', + auth: "forumapi_jwt", + tags: ["api", "Comments"], + description: "Menghapus komentar dari thread", + notes: "User harus login. Hanya pemilik komentar yang dapat menghapus.", validate: { params: Joi.object({ - thread_id: Joi.string().required().description('ID thread'), - comment_id: Joi.string().required().description('ID komentar yang akan dihapus'), + thread_id: Joi.string().required().description("ID thread"), + comment_id: Joi.string() + .required() + .description("ID komentar yang akan dihapus"), }), }, response: { schema: Joi.object({ - status: Joi.string().valid('success').required(), - }).label('DeleteCommentResponse'), + status: Joi.string().valid("success").required(), + }).label("DeleteCommentResponse"), }, }; diff --git a/src/Interfaces/http/api/likes/swagger/likes.js b/src/Interfaces/http/api/likes/swagger/likes.js index 531bafe..2236ee9 100644 --- a/src/Interfaces/http/api/likes/swagger/likes.js +++ b/src/Interfaces/http/api/likes/swagger/likes.js @@ -11,6 +11,16 @@ const putCommentLike = { thread_id: Joi.string().required().description('ID thread'), comment_id: Joi.string().required().description('ID komentar'), }), + + failAction: (request, h, err) => { + return h + .response({ + status: "fail", + message: err.message, + }) + .code(400) + .takeover(); + }, }, response: { diff --git a/src/Interfaces/http/api/replies/swagger/replies.js b/src/Interfaces/http/api/replies/swagger/replies.js index 6d9f7cc..b99b660 100644 --- a/src/Interfaces/http/api/replies/swagger/replies.js +++ b/src/Interfaces/http/api/replies/swagger/replies.js @@ -14,11 +14,22 @@ const postAddReply = { payload: Joi.object({ content: Joi.string().required().description('Isi reply'), }), + + failAction: (request, h, err) => { + return h + .response({ + status: "fail", + message: err.message, + }) + .code(400) + .takeover(); + }, }, response: { schema: Joi.object({ status: Joi.string().valid('success').required(), + message: Joi.string().required(), data: Joi.object({ addedReply: Joi.object({ id: Joi.string().required(), diff --git a/src/Interfaces/http/api/threads/handler.js b/src/Interfaces/http/api/threads/handler.js index 9bcf76c..2b43884 100644 --- a/src/Interfaces/http/api/threads/handler.js +++ b/src/Interfaces/http/api/threads/handler.js @@ -2,55 +2,69 @@ const AddThreadUseCase = require("../../../../Applications/use_case/AddThreadUse const GetThreadDetailUseCase = require("../../../../Applications/use_case/GetThreadDetailUseCase"); class ThreadsHandler { - constructor(container){ - this._container = container; - - this.postAddThreadHandler = this.postAddThreadHandler.bind(this); - this.getThreadHandler = this.getThreadHandler.bind(this); - } - - async postAddThreadHandler({payload, auth}, h){ - - const useCasePayload = { - title: payload.title, - body: payload.body, - owner: auth.credentials.id, - }; - - const addThreadUseCase = this._container.getInstance(AddThreadUseCase.name); - const addedThread = await addThreadUseCase.execute(useCasePayload); - - const response = h.response({ - status: 'success', - message: 'SUCCESS_ADDED_NEW_THREAD', - data: { - addedThread, - }, - }); - - response.code(201) - return response; - } - - async getThreadHandler({params}, h){ - const useCasePayload = { - thread_id: params.thread_id, - }; - - const getThreadDetailUseCase = this._container.getInstance(GetThreadDetailUseCase.name); - - const thread = await getThreadDetailUseCase.execute(useCasePayload); - - const response = h.response({ - status: 'success', - data: { - thread, - }, - }); - - response.code(200) - return response; - } + constructor(container) { + this._container = container; + + this.postAddThreadHandler = this.postAddThreadHandler.bind(this); + this.getThreadHandler = this.getThreadHandler.bind(this); + } + + async postAddThreadHandler({ payload, auth }, h) { + const useCasePayload = { + title: payload.title, + body: payload.body, + owner: auth.credentials.id, + }; + + const addThreadUseCase = this._container.getInstance(AddThreadUseCase.name); + const addedThread = await addThreadUseCase.execute(useCasePayload); + + const response = h.response({ + status: "success", + message: "SUCCESS_ADDED_NEW_THREAD", + data: { + addedThread, + }, + }); + + response.code(201); + return response; + } + + async getThreadHandler({ params }, h) { + const useCasePayload = { thread_id: params.thread_id }; + const getThreadDetailUseCase = this._container.getInstance( + GetThreadDetailUseCase.name + ); + + const threadData = await getThreadDetailUseCase.execute(useCasePayload); + + const thread = { + id: threadData.id, + title: threadData.title, + body: threadData.body, + date: + threadData.date instanceof Date + ? threadData.date.toISOString() + : threadData.date, + username: threadData.username, + comments: (threadData.comments || []).map((c) => ({ + id: c.id, + content: c.content, + date: c.date instanceof Date ? c.date.toISOString() : c.date, + username: c.username, + likeCount: Number(c.likeCount || 0), + replies: (c.replies || []).map((r) => ({ + id: r.id, + content: r.content, + date: r.date instanceof Date ? r.date.toISOString() : r.date, + username: r.username, + })), + })), + }; + + return h.response({ status: "success", data: { thread } }).code(200); + } } -module.exports = ThreadsHandler; \ No newline at end of file +module.exports = ThreadsHandler; diff --git a/src/Interfaces/http/api/threads/swagger/threads.js b/src/Interfaces/http/api/threads/swagger/threads.js index 8cd22e3..9662fa2 100644 --- a/src/Interfaces/http/api/threads/swagger/threads.js +++ b/src/Interfaces/http/api/threads/swagger/threads.js @@ -1,21 +1,32 @@ -const Joi = require('joi'); +const Joi = require("joi"); const postAddThread = { - auth: 'forumapi_jwt', - tags: ['api', 'Threads'], - description: 'Menambah thread baru', - notes: 'User harus login (JWT). Thread akan ditambahkan ke forum.', + auth: "forumapi_jwt", + tags: ["api", "Threads"], + description: "Menambah thread baru", + notes: "User harus login (JWT). Thread akan ditambahkan ke forum.", validate: { payload: Joi.object({ - title: Joi.string().required().description('Judul thread'), - body: Joi.string().required().description('Isi thread'), + title: Joi.string().required().description("Judul thread"), + body: Joi.string().required().description("Isi thread"), }), + + failAction: (request, h, err) => { + return h + .response({ + status: "fail", + message: err.message, + }) + .code(400) + .takeover(); + }, }, response: { schema: Joi.object({ - status: Joi.string().valid('success').required(), + status: Joi.string().valid("success").required(), + message: Joi.string().required(), data: Joi.object({ addedThread: Joi.object({ id: Joi.string().required(), @@ -23,24 +34,24 @@ const postAddThread = { owner: Joi.string().required(), }), }), - }).label('AddThreadResponse'), + }).label("AddThreadResponse"), }, }; const getThread = { - tags: ['api', 'Threads'], - description: 'Mengambil detail thread beserta komentar dan replies-nya', - notes: 'Publik, tidak membutuhkan autentikasi.', + tags: ["api", "Threads"], + description: "Mengambil detail thread beserta komentar dan replies-nya", + notes: "Publik, tidak membutuhkan autentikasi.", validate: { params: Joi.object({ - thread_id: Joi.string().required().description('ID thread'), + thread_id: Joi.string().required().description("ID thread"), }), }, response: { schema: Joi.object({ - status: Joi.string().valid('success').required(), + status: Joi.string().valid("success").required(), data: Joi.object({ thread: Joi.object({ id: Joi.string().required(), @@ -67,7 +78,7 @@ const getThread = { ), }), }), - }).label('GetThreadResponse'), + }).label("GetThreadResponse"), }, }; diff --git a/src/Interfaces/http/api/users/swagger/users.js b/src/Interfaces/http/api/users/swagger/users.js index 28f14d2..1557cfd 100644 --- a/src/Interfaces/http/api/users/swagger/users.js +++ b/src/Interfaces/http/api/users/swagger/users.js @@ -10,7 +10,17 @@ const postUser = { username: Joi.string().required().description('Username unik'), password: Joi.string().required().description('Password user'), fullname: Joi.string().required().description('Nama lengkap user'), - }) + }), + + failAction: (request, h, err) => { + return h + .response({ + status: "fail", + message: err.message, + }) + .code(400) + .takeover(); + }, }, response: {