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
@@ -0,0 +1,128 @@
const partnershipService = require('../services/partnership.service');
const { response, error } = require('../../../helpers/utils/wrapper');
const { InternalServerError } = require('../../../helpers/error');
const { SUCCESS, ERROR } = require('../../../helpers/http-status/status_code');
const { isValidPayload } = require('../../../helpers/utils/validator');
const { createPartnershipModel, updatePartnershipModel } = require('../models/partnership.model');
const { deleteFileIfExists } = require('../../../helpers/utils/fileHelper');
class PartnershipController {
async addPartnership(req, res) {
try {
const image = req.file;
const validatePayload = isValidPayload(req.body, createPartnershipModel);
if (validatePayload.err) {
if (image?.filename) {
await deleteFileIfExists(image.filename);
}
return response(
res,
'fail',
{ err: validatePayload.err, data: null },
'Data tidak valid',
ERROR.EXPECTATION_FAILED
);
}
const { nama_partner } = validatePayload.data;
const result = await partnershipService.createPartnership(nama_partner, image);
if (result.err) {
return response(res, 'fail', result);
}
return response(res, 'success', result, 'Data partnership berhasil ditambahkan', SUCCESS.CREATED);
} catch (err) {
if (req.file?.filename) {
await deleteFileIfExists(req.file.filename);
}
return response(res, 'fail', error(new InternalServerError(err.message)), 'Terjadi kesalahan yang tidak terduga', ERROR.INTERNAL_ERROR);
}
}
async getPartnership(req, res) {
try {
const result = await partnershipService.getAllPartnerships();
if (result.err) {
return response(res, 'fail', result);
}
return response(res, 'success', result, 'Data partnership berhasil diambil', SUCCESS.OK);
} catch (err) {
return response(res, 'fail', error(new InternalServerError(err.message)), 'Terjadi kesalahan yang tidak terduga', ERROR.INTERNAL_ERROR);
}
}
async getPartnershipById(req, res) {
try {
const { id } = req.params;
const result = await partnershipService.getPartnershipById(id);
if (result.err) {
return response(res, 'fail', result);
}
return response(res, 'success', result, 'Data partnership berhasil diambil', SUCCESS.OK);
} catch (err) {
return response(res, 'fail', error(new InternalServerError(err.message)), 'Terjadi kesalahan yang tidak terduga', ERROR.INTERNAL_ERROR);
}
}
async updatePartnership(req, res) {
try {
const { id } = req.params;
const image = req.file;
const validatePayload = isValidPayload(req.body, updatePartnershipModel);
if (validatePayload.err) {
if (image?.filename) {
await deleteFileIfExists(image.filename);
}
return response(
res,
'fail',
{ err: validatePayload.err, data: null },
'Data tidak valid',
ERROR.EXPECTATION_FAILED
);
}
const { nama_partner } = validatePayload.data;
const result = await partnershipService.updatePartnership(id, nama_partner, image);
if (result.err) {
return response(res, 'fail', result);
}
return response(res, 'success', result, 'Data partnership berhasil diperbarui', SUCCESS.OK);
} catch (err) {
if (req.file?.filename) {
await deleteFileIfExists(req.file.filename);
}
return response(res, 'fail', error(new InternalServerError(err.message)), 'Terjadi kesalahan yang tidak terduga', ERROR.INTERNAL_ERROR);
}
}
async deletePartnership(req, res) {
try {
const { id } = req.params;
const result = await partnershipService.deletePartnership(id);
if (result.err) {
return response(res, 'fail', result);
}
return response(res, 'success', result, 'Data partnership 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 PartnershipController();
+9
View File
@@ -0,0 +1,9 @@
const partnershipController = require('./controllers/partnership.controller');
const partnershipService = require('./services/partnership.service');
const partnershipRepository = require('./repositories/partnership.repository');
module.exports = {
partnershipController,
partnershipService,
partnershipRepository
};
+30
View File
@@ -0,0 +1,30 @@
const joi = require('joi');
const createPartnershipModel = joi.object().keys({
nama_partner: joi.string().max(255).required().messages({
'string.base': 'Nama partner harus berupa teks.',
'string.empty': 'Nama partner tidak boleh kosong.',
'string.max': 'Nama partner maksimal {#limit} karakter.',
'any.required': 'Nama partner wajib diisi.',
}),
image_path: joi.string().optional().allow('', null).messages({
'string.base': 'Path gambar harus berupa teks.',
}),
});
const updatePartnershipModel = joi.object().keys({
nama_partner: joi.string().max(255).optional().messages({
'string.base': 'Nama partner harus berupa teks.',
'string.max': 'Nama partner maksimal {#limit} karakter.',
}),
image_path: joi.string().optional().allow('', null).messages({
'string.base': 'Path gambar harus berupa teks.',
}),
});
module.exports = {
createPartnershipModel,
updatePartnershipModel,
};
@@ -0,0 +1,34 @@
const prisma = require('../../../helpers/db/db_connection');
class PartnershipRepository {
async create(partnershipData) {
return prisma.partnership.create({
data: partnershipData,
});
}
async findAll() {
return prisma.partnership.findMany();
}
async findById(id) {
return prisma.partnership.findUnique({
where: { id: parseInt(id) },
});
}
async updateById(id, partnershipData) {
return prisma.partnership.update({
where: { id: parseInt(id) },
data: partnershipData,
});
}
async deleteById(id) {
return prisma.partnership.delete({
where: { id: parseInt(id) },
});
}
}
module.exports = new PartnershipRepository();
+121
View File
@@ -0,0 +1,121 @@
const partnershipRepository = require('../repositories/partnership.repository');
const path = require('path');
const { deleteFileIfExists } = require('../../../helpers/utils/fileHelper');
const imageUploadHelper = require('../../../helpers/utils/imageUpload.helper');
const { data, error } = require('../../../helpers/utils/wrapper');
const { NotFoundError } = require('../../../helpers/error');
class PartnershipService {
async createPartnership(nama_partner, imageFile) {
try {
const imagePath = imageUploadHelper.uploadImage(imageFile);
const partnershipData = {
nama_partner,
image_path: imagePath,
};
const result = await partnershipRepository.create(partnershipData);
return data(result);
} catch (err) {
if (imageFile?.filename) {
try {
await deleteFileIfExists(imageFile.filename);
} catch (cleanupErr) {
console.error('Failed to cleanup file:', cleanupErr);
}
}
return error(err);
}
}
async getAllPartnerships() {
try {
const partnerships = await partnershipRepository.findAll();
return data(partnerships);
} catch (err) {
return error(err);
}
}
async getPartnershipById(id) {
try {
const partnership = await partnershipRepository.findById(id);
if (!partnership) {
return error(new NotFoundError('Partnership Tidak Ditemukan'));
}
return data(partnership);
} catch (err) {
return error(err);
}
}
async updatePartnership(id, nama_partner, imageFile) {
let oldImagePath = null;
let newImageUploaded = false;
try {
const checkResult = await this.getPartnershipById(id);
if (checkResult.err) {
return checkResult;
}
const existingPartnership = checkResult.data;
let imagePath = existingPartnership.image_path;
if (imageFile) {
oldImagePath = existingPartnership.image_path;
imagePath = imageUploadHelper.uploadImage(imageFile);
newImageUploaded = true;
if (oldImagePath) {
const oldFileName = path.basename(oldImagePath);
await deleteFileIfExists(oldFileName);
}
}
const partnershipData = {
nama_partner,
image_path: imagePath,
};
const result = await partnershipRepository.updateById(id, partnershipData);
return data(result);
} catch (err) {
if (newImageUploaded && imageFile?.filename) {
try {
await deleteFileIfExists(imageFile.filename);
} catch (cleanupErr) {
console.error('Failed to cleanup new file:', cleanupErr);
}
}
return error(err);
}
}
async deletePartnership(id) {
try {
const checkResult = await this.getPartnershipById(id);
if (checkResult.err) {
return checkResult;
}
const partnership = checkResult.data;
if (partnership.image_path) {
const fileName = path.basename(partnership.image_path);
await deleteFileIfExists(fileName);
}
const result = await partnershipRepository.deleteById(id);
return data(result);
} catch (err) {
return error(err);
}
}
}
module.exports = new PartnershipService();