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
+45
View File
@@ -0,0 +1,45 @@
import * as adminService from '../models/admin.js';
export const addAdmin = async (req, res) => {
const { nama_depan, nama_belakang, email, password } = req.body;
const role = 'admin';
const requireRole = req.role;
try {
if (requireRole !== 'admin') {
return res.status(400).json({ message: 'Only admins can access this' });
}
const [foundAdmin] = await adminService.getAdminByEmail(email);
if (foundAdmin.length > 0) {
return res.status(400).json({ message: 'Email already exists' });
}
await adminService.addAdmin(
nama_depan,
nama_belakang,
email,
password,
role
);
return res.status(200).json({ message: 'Admin created successfully' });
} catch (error) {
console.error(error);
return res.status(500).json({ message: 'Internal server error' });
}
};
export const getAdmin = async (_req, res) => {
try {
const [admin] = await adminService.getAdmin();
if (admin.length === 0) {
return res.status(404).json({ message: 'Admin not found' });
}
return res.status(200).json({
message: 'Get all admin successfully',
data: admin,
});
} catch {
return res.status(500).json({ message: 'Internal server error' });
}
};
+70
View File
@@ -0,0 +1,70 @@
const adminService = require("../models/admin");
const bcrypt = require("bcrypt");
const jwt = require("jsonwebtoken");
const login = async (req, res) => {
const { email, password } = req.body;
try {
const [foundAdmin] = await adminService.getAdminByEmail(email);
if (foundAdmin.length === 0) {
return res.status(400).json({
message: "Invalid email or password",
});
}
const isPasswordValid = await bcrypt.compare(
password,
foundAdmin[0].password
);
if (!isPasswordValid) {
return res.status(400).json({
message: "Invalid email or password",
});
}
const token = jwt.sign(
{ id: foundAdmin[0].id, role: foundAdmin[0].role },
process.env.JWT_SECRET,
{ expiresIn: "1h" }
);
return res.status(200).json({
message: "Login successful",
token,
});
} catch (error) {
console.error(error);
return res.status(500).json({
message: "Internal server error",
});
}
}
const me = async (req, res) => {
const id = req.id;
try {
console.log(id);
const [admin] = await adminService.getAdminById(id);
if (admin.length === 0) {
return res.status(404).json({
message: "Admin not found",
});
}
return res.status(200).json({
message: "Get admin successfully",
data: admin[0],
});
} catch (error) {
console.error(error);
return res.status(500).json({
message: "Internal server error",
});
}
}
module.exports = {
login,
me,
}
+178
View File
@@ -0,0 +1,178 @@
const hasilResearchModel = require('../models/hasilResearch');
const path = require('path');
const { deleteFileIfExists } = require('../config/fileHelper');
const addhasilResearch = async (req, res) => {
const { nama_project } = req.body;
const { deskripsi } = req.body;
const image = req.file;
const {link_project} = req.body;
try {
const image_path = await uploadGambar(image);
await hasilResearchModel.addhasilResearch(nama_project,deskripsi, link_project, image_path);
res.status(200).json({
message: "Research result data successfully added",
data: { nama_project,deskripsi, image_path,link_project },
});
} catch (error) {
console.error("Error adding research results:", error);
res.status(500).json({
message: "Internal server error",
error: error.message,
});
}
};
const uploadGambar = async (image) => {
try {
if (!image) {
throw new Error("Please upload an image!");
}
const file = `/uploads/${image.filename}`;
return file;
} catch (error) {
console.error(error.message);
throw new Error("Failed to upload image.");
}
};
const gethasilResearch = async (req, res) => {
try {
const [result] = await hasilResearchModel.gethasilResearch();
if (result.length === 0) {
return res.status(404).json({
message: "There is no research data",
});
}
res.status(200).json({
message: "Research data was successfully collected",
data: result,
});
} catch (error) {
console.error("Error getting research results:", error);
res.status(500).json({
message: "Internal server error",
error: error.message,
});
}
}
const deleteHasilResearch = async (req, res) => {
try {
const { id } = req.params;
const [hasilResearch] = await hasilResearchModel.gethasilResearchById(id);
if (hasilResearch.length === 0) {
return res.status(404).json({
messsage: "Hasil research not found",
});
}
const image_path = hasilResearch[0].image_path;
if (image_path) {
const fileName = path.basename(image_path);
await deleteFileIfExists(fileName);
}
await hasilResearchModel.deletehasilResearch(id);
res.status(200).json({
message: "Research result data successfully deleted",
});
} catch (error) {
console.error("Error deleting research results :", error);
res.status(500).json({
message: "Internal server error",
error: error.message,
});
}
}
const gethasilResearchById = async (req, res) => {
try {
const { id } = req.params
const [hasilResearch] = await hasilResearchModel.gethasilResearchById(id);
if (hasilResearch.length === 0) {
return res.status(404).json({
messsage: "Hasil research not found",
});
}
res.status(200).json({
message: "Research data was successfully collected",
data: hasilResearch,
});
} catch (error) {
console.error("Error getting research results:", error);
res.status(500).json({
message: "Internal server error",
error: error.message,
});
}
}
const updateHasilResearch = async (req, res) => {
try {
const { id } = req.params;
const { nama_project, deskripsi, link_project } = req.body;
const image = req.file;
const [existing] = await hasilResearchModel.gethasilResearchById(id);
if (existing.length === 0) {
return res.status(404).json({ message: "Hasil research not found" });
}
const currentData = existing[0];
let image_path = existing[0].image_path;
if (image) {
const oldFile = path.basename(image_path);
await deleteFileIfExists(oldFile);
image_path = await uploadGambar(image);
}
const updatedData = {
nama_project: nama_project?.trim() ? nama_project : currentData.nama_project,
deskripsi: deskripsi?.trim() ? deskripsi : currentData.deskripsi,
link_project: link_project?.trim() ? link_project : currentData.link_project,
image_path,
};
await hasilResearchModel.updateHasilResearch(
id,
updatedData.nama_project,
updatedData.deskripsi,
updatedData.link_project,
updatedData.image_path
);
return res.status(200).json({
message: "Hasil research successfully updated",
data: {
id,
nama_project: updatedData.nama_project,
deskripsi: updatedData.deskripsi,
link_project: updatedData.link_project,
image_path: updatedData.image_path,
},
});
} catch (error) {
console.error("Error updating research:", error);
res.status(500).json({
message: "Internal server error",
error: error.message,
});
}
};
module.exports = {
addhasilResearch,
gethasilResearch,
gethasilResearchById,
updateHasilResearch,
deleteHasilResearch
}
+361
View File
@@ -0,0 +1,361 @@
const mahasiswaModel = require("../models/mahasiswa");
const lowonganMagangModel = require("../models/lowonganMagang");
const lamaranMagangModel = require("../models/lamaranMagang");
const transporter = require("../config/mail");
const ExcelJS = require('exceljs');
require("dotenv").config();
const path = require('path');
const { deleteFileIfExists } = require('../config/fileHelper');
const addLamaranMagang = async (req, res) => {
const { id_lowongan_magang } = req.params;
const {
nama_depan,
nama_belakang,
email,
kontak,
jurusan,
motivasi,
relevant_skills,
} = req.body;
const CV = req.files.cv?.[0];
const Portofolio = req.files.portofolio?.[0];
const status = "diproses";
const role = "student";
try {
const cv_path = await uploadCV(CV);
const portofolio_path = await uploadPortofolio(Portofolio);
const [lowonganMagang] = await lowonganMagangModel.getLowonganMagangById(
id_lowongan_magang
);
if (lowonganMagang.length === 0) {
return res.status(404).json({
message: "Internship vacancy not found.",
});
}
const namaBelakangFinal = nama_belakang?.trim() || null;
const dataMahasiswa = {
nama_depan,
nama_belakang: namaBelakangFinal,
email,
kontak,
jurusan,
role,
cv_path,
portofolio_path,
motivasi,
relevant_skills,
};
const result = await mahasiswaModel.addMahasiswa(
nama_depan,
namaBelakangFinal,
email,
kontak,
jurusan,
role,
cv_path,
portofolio_path,
motivasi,
relevant_skills
);
const id_mahasiswa = result[0].insertId;
await lamaranMagangModel.addlowonganMagang(
id_mahasiswa,
id_lowongan_magang,
status
);
await sendEmail(dataMahasiswa, lowonganMagang[0]);
res.status(200).json({
message: "Internship application submitted successfully.",
data: {
id_lowongan_magang,
dataMahasiswa,
status,
},
});
} catch (error) {
console.error("Error adding internship application:", error);
res.status(500).json({
message: "Internal server error.",
error: error.message,
});
}
};
const uploadCV = async (CV) => {
try {
if (!CV) {
throw new Error("Please upload your CV.");
}
const file = `/uploads/${CV.filename}`;
return file;
} catch (error) {
console.error(error.message);
throw new Error("Failed to upload CV.");
}
};
const uploadPortofolio = async (portofolio) => {
try {
if (!portofolio) {
throw new Error("Please upload your portfolio.");
}
const file = `/uploads/${portofolio.filename}`;
return file;
} catch (error) {
console.error(error.message);
throw new Error("Failed to upload portfolio.");
}
};
const getAllLamaranMagang = async (req, res) => {
try {
const [result] = await lamaranMagangModel.getAllLamaranMagang();
if (result.length === 0) {
return res.status(404).json({
message: "No internship applications found.",
});
}
res.status(200).json({
message: "Internship applications retrieved successfully.",
data: result,
});
} catch (error) {
console.error("Error fetching all internship applications:", error);
res.status(500).json({
message: "Internal server error.",
error: error.message,
});
}
};
const getLamaranByID = async (req, res) => {
const { id_lamaran_magang } = req.params;
try {
const [result] = await lamaranMagangModel.getLamaranByID(
id_lamaran_magang
);
if (result.length === 0) {
return res.status(404).json({
message: "No internship applications found.",
});
}
res.status(200).json({
message: "Internship applications retrieved successfully.",
data: result,
});
} catch (error) {
console.error("Error fetching internship applications by ID:", error);
res.status(500).json({
message: "Internal server error.",
error: error.message,
});
}
};
const updateStatusLamaran = async (req, res) => {
const { id_lamaran_magang } = req.params;
const { status } = req.body;
const role = req.role;
try {
if (role !== "admin") {
return res.status(403).json({
message: "Unauthorized access.",
});
}
const [lamaran] = await lamaranMagangModel.getDetailLamaranById(
id_lamaran_magang
);
// console.log(lamaran[0]);
if (lamaran.length === 0) {
return res.status(404).json({
message: "Internship application not found.",
});
}
await lamaranMagangModel.updateStatusLamaran(id_lamaran_magang, status);
res.status(200).json({
message: "Internship application status successfully updated.",
});
await sendStatusEmail(lamaran[0], status)
} catch (error) {
console.error("Error updating internship application status:", error);
res.status(500).json({
message: "Internal server error.",
error: error.message,
});
}
};
const sendEmail = async (dataMahasiswa, dataPekerjaan) => {
try {
const fullName = `${dataMahasiswa.nama_depan}${dataMahasiswa.nama_belakang ? ' ' + dataMahasiswa.nama_belakang : ''}`;
const mailOptions = {
from: process.env.AUTH_EMAIL,
to: dataMahasiswa.email,
subject: "Konfirmasi Penerimaan Lamaran Anda",
headers: {
"X-Priority": "1",
"X-MSMail-Priority": "High",
Importance: "high",
},
html: `
<div style="font-family: Arial, sans-serif; max-width: 600px; margin: auto; padding: 20px; border: 1px solid #e0e0e0; border-radius: 10px;">
<h2 style="color: #333;">Lamaran Anda Telah Kami Terima</h2>
<p>Halo ${fullName},</p>
<p>Terima kasih telah mengirimkan lamaran untuk posisi <strong>${dataPekerjaan.posisi}</strong> di <strong>Humic Engineering</strong>.</p>
<p>Kami telah menerima dokumen dan informasi yang Anda kirimkan, dan saat ini tim rekrutmen kami sedang meninjaunya dengan seksama.</p>
<p>Jika profil Anda sesuai dengan kebutuhan kami, tim kami akan menghubungi Anda untuk tahapan seleksi berikutnya. Proses ini dapat memakan waktu hingga beberapa minggu.</p>
<p>Kami sangat menghargai minat Anda untuk bergabung bersama tim kami.</p>
<p>Salam hangat,</p>
<p><strong>Tim Rekrutmen Humic Engineering</strong></p>
<hr style="margin: 30px 0;">
<p style="font-size: 12px; color: #888;">Email ini dikirim secara otomatis. Jika Anda memiliki pertanyaan lebih lanjut, silakan hubungi kami melalui email resmi yang tersedia di website kami.</p>
</div>
`,
};
await transporter.sendMail(mailOptions);
} catch (error) {
console.error("Error mengirim email lamaran magang:", error);
}
};
const sendStatusEmail = async (dataLamaran, statusLamaran) => {
try {
const isAccepted = statusLamaran === "diterima";
const fullName = `${dataLamaran.nama_depan}${dataLamaran.nama_belakang ? ' ' + dataLamaran.nama_belakang : ''}`;
const subject = isAccepted
? "Selamat! Lamaran Anda Diterima"
: "Pemberitahuan Status Lamaran Anda";
const messageContent = isAccepted
? `
<p>Halo ${fullName},</p>
<p>Selamat! Lamaran Anda untuk posisi <strong>${dataLamaran.posisi}</strong> di <strong>Humic Engineering</strong> telah diterima.</p>
<p>Tim kami sangat terkesan dengan profil dan kualifikasi Anda. Kami akan segera menghubungi Anda terkait tahapan selanjutnya.</p>
<p>Terima kasih telah melamar dan kami menantikan kerja sama yang luar biasa bersama Anda.</p>
`
: `
<p>Halo ${fullName},</p>
<p>Terima kasih atas lamaran Anda untuk posisi <strong>${dataLamaran.posisi}</strong> di <strong>Humic Engineering</strong>.</p>
<p>Setelah mempertimbangkan secara seksama, kami memutuskan untuk tidak melanjutkan proses lamaran Anda ke tahap berikutnya.</p>
<p>Jangan berkecil hati—kami sangat menghargai waktu dan usaha Anda. Kami mendorong Anda untuk terus mencoba dan semoga sukses dalam perjalanan karier Anda.</p>
`;
const mailOptions = {
from: process.env.AUTH_EMAIL,
to: dataLamaran.email,
subject,
headers: {
"X-Priority": "1",
"X-MSMail-Priority": "High",
Importance: "high",
},
html: `
<div style="font-family: Arial, sans-serif; max-width: 600px; margin: auto; padding: 20px; border: 1px solid #e0e0e0; border-radius: 10px;">
${messageContent}
<p>Salam hangat,</p>
<p><strong>Tim Rekrutmen Humic Engineering</strong></p>
<hr style="margin: 30px 0;">
<p style="font-size: 12px; color: #888;">Email ini dikirim secara otomatis. Untuk informasi lebih lanjut, silakan hubungi kami melalui kontak resmi.</p>
</div>
`,
};
await transporter.sendMail(mailOptions);
} catch (error) {
console.error("Gagal mengirim email status lamaran:", error);
}
};
const exportDataToExcel = async (req, res) => {
try {
const [rows] = await lamaranMagangModel.getAllExportData();
const workbook = new ExcelJS.Workbook();
const worksheet = workbook.addWorksheet('Data');
// Add header
const headers = Object.keys(rows[0]);
worksheet.addRow(headers);
// Add rows
rows.forEach(row => {
worksheet.addRow(Object.values(row));
});
// setting header buat file excel
res.setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
res.setHeader('Content-Disposition', 'attachment; filename=data.xlsx');
await workbook.xlsx.write(res);
res.end();
} catch (err) {
console.error(err);
res.status(500).send('Error generating Excel file');
}
}
const deleteAllLamaranMagang = async (req, res) => {
try {
// Ambil semua mahasiswa
const [mahasiswaList] = await mahasiswaModel.getAllMahasiswa();
for (const mhs of mahasiswaList) {
const files = [mhs.cv_path, mhs.portofolio_path];
for (const filePath of files) {
if (filePath) {
const fileName = path.basename(filePath);
await deleteFileIfExists(fileName);
}
}
}
// Hapus semua lamaran & mahasiswa
await lamaranMagangModel.deleteAllLamaranMagang();
await mahasiswaModel.deleteAllMahasiswa();
res.status(200).json({
message: "All student data, applications, and files were successfully deleted.",
});
} catch (err) {
console.error("Failed to delete all:", err);
res.status(500).json({ message: "Failed to delete all data.", error: err.message });
}
};
module.exports = {
addLamaranMagang,
getAllLamaranMagang,
getLamaranByID,
updateStatusLamaran,
exportDataToExcel,
deleteAllLamaranMagang
};
+261
View File
@@ -0,0 +1,261 @@
const lowonganMagangService = require("../models/lowonganMagang");
const { v4: uuidv4 } = require("uuid");
const fs = require("fs").promises;
const path = require('path');
const { deleteFileIfExists } = require('../helpers/utils/fileHelper'); // ganti sesuai lokasi fileHelper.js
// Ini komentar buat penerus pengembangan proyek ini
// di db, field status_lowongan cuman di define pas add lowongan doang
// jadi pas dia get data lowongan, field status_lowongan bakal di override
// kenapa gk diapus aja fieldnya? Pertanyaan yang bagus
// itu aja fyi-nya
const addLowonganMagang = async (req, res) => {
const {
posisi,
kelompok_peminatan,
jobdesk,
lokasi,
kualifikasi,
benefit,
durasi_awal,
durasi_akhir,
paid,
} = req.body;
const require = req.role;
const now = new Date();
const tgl_awal = new Date(durasi_awal);
const tgl_akhir = new Date(durasi_akhir);
let status_lowongan = "ditutup";
if (now >= tgl_awal && now <= tgl_akhir) {
status_lowongan = "dibuka";
}
const image_path = req.file;
try {
if (require === "admin") {
const id = await uuidv4();
const file = await uploadGambar(image_path);
await lowonganMagangService.addlowonganMagang(
id,
posisi,
kelompok_peminatan,
jobdesk,
lokasi,
kualifikasi,
benefit,
durasi_awal,
durasi_akhir,
status_lowongan,
paid,
file
);
return res.status(200).json({
message: "Internship vacancy created successfully",
});
}
return res.status(403).json({
message: "Access denied: Only admins can access this route",
});
} catch (error) {
console.error(error);
return res.status(500).json({
message: "Internal server error",
error: error.message,
});
}
};
const uploadGambar = async (image) => {
try {
if (!image) {
throw new Error("Please upload an image!");
}
const file = `/uploads/${image.filename}`;
return file;
} catch (error) {
console.error(error.message);
throw new Error("Failed to upload image.");
}
};
const getAllLowonganMagang = async (req, res) => {
try {
const [lowonganMagang] = await lowonganMagangService.getAllLowonganMagang();
if (lowonganMagang.length === 0) {
return res.status(404).json({
message: "No internship vacancies found",
});
}
const now = new Date();
const updatedLowongan = lowonganMagang.map(item => {
const durasiAwal = new Date(item.durasi_awal);
const durasiAkhir = new Date(item.durasi_akhir);
const status = now >= durasiAwal && now <= durasiAkhir ? "dibuka" : "ditutup";
return {
...item,
status_lowongan: status,
};
});
return res.status(200).json({
message: "Successfully retrieved all internship vacancies",
data: updatedLowongan,
});
} catch (error) {
return res.status(500).json({
message: "Internal server error",
error: error.message,
});
}
};
const getLowonganMagangById = async (req, res) => {
const { id } = req.params;
try {
const [lowonganMagang] = await lowonganMagangService.getLowonganMagangById(
id
);
if (lowonganMagang.length === 0) {
return res.status(404).json({
message: "Internship vacancy not found",
});
}
const now = new Date();
const tgl_awal = new Date(lowonganMagang[0].durasi_awal);
const tgl_akhir = new Date(lowonganMagang[0].durasi_akhir);
let status_lowongan = "ditutup";
if (now >= tgl_awal && now <= tgl_akhir) {
status_lowongan = "dibuka";
}
lowonganMagang[0].status_lowongan = status_lowongan
return res.status(200).json({
message: "Successfully retrieved internship vacancy by ID",
data: lowonganMagang[0],
});
} catch (error) {
console.error(error);
return res.status(500).json({
message: "Internal server error",
error: error.message,
});
}
};
const getLowonganByKelompokPeminatan = async (req, res) => {
const { kelompok_peminatan } = req.params;
try {
const [lowonganMagang] = await lowonganMagangService.getLowonganByKelompokPeminatan(kelompok_peminatan);
if (lowonganMagang.length === 0) {
return res.status(404).json({
message: "No internship vacancies found for this specialization group",
});
}
const now = new Date();
const updatedLowongan = lowonganMagang.map(item => {
const durasiAwal = new Date(item.durasi_awal);
const durasiAkhir = new Date(item.durasi_akhir);
const status = now >= durasiAwal && now <= durasiAkhir ? "dibuka" : "ditutup";
return {
...item,
status_lowongan: status,
};
});
return res.status(200).json({
message: "Successfully retrieved internship vacancies by specialization group",
data: updatedLowongan,
});
} catch (error) {
console.error(error);
return res.status(500).json({
message: "Internal server error",
error: error.message,
});
}
}
const getAllKelompokPeminatan = async (req, res) => {
try {
const [kelompokPeminatan] = await lowonganMagangService.getAllKelompokPeminatan();
if (kelompokPeminatan.length === 0) {
return res.status(404).json({
message: "No internship specialization group found",
});
}
return res.status(200).json({
message: "Successfully retrieved all specialization group",
data: kelompokPeminatan.map(row => row.kelompok_peminatan),
});
} catch (error) {
return res.status(500).json({
message: "Internal server error",
error: error.message,
});
}
};
const deleteLowonganMagangById = async (req, res) => {
const { id } = req.params;
const role = req.role;
try {
if (role === "admin") {
const [lowonganMagang] = await lowonganMagangService.getLowonganMagangById(id);
if (!lowonganMagang || lowonganMagang.length === 0) {
return res.status(404).json({
message: "Internship vacancy not found",
});
}
const imagePath = lowonganMagang[0].image_path;
if (imagePath) {
const fileName = path.basename(imagePath); // Ambil nama file dari path
await deleteFileIfExists(fileName);
}
await lowonganMagangService.deleteLowonganMagangById(id);
return res.status(200).json({
message: "Internship vacancy deleted successfully",
});
}
return res.status(403).json({
message: "Access denied: Only admins can access this route",
});
} catch (error) {
console.error(error);
return res.status(500).json({
message: "Internal server error",
error: error.message,
});
}
};
module.exports = {
addLowonganMagang,
getAllLowonganMagang,
getLowonganMagangById,
getLowonganByKelompokPeminatan,
getAllKelompokPeminatan,
deleteLowonganMagangById,
};
+21
View File
@@ -0,0 +1,21 @@
const mahasiswaModel = require("../models/mahasiswa");
const getAllMahasiswa = async (req, res) => {
try {
const [result] = await mahasiswaModel.getAllMahasiswa();
res.status(200).json({
message: "Student data retrieved successfully",
data: result,
});
} catch (error) {
console.error("Error fetching all students:", error);
res.status(500).json({
message: "Internal server error",
error: error.message,
});
}
};
module.exports = {
getAllMahasiswa,
};
+159
View File
@@ -0,0 +1,159 @@
const partnershipModel = require("../models/partnership");
const path = require('path');
const { deleteFileIfExists } = require('../config/fileHelper');
const addPartnership = async (req, res) => {
const { nama_partner } = req.body;
const image = req.file;
try {
const image_path = await uploadGambar(image);
await partnershipModel.addPartnership(nama_partner, image_path);
res.status(200).json({
message: "Partnership data successfully added",
data: { nama_partner, image_path },
});
} catch (error) {
console.error("Error adding partnership:", error);
res.status(500).json({
message: "Internal server error",
error: error.message,
});
}
};
const uploadGambar = async (image) => {
try {
if (!image) {
throw new Error("Please upload an image!");
}
const file = `/uploads/${image.filename}`;
return file;
} catch (error) {
console.error(error.message);
throw new Error("Failed to upload image.");
}
};
const getPartnership = async (req, res) => {
try {
const [result] = await partnershipModel.getPartnership();
if (result.length === 0) {
return res.status(404).json({
message: "No partnership data",
});
}
res.status(200).json({
message: "Partnership data successfully retrieved",
data: result,
});
} catch (error) {
console.error("Error getting partnership:", error);
res.status(500).json({
message: "Internal server error",
error: error.message,
});
}
};
const deletePartnership = async (req, res) => {
try {
const { id } = req.params;
const [result] = await partnershipModel.deletePartnership(id);
if (result.affectedRows === 0) {
return res.status(404).json({
message: "Partnership data not found",
});
}
res.status(200).json({
message: "Partnership data successfully deleted",
});
} catch (error) {
console.error("Error deleting partnership:", error);
res.status(500).json({
message: "Internal server error",
error: error.message,
});
}
};
const getPartnershipById = async (req, res) => {
try {
const { id } = req.params
const [partnership] = await partnershipModel.getPartnershipById(id);
if (partnership.length === 0) {
return res.status(404).json({
messsage: "partnership not found",
});
}
res.status(200).json({
message: "patnership data was successfully collected",
data: partnership,
});
} catch (error) {
console.error("Error getting partnership results:", error);
res.status(500).json({
message: "Internal server error",
error: error.message,
});
}
}
const updatePartnership = async (req, res) => {
try {
const { id } = req.params;
const { nama_partner } = req.body;
const image = req.file;
const [existing] = await partnershipModel.getPartnershipById(id);
if (existing.length === 0) {
return res.status(404).json({ message: "Partnership not found" });
}
const currentData = existing[0];
let image_path = existing[0].image_path;
if (image) {
const oldFile = path.basename(image_path);
await deleteFileIfExists(oldFile);
image_path = await uploadGambar(image);
}
const updatedData = {
nama_partner: nama_partner?.trim() ? nama_partner : currentData.nama_partner,
image_path,
};
//console.log("form:",nama_partner, "db", currentData.nama_partner, "updated",updatedData.nama_partner)
await partnershipModel.updatePartnership(
id,
updatedData.nama_partner,
updatedData.image_path
);
return res.status(200).json({
message: "Partnership successfully updated",
data: { id, nama_partner: updatedData.nama_partner, image_path: updatedData.image_path },
});
} catch (error) {
console.error("Error updating partnership:", error);
res.status(500).json({
message: "Internal server error",
error: error.message,
});
}
};
module.exports = {
addPartnership,
getPartnership,
getPartnershipById,
updatePartnership,
deletePartnership,
};