Files
tm_back/internal/company_category/handler.go
T
n.nakhostin 991771ee19 Add Company Category Management Functionality and Update API Documentation
- Introduced a new company category management feature, including CRUD operations for categories in both admin and public API endpoints.
- Implemented category entity, service, repository, and handler layers following clean architecture principles.
- Added new API routes for searching, retrieving, updating, deleting, and toggling publish status of categories, enhancing the overall functionality of the system.
- Updated Swagger and YAML documentation to include detailed descriptions and examples for the new category endpoints, ensuring clarity for API consumers.
- Enhanced error handling for duplicate categories and validation, improving the robustness of the category management process.
- Updated existing routes to integrate category handling, ensuring a seamless user experience across the application.
2025-09-08 12:31:49 +03:30

214 lines
8.1 KiB
Go

package company_category
import (
"tm/pkg/logger"
"tm/pkg/response"
"github.com/labstack/echo/v4"
)
// Handler handles HTTP requests for category operations
type Handler struct {
service Service
logger logger.Logger
}
// NewHandler creates a new category handler
func NewHandler(service Service, logger logger.Logger) *Handler {
return &Handler{
service: service,
logger: logger,
}
}
// Create creates a new category (Web Panel)
// @Summary Create a new category
// @Description Create a new category with name, description, and thumbnail
// @Tags Admin-Company-Categories
// @Accept json
// @Produce json
// @Param category body CategoryForm true "Category information"
// @Success 201 {object} response.APIResponse{data=CategoryResponse} "Category created successfully"
// @Failure 400 {object} response.APIResponse "Bad request - Invalid input data"
// @Failure 409 {object} response.APIResponse "Conflict - Category with this name already exists"
// @Failure 422 {object} response.APIResponse "Validation error - Invalid request data"
// @Failure 500 {object} response.APIResponse "Internal server error"
// @Security BearerAuth
// @Router /admin/v1/company-categories [post]
func (h *Handler) Create(c echo.Context) error {
form, err := response.Parse[CategoryForm](c)
if err != nil {
return response.ValidationError(c, "Invalid request data", err.Error())
}
category, err := h.service.Create(c.Request().Context(), form)
if err != nil {
if err.Error() == "category with this name already exists" {
return response.Conflict(c, err.Error())
}
return response.InternalServerError(c, "Failed to create category")
}
return response.Created(c, category, "Category created successfully")
}
// GetCategory retrieves a category by ID (Web Panel)
// @Summary Get category by ID
// @Description Retrieve detailed category information by category ID
// @Tags Admin-Company-Categories
// @Accept json
// @Produce json
// @Param id path string true "Category ID"
// @Success 200 {object} response.APIResponse{data=CategoryResponse} "Category retrieved successfully"
// @Failure 400 {object} response.APIResponse "Bad request - Invalid category ID"
// @Failure 404 {object} response.APIResponse "Not found - Category not found"
// @Failure 500 {object} response.APIResponse "Internal server error"
// @Security BearerAuth
// @Router /admin/v1/company-categories/{id} [get]
func (h *Handler) Get(c echo.Context) error {
id := c.Param("id")
category, err := h.service.GetByID(c.Request().Context(), id)
if err != nil {
if err.Error() == "category not found" {
return response.NotFound(c, "Category not found")
}
return response.InternalServerError(c, "Failed to get category")
}
return response.Success(c, category, "Category retrieved successfully")
}
// Update updates a category (Web Panel)
// @Summary Update category information
// @Description Update category information including name, description, and thumbnail
// @Tags Admin-Company-Categories
// @Accept json
// @Produce json
// @Param id path string true "Category ID"
// @Param category body CategoryForm true "Category update information"
// @Success 200 {object} response.APIResponse{data=CategoryResponse} "Category updated successfully"
// @Failure 400 {object} response.APIResponse "Bad request - Invalid input data"
// @Failure 404 {object} response.APIResponse "Not found - Category not found"
// @Failure 409 {object} response.APIResponse "Conflict - Category with this name already exists"
// @Failure 422 {object} response.APIResponse "Validation error - Invalid request data"
// @Failure 500 {object} response.APIResponse "Internal server error"
// @Security BearerAuth
// @Router /admin/v1/company-categories/{id} [put]
func (h *Handler) Update(c echo.Context) error {
id := c.Param("id")
form, err := response.Parse[CategoryForm](c)
if err != nil {
return response.ValidationError(c, "Invalid request data", err.Error())
}
category, err := h.service.Update(c.Request().Context(), id, form)
if err != nil {
if err.Error() == "category not found" {
return response.NotFound(c, "Category not found")
}
if err.Error() == "category with this name already exists" {
return response.Conflict(c, err.Error())
}
return response.InternalServerError(c, "Failed to update category")
}
return response.Success(c, category, "Category updated successfully")
}
// Delete deletes a category (Web Panel)
// @Summary Delete category
// @Description Delete a category permanently
// @Tags Admin-Company-Categories
// @Accept json
// @Produce json
// @Param id path string true "Category ID"
// @Success 200 {object} response.APIResponse "Category deleted successfully"
// @Failure 400 {object} response.APIResponse "Bad request - Invalid category ID"
// @Failure 404 {object} response.APIResponse "Not found - Category not found"
// @Failure 500 {object} response.APIResponse "Internal server error"
// @Security BearerAuth
// @Router /admin/v1/company-categories/{id} [delete]
func (h *Handler) Delete(c echo.Context) error {
id := c.Param("id")
err := h.service.Delete(c.Request().Context(), id)
if err != nil {
if err.Error() == "category not found" {
return response.NotFound(c, "Category not found")
}
return response.InternalServerError(c, "Failed to delete category")
}
return response.Success(c, map[string]interface{}{
"message": "Category deleted successfully",
}, "Category deleted successfully")
}
// Search searches categories with filters (Web Panel)
// @Summary Search categories
// @Description Search categories with filtering capabilities
// @Tags Admin-Company-Categories
// @Accept json
// @Produce json
// @Param q query string false "Search query"
// @Param published query boolean false "Published status filter"
// @Param limit query integer false "Limit" default(20)
// @Param offset query integer false "Offset" default(0)
// @Param sort_by query string false "Sort by field" Enums(name,created_at,updated_at,published_at)
// @Param sort_order query string false "Sort order" Enums(asc,desc)
// @Success 200 {object} response.APIResponse{data=CategoryListResponse} "Categories search completed"
// @Failure 400 {object} response.APIResponse "Bad request - Invalid query parameters"
// @Failure 422 {object} response.APIResponse "Validation error - Invalid query parameters"
// @Failure 500 {object} response.APIResponse "Internal server error"
// @Security BearerAuth
// @Router /admin/v1/company-categories [get]
func (h *Handler) Search(c echo.Context) error {
form, err := response.Parse[SearchForm](c)
if err != nil {
return response.ValidationError(c, "Invalid request data", err.Error())
}
result, err := h.service.SearchCategories(c.Request().Context(), form, response.NewPagination(c))
if err != nil {
return response.InternalServerError(c, "Failed to search categories")
}
return response.SuccessWithMeta(c, result, result.Meta, "Categories retrieved successfully")
}
// TogglePublish toggles category publish status (Web Panel)
// @Summary Toggle category publish status
// @Description Toggle category publish/unpublish status
// @Tags Admin-Company-Categories
// @Accept json
// @Produce json
// @Param id path string true "Category ID"
// @Success 200 {object} response.APIResponse "Category publish status updated successfully"
// @Failure 400 {object} response.APIResponse "Bad request - Invalid input data"
// @Failure 404 {object} response.APIResponse "Not found - Category not found"
// @Failure 422 {object} response.APIResponse "Validation error - Invalid request data"
// @Failure 500 {object} response.APIResponse "Internal server error"
// @Security BearerAuth
// @Router /admin/v1/company-categories/{id}/publish [patch]
func (h *Handler) TogglePublish(c echo.Context) error {
id := c.Param("id")
published, err := h.service.TogglePublish(c.Request().Context(), id)
if err != nil {
if err.Error() == "category not found" {
return response.NotFound(c, "Category not found")
}
return response.InternalServerError(c, "Failed to toggle category publish status")
}
return response.Success(
c,
map[string]interface{}{
"message": "Category publish status updated successfully",
"published": published,
},
"Category publish status updated successfully",
)
}