refactor: rewrite ke codebase lama
This commit is contained in:
+114
@@ -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();
|
||||
Executable
+9
@@ -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
|
||||
};
|
||||
Executable
+75
@@ -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
@@ -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();
|
||||
Executable
+114
@@ -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();
|
||||
Reference in New Issue
Block a user