197 lines
7.4 KiB
Go
197 lines
7.4 KiB
Go
// Code generated by Wire. DO NOT EDIT.
|
|
|
|
//go:generate go run -mod=mod github.com/google/wire/cmd/wire
|
|
//go:build !wireinject
|
|
// +build !wireinject
|
|
|
|
package app
|
|
|
|
import (
|
|
"codeberg.org/mapleopentech/monorepo/cloud/maplefile-backend/pkg/maplefile/client"
|
|
"codeberg.org/mapleopentech/monorepo/native/desktop/maplefile/pkg/storage/leveldb"
|
|
"codeberg.org/mapleopentech/monorepo/native/desktop/maplefile/internal/config"
|
|
session2 "codeberg.org/mapleopentech/monorepo/native/desktop/maplefile/internal/domain/session"
|
|
session3 "codeberg.org/mapleopentech/monorepo/native/desktop/maplefile/internal/repo/session"
|
|
"codeberg.org/mapleopentech/monorepo/native/desktop/maplefile/internal/service/auth"
|
|
"codeberg.org/mapleopentech/monorepo/native/desktop/maplefile/internal/service/httpclient"
|
|
"codeberg.org/mapleopentech/monorepo/native/desktop/maplefile/internal/service/keycache"
|
|
"codeberg.org/mapleopentech/monorepo/native/desktop/maplefile/internal/service/passwordstore"
|
|
"codeberg.org/mapleopentech/monorepo/native/desktop/maplefile/internal/service/ratelimiter"
|
|
"codeberg.org/mapleopentech/monorepo/native/desktop/maplefile/internal/service/search"
|
|
"codeberg.org/mapleopentech/monorepo/native/desktop/maplefile/internal/service/securitylog"
|
|
"codeberg.org/mapleopentech/monorepo/native/desktop/maplefile/internal/service/storagemanager"
|
|
"codeberg.org/mapleopentech/monorepo/native/desktop/maplefile/internal/service/sync"
|
|
"codeberg.org/mapleopentech/monorepo/native/desktop/maplefile/internal/service/tokenmanager"
|
|
"codeberg.org/mapleopentech/monorepo/native/desktop/maplefile/internal/usecase/session"
|
|
"context"
|
|
"go.uber.org/zap"
|
|
"os"
|
|
"strings"
|
|
)
|
|
|
|
// Injectors from wire.go:
|
|
|
|
// InitializeApplication creates a fully configured Application using Wire DI
|
|
func InitializeApplication() (*Application, error) {
|
|
logger, err := ProvideLogger()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
configService, err := config.New()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
client, err := ProvideMapleFileClient(configService, logger)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
repository, err := ProvideSessionRepository(logger)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
createUseCase := session.ProvideCreateUseCase(repository)
|
|
getByIdUseCase := session.ProvideGetByIdUseCase(repository)
|
|
deleteUseCase := session.ProvideDeleteUseCase(repository)
|
|
saveUseCase := session.ProvideSaveUseCase(repository)
|
|
service := auth.ProvideService(client, createUseCase, getByIdUseCase, deleteUseCase, saveUseCase, logger)
|
|
manager := tokenmanager.ProvideManager(client, service, getByIdUseCase, logger)
|
|
passwordstoreService := passwordstore.ProvideService(logger)
|
|
keycacheService := keycache.ProvideService(logger)
|
|
ratelimiterService := ratelimiter.ProvideService()
|
|
httpclientService := httpclient.ProvideService()
|
|
storagemanagerManager := storagemanager.ProvideManager(logger)
|
|
collectionSyncService := sync.ProvideCollectionSyncService(logger, client, storagemanagerManager)
|
|
fileSyncService := sync.ProvideFileSyncService(logger, client, storagemanagerManager)
|
|
syncService := sync.ProvideService(logger, collectionSyncService, fileSyncService, storagemanagerManager)
|
|
securitylogService := securitylog.ProvideService(logger)
|
|
searchService := search.New(configService, logger)
|
|
application := ProvideApplication(logger, configService, service, manager, passwordstoreService, keycacheService, ratelimiterService, httpclientService, syncService, storagemanagerManager, securitylogService, searchService)
|
|
return application, nil
|
|
}
|
|
|
|
// wire.go:
|
|
|
|
// ProvideLogger creates the application logger with environment-aware configuration.
|
|
// Defaults to production mode for security. Development mode must be explicitly enabled.
|
|
func ProvideLogger() (*zap.Logger, error) {
|
|
mode := os.Getenv("MAPLEFILE_MODE")
|
|
|
|
if mode == "dev" || mode == "development" {
|
|
|
|
return zap.NewDevelopment()
|
|
}
|
|
|
|
cfg := zap.NewProductionConfig()
|
|
cfg.Level = zap.NewAtomicLevelAt(zap.InfoLevel)
|
|
cfg.DisableCaller = true
|
|
cfg.DisableStacktrace = true
|
|
return cfg.Build()
|
|
}
|
|
|
|
// ProvideSessionRepository creates the session repository with its storage.
|
|
// Session storage is GLOBAL (not user-specific) because it stores the current login session.
|
|
func ProvideSessionRepository(logger *zap.Logger) (session2.Repository, error) {
|
|
provider, err := config.NewLevelDBConfigurationProviderForSession()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
sessionStorage := leveldb.NewDiskStorage(provider, logger.Named("session-storage"))
|
|
return session3.ProvideRepository(sessionStorage), nil
|
|
}
|
|
|
|
// zapLoggerAdapter adapts *zap.Logger to client.Logger interface
|
|
type zapLoggerAdapter struct {
|
|
logger *zap.Logger
|
|
}
|
|
|
|
func (a *zapLoggerAdapter) Debug(msg string, keysAndValues ...interface{}) {
|
|
fields := keysAndValuesToZapFields(keysAndValues...)
|
|
a.logger.Debug(msg, fields...)
|
|
}
|
|
|
|
func (a *zapLoggerAdapter) Info(msg string, keysAndValues ...interface{}) {
|
|
fields := keysAndValuesToZapFields(keysAndValues...)
|
|
a.logger.Info(msg, fields...)
|
|
}
|
|
|
|
func (a *zapLoggerAdapter) Warn(msg string, keysAndValues ...interface{}) {
|
|
fields := keysAndValuesToZapFields(keysAndValues...)
|
|
a.logger.Warn(msg, fields...)
|
|
}
|
|
|
|
func (a *zapLoggerAdapter) Error(msg string, keysAndValues ...interface{}) {
|
|
fields := keysAndValuesToZapFields(keysAndValues...)
|
|
a.logger.Error(msg, fields...)
|
|
}
|
|
|
|
// keysAndValuesToZapFields converts key-value pairs to zap fields
|
|
func keysAndValuesToZapFields(keysAndValues ...interface{}) []zap.Field {
|
|
fields := make([]zap.Field, 0, len(keysAndValues)/2)
|
|
for i := 0; i+1 < len(keysAndValues); i += 2 {
|
|
key, ok := keysAndValues[i].(string)
|
|
if !ok {
|
|
continue
|
|
}
|
|
fields = append(fields, zap.Any(key, keysAndValues[i+1]))
|
|
}
|
|
return fields
|
|
}
|
|
|
|
// BuildMode is set at compile time via -ldflags
|
|
// Example: go build -ldflags "-X codeberg.org/mapleopentech/monorepo/native/desktop/maplefile/internal/app.BuildMode=dev"
|
|
var BuildMode string
|
|
|
|
// ProvideMapleFileClient creates the backend API client
|
|
func ProvideMapleFileClient(configService config.ConfigService, logger *zap.Logger) (*client.Client, error) {
|
|
ctx := context.Background()
|
|
|
|
mode := os.Getenv("MAPLEFILE_MODE")
|
|
|
|
logger.Info("Startup: checking mode configuration", zap.String("MAPLEFILE_MODE_env", mode), zap.String("BuildMode_compile_time", BuildMode))
|
|
|
|
if mode == "" {
|
|
if BuildMode != "" {
|
|
mode = BuildMode
|
|
logger.Info("Startup: using compile-time BuildMode", zap.String("mode", mode))
|
|
} else {
|
|
mode = "production"
|
|
logger.Info("Startup: no mode set, defaulting to production", zap.String("mode", mode))
|
|
}
|
|
}
|
|
|
|
var baseURL string
|
|
switch mode {
|
|
case "production":
|
|
baseURL = client.ProductionURL
|
|
case "dev", "development":
|
|
baseURL = client.LocalURL
|
|
default:
|
|
|
|
cfg, err := configService.GetConfig(ctx)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
baseURL = cfg.CloudProviderAddress
|
|
}
|
|
|
|
clientLogger := &zapLoggerAdapter{logger: logger.Named("api-client")}
|
|
|
|
apiClient := client.New(client.Config{
|
|
BaseURL: baseURL,
|
|
Logger: clientLogger,
|
|
})
|
|
|
|
logger.Info("MapleFile API client initialized", zap.String("mode", mode), zap.String("base_url", baseURL))
|
|
|
|
if strings.HasPrefix(baseURL, "http://") {
|
|
logger.Warn("SECURITY WARNING: Using unencrypted HTTP connection", zap.String("mode", mode), zap.String("base_url", baseURL), zap.String("recommendation", "This should only be used for local development"))
|
|
}
|
|
|
|
if mode != "production" {
|
|
if err := configService.SetCloudProviderAddress(ctx, baseURL); err != nil {
|
|
logger.Warn("Failed to update cloud provider address in config", zap.Error(err))
|
|
}
|
|
}
|
|
|
|
return apiClient, nil
|
|
}
|