From 3a6b8535b100c599cd4ba2ae28b9c5e924dbcf2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Agn=C3=A8s=20Toulet?= <35176601+AgnesToulet@users.noreply.github.com> Date: Fri, 5 Nov 2021 15:06:14 +0100 Subject: [PATCH] API: return resource ID when deleting datasource with UID and library element (#41342) * API: return resource ID when deleting datasource and library element * keep status codes consistent * fix element ID * add test * improve response struct * update endpoints documentation * LibraryElementIDResponse -> DeleteLibraryElementResponse --- docs/sources/http_api/data_source.md | 5 ++++- docs/sources/http_api/library_element.md | 3 ++- pkg/api/datasources.go | 5 ++++- pkg/services/libraryelements/api.go | 7 +++++-- pkg/services/libraryelements/database.go | 7 +++++-- .../libraryelements/libraryelements_delete_test.go | 9 ++++++++- pkg/services/libraryelements/models.go | 6 ++++++ 7 files changed, 34 insertions(+), 8 deletions(-) diff --git a/docs/sources/http_api/data_source.md b/docs/sources/http_api/data_source.md index 902d1030a7b..d9f96d411a7 100644 --- a/docs/sources/http_api/data_source.md +++ b/docs/sources/http_api/data_source.md @@ -557,7 +557,10 @@ Authorization: Bearer eyJrIjoiT0tTcG1pUlY2RnVKZTFVaDFsNFZXdE9ZWmNrMkZYbk HTTP/1.1 200 Content-Type: application/json -{"message":"Data source deleted"} +{ + "message": "Data source deleted", + "id": 1 +} ``` ## Delete an existing data source by name diff --git a/docs/sources/http_api/library_element.md b/docs/sources/http_api/library_element.md index 521a44dfaed..3060a3ed80a 100644 --- a/docs/sources/http_api/library_element.md +++ b/docs/sources/http_api/library_element.md @@ -442,7 +442,8 @@ HTTP/1.1 200 Content-Type: application/json { - "message": "Library element deleted" + "message": "Library element deleted", + "id": 28 } ``` diff --git a/pkg/api/datasources.go b/pkg/api/datasources.go index a12ab566cbb..4246a78e11a 100644 --- a/pkg/api/datasources.go +++ b/pkg/api/datasources.go @@ -160,7 +160,10 @@ func (hs *HTTPServer) DeleteDataSourceByUID(c *models.ReqContext) response.Respo hs.Live.HandleDatasourceDelete(c.OrgId, ds.Uid) - return response.Success("Data source deleted") + return response.JSON(200, util.DynMap{ + "message": "Data source deleted", + "id": ds.Id, + }) } func (hs *HTTPServer) DeleteDataSourceByName(c *models.ReqContext) response.Response { diff --git a/pkg/services/libraryelements/api.go b/pkg/services/libraryelements/api.go index a2d23bd3530..f88e8c51391 100644 --- a/pkg/services/libraryelements/api.go +++ b/pkg/services/libraryelements/api.go @@ -35,12 +35,15 @@ func (l *LibraryElementService) createHandler(c *models.ReqContext, cmd CreateLi // deleteHandler handles DELETE /api/library-elements/:uid. func (l *LibraryElementService) deleteHandler(c *models.ReqContext) response.Response { - err := l.deleteLibraryElement(c.Req.Context(), c.SignedInUser, web.Params(c.Req)[":uid"]) + id, err := l.deleteLibraryElement(c.Req.Context(), c.SignedInUser, web.Params(c.Req)[":uid"]) if err != nil { return toLibraryElementError(err, "Failed to delete library element") } - return response.Success("Library element deleted") + return response.JSON(200, DeleteLibraryElementResponse{ + Message: "Library element deleted", + ID: id, + }) } // getHandler handles GET /api/library-elements/:uid. diff --git a/pkg/services/libraryelements/database.go b/pkg/services/libraryelements/database.go index 6def4bfee19..53487f0ce84 100644 --- a/pkg/services/libraryelements/database.go +++ b/pkg/services/libraryelements/database.go @@ -169,8 +169,9 @@ func (l *LibraryElementService) createLibraryElement(c context.Context, signedIn } // deleteLibraryElement deletes a library element. -func (l *LibraryElementService) deleteLibraryElement(c context.Context, signedInUser *models.SignedInUser, uid string) error { - return l.SQLStore.WithTransactionalDbSession(c, func(session *sqlstore.DBSession) error { +func (l *LibraryElementService) deleteLibraryElement(c context.Context, signedInUser *models.SignedInUser, uid string) (int64, error) { + var elementID int64 + err := l.SQLStore.WithTransactionalDbSession(c, func(session *sqlstore.DBSession) error { element, err := getLibraryElement(l.SQLStore.Dialect, session, uid, signedInUser.OrgId) if err != nil { return err @@ -198,8 +199,10 @@ func (l *LibraryElementService) deleteLibraryElement(c context.Context, signedIn return ErrLibraryElementNotFound } + elementID = element.ID return nil }) + return elementID, err } // getLibraryElements gets a Library Element where param == value diff --git a/pkg/services/libraryelements/libraryelements_delete_test.go b/pkg/services/libraryelements/libraryelements_delete_test.go index aec11584e47..2a1aa9b592a 100644 --- a/pkg/services/libraryelements/libraryelements_delete_test.go +++ b/pkg/services/libraryelements/libraryelements_delete_test.go @@ -1,6 +1,7 @@ package libraryelements import ( + "encoding/json" "testing" "github.com/grafana/grafana/pkg/components/simplejson" @@ -17,11 +18,17 @@ func TestDeleteLibraryElement(t *testing.T) { require.Equal(t, 404, resp.Status()) }) - scenarioWithPanel(t, "When an admin tries to delete a library panel that exists, it should succeed", + scenarioWithPanel(t, "When an admin tries to delete a library panel that exists, it should succeed and return correct ID", func(t *testing.T, sc scenarioContext) { sc.ctx.Req = web.SetURLParams(sc.ctx.Req, map[string]string{":uid": sc.initialResult.Result.UID}) resp := sc.service.deleteHandler(sc.reqContext) require.Equal(t, 200, resp.Status()) + + var result DeleteLibraryElementResponse + err := json.Unmarshal(resp.Body(), &result) + + require.NoError(t, err) + require.Equal(t, sc.initialResult.Result.ID, result.ID) }) scenarioWithPanel(t, "When an admin tries to delete a library panel in another org, it should fail", diff --git a/pkg/services/libraryelements/models.go b/pkg/services/libraryelements/models.go index 4ff6d490bbf..b9f40aa52f6 100644 --- a/pkg/services/libraryelements/models.go +++ b/pkg/services/libraryelements/models.go @@ -207,3 +207,9 @@ type LibraryElementArrayResponse struct { type LibraryElementConnectionsResponse struct { Result []LibraryElementConnectionDTO `json:"result"` } + +// DeleteLibraryElementResponse is the response struct for deleting a library element. +type DeleteLibraryElementResponse struct { + ID int64 `json:"id"` + Message string `json:"message"` +}