60 lines
1.8 KiB
Go
60 lines
1.8 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"log"
|
|
"net/http"
|
|
"os"
|
|
"os/signal"
|
|
"syscall"
|
|
|
|
"github.com/spf13/cobra"
|
|
"github.com/syonad/clonepack/config"
|
|
"github.com/syonad/clonepack/internal/api"
|
|
"github.com/syonad/clonepack/internal/core"
|
|
"github.com/syonad/clonepack/internal/store"
|
|
)
|
|
|
|
var serveCmd = &cobra.Command{
|
|
Use: "serve",
|
|
Short: "Start the ClonePack HTTP server",
|
|
RunE: func(cmd *cobra.Command, args []string) error {
|
|
cfg, err := config.Load(cfgFile)
|
|
if err != nil {
|
|
return fmt.Errorf("load config: %w", err)
|
|
}
|
|
|
|
db, err := store.Open(cfg.DB)
|
|
if err != nil {
|
|
return fmt.Errorf("open store: %w", err)
|
|
}
|
|
|
|
repoStore := store.NewRepoStore(db)
|
|
jobStore := store.NewCloneJobStore(db)
|
|
pendingStore := store.NewPendingPackageStore(db)
|
|
blockedStore := store.NewBlockedPackageStore(db)
|
|
snapshotStore := store.NewSnapshotStore(db)
|
|
|
|
repoSvc := core.NewRepoService(repoStore, cfg.DataDir)
|
|
cloneSvc := core.NewCloneService(repoStore, jobStore, cfg.DataDir)
|
|
snapshotSvc := core.NewSnapshotService(snapshotStore, repoStore, cfg.DataDir)
|
|
syncSvc := core.NewSyncService(repoStore, pendingStore, blockedStore, cloneSvc, snapshotSvc, cfg.DataDir)
|
|
|
|
repoH := api.NewRepoHandler(repoSvc)
|
|
cloneH := api.NewCloneHandler(cloneSvc)
|
|
syncH := api.NewSyncHandler(syncSvc)
|
|
snapshotH := api.NewSnapshotHandler(snapshotSvc)
|
|
proxyH := api.NewProxyHandler(repoSvc, cfg.DataDir)
|
|
router := api.NewRouter(repoH, cloneH, syncH, snapshotH, proxyH)
|
|
|
|
ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM)
|
|
defer cancel()
|
|
|
|
syncSvc.StartScheduler(ctx, cfg.Sync.IntervalDuration())
|
|
|
|
addr := fmt.Sprintf("%s:%d", cfg.Server.Host, cfg.Server.Port)
|
|
log.Printf("ClonePack listening on %s", addr)
|
|
return http.ListenAndServe(addr, router)
|
|
},
|
|
}
|