151 lines
4.0 KiB
Go
151 lines
4.0 KiB
Go
package cmd
|
|
|
|
import (
|
|
"time"
|
|
|
|
"trankilou.fr/lassistanoque/backend/internal/adapter/auth/oidc"
|
|
"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/browser"
|
|
"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
|
|
oidcAuth := oidc.NewOIDCAuthenticator(GetTokenManager(), db.OIDCProviderRepository(), db.UserRepository())
|
|
authenticators["oidc"] = oidcAuth
|
|
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(), db.OIDCProviderRepository(), GetTokenManager(), 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{})
|
|
toolService.RegisterToolImpl(&browser.BrowserTool{})
|
|
}
|
|
return toolService
|
|
}
|