90 lines
2.3 KiB
Go
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
|
|
}
|