From d1ad443d181bed2bcd7654f3300914a1a5780610 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Mon, 31 Jul 2023 15:41:13 +0200 Subject: [PATCH] Patch --- packages/server/src/api/routes/row.ts | 7 +++ .../server/src/api/routes/tests/row.spec.ts | 53 +++++++++++++++++++ .../server/src/tests/utilities/api/viewV2.ts | 16 ++++++ 3 files changed, 76 insertions(+) diff --git a/packages/server/src/api/routes/row.ts b/packages/server/src/api/routes/row.ts index e530c3165b..ba3b2404cc 100644 --- a/packages/server/src/api/routes/row.ts +++ b/packages/server/src/api/routes/row.ts @@ -305,5 +305,12 @@ router trimViewRowInfo, rowController.save ) + .patch( + "/api/v2/views/:viewId/rows/:rowId", + paramResource("viewId"), + authorized(PermissionType.VIEW, PermissionLevel.WRITE), + trimViewRowInfo, + rowController.patch + ) export default router diff --git a/packages/server/src/api/routes/tests/row.spec.ts b/packages/server/src/api/routes/tests/row.spec.ts index bf2eb0ce80..125edd668a 100644 --- a/packages/server/src/api/routes/tests/row.spec.ts +++ b/packages/server/src/api/routes/tests/row.spec.ts @@ -1142,5 +1142,58 @@ describe("/rows", () => { expect(route?.stack).toContainEqual(trimViewRowInfoMiddleware) }) }) + + describe("patch", () => { + it("should update only the view fields for a row", async () => { + const table = await config.createTable(userTable()) + const tableId = config.table!._id! + const view = await config.api.viewV2.create({ + tableId, + columns: { + name: { visible: true }, + address: { visible: true }, + }, + }) + + const newRow = await config.api.viewV2.row.create(view.id, { + tableId, + _viewId: view.id, + ...randomRowData(), + }) + const newData = randomRowData() + await config.api.viewV2.row.update(view.id, newRow._id!, { + tableId, + _viewId: view.id, + _id: newRow._id!, + _rev: newRow._rev!, + ...newData, + }) + + const row = await config.api.row.get(tableId, newRow._id!) + expect(row.body).toEqual({ + ...newRow, + type: "row", + name: newData.name, + address: newData.address, + _id: expect.any(String), + _rev: expect.any(String), + createdAt: expect.any(String), + updatedAt: expect.any(String), + }) + expect(row.body._viewId).toBeUndefined() + expect(row.body.age).toBeUndefined() + expect(row.body.jobTitle).toBeUndefined() + }) + + it("should setup the trimViewRowInfo middleware", async () => { + const route = router.stack.find( + r => + r.methods.includes("PATCH") && + r.path === "/api/v2/views/:viewId/rows/:rowId" + ) + expect(route).toBeDefined() + expect(route?.stack).toContainEqual(trimViewRowInfoMiddleware) + }) + }) }) }) diff --git a/packages/server/src/tests/utilities/api/viewV2.ts b/packages/server/src/tests/utilities/api/viewV2.ts index c2b5812fc3..1df056c630 100644 --- a/packages/server/src/tests/utilities/api/viewV2.ts +++ b/packages/server/src/tests/utilities/api/viewV2.ts @@ -1,5 +1,7 @@ import { CreateViewRequest, + PatchRowRequest, + PatchRowResponse, Row, SortOrder, SortType, @@ -114,5 +116,19 @@ export class ViewV2API extends TestAPI { .expect(expectStatus) return result.body as Row }, + update: async ( + viewId: string, + rowId: string, + row: PatchRowRequest, + { expectStatus } = { expectStatus: 200 } + ): Promise => { + const result = await this.request + .patch(`/api/v2/views/${viewId}/rows/${rowId}`) + .send(row) + .set(this.config.defaultHeaders()) + .expect("Content-Type", /json/) + .expect(expectStatus) + return result.body as PatchRowResponse + }, } }