262 lines
7.1 KiB
JavaScript
Executable File
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,
|
|
};
|