change error format

This commit is contained in:
kandrusyak
2023-10-13 00:28:35 +03:00
parent 703e4f2ac1
commit dc7e3d195e
2 changed files with 93 additions and 15 deletions

View File

@@ -4,7 +4,8 @@ import (
"astra-events/model" "astra-events/model"
"astra-events/pkg/utils" "astra-events/pkg/utils"
"astra-events/services" "astra-events/services"
"fmt" "errors"
"github.com/go-playground/validator/v10"
"github.com/google/uuid" "github.com/google/uuid"
"github.com/hashicorp/go-set" "github.com/hashicorp/go-set"
"github.com/labstack/echo/v4" "github.com/labstack/echo/v4"
@@ -24,20 +25,39 @@ func (h *Handler) CreateEvent(c echo.Context) (err error) {
authorId, err := uuid.Parse(c.Request().Header.Get("X-User-Id")) authorId, err := uuid.Parse(c.Request().Header.Get("X-User-Id"))
orgId, err := uuid.Parse(c.Request().Header.Get("X-User-Organization-Id")) orgId, err := uuid.Parse(c.Request().Header.Get("X-User-Organization-Id"))
if err != nil { if err != nil {
return c.NoContent(http.StatusUnauthorized) return c.JSON(http.StatusUnauthorized, &utils.Error{
Type: "internal_error",
Message: "User in not authorized",
Code: "0002",
})
} }
err = c.Bind(&event) err = c.Bind(&event)
err = h.Validator.Struct(event) err = h.Validator.Struct(event)
if err != nil { if err != nil {
return c.HTML(http.StatusBadRequest, fmt.Sprintf("Err(s):\n%+v\n", err)) var validationErrors validator.ValidationErrors
errors.As(err, &validationErrors)
Fields := make(map[string]string)
for _, validationError := range validationErrors {
Fields[validationError.Field()] = validationError.Error()
}
return c.JSON(http.StatusBadRequest, &utils.ValidationError{
Type: "validation_error",
Message: err.Error(),
Code: "0001",
Fields: Fields,
})
} }
if event.Person.ID.ID() != 0 { if event.Person.ID.ID() != 0 {
person, err = services.GetPerson(event.Person.ID, c.Request().Header, c) person, err = services.GetPerson(event.Person.ID, c.Request().Header, c)
if err != nil || person.ID != event.Person.ID { if err != nil || person.ID != event.Person.ID {
return c.NoContent(http.StatusBadRequest) return c.JSON(http.StatusBadGateway, &utils.Error{
Type: "internal_error",
Message: "Can't sen request to persons service",
Code: "0003",
})
} }
} else { } else {
newPerson := model.PersonalInformationApi{ newPerson := model.PersonalInformationApi{
@@ -54,14 +74,22 @@ func (h *Handler) CreateEvent(c echo.Context) (err error) {
person, err = services.CreatePerson(newPerson, c.Request().Header, c) person, err = services.CreatePerson(newPerson, c.Request().Header, c)
if err != nil || person.ID.ID() == 0 { if err != nil || person.ID.ID() == 0 {
return c.NoContent(http.StatusBadRequest) return c.JSON(http.StatusBadGateway, &utils.Error{
Type: "internal_error",
Message: "Can't sen request to persons service",
Code: "0004",
})
} }
} }
usersMap, err := services.GetUsers([]uuid.UUID{event.MedicId, authorId}, c.Request().Header, c) usersMap, err := services.GetUsers([]uuid.UUID{event.MedicId, authorId}, c.Request().Header, c)
if err != nil || len(usersMap) == 0 { if err != nil || len(usersMap) == 0 {
return c.HTML(http.StatusBadGateway, "Error get users") return c.JSON(http.StatusBadGateway, &utils.Error{
Type: "internal_error",
Message: "Can't sen request to users service",
Code: "0005",
})
} }
medic := usersMap[event.MedicId] medic := usersMap[event.MedicId]
@@ -78,7 +106,11 @@ func (h *Handler) CreateEvent(c echo.Context) (err error) {
tx := h.DB.Create(&newEvent) tx := h.DB.Create(&newEvent)
if tx.RowsAffected == 0 { if tx.RowsAffected == 0 {
return c.NoContent(http.StatusBadGateway) return c.JSON(http.StatusBadGateway, &utils.Error{
Type: "internal_error",
Message: "Database error",
Code: "0006",
})
} }
newEvent.Author = author newEvent.Author = author
@@ -97,7 +129,11 @@ func (h *Handler) GetEvents(c echo.Context) (err error) {
orgId, err := uuid.Parse(c.Request().Header.Get("X-User-Organization-Id")) orgId, err := uuid.Parse(c.Request().Header.Get("X-User-Organization-Id"))
if err != nil { if err != nil {
return c.NoContent(http.StatusUnauthorized) return c.JSON(http.StatusUnauthorized, &utils.Error{
Type: "internal_error",
Message: "User in not authorized",
Code: "0002",
})
} }
tx := h.DB.Where("org_id = ?", orgId) tx := h.DB.Where("org_id = ?", orgId)
@@ -118,7 +154,11 @@ func (h *Handler) GetEventsToday(c echo.Context) (err error) {
orgId, err := uuid.Parse(c.Request().Header.Get("X-User-Organization-Id")) orgId, err := uuid.Parse(c.Request().Header.Get("X-User-Organization-Id"))
if err != nil { if err != nil {
return c.NoContent(http.StatusUnauthorized) return c.JSON(http.StatusUnauthorized, &utils.Error{
Type: "internal_error",
Message: "User in not authorized",
Code: "0002",
})
} }
tx := h.DB.Where("org_id = ?", orgId) tx := h.DB.Where("org_id = ?", orgId)
@@ -142,19 +182,31 @@ func (h *Handler) GetEvent(c echo.Context) error {
orgId, err := uuid.Parse(c.Request().Header.Get("X-User-Organization-Id")) orgId, err := uuid.Parse(c.Request().Header.Get("X-User-Organization-Id"))
if err != nil { if err != nil {
return c.NoContent(http.StatusUnauthorized) return c.JSON(http.StatusUnauthorized, &utils.Error{
Type: "internal_error",
Message: "User in not authorized",
Code: "0002",
})
} }
tx := h.DB.Where("org_id = ?", orgId).First(&event, id) tx := h.DB.Where("org_id = ?", orgId).First(&event, id)
if tx.RowsAffected == 0 { if tx.RowsAffected == 0 {
return c.NoContent(http.StatusNotFound) return c.JSON(http.StatusNotFound, &utils.Error{
Type: "not_found_error",
Message: "Event not found",
Code: "0007",
})
} }
usersMap, err := services.GetUsers([]uuid.UUID{event.MedicId, event.AuthorId}, c.Request().Header, c) usersMap, err := services.GetUsers([]uuid.UUID{event.MedicId, event.AuthorId}, c.Request().Header, c)
if err != nil { if err != nil {
return c.HTML(http.StatusBadGateway, err.Error()) return c.JSON(http.StatusBadGateway, &utils.Error{
Type: "internal_error",
Message: "Can't sen request to persons or users service",
Code: "0005",
})
} }
medic := usersMap[event.MedicId] medic := usersMap[event.MedicId]
@@ -176,13 +228,21 @@ func (h *Handler) DeleteEvent(c echo.Context) error {
orgId, err := uuid.Parse(c.Request().Header.Get("X-User-Organization-Id")) orgId, err := uuid.Parse(c.Request().Header.Get("X-User-Organization-Id"))
if err != nil { if err != nil {
return c.NoContent(http.StatusUnauthorized) return c.JSON(http.StatusUnauthorized, &utils.Error{
Type: "internal_error",
Message: "User in not authorized",
Code: "0002",
})
} }
tx := h.DB.Where("org_id = ?", orgId).Delete(&model.Event{}, id) tx := h.DB.Where("org_id = ?", orgId).Delete(&model.Event{}, id)
if tx.RowsAffected == 0 { if tx.RowsAffected == 0 {
return c.NoContent(http.StatusNotFound) return c.JSON(http.StatusNotFound, &utils.Error{
Type: "not_found_error",
Message: "Event not found",
Code: "0007",
})
} }
return c.NoContent(http.StatusOK) return c.NoContent(http.StatusOK)
@@ -204,7 +264,11 @@ func (h *Handler) queryEvents(tx *gorm.DB, c echo.Context) error {
usersMap, err := services.GetUsers(userIds.Slice(), c.Request().Header, c) usersMap, err := services.GetUsers(userIds.Slice(), c.Request().Header, c)
personsMap, err := services.GetPersons(personIds.Slice(), c.Request().Header, c) personsMap, err := services.GetPersons(personIds.Slice(), c.Request().Header, c)
if err != nil { if err != nil {
return c.HTML(http.StatusBadGateway, err.Error()) return c.JSON(http.StatusBadGateway, &utils.Error{
Type: "internal_error",
Message: "Can't sen request to persons or users service",
Code: "0005",
})
} }
for i, event := range events { for i, event := range events {

14
pkg/utils/validation.go Normal file
View File

@@ -0,0 +1,14 @@
package utils
type Error struct {
Type string
Message string
Code string
}
type ValidationError struct {
Type string
Message string
Code string
Fields map[string]string
}