feat(documents): add Epson scanner inbox and document shelf

This commit is contained in:
2026-09-29 12:42:05 +02:00
parent 552a90e9e1
commit 2192fa5bb4
13 changed files with 942 additions and 0 deletions

View File

@@ -0,0 +1,20 @@
CREATE TABLE "scanner_inbox_connections" (
"tenant_id" bigint PRIMARY KEY REFERENCES "tenants"("id") ON DELETE CASCADE,
"username" text NOT NULL UNIQUE,
"password_hash" text NOT NULL,
"active" boolean NOT NULL DEFAULT true,
"created_at" timestamp with time zone NOT NULL DEFAULT now(),
"updated_at" timestamp with time zone
);
--> statement-breakpoint
CREATE TABLE "scanner_inbox_documents" (
"file_id" uuid PRIMARY KEY REFERENCES "files"("id") ON DELETE CASCADE,
"tenant_id" bigint NOT NULL REFERENCES "tenants"("id") ON DELETE CASCADE,
"remote_filename" text NOT NULL,
"checksum" text NOT NULL,
"received_at" timestamp with time zone NOT NULL DEFAULT now()
);
--> statement-breakpoint
CREATE UNIQUE INDEX "scanner_inbox_documents_filename_key" ON "scanner_inbox_documents" ("tenant_id", "remote_filename");
--> statement-breakpoint
CREATE INDEX "scanner_inbox_documents_received_idx" ON "scanner_inbox_documents" ("tenant_id", "received_at");

View File

@@ -491,6 +491,13 @@
"when": 1790121600001,
"tag": "0072_restore_instance_scan_agents",
"breakpoints": true
},
{
"idx": 70,
"version": "7",
"when": 1790640000000,
"tag": "0073_scanner_document_inbox",
"breakpoints": true
}
]
}

View File

@@ -100,3 +100,4 @@ export * from "./serialtypes"
export * from "./serialexecutions"
export * from "./public_links"
export * from "./wikipages"
export * from "./scanner_inbox"

View File

@@ -0,0 +1,23 @@
import { bigint, boolean, index, pgTable, text, timestamp, uniqueIndex, uuid } from "drizzle-orm/pg-core"
import { tenants } from "./tenants"
import { files } from "./files"
export const scannerInboxConnections = pgTable("scanner_inbox_connections", {
tenantId: bigint("tenant_id", { mode: "number" }).primaryKey().references(() => tenants.id, { onDelete: "cascade" }),
username: text("username").notNull().unique(),
passwordHash: text("password_hash").notNull(),
active: boolean("active").notNull().default(true),
createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
updatedAt: timestamp("updated_at", { withTimezone: true }),
})
export const scannerInboxDocuments = pgTable("scanner_inbox_documents", {
fileId: uuid("file_id").primaryKey().references(() => files.id, { onDelete: "cascade" }),
tenantId: bigint("tenant_id", { mode: "number" }).notNull().references(() => tenants.id, { onDelete: "cascade" }),
remoteFilename: text("remote_filename").notNull(),
checksum: text("checksum").notNull(),
receivedAt: timestamp("received_at", { withTimezone: true }).notNull().defaultNow(),
}, table => ({
filenameKey: uniqueIndex("scanner_inbox_documents_filename_key").on(table.tenantId, table.remoteFilename),
receivedIdx: index("scanner_inbox_documents_received_idx").on(table.tenantId, table.receivedAt),
}))