TIF_E41253310/Backend/app/routers/alumni.py

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)