From e21a293e0232006ef744415a1106e7a4077c8416 Mon Sep 17 00:00:00 2001 From: John O'Hara Date: Fri, 23 Feb 2024 15:44:33 +0000 Subject: [PATCH] Revert "fixes 1312 with updated UIServic api" This reverts commit 394db6ac79fd59f3106dd58628f551cba5df3aea. --- docs/site/content/en/openapi/openapi.yaml | 37 ---------------- .../api/internal/services/UIService.java | 2 +- .../tools/horreum/svc/UIServiceImpl.java | 6 +-- .../tools/horreum/svc/BaseServiceTest.java | 6 +-- .../tools/horreum/svc/TestServiceTest.java | 6 +-- horreum-web/src/api.tsx | 2 +- horreum-web/src/domain/tests/Views.tsx | 43 ++++++------------- 7 files changed, 24 insertions(+), 78 deletions(-) diff --git a/docs/site/content/en/openapi/openapi.yaml b/docs/site/content/en/openapi/openapi.yaml index 0201be243..388a43426 100644 --- a/docs/site/content/en/openapi/openapi.yaml +++ b/docs/site/content/en/openapi/openapi.yaml @@ -1956,43 +1956,6 @@ paths: default: true type: boolean example: false - - name: filter - in: query - description: either a required json sub-document or path expression - schema: - default: "{}" - type: string - example: - key: requiredValue - - name: sort - in: query - description: label name for sorting - schema: - default: "" - type: string - - name: direction - in: query - description: either Ascending or Descending - schema: - default: Ascending - type: string - example: count - - name: limit - in: query - description: the maximum number of results to include - schema: - format: int32 - default: 2147483647 - type: integer - example: 10 - - name: page - in: query - description: which page to skip to when using a limit - schema: - format: int32 - default: 0 - type: integer - example: 2 responses: "200": description: OK diff --git a/horreum-api/src/main/java/io/hyperfoil/tools/horreum/api/internal/services/UIService.java b/horreum-api/src/main/java/io/hyperfoil/tools/horreum/api/internal/services/UIService.java index 3794d50aa..12ab9f07d 100644 --- a/horreum-api/src/main/java/io/hyperfoil/tools/horreum/api/internal/services/UIService.java +++ b/horreum-api/src/main/java/io/hyperfoil/tools/horreum/api/internal/services/UIService.java @@ -22,7 +22,7 @@ public interface UIService { @POST @Path("view") - View updateView(@RequestBody(required = true) View view); + int updateView(@RequestBody(required = true) View view); @POST @Path("views") diff --git a/horreum-backend/src/main/java/io/hyperfoil/tools/horreum/svc/UIServiceImpl.java b/horreum-backend/src/main/java/io/hyperfoil/tools/horreum/svc/UIServiceImpl.java index 0d845fa0b..4b030faf6 100644 --- a/horreum-backend/src/main/java/io/hyperfoil/tools/horreum/svc/UIServiceImpl.java +++ b/horreum-backend/src/main/java/io/hyperfoil/tools/horreum/svc/UIServiceImpl.java @@ -28,7 +28,7 @@ public class UIServiceImpl implements UIService { @RolesAllowed("tester") @WithRoles @Transactional - public View updateView(View dto) { + public int updateView(View dto) { if (dto.testId <= 0) { throw ServiceException.badRequest("Missing test id on view"); } @@ -49,7 +49,7 @@ public void createViews(List views) { } } - private View doUpdate(TestDAO test, ViewDAO view) { + private int doUpdate(TestDAO test, ViewDAO view) { view.ensureLinked(); view.test = test; if (view.id == null || view.id < 0) { @@ -63,7 +63,7 @@ private View doUpdate(TestDAO test, ViewDAO view) { test.views.add(view); test.persist(); em.flush(); - return ViewMapper.from(view); + return view.id; } @Override diff --git a/horreum-backend/src/test/java/io/hyperfoil/tools/horreum/svc/BaseServiceTest.java b/horreum-backend/src/test/java/io/hyperfoil/tools/horreum/svc/BaseServiceTest.java index 74a1efde8..e893b3c70 100644 --- a/horreum-backend/src/test/java/io/hyperfoil/tools/horreum/svc/BaseServiceTest.java +++ b/horreum-backend/src/test/java/io/hyperfoil/tools/horreum/svc/BaseServiceTest.java @@ -388,12 +388,12 @@ protected void createViews(List views) { .statusCode(204); } - protected View createView(View view) { + protected int createView(View view) { return jsonRequest() .body(view) .post("/api/ui/view") .then() - .statusCode(200).extract().body().as(View.class); + .statusCode(200).extract().body().as(Integer.class); } protected List getViews(int testId) { @@ -875,7 +875,7 @@ protected void populateDataFromFiles() throws IOException { readFile(p.resolve("roadrunner_view.json").toFile()), View.class); assertEquals("Default", view.name); view.testId = t.id; - view = createView(view); + view.id = createView(view); Schema s = new ObjectMapper().readValue( readFile(p.resolve("acme_benchmark_schema.json").toFile()), Schema.class); diff --git a/horreum-backend/src/test/java/io/hyperfoil/tools/horreum/svc/TestServiceTest.java b/horreum-backend/src/test/java/io/hyperfoil/tools/horreum/svc/TestServiceTest.java index 64d4ea582..8d586369a 100644 --- a/horreum-backend/src/test/java/io/hyperfoil/tools/horreum/svc/TestServiceTest.java +++ b/horreum-backend/src/test/java/io/hyperfoil/tools/horreum/svc/TestServiceTest.java @@ -167,10 +167,10 @@ public void testUpdateView(TestInfo info) throws InterruptedException { } private void updateView(View view) { - View newView = jsonRequest().body(view).post("/api/ui/view") - .then().statusCode(200).extract().body().as(View.class); + Integer viewId = jsonRequest().body(view).post("/api/ui/view") + .then().statusCode(200).extract().body().as(Integer.class); if (view.id != null) { - assertEquals(view.id, newView.id); + assertEquals(view.id, viewId); } } diff --git a/horreum-web/src/api.tsx b/horreum-web/src/api.tsx index e38d1d797..fc3f9cfab 100644 --- a/horreum-web/src/api.tsx +++ b/horreum-web/src/api.tsx @@ -258,7 +258,7 @@ export function fetchViews(testId: number, alerting: AlertContextType): Promise< export function updateAccess(id: number, owner: string, access: Access, alerting: AlertContextType) : Promise { return apiCall(testApi.updateAccess(id, access, owner), alerting, "UPDATE_ACCESS", "Failed to update test access"); } -export function updateView(alerting: AlertContextType, testId: number, view: View): Promise { +export function updateView(alerting: AlertContextType, testId: number, view: View): Promise { for (const c of view.components) { if (c.labels.length === 0) { alerting.dispatchError( diff --git a/horreum-web/src/domain/tests/Views.tsx b/horreum-web/src/domain/tests/Views.tsx index dfab9dc46..b72860fab 100644 --- a/horreum-web/src/domain/tests/Views.tsx +++ b/horreum-web/src/domain/tests/Views.tsx @@ -112,6 +112,7 @@ export default function Views({ testId, testOwner, funcsRef, onModified, ...prop const [views, setViews] = useState([]) const [deleted, setDeleted] = useState([]) const [selectedView, setSelectedView] = useState() + useEffect(() => { // Perform a deep copy of the view object to prevent modifying store const copy = deepCopy(props.views) @@ -122,39 +123,21 @@ export default function Views({ testId, testOwner, funcsRef, onModified, ...prop }, [props.views]) funcsRef.current = { - save: () =>{ - return Promise.all([ + save: () => + Promise.all([ ...views .filter(v => v.modified) - .map(async view => { - return updateView(alerting, testId, view) - }), - ...deleted.map(id => { deleteView(alerting, testId, id); return null}) - ]) - //removes the output of the ...deleted.map to satisfy TypeScript type check - .then(hasNulls => hasNulls.filter(v => v !=null) as View[]) - .then((updatedViews) => { - //A better solution is for the parent to provide updated views props whenever views change - const newViews = [...updatedViews] - //add any existing views that were not updated and have valid ids - views - .filter(oldView => oldView.id >= 0)//exclude any local temporary views - .forEach(oldView => ( - newViews.some((newView : ViewExtended) => oldView.id == newView.id) - ? null : newViews.unshift(oldView) //use unshift to preserve view order - ) - ) + .map(view => updateView(alerting, testId, view).then(id => (view.id = id))), + ...deleted.map(id => deleteView(alerting, testId, id)), + ]).then(() => { setDeleted([]) - //have to update selectedView because if it was a new view (id < 0) it will no longer be in views - if(selectedView && 'id' in selectedView){ - const found = newViews.filter(v => v.id === selectedView.id) - if(found && found.length === 1){ - setSelectedView(found[0]); - } - } - setViews(newViews); - }) - }, + setViews( + views.map(v => { + delete v.modified + return v + }) + ) + }), reset: () => { setDeleted([]) setViews(deepCopy(props.views))