132 lines
3.4 KiB
Go
132 lines
3.4 KiB
Go
package cmd
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"log/slog"
|
|
nethttp "net/http"
|
|
"os"
|
|
"os/signal"
|
|
"syscall"
|
|
"time"
|
|
|
|
"github.com/spf13/cobra"
|
|
"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/http"
|
|
"trankilou.fr/lassistanoque/backend/internal/llmserver"
|
|
"trankilou.fr/lassistanoque/backend/internal/service/agent"
|
|
"trankilou.fr/lassistanoque/backend/internal/service/auth"
|
|
"trankilou.fr/lassistanoque/backend/internal/service/provider"
|
|
"trankilou.fr/lassistanoque/backend/internal/service/storage"
|
|
"trankilou.fr/lassistanoque/backend/internal/service/user"
|
|
)
|
|
|
|
func init() {
|
|
rootCmd.AddCommand(
|
|
newServeCmd(),
|
|
)
|
|
}
|
|
|
|
func newServeCmd() *cobra.Command {
|
|
var short bool
|
|
cmd := &cobra.Command{
|
|
Use: "serve",
|
|
Short: "Run server",
|
|
Run: func(cmd *cobra.Command, args []string) {
|
|
runServe()
|
|
},
|
|
}
|
|
cmd.Flags().BoolVarP(&short, "short", "s", false, "show only version number")
|
|
return cmd
|
|
}
|
|
|
|
func runServe() {
|
|
// database
|
|
db, err := database.GetDatabase()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
defer db.Close()
|
|
|
|
err = db.Migrate()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
// storage
|
|
store, err := file.GetStorageProvider(db.FileRepository())
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
// Adapters
|
|
tokenManager := security.NewJwtTokenManager(12*time.Hour, 7*24*time.Hour, "lassistanoque")
|
|
pwdAuth := password.NewPasswordAuthenticator(tokenManager, db.UserRepository())
|
|
llmEngine := llm.NewAnyLLMEngine()
|
|
|
|
// services
|
|
authService := auth.NewService(
|
|
db.SettingsRepository(),
|
|
db.UserRepository(),
|
|
map[string]auth.Authenticator{
|
|
"password": pwdAuth,
|
|
},
|
|
)
|
|
userService := user.NewService(db.UserRepository())
|
|
storageService := storage.NewService(store)
|
|
providerService := provider.NewService(db.ProviderRepository(), db.UserRepository(), llmEngine)
|
|
agentService := agent.NewService(db.AgentRepository(), db.UserRepository())
|
|
|
|
// http server
|
|
router := http.NewRouter(http.Dependencies{
|
|
StorageService: storageService,
|
|
AuthService: authService,
|
|
UserService: userService,
|
|
TokenManager: tokenManager,
|
|
ProviderService: providerService,
|
|
AgentService: agentService,
|
|
})
|
|
|
|
llms := llmserver.NewLLMServer(llmserver.Dependencies{})
|
|
|
|
ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM)
|
|
defer stop()
|
|
|
|
// start LLM service
|
|
go func() {
|
|
if err := llms.Start(); err != nil && !errors.Is(err, nethttp.ErrServerClosed) {
|
|
slog.Error("failed to start llm server", "error", err)
|
|
}
|
|
}()
|
|
|
|
// start HTTP service
|
|
go func() {
|
|
if err := router.Start(); err != nil && !errors.Is(err, nethttp.ErrServerClosed) {
|
|
slog.Error("failed to start http server", "error", err)
|
|
}
|
|
}()
|
|
|
|
<-ctx.Done()
|
|
|
|
// stop HTTP service
|
|
ctx, cancel1 := context.WithTimeout(context.Background(), 10*time.Second)
|
|
defer cancel1()
|
|
if err := router.Stop(ctx); err != nil {
|
|
slog.Error("failed to stop http server", "error", err)
|
|
}
|
|
slog.Info("HTTP server stopped gracefully")
|
|
|
|
// stop LLM service
|
|
ctx, cancel2 := context.WithTimeout(context.Background(), 10*time.Second)
|
|
defer cancel2()
|
|
if err := llms.Stop(ctx); err != nil {
|
|
slog.Error("failed to stop llm server", "error", err)
|
|
}
|
|
slog.Info("LLM server stopped gracefully")
|
|
|
|
}
|