GitRoot
Craft your forge, Build your project, Grow your community freely
1// SPDX-FileCopyrightText: 2025 Romain Maneschi <romain@gitroot.dev>
2//
3// SPDX-License-Identifier: EUPL-1.2
4
5package background
6
7import (
8 "context"
9
10 "gitroot.dev/server/logger"
11 "gitroot.dev/server/plugin"
12 "gitroot.dev/server/repository"
13 "gitroot.dev/server/user"
14)
15
16type Task struct {
17 call func(input interface{}) error
18 t interface{}
19}
20
21type Manager struct {
22 logger *logger.Logger
23 ctx context.Context
24 conf needConf
25 queue chan Task
26 repoManager needRepo
27 userManager needUser
28 pluginManager needPlugin
29 scedulerManager needScheduler
30}
31
32type needConf interface {
33 PathRepositories() string
34 IsForgeRepo(name string) bool
35 PathFileRepositories() string
36 PathFilePlugins() string
37 PathFileUsers() string
38 NbWorkerBackground() int
39}
40
41type needRepo interface {
42 Open(ctx context.Context, repoName string) (*repository.GitRootRepository, error)
43 ForgeRepoMakeDiffRepos(ctx context.Context, repositories []byte) ([]repository.RepoConf, []string, error)
44 CreateUserRepo(ctx context.Context, repo repository.RepoConf, users []user.SimpleUser, availablePlugins []byte) error
45 Delete(repoName string) error
46}
47
48type needUser interface {
49 RootCommiter() *user.Commiter
50}
51
52type needPlugin interface {
53 Availables(ctx context.Context) ([]plugin.Plugin, error)
54 ToNewRepo(isRootRepo bool, inactiveAll bool, plugins []plugin.Plugin) ([]byte, []user.SimpleUser)
55 Sync(filePlugin []byte) error
56 Run(ctx context.Context, repoName string, commands []plugin.CommandForDiff) error
57 Schedule(ctx context.Context, repoName string, pluginPurl string, PluginRun *plugin.PluginRun) error
58}
59
60type needScheduler interface {
61 LoadChanges(ctx context.Context, repoName string)
62}
63
64func NewManager(ctx context.Context, conf needConf, repoManager needRepo, userManager needUser, pluginManager needPlugin, scedulerManager needScheduler) *Manager {
65 m := &Manager{
66 logger: logger.NewLoggerCtx(logger.BACKGROUND_MANAGER, ctx),
67 ctx: ctx,
68 conf: conf,
69 queue: make(chan Task, 100), //block after 100 jobs in queue
70 repoManager: repoManager,
71 userManager: userManager,
72 pluginManager: pluginManager,
73 scedulerManager: scedulerManager,
74 }
75 m.work()
76 return m
77}
78
79func (m *Manager) Start(task Task) {
80 go func() {
81 m.queue <- task
82 }()
83}
84
85func (m *Manager) work() {
86 for range m.conf.NbWorkerBackground() {
87 go func() {
88 for {
89 select {
90 case job := <-m.queue:
91 if err := job.call(job.t); err != nil {
92 m.logger.Error("Job error", err)
93 }
94 case <-m.ctx.Done():
95 return
96 }
97 }
98 }()
99 }
100}