From 7791ce7526c32ef32493935f8ed5ce4078376ee0 Mon Sep 17 00:00:00 2001 From: Drew DeVault Date: Thu, 26 Nov 2020 16:07:19 -0500 Subject: [PATCH] API: implement repository deletion --- api/graph/schema.resolvers.go | 35 ++++++++++++++++++++++++++++++++++- api/webhooks/webhooks.go | 22 ++++++++++++++++++++++ 2 files changed, 56 insertions(+), 1 deletion(-) diff --git a/api/graph/schema.resolvers.go b/api/graph/schema.resolvers.go index 641e9cb..2682c72 100644 --- a/api/graph/schema.resolvers.go +++ b/api/graph/schema.resolvers.go @@ -192,6 +192,7 @@ func (r *mutationResolver) UpdateRepository(ctx context.Context, id int, input m repoPath string moved bool ) + defer func() { if err := recover(); err != nil { if moved { @@ -203,6 +204,7 @@ func (r *mutationResolver) UpdateRepository(ctx context.Context, id int, input m panic(err) } }() + if err := database.WithTx(ctx, nil, func(tx *sql.Tx) error { user := auth.ForContext(ctx) @@ -281,7 +283,38 @@ func (r *mutationResolver) UpdateRepository(ctx context.Context, id int, input m } func (r *mutationResolver) DeleteRepository(ctx context.Context, id int) (*model.Repository, error) { - panic(fmt.Errorf("deleteRepository: not implemented")) + var repo model.Repository + + if err := database.WithTx(ctx, nil, func(tx *sql.Tx) error { + row := tx.QueryRowContext(ctx, ` + DELETE FROM repository + WHERE id = $1 AND owner_id = $2 + RETURNING + id, created, updated, name, description, visibility, + upstream_uri, path, owner_id; + `, id, auth.ForContext(ctx).UserID) + + if err := row.Scan(&repo.ID, &repo.Created, &repo.Updated, + &repo.Name, &repo.Description, &repo.RawVisibility, + &repo.UpstreamURL, &repo.Path, &repo.OwnerID); err != nil { + if err == sql.ErrNoRows { + return fmt.Errorf("No repository by ID %d found for this user", id) + } + return err + } + + err := os.RemoveAll(repo.Path) + if err != nil { + return err + } + + webhooks.DeliverLegacyRepoDeleted(ctx, &repo) + return nil + }); err != nil { + return nil, err + } + + return &repo, nil } func (r *mutationResolver) UpdateACL(ctx context.Context, repoID int, mode model.AccessMode, entity string) (*model.ACL, error) { diff --git a/api/webhooks/webhooks.go b/api/webhooks/webhooks.go index 63c9746..835835e 100644 --- a/api/webhooks/webhooks.go +++ b/api/webhooks/webhooks.go @@ -124,3 +124,25 @@ func DeliverLegacyRepoUpdate(ctx context.Context, repo *model.Repository) { Where("sub.user_id = ?", repo.OwnerID) q.Schedule(query, "user", "repo:update", encoded) } + +func DeliverLegacyRepoDeleted(ctx context.Context, repo *model.Repository) { + q, ok := ctx.Value(legacyUserCtxKey).(*webhooks.LegacyQueue) + if !ok { + panic(errors.New("No legacy user webhooks worker for this context")) + } + + payload := struct { + ID int `json:"id"` + }{repo.ID} + + encoded, err := json.Marshal(&payload) + if err != nil { + panic(err) // Programmer error + } + + query := sq. + Select(). + From("user_webhook_subscription sub"). + Where("sub.user_id = ?", repo.OwnerID) + q.Schedule(query, "user", "repo:delete", encoded) +} -- 2.38.4