Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions src/Interfaces/http/api/authentications/swagger/authentication.js
Original file line number Diff line number Diff line change
Expand Up @@ -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: {
Expand Down
48 changes: 31 additions & 17 deletions src/Interfaces/http/api/comments/swagger/comments.js
Original file line number Diff line number Diff line change
@@ -1,51 +1,65 @@
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(),
content: Joi.string().required(),
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"),
},
};

Expand Down
10 changes: 10 additions & 0 deletions src/Interfaces/http/api/likes/swagger/likes.js
Original file line number Diff line number Diff line change
Expand Up @@ -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: {
Expand Down
11 changes: 11 additions & 0 deletions src/Interfaces/http/api/replies/swagger/replies.js
Original file line number Diff line number Diff line change
Expand Up @@ -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(),
Expand Down
114 changes: 64 additions & 50 deletions src/Interfaces/http/api/threads/handler.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;
module.exports = ThreadsHandler;
41 changes: 26 additions & 15 deletions src/Interfaces/http/api/threads/swagger/threads.js
Original file line number Diff line number Diff line change
@@ -1,46 +1,57 @@
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(),
title: Joi.string().required(),
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(),
Expand All @@ -67,7 +78,7 @@ const getThread = {
),
}),
}),
}).label('GetThreadResponse'),
}).label("GetThreadResponse"),
},
};

Expand Down
12 changes: 11 additions & 1 deletion src/Interfaces/http/api/users/swagger/users.js
Original file line number Diff line number Diff line change
Expand Up @@ -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: {
Expand Down