332 lines
14 KiB
Go
332 lines
14 KiB
Go
package controller
|
|
|
|
import (
|
|
"electricity_bill_calc/logger"
|
|
"electricity_bill_calc/repository"
|
|
"electricity_bill_calc/response"
|
|
"electricity_bill_calc/security"
|
|
"electricity_bill_calc/vo"
|
|
"net/http"
|
|
|
|
"github.com/gofiber/fiber/v2"
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
var parkLog = logger.Named("Handler", "Park")
|
|
|
|
func InitializeParkHandlers(router *fiber.App) {
|
|
router.Get("/park", security.EnterpriseAuthorize, listParksBelongsToCurrentUser)
|
|
router.Post("/park", security.EnterpriseAuthorize, createPark)
|
|
router.Get("/park/belongs/:uid", security.OPSAuthorize, listParksBelongsTo)
|
|
router.Get("/park/:pid", security.EnterpriseAuthorize, fetchParkDetail)
|
|
router.Put("/park/:pid", security.EnterpriseAuthorize, modifySpecificPark)
|
|
router.Delete("/park/:pid", security.EnterpriseAuthorize, deleteSpecificPark)
|
|
router.Put("/park/:pid/enabled", security.EnterpriseAuthorize, modifyParkEnabling)
|
|
router.Get("/park/:pid/building", security.EnterpriseAuthorize, listBuildingsBelongsToPark)
|
|
router.Post("/park/:pid/building", security.EnterpriseAuthorize, createBuildingInPark)
|
|
router.Put("/park/:pid/building/:bid", security.EnterpriseAuthorize, modifySpecificBuildingInPark)
|
|
router.Delete("/park/:pid/building/:bid", security.EnterpriseAuthorize, deletedParkBuilding)
|
|
router.Put("/park/:pid/building/:bid/enabled", security.EnterpriseAuthorize, modifyParkBuildingEnabling)
|
|
}
|
|
|
|
// 列出隶属于当前用户的全部园区
|
|
func listParksBelongsToCurrentUser(c *fiber.Ctx) error {
|
|
result := response.NewResult(c)
|
|
session, err := _retreiveSession(c)
|
|
if err != nil {
|
|
parkLog.Error("列出当前用的全部园区,无法获取当前用户的会话。")
|
|
return result.Unauthorized(err.Error())
|
|
}
|
|
parkLog.Info("列出当前用户下的全部园区", zap.String("user id", session.Uid))
|
|
parks, err := repository.ParkRepository.ListAllParks(session.Uid)
|
|
if err != nil {
|
|
parkLog.Error("无法获取园区列表。", zap.String("user id", session.Uid))
|
|
return result.Error(http.StatusInternalServerError, err.Error())
|
|
}
|
|
return result.Success("已获取到指定用户的下的园区", fiber.Map{"parks": parks})
|
|
}
|
|
|
|
// 列出隶属于指定用户的全部园区
|
|
func listParksBelongsTo(c *fiber.Ctx) error {
|
|
result := response.NewResult(c)
|
|
userId := c.Params("uid")
|
|
parkLog.Info("列出指定用户下的全部园区", zap.String("user id", userId))
|
|
parks, err := repository.ParkRepository.ListAllParks(userId)
|
|
if err != nil {
|
|
parkLog.Error("无法获取园区列表。", zap.String("user id", userId))
|
|
return result.Error(http.StatusInternalServerError, err.Error())
|
|
}
|
|
return result.Success("已获取到指定用户的下的园区", fiber.Map{"parks": parks})
|
|
}
|
|
|
|
// 获取指定园区的详细信息
|
|
func fetchParkDetail(c *fiber.Ctx) error {
|
|
result := response.NewResult(c)
|
|
parkId := c.Params("pid")
|
|
parkLog.Info("获取指定园区的详细信息", zap.String("park id", parkId))
|
|
park, err := repository.ParkRepository.RetrieveParkDetail(parkId)
|
|
if err != nil {
|
|
parkLog.Error("无法获取园区信息。", zap.String("park id", parkId))
|
|
return result.Error(http.StatusInternalServerError, err.Error())
|
|
}
|
|
return result.Success("已获取到指定园区的详细信息", fiber.Map{"park": park})
|
|
}
|
|
|
|
// 创建一个新的园区
|
|
func createPark(c *fiber.Ctx) error {
|
|
result := response.NewResult(c)
|
|
session, err := _retreiveSession(c)
|
|
if err != nil {
|
|
parkLog.Error("创建一个新的园区,无法获取当前用户的会话。")
|
|
return result.Unauthorized(err.Error())
|
|
}
|
|
parkLog.Info("创建一个新的园区", zap.String("user id", session.Uid))
|
|
creationForm := new(vo.ParkInformationForm)
|
|
if err := c.BodyParser(creationForm); err != nil {
|
|
parkLog.Error("无法解析园区表单数据。", zap.String("user id", session.Uid), zap.Error(err))
|
|
return result.NotAccept(err.Error())
|
|
}
|
|
park, err := creationForm.TryIntoPark()
|
|
if err != nil {
|
|
parkLog.Error("无法将园区表单数据转换为园区对象。", zap.String("user id", session.Uid), zap.Error(err))
|
|
return result.NotAccept(err.Error())
|
|
}
|
|
ok, err := repository.ParkRepository.CreatePark(session.Uid, park)
|
|
switch {
|
|
case err == nil && !ok:
|
|
parkLog.Error("无法创建新的园区。", zap.String("user id", session.Uid))
|
|
return result.NotAccept("无法创建新的园区。")
|
|
case err != nil:
|
|
parkLog.Error("无法创建新的园区。", zap.String("user id", session.Uid), zap.Error(err))
|
|
return result.Error(http.StatusInternalServerError, err.Error())
|
|
}
|
|
return result.Created("已创建一个新的园区")
|
|
}
|
|
|
|
// 修改指定园区的信息
|
|
func modifySpecificPark(c *fiber.Ctx) error {
|
|
result := response.NewResult(c)
|
|
parkId := c.Params("pid")
|
|
session, err := _retreiveSession(c)
|
|
if err != nil {
|
|
parkLog.Error("修改指定园区的信息,无法获取当前用户的会话。")
|
|
return result.Unauthorized(err.Error())
|
|
}
|
|
if pass, err := checkParkBelongs(parkId, parkLog, c, &result); !pass {
|
|
return err
|
|
}
|
|
parkForm := new(vo.ParkInformationForm)
|
|
if err := c.BodyParser(parkForm); err != nil {
|
|
parkLog.Error("无法解析园区表单数据。", zap.String("park id", parkId), zap.String("user id", session.Uid), zap.Error(err))
|
|
return result.NotAccept(err.Error())
|
|
}
|
|
park, err := parkForm.TryIntoPark()
|
|
if err != nil {
|
|
parkLog.Error("无法将园区表单数据转换为园区对象。", zap.String("park id", parkId), zap.String("user id", session.Uid), zap.Error(err))
|
|
return result.NotAccept(err.Error())
|
|
}
|
|
ok, err := repository.ParkRepository.UpdatePark(parkId, park)
|
|
switch {
|
|
case err == nil && !ok:
|
|
parkLog.Error("无法更新园区信息。", zap.String("park id", parkId), zap.String("user id", session.Uid))
|
|
return result.NotAccept("无法更新园区信息。")
|
|
case err != nil:
|
|
parkLog.Error("无法更新园区信息。", zap.String("park id", parkId), zap.String("user id", session.Uid), zap.Error(err))
|
|
return result.Error(http.StatusInternalServerError, err.Error())
|
|
}
|
|
return result.Updated("已更新指定园区的详细信息")
|
|
}
|
|
|
|
// 修改指定园区的可用性
|
|
func modifyParkEnabling(c *fiber.Ctx) error {
|
|
result := response.NewResult(c)
|
|
parkId := c.Params("pid")
|
|
session, err := _retreiveSession(c)
|
|
if err != nil {
|
|
parkLog.Error("修改指定园区的可用性,无法获取当前用户的会话。")
|
|
return result.Unauthorized(err.Error())
|
|
}
|
|
if pass, err := checkParkBelongs(parkId, parkLog, c, &result); !pass {
|
|
return err
|
|
}
|
|
stateForm := new(vo.StateForm)
|
|
if err := c.BodyParser(stateForm); err != nil {
|
|
parkLog.Error("无法解析园区表单数据。", zap.String("park id", parkId), zap.String("user id", session.Uid), zap.Error(err))
|
|
return result.NotAccept(err.Error())
|
|
}
|
|
ok, err := repository.ParkRepository.EnablingPark(parkId, stateForm.Enabled)
|
|
switch {
|
|
case err == nil && !ok:
|
|
parkLog.Error("无法更新园区可用性。", zap.String("park id", parkId), zap.String("user id", session.Uid))
|
|
return result.NotAccept("无法更新园区可用性。")
|
|
case err != nil:
|
|
parkLog.Error("无法更新园区可用性。", zap.String("park id", parkId), zap.String("user id", session.Uid), zap.Error(err))
|
|
return result.Error(http.StatusInternalServerError, err.Error())
|
|
}
|
|
return result.Updated("已更新指定园区的可用性。")
|
|
}
|
|
|
|
// 删除指定的园区
|
|
func deleteSpecificPark(c *fiber.Ctx) error {
|
|
result := response.NewResult(c)
|
|
parkId := c.Params("pid")
|
|
session, err := _retreiveSession(c)
|
|
if err != nil {
|
|
parkLog.Error("删除指定的园区,无法获取当前用户的会话。")
|
|
return result.Unauthorized(err.Error())
|
|
}
|
|
if pass, err := checkParkBelongs(parkId, parkLog, c, &result); !pass {
|
|
return err
|
|
}
|
|
ok, err := repository.ParkRepository.DeletePark(parkId)
|
|
switch {
|
|
case err == nil && !ok:
|
|
parkLog.Error("无法删除园区。", zap.String("park id", parkId), zap.String("user id", session.Uid))
|
|
return result.NotAccept("无法删除园区。")
|
|
case err != nil:
|
|
parkLog.Error("无法删除园区。", zap.String("park id", parkId), zap.String("user id", session.Uid), zap.Error(err))
|
|
return result.Error(http.StatusInternalServerError, err.Error())
|
|
}
|
|
return result.Success("已删除指定的园区")
|
|
}
|
|
|
|
// 列出指定园区中已经登记的建筑
|
|
func listBuildingsBelongsToPark(c *fiber.Ctx) error {
|
|
result := response.NewResult(c)
|
|
parkId := c.Params("pid")
|
|
session, err := _retreiveSession(c)
|
|
if err != nil {
|
|
parkLog.Error("列出指定园区中已经登记的建筑,无法获取当前用户的会话。")
|
|
return result.Unauthorized(err.Error())
|
|
}
|
|
ok, err := repository.ParkRepository.IsParkBelongs(parkId, session.Uid)
|
|
switch {
|
|
case err != nil:
|
|
parkLog.Error("无法判断园区是否隶属于当前用户。", zap.String("park id", parkId), zap.String("user id", session.Uid), zap.Error(err))
|
|
return result.Error(http.StatusInternalServerError, err.Error())
|
|
case err == nil && !ok:
|
|
parkLog.Error("用户试图访问不属于自己的园区。", zap.String("park id", parkId), zap.String("user id", session.Uid))
|
|
return result.Forbidden("您无权访问该园区。")
|
|
}
|
|
buildings, err := repository.ParkRepository.RetrieveParkBuildings(parkId)
|
|
if err != nil {
|
|
parkLog.Error("无法获取园区中的建筑列表。", zap.String("park id", parkId), zap.String("user id", session.Uid), zap.Error(err))
|
|
return result.Error(http.StatusInternalServerError, err.Error())
|
|
}
|
|
return result.Success("已获取到指定园区中的建筑列表", fiber.Map{"buildings": buildings})
|
|
}
|
|
|
|
// 在指定园区中创建一个新的建筑
|
|
func createBuildingInPark(c *fiber.Ctx) error {
|
|
result := response.NewResult(c)
|
|
parkId := c.Params("pid")
|
|
session, err := _retreiveSession(c)
|
|
if err != nil {
|
|
parkLog.Error("在指定园区中创建一个新的建筑,无法获取当前用户的会话。")
|
|
return result.Unauthorized(err.Error())
|
|
}
|
|
if pass, err := checkParkBelongs(parkId, parkLog, c, &result); !pass {
|
|
return err
|
|
}
|
|
buildingForm := new(vo.ParkBuildingInformationForm)
|
|
if err := c.BodyParser(buildingForm); err != nil {
|
|
parkLog.Error("无法解析建筑表单数据。", zap.String("park id", parkId), zap.String("user id", session.Uid), zap.Error(err))
|
|
return result.NotAccept(err.Error())
|
|
}
|
|
ok, err := repository.ParkRepository.CreateParkBuilding(parkId, buildingForm.Name, &buildingForm.Floors)
|
|
switch {
|
|
case err == nil && !ok:
|
|
parkLog.Error("无法创建新的建筑。", zap.String("park id", parkId), zap.String("user id", session.Uid))
|
|
return result.NotAccept("无法创建新的建筑。")
|
|
case err != nil:
|
|
parkLog.Error("无法创建新的建筑。", zap.String("park id", parkId), zap.String("user id", session.Uid), zap.Error(err))
|
|
return result.Error(http.StatusInternalServerError, err.Error())
|
|
}
|
|
return result.Created("已创建一个新的建筑")
|
|
}
|
|
|
|
// 修改指定园区中的指定建筑的信息
|
|
func modifySpecificBuildingInPark(c *fiber.Ctx) error {
|
|
result := response.NewResult(c)
|
|
parkId := c.Params("pid")
|
|
buildingId := c.Params("bid")
|
|
session, err := _retreiveSession(c)
|
|
if err != nil {
|
|
parkLog.Error("修改指定园区中的指定建筑的信息,无法获取当前用户的会话。")
|
|
return result.Unauthorized(err.Error())
|
|
}
|
|
if pass, err := checkParkBelongs(parkId, parkLog, c, &result); !pass {
|
|
return err
|
|
}
|
|
buildingForm := new(vo.ParkBuildingInformationForm)
|
|
if err := c.BodyParser(buildingForm); err != nil {
|
|
parkLog.Error("无法解析建筑表单数据。", zap.String("park id", parkId), zap.String("user id", session.Uid), zap.Error(err))
|
|
return result.NotAccept(err.Error())
|
|
}
|
|
ok, err := repository.ParkRepository.ModifyParkBuilding(buildingId, parkId, buildingForm.Name, &buildingForm.Floors)
|
|
switch {
|
|
case err == nil && !ok:
|
|
parkLog.Error("无法更新建筑信息。", zap.String("park id", parkId), zap.String("user id", session.Uid))
|
|
return result.NotAccept("无法更新建筑信息。")
|
|
case err != nil:
|
|
parkLog.Error("无法更新建筑信息。", zap.String("park id", parkId), zap.String("user id", session.Uid), zap.Error(err))
|
|
return result.Error(http.StatusInternalServerError, err.Error())
|
|
}
|
|
return result.Updated("已更新指定建筑的信息")
|
|
}
|
|
|
|
// 修改指定园区中指定建筑的可用性
|
|
func modifyParkBuildingEnabling(c *fiber.Ctx) error {
|
|
result := response.NewResult(c)
|
|
parkId := c.Params("pid")
|
|
buildingId := c.Params("bid")
|
|
session, err := _retreiveSession(c)
|
|
if err != nil {
|
|
parkLog.Error("修改指定园区中指定建筑的可用性,无法获取当前用户的会话。")
|
|
return result.Unauthorized(err.Error())
|
|
}
|
|
if pass, err := checkParkBelongs(parkId, parkLog, c, &result); !pass {
|
|
return err
|
|
}
|
|
stateForm := new(vo.StateForm)
|
|
if err := c.BodyParser(stateForm); err != nil {
|
|
parkLog.Error("无法解析建筑表单数据。", zap.String("park id", parkId), zap.String("user id", session.Uid), zap.Error(err))
|
|
return result.NotAccept(err.Error())
|
|
}
|
|
ok, err := repository.ParkRepository.EnablingParkBuilding(buildingId, parkId, stateForm.Enabled)
|
|
switch {
|
|
case err == nil && !ok:
|
|
parkLog.Error("无法更新建筑可用性。", zap.String("park id", parkId), zap.String("user id", session.Uid))
|
|
return result.NotAccept("无法更新建筑可用性。")
|
|
case err != nil:
|
|
parkLog.Error("无法更新建筑可用性。", zap.String("park id", parkId), zap.String("user id", session.Uid), zap.Error(err))
|
|
return result.Error(http.StatusInternalServerError, err.Error())
|
|
}
|
|
return result.Updated("已更新指定建筑的可用性")
|
|
}
|
|
|
|
// 删除指定园区中的指定建筑
|
|
func deletedParkBuilding(c *fiber.Ctx) error {
|
|
result := response.NewResult(c)
|
|
parkId := c.Params("pid")
|
|
buildingId := c.Params("bid")
|
|
session, err := _retreiveSession(c)
|
|
if err != nil {
|
|
parkLog.Error("删除指定园区中的指定建筑,无法获取当前用户的会话。")
|
|
return result.Unauthorized(err.Error())
|
|
}
|
|
if pass, err := checkParkBelongs(parkId, parkLog, c, &result); !pass {
|
|
return err
|
|
}
|
|
ok, err := repository.ParkRepository.DeleteParkBuilding(buildingId, parkId)
|
|
switch {
|
|
case err == nil && !ok:
|
|
parkLog.Error("无法删除建筑。", zap.String("park id", parkId), zap.String("user id", session.Uid))
|
|
return result.NotAccept("无法删除建筑。")
|
|
case err != nil:
|
|
parkLog.Error("无法删除建筑。", zap.String("park id", parkId), zap.String("user id", session.Uid), zap.Error(err))
|
|
return result.Error(http.StatusInternalServerError, err.Error())
|
|
}
|
|
return result.Deleted("已删除指定的建筑")
|
|
}
|