diff --git a/controller/abstract.go b/controller/abstract.go index 8d34e1c..1dd952b 100644 --- a/controller/abstract.go +++ b/controller/abstract.go @@ -3,8 +3,12 @@ package controller import ( "electricity_bill_calc/exceptions" "electricity_bill_calc/model" + "electricity_bill_calc/repository" + "electricity_bill_calc/response" + "net/http" "github.com/gofiber/fiber/v2" + "go.uber.org/zap" ) func _retreiveSession(c *fiber.Ctx) (*model.Session, error) { @@ -18,3 +22,21 @@ func _retreiveSession(c *fiber.Ctx) (*model.Session, error) { } return userSession, nil } + +// 检查当前用户是否拥有指定园区,在判断完成之后直接产生响应 +func checkParkBelongs(logger *zap.Logger, parkId string, session *model.Session, result *response.Result) (bool, error) { + if session == nil { + logger.Error("用户会话无效。") + return false, result.Unauthorized("用户会话无效。") + } + ok, err := repository.ParkRepository.IsParkBelongs(parkId, session.Uid) + switch { + case err != nil: + logger.Error("无法判断园区是否隶属于当前用户。", zap.String("park id", parkId), zap.String("user id", session.Uid), zap.Error(err)) + return false, result.Error(http.StatusInternalServerError, err.Error()) + case err == nil && !ok: + logger.Error("用户试图访问不属于自己的园区。", zap.String("park id", parkId), zap.String("user id", session.Uid)) + return false, result.Forbidden("您无权访问该园区。") + } + return true, nil +} diff --git a/controller/park.go b/controller/park.go index 2733f41..3bb0efe 100644 --- a/controller/park.go +++ b/controller/park.go @@ -2,7 +2,6 @@ package controller import ( "electricity_bill_calc/logger" - "electricity_bill_calc/model" "electricity_bill_calc/repository" "electricity_bill_calc/response" "electricity_bill_calc/security" @@ -30,24 +29,6 @@ func InitializeParkHandlers(router *fiber.App) { router.Put("/park/:pid/building/:bid/enabled", security.EnterpriseAuthorize, modifyParkBuildingEnabling) } -// 检查当前用户是否拥有指定园区,在判断完成之后直接产生响应 -func checkParkBelongs(logger *zap.Logger, parkId string, session *model.Session, result *response.Result) (bool, error) { - if session == nil { - logger.Error("用户会话无效。") - return false, result.Unauthorized("用户会话无效。") - } - ok, err := repository.ParkRepository.IsParkBelongs(parkId, session.Uid) - switch { - case err != nil: - logger.Error("无法判断园区是否隶属于当前用户。", zap.String("park id", parkId), zap.String("user id", session.Uid), zap.Error(err)) - return false, result.Error(http.StatusInternalServerError, err.Error()) - case err == nil && !ok: - logger.Error("用户试图访问不属于自己的园区。", zap.String("park id", parkId), zap.String("user id", session.Uid)) - return false, result.Forbidden("您无权访问该园区。") - } - return true, nil -} - // 列出隶属于当前用户的全部园区 func listParksBelongsToCurrentUser(c *fiber.Ctx) error { result := response.NewResult(c) @@ -131,14 +112,8 @@ func modifySpecificPark(c *fiber.Ctx) error { 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("您无权访问该园区。") + if pass, err := checkParkBelongs(parkLog, parkId, session, &result); !pass { + return err } parkForm := new(vo.ParkInformationForm) if err := c.BodyParser(parkForm); err != nil { @@ -150,7 +125,7 @@ func modifySpecificPark(c *fiber.Ctx) error { 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) + 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)) @@ -171,21 +146,15 @@ func modifyParkEnabling(c *fiber.Ctx) error { 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("您无权访问该园区。") + if pass, err := checkParkBelongs(parkLog, parkId, session, &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) + 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)) @@ -206,16 +175,10 @@ func deleteSpecificPark(c *fiber.Ctx) error { 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("您无权访问该园区。") + if pass, err := checkParkBelongs(parkLog, parkId, session, &result); !pass { + return err } - ok, err = repository.ParkRepository.DeletePark(parkId) + ok, err := repository.ParkRepository.DeletePark(parkId) switch { case err == nil && !ok: parkLog.Error("无法删除园区。", zap.String("park id", parkId), zap.String("user id", session.Uid)) @@ -262,21 +225,15 @@ func createBuildingInPark(c *fiber.Ctx) error { 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("您无权访问该园区。") + if pass, err := checkParkBelongs(parkLog, parkId, session, &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) + 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)) @@ -298,21 +255,15 @@ func modifySpecificBuildingInPark(c *fiber.Ctx) error { 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("您无权访问该园区。") + if pass, err := checkParkBelongs(parkLog, parkId, session, &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) + 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)) @@ -334,21 +285,15 @@ func modifyParkBuildingEnabling(c *fiber.Ctx) error { 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("您无权访问该园区。") + if pass, err := checkParkBelongs(parkLog, parkId, session, &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) + 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)) @@ -370,16 +315,10 @@ func deletedParkBuilding(c *fiber.Ctx) error { 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("您无权访问该园区。") + if pass, err := checkParkBelongs(parkLog, parkId, session, &result); !pass { + return err } - ok, err = repository.ParkRepository.DeleteParkBuilding(buildingId, parkId) + 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))