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}