~edwargix/git.sr.ht

7791ce7526c32ef32493935f8ed5ce4078376ee0 — Drew DeVault 3 years ago 26f98ff
API: implement repository deletion
2 files changed, 56 insertions(+), 1 deletions(-)

M api/graph/schema.resolvers.go
M api/webhooks/webhooks.go
M api/graph/schema.resolvers.go => api/graph/schema.resolvers.go +34 -1
@@ 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) {

M api/webhooks/webhooks.go => api/webhooks/webhooks.go +22 -0
@@ 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)
}