129 lines
3.8 KiB
Go
129 lines
3.8 KiB
Go
package controllers
|
|
|
|
import (
|
|
"lost-and-found/internal/models"
|
|
"lost-and-found/internal/services"
|
|
"lost-and-found/internal/utils"
|
|
"net/http"
|
|
"strconv"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type CategoryController struct {
|
|
categoryService *services.CategoryService
|
|
}
|
|
|
|
func NewCategoryController(db *gorm.DB) *CategoryController {
|
|
return &CategoryController{
|
|
categoryService: services.NewCategoryService(db),
|
|
}
|
|
}
|
|
|
|
// GetAllCategories gets all categories
|
|
// GET /api/categories
|
|
func (c *CategoryController) GetAllCategories(ctx *gin.Context) {
|
|
categories, err := c.categoryService.GetAllCategories()
|
|
if err != nil {
|
|
utils.ErrorResponse(ctx, http.StatusInternalServerError, "Failed to get categories", err.Error())
|
|
return
|
|
}
|
|
|
|
utils.SuccessResponse(ctx, http.StatusOK, "Categories retrieved", categories)
|
|
}
|
|
|
|
// GetCategoryByID gets category by ID
|
|
// GET /api/categories/:id
|
|
func (c *CategoryController) GetCategoryByID(ctx *gin.Context) {
|
|
id, err := strconv.ParseUint(ctx.Param("id"), 10, 32)
|
|
if err != nil {
|
|
utils.ErrorResponse(ctx, http.StatusBadRequest, "Invalid category ID", err.Error())
|
|
return
|
|
}
|
|
|
|
category, err := c.categoryService.GetCategoryByID(uint(id))
|
|
if err != nil {
|
|
utils.ErrorResponse(ctx, http.StatusNotFound, "Category not found", err.Error())
|
|
return
|
|
}
|
|
|
|
utils.SuccessResponse(ctx, http.StatusOK, "Category retrieved", category.ToResponse())
|
|
}
|
|
|
|
// CreateCategory creates a new category (admin only)
|
|
// POST /api/categories
|
|
func (c *CategoryController) CreateCategory(ctx *gin.Context) {
|
|
adminObj, _ := ctx.Get("user")
|
|
admin := adminObj.(*models.User)
|
|
|
|
var req services.CreateCategoryRequest
|
|
if err := ctx.ShouldBindJSON(&req); err != nil {
|
|
utils.ErrorResponse(ctx, http.StatusBadRequest, "Invalid request data", err.Error())
|
|
return
|
|
}
|
|
|
|
ipAddress := ctx.ClientIP()
|
|
userAgent := ctx.Request.UserAgent()
|
|
|
|
category, err := c.categoryService.CreateCategory(admin.ID, req, ipAddress, userAgent)
|
|
if err != nil {
|
|
utils.ErrorResponse(ctx, http.StatusBadRequest, "Failed to create category", err.Error())
|
|
return
|
|
}
|
|
|
|
utils.SuccessResponse(ctx, http.StatusCreated, "Category created", category.ToResponse())
|
|
}
|
|
|
|
// UpdateCategory updates a category (admin only)
|
|
// PUT /api/categories/:id
|
|
func (c *CategoryController) UpdateCategory(ctx *gin.Context) {
|
|
adminObj, _ := ctx.Get("user")
|
|
admin := adminObj.(*models.User)
|
|
|
|
categoryID, err := strconv.ParseUint(ctx.Param("id"), 10, 32)
|
|
if err != nil {
|
|
utils.ErrorResponse(ctx, http.StatusBadRequest, "Invalid category ID", err.Error())
|
|
return
|
|
}
|
|
|
|
var req services.UpdateCategoryRequest
|
|
if err := ctx.ShouldBindJSON(&req); err != nil {
|
|
utils.ErrorResponse(ctx, http.StatusBadRequest, "Invalid request data", err.Error())
|
|
return
|
|
}
|
|
|
|
ipAddress := ctx.ClientIP()
|
|
userAgent := ctx.Request.UserAgent()
|
|
|
|
category, err := c.categoryService.UpdateCategory(admin.ID, uint(categoryID), req, ipAddress, userAgent)
|
|
if err != nil {
|
|
utils.ErrorResponse(ctx, http.StatusBadRequest, "Failed to update category", err.Error())
|
|
return
|
|
}
|
|
|
|
utils.SuccessResponse(ctx, http.StatusOK, "Category updated", category.ToResponse())
|
|
}
|
|
|
|
// DeleteCategory deletes a category (admin only)
|
|
// DELETE /api/categories/:id
|
|
func (c *CategoryController) DeleteCategory(ctx *gin.Context) {
|
|
adminObj, _ := ctx.Get("user")
|
|
admin := adminObj.(*models.User)
|
|
|
|
categoryID, err := strconv.ParseUint(ctx.Param("id"), 10, 32)
|
|
if err != nil {
|
|
utils.ErrorResponse(ctx, http.StatusBadRequest, "Invalid category ID", err.Error())
|
|
return
|
|
}
|
|
|
|
ipAddress := ctx.ClientIP()
|
|
userAgent := ctx.Request.UserAgent()
|
|
|
|
if err := c.categoryService.DeleteCategory(admin.ID, uint(categoryID), ipAddress, userAgent); err != nil {
|
|
utils.ErrorResponse(ctx, http.StatusBadRequest, "Failed to delete category", err.Error())
|
|
return
|
|
}
|
|
|
|
utils.SuccessResponse(ctx, http.StatusOK, "Category deleted", nil)
|
|
} |