package controller import ( "electricity_bill_calc/model" "electricity_bill_calc/response" "electricity_bill_calc/security" "electricity_bill_calc/service" "electricity_bill_calc/tools" "net/http" "github.com/gin-gonic/gin" "github.com/google/uuid" "github.com/jinzhu/copier" "github.com/shopspring/decimal" ) func InitializeParkController(router *gin.Engine) { router.GET("/parks", security.EnterpriseAuthorize, listAllParksUnderSessionUser) router.GET("/parks/:uid", security.MustAuthenticated, listAllParksUnderSpecificUser) router.POST("/park", security.EnterpriseAuthorize, createNewPark) router.PUT("/park/:pid", security.EnterpriseAuthorize, modifyPark) router.GET("/park/:pid", security.EnterpriseAuthorize, fetchParkDetail) router.PUT("/park/:pid/enabled", security.EnterpriseAuthorize, changeParkEnableState) router.DELETE("/park/:pid", security.EnterpriseAuthorize, deleteSpecificPark) } func ensureParkBelongs(c *gin.Context, result *response.Result, requestParkId string) bool { userSession, err := _retreiveSession(c) if err != nil { result.Unauthorized(err.Error()) return false } sure, err := service.ParkService.EnsurePark(userSession.Uid, requestParkId) if err != nil { result.Error(http.StatusInternalServerError, err.Error()) return false } if !sure { result.Unauthorized("不能访问不属于自己的园区。") return false } return true } func listAllParksUnderSessionUser(c *gin.Context) { result := response.NewResult(c) userSession, err := _retreiveSession(c) if err != nil { result.Unauthorized(err.Error()) return } parks, err := service.ParkService.ListAllParkBelongsTo(userSession.Uid) if err != nil { result.Error(http.StatusInternalServerError, err.Error()) return } result.Json(http.StatusOK, "已获取到指定用户下的园区。", gin.H{"parks": parks}) } func listAllParksUnderSpecificUser(c *gin.Context) { result := response.NewResult(c) requestUserId := c.Param("uid") parks, err := service.ParkService.ListAllParkBelongsTo(requestUserId) if err != nil { result.Error(http.StatusInternalServerError, err.Error()) return } result.Json(http.StatusOK, "已获取到指定用户下的园区。", gin.H{"parks": parks}) } type _ParkInfoFormData struct { Name string `json:"name" form:"name"` Region *string `json:"region" form:"region"` Address *string `json:"address" form:"address"` Contact *string `json:"contact" form:"contact"` Phone *string `json:"phone" from:"phone"` Area decimal.NullDecimal `json:"area" from:"area"` Capacity decimal.NullDecimal `json:"capacity" from:"capacity"` TenementQuantity decimal.NullDecimal `json:"tenement" from:"tenement"` Category int `json:"category" form:"category"` Submeter int `json:"submeter" form:"submeter"` } func createNewPark(c *gin.Context) { result := response.NewResult(c) userSession, err := _retreiveSession(c) if err != nil { result.Unauthorized(err.Error()) return } formData := new(_ParkInfoFormData) c.BindJSON(formData) newPark := new(model.Park) copier.Copy(newPark, formData) newPark.Id = uuid.New().String() newPark.UserId = userSession.Uid nameAbbr := tools.PinyinAbbr(newPark.Name) newPark.Abbr = &nameAbbr newPark.Enabled = true err = service.ParkService.SaveNewPark(*newPark) if err != nil { result.Error(http.StatusInternalServerError, err.Error()) return } result.Created("新园区完成创建。") } func modifyPark(c *gin.Context) { result := response.NewResult(c) userSession, err := _retreiveSession(c) if err != nil { result.Unauthorized(err.Error()) return } requestParkId := c.Param("pid") formData := new(_ParkInfoFormData) c.BindJSON(formData) park, err := service.ParkService.FetchParkDetail(requestParkId) if err != nil { result.Error(http.StatusInternalServerError, err.Error()) return } if userSession.Uid != park.UserId { result.Unauthorized("不能修改不属于自己的园区。") return } copier.Copy(park, formData) nameAbbr := tools.PinyinAbbr(formData.Name) park.Abbr = &nameAbbr err = service.ParkService.UpdateParkInfo(park) if err != nil { result.Error(http.StatusInternalServerError, err.Error()) return } result.Updated("指定园区资料已更新。") } func fetchParkDetail(c *gin.Context) { result := response.NewResult(c) requestParkId := c.Param("pid") if !ensureParkBelongs(c, result, requestParkId) { return } park, err := service.ParkService.FetchParkDetail(requestParkId) if err != nil { result.Error(http.StatusInternalServerError, err.Error()) return } result.Json(http.StatusOK, "已经获取到指定园区的信息。", gin.H{"park": park}) } type _ParkStateFormData struct { Enabled bool `json:"enabled" form:"enabled"` } func changeParkEnableState(c *gin.Context) { result := response.NewResult(c) userSession, err := _retreiveSession(c) if err != nil { result.Unauthorized(err.Error()) return } requestParkId := c.Param("pid") if !ensureParkBelongs(c, result, requestParkId) { return } formData := new(_ParkStateFormData) c.BindJSON(formData) err = service.ParkService.ChangeParkState(userSession.Uid, requestParkId, formData.Enabled) if err != nil { result.Error(http.StatusInternalServerError, err.Error()) return } result.Updated("指定园区的可用性状态已成功更新。") } func deleteSpecificPark(c *gin.Context) { result := response.NewResult(c) userSession, err := _retreiveSession(c) if err != nil { result.Unauthorized(err.Error()) return } requestParkId := c.Param("pid") if !ensureParkBelongs(c, result, requestParkId) { return } err = service.ParkService.DeletePark(userSession.Uid, requestParkId) if err != nil { result.Error(http.StatusInternalServerError, err.Error()) } result.Deleted("指定园区已成功删除。") }