diff --git a/app/api/controller/repo/archive.go b/app/api/controller/repo/archive.go index 256ae8927..21eeb7e0f 100644 --- a/app/api/controller/repo/archive.go +++ b/app/api/controller/repo/archive.go @@ -36,6 +36,10 @@ func (c *Controller) Archive( return err } + if err = c.repoCheck.LifecycleRestriction(ctx, session, repo); err != nil { + return err + } + return c.git.Archive(ctx, git.ArchiveParams{ ReadParams: git.CreateReadParams(repo), ArchiveParams: params, diff --git a/app/api/controller/repo/check.go b/app/api/controller/repo/check.go index 144168b38..4404d9453 100644 --- a/app/api/controller/repo/check.go +++ b/app/api/controller/repo/check.go @@ -18,10 +18,12 @@ import ( "context" "github.com/harness/gitness/app/auth" + "github.com/harness/gitness/types" ) // Check defines the interface for adding extra checks during repository operations. type Check interface { // Create allows adding extra check during create repo operations Create(ctx context.Context, session *auth.Session, in *CreateInput) error + LifecycleRestriction(ctx context.Context, session *auth.Session, repo *types.RepositoryCore) error } diff --git a/app/api/controller/repo/no_op_checks.go b/app/api/controller/repo/no_op_checks.go index e37c1b931..d2297fa2f 100644 --- a/app/api/controller/repo/no_op_checks.go +++ b/app/api/controller/repo/no_op_checks.go @@ -18,6 +18,7 @@ import ( "context" "github.com/harness/gitness/app/auth" + "github.com/harness/gitness/types" ) var _ Check = (*NoOpRepoChecks)(nil) @@ -32,3 +33,7 @@ func NewNoOpRepoChecks() *NoOpRepoChecks { func (c *NoOpRepoChecks) Create(_ context.Context, _ *auth.Session, _ *CreateInput) error { return nil } + +func (c *NoOpRepoChecks) LifecycleRestriction(_ context.Context, _ *auth.Session, _ *types.RepositoryCore) error { + return nil +} diff --git a/app/api/controller/repo/purge.go b/app/api/controller/repo/purge.go index 220917368..05668e952 100644 --- a/app/api/controller/repo/purge.go +++ b/app/api/controller/repo/purge.go @@ -46,6 +46,10 @@ func (c *Controller) Purge( return err } + if err = c.repoCheck.LifecycleRestriction(ctx, session, repo.Core()); err != nil { + return err + } + log.Ctx(ctx).Info(). Int64("repo.id", repo.ID). Str("repo.path", repo.Path). diff --git a/app/api/controller/repo/restore.go b/app/api/controller/repo/restore.go index 538a8651c..64c6213de 100644 --- a/app/api/controller/repo/restore.go +++ b/app/api/controller/repo/restore.go @@ -50,6 +50,10 @@ func (c *Controller) Restore( return nil, fmt.Errorf("access check failed: %w", err) } + if err = c.repoCheck.LifecycleRestriction(ctx, session, repo.Core()); err != nil { + return nil, err + } + if repo.Deleted == nil { return nil, usererror.BadRequest("cannot restore a repo that hasn't been deleted") } diff --git a/app/api/controller/repo/soft_delete.go b/app/api/controller/repo/soft_delete.go index 0d12de16b..60c6d567b 100644 --- a/app/api/controller/repo/soft_delete.go +++ b/app/api/controller/repo/soft_delete.go @@ -50,6 +50,10 @@ func (c *Controller) SoftDelete( return nil, fmt.Errorf("access check failed: %w", err) } + if err = c.repoCheck.LifecycleRestriction(ctx, session, repoCore); err != nil { + return nil, err + } + repo, err := c.repoStore.Find(ctx, repoCore.ID) if err != nil { return nil, fmt.Errorf("failed to find the repo by ID: %w", err)