package handler import ( "photowall/internal/model" "photowall/internal/service" "photowall/pkg/response" "strconv" "github.com/gin-gonic/gin" ) type RegionHandler struct { svc *service.RegionService } func NewRegionHandler(svc *service.RegionService) *RegionHandler { return &RegionHandler{svc: svc} } // List GET /api/regions?parent_id=0&level=city func (h *RegionHandler) List(c *gin.Context) { parentID, _ := strconv.ParseUint(c.DefaultQuery("parent_id", "0"), 10, 64) level := c.Query("level") list, err := h.svc.ListByParent(uint(parentID), model.RegionLevel(level)) if err != nil { response.Internal(c, err.Error()) return } response.OK(c, list) } // Countries GET /api/regions/countries func (h *RegionHandler) Countries(c *gin.Context) { list, err := h.svc.ListCountries() if err != nil { response.Internal(c, err.Error()) return } response.OK(c, list) } // Path GET /api/regions/:id/path func (h *RegionHandler) Path(c *gin.Context) { id, err := strconv.ParseUint(c.Param("id"), 10, 64) if err != nil || id == 0 { response.BadRequest(c, "无效的地区ID") return } path, err := h.svc.GetPath(uint(id)) if err != nil { response.NotFound(c, "地区不存在") return } response.OK(c, path) } // Search GET /api/regions/search?keyword=xxx func (h *RegionHandler) Search(c *gin.Context) { keyword := c.Query("keyword") if keyword == "" { response.BadRequest(c, "请输入搜索关键词") return } list, err := h.svc.Search(keyword, 50) if err != nil { response.Internal(c, err.Error()) return } response.OK(c, list) } // Tree GET /api/admin/regions/tree func (h *RegionHandler) Tree(c *gin.Context) { parentID, _ := strconv.ParseUint(c.DefaultQuery("parent_id", "0"), 10, 64) tree, err := h.svc.GetTree(uint(parentID)) if err != nil { response.Internal(c, err.Error()) return } response.OK(c, tree) } // Create POST /api/admin/regions func (h *RegionHandler) Create(c *gin.Context) { var r model.Region if err := c.ShouldBindJSON(&r); err != nil { response.BadRequest(c, "参数错误:"+err.Error()) return } if err := h.svc.Create(&r); err != nil { response.BadRequest(c, err.Error()) return } response.Created(c, r) } // Update PUT /api/admin/regions/:id func (h *RegionHandler) Update(c *gin.Context) { id, err := strconv.ParseUint(c.Param("id"), 10, 64) if err != nil || id == 0 { response.BadRequest(c, "无效的地区ID") return } var body map[string]interface{} if err := c.ShouldBindJSON(&body); err != nil { response.BadRequest(c, "参数错误:"+err.Error()) return } updates := map[string]interface{}{} if v, ok := body["name"]; ok { updates["name"] = v } if v, ok := body["name_en"]; ok { updates["name_en"] = v } if v, ok := body["level"]; ok { updates["level"] = v } if v, ok := body["code"]; ok { updates["code"] = v } if v, ok := body["sort_order"]; ok { updates["sort_order"] = v } if err := h.svc.Update(uint(id), updates); err != nil { response.BadRequest(c, err.Error()) return } response.OK(c, gin.H{"message": "更新成功"}) } // Delete DELETE /api/admin/regions/:id func (h *RegionHandler) Delete(c *gin.Context) { id, err := strconv.ParseUint(c.Param("id"), 10, 64) if err != nil || id == 0 { response.BadRequest(c, "无效的地区ID") return } if err := h.svc.Delete(uint(id)); err != nil { response.BadRequest(c, err.Error()) return } response.OK(c, gin.H{"message": "删除成功"}) } // InitChina POST /api/admin/regions/init-china func (h *RegionHandler) InitChina(c *gin.Context) { created, total, err := h.svc.InitChinaRegions() if err != nil { response.Internal(c, "初始化失败: "+err.Error()) return } response.OK(c, gin.H{ "message": "初始化中国行政区划成功", "created_count": created, "total_count": total, }) }