KI-AGENT: Mandantenbezogenen IMAP-Dokumentenimport umsetzen
This commit is contained in:
84
backend/db/schema/document_imports.ts
Normal file
84
backend/db/schema/document_imports.ts
Normal file
@@ -0,0 +1,84 @@
|
||||
import {
|
||||
bigint,
|
||||
boolean,
|
||||
index,
|
||||
integer,
|
||||
jsonb,
|
||||
pgTable,
|
||||
text,
|
||||
timestamp,
|
||||
uniqueIndex,
|
||||
uuid,
|
||||
} from "drizzle-orm/pg-core"
|
||||
|
||||
import { tenants } from "./tenants"
|
||||
import { authUsers } from "./auth_users"
|
||||
import { files } from "./files"
|
||||
import { folders } from "./folders"
|
||||
import { filetags } from "./filetags"
|
||||
|
||||
export const documentImportSources = pgTable("document_import_sources", {
|
||||
id: uuid("id").primaryKey().defaultRandom(),
|
||||
tenantId: bigint("tenant_id", { mode: "number" })
|
||||
.notNull()
|
||||
.references(() => tenants.id, { onDelete: "cascade", onUpdate: "cascade" }),
|
||||
createdBy: uuid("created_by").references(() => authUsers.id, { onDelete: "set null" }),
|
||||
name: text("name").notNull(),
|
||||
provider: text("provider").notNull().default("imap"),
|
||||
enabled: boolean("enabled").notNull().default(true),
|
||||
mailboxAddressEncrypted: jsonb("mailbox_address_encrypted"),
|
||||
passwordEncrypted: jsonb("password_encrypted"),
|
||||
imapHostEncrypted: jsonb("imap_host_encrypted"),
|
||||
imapPort: integer("imap_port").notNull().default(993),
|
||||
imapSecure: boolean("imap_secure").notNull().default(true),
|
||||
mailboxPath: text("mailbox_path").notNull().default("INBOX"),
|
||||
targetFolderId: uuid("target_folder_id").references(() => folders.id, { onDelete: "set null" }),
|
||||
defaultFiletypeId: uuid("default_filetype_id").references(() => filetags.id, { onDelete: "set null" }),
|
||||
markAsSeen: boolean("mark_as_seen").notNull().default(true),
|
||||
lastSyncedAt: timestamp("last_synced_at", { withTimezone: true }),
|
||||
lastError: text("last_error"),
|
||||
createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
|
||||
updatedAt: timestamp("updated_at", { withTimezone: true }),
|
||||
}, (table) => ({
|
||||
tenantIdx: index("document_import_sources_tenant_idx").on(table.tenantId),
|
||||
}))
|
||||
|
||||
export const documentImportStates = pgTable("document_import_states", {
|
||||
id: uuid("id").primaryKey().defaultRandom(),
|
||||
sourceId: uuid("source_id")
|
||||
.notNull()
|
||||
.references(() => documentImportSources.id, { onDelete: "cascade", onUpdate: "cascade" }),
|
||||
mailboxPath: text("mailbox_path").notNull(),
|
||||
uidValidity: bigint("uid_validity", { mode: "number" }),
|
||||
highestUid: bigint("highest_uid", { mode: "number" }).notNull().default(0),
|
||||
deltaLinkEncrypted: jsonb("delta_link_encrypted"),
|
||||
updatedAt: timestamp("updated_at", { withTimezone: true }),
|
||||
}, (table) => ({
|
||||
sourceMailboxKey: uniqueIndex("document_import_states_source_mailbox_key")
|
||||
.on(table.sourceId, table.mailboxPath),
|
||||
}))
|
||||
|
||||
export const documentImportItems = pgTable("document_import_items", {
|
||||
id: uuid("id").primaryKey().defaultRandom(),
|
||||
tenantId: bigint("tenant_id", { mode: "number" })
|
||||
.notNull()
|
||||
.references(() => tenants.id, { onDelete: "cascade", onUpdate: "cascade" }),
|
||||
sourceId: uuid("source_id")
|
||||
.notNull()
|
||||
.references(() => documentImportSources.id, { onDelete: "cascade", onUpdate: "cascade" }),
|
||||
remoteMessageId: text("remote_message_id").notNull(),
|
||||
attachmentKey: text("attachment_key").notNull(),
|
||||
attachmentChecksum: text("attachment_checksum").notNull(),
|
||||
filename: text("filename"),
|
||||
status: text("status").notNull(),
|
||||
error: text("error"),
|
||||
fileId: uuid("file_id").references(() => files.id, { onDelete: "set null" }),
|
||||
createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
|
||||
}, (table) => ({
|
||||
remoteAttachmentKey: uniqueIndex("document_import_items_remote_attachment_key")
|
||||
.on(table.sourceId, table.remoteMessageId, table.attachmentKey),
|
||||
checksumIdx: index("document_import_items_checksum_idx")
|
||||
.on(table.sourceId, table.attachmentChecksum),
|
||||
}))
|
||||
|
||||
export type DocumentImportSource = typeof documentImportSources.$inferSelect
|
||||
Reference in New Issue
Block a user