package handler import ( "net/http" "github.com/prabhupadasays/spsays-bff/internal/repository" "github.com/prabhupadasays/spsays-bff/pkg/response" ) type DiscipleHandler struct { repo *repository.DiscipleRepo } func NewDiscipleHandler(repo *repository.DiscipleRepo) *DiscipleHandler { return &DiscipleHandler{repo: repo} } func (h *DiscipleHandler) List(w http.ResponseWriter, r *http.Request) { letter := r.URL.Query().Get("letter") suffix := r.URL.Query().Get("suffix") var letterPtr, suffixPtr *string if letter != "" && letter != "All" { letterPtr = &letter } if suffix != "" { suffixPtr = &suffix } docs, err := h.repo.GetByLetterAndSuffix(r.Context(), letterPtr, suffixPtr) if err != nil { response.Error(w, http.StatusInternalServerError, "failed to fetch disciples") return } response.JSON(w, http.StatusOK, docs) } func (h *DiscipleHandler) Count(w http.ResponseWriter, r *http.Request) { letter := r.URL.Query().Get("letter") suffix := r.URL.Query().Get("suffix") var letterPtr, suffixPtr *string if letter != "" && letter != "All" { letterPtr = &letter } if suffix != "" { suffixPtr = &suffix } total, err := h.repo.Count(r.Context()) if err != nil { response.Error(w, http.StatusInternalServerError, "failed to count disciples") return } filtered, err := h.repo.CountFiltered(r.Context(), letterPtr, suffixPtr) if err != nil { response.Error(w, http.StatusInternalServerError, "failed to count filtered disciples") return } response.JSON(w, http.StatusOK, map[string]int64{"total": total, "filtered": filtered}) } func (h *DiscipleHandler) LetterCounts(w http.ResponseWriter, r *http.Request) { docs, err := h.repo.GetLetterCounts(r.Context()) if err != nil { response.Error(w, http.StatusInternalServerError, "failed to fetch letter counts") return } response.JSON(w, http.StatusOK, docs) } func (h *DiscipleHandler) SuffixCounts(w http.ResponseWriter, r *http.Request) { docs, err := h.repo.GetSuffixCounts(r.Context()) if err != nil { response.Error(w, http.StatusInternalServerError, "failed to fetch suffix counts") return } response.JSON(w, http.StatusOK, docs) } func (h *DiscipleHandler) Search(w http.ResponseWriter, r *http.Request) { query := r.URL.Query().Get("q") if query == "" { response.Error(w, http.StatusBadRequest, "search query is required") return } docs, err := h.repo.Search(r.Context(), query, 100) if err != nil { response.Error(w, http.StatusInternalServerError, "failed to search disciples") return } response.JSON(w, http.StatusOK, docs) }