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}
30
31type needConf interface {
32 PathRepositories() string
33 IsForgeRepo(name string) bool
34 PathFileRepositories() string
35 PathFilePlugins() string
36 PathFileUsers() string
37 ForPathConfig(filename string) 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}
58
59func NewManager(ctx context.Context, conf needConf, repoManager needRepo, userManager needUser, pluginManager needPlugin) *Manager {
60 m := &Manager{
61 logger: logger.NewLoggerCtx(logger.BACKGROUND_MANAGER, ctx),
62 ctx: ctx,
63 conf: conf,
64 queue: make(chan Task, 100), //block after 100 jobs in queue
65 repoManager: repoManager,
66 userManager: userManager,
67 pluginManager: pluginManager,
68 }
69 m.work()
70 return m
71}
72
73func (m *Manager) Start(task Task) {
74 go func() {
75 m.queue <- task
76 }()
77}
78
79func (m *Manager) work() {
80 for range m.conf.NbWorkerBackground() {
81 go func() {
82 for {
83 select {
84 case job := <-m.queue:
85 if err := job.call(job.t); err != nil {
86 m.logger.Error("Job error", err)
87 }
88 case <-m.ctx.Done():
89 return
90 }
91 }
92 }()
93 }
94}