feat(documents): allow archiving inbox documents
All checks were successful
Build and Release FEDEO / verify (push) Successful in 57s
Build and Release FEDEO / build-and-release (push) Successful in 5m56s

This commit is contained in:
2026-10-02 17:12:05 +02:00
parent 09a002d600
commit 1885bfc521
6 changed files with 243 additions and 13 deletions

View File

@@ -527,6 +527,61 @@ test("scanner inbox integration: migration, persistence, isolation, retries and
assert.equal((await fileInto(id)).statusCode, 404)
await pool.query("UPDATE files SET archived=false WHERE id=$1", [id])
})
await t.test("archiving is tenant scoped, preserves the original and invalidates an ongoing analysis", async () => {
assert.equal((await send("archive.pdf")).statusCode, 201)
const id = (await service.list(1, 50, 0, "archive.pdf")).documents[0].id
const archive = (fileId = id, headers = {}) => app.inject({ method: "POST", url: `/api/document-inbox/${fileId}/archive`, headers })
assert.equal((await archive(id, { "x-test-tenant": "2" })).statusCode, 404)
assert.equal((await archive(randomUUID())).statusCode, 404)
assert.equal((await archive("invalid")).statusCode, 400)
const filedId = (await pool.query("SELECT file_id FROM scanner_inbox_documents WHERE tenant_id=1 AND remote_filename='scan.pdf'")).rows[0].file_id
assert.equal((await archive(filedId)).statusCode, 409)
await pool.query("UPDATE tenants SET locked='maintenance_tenant' WHERE id=1")
assert.equal((await archive()).statusCode, 423)
await pool.query("UPDATE tenants SET locked=null WHERE id=1")
await pool.query("INSERT INTO auth_profiles (tenant_id, user_id, customer_for_portal) VALUES (1, $1, 123)", [userId])
assert.equal((await archive()).statusCode, 403)
await pool.query("DELETE FROM auth_profiles")
const before = (await pool.query("SELECT * FROM files WHERE id=$1", [id])).rows[0]
const countBefore = (await service.openCount(1)).total
const storedBefore = stored.size
// Run this document first, then archive it while its provider response is still pending.
await pool.query("UPDATE scanner_inbox_documents SET received_at=now()-interval '1 day' WHERE file_id=$1", [id])
let finish!: () => void
analysisGate = new Promise(resolve => { finish = resolve })
const started = new Promise<void>(resolve => { analysisStarted = resolve })
const pending = service.processNextSuggestion()
await started
assert.equal(analyses.at(-1).document.name, "archive.pdf")
const result = await archive(id, { "x-test-admin": "false" })
finish()
await pending
analysisGate = undefined
analysisStarted = undefined
assert.equal(result.statusCode, 200, result.body)
assert.deepEqual(result.json(), { id, archived: true })
const row = (await pool.query("SELECT * FROM files WHERE id=$1", [id])).rows[0]
assert.equal(row.archived, true)
assert.equal(row.updated_by, userId)
assert.ok(row.updated_at)
assert.equal(row.path, before.path)
assert.equal(row.folder, before.folder)
assert.equal(row.type, before.type)
assert.deepEqual(stored.get(row.path), pdf)
const receipt = (await pool.query("SELECT filed_at, suggestion_claim, suggestion_status FROM scanner_inbox_documents WHERE file_id=$1", [id])).rows[0]
assert.deepEqual(receipt, { filed_at: null, suggestion_claim: null, suggestion_status: "pending" })
assert.equal((await service.list(1, 50, 0, "archive.pdf")).total, 0)
assert.equal((await service.openCount(1)).total, countBefore - 1)
assert.equal((await suggest(id)).statusCode, 404)
assert.equal((await fileInto(id)).statusCode, 404)
assert.equal((await archive()).statusCode, 200, "repeated requests remain successful")
assert.equal((await pool.query("SELECT updated_at FROM files WHERE id=$1", [id])).rows[0].updated_at.getTime(), row.updated_at.getTime())
assert.equal((await send("archive.pdf")).statusCode, 204)
assert.equal((await service.list(1, 50, 0, "archive.pdf")).total, 0)
assert.equal(stored.size, storedBefore)
while (await service.processNextSuggestion()) { /* drain the remaining fixtures */ }
assert.equal(analyses.filter(item => item.document.name === "archive.pdf").length, 1)
})
await t.test("maintenance, portal access and administrator-only settings are enforced", async () => {
await pool.query("UPDATE tenants SET locked='maintenance_tenant' WHERE id=1")
assert.equal((await send("maintenance.pdf")).statusCode, 423)