Files
internify-be/oldCode/controllers/lowonganMagang.controller.js
2026-06-07 20:19:30 +07:00

262 lines
7.1 KiB
JavaScript
Executable File

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,
};