refactor: rewrite ke codebase lama
This commit is contained in:
Executable
+45
@@ -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' });
|
||||
}
|
||||
};
|
||||
Executable
+70
@@ -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
@@ -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
@@ -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
@@ -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,
|
||||
};
|
||||
Executable
+21
@@ -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
@@ -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,
|
||||
};
|
||||
Executable
+36
@@ -0,0 +1,36 @@
|
||||
import db from '../helpers/db/db_connection.js';
|
||||
import bcrypt from 'bcrypt';
|
||||
|
||||
export async function addAdmin(
|
||||
nama_depan,
|
||||
nama_belakang,
|
||||
email,
|
||||
plainpassword,
|
||||
role
|
||||
) {
|
||||
const saltRounds = 10;
|
||||
const hashedPass = await bcrypt.hash(plainpassword, saltRounds);
|
||||
const SQLQuery =
|
||||
'INSERT INTO admin (nama_depan, nama_belakang, email, password, role) VALUES (? ,?, ?, ?, ?)';
|
||||
return db.execute(SQLQuery, [
|
||||
nama_depan,
|
||||
nama_belakang,
|
||||
email,
|
||||
hashedPass,
|
||||
role,
|
||||
]);
|
||||
}
|
||||
|
||||
export function getAdmin() {
|
||||
return db.execute('SELECT * FROM admin');
|
||||
}
|
||||
|
||||
export function getAdminByEmail(email) {
|
||||
return db.execute('SELECT * FROM admin WHERE email = ?', [email]);
|
||||
}
|
||||
|
||||
export function getAdminById(id) {
|
||||
return db.execute('SELECT * FROM admin WHERE id = ?', [id]);
|
||||
}
|
||||
|
||||
|
||||
Executable
+28
@@ -0,0 +1,28 @@
|
||||
import db from '../config/db_connection.js';
|
||||
|
||||
export function addhasilResearch(nama_project, deskripsi, link_project, image_path) {
|
||||
const SQLQuery =
|
||||
'INSERT INTO hasil_research (nama_project, deskripsi, link_project, image_path) VALUES (?,?,?,?)';
|
||||
return db.execute(SQLQuery, [nama_project, deskripsi, link_project, image_path]);
|
||||
}
|
||||
|
||||
export function gethasilResearch() {
|
||||
return db.execute('SELECT * FROM hasil_research');
|
||||
}
|
||||
|
||||
export function gethasilResearchById(id) {
|
||||
return db.execute('SELECT * FROM hasil_research WHERE id = ?', [id]);
|
||||
}
|
||||
|
||||
export function updateHasilResearch(id, nama_project, deskripsi, link_project, image_path) {
|
||||
const SQLQuery = `
|
||||
UPDATE hasil_research
|
||||
SET nama_project = ?, deskripsi = ?, link_project = ?, image_path = ?
|
||||
WHERE id = ?
|
||||
`;
|
||||
return db.execute(SQLQuery, [nama_project, deskripsi, link_project, image_path, id]);
|
||||
}
|
||||
|
||||
export function deletehasilResearch(id) {
|
||||
return db.execute('DELETE FROM hasil_research WHERE id = ?', [id]);
|
||||
}
|
||||
Executable
+123
@@ -0,0 +1,123 @@
|
||||
import db from '../config/db_connection.js';
|
||||
|
||||
export function addlowonganMagang(id_mahasiswa, id_lowongan_magang, status) {
|
||||
const SQLQuery =
|
||||
'INSERT INTO lamaran_magang (id_mahasiswa, id_lowongan_magang, status, created_at, update_at) VALUES (?, ?, ?, NOW(), NOW())';
|
||||
return db.execute(SQLQuery, [id_mahasiswa, id_lowongan_magang, status]);
|
||||
}
|
||||
|
||||
export function getAllLamaranMagang() {
|
||||
const SQLQuery = `
|
||||
SELECT
|
||||
lm.id,
|
||||
m.nama_depan,
|
||||
m.nama_belakang,
|
||||
l.posisi,
|
||||
l.kelompok_peminatan,
|
||||
lm.status,
|
||||
lm.created_at
|
||||
FROM
|
||||
lamaran_magang lm
|
||||
JOIN
|
||||
mahasiswa m ON lm.id_mahasiswa = m.id
|
||||
JOIN
|
||||
lowongan_magang l ON lm.id_lowongan_magang = l.id;
|
||||
`;
|
||||
return db.execute(SQLQuery);
|
||||
}
|
||||
|
||||
export function getLamaranByID(id_lamaran_magang) {
|
||||
const SQLQuery = `
|
||||
SELECT
|
||||
m.nama_depan,
|
||||
m.nama_belakang,
|
||||
m.email,
|
||||
m.kontak,
|
||||
m.jurusan,
|
||||
m.cv_path,
|
||||
m.portofolio_path,
|
||||
m.motivasi,
|
||||
m.relevant_skills,
|
||||
l.posisi,
|
||||
lm.status
|
||||
FROM
|
||||
lamaran_magang lm
|
||||
JOIN
|
||||
mahasiswa m ON lm.id_mahasiswa = m.id
|
||||
JOIN
|
||||
lowongan_magang l ON lm.id_lowongan_magang = l.id
|
||||
WHERE lm.id = ?;
|
||||
`;
|
||||
return db.execute(SQLQuery, [id_lamaran_magang]);
|
||||
}
|
||||
|
||||
export function updateStatusLamaran(id_lamaran_magang, status) {
|
||||
const SQLQuery =
|
||||
'UPDATE lamaran_magang SET status = ?, update_at = NOW() WHERE id = ?';
|
||||
return db.execute(SQLQuery, [status, id_lamaran_magang]);
|
||||
}
|
||||
|
||||
export function getDetailLamaranById(idLamaran) {
|
||||
const SQLQuery = `
|
||||
SELECT
|
||||
lm.id AS id_lamaran,
|
||||
lm.status,
|
||||
lm.created_at,
|
||||
lm.update_at,
|
||||
|
||||
m.id AS id_mahasiswa,
|
||||
m.nama_depan,
|
||||
m.nama_belakang,
|
||||
m.email,
|
||||
m.kontak,
|
||||
m.jurusan,
|
||||
m.cv_path,
|
||||
m.portofolio_path,
|
||||
m.motivasi,
|
||||
m.relevant_skills,
|
||||
|
||||
l.id AS id_lowongan,
|
||||
l.posisi,
|
||||
l.kelompok_peminatan,
|
||||
l.image_path,
|
||||
l.jobdesk,
|
||||
l.lokasi,
|
||||
l.kualifikasi,
|
||||
l.benefit,
|
||||
l.durasi_awal,
|
||||
l.durasi_akhir,
|
||||
l.status_lowongan,
|
||||
l.paid,
|
||||
l.created_at AS created_at_lowongan
|
||||
|
||||
FROM lamaran_magang lm
|
||||
JOIN mahasiswa m ON lm.id_mahasiswa = m.id
|
||||
JOIN lowongan_magang l ON lm.id_lowongan_magang = l.id
|
||||
WHERE lm.id = ?;
|
||||
`;
|
||||
return db.execute(SQLQuery, [idLamaran]);
|
||||
}
|
||||
|
||||
export function getAllExportData() {
|
||||
const SQLQuery = `
|
||||
SELECT
|
||||
m.nama_depan,
|
||||
m.nama_belakang,
|
||||
m.email,
|
||||
m.kontak,
|
||||
m.jurusan,
|
||||
l.posisi,
|
||||
l.kelompok_peminatan
|
||||
FROM
|
||||
lamaran_magang lm
|
||||
JOIN
|
||||
mahasiswa m ON lm.id_mahasiswa = m.id
|
||||
JOIN
|
||||
lowongan_magang l ON lm.id_lowongan_magang = l.id;
|
||||
`;
|
||||
return db.execute(SQLQuery);
|
||||
}
|
||||
|
||||
export function deleteAllLamaranMagang() {
|
||||
return db.execute('DELETE FROM lamaran_magang');
|
||||
}
|
||||
Executable
+55
@@ -0,0 +1,55 @@
|
||||
import db from '../helpers/db/db_connection.js';
|
||||
|
||||
export function addlowonganMagang(
|
||||
id,
|
||||
posisi,
|
||||
kelompok_peminatan,
|
||||
jobdesk,
|
||||
lokasi,
|
||||
kualifikasi,
|
||||
benefit,
|
||||
durasi_awal,
|
||||
durasi_akhir,
|
||||
status_lowongan,
|
||||
paid,
|
||||
image_path
|
||||
) {
|
||||
const SQLQuery = `INSERT INTO lowongan_magang (id,posisi, kelompok_peminatan, jobdesk, lokasi, kualifikasi, benefit, durasi_awal, durasi_akhir, status_lowongan, paid,created_at,image_path) VALUES (?,?, ?, ?, ?, ?, ?, ?, ?, ?, ?, NOW(),?)`;
|
||||
return db.execute(SQLQuery, [
|
||||
id,
|
||||
posisi,
|
||||
kelompok_peminatan,
|
||||
jobdesk,
|
||||
lokasi,
|
||||
kualifikasi,
|
||||
benefit,
|
||||
durasi_awal,
|
||||
durasi_akhir,
|
||||
status_lowongan,
|
||||
paid,
|
||||
image_path,
|
||||
]);
|
||||
}
|
||||
|
||||
export function getAllLowonganMagang() {
|
||||
return db.execute('SELECT * FROM lowongan_magang');
|
||||
}
|
||||
|
||||
export function getLowonganMagangById(id) {
|
||||
return db.execute('SELECT * FROM lowongan_magang WHERE id = ?', [id]);
|
||||
}
|
||||
|
||||
export function getLowonganByKelompokPeminatan(kelompok_peminatan) {
|
||||
return db.execute(
|
||||
'SELECT * FROM lowongan_magang WHERE kelompok_peminatan = ?',
|
||||
[kelompok_peminatan]
|
||||
);
|
||||
}
|
||||
|
||||
export function getAllKelompokPeminatan() {
|
||||
return db.execute('SELECT DISTINCT kelompok_peminatan FROM lowongan_magang');
|
||||
}
|
||||
|
||||
export function deleteLowonganMagangById(id) {
|
||||
return db.execute('DELETE FROM lowongan_magang WHERE id = ?', [id]);
|
||||
}
|
||||
Executable
+45
@@ -0,0 +1,45 @@
|
||||
import db from '../helpers/db/db_connection.js';
|
||||
|
||||
export function addMahasiswa(
|
||||
nama_depan,
|
||||
nama_belakang,
|
||||
email,
|
||||
kontak,
|
||||
jurusan,
|
||||
role,
|
||||
cv_path,
|
||||
portofolio_path,
|
||||
motivasi,
|
||||
relevant_skills
|
||||
) {
|
||||
const SQLQuery =
|
||||
'INSERT INTO mahasiswa (nama_depan, nama_belakang, email, kontak, jurusan, role, cv_path, portofolio_path, motivasi, relevant_skills) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)';
|
||||
return db.execute(SQLQuery, [
|
||||
nama_depan,
|
||||
nama_belakang,
|
||||
email,
|
||||
kontak,
|
||||
jurusan,
|
||||
role,
|
||||
cv_path,
|
||||
portofolio_path,
|
||||
motivasi,
|
||||
relevant_skills,
|
||||
]);
|
||||
}
|
||||
|
||||
export function getAllMahasiswa() {
|
||||
return db.execute('SELECT * FROM mahasiswa');
|
||||
}
|
||||
|
||||
export function getMahasiswaById(id) {
|
||||
return db.execute('SELECT * FROM mahasiswa WHERE id = ?', [id]);
|
||||
}
|
||||
|
||||
export function getMahasiswaByEmail(email) {
|
||||
return db.execute('SELECT * FROM mahasiswa WHERE email = ?', [email]);
|
||||
}
|
||||
|
||||
export function deleteAllMahasiswa() {
|
||||
return db.execute('DELETE FROM mahasiswa');
|
||||
}
|
||||
Executable
+28
@@ -0,0 +1,28 @@
|
||||
import db from '../config/db_connection.js';
|
||||
|
||||
export function addPartnership(nama_partner, image_path) {
|
||||
const SQLQuery =
|
||||
'INSERT INTO partnership (nama_partner,image_path) VALUES (?, ?)';
|
||||
return db.execute(SQLQuery, [nama_partner, image_path]);
|
||||
}
|
||||
|
||||
export function getPartnership() {
|
||||
return db.execute('SELECT * FROM partnership');
|
||||
}
|
||||
|
||||
export function getPartnershipById(id) {
|
||||
return db.execute('SELECT * FROM partnership WHERE id = ?', [id]);
|
||||
}
|
||||
|
||||
export function updatePartnership(id, nama_partner, image_path) {
|
||||
const SQLQuery = `
|
||||
UPDATE partnership
|
||||
SET nama_partner = ?, image_path = ?
|
||||
WHERE id = ?
|
||||
`;
|
||||
return db.execute(SQLQuery, [nama_partner, image_path, id]);
|
||||
}
|
||||
|
||||
export function deletePartnership(id) {
|
||||
return db.execute('DELETE FROM partnership WHERE id = ?', [id]);
|
||||
}
|
||||
Reference in New Issue
Block a user