diff --git a/docs/plantuml/controllers/AppLogController.puml b/docs/plantuml/controllers/AppLogController.puml new file mode 100644 index 00000000..cfb5606d --- /dev/null +++ b/docs/plantuml/controllers/AppLogController.puml @@ -0,0 +1,17 @@ +@startuml +!include ../services/LogService.puml + +package controllers{ + class AppLogController{ + -service *services.AppLogService + -- + -logger *logrus.Logger + -- + +GetList(ctx *gin.Context) + -- + +GetByID(ctx *gin.Context) + } +} + +AppLogController::service -- LogService +@enduml \ No newline at end of file diff --git a/docs/plantuml/controllers/HTTPLogController.puml b/docs/plantuml/controllers/HTTPLogController.puml new file mode 100644 index 00000000..c8992467 --- /dev/null +++ b/docs/plantuml/controllers/HTTPLogController.puml @@ -0,0 +1,17 @@ +@startuml +!include ../services/HTTPLogService.puml + +package controllers{ + class HTTPLogController{ + -service *services.HTTPLogService + -- + -logger *logrus.Logger + -- + +GetList(ctx *gin.Context) + -- + +GetByID(ctx *gin.Context) + } +} + +HTTPLogController::service -- HTTPLogService +@enduml \ No newline at end of file diff --git a/src/infrastructure/YamlGenericTemplateStorage.go b/src/infrastructure/YamlGenericTemplateStorage.go index af78deae..0df61785 100644 --- a/src/infrastructure/YamlGenericTemplateStorage.go +++ b/src/infrastructure/YamlGenericTemplateStorage.go @@ -5,7 +5,6 @@ import ( "fmt" "github.com/google/uuid" "github.com/sirupsen/logrus" - "gopkg.in/yaml.v2" "io/ioutil" "os" "path" @@ -70,32 +69,15 @@ func (y *YamlGenericTemplateStorage[TemplateType]) reloadFromFiles() error { return errors.Internal.Wrap(err, "reading dir error") } for _, f := range files { - template, err := y.getTemplateObjFromYaml(f.Name()) + template, err := ReadYamlFile[TemplateType](f.Name()) if err != nil { return errors.Internal.Wrap(err, "yaml parsing error") } - y.Templates = append(y.Templates, *template) + y.Templates = append(y.Templates, template) } return nil } -func (y *YamlGenericTemplateStorage[TemplateType]) getTemplateObjFromYaml(templateName string) (*TemplateType, error) { - template := new(TemplateType) - templateFilePath := path.Join(y.TemplatesDirectory, fmt.Sprintf(templateName)) - f, err := os.Open(templateFilePath) - if err != nil { - return nil, errors.Internal.Wrap(err, "directory opening error") - } - defer f.Close() - - decoder := yaml.NewDecoder(f) - err = decoder.Decode(template) - if err != nil { - return nil, errors.Internal.Wrap(err, "yaml decoding error") - } - return template, nil -} - func (y *YamlGenericTemplateStorage[TemplateType]) sortTemplatesSlice(templates *[]TemplateType, orderBy, orderDirection string) error { if len(*templates) < 1 { return nil @@ -239,11 +221,11 @@ func (y *YamlGenericTemplateStorage[TemplateType]) Count(ctx context.Context, qu return 0, errors.Internal.Wrap(err, "get templates files error") } for _, f := range files { - template, err := y.getTemplateObjFromYaml(f.Name()) + template, err := ReadYamlFile[TemplateType](f.Name()) if err != nil { return 0, errors.Internal.Wrap(err, "error converting yaml to struct") } - templatesSlice = append(templatesSlice, *template) + templatesSlice = append(templatesSlice, template) } queryStr, err := queryBuilder.Build() if err != nil { diff --git a/src/webapi/GinHttpServer.go b/src/webapi/GinHttpServer.go index 748f20b5..ce6dd18f 100644 --- a/src/webapi/GinHttpServer.go +++ b/src/webapi/GinHttpServer.go @@ -37,15 +37,16 @@ func NewGinHTTPServer(log *logrus.Logger, config *domain.AppConfig) *GinHTTPServ } //Start starts http server -func (g *GinHTTPServer) Start() { +func (g *GinHTTPServer) Start() error { err := g.Engine.Run(g.address) if err != nil { g.logger.Errorf("[HTTP server] start server error: %s", err.Error()) - return + return err } + return nil } //StartHTTPServer starts a new http server from fx.Invoke -func StartHTTPServer(server *GinHTTPServer) { - server.Start() +func StartHTTPServer(server *GinHTTPServer) error { + return server.Start() } diff --git a/src/webapi/controllers/EthernetSwitchGinController.go b/src/webapi/controllers/EthernetSwitchGinController.go index 7498eb27..c65e1370 100644 --- a/src/webapi/controllers/EthernetSwitchGinController.go +++ b/src/webapi/controllers/EthernetSwitchGinController.go @@ -107,7 +107,7 @@ func (e *EthernetSwitchGinController) GetByID(ctx *gin.Context) { // @Failure 500 "Internal Server Error" // @router /ethernet-switch/ [post] func (e *EthernetSwitchGinController) Create(ctx *gin.Context) { - reqDto, err := getRequestDtoAndRestoreBody[dtos.EthernetSwitchCreateDto](ctx) + reqDto, err := getRequestDto[dtos.EthernetSwitchCreateDto](ctx) if err != nil { abortWithStatusByErrorType(ctx, err) return @@ -133,7 +133,7 @@ func (e *EthernetSwitchGinController) Create(ctx *gin.Context) { // @Failure 500 "Internal Server Error" // @router /ethernet-switch/{id} [put] func (e *EthernetSwitchGinController) Update(ctx *gin.Context) { - reqDto, err := getRequestDtoAndRestoreBody[dtos.EthernetSwitchUpdateDto](ctx) + reqDto, err := getRequestDto[dtos.EthernetSwitchUpdateDto](ctx) if err != nil { abortWithStatusByErrorType(ctx, err) return diff --git a/src/webapi/controllers/EthernetSwitchPortGinController.go b/src/webapi/controllers/EthernetSwitchPortGinController.go index 79c09405..cc7149fb 100644 --- a/src/webapi/controllers/EthernetSwitchPortGinController.go +++ b/src/webapi/controllers/EthernetSwitchPortGinController.go @@ -124,7 +124,7 @@ func (e *EthernetSwitchPortGinController) GetPorts(ctx *gin.Context) { // @Failure 500 "Internal Server Error" // @router /ethernet-switch/{id}/port/ [post] func (e *EthernetSwitchPortGinController) CreatePort(ctx *gin.Context) { - reqDto, err := getRequestDtoAndRestoreBody[dtos.EthernetSwitchPortCreateDto](ctx) + reqDto, err := getRequestDto[dtos.EthernetSwitchPortCreateDto](ctx) if err != nil { abortWithStatusByErrorType(ctx, err) return @@ -155,7 +155,7 @@ func (e *EthernetSwitchPortGinController) CreatePort(ctx *gin.Context) { // @Failure 500 "Internal Server Error" // @router /ethernet-switch/{id}/port/{portID} [put] func (e *EthernetSwitchPortGinController) UpdatePort(ctx *gin.Context) { - reqDto, err := getRequestDtoAndRestoreBody[dtos.EthernetSwitchPortUpdateDto](ctx) + reqDto, err := getRequestDto[dtos.EthernetSwitchPortUpdateDto](ctx) if err != nil { abortWithStatusByErrorType(ctx, err) return diff --git a/src/webapi/controllers/GinHelpers.go b/src/webapi/controllers/GinHelpers.go index 4e991dcc..6ae716b5 100644 --- a/src/webapi/controllers/GinHelpers.go +++ b/src/webapi/controllers/GinHelpers.go @@ -1,11 +1,8 @@ package controllers import ( - "bytes" - "encoding/json" "github.com/gin-gonic/gin" "github.com/google/uuid" - "io/ioutil" "net/http" "rol/app/errors" "rol/dtos" @@ -20,19 +17,14 @@ func parseUUIDParam(ctx *gin.Context, paramName string) (uuid.UUID, error) { return uuid, nil } -//getRequestDtoAndRestoreBody parse json body to dto object and restore body in context +//getRequestDto parse json body to dto object and restore body in context //for logging it later in middleware -func getRequestDtoAndRestoreBody[reqDtoType any](ctx *gin.Context) (reqDtoType, error) { +func getRequestDto[reqDtoType any](ctx *gin.Context) (reqDtoType, error) { reqDto := new(reqDtoType) err := ctx.ShouldBindJSON(reqDto) if err != nil { return *reqDto, errors.Validation.New("incorrect json") } - buf, err := json.Marshal(reqDto) - if err != nil { - return *reqDto, errors.Internal.New("failed to marshal object back tp json for logging") - } - ctx.Request.Body = ioutil.NopCloser(bytes.NewBuffer(buf)) return *reqDto, nil } diff --git a/src/webapi/controllers/HostNetworkVlanController.go b/src/webapi/controllers/HostNetworkVlanController.go index 40e4e939..c3065f78 100644 --- a/src/webapi/controllers/HostNetworkVlanController.go +++ b/src/webapi/controllers/HostNetworkVlanController.go @@ -94,7 +94,7 @@ func (h *HostNetworkVlanController) GetByName(ctx *gin.Context) { // @Failure 500 "Internal Server Error" // @router /host/network/vlan/ [post] func (h *HostNetworkVlanController) Create(ctx *gin.Context) { - reqDto, err := getRequestDtoAndRestoreBody[dtos.HostNetworkVlanCreateDto](ctx) + reqDto, err := getRequestDto[dtos.HostNetworkVlanCreateDto](ctx) if err != nil { abortWithStatusByErrorType(ctx, err) return @@ -122,7 +122,7 @@ func (h *HostNetworkVlanController) Create(ctx *gin.Context) { // @Failure 500 "Internal Server Error" // @router /host/network/vlan/{name} [put] func (h *HostNetworkVlanController) Update(ctx *gin.Context) { - reqDto, err := getRequestDtoAndRestoreBody[dtos.HostNetworkVlanUpdateDto](ctx) + reqDto, err := getRequestDto[dtos.HostNetworkVlanUpdateDto](ctx) if err != nil { abortWithStatusByErrorType(ctx, err) return @@ -134,7 +134,7 @@ func (h *HostNetworkVlanController) Update(ctx *gin.Context) { //Delete host network vlan // -//Params: +//Params:S // ctx - gin context // // @Summary Delete host network vlan by name diff --git a/src/webapi/middleware/Logger.go b/src/webapi/middleware/Logger.go index 7272d7e9..989ca06b 100644 --- a/src/webapi/middleware/Logger.go +++ b/src/webapi/middleware/Logger.go @@ -57,7 +57,17 @@ func Logger(logger logrus.FieldLogger, notLogged ...string) gin.HandlerFunc { start := time.Now() blw := &bodyLogWriter{body: bytes.NewBufferString(""), ResponseWriter: c.Writer} c.Writer = blw + + var bodyBytes []byte + if c.Request.Body != nil { + bodyBytes, _ = ioutil.ReadAll(c.Request.Body) + } + reqBody := string(bodyBytes) + // Restore the io.ReadCloser to its original state + c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(bodyBytes)) + c.Next() + if strings.Contains(path, "/swagger/") { return } @@ -67,6 +77,7 @@ func Logger(logger logrus.FieldLogger, notLogged ...string) gin.HandlerFunc { clientIP := c.ClientIP() clientUserAgent := c.Request.UserAgent() referer := c.Request.Referer() + respBody := blw.body.String() if _, ok := skip[path]; ok { return @@ -108,15 +119,6 @@ func Logger(logger logrus.FieldLogger, notLogged ...string) gin.HandlerFunc { } domain := c.Request.Host - var bodyBytes []byte - if c.Request.Body != nil { - bodyBytes, _ = ioutil.ReadAll(c.Request.Body) - } - // Restore the io.ReadCloser to its original state - c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(bodyBytes)) - - respBody := blw.body.String() - var respHeadersArr []string for header := range c.Writer.Header() { respHeadersArr = append(respHeadersArr, header) @@ -138,7 +140,7 @@ func Logger(logger logrus.FieldLogger, notLogged ...string) gin.HandlerFunc { "userAgent": clientUserAgent, "queryParams": queryParams, "headers": headersString, - "requestBody": string(bodyBytes), + "requestBody": reqBody, "requestID": requestID, "customHeaders": customHeadersString, "responseBody": respBody,