package site import ( "net/http" "net/netip" "server/internal/model/common" "server/internal/pkg/errs" "server/internal/pkg/httputil" "server/internal/router" "server/internal/service/web" "github.com/go-chi/chi/v5" ) var _ router.Registrar = (*PostHandler)(nil) type PostHandler struct { postService *web.PostService } func (h *PostHandler) Register(r chi.Router) { r.Get("/posts", h.ListPage) r.Get("/posts/{slug}", h.GetPost) r.Get("/categories/stats", h.ListCategoryStats) r.Get("/posts/archives", h.ListArchives) r.Get("/posts/tags", h.ListPostTags) } func NewPostHandler(postService *web.PostService) *PostHandler { return &PostHandler{postService: postService} } func (h *PostHandler) ListPage(w http.ResponseWriter, r *http.Request) { pagination := httputil.Pagination(r) result, err := h.postService.ListPage(r.Context(), pagination) if err != nil { httputil.Fail(w, err) return } resp := common.PageResponse{ Page: pagination.Page, PageSize: pagination.PageSize, List: result.List, Total: result.Total, } httputil.OkWithPage(w, &resp) } func (h *PostHandler) GetPost(w http.ResponseWriter, r *http.Request) { slug := chi.URLParam(r, "slug") if slug == "" { httputil.Fail(w, errs.ErrSlugRequired) return } ip, err := netip.ParseAddr(httputil.ClientIP(r)) if err != nil { httputil.Fail(w, err) return } post, err := h.postService.GetPost(r.Context(), slug, ip) if err != nil { httputil.Fail(w, err) return } httputil.Ok(w, post) } func (h *PostHandler) ListCategoryStats(w http.ResponseWriter, r *http.Request) { list, err := h.postService.ListCategoryStats(r.Context()) if err != nil { httputil.Fail(w, err) return } httputil.Ok(w, list) } func (h *PostHandler) ListArchives(w http.ResponseWriter, r *http.Request) { list, err := h.postService.ListArchives(r.Context()) if err != nil { httputil.Fail(w, err) return } httputil.Ok(w, list) } func (h *PostHandler) ListPostTags(w http.ResponseWriter, r *http.Request) { list, err := h.postService.ListPostTags(r.Context()) if err != nil { httputil.Fail(w, err) return } httputil.Ok(w, list) }