Skip to content

Commit 92ea3de

Browse files
committed
feat(secrets): delete secrets when deleting var groups
1 parent b974e93 commit 92ea3de

File tree

4 files changed

+80
-11
lines changed

4 files changed

+80
-11
lines changed

api/projects/environment.go

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package projects
22

33
import (
4+
"errors"
45
"fmt"
56
"github.com/semaphoreui/semaphore/api/helpers"
67
"github.com/semaphoreui/semaphore/db"
@@ -10,20 +11,23 @@ import (
1011
)
1112

1213
type EnvironmentController struct {
13-
accessKeyRepo db.AccessKeyManager
14-
accessKeyService server.AccessKeyService
15-
encryptionService server.AccessKeyEncryptionService
14+
accessKeyRepo db.AccessKeyManager
15+
accessKeyService server.AccessKeyService
16+
encryptionService server.AccessKeyEncryptionService
17+
environmentService server.EnvironmentService
1618
}
1719

1820
func NewEnvironmentController(
1921
accessKeyRepo db.AccessKeyManager,
2022
encryptionService server.AccessKeyEncryptionService,
2123
accessKeyService server.AccessKeyService,
24+
environmentService server.EnvironmentService,
2225
) *EnvironmentController {
2326
return &EnvironmentController{
24-
accessKeyRepo: accessKeyRepo,
25-
accessKeyService: accessKeyService,
26-
encryptionService: encryptionService,
27+
accessKeyRepo: accessKeyRepo,
28+
accessKeyService: accessKeyService,
29+
encryptionService: encryptionService,
30+
environmentService: environmentService,
2731
}
2832
}
2933

@@ -262,11 +266,13 @@ func (c *EnvironmentController) AddEnvironment(w http.ResponseWriter, r *http.Re
262266
}
263267

264268
// RemoveEnvironment deletes an environment from the database
265-
func RemoveEnvironment(w http.ResponseWriter, r *http.Request) {
269+
func (c *EnvironmentController) RemoveEnvironment(w http.ResponseWriter, r *http.Request) {
266270
env := helpers.GetFromContext(r, "environment").(db.Environment)
267271

268-
err := helpers.Store(r).DeleteEnvironment(env.ProjectID, env.ID)
269-
if err == db.ErrInvalidOperation {
272+
err := c.environmentService.Delete(env.ProjectID, env.ID)
273+
//err := helpers.Store(r).DeleteEnvironment(env.ProjectID, env.ID)
274+
275+
if errors.Is(err, db.ErrInvalidOperation) {
270276
helpers.WriteJSON(w, http.StatusBadRequest, map[string]any{
271277
"error": "Environment is in use by one or more templates",
272278
"inUse": true,

api/router.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,12 +86,13 @@ func Route(
8686
accessKeyInstallationService server.AccessKeyInstallationService,
8787
secretStorageService server.SecretStorageService,
8888
accessKeyService server.AccessKeyService,
89+
environmentService server.EnvironmentService,
8990
) *mux.Router {
9091

9192
projectController := &projects.ProjectController{ProjectService: projectService}
9293
runnerController := runners.NewRunnerController(store, taskPool)
9394
integrationController := NewIntegrationController(integrationService)
94-
environmentController := projects.NewEnvironmentController(store, encryptionService, accessKeyService)
95+
environmentController := projects.NewEnvironmentController(store, encryptionService, accessKeyService, environmentService)
9596
secretStorageController := projects.NewSecretStorageController(store, secretStorageService)
9697
repositoryController := projects.NewRepositoryController(accessKeyInstallationService)
9798
keyController := projects.NewKeyController(accessKeyService)
@@ -391,7 +392,7 @@ func Route(
391392
projectEnvManagement.HandleFunc("/{environment_id}", projects.GetEnvironment).Methods("GET", "HEAD")
392393
projectEnvManagement.HandleFunc("/{environment_id}/refs", projects.GetEnvironmentRefs).Methods("GET", "HEAD")
393394
projectEnvManagement.HandleFunc("/{environment_id}", environmentController.UpdateEnvironment).Methods("PUT")
394-
projectEnvManagement.HandleFunc("/{environment_id}", projects.RemoveEnvironment).Methods("DELETE")
395+
projectEnvManagement.HandleFunc("/{environment_id}", environmentController.RemoveEnvironment).Methods("DELETE")
395396

396397
projectTmplManagement := projectUserAPI.PathPrefix("/templates").Subrouter()
397398
projectTmplManagement.Use(projects.TemplatesMiddleware)

cli/cmd/root.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ func runService() {
8282
)
8383
accessKeyService := server.NewAccessKeyService(store, encryptionService, store)
8484
secretStorageService := server.NewSecretStorageService(store, accessKeyService)
85+
environmentService := server.NewEnvironmentService(store, encryptionService)
8586

8687
taskPool := tasks.CreateTaskPool(
8788
store,
@@ -125,6 +126,7 @@ func runService() {
125126
accessKeyInstallationService,
126127
secretStorageService,
127128
accessKeyService,
129+
environmentService,
128130
)
129131

130132
route.Use(func(next http.Handler) http.Handler {

services/server/environment_svc.go

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package server
2+
3+
import (
4+
"fmt"
5+
"github.com/semaphoreui/semaphore/db"
6+
)
7+
8+
type EnvironmentService interface {
9+
Delete(projectID int, environmentID int) error
10+
}
11+
12+
func NewEnvironmentService(
13+
environmentRepo db.EnvironmentManager,
14+
encryptionService AccessKeyEncryptionService,
15+
) EnvironmentService {
16+
return &EnvironmentServiceImpl{
17+
environmentRepo: environmentRepo,
18+
encryptionService: encryptionService,
19+
}
20+
}
21+
22+
type EnvironmentServiceImpl struct {
23+
environmentRepo db.EnvironmentManager
24+
encryptionService AccessKeyEncryptionService
25+
}
26+
27+
func (s *EnvironmentServiceImpl) Delete(projectID int, environmentID int) (err error) {
28+
// Implement the logic to delete an environment
29+
// This is a placeholder implementation
30+
if projectID <= 0 || environmentID <= 0 {
31+
return fmt.Errorf("invalid project or environment ID")
32+
}
33+
34+
secrets, err := s.environmentRepo.GetEnvironmentSecrets(projectID, environmentID)
35+
if err != nil {
36+
return
37+
}
38+
39+
err = s.environmentRepo.DeleteEnvironment(projectID, environmentID)
40+
41+
if err != nil {
42+
return
43+
}
44+
45+
var errors []error
46+
47+
for _, secret := range secrets {
48+
err = s.encryptionService.DeleteSecret(&secret)
49+
if err != nil {
50+
errors = append(errors, err)
51+
}
52+
}
53+
54+
if len(errors) > 0 {
55+
err = fmt.Errorf("failed to delete some secrets: %v", errors)
56+
return
57+
}
58+
59+
return
60+
}

0 commit comments

Comments
 (0)