openreplay/backend/pkg/common/builder.go
2024-10-23 14:11:45 +02:00

90 lines
2.3 KiB
Go

package common
import (
"errors"
"openreplay/backend/pkg/common/api/auth"
"openreplay/backend/pkg/db/postgres/pool"
"openreplay/backend/pkg/flakeid"
"openreplay/backend/pkg/logger"
"openreplay/backend/pkg/objectstorage"
)
// ServicesBuilder struct to hold service components
type ServicesBuilder struct {
flaker *flakeid.Flaker
objStorage objectstorage.ObjectStorage
Auth auth.Auth
log logger.Logger
pgconn pool.Pool
workerID int
jwtSecret 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(flaker *flakeid.Flaker) *ServicesBuilder {
b.flaker = flaker
return b
}
// WithObjectStorage sets the Object Storage component
func (b *ServicesBuilder) WithObjectStorage(objStorage objectstorage.ObjectStorage) *ServicesBuilder {
b.objStorage = objStorage
return b
}
// WithAuth sets the Auth component
func (b *ServicesBuilder) WithAuth(auth auth.Auth) *ServicesBuilder {
b.Auth = auth
return b
}
// WithDatabase sets the database connection pool (Postgres pool.Pool)
func (b *ServicesBuilder) WithDatabase(pgconn pool.Pool) *ServicesBuilder {
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 secret for Auth
func (b *ServicesBuilder) WithJWTSecret(jwtSecret string) *ServicesBuilder {
b.jwtSecret = jwtSecret
return b
}
// Build finalizes the service setup and returns an instance of ServicesBuilder with all components
func (b *ServicesBuilder) Build() (*ServicesBuilder, error) {
// Initialize default components if they aren't provided
// Check if database pool is provided
if b.pgconn == nil {
return nil, errors.New("database connection pool is required")
}
// Flaker
if b.flaker == nil {
b.flaker = flakeid.NewFlaker(uint16(b.workerID))
}
// Auth
if b.Auth == nil {
if b.jwtSecret == "" {
return nil, errors.New("JWT secret is required")
}
b.Auth = auth.NewAuth(b.log, b.jwtSecret, b.pgconn)
}
// Return the fully constructed service
return b, nil
}