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 NbWorkerBackground() int
38}
39
40type needRepo interface {
41 Open(ctx context.Context, repoName string) (*repository.GitRootRepository, error)
42 ForgeRepoMakeDiffRepos(ctx context.Context, repositories []byte) ([]repository.RepoConf, []string, error)
43 CreateUserRepo(ctx context.Context, repo repository.RepoConf, users []user.SimpleUser, availablePlugins []byte) error
44 Delete(repoName string) error
45}
46
47type needUser interface {
48 RootCommiter() *user.Commiter
49}
50
51type needPlugin interface {
52 Availables(ctx context.Context) ([]plugin.Plugin, error)
53 ToNewRepo(isRootRepo bool, inactiveAll bool, plugins []plugin.Plugin) ([]byte, []user.SimpleUser)
54 Sync(filePlugin []byte) error
55 Run(ctx context.Context, repoName string, commands []plugin.CommandForDiff) error
56}
57
58func NewManager(ctx context.Context, conf needConf, repoManager needRepo, userManager needUser, pluginManager needPlugin) *Manager {
59 m := &Manager{
60 logger: logger.NewLoggerCtx(logger.BACKGROUND_MANAGER, ctx),
61 ctx: ctx,
62 conf: conf,
63 queue: make(chan Task, 100), //block after 100 jobs in queue
64 repoManager: repoManager,
65 userManager: userManager,
66 pluginManager: pluginManager,
67 }
68 m.work()
69 return m
70}
71
72func (m *Manager) Start(task Task) {
73 go func() {
74 m.queue <- task
75 }()
76}
77
78func (m *Manager) work() {
79 for range m.conf.NbWorkerBackground() {
80 go func() {
81 for {
82 select {
83 case job := <-m.queue:
84 if err := job.call(job.t); err != nil {
85 m.logger.Error("Job error", err)
86 }
87 case <-m.ctx.Done():
88 return
89 }
90 }
91 }()
92 }
93}