Big Refacotr - part2

This commit is contained in:
PB
2025-10-27 18:38:33 +01:00
parent 5a304f11ac
commit 988479dc5d
13 changed files with 94 additions and 159 deletions

View File

@@ -8,10 +8,10 @@ import (
) )
type App struct { type App struct {
worker Worker worker WorkerInterface
} }
func NewApp(worker Worker) *App { func NewApp(worker WorkerInterface) *App {
return &App{ return &App{
worker: worker, worker: worker,
} }

View File

@@ -17,8 +17,6 @@ const (
defCachePassword = "12345678" defCachePassword = "12345678"
defDbURL = "postgres://postgres:12345678@db-postgres:5432/egommerce" defDbURL = "postgres://postgres:12345678@db-postgres:5432/egommerce"
defMongoDbURL = "mongodb://mongodb:12345678@db-mongo:27017" defMongoDbURL = "mongodb://mongodb:12345678@db-mongo:27017"
// defEventBusExchange = "api-events"
// defEventBusQueue = "identity-svc"
) )
type Config struct { type Config struct {
@@ -49,25 +47,11 @@ func NewConfig(name string) *Config {
c.CacheUsername = cnf.GetEnv("API_CACHE_USERNAME", defCacheUsername) c.CacheUsername = cnf.GetEnv("API_CACHE_USERNAME", defCacheUsername)
c.CachePassword = cnf.GetEnv("API_CACHE_PASSWORD", defCachePassword) c.CachePassword = cnf.GetEnv("API_CACHE_PASSWORD", defCachePassword)
c.DbURL = cnf.GetEnv("API_DATABASE_URL", defDbURL) c.DbURL = cnf.GetEnv("API_DATABASE_URL", defDbURL)
c.MongoDbUrl = cnf.GetEnv("API_MONGO_URL", defMongoDbURL)
return c return c
} }
// func (c *Config) GetArray() map[string]string { // FIXME fix types etc
// arr := make(map[string]string)
// arr["id"] = c.ID
// arr["name"] = c.Name
// arr["appFullname"] = c.getAppFullName()
// arr["domain"] = c.Domain
// arr["netAddr"] = c.NetAddr
// arr["cacheAddr"] = c.CacheAddr
// arr["cacheUsername"] = c.CacheUsername
// arr["cachePassword"] = c.CachePassword
// arr["dbURL"] = c.DbURL
// return arr
// }
func (c *Config) getAppFullName() string { func (c *Config) getAppFullName() string {
return fmt.Sprintf("%s_%s", c.Name, c.ID) return fmt.Sprintf("%s_%s", c.Name, c.ID)
} }

View File

@@ -1,19 +0,0 @@
package app
import (
"github.com/go-redis/redis/v8"
"github.com/jackc/pgx/v5/pgxpool"
)
type Dependencies struct {
cache *redis.Client
db *pgxpool.Pool
}
func (d *Dependencies) GetCache() *redis.Client {
return d.cache
}
func (d *Dependencies) GetDatabase() *pgxpool.Pool {
return d.db
}

View File

@@ -7,7 +7,7 @@ type (
Shutdown() Shutdown()
} }
Worker interface { WorkerInterface interface {
Start() error Start() error
OnShutdown() OnShutdown()

View File

@@ -7,9 +7,32 @@ import (
"time" "time"
redis "github.com/go-redis/redis/v8" redis "github.com/go-redis/redis/v8"
"github.com/jackc/pgx/v5/pgxpool"
db "github.com/jackc/pgx/v5/pgxpool" db "github.com/jackc/pgx/v5/pgxpool"
) )
type PluginManager struct {
plugins map[string]any
}
func NewPluginManager() *PluginManager {
return &PluginManager{
plugins: make(map[string]any),
}
}
func (pm *PluginManager) addPlugin(name string, fn PluginFn) {
pm.plugins[name] = fn()
}
func (pm *PluginManager) getCache() *redis.Client {
return (pm.plugins["cache"]).(*redis.Client)
}
func (pm *PluginManager) getDatabase() *pgxpool.Pool {
return (pm.plugins["database"]).(*pgxpool.Pool)
}
func CachePlugin(cnf *Config) Plugin { func CachePlugin(cnf *Config) Plugin {
return Plugin{ return Plugin{
name: "cache", name: "cache",

View File

@@ -1 +1,44 @@
package app package app
import (
"log"
"time"
"github.com/onatm/clockwerk"
"git.ego.freeddns.org/egommerce/identity-service/infra/repository"
"git.ego.freeddns.org/egommerce/identity-service/internal/cli/scheduler"
"git.ego.freeddns.org/egommerce/identity-service/internal/service"
)
type Scheduler struct {
*PluginManager
}
func NewScheduler(c *Config) *Scheduler {
return &Scheduler{
PluginManager: NewPluginManager(),
}
}
func (c *Scheduler) Start() error { // STILL NEEDS REFACTORING ;)
userRepo := repository.NewUserRepository(c.getDatabase())
roleRepo := repository.NewRoleRepository(c.getDatabase())
urlRepo := repository.NewURLAccessRepository(c.getDatabase())
authSrv := service.NewAuthService(userRepo, c.getCache())
guardSrv := service.NewGuardService(authSrv, c.getCache(), userRepo, roleRepo, urlRepo)
job := scheduler.NewCachePermissionsJob(guardSrv)
sch := clockwerk.New()
sch.Every(30 * time.Minute).Do(job)
sch.Start()
return nil
}
func (c *Scheduler) OnShutdown() {
log.Println("Scheduler is going down...")
c.getDatabase().Close()
c.getCache().Close()
}

View File

@@ -6,12 +6,10 @@ import (
"net" "net"
"time" "time"
"github.com/go-redis/redis/v8"
jwt "github.com/gofiber/contrib/jwt" jwt "github.com/gofiber/contrib/jwt"
"github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/cors" "github.com/gofiber/fiber/v2/middleware/cors"
"github.com/google/uuid" "github.com/google/uuid"
"github.com/jackc/pgx/v5/pgxpool"
commonDTO "git.ego.freeddns.org/egommerce/api-entities/common/dto" commonDTO "git.ego.freeddns.org/egommerce/api-entities/common/dto"
cnf "git.ego.freeddns.org/egommerce/go-api-pkg/config" cnf "git.ego.freeddns.org/egommerce/go-api-pkg/config"
@@ -35,32 +33,26 @@ var defaultCORS = cors.New(
type ( type (
Server struct { Server struct {
*fiber.App *fiber.App
*PluginManager
ID string ID string
addr string // e.g. "127.0.0.1:443" addr string // e.g. "127.0.0.1:443"
plugins map[string]any
} }
// HeaderRequestID struct {
// RequestID string `reqHeader:"x-request-id"`
// }
) )
func NewServer(c *Config) *Server { func NewServer(c *Config) *Server {
srv := &Server{ return &Server{
ID: c.ID, ID: c.ID,
App: fiber.New(fiber.Config{ App: fiber.New(fiber.Config{
AppName: c.ID, AppName: c.ID,
ServerHeader: c.Name + ":" + c.ID, ServerHeader: c.getAppFullName(),
ReadTimeout: c.ReadTimeout * time.Millisecond, ReadTimeout: c.ReadTimeout * time.Millisecond,
WriteTimeout: c.WriteTimeout * time.Millisecond, WriteTimeout: c.WriteTimeout * time.Millisecond,
IdleTimeout: c.IdleTimeout * time.Millisecond, IdleTimeout: c.IdleTimeout * time.Millisecond,
}), }),
addr: c.NetAddr, PluginManager: NewPluginManager(),
plugins: make(map[string]any), addr: c.NetAddr,
} }
return srv
} }
func (s *Server) Start() error { func (s *Server) Start() error {
@@ -88,28 +80,6 @@ func (s *Server) OnShutdown() {
s.Shutdown() s.Shutdown()
} }
func (s *Server) addPlugin(name string, fn PluginFn) {
s.plugins[name] = fn()
}
// Plugin helper functions - using hardcoded keys because we rely on a specific implementation here...
func (s *Server) getCache() *redis.Client {
return (s.plugins["cache"]).(*redis.Client)
}
func (s *Server) getDatabase() *pgxpool.Pool {
return (s.plugins["database"]).(*pgxpool.Pool)
}
// func GetRequestID(c *fiber.Ctx) (string, error) {
// var hdr = new(HeaderRequestID)
// if err := c.ReqHeaderParser(hdr); err != nil {
// return "", err
// }
// return hdr.RequestID, nil
// }
func (s *Server) setupRouter() { func (s *Server) setupRouter() {
s.Options("*", defaultCORS) s.Options("*", defaultCORS)
s.Use(defaultCORS) s.Use(defaultCORS)
@@ -159,7 +129,3 @@ func JWTProtected() func(c *fiber.Ctx) error {
}, },
}) })
} }
// func (s *Server) Error(c *fiber.Ctx, code int, msg string) error {
// return c.Status(code).JSON(dto.ErrorResponseDTO{Error: msg})
// }

View File

@@ -7,7 +7,6 @@ import (
cnf "git.ego.freeddns.org/egommerce/go-api-pkg/config" cnf "git.ego.freeddns.org/egommerce/go-api-pkg/config"
"git.ego.freeddns.org/egommerce/identity-service/app" "git.ego.freeddns.org/egommerce/identity-service/app"
"git.ego.freeddns.org/egommerce/identity-service/internal/cli/scheduler"
) )
func main() { func main() {
@@ -15,13 +14,11 @@ func main() {
log.Panicln(cnf.ErrLoadingEnvs) log.Panicln(cnf.ErrLoadingEnvs)
} }
c := app.NewConfig("identity-cronjob") cnf := app.NewConfig("identity-scheduler")
cArr := c.GetArray() w := app.NewScheduler(cnf)
a := app.NewApp(w)
doer := scheduler.New(c) a.RegisterPlugin(app.CachePlugin(cnf))
a := app.NewApp(doer) a.RegisterPlugin(app.DatabasePlugin(cnf))
a.RegisterPlugin(app.CachePlugin(cArr))
a.RegisterPlugin(app.DatabasePlugin(cArr))
while := make(chan struct{}) while := make(chan struct{})
err := a.Start(while) err := a.Start(while)

View File

@@ -15,14 +15,13 @@ func main() {
} }
cnf := app.NewConfig("identity-svc") cnf := app.NewConfig("identity-svc")
worker := app.NewServer(cnf) w := app.NewServer(cnf)
a := app.NewApp(w)
srv := app.NewApp(worker) a.RegisterPlugin(app.CachePlugin(cnf))
srv.RegisterPlugin(app.CachePlugin(cnf)) a.RegisterPlugin(app.DatabasePlugin(cnf))
srv.RegisterPlugin(app.DatabasePlugin(cnf))
while := make(chan struct{}) while := make(chan struct{})
err := srv.Start(while) err := a.Start(while)
<-while <-while
if err != nil { if err != nil {

View File

@@ -6,7 +6,7 @@ toolchain go1.24.1
require ( require (
git.ego.freeddns.org/egommerce/api-entities v0.3.34 git.ego.freeddns.org/egommerce/api-entities v0.3.34
git.ego.freeddns.org/egommerce/go-api-pkg v0.5.2 git.ego.freeddns.org/egommerce/go-api-pkg v0.5.3
github.com/georgysavva/scany/v2 v2.1.4 github.com/georgysavva/scany/v2 v2.1.4
github.com/go-pg/migrations/v8 v8.1.0 github.com/go-pg/migrations/v8 v8.1.0
github.com/go-pg/pg/v10 v10.15.0 github.com/go-pg/pg/v10 v10.15.0

View File

@@ -1,8 +1,8 @@
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
git.ego.freeddns.org/egommerce/api-entities v0.3.34 h1:WftM9cvV3JmbS1DlHCIiV3tsYIpALj9IXo90mkgZNWQ= git.ego.freeddns.org/egommerce/api-entities v0.3.34 h1:WftM9cvV3JmbS1DlHCIiV3tsYIpALj9IXo90mkgZNWQ=
git.ego.freeddns.org/egommerce/api-entities v0.3.34/go.mod h1:IqynARw+06GOm4eZGZuepmbi7bUxWBnOB4jd5cI7jf8= git.ego.freeddns.org/egommerce/api-entities v0.3.34/go.mod h1:IqynARw+06GOm4eZGZuepmbi7bUxWBnOB4jd5cI7jf8=
git.ego.freeddns.org/egommerce/go-api-pkg v0.5.2 h1:szfCwZ8S1Yf3b6LwpBs0DZYQZMsVl4Fe6VU1ou4LTOE= git.ego.freeddns.org/egommerce/go-api-pkg v0.5.3 h1:so+OWWVJEg6JZ5XOSmCpfW7Pd7IL6ETH0QsC6zCwndo=
git.ego.freeddns.org/egommerce/go-api-pkg v0.5.2/go.mod h1:T3ia8iprzlTRznPVXYCgEzQb/1UvIcdn9FHabE58vy0= git.ego.freeddns.org/egommerce/go-api-pkg v0.5.3/go.mod h1:T3ia8iprzlTRznPVXYCgEzQb/1UvIcdn9FHabE58vy0=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/MicahParks/keyfunc/v2 v2.1.0 h1:6ZXKb9Rp6qp1bDbJefnG7cTH8yMN1IC/4nf+GVjO99k= github.com/MicahParks/keyfunc/v2 v2.1.0 h1:6ZXKb9Rp6qp1bDbJefnG7cTH8yMN1IC/4nf+GVjO99k=
github.com/MicahParks/keyfunc/v2 v2.1.0/go.mod h1:rW42fi+xgLJ2FRRXAfNx9ZA8WpD4OeE/yHVMteCkw9k= github.com/MicahParks/keyfunc/v2 v2.1.0/go.mod h1:rW42fi+xgLJ2FRRXAfNx9ZA8WpD4OeE/yHVMteCkw9k=

View File

@@ -4,25 +4,19 @@ import (
"fmt" "fmt"
"time" "time"
"git.ego.freeddns.org/egommerce/identity-service/infra/repository"
"git.ego.freeddns.org/egommerce/identity-service/internal/service" "git.ego.freeddns.org/egommerce/identity-service/internal/service"
) )
type CachePermissionsJob struct { type CachePermissionsJob struct {
sch *Scheduler guard *service.GuardService
} }
func NewCachePermissionsJob(sch *Scheduler) CachePermissionsJob { func NewCachePermissionsJob(guard *service.GuardService) *CachePermissionsJob {
return CachePermissionsJob{sch: sch} return &CachePermissionsJob{guard: guard}
} }
func (j CachePermissionsJob) Run() { func (j CachePermissionsJob) Run() {
userRepo := repository.NewUserRepository(j.sch.GetDatabase()) j.guard.CacheAllPermissions()
roleRepo := repository.NewRoleRepository(j.sch.GetDatabase())
urlRepo := repository.NewURLAccessRepository(j.sch.GetDatabase())
authSrv := service.NewAuthService(userRepo, j.sch.GetCache())
guardSrv := service.NewGuardService(authSrv, j.sch.GetCache(), userRepo, roleRepo, urlRepo)
guardSrv.CacheAllPermissions()
fmt.Println(time.Now().String() + " permission successfully cached") fmt.Println(time.Now().String() + " permission successfully cached")
} }

View File

@@ -1,52 +0,0 @@
package scheduler
import ( // REFACTOR IT LIKE A SERVER WAS
"log"
"time"
"git.ego.freeddns.org/egommerce/identity-service/app"
// "github.com/go-redis/redis/v8"
// "github.com/jackc/pgx/v5/pgxpool"
"github.com/onatm/clockwerk"
)
type Scheduler struct {
handlers map[string]any
}
func New(c *app.Config) *Scheduler {
return &Scheduler{
handlers: make(map[string]any),
}
}
func (c *Scheduler) Start() error {
job := NewCachePermissionsJob(c)
sch := clockwerk.New()
sch.Every(30 * time.Minute).Do(job)
sch.Start()
return nil
}
// func (c *Scheduler) RegisterHandler(name string, fn func() any) {
// c.handlers[name] = fn()
// }
func (c *Scheduler) OnShutdown() {
log.Println("Chronos is going down...")
// c.GetDatabase().Close()
// c.GetCache().Close()
}
// Plugin helper funcitons - refactor needed cause funcs are duplcated in server.go
// TODO: move functions below to some common place
// func (c *Scheduler) GetCache() *redis.Client {
// return (c.handlers["cache"]).(*redis.Client)
// }
// func (c *Scheduler) GetDatabase() *pgxpool.Pool {
// return (c.handlers["database"]).(*pgxpool.Pool)
// }