Skip to content

Commit

Permalink
Refactor the rest server structure (#33)
Browse files Browse the repository at this point in the history
  • Loading branch information
naueramant authored Apr 12, 2021
1 parent 3936f6b commit e427851
Show file tree
Hide file tree
Showing 5 changed files with 52 additions and 55 deletions.
4 changes: 2 additions & 2 deletions cmd/serve.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,9 @@ import (
"github.com/spf13/viper"
"github.com/uniwise/parrot/internal/cache"
"github.com/uniwise/parrot/internal/metrics"
"github.com/uniwise/parrot/pkg/poedit"
"github.com/uniwise/parrot/internal/project"
"github.com/uniwise/parrot/internal/rest"
"github.com/uniwise/parrot/pkg/poedit"
)

const (
Expand Down Expand Up @@ -82,7 +82,7 @@ by caching exports from poeditor`,

svc := project.NewService(cli, c, viper.GetDuration(confCacheRenewalThreshold), logrus.NewEntry(logger))

server, err := rest.NewServer(svc, logrus.NewEntry(logger), viper.GetBool(confPrometheusEnabled))
server, err := rest.NewServer(logrus.NewEntry(logger), svc, viper.GetBool(confPrometheusEnabled))
if err != nil {
logger.Fatal(err)
}
Expand Down
29 changes: 4 additions & 25 deletions internal/rest/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,58 +6,37 @@ import (

gosundheit "github.com/AppsFlyer/go-sundheit"
healthhttp "github.com/AppsFlyer/go-sundheit/http"
"github.com/labstack/gommon/random"
"github.com/pkg/errors"

"github.com/labstack/echo/v4"
"github.com/labstack/echo/v4/middleware"
eprom "github.com/paulfarver/echo-pack/middleware"
"github.com/sirupsen/logrus"
"github.com/uniwise/parrot/internal/project"
v1 "github.com/uniwise/parrot/internal/rest/v1"
)

const (
gzipCompressionLevel = 5
requestIDLength = 10
)

type Server struct {
Echo *echo.Echo
}

func NewServer(projectService project.Service, entry *logrus.Entry, enablePrometheus bool) (*Server, error) {
func NewServer(l *logrus.Entry, projectService project.Service, enablePrometheus bool) (*Server, error) {
e := echo.New()

e.HideBanner = true
e.HidePort = true
e.Validator = NewValidator()

// Middleware
e.Use(middleware.Recover())
e.Use(middleware.RequestID())
e.Use(middleware.GzipWithConfig(middleware.GzipConfig{
Level: gzipCompressionLevel,
}))
e.Use(middleware.RequestIDWithConfig(middleware.RequestIDConfig{
Generator: func() string {
return random.String(requestIDLength, random.Hex)
},
}))

v1Group := e.Group("/v1", func(next echo.HandlerFunc) echo.HandlerFunc {
return func(c echo.Context) error {
cc := &v1.Context{
Context: c,
ProjectService: projectService,
Log: entry.WithField("requestID", c.Response().Header().Get(echo.HeaderXRequestID)),
}

return next(cc)
}
})
if enablePrometheus {
v1Group.Use(eprom.Prometheus())
}
v1.Register(v1Group)
v1.Register(e, l, projectService, enablePrometheus)

h := gosundheit.New()

Expand Down
13 changes: 0 additions & 13 deletions internal/rest/v1/context.go

This file was deleted.

25 changes: 12 additions & 13 deletions internal/rest/v1/project.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,22 +18,21 @@ type getProjectLanguageRequest struct {
Format string `query:"format" validate:"omitempty,oneof=po pot mo xls xlsx csv ini resw resx android_strings apple_strings xliff properties key_value_json json yml xlf xmb xtb arb rise_360_xliff"`
}

func getProjectLanguage(ctx echo.Context) error {
c := ctx.(*Context)

func (h *Handlers) getProjectLanguage(ctx echo.Context, l *logrus.Entry) error {
req := new(getProjectLanguageRequest)
if err := c.Bind(req); err != nil {
c.Log.WithError(err).Error("Error binding request")
if err := ctx.Bind(req); err != nil {
l.WithError(err).Error("Error binding request")

return echo.ErrBadRequest
}

l := c.Log.WithFields(logrus.Fields{
l = l.WithFields(logrus.Fields{
"project": req.Project,
"language": req.Language,
"format": req.Format,
})
if err := c.Validate(req); err != nil {

if err := ctx.Validate(req); err != nil {
l.WithError(err).Error("Error validating request")

return echo.ErrBadRequest
Expand All @@ -51,7 +50,7 @@ func getProjectLanguage(ctx echo.Context) error {
return echo.ErrBadRequest
}

trans, err := c.ProjectService.GetTranslation(
trans, err := h.ProjectService.GetTranslation(
ctx.Request().Context(),
req.Project,
req.Language,
Expand All @@ -74,10 +73,10 @@ func getProjectLanguage(ctx echo.Context) error {
}
}

c.Response().Header().Add("Etag", trans.Checksum)
c.Response().Header().Add("Cache-Control", fmt.Sprintf("max-age=%.0f", trans.TTL.Seconds()))
c.Response().Header().Add("Content-Disposition", fmt.Sprintf("filename=%d-%s.%s", req.Project, req.Language, contentMeta.Extension))
c.Response().Header().Add("Content-Transfer-Encoding", "8bit")
ctx.Response().Header().Add("Etag", trans.Checksum)
ctx.Response().Header().Add("Cache-Control", fmt.Sprintf("max-age=%.0f", trans.TTL.Seconds()))
ctx.Response().Header().Add("Content-Disposition", fmt.Sprintf("filename=%d-%s.%s", req.Project, req.Language, contentMeta.Extension))
ctx.Response().Header().Add("Content-Transfer-Encoding", "8bit")

return c.Stream(http.StatusOK, contentMeta.Type, bytes.NewReader(trans.Data))
return ctx.Stream(http.StatusOK, contentMeta.Type, bytes.NewReader(trans.Data))
}
36 changes: 34 additions & 2 deletions internal/rest/v1/routes.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,40 @@ package v1

import (
"github.com/labstack/echo/v4"
eprom "github.com/paulfarver/echo-pack/middleware"
"github.com/sirupsen/logrus"
"github.com/uniwise/parrot/internal/project"
)

func Register(g *echo.Group) {
g.GET("/project/:project/language/:language", getProjectLanguage)
type Handlers struct {
ProjectService project.Service
}

type HandlerFunction func(ctx echo.Context, l *logrus.Entry) error

func Register(e *echo.Echo, l *logrus.Entry, projectService project.Service, enablePrometheus bool) {
h := &Handlers{
ProjectService: projectService,
}

g := e.Group("/v1")

if enablePrometheus {
g.Use(eprom.Prometheus())
}

g.GET("/project/:project/language/:language", wrap(h.getProjectLanguage, l))

}

func wrap(fn HandlerFunction, logger *logrus.Entry) echo.HandlerFunc {
return func(ctx echo.Context) error {
l := logger.WithFields(logrus.Fields{
"method": ctx.Request().Method,
"path": ctx.Request().URL.Path,
"requestId": ctx.Response().Header().Get(echo.HeaderXRequestID),
})

return fn(ctx, l)
}
}

0 comments on commit e427851

Please sign in to comment.