Skip to content

Commit

Permalink
chore: refactor code
Browse files Browse the repository at this point in the history
  • Loading branch information
vaayne committed Jul 15, 2024
1 parent 9f621d4 commit 759aad0
Show file tree
Hide file tree
Showing 11 changed files with 147 additions and 29 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@ _testmain.go
/test/run.out
/test/times.out

.env*

# This file includes artifacts of Go build that should not be checked in.
# For files created by specific development environment (e.g. editor),
# use alternative ways to exclude files from git.
Expand Down
15 changes: 15 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
services:
postgres:
image: postgres:16
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: postgres
ports:
- "15432:5432"
volumes:
- vibrain-data:/var/lib/postgresql/data

volumes:
vibrain-data:

13 changes: 12 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,21 +3,32 @@ module vibrain
go 1.22.4

require (
github.com/caarlos0/env/v11 v11.1.0
github.com/google/uuid v1.6.0
github.com/jackc/pgx/v5 v5.6.0
github.com/joho/godotenv v1.5.1
github.com/labstack/echo/v4 v4.12.0
github.com/patrickmn/go-cache v2.1.0+incompatible
github.com/riverqueue/river v0.9.0
github.com/riverqueue/river/riverdriver/riverpgxv5 v0.9.0
)

require (
github.com/golang-jwt/jwt v3.2.2+incompatible // indirect
github.com/jackc/pgpassfile v1.0.0 // indirect
github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect
github.com/jackc/puddle/v2 v2.2.1 // indirect
github.com/labstack/gommon v0.4.2 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/riverqueue/river/riverdriver v0.9.0 // indirect
github.com/riverqueue/river/rivertype v0.9.0 // indirect
github.com/valyala/bytebufferpool v1.0.0 // indirect
github.com/valyala/fasttemplate v1.2.2 // indirect
golang.org/x/crypto v0.22.0 // indirect
golang.org/x/net v0.24.0 // indirect
golang.org/x/sync v0.7.0 // indirect
golang.org/x/sys v0.19.0 // indirect
golang.org/x/text v0.14.0 // indirect
golang.org/x/text v0.16.0 // indirect
golang.org/x/time v0.5.0 // indirect
)
46 changes: 42 additions & 4 deletions go.sum
Original file line number Diff line number Diff line change
@@ -1,13 +1,30 @@
github.com/caarlos0/env/v11 v11.1.0 h1:a5qZqieE9ZfzdvbbdhTalRrHT5vu/4V1/ad1Ka6frhI=
github.com/caarlos0/env/v11 v11.1.0/go.mod h1:LwgkYk1kDvfGpHthrWWLof3Ny7PezzFwS4QrsJdHTMo=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY=
github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/jackc/pgerrcode v0.0.0-20220416144525-469b46aa5efa h1:s+4MhCQ6YrzisK6hFJUX53drDT4UsSW3DEhKn0ifuHw=
github.com/jackc/pgerrcode v0.0.0-20220416144525-469b46aa5efa/go.mod h1:a/s9Lp5W7n/DD0VrVoyJ00FbP2ytTPDVOivvn2bMlds=
github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=
github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=
github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk=
github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM=
github.com/jackc/pgx/v5 v5.6.0 h1:SWJzexBzPL5jb0GEsrPMLIsi/3jOo7RHlzTjcAeDrPY=
github.com/jackc/pgx/v5 v5.6.0/go.mod h1:DNZ/vlrUnhWCoFGxHAG8U2ljioxukquj7utPDgtQdTw=
github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk=
github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4=
github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
github.com/labstack/echo/v4 v4.12.0 h1:IKpw49IMryVB2p1a4dzwlhP1O2Tf2E0Ir/450lH+kI0=
github.com/labstack/echo/v4 v4.12.0/go.mod h1:UP9Cr2DJXbOK3Kr9ONYzNowSh7HP0aG0ShAyycHSJvM=
github.com/labstack/gommon v0.4.2 h1:F8qTUNXgG1+6WQmqoUWnz8WiEU60mXVVw0P4ht1WRA0=
github.com/labstack/gommon v0.4.2/go.mod h1:QlUFxVM+SNXhDL/Z7YhocGIBYOiwB0mXm1+1bAPHPyU=
github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
Expand All @@ -17,23 +34,44 @@ github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaR
github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/riverqueue/river v0.9.0 h1:DRPJ9paWMC++k2OLXrrsK/Z5XqyqsRq/JLaEDEkxCw4=
github.com/riverqueue/river v0.9.0/go.mod h1:6fDqGoygzuEr0fEJQLUbDJC3e7XAUKASRN66IwX2wA4=
github.com/riverqueue/river/riverdriver v0.9.0 h1:Vmk1LC9z1tLLK+/5YtHgEiXBLaA55kumwA4fBnANj2s=
github.com/riverqueue/river/riverdriver v0.9.0/go.mod h1:qxipkiGng0CmvFeZGjlKDEfUkbZzPHi8OnQSAyhTjjQ=
github.com/riverqueue/river/riverdriver/riverdatabasesql v0.9.0 h1:LL9ItW4ka52yOk7788f+3Fed82WHrLI2wS+jpPh8C5k=
github.com/riverqueue/river/riverdriver/riverdatabasesql v0.9.0/go.mod h1:4oOqwJD2XjK5lxg94W+KI6aRISKs2R8BzfCDddELXOc=
github.com/riverqueue/river/riverdriver/riverpgxv5 v0.9.0 h1:xTWB6jcYiXRqm7Mxi802IiG2D94Yx3Bj3otcmUfmWq4=
github.com/riverqueue/river/riverdriver/riverpgxv5 v0.9.0/go.mod h1:CLE9Q4N0uOEMATc47WxUUU81dcGaMqmyrY4PMLePDF8=
github.com/riverqueue/river/rivertype v0.9.0 h1:xr2ktQ55lqqKgXIm0Z7GJDtGuKk9BUD9kbchoUL69Lg=
github.com/riverqueue/river/rivertype v0.9.0/go.mod h1:nDd50b/mIdxR/ezQzGS/JiAhBPERA7tUIne21GdfspQ=
github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs=
github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo=
github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ=
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30=
golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=
golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w=
golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=
golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M=
golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o=
golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4=
golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI=
golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk=
golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
8 changes: 8 additions & 0 deletions internal/pkg/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"vibrain/internal/pkg/logger"

"github.com/caarlos0/env/v11"
"github.com/joho/godotenv"
)

var Settings = &Config{}
Expand Down Expand Up @@ -37,6 +38,13 @@ type Config struct {
}

func init() {
// Load .env file
if err := godotenv.Load(); err != nil {
logger.Default.Fatal("Error loading .env file", "err", err)
}
logger.Default.Info(".env file loaded")

// Load env to settings
if err := env.Parse(Settings); err != nil {
logger.Default.Fatal("failed to load settings", "err", err)
}
Expand Down
7 changes: 3 additions & 4 deletions internal/port/httpserver/contexts/context.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@ package contexts

import (
"context"
"vibrain/internal/pkg/config"
"vibrain/internal/pkg/constant"

"github.com/labstack/echo/v4"
)

func Set(c echo.Context, key string, value interface{}) {
ctx := c.Request().Context()
ctx = context.WithValue(ctx, config.ContextKey(key), value)
ctx = context.WithValue(ctx, constant.ContextKey(key), value)

// set to context.Context
c.SetRequest(c.Request().WithContext(ctx))
Expand All @@ -19,11 +19,10 @@ func Set(c echo.Context, key string, value interface{}) {
}

func Get(c echo.Context, key string) interface{} {

// get from echo.Context
if v := c.Get(key); v != nil {
return v
}
// get from context.Context
return c.Request().Context().Value(config.ContextKey(key))
return c.Request().Context().Value(constant.ContextKey(key))
}
2 changes: 0 additions & 2 deletions internal/port/httpserver/handlers/workers.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,6 @@ func WebReaderHandler(c echo.Context) error {
return ErrorResponse(c, http.StatusBadRequest, err)
}



content, err := workers.WebReader(ctx, req.URL)
if err != nil {
return ErrorResponse(c, http.StatusInternalServerError, err)
Expand Down
9 changes: 4 additions & 5 deletions internal/port/httpserver/middleware.go
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
package httpserver

import (
"log/slog"
"time"
"vibrain/internal/pkg/config"
"vibrain/internal/pkg/constant"
"vibrain/internal/pkg/logger"

"log/slog"
"vibrain/internal/port/httpserver/contexts"

"github.com/google/uuid"
Expand All @@ -19,7 +18,7 @@ func registerMiddlewares(e *echo.Echo) {
return uuid.Must(uuid.NewV7()).String()
},
RequestIDHandler: func(c echo.Context, id string) {
contexts.Set(c, config.ContextKeyRequestID, id)
contexts.Set(c, constant.ContextKeyRequestID, id)
},
}))
e.Use(requestLoggerMiddleware())
Expand All @@ -37,7 +36,7 @@ func registerMiddlewares(e *echo.Echo) {
func contextMiddleWare() echo.MiddlewareFunc {
return func(next echo.HandlerFunc) echo.HandlerFunc {
return func(c echo.Context) error {
contexts.Set(c, config.ContextKeyLogger, logger.FromContext(c.Request().Context()))
contexts.Set(c, constant.ContextKeyLogger, logger.FromContext(c.Request().Context()))
return next(c)
}
}
Expand Down
1 change: 0 additions & 1 deletion internal/port/httpserver/router.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import (
)

func registerRouters(e *echo.Echo) {

v1Api := e.Group("/api/v1")

tools := v1Api.Group("/tools")
Expand Down
13 changes: 2 additions & 11 deletions internal/port/httpserver/server.go
Original file line number Diff line number Diff line change
@@ -1,15 +1,12 @@
package httpserver

import (
"fmt"
"net/http"
"os"

"github.com/labstack/echo/v4"
)

// Serve starts the HTTP server
func Serve() {
func New() *echo.Echo {
e := echo.New()
registerMiddlewares(e)
registerRouters(e)
Expand All @@ -18,11 +15,5 @@ func Serve() {
e.GET("/status", func(c echo.Context) error {
return c.JSON(http.StatusOK, map[string]string{"status": "ok"})
})

port, ok := os.LookupEnv("PORT")
if !ok {
port = "1323"
}

e.Logger.Fatal(e.Start(fmt.Sprintf(":%s", port)))
return e
}
60 changes: 59 additions & 1 deletion main.go
Original file line number Diff line number Diff line change
@@ -1,9 +1,67 @@
package main

import (
"context"
"fmt"
"os"
"os/signal"
"time"
"vibrain/internal/core/queue"
"vibrain/internal/pkg/config"
"vibrain/internal/pkg/logger"
"vibrain/internal/port/httpserver"

"github.com/labstack/echo/v4"
)

func newQueue(ctx context.Context) *queue.Queue {
q, err := queue.New(config.Settings.QueueDatabaseURL)
if err != nil {
logger.Default.Fatal("failed to create queue", "error", err)
}
go func() {
if err := q.Start(ctx); err != nil {
logger.Default.Fatal("failed to start queue", "error", err)
}
logger.Default.Info("queue started")
}()
return q
}

func newServer() *echo.Echo {
server := httpserver.New()
go func() {
addr := fmt.Sprintf(":%d", config.Settings.Port)
if err := server.Start(fmt.Sprintf(":%d", config.Settings.Port)); err != nil {
logger.Default.Fatal("failed to start server", "addr", addr, "error", err)
}
logger.Default.Info("server started", "addr", addr)
}()
return server
}

func main() {
httpserver.Serve()
ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, os.Kill)
defer stop()
logger.Default.Info("starting service")

// start queue
q := newQueue(ctx)
// start http server
server := newServer()

// wait for signal and gracefully shutdown
<-ctx.Done()
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()

// shutdown server
if err := server.Shutdown(ctx); err != nil {
logger.Default.Fatal("failed to shutdown server", "error", err)
}

// shutdown queue
if err := q.Stop(ctx); err != nil {
logger.Default.Fatal("failed to shutdown queue", "error", err)
}
}

0 comments on commit 759aad0

Please sign in to comment.