159 lines
3.8 KiB
Go
159 lines
3.8 KiB
Go
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,
|
|
})
|
|
}
|