Fix number ranges after tenant import
All checks were successful
Build and Push Docker Images / build-backend (push) Successful in 45s
Build and Push Docker Images / build-frontend (push) Successful in 25s
Build and Push Docker Images / build-website (push) Successful in 23s
Build and Push Docker Images / build-central-services-api (push) Successful in 23s
Build and Push Docker Images / build-central-services-admin (push) Successful in 24s
Build and Push Docker Images / build-docs (push) Successful in 24s
All checks were successful
Build and Push Docker Images / build-backend (push) Successful in 45s
Build and Push Docker Images / build-frontend (push) Successful in 25s
Build and Push Docker Images / build-website (push) Successful in 23s
Build and Push Docker Images / build-central-services-api (push) Successful in 23s
Build and Push Docker Images / build-central-services-admin (push) Successful in 24s
Build and Push Docker Images / build-docs (push) Successful in 24s
This commit is contained in:
@@ -11,6 +11,7 @@ import { pool } from "../../db"
|
|||||||
import { s3 } from "./s3"
|
import { s3 } from "./s3"
|
||||||
import { secrets } from "./secrets"
|
import { secrets } from "./secrets"
|
||||||
import { decrypt, encrypt } from "./crypt"
|
import { decrypt, encrypt } from "./crypt"
|
||||||
|
import { restoreImportedTenantNumberRanges } from "./tenantImportNumberRanges"
|
||||||
|
|
||||||
type TableRows = Record<string, Record<string, any>[]>
|
type TableRows = Record<string, Record<string, any>[]>
|
||||||
type TableMetadata = {
|
type TableMetadata = {
|
||||||
@@ -991,6 +992,8 @@ export const importTenantFullExport = async (
|
|||||||
progressDone += 1
|
progressDone += 1
|
||||||
await reportProgress("Kommunikationsräume bereinigt")
|
await reportProgress("Kommunikationsräume bereinigt")
|
||||||
|
|
||||||
|
await restoreImportedTenantNumberRanges(client, exportData)
|
||||||
|
|
||||||
await refreshSequences(client, columnsByTable)
|
await refreshSequences(client, columnsByTable)
|
||||||
progressDone = progressTotal
|
progressDone = progressTotal
|
||||||
await reportProgress("Import abgeschlossen")
|
await reportProgress("Import abgeschlossen")
|
||||||
|
|||||||
28
backend/src/utils/tenantImportNumberRanges.ts
Normal file
28
backend/src/utils/tenantImportNumberRanges.ts
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
type QueryClient = {
|
||||||
|
query: (query: string, values: unknown[]) => Promise<{ rowCount?: number | null }>
|
||||||
|
}
|
||||||
|
|
||||||
|
type TenantImportData = {
|
||||||
|
tenantId: number
|
||||||
|
tables: Record<string, Record<string, any>[]>
|
||||||
|
}
|
||||||
|
|
||||||
|
export const restoreImportedTenantNumberRanges = async (
|
||||||
|
client: QueryClient,
|
||||||
|
exportData: TenantImportData
|
||||||
|
) => {
|
||||||
|
const tenantRow = (exportData.tables.tenants || []).find(
|
||||||
|
(row) => Number(row.id) === Number(exportData.tenantId)
|
||||||
|
)
|
||||||
|
|
||||||
|
if (!tenantRow || tenantRow.numberRanges === null || typeof tenantRow.numberRanges === "undefined") {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
const result = await client.query(
|
||||||
|
`update "tenants" set "numberRanges" = $1::jsonb where "id" = $2`,
|
||||||
|
[JSON.stringify(tenantRow.numberRanges), exportData.tenantId]
|
||||||
|
)
|
||||||
|
|
||||||
|
return result.rowCount || 0
|
||||||
|
}
|
||||||
48
backend/tests/tenantImportNumberRanges.test.ts
Normal file
48
backend/tests/tenantImportNumberRanges.test.ts
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
import assert from "node:assert/strict"
|
||||||
|
import test from "node:test"
|
||||||
|
|
||||||
|
import { restoreImportedTenantNumberRanges } from "../src/utils/tenantImportNumberRanges"
|
||||||
|
|
||||||
|
test("restores number ranges when importing into an existing target tenant", async () => {
|
||||||
|
const queries: { query: string, values: unknown[] }[] = []
|
||||||
|
const numberRanges = {
|
||||||
|
invoices: { prefix: "RE-", suffix: "", nextNumber: 4712 },
|
||||||
|
}
|
||||||
|
const client = {
|
||||||
|
async query(query: string, values: unknown[]) {
|
||||||
|
queries.push({ query, values })
|
||||||
|
return { rowCount: 1 }
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
const updated = await restoreImportedTenantNumberRanges(client, {
|
||||||
|
tenantId: 42,
|
||||||
|
tables: {
|
||||||
|
tenants: [{ id: 42, name: "Zieltenant", numberRanges }],
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
assert.equal(updated, 1)
|
||||||
|
assert.deepEqual(queries, [{
|
||||||
|
query: `update "tenants" set "numberRanges" = $1::jsonb where "id" = $2`,
|
||||||
|
values: [JSON.stringify(numberRanges), 42],
|
||||||
|
}])
|
||||||
|
})
|
||||||
|
|
||||||
|
test("does not overwrite number ranges when the export contains none", async () => {
|
||||||
|
let queryCalled = false
|
||||||
|
const client = {
|
||||||
|
async query() {
|
||||||
|
queryCalled = true
|
||||||
|
return { rowCount: 1 }
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
const updated = await restoreImportedTenantNumberRanges(client, {
|
||||||
|
tenantId: 42,
|
||||||
|
tables: { tenants: [{ id: 42, name: "Zieltenant" }] },
|
||||||
|
})
|
||||||
|
|
||||||
|
assert.equal(updated, 0)
|
||||||
|
assert.equal(queryCalled, false)
|
||||||
|
})
|
||||||
Reference in New Issue
Block a user