package handler import ( "database/sql" "net/http" "strconv" "strings" "floorvisualizer/internal/repository" ) func handleArticles(db *sql.DB) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { // /articles/{id} — detail idStr := strings.TrimPrefix(r.URL.Path, "/articles/") if idStr != "" && idStr != r.URL.Path { id, err := strconv.Atoi(idStr) if err != nil { writeJSON(w, 400, map[string]string{"error": "invalid article id"}) return } article, err := repository.GetArticleByID(db, id) if err != nil { writeJSON(w, 404, map[string]string{"error": "article not found"}) return } writeJSON(w, 200, article) return } // /articles — list page, _ := strconv.Atoi(r.URL.Query().Get("page")) limit, _ := strconv.Atoi(r.URL.Query().Get("limit")) articles, total, err := repository.ListArticles(db, page, limit) if err != nil { writeJSON(w, 500, map[string]string{"error": err.Error()}) return } effectiveLimit := limit if effectiveLimit <= 0 { effectiveLimit = 10 } totalPages := 0 if total > 0 { totalPages = (total + effectiveLimit - 1) / effectiveLimit } writeJSON(w, 200, map[string]interface{}{ "articles": articles, "total": total, "page": page, "limit": effectiveLimit, "total_pages": totalPages, }) } } func handleArticleRecommend(db *sql.DB) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { count := 6 if c, err := strconv.Atoi(r.URL.Query().Get("count")); err == nil && c > 0 && c <= 20 { count = c } articles, err := repository.RandomArticles(db, count) if err != nil { writeJSON(w, 500, map[string]string{"error": err.Error()}) return } writeJSON(w, 200, map[string]interface{}{ "articles": articles, "total": len(articles), }) } }