openreplay/backend/pkg/common/builder.go
2024-10-30 10:53:55 +01:00

85 lines
2.3 KiB
Go

package common
import (
"context"
"openreplay/backend/internal/config/common"
objConfig "openreplay/backend/internal/config/objectstorage"
"openreplay/backend/pkg/common/api/auth"
"openreplay/backend/pkg/db/postgres/pool"
"openreplay/backend/pkg/flakeid"
"openreplay/backend/pkg/logger"
"openreplay/backend/pkg/objectstorage"
"openreplay/backend/pkg/objectstorage/store"
)
// ServicesBuilder struct to hold service components
type ServicesBuilder struct {
Config *common.Config
Flaker *flakeid.Flaker
ObjStorage objectstorage.ObjectStorage
Auth auth.Auth
Log logger.Logger
Pgconn pool.Pool
workerID int
jwtSecret string
extraSecret string
}
// NewServiceBuilder initializes the ServicesBuilder with essential components (logger)
func NewServiceBuilder(log logger.Logger) *ServicesBuilder {
return &ServicesBuilder{
Log: log,
}
}
// WithFlaker sets the Flaker component
func (b *ServicesBuilder) WithFlaker(workerID uint16) *ServicesBuilder {
b.Flaker = flakeid.NewFlaker(workerID)
return b
}
// WithObjectStorage sets the Object Storage component
func (b *ServicesBuilder) WithObjectStorage(config *objConfig.ObjectsConfig) *ServicesBuilder {
objStore, err := store.NewStore(config)
if err != nil {
return nil
}
b.ObjStorage = objStore
return b
}
// WithAuth sets the Auth component
func (b *ServicesBuilder) WithAuth(jwtSecret string, extraSecret ...string) *ServicesBuilder {
b.jwtSecret = jwtSecret
if len(extraSecret) > 0 {
b.extraSecret = extraSecret[0]
}
b.Auth = auth.NewAuth(b.Log, "jwt_iat", b.jwtSecret, b.extraSecret, b.Pgconn)
return b
}
// WithDatabase sets the database connection pool
func (b *ServicesBuilder) WithDatabase(url string) *ServicesBuilder {
pgConn, err := pool.New(url)
if err != nil {
b.Log.Fatal(context.Background(), "can't init postgres connection: %s", err)
}
b.Pgconn = pgConn
return b
}
// WithWorkerID sets the WorkerID for Flaker
func (b *ServicesBuilder) WithWorkerID(workerID int) *ServicesBuilder {
b.workerID = workerID
return b
}
// WithJWTSecret sets the JWT and optional extra secret for Auth
func (b *ServicesBuilder) WithJWTSecret(jwtSecret string, extraSecret ...string) *ServicesBuilder {
b.jwtSecret = jwtSecret
if len(extraSecret) > 0 {
b.extraSecret = extraSecret[0]
}
return b
}