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/gofiber/fiber/v2" "github.com/google/uuid" "github.com/jinzhu/copier" "github.com/shopspring/decimal" ) func InitializeParkController(router *fiber.App) { 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 *fiber.Ctx, result *response.Result, requestParkId string) (bool, error) { userSession, err := _retreiveSession(c) if err != nil { return false, result.Unauthorized(err.Error()) } sure, err := service.ParkService.EnsurePark(userSession.Uid, requestParkId) if err != nil { return false, result.Error(http.StatusInternalServerError, err.Error()) } if !sure { return false, result.Unauthorized("不能访问不属于自己的园区。") } return true, nil } func listAllParksUnderSessionUser(c *fiber.Ctx) error { result := response.NewResult(c) userSession, err := _retreiveSession(c) if err != nil { return result.Unauthorized(err.Error()) } keyword := c.Query("keyword") parks, err := service.ParkService.ListAllParkBelongsTo(userSession.Uid, keyword) if err != nil { return result.Error(http.StatusInternalServerError, err.Error()) } return result.Json(http.StatusOK, "已获取到指定用户下的园区。", fiber.Map{"parks": parks}) } func listAllParksUnderSpecificUser(c *fiber.Ctx) error { result := response.NewResult(c) requestUserId := c.Params("uid") keyword := c.Query("keyword") parks, err := service.ParkService.ListAllParkBelongsTo(requestUserId, keyword) if err != nil { return result.Error(http.StatusInternalServerError, err.Error()) } return result.Json(http.StatusOK, "已获取到指定用户下的园区。", fiber.Map{"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 int8 `json:"category" form:"category"` SubmeterType int8 `json:"submeter" form:"submeter"` } func createNewPark(c *fiber.Ctx) error { result := response.NewResult(c) userSession, err := _retreiveSession(c) if err != nil { return result.Unauthorized(err.Error()) } formData := new(_ParkInfoFormData) if err := c.BodyParser(formData); err != nil { return result.UnableToParse("无法解析提交的数据。") } 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 { return result.Error(http.StatusInternalServerError, err.Error()) } return result.Created("新园区完成创建。") } func modifyPark(c *fiber.Ctx) error { result := response.NewResult(c) userSession, err := _retreiveSession(c) if err != nil { return result.Unauthorized(err.Error()) } requestParkId := c.Params("pid") formData := new(_ParkInfoFormData) if err := c.BodyParser(formData); err != nil { return result.UnableToParse("无法解析提交的数据。") } park, err := service.ParkService.FetchParkDetail(requestParkId) if err != nil { return result.Error(http.StatusInternalServerError, err.Error()) } if userSession.Uid != park.UserId { return result.Unauthorized("不能修改不属于自己的园区。") } copier.Copy(park, formData) nameAbbr := tools.PinyinAbbr(formData.Name) park.Abbr = &nameAbbr err = service.ParkService.UpdateParkInfo(park) if err != nil { return result.Error(http.StatusInternalServerError, err.Error()) } return result.Updated("指定园区资料已更新。") } func fetchParkDetail(c *fiber.Ctx) error { result := response.NewResult(c) requestParkId := c.Params("pid") if ensure, err := ensureParkBelongs(c, &result, requestParkId); !ensure { return err } park, err := service.ParkService.FetchParkDetail(requestParkId) if err != nil { return result.Error(http.StatusInternalServerError, err.Error()) } return result.Json(http.StatusOK, "已经获取到指定园区的信息。", fiber.Map{"park": park}) } type _ParkStateFormData struct { Enabled bool `json:"enabled" form:"enabled"` } func changeParkEnableState(c *fiber.Ctx) error { result := response.NewResult(c) userSession, err := _retreiveSession(c) if err != nil { return result.Unauthorized(err.Error()) } requestParkId := c.Params("pid") if ensure, err := ensureParkBelongs(c, &result, requestParkId); !ensure { return err } formData := new(_ParkStateFormData) if err := c.BodyParser(formData); err != nil { return result.UnableToParse("无法解析提交的数据。") } err = service.ParkService.ChangeParkState(userSession.Uid, requestParkId, formData.Enabled) if err != nil { return result.Error(http.StatusInternalServerError, err.Error()) } return result.Updated("指定园区的可用性状态已成功更新。") } func deleteSpecificPark(c *fiber.Ctx) error { result := response.NewResult(c) userSession, err := _retreiveSession(c) if err != nil { return result.Unauthorized(err.Error()) } requestParkId := c.Params("pid") if ensure, err := ensureParkBelongs(c, &result, requestParkId); !ensure { return err } err = service.ParkService.DeletePark(userSession.Uid, requestParkId) if err != nil { return result.Error(http.StatusInternalServerError, err.Error()) } return result.Deleted("指定园区已成功删除。") }