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
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 412 KiB

+111
View File
@@ -0,0 +1,111 @@
CREATE TABLE `admin` (
`id` bigint(20) NOT NULL,
`nama_depan` varchar(255) NOT NULL,
`nama_belakang` varchar(255) NOT NULL,
`role` enum('admin') NOT NULL,
`email` varchar(255) NOT NULL,
`password` text NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
CREATE TABLE `hasil_research` (
`id` bigint(20) NOT NULL,
`image_path` text NOT NULL,
`nama_project` varchar(255) NOT NULL,
`deskripsi` varchar(255) NOT NULL,
`link_project` text NOT NULL,
`created_at` datetime NOT NULL DEFAULT current_timestamp()
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
CREATE TABLE `lamaran_magang` (
`id` bigint(20) NOT NULL,
`id_mahasiswa` bigint(20) NOT NULL,
`id_lowongan_magang` varchar(255) NOT NULL,
`status` enum('diterima','diproses','ditolak') NOT NULL,
`created_at` datetime NOT NULL,
`update_at` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
CREATE TABLE `lowongan_magang` (
`id` varchar(255) NOT NULL,
`posisi` varchar(255) NOT NULL,
`kelompok_peminatan` varchar(255) NOT NULL,
`image_path` text NOT NULL,
`jobdesk` text NOT NULL,
`lokasi` varchar(255) NOT NULL,
`kualifikasi` text NOT NULL,
`benefit` text NOT NULL,
`durasi_awal` date NOT NULL,
`durasi_akhir` date NOT NULL,
`status_lowongan` enum('dibuka','ditutup') NOT NULL,
`paid` enum('paid','unpaid') NOT NULL,
`created_at` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
CREATE TABLE `mahasiswa` (
`id` bigint(20) NOT NULL,
`nama_depan` varchar(255) NOT NULL,
`nama_belakang` varchar(255) DEFAULT NULL,
`email` varchar(255) NOT NULL,
`kontak` varchar(255) NOT NULL,
`jurusan` varchar(255) NOT NULL,
`role` enum('student') NOT NULL,
`cv_path` text NOT NULL,
`portofolio_path` text NOT NULL,
`motivasi` text NOT NULL,
`relevant_skills` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
CREATE TABLE `partnership` (
`id` bigint(20) NOT NULL,
`nama_partner` varchar(255) NOT NULL,
`image_path` text NOT NULL,
`created_at` datetime NOT NULL DEFAULT current_timestamp()
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
ALTER TABLE `admin`
ADD PRIMARY KEY (`id`);
ALTER TABLE `hasil_research`
ADD PRIMARY KEY (`id`);
ALTER TABLE `lamaran_magang`
ADD PRIMARY KEY (`id`),
ADD KEY `lamaran_magang_id_mahasiswa_foreign` (`id_mahasiswa`),
ADD KEY `lamaran_magang_id_lowongan_magang_foreign` (`id_lowongan_magang`);
ALTER TABLE `lowongan_magang`
ADD PRIMARY KEY (`id`);
ALTER TABLE `mahasiswa`
ADD PRIMARY KEY (`id`);
ALTER TABLE `partnership`
ADD PRIMARY KEY (`id`);
ALTER TABLE `admin`
MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;
ALTER TABLE `hasil_research`
MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;
ALTER TABLE `lamaran_magang`
MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=6;
ALTER TABLE `mahasiswa`
MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=6;
ALTER TABLE `partnership`
MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT;
ALTER TABLE `lamaran_magang`
ADD CONSTRAINT `lamaran_magang_id_lowongan_magang_foreign` FOREIGN KEY (`id_lowongan_magang`) REFERENCES `lowongan_magang` (`id`),
ADD CONSTRAINT `lamaran_magang_id_mahasiswa_foreign` FOREIGN KEY (`id_mahasiswa`) REFERENCES `mahasiswa` (`id`);
COMMIT;
+180
View File
@@ -0,0 +1,180 @@
const swaggerJsDoc = require("swagger-jsdoc");
const swaggerUi = require("swagger-ui-express");
const path = require('path');
const swaggerOptions = {
definition: {
openapi: "3.0.0",
info: {
title: "Internify by HUMIC Engineering APIs",
version: "1.2.0",
description: "Comprehensive REST API for managing internship applications, job postings, partnerships, and feedback for the Internify web application. This API provides endpoints for admin management, authentication, internship vacancy management, application processing, student data, partnerships, research results, FAQs, feedback, and batch management. Created by Ramadhana & Yohanes",
contact: {
name: "HUMIC Engineering",
url: "https://humic.dev"
}
},
servers: [
{
url: process.env.NODE_ENV === 'production'
? 'https://internify-ruddy.vercel.app/'
: `http://localhost:${process.env.EXPRESS_PORT || 9000}`,
description: process.env.NODE_ENV === 'production' ? 'Production server' : 'Development server'
}
],
tags: [
{
name: "Auth",
description: "Authentication endpoints for admin login and profile retrieval"
},
{
name: "Admin",
description: "Admin account management endpoints"
},
{
name: "Batch",
description: "Batch management for organizing internship cohorts"
},
{
name: "Lowongan Magang",
description: "Internship vacancy/job posting management endpoints"
},
{
name: "Lamaran Magang",
description: "Internship application management and statistics endpoints"
},
{
name: "Mahasiswa",
description: "Student data management endpoints"
},
{
name: "Partnership",
description: "Partner organization management endpoints"
},
{
name: "Hasil Research",
description: "Internship research results and project showcase endpoints"
},
{
name: "FAQ",
description: "Frequently Asked Questions management endpoints"
},
{
name: "Feedback",
description: "Internship feedback and testimonial management endpoints"
}
],
components: {
securitySchemes: {
bearerAuth: {
type: "http",
scheme: "bearer",
bearerFormat: "JWT",
description: "JWT token obtained from the /auth-api/login endpoint"
},
},
responses: {
UnauthorizedError: {
description: "Access token is missing or invalid",
content: {
"application/json": {
schema: {
type: "object",
properties: {
message: {
type: "string",
example: "Unauthorized access"
}
}
}
}
}
},
ForbiddenError: {
description: "User does not have permission to access this resource",
content: {
"application/json": {
schema: {
type: "object",
properties: {
message: {
type: "string",
example: "Access denied: Admin only"
}
}
}
}
}
},
NotFoundError: {
description: "The requested resource was not found",
content: {
"application/json": {
schema: {
type: "object",
properties: {
message: {
type: "string",
example: "Resource not found"
}
}
}
}
}
},
ValidationError: {
description: "Request validation failed",
content: {
"application/json": {
schema: {
type: "object",
properties: {
message: {
type: "string",
example: "Validation error"
},
errors: {
type: "array",
items: {
type: "string"
}
}
}
}
}
}
},
InternalServerError: {
description: "Internal server error",
content: {
"application/json": {
schema: {
type: "object",
properties: {
message: {
type: "string",
example: "Internal server error"
}
}
}
}
}
}
}
},
},
apis: [
path.join(__dirname, '../routes/*.js'),
path.join(__dirname, '../controllers/*.js'),
],
};
const swaggerSpec = swaggerJsDoc(swaggerOptions);
const setupSwaggerDocs = (app) => {
app.use("/api-docs", swaggerUi.serve, swaggerUi.setup(swaggerSpec));
console.log("Swagger UI available at /api-docs");
};
module.exports = setupSwaggerDocs;
-211
View File
@@ -1,211 +0,0 @@
import path from 'path';
import type { Application } from 'express';
const swaggerJsdoc = require('swagger-jsdoc');
const swaggerUi = require('swagger-ui-express');
const port = process.env.PORT || '5000';
const swaggerOptions = {
definition: {
openapi: '3.0.0',
info: {
title: 'Internify LMS API - HUMIC Engineering',
version: '1.0.0',
description: 'Dokumentasi REST API Internify LMS untuk autentikasi, pengelolaan lowongan magang, lamaran, dan konten platform.',
contact: {
name: 'HUMIC Engineering',
url: 'https://humic.telkomuniversity.ac.id/'
}
},
servers: [
{
url: process.env.NODE_ENV === 'production'
? 'https://your-production-domain.example.com'
: `http://localhost:${port}`,
description: process.env.NODE_ENV === 'production'
? 'Prod'
: 'Dev'
}
],
tags: [
{
name: 'Auth',
description: 'Endpoint autentikasi untuk login admin/peserta dan profil pengguna.'
},
{
name: 'Admin',
description: 'Endpoint utilitas dan pengelolaan sistem yang terkait admin.'
},
{
name: 'Batch',
description: 'Endpoint pengelolaan batch/angkatan magang.'
},
{
name: 'Lowongan Magang',
description: 'Endpoint pengelolaan lowongan magang.'
},
{
name: 'Lamaran Magang',
description: 'Endpoint pengelolaan lamaran magang.'
},
{
name: 'Mahasiswa',
description: 'Endpoint pengelolaan data mahasiswa/peserta.'
},
{
name: 'Partnership',
description: 'Endpoint pengelolaan data mitra/partnership.'
},
{
name: 'Hasil Research',
description: 'Endpoint pengelolaan hasil research/proyek.'
},
{
name: 'FAQ',
description: 'Endpoint pengelolaan FAQ (pertanyaan yang sering diajukan).'
},
{
name: 'Feedback',
description: 'Endpoint pengelolaan feedback/testimoni peserta.'
}
],
components: {
securitySchemes: {
bearerAuth: {
type: 'http',
scheme: 'bearer',
bearerFormat: 'JWT',
description: 'Token JWT yang diperoleh dari endpoint /api/auth/login'
}
},
responses: {
UnauthorizedError: {
description: 'Token akses tidak ada atau tidak valid',
content: {
'application/json': {
examples: {
tokenMissing: {
value: {
status: 'error',
statusCode: 401,
message: 'Not authorized to access this route, token is missing'
}
},
tokenInvalid: {
value: {
status: 'error',
statusCode: 401,
message: 'Not authorized to access this route, token is invalid or expired'
}
},
userNotExist: {
value: {
status: 'error',
statusCode: 401,
message: 'User belonging to this token no longer exists'
}
}
}
}
}
},
ForbiddenError: {
description: 'Pengguna tidak memiliki izin untuk mengakses resource ini',
content: {
'application/json': {
example: {
status: 'error',
statusCode: 403,
message: 'You do not have permission to perform this action'
}
}
}
},
NotFoundError: {
description: 'Resource yang diminta tidak ditemukan',
content: {
'application/json': {
schema: {
type: 'object',
properties: {
status: {
type: 'string',
example: 'error'
},
statusCode: {
type: 'integer',
example: 404
},
message: {
type: 'string',
example: 'Not Found - /api/endpoint-yang-tidak-ada'
}
}
}
}
}
},
ValidationError: {
description: 'Validasi request gagal',
content: {
'application/json': {
example: {
status: 'error',
statusCode: 400,
message: 'Mohon lengkapi semua field wajib yang diperlukan'
}
}
}
},
InternalServerError: {
description: 'Terjadi kesalahan pada server internal',
content: {
'application/json': {
schema: {
type: 'object',
properties: {
status: {
type: 'string',
example: 'error'
},
statusCode: {
type: 'integer',
example: 500
},
message: {
type: 'string',
example: 'Internal Server Error'
}
}
}
}
}
}
}
}
},
apis: [
path.join(__dirname, '../app.ts').replace(/\\/g, '/'),
path.join(__dirname, '../app.js').replace(/\\/g, '/'),
path.join(__dirname, '../routes/*.ts').replace(/\\/g, '/'),
path.join(__dirname, '../controllers/*.ts').replace(/\\/g, '/'),
path.join(__dirname, '../routes/*.js').replace(/\\/g, '/'),
path.join(__dirname, '../controllers/*.js').replace(/\\/g, '/')
]
};
const swaggerSpec = swaggerJsdoc(swaggerOptions);
export const setupSwaggerDocs = (app: Application) => {
const swaggerEnabledValue = process.env.SWAGGER_ENABLE ?? process.env.SWAGGER_ENABLE ?? 'true';
const isSwaggerEnabled = swaggerEnabledValue.toLowerCase() === 'true';
if (!isSwaggerEnabled) {
return;
}
app.use('/api/docs', swaggerUi.serve, swaggerUi.setup(swaggerSpec));
console.log('Swagger UI available at /api/docs');
};
export default setupSwaggerDocs;