221 lines
8.3 KiB
Go
221 lines
8.3 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{data=map[string]bool} "Company category published/unpublished successfully"
|
|
// @Failure 400 {object} response.APIResponse "Bad request - Invalid category ID"
|
|
// @Failure 404 {object} response.APIResponse "Not found - Company category not found"
|
|
// @Failure 500 {object} response.APIResponse "Internal server error - Failed to update published status"
|
|
// @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, "Company category not found")
|
|
}
|
|
h.logger.Error("Failed to update Company category published status", map[string]interface{}{
|
|
"error": err.Error(),
|
|
"category_id": id,
|
|
})
|
|
return response.InternalServerError(c, "Failed to update Company category published status. Please try again or contact support if the problem persists.")
|
|
}
|
|
|
|
message := "Company category unpublished successfully"
|
|
if published {
|
|
message = "Company category published successfully"
|
|
}
|
|
|
|
return response.Success(
|
|
c,
|
|
map[string]interface{}{
|
|
"published": published,
|
|
},
|
|
message,
|
|
)
|
|
}
|