TIF_E41253310/Backend/app/routers/keywords.py

203 lines
7.2 KiB
Python

"""
Router untuk Keyword Dictionary - PRD Section 7 & 24
"""
from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.orm import Session
from typing import List, Optional
from app.config.database import get_db
from app.schemas.models import (
KeywordDictionaryCreate,
KeywordDictionaryUpdate,
KeywordDictionaryResponse
)
from app.models.models import KeywordDictionary
router = APIRouter(tags=["Keyword Dictionary"])
@router.get("/", response_model=List[KeywordDictionaryResponse])
def get_all_keywords(
search: Optional[str] = None,
kode_prodi: Optional[str] = None,
aktif: Optional[bool] = None,
skip: int = 0,
limit: int = 500,
db: Session = Depends(get_db)
):
"""Ambil semua keyword dengan filter prodi, status aktif, dan pencarian kata kunci"""
query = db.query(KeywordDictionary)
if search:
query = query.filter(KeywordDictionary.keyword.ilike(f"%{search.strip()}%"))
if kode_prodi:
query = query.filter(KeywordDictionary.kode_prodi == kode_prodi.strip().upper())
if aktif is not None:
query = query.filter(KeywordDictionary.aktif == aktif)
return query.order_by(KeywordDictionary.kode_prodi.asc(), KeywordDictionary.keyword.asc()).offset(skip).limit(limit).all()
@router.get("/by-prodi/{kode_prodi}", response_model=List[KeywordDictionaryResponse])
def get_keywords_by_prodi(
kode_prodi: str,
db: Session = Depends(get_db)
):
"""Ambil keyword berdasarkan kode prodi"""
keywords = db.query(KeywordDictionary).filter(
KeywordDictionary.kode_prodi == kode_prodi,
KeywordDictionary.aktif == True
).all()
return keywords
@router.post("/", response_model=KeywordDictionaryResponse)
def create_keyword(
keyword_in: KeywordDictionaryCreate,
db: Session = Depends(get_db)
):
"""Tambah keyword baru"""
# Cek apakah keyword sudah ada
existing = db.query(KeywordDictionary).filter(
KeywordDictionary.kode_prodi == keyword_in.kode_prodi,
KeywordDictionary.keyword == keyword_in.keyword
).first()
if existing:
raise HTTPException(status_code=400, detail="Keyword sudah ada")
keyword = KeywordDictionary(**keyword_in.model_dump())
db.add(keyword)
db.commit()
db.refresh(keyword)
return keyword
@router.post("/bulk")
def create_bulk_keywords(
keywords: List[KeywordDictionaryCreate],
db: Session = Depends(get_db)
):
"""Tambah multiple keywords sekaligus"""
added = 0
for kw in keywords:
existing = db.query(KeywordDictionary).filter(
KeywordDictionary.kode_prodi == kw.kode_prodi,
KeywordDictionary.keyword == kw.keyword
).first()
if not existing:
keyword = KeywordDictionary(**kw.model_dump())
db.add(keyword)
added += 1
db.commit()
return {"status": "success", "keywords_added": added}
@router.put("/{keyword_id}", response_model=KeywordDictionaryResponse)
def update_keyword(
keyword_id: int,
keyword_in: KeywordDictionaryUpdate,
db: Session = Depends(get_db)
):
"""Update keyword"""
keyword = db.query(KeywordDictionary).filter(
KeywordDictionary.id == keyword_id
).first()
if not keyword:
raise HTTPException(status_code=404, detail="Keyword tidak ditemukan")
for key, value in keyword_in.model_dump(exclude_unset=True).items():
setattr(keyword, key, value)
db.commit()
db.refresh(keyword)
return keyword
@router.delete("/{keyword_id}")
def delete_keyword(
keyword_id: int,
hard: bool = True,
db: Session = Depends(get_db)
):
"""Hapus keyword (default: hapus permanen jika hard=True, nonaktifkan jika hard=False)"""
keyword = db.query(KeywordDictionary).filter(
KeywordDictionary.id == keyword_id
).first()
if not keyword:
raise HTTPException(status_code=404, detail="Keyword tidak ditemukan")
if hard:
db.delete(keyword)
db.commit()
return {"message": "Keyword berhasil dihapus permanen"}
else:
keyword.aktif = False
db.commit()
return {"message": "Keyword berhasil dinonaktifkan"}
# ============== SEED DEFAULT KEYWORDS ==============
@router.post("/seed-defaults")
def seed_default_keywords(db: Session = Depends(get_db)):
"""Isi default keywords sesuai PRD Section 7"""
default_keywords = [
# TKK - Teknik Komputer
{"kode_prodi": "TKK", "keyword": "jaringan", "kategori_keyword": "technical"},
{"kode_prodi": "TKK", "keyword": "network administrator", "kategori_keyword": "technical"},
{"kode_prodi": "TKK", "keyword": "network engineer", "kategori_keyword": "technical"},
{"kode_prodi": "TKK", "keyword": "LAN/WAN", "kategori_keyword": "technical"},
{"kode_prodi": "TKK", "keyword": "cloud computing", "kategori_keyword": "technical"},
{"kode_prodi": "TKK", "keyword": "IoT", "kategori_keyword": "technical"},
{"kode_prodi": "TKK", "keyword": "embedded system", "kategori_keyword": "technical"},
{"kode_prodi": "TKK", "keyword": "firmware", "kategori_keyword": "technical"},
{"kode_prodi": "TKK", "keyword": "hardware", "kategori_keyword": "technical"},
{"kode_prodi": "TKK", "keyword": "sysadmin", "kategori_keyword": "technical"},
{"kode_prodi": "TKK", "keyword": "IT support", "kategori_keyword": "technical"},
# MIF - Manajemen Informatika
{"kode_prodi": "MIF", "keyword": "programmer", "kategori_keyword": "technical"},
{"kode_prodi": "MIF", "keyword": "software developer", "kategori_keyword": "technical"},
{"kode_prodi": "MIF", "keyword": "database", "kategori_keyword": "technical"},
{"kode_prodi": "MIF", "keyword": "SQL", "kategori_keyword": "technical"},
{"kode_prodi": "MIF", "keyword": "data analyst", "kategori_keyword": "technical"},
{"kode_prodi": "MIF", "keyword": "data warehouse", "kategori_keyword": "technical"},
{"kode_prodi": "MIF", "keyword": "business intelligence", "kategori_keyword": "technical"},
{"kode_prodi": "MIF", "keyword": "ERD", "kategori_keyword": "technical"},
# TIF - Teknik Informatika
{"kode_prodi": "TIF", "keyword": "software engineer", "kategori_keyword": "technical"},
{"kode_prodi": "TIF", "keyword": "quality assurance", "kategori_keyword": "technical"},
{"kode_prodi": "TIF", "keyword": "QA/tester", "kategori_keyword": "technical"},
{"kode_prodi": "TIF", "keyword": "IT entrepreneur", "kategori_keyword": "technical"},
{"kode_prodi": "TIF", "keyword": "startup teknologi", "kategori_keyword": "technical"},
{"kode_prodi": "TIF", "keyword": "manajemen proyek IT", "kategori_keyword": "technical"},
{"kode_prodi": "TIF", "keyword": "konsultan perangkat lunak", "kategori_keyword": "technical"},
]
added = 0
for kw in default_keywords:
existing = db.query(KeywordDictionary).filter(
KeywordDictionary.kode_prodi == kw["kode_prodi"],
KeywordDictionary.keyword == kw["keyword"]
).first()
if not existing:
keyword = KeywordDictionary(**kw)
db.add(keyword)
added += 1
db.commit()
return {
"status": "success",
"message": f"Default keywords ditambahkan: {added}"
}