Don't add or remove quotas for external DB rows (#13926)
* Don't add or remove quotas for external DB rows * update account-portal * fix unit test
This commit is contained in:
parent
7761c15172
commit
f8765fb254
|
@ -1 +1 @@
|
||||||
Subproject commit a03225549e3ce61f43d0da878da162e08941b939
|
Subproject commit 247f56d455abbd64da17d865275ed978f577549f
|
|
@ -84,9 +84,11 @@ export const save = async (ctx: UserCtx<Row, Row>) => {
|
||||||
if (body && body._id) {
|
if (body && body._id) {
|
||||||
return patch(ctx as UserCtx<PatchRowRequest, PatchRowResponse>)
|
return patch(ctx as UserCtx<PatchRowRequest, PatchRowResponse>)
|
||||||
}
|
}
|
||||||
const { row, table, squashed } = await quotas.addRow(() =>
|
const { row, table, squashed } = tableId.includes("datasource_plus")
|
||||||
sdk.rows.save(tableId, ctx.request.body, ctx.user?._id)
|
? await sdk.rows.save(tableId, ctx.request.body, ctx.user?._id)
|
||||||
)
|
: await quotas.addRow(() =>
|
||||||
|
sdk.rows.save(tableId, ctx.request.body, ctx.user?._id)
|
||||||
|
)
|
||||||
ctx.status = 200
|
ctx.status = 200
|
||||||
ctx.eventEmitter && ctx.eventEmitter.emitRow(`row:save`, appId, row, table)
|
ctx.eventEmitter && ctx.eventEmitter.emitRow(`row:save`, appId, row, table)
|
||||||
ctx.message = `${table.name} saved successfully`
|
ctx.message = `${table.name} saved successfully`
|
||||||
|
@ -152,7 +154,9 @@ async function deleteRows(ctx: UserCtx<DeleteRowRequest>) {
|
||||||
deleteRequest.rows = await processDeleteRowsRequest(ctx)
|
deleteRequest.rows = await processDeleteRowsRequest(ctx)
|
||||||
|
|
||||||
const { rows } = await pickApi(tableId).bulkDestroy(ctx)
|
const { rows } = await pickApi(tableId).bulkDestroy(ctx)
|
||||||
await quotas.removeRows(rows.length)
|
if (!tableId.includes("datasource_plus")) {
|
||||||
|
await quotas.removeRows(rows.length)
|
||||||
|
}
|
||||||
|
|
||||||
for (let row of rows) {
|
for (let row of rows) {
|
||||||
ctx.eventEmitter && ctx.eventEmitter.emitRow(`row:delete`, appId, row)
|
ctx.eventEmitter && ctx.eventEmitter.emitRow(`row:delete`, appId, row)
|
||||||
|
@ -167,7 +171,9 @@ async function deleteRow(ctx: UserCtx<DeleteRowRequest>) {
|
||||||
const tableId = utils.getTableId(ctx)
|
const tableId = utils.getTableId(ctx)
|
||||||
|
|
||||||
const resp = await pickApi(tableId).destroy(ctx)
|
const resp = await pickApi(tableId).destroy(ctx)
|
||||||
await quotas.removeRow()
|
if (!tableId.includes("datasource_plus")) {
|
||||||
|
await quotas.removeRow()
|
||||||
|
}
|
||||||
|
|
||||||
ctx.eventEmitter && ctx.eventEmitter.emitRow(`row:delete`, appId, resp.row)
|
ctx.eventEmitter && ctx.eventEmitter.emitRow(`row:delete`, appId, resp.row)
|
||||||
gridSocket?.emitRowDeletion(ctx, resp.row)
|
gridSocket?.emitRowDeletion(ctx, resp.row)
|
||||||
|
|
|
@ -134,6 +134,10 @@ describe.each([
|
||||||
// error. This is to account for the fact that parallel writes can result
|
// error. This is to account for the fact that parallel writes can result
|
||||||
// in some quota updates getting lost. We don't have any need to solve this
|
// in some quota updates getting lost. We don't have any need to solve this
|
||||||
// right now, so we just allow for some error.
|
// right now, so we just allow for some error.
|
||||||
|
if (expected === 0) {
|
||||||
|
expect(usage).toEqual(0)
|
||||||
|
return
|
||||||
|
}
|
||||||
expect(usage).toBeGreaterThan(expected * 0.9)
|
expect(usage).toBeGreaterThan(expected * 0.9)
|
||||||
expect(usage).toBeLessThan(expected * 1.1)
|
expect(usage).toBeLessThan(expected * 1.1)
|
||||||
}
|
}
|
||||||
|
@ -158,7 +162,7 @@ describe.each([
|
||||||
})
|
})
|
||||||
expect(row.name).toEqual("Test Contact")
|
expect(row.name).toEqual("Test Contact")
|
||||||
expect(row._rev).toBeDefined()
|
expect(row._rev).toBeDefined()
|
||||||
await assertRowUsage(rowUsage + 1)
|
await assertRowUsage(isInternal ? rowUsage + 1 : rowUsage)
|
||||||
})
|
})
|
||||||
|
|
||||||
it("fails to create a row for a table that does not exist", async () => {
|
it("fails to create a row for a table that does not exist", async () => {
|
||||||
|
@ -230,7 +234,7 @@ describe.each([
|
||||||
expect(row["Row ID"]).toBeGreaterThan(previousId)
|
expect(row["Row ID"]).toBeGreaterThan(previousId)
|
||||||
previousId = row["Row ID"]
|
previousId = row["Row ID"]
|
||||||
}
|
}
|
||||||
await assertRowUsage(rowUsage + 10)
|
await assertRowUsage(isInternal ? rowUsage + 10 : rowUsage)
|
||||||
})
|
})
|
||||||
|
|
||||||
isInternal &&
|
isInternal &&
|
||||||
|
@ -751,7 +755,7 @@ describe.each([
|
||||||
rows: [createdRow],
|
rows: [createdRow],
|
||||||
})
|
})
|
||||||
expect(res[0]._id).toEqual(createdRow._id)
|
expect(res[0]._id).toEqual(createdRow._id)
|
||||||
await assertRowUsage(rowUsage - 1)
|
await assertRowUsage(isInternal ? rowUsage - 1 : rowUsage)
|
||||||
})
|
})
|
||||||
|
|
||||||
it("should be able to bulk delete rows, including a row that doesn't exist", async () => {
|
it("should be able to bulk delete rows, including a row that doesn't exist", async () => {
|
||||||
|
@ -817,7 +821,7 @@ describe.each([
|
||||||
|
|
||||||
expect(res.length).toEqual(2)
|
expect(res.length).toEqual(2)
|
||||||
await config.api.row.get(table._id!, row1._id!, { status: 404 })
|
await config.api.row.get(table._id!, row1._id!, { status: 404 })
|
||||||
await assertRowUsage(rowUsage - 2)
|
await assertRowUsage(isInternal ? rowUsage - 2 : rowUsage)
|
||||||
})
|
})
|
||||||
|
|
||||||
it("should be able to delete a variety of row set types", async () => {
|
it("should be able to delete a variety of row set types", async () => {
|
||||||
|
@ -834,7 +838,7 @@ describe.each([
|
||||||
|
|
||||||
expect(res.length).toEqual(3)
|
expect(res.length).toEqual(3)
|
||||||
await config.api.row.get(table._id!, row1._id!, { status: 404 })
|
await config.api.row.get(table._id!, row1._id!, { status: 404 })
|
||||||
await assertRowUsage(rowUsage - 3)
|
await assertRowUsage(isInternal ? rowUsage - 3 : rowUsage)
|
||||||
})
|
})
|
||||||
|
|
||||||
it("should accept a valid row object and delete the row", async () => {
|
it("should accept a valid row object and delete the row", async () => {
|
||||||
|
@ -845,7 +849,7 @@ describe.each([
|
||||||
|
|
||||||
expect(res.id).toEqual(row1._id)
|
expect(res.id).toEqual(row1._id)
|
||||||
await config.api.row.get(table._id!, row1._id!, { status: 404 })
|
await config.api.row.get(table._id!, row1._id!, { status: 404 })
|
||||||
await assertRowUsage(rowUsage - 1)
|
await assertRowUsage(isInternal ? rowUsage - 1 : rowUsage)
|
||||||
})
|
})
|
||||||
|
|
||||||
it("Should ignore malformed/invalid delete requests", async () => {
|
it("Should ignore malformed/invalid delete requests", async () => {
|
||||||
|
|
|
@ -1111,7 +1111,7 @@ describe.each([
|
||||||
const createdRow = await config.api.row.save(table._id!, {})
|
const createdRow = await config.api.row.save(table._id!, {})
|
||||||
const rowUsage = await getRowUsage()
|
const rowUsage = await getRowUsage()
|
||||||
await config.api.row.bulkDelete(view.id, { rows: [createdRow] })
|
await config.api.row.bulkDelete(view.id, { rows: [createdRow] })
|
||||||
await assertRowUsage(rowUsage - 1)
|
await assertRowUsage(isInternal ? rowUsage - 1 : rowUsage)
|
||||||
await config.api.row.get(table._id!, createdRow._id!, {
|
await config.api.row.get(table._id!, createdRow._id!, {
|
||||||
status: 404,
|
status: 404,
|
||||||
})
|
})
|
||||||
|
@ -1127,7 +1127,7 @@ describe.each([
|
||||||
|
|
||||||
await config.api.row.bulkDelete(view.id, { rows: [rows[0], rows[2]] })
|
await config.api.row.bulkDelete(view.id, { rows: [rows[0], rows[2]] })
|
||||||
|
|
||||||
await assertRowUsage(rowUsage - 2)
|
await assertRowUsage(isInternal ? rowUsage - 2 : rowUsage)
|
||||||
|
|
||||||
await config.api.row.get(table._id!, rows[0]._id!, {
|
await config.api.row.get(table._id!, rows[0]._id!, {
|
||||||
status: 404,
|
status: 404,
|
||||||
|
|
Loading…
Reference in New Issue