refactor: rewrite ke codebase lama
This commit is contained in:
+261
@@ -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,
|
||||
};
|
||||
Reference in New Issue
Block a user