diff --git a/api/apis/k8sApi.go b/api/apis/k8sApi.go index e9f965d..03e08d6 100644 --- a/api/apis/k8sApi.go +++ b/api/apis/k8sApi.go @@ -15,6 +15,17 @@ import ( type IK8sApi interface { DeployGame(game *models.Game) error ReadGameUrl(gameId uuid.UUID) (string, error) + DeleteGame(game *models.Game) error +} + +func (g k8sApi) DeleteGame(game *models.Game) error { + resource, err := createAndVerifyGameResource(game) + if err != nil { + return err + } + + ctx := context.Background() + return g.k8sClient.Delete(ctx, resource) } func (g k8sApi) DeployGame(game *models.Game) error { diff --git a/api/controllers/gameController.go b/api/controllers/gameController.go index 0eb5bcf..d3866b4 100644 --- a/api/controllers/gameController.go +++ b/api/controllers/gameController.go @@ -136,6 +136,7 @@ func (g gameController) DeleteGameById(c *gin.Context) { return } + //Delete game from db, azure storage and k8s/aks err = g.service.Delete(_uuid) if err != nil { //TODO handle different errors c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"message": err.Error()}) diff --git a/api/services/gameService.go b/api/services/gameService.go index 3fabce5..369c486 100644 --- a/api/services/gameService.go +++ b/api/services/gameService.go @@ -10,6 +10,7 @@ import ( "log" "mime/multipart" "os" + "strings" ) type IGameService interface { @@ -86,12 +87,35 @@ func (g gameService) Save(fileHeader *multipart.FileHeader, title string, owner } func (g gameService) Delete(id uuid.UUID) error { - - err := g.azure.DeleteGame(os.Getenv("AZURE_CONTAINER_NAME"), id.String()) + //Get the game, we need the details to delete it from k8s + game, err := g.repository.FindByID(id) if err != nil { return err } + //Delete from azure storage + err = g.azure.DeleteGame(os.Getenv("AZURE_CONTAINER_NAME"), id.String()) + if err != nil { + if isNotFound(err) { + log.Println(fmt.Sprintf("Game %s is already deleted from azure storage", id.String())) + } else { + return err + } + } + + //Delete from k8s/aks, if the game has an url + if game.Url != "" { + err = g.k8s.DeleteGame(game) + if err != nil { + if isNotFound(err) { + log.Println(fmt.Sprintf("Game %s is already deleted from aks", id.String())) + } else { + return err + } + } + } + + //Delete from db and return return g.repository.Delete(id) } @@ -118,3 +142,8 @@ func GameService(repository repositories.IGameRepository, k8s apis.IK8sApi, azur azure: azure, } } + +func isNotFound(err error) bool { + e := strings.ToLower(err.Error()) + return strings.Contains(e, "not found") || strings.Contains(e, "notfound") +}