refactor: rewrite ke codebase lama

This commit is contained in:
Muhammad Zhafran Ilham
2026-06-07 20:17:49 +07:00
parent ce5487dcbf
commit fe74b2213d
146 changed files with 14608 additions and 6686 deletions
+114
View File
@@ -0,0 +1,114 @@
const adminService = require('../services/admin.service');
const { response, data, error } = require('../../../helpers/utils/wrapper');
const { SUCCESS, ERROR } = require('../../../helpers/http-status/status_code');
const { ForbiddenError, BadRequestError, NotFoundError, InternalServerError } = require('../../../helpers/error');
const { isValidPayload } = require('../../../helpers/utils/validator');
const { createAdminModel, updateAdminModel } = require('../models/admin.model');
class AdminController {
async addAdmin(req, res) {
try {
const validatePayload = isValidPayload(req.body, createAdminModel);
if (validatePayload.err) {
return response(
res,
'fail',
{ err: validatePayload.err, data: null },
'Data tidak valid',
ERROR.EXPECTATION_FAILED
);
}
const result = await adminService.createAdmin(validatePayload.data);
if (result.err) {
return response(res, 'fail', result);
}
return response(res, 'success', data(), 'Admin berhasil dibuat', SUCCESS.CREATED);
} catch (err) {
return response(res, 'fail', error(new InternalServerError(err.message)), 'Terjadi kesalahan yang tidak terduga', ERROR.INTERNAL_ERROR);
}
}
async getAdmins(req, res) {
try {
const result = await adminService.getAllAdmins();
if (result.err) {
return response(res, 'fail', result);
}
if (!result.data || result.data.length === 0) {
return response(res, 'fail', error(new NotFoundError('Tidak ada admin ditemukan')));
}
return response(res, 'success', result, 'Admin berhasil diambil', SUCCESS.OK);
} catch (err) {
return response(res, 'fail', error(new InternalServerError(err.message)), 'Terjadi kesalahan yang tidak terduga', ERROR.INTERNAL_ERROR);
}
}
async getAdminById(req, res) {
try {
const { id } = req.params;
const result = await adminService.getAdminById(id);
if (result.err) {
return response(res, 'fail', result);
}
return response(res, 'success', result, 'Admin berhasil diambil', SUCCESS.OK);
} catch (err) {
return response(res, 'fail', error(new InternalServerError(err.message)), 'Terjadi kesalahan yang tidak terduga', ERROR.INTERNAL_ERROR);
}
}
async updateAdmin(req, res) {
try {
const { id } = req.params;
const validatePayload = isValidPayload(req.body, updateAdminModel);
if (validatePayload.err) {
return response(
res,
'fail',
{ err: validatePayload.err, data: null },
'Data tidak valid',
ERROR.EXPECTATION_FAILED
);
}
const result = await adminService.updateAdmin(id, validatePayload.data);
if (result.err) {
return response(res, 'fail', result);
}
return response(res, 'success', data(), 'Admin berhasil diperbarui', SUCCESS.OK);
} catch (err) {
return response(res, 'fail', error(new InternalServerError(err.message)), 'Terjadi kesalahan yang tidak terduga', ERROR.INTERNAL_ERROR);
}
}
async deleteAdmin(req, res) {
try {
const { id } = req.params;
const result = await adminService.deleteAdmin(id);
if (result.err) {
return response(res, 'fail', result);
}
return response(res, 'success', data(), 'Admin berhasil dihapus', SUCCESS.OK);
} catch (err) {
return response(res, 'fail', error(new InternalServerError(err.message)), 'Terjadi kesalahan yang tidak terduga', ERROR.INTERNAL_ERROR);
}
}
}
module.exports = new AdminController();
+9
View File
@@ -0,0 +1,9 @@
const adminController = require('./controllers/admin.controller');
const adminService = require('./services/admin.service');
const adminRepository = require('./repositories/admin.repository');
module.exports = {
adminController,
adminService,
adminRepository
};
+75
View File
@@ -0,0 +1,75 @@
const joi = require('joi');
const createAdminModel = joi.object().keys({
nama_depan: joi.string().max(255).required().messages({
'string.base': 'Nama depan harus berupa teks.',
'string.empty': 'Nama depan tidak boleh kosong.',
'string.max': 'Nama depan maksimal {#limit} karakter.',
'any.required': 'Nama depan wajib diisi.',
}),
nama_belakang: joi.string().max(255).required().messages({
'string.base': 'Nama belakang harus berupa teks.',
'string.empty': 'Nama belakang tidak boleh kosong.',
'string.max': 'Nama belakang maksimal {#limit} karakter.',
'any.required': 'Nama belakang wajib diisi.',
}),
email: joi.string().email({ tlds: { allow: false } }).max(255).required().messages({
'string.base': 'Email harus berupa teks.',
'string.empty': 'Email tidak boleh kosong.',
'string.email': 'Format email tidak valid.',
'string.max': 'Email maksimal {#limit} karakter.',
'any.required': 'Email wajib diisi.',
}),
password: joi.string().min(8).required().messages({
'string.base': 'Password harus berupa teks.',
'string.empty': 'Password tidak boleh kosong.',
'string.min': 'Password minimal {#limit} karakter.',
'any.required': 'Password wajib diisi.',
}),
role: joi.string().valid('admin').default('admin').messages({
'string.base': 'Role harus berupa teks.',
'any.only': 'Role hanya boleh "admin".',
}),
signature: joi.string().optional().allow('', null).messages({
'string.base': 'Signature harus berupa teks.',
}),
});
const updateAdminModel = joi.object().keys({
nama_depan: joi.string().max(255).optional().messages({
'string.base': 'Nama depan harus berupa teks.',
'string.empty': 'Nama depan tidak boleh kosong.',
'string.max': 'Nama depan maksimal {#limit} karakter.',
}),
nama_belakang: joi.string().max(255).optional().messages({
'string.base': 'Nama belakang harus berupa teks.',
'string.empty': 'Nama belakang tidak boleh kosong.',
'string.max': 'Nama belakang maksimal {#limit} karakter.',
}),
email: joi.string().email({ tlds: { allow: false } }).max(255).optional().messages({
'string.base': 'Email harus berupa teks.',
'string.email': 'Format email tidak valid.',
'string.max': 'Email maksimal {#limit} karakter.',
}),
password: joi.string().min(8).optional().messages({
'string.base': 'Password harus berupa teks.',
'string.min': 'Password minimal {#limit} karakter.',
}),
signature: joi.string().optional().allow('', null).messages({
'string.base': 'Signature harus berupa teks.',
}),
});
module.exports = {
createAdminModel,
updateAdminModel,
};
+40
View File
@@ -0,0 +1,40 @@
const prisma = require('../../../helpers/db/db_connection');
class AdminRepository {
async create(adminData) {
return prisma.admin.create({
data: adminData
});
}
async findAll() {
return prisma.admin.findMany();
}
async findByEmail(email) {
return prisma.admin.findUnique({
where: { email }
});
}
async findById(id) {
return prisma.admin.findUnique({
where: { id: parseInt(id) }
});
}
async updateById(id, adminData) {
return prisma.admin.update({
where: { id: parseInt(id) },
data: adminData
});
}
async deleteById(id) {
return prisma.admin.delete({
where: { id: parseInt(id) }
});
}
}
module.exports = new AdminRepository();
+114
View File
@@ -0,0 +1,114 @@
const bcrypt = require('bcrypt');
const adminRepository = require('../repositories/admin.repository');
const { data, error } = require('../../../helpers/utils/wrapper');
const { BadRequestError, NotFoundError } = require('../../../helpers/error');
class AdminService {
async createAdmin(adminData) {
try {
const { nama_depan, nama_belakang, email, password, role } = adminData;
const existingAdmin = await adminRepository.findByEmail(email);
if (existingAdmin) {
return error(new BadRequestError('Email sudah terdaftar'));
}
const saltRounds = 10;
const hashedPassword = await bcrypt.hash(password, saltRounds);
const newAdminData = {
nama_depan,
nama_belakang,
email,
password: hashedPassword,
role,
signature: `${nama_depan}-${Date.now()}`,
};
await adminRepository.create(newAdminData);
return data();
} catch (err) {
return error(err);
}
}
async getAllAdmins() {
try {
const admins = await adminRepository.findAll();
if (!admins || admins.length === 0) {
return error(new NotFoundError('Tidak ada admin ditemukan'));
}
return data(admins);
} catch (err) {
return error(err);
}
}
async getAdminById(id) {
try {
const admin = await adminRepository.findById(id);
if (!admin) {
return error(new NotFoundError('Admin tidak ditemukan'));
}
return data(admin);
} catch (err) {
return error(err);
}
}
async getAdminByEmail(email) {
try {
const admin = await adminRepository.findByEmail(email);
return data(admin);
} catch (err) {
return error(err);
}
}
async verifyPassword(plainPassword, hashedPassword) {
try {
const isValid = await bcrypt.compare(plainPassword, hashedPassword);
return data(isValid);
} catch (err) {
return error(err);
}
}
async updateAdmin(id, adminData) {
try {
const adminResult = await this.getAdminById(id);
if (adminResult.err) {
return adminResult;
}
if (adminData.email) {
const existingAdmin = await adminRepository.findByEmail(adminData.email);
if (existingAdmin && existingAdmin.id !== id) {
return error(new BadRequestError('Email sudah terdaftar'));
}
}
await adminRepository.updateById(id, adminData);
return data();
} catch (err) {
return error(err);
}
}
async deleteAdmin(id) {
try {
const adminResult = await this.getAdminById(id);
if (adminResult.err) {
return adminResult;
}
await adminRepository.deleteById(id);
return data();
} catch (err) {
return error(err);
}
}
}
module.exports = new AdminService();