""" 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}" }