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}