package cmd import ( "time" "trankilou.fr/lassistanoque/backend/internal/adapter/auth/password" "trankilou.fr/lassistanoque/backend/internal/adapter/database" "trankilou.fr/lassistanoque/backend/internal/adapter/file" "trankilou.fr/lassistanoque/backend/internal/adapter/llm" "trankilou.fr/lassistanoque/backend/internal/adapter/security" "trankilou.fr/lassistanoque/backend/internal/adapter/tools/searxng" "trankilou.fr/lassistanoque/backend/internal/adapter/tools/weather" "trankilou.fr/lassistanoque/backend/internal/domain" "trankilou.fr/lassistanoque/backend/internal/service/agent" "trankilou.fr/lassistanoque/backend/internal/service/auth" "trankilou.fr/lassistanoque/backend/internal/service/chat" "trankilou.fr/lassistanoque/backend/internal/service/provider" "trankilou.fr/lassistanoque/backend/internal/service/storage" "trankilou.fr/lassistanoque/backend/internal/service/tool" "trankilou.fr/lassistanoque/backend/internal/service/user" ) var db database.Database // adapters var storeAdapter storage.StorageProvider var llmengine domain.LLMEngine // services var authService *auth.Service var userService *user.Service var storageService *storage.Service var providerService *provider.Service var agentService *agent.Service var toolService *tool.Service var chatService *chat.Service var tokenManager auth.TokenManager func init() { var err error db, err = database.GetDatabase() if err != nil { panic(err) } err = db.Migrate() if err != nil { panic(err) } } func Close() { db.Close() } // Adapters func getStoreAdapter() storage.StorageProvider { if storeAdapter == nil { var err error storeAdapter, err = file.GetStorageProvider(db.FileRepository()) if err != nil { panic(err) } } return storeAdapter } func getAuthenticators() map[string]auth.Authenticator { authenticators := make(map[string]auth.Authenticator) pwdAuth := password.NewPasswordAuthenticator(GetTokenManager(), db.UserRepository()) authenticators["password"] = pwdAuth return authenticators } func GetTokenManager() auth.TokenManager { if tokenManager == nil { tokenManager = security.NewJwtTokenManager(12*time.Hour, 7*24*time.Hour, "lassistanoque") } return tokenManager } func GetLLMAdapter() domain.LLMEngine { if llmengine == nil { llmengine = llm.NewAnyLLMEngine() } return llmengine } // Services func GetStorageService() *storage.Service { if storageService == nil { storageService = storage.NewService(getStoreAdapter()) } return storageService } func GetAuthService() *auth.Service { if authService == nil { authService = auth.NewService(db.SettingsRepository(), db.UserRepository(), getAuthenticators()) } return authService } func GetUserService() *user.Service { if userService == nil { userService = user.NewService(db.UserRepository()) } return userService } func GetProviderService() *provider.Service { if providerService == nil { providerService = provider.NewService(db.ProviderRepository(), db.UserRepository(), GetLLMAdapter()) } return providerService } func GetAgentService() *agent.Service { if agentService == nil { agentService = agent.NewService(db.AgentRepository(), db.UserRepository()) } return agentService } func GetChatService() *chat.Service { if chatService == nil { chatService = chat.NewService( db.UserRepository(), db.AgentRepository(), db.ProviderRepository(), db.ChatRepository(), GetLLMAdapter(), GetToolService(), ) } return chatService } func GetToolService() *tool.Service { if toolService == nil { toolService = tool.NewService(db.ToolRepository(), db.UserRepository()) toolService.RegisterToolImpl(&weather.WeatherTool{}) toolService.RegisterToolImpl(&searxng.SearxngTool{}) } return toolService }