106 lines
3.8 KiB
Python
106 lines
3.8 KiB
Python
from typing import Optional
|
|
from fastapi import APIRouter, Depends, Query, status
|
|
from sqlalchemy.orm import Session
|
|
from app.config.database import get_db
|
|
from app.schemas.alumni import (
|
|
AlumniCreate,
|
|
AlumniUpdate,
|
|
PublicTracerLookupRequest,
|
|
PublicTracerSubmitRequest,
|
|
)
|
|
from app.controllers.alumni import AlumniController
|
|
from app.middleware.auth_middleware import get_current_active_user
|
|
|
|
# Create Router instance for alumni endpoints
|
|
router = APIRouter()
|
|
|
|
@router.get("/", summary="Ambil semua data alumni dengan filter dan pagination")
|
|
def get_all(
|
|
skip: int = Query(0, ge=0, description="Jumlah data yang dilewati (offset)"),
|
|
limit: int = Query(10, ge=1, le=500, description="Jumlah data per halaman"),
|
|
search: Optional[str] = Query(None, description="Cari berdasarkan NIM, Nama, Pekerjaan, Instansi, atau Email"),
|
|
kode_prodi: Optional[str] = Query(None, description="Filter berdasarkan kode prodi (misal: 55301, 57401, 56401)"),
|
|
tahun_lulus: Optional[int] = Query(None, description="Filter berdasarkan tahun lulus / angkatan"),
|
|
status_kerja: Optional[str] = Query(None, description="Filter berdasarkan status pekerjaan"),
|
|
db: Session = Depends(get_db)
|
|
):
|
|
"""
|
|
Mengambil data alumni dengan dukungan filter multi-kriteria dan pagination.
|
|
"""
|
|
return AlumniController.get_all_alumni(
|
|
db=db,
|
|
skip=skip,
|
|
limit=limit,
|
|
search=search,
|
|
kode_prodi=kode_prodi,
|
|
tahun_lulus=tahun_lulus,
|
|
status_kerja=status_kerja,
|
|
)
|
|
|
|
@router.get("/{alumni_id}", summary="Ambil detail lengkap alumni berdasarkan ID")
|
|
def get_by_id(alumni_id: int, db: Session = Depends(get_db)):
|
|
"""
|
|
Mengambil detail lengkap data satu alumni beserta pekerjaan, kompetensi,
|
|
jawaban kuesioner tracer study, dan hasil klasterisasi.
|
|
"""
|
|
return AlumniController.get_alumni(db, alumni_id)
|
|
|
|
@router.post("/public-tracer-lookup", summary="Cek status NIM & verifikasi kepemilikan Email untuk Tracer Study")
|
|
def public_tracer_lookup(
|
|
lookup_in: PublicTracerLookupRequest,
|
|
db: Session = Depends(get_db)
|
|
):
|
|
"""
|
|
Endpoint publik untuk kuesioner mandiri alumni:
|
|
Mengecek apakah NIM sudah terdaftar, dan memvalidasi kecocokan email jika ingin mengedit data.
|
|
"""
|
|
return AlumniController.public_tracer_lookup(db, lookup_in)
|
|
|
|
@router.post("/public-tracer-submit", summary="Kirim atau perbarui kuesioner Tracer Study oleh Alumni (Publik)")
|
|
def public_tracer_submit(
|
|
submit_in: PublicTracerSubmitRequest,
|
|
db: Session = Depends(get_db)
|
|
):
|
|
"""
|
|
Endpoint publik untuk alumni mengirim respons kuesioner (Create/Update).
|
|
"""
|
|
return AlumniController.public_tracer_submit(db, submit_in)
|
|
|
|
@router.post("/", status_code=status.HTTP_201_CREATED, summary="Tambah data alumni baru")
|
|
def create(
|
|
alumni_in: AlumniCreate,
|
|
db: Session = Depends(get_db),
|
|
current_user = Depends(get_current_active_user)
|
|
):
|
|
"""
|
|
Menambahkan data alumni baru ke database.
|
|
Membutuhkan autentikasi token Bearer JWT.
|
|
"""
|
|
return AlumniController.create_alumni(db, alumni_in)
|
|
|
|
@router.put("/{alumni_id}", summary="Perbarui data alumni")
|
|
def update(
|
|
alumni_id: int,
|
|
alumni_in: AlumniUpdate,
|
|
db: Session = Depends(get_db),
|
|
current_user = Depends(get_current_active_user)
|
|
):
|
|
"""
|
|
Memperbarui field data alumni berdasarkan ID.
|
|
Membutuhkan autentikasi token Bearer JWT.
|
|
"""
|
|
return AlumniController.update_alumni(db, alumni_id, alumni_in)
|
|
|
|
@router.delete("/{alumni_id}", summary="Hapus data alumni")
|
|
def delete(
|
|
alumni_id: int,
|
|
db: Session = Depends(get_db),
|
|
current_user = Depends(get_current_active_user)
|
|
):
|
|
"""
|
|
Menghapus data alumni berdasarkan ID dari database.
|
|
Membutuhkan autentikasi token Bearer JWT.
|
|
"""
|
|
return AlumniController.delete_alumni(db, alumni_id)
|
|
|