203 lines
7.2 KiB
Python
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}"
|
|
}
|