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}