// Public entry point for the storage layer. // Implementation is split into domain modules under server/storage/ import { users, organizations, userSessions, invitations, userCustomFields, userCustomValues, forms, formTabs, formFields, formStatuses, statusTransitions, tasks, taskFieldValues, fieldHistory, taskMessages, userNotifications, messageReads, bookmarkFolders, bookmarks, bots, botSubscriptions, botSessions, dataTables, dataTableRows, dataTablePermissions, externalServices, regularTableRows, fieldTemplates, customTabModules, taskTabValues, deviceTokens, userPresence, webPushSubscriptions, customPages, type User, type Organization, type UserSession, type Invitation, type InsertUser, type InsertOrganization, type InsertUserSession, type InsertInvitation, type UserWithOrganization, type UserCustomField, type UserCustomValue, type CreateUserCustomField, type UpdateUserCustomField, type UserProfileTab, type UserProfileField, type UserProfileFieldValue, type UserProfileAuditLog, type InsertUserProfileTab, type InsertUserProfileField, type InsertUserProfileFieldValue, type InsertUserProfileAuditLog, userProfileAuditLog, type Form, type FormTab, type FormField, type FormStatus, type StatusTransition, type Task, type TaskFieldValue, type FieldHistory, type TaskMessage, type TaskMessageWithAuthor, type UserNotification, type MessageRead, type InsertMessageRead, type BookmarkFolder, type Bookmark, type InsertForm, type InsertFormTab, type InsertFormField, type InsertFormStatus, type InsertStatusTransition, type InsertTask, type InsertTaskFieldValue, type InsertFieldHistory, type InsertTaskMessage, type InsertUserNotification, type InsertBookmarkFolder, type InsertBookmark, type Bot, type BotSubscription, type BotSession, type InsertBot, type InsertBotSubscription, type InsertBotSession, type BotWithSubscriptions, type DataTable, type DataTableRow, type DataTablePermission, type DataTableAccessRule, type InsertDataTableAccessRule, type InsertDataTable, type InsertDataTableRow, type InsertDataTablePermission, type DataTableWithRows, type DataTableFull, type ExternalService, type InsertExternalService, type RegularTableRow, type InsertRegularTableRow, type FieldTemplate, type InsertFieldTemplate, type CustomTabModule, type InsertCustomTabModule, type TaskTabValue, type InsertTaskTabValue, type DeviceToken, type InsertDeviceToken, type UserPresence, type InsertUserPresence, type WebPushSubscription, type CustomPage, type InsertCustomPage } from "@shared/schema"; import { organizationApiKeys, type OrganizationApiKey, type ApiKeyScopes } from "@shared/schema"; import { automations, type Automation, type InsertAutomation } from "@shared/schema"; import { taskRelations, type TaskRelation, type InsertTaskRelation } from "@shared/schema"; import { taskReminders, type TaskReminder, type InsertTaskReminder } from "@shared/schema"; import { ragSettings, type RagSetting, embeddingQueue } from "@shared/schema"; import { llmProviders, type LlmProvider, type InsertLlmProvider } from "@shared/schema"; import { systemConfig } from "@shared/schema"; import { taskAuditLog, type TaskAuditLog, type InsertTaskAuditLog } from "@shared/schema"; import { taskRoles, type TaskRole, taskUserAccess, type TaskUserAccess, roleMembers, roles, taskAssignees, type TaskAssignee } from "@shared/schema"; import { userOfflineSubscriptions, type UserOfflineSubscription, type InsertUserOfflineSubscription } from "@shared/schema"; import { db } from "./db"; import { eq, and, or, desc, asc, exists, isNull, isNotNull, sql, ilike, inArray, lte } from "drizzle-orm"; import { alias } from "drizzle-orm/pg-core"; import crypto from "crypto"; import { formatUserName } from "./utils/formatUserName"; export interface RelatedTreeNode { id: number; title: string; formId: number; formName: string; fieldName: string; isFinal: boolean; statusName: string | null; statusColor: string | null; nodes: RelatedTreeNode[]; } export interface IStorage { // Organizations getOrganization(id: number): Promise; getOrganizationBySlug(slug: string): Promise; createOrganization(organization: InsertOrganization): Promise; // Users getUser(id: number): Promise; getUserWithOrganization(id: number): Promise; getUserByEmail(email: string, organizationId?: number): Promise; getUserByEmailAndSlug(email: string, slug: string): Promise; getUsersByOrganization(organizationId: number): Promise; listUsers(organizationId: number, options?: import('./storage/users.storage').ListUsersOptions): Promise; getLinkedTasksForUser(userId: number, organizationId: number): Promise< Array<{ task: Task; form: { id: number; name: string }; status: FormStatus | null; field: FormField; }> >; getUserByResetPasswordToken(token: string): Promise; createUser(insertUser: InsertUser): Promise; updateUser(id: number, updates: Partial): Promise; deleteUser(id: number): Promise; // User offline subscriptions getUserOfflineSubscriptions(userId: number, organizationId: number): Promise; getUserOfflineSubscription(userId: number, formId: number): Promise; upsertUserOfflineSubscription(subscription: InsertUserOfflineSubscription): Promise; deleteUserOfflineSubscription(userId: number, formId: number): Promise; // User sessions createUserSession(session: InsertUserSession): Promise; getUserSessionByToken(refreshToken: string): Promise; getUserSessionByParentToken(parentRefreshToken: string): Promise; getActiveSessionInFamily(familyId: string): Promise; markSessionReplaced(refreshToken: string, replacedByToken: string): Promise; revokeSession(refreshToken: string): Promise; revokeSessionFamily(familyId: string): Promise; revokeAllUserSessions(userId: number): Promise; deleteUserSession(refreshToken: string): Promise; deleteUserSessions(userId: number): Promise; // Invitations createInvitation(invitation: InsertInvitation): Promise; getInvitationByToken(token: string): Promise; getInvitationsByOrganization(organizationId: number): Promise; markInvitationAsUsed(token: string): Promise; deleteInvitation(id: number, organizationId: number): Promise; // User Custom Fields getUserCustomFields(organizationId: number): Promise; getUserCustomField(id: number, organizationId: number): Promise; createUserCustomField(organizationId: number, field: CreateUserCustomField): Promise; updateUserCustomField(id: number, organizationId: number, updates: UpdateUserCustomField): Promise; deleteUserCustomField(id: number, organizationId: number): Promise; reorderUserCustomFields(organizationId: number, fieldIds: number[]): Promise; // User Custom Values getUserCustomValues(userId: number, organizationId: number): Promise; setUserCustomValue(userId: number, fieldId: number, value: string | null, organizationId: number): Promise; setUserCustomValues(userId: number, values: Array<{ fieldId: number; value: string | null }>, organizationId: number): Promise; // User Profile Tabs getUserProfileTabs(organizationId: number): Promise; getUserProfileTabsByCreationOrder(organizationId: number): Promise; bulkSaveUserProfileTabs(organizationId: number, tabs: Array<{ id?: number; name: string; code: string; position?: number; displayOrder?: number }>): Promise; // User Profile Fields getUserProfileFields(organizationId: number): Promise; getUserProfileFieldsByCreationOrder(organizationId: number): Promise; getUserProfileFieldById(id: number, organizationId: number): Promise; bulkSaveUserProfileFields(organizationId: number, fieldIdsToDelete: number[], fields: Array<{ id?: number; name: string; code: string; type: string; isRequired?: boolean; placeholder?: string | null; defaultValue?: string | null; validationRules?: unknown; options?: unknown; position?: number | null; displayOrder?: number | null; tabId?: number | null; linkedFormId?: number | null; companyAutofill?: unknown; maxFileCount?: number | null; maxFileSizeMB?: number | null; autoProlongation?: boolean | null; autoProlongationLabel?: string | null }>): Promise; // User Profile Field Values getUserProfileFieldValues(userId: number): Promise; getUserProfileFieldValue(userId: number, fieldId: number): Promise; createUserProfileFieldValue(insertValue: InsertUserProfileFieldValue): Promise; createUserProfileFieldValueWithAudit(insertValue: InsertUserProfileFieldValue, organizationId: number, changedBy: number): Promise; updateUserProfileFieldValue(userId: number, fieldId: number, updates: Partial): Promise; updateUserProfileFieldValueWithAudit(userId: number, fieldId: number, updates: Partial, organizationId: number, changedBy: number): Promise; deleteUserProfileFieldValue(userId: number, fieldId: number): Promise; deleteUserProfileFieldValueWithAudit(userId: number, fieldId: number, organizationId: number, changedBy: number): Promise; getUserProfileDetail(userId: number, organizationId: number): Promise<{ user: any; tabs: UserProfileTab[]; fields: UserProfileField[]; fieldValues: UserProfileFieldValue[] }>; // User Profile Audit Log getUserProfileAuditLog(userId: number, organizationId: number): Promise; createUserProfileAuditLog(insertValue: InsertUserProfileAuditLog): Promise; // Forms getForm(id: number, organizationId: number): Promise
; getFormsByOrganization(organizationId: number): Promise; createForm(insertForm: InsertForm): Promise; updateForm(id: number, organizationId: number, updates: Partial): Promise; deleteForm(id: number, organizationId: number): Promise; getTasksCountByForm(formId: number): Promise<{ total: number; active: number; completed: number }>; getTaskCountsByStatus(formId: number, organizationId: number): Promise>; getFormsWithOfflineCache(organizationId: number): Promise; getOfflineCacheConfig(id: number, organizationId: number): Promise; updateFormOfflineCache(id: number, organizationId: number, config: Form['offlineCache']): Promise; // Form Tabs getFormTabs(formId: number, organizationId: number): Promise; getFormTabsByCreationOrder(formId: number, organizationId: number): Promise; getFormTab(id: number, formId: number, organizationId: number): Promise; createFormTab(insertTab: InsertFormTab): Promise; updateFormTab(id: number, formId: number, organizationId: number, updates: Partial): Promise; deleteFormTab(id: number, formId: number, organizationId: number): Promise; bulkSaveFormTabs(formId: number, organizationId: number, tabs: Array<{ id?: number; name: string; code: string; type: string; tableColumns?: unknown }>): Promise; // Form Fields getFormFields(formId: number, organizationId: number): Promise; getFormFieldsByCreationOrder(formId: number, organizationId: number): Promise; getFormFieldById(id: number, organizationId: number): Promise; createFormField(insertField: InsertFormField): Promise; updateFormField(id: number, formId: number, organizationId: number, updates: Partial): Promise; deleteFormField(id: number, formId: number, organizationId: number): Promise; bulkSaveFormFields(formId: number, organizationId: number, fieldIdsToDelete: number[], fields: Array<{ id?: number; name: string; code: string; type: string; isRequired?: boolean; placeholder?: string | null; defaultValue?: string | null; validationRules?: unknown; options?: unknown; tabId?: number | null; linkedFormId?: number | null; taskRelationType?: string | null; companyAutofill?: unknown; maxFileCount?: number | null; maxFileSizeMB?: number | null; linkToUserProfile?: boolean | null }>): Promise; // Form Statuses getFormStatuses(formId: number, organizationId: number): Promise; createFormStatus(insertStatus: InsertFormStatus): Promise; updateFormStatus(id: number, formId: number, organizationId: number, updates: Partial): Promise; deleteFormStatus(id: number, formId: number, organizationId: number): Promise; bulkSaveFormStatuses(formId: number, organizationId: number, statusIdsToDelete: number[], statuses: Array<{ id?: number; name: string; color?: string; isInitial?: boolean; isFinal?: boolean }>): Promise; // Status Transitions getStatusTransitions(formId: number, organizationId: number): Promise; createStatusTransition(insertTransition: InsertStatusTransition): Promise; updateStatusTransition(id: number, formId: number, organizationId: number, updates: Partial): Promise; deleteStatusTransition(id: number, formId: number, organizationId: number): Promise; // Tasks getTask(id: number, organizationId: number): Promise; getTaskDetail(id: number, organizationId: number): Promise<{ task: Task; form: Form; fields: FormField[]; statuses: FormStatus[]; tabs: FormTab[]; transitions: StatusTransition[]; fieldValues: TaskFieldValue[]; subtasks: Task[]; messages: TaskMessageWithAuthor[]; users: User[]; hasRelations: boolean; assignees: Array; } | null>; getTasksByForm(formId: number, organizationId: number): Promise; getTasksWithFieldsByForm(formId: number, organizationId: number): Promise; getTasksWithFieldsByFormOptimized(formId: number, organizationId: number, options?: { limit?: number; offset?: number; assignedTo?: number }): Promise<{ tasks: Task[]; total: number }>; getTasksByOrganization(organizationId: number, options?: { limit?: number; offset?: number; sortBy?: 'updatedAt' | 'createdAt'; order?: 'asc' | 'desc'; statusId?: number; assignedTo?: number; minimal?: boolean; }): Promise[]>; createTask(insertTask: InsertTask): Promise; updateTask(id: number, organizationId: number, updates: Partial): Promise; updateTaskIfNotModified(id: number, organizationId: number, updates: Partial, requiredUpdatedAt: Date): Promise; deleteTask(id: number, organizationId: number): Promise; searchTasksByKeyword(organizationId: number, query: string, limit?: number): Promise<(Pick & { statusName: string | null; statusColor: string | null; statusIsFinal: boolean | null })[]>; // Task Field Values getTaskFieldValues(taskId: number, organizationId: number): Promise; createTaskFieldValue(insertValue: InsertTaskFieldValue): Promise; updateTaskFieldValue(taskId: number, fieldId: number, organizationId: number, updates: Partial): Promise; bulkUpsertTaskFieldValues(taskId: number, formId: number, updates: Array<{ fieldId: number; value: unknown }>): Promise; deleteTaskFieldValue(taskId: number, fieldId: number, organizationId: number): Promise; // Field History getFieldHistory(taskId: number, fieldId: number, organizationId: number): Promise; createFieldHistory(insertHistory: InsertFieldHistory): Promise; // Task Messages (Chat) getTaskMessages(taskId: number, organizationId: number, afterId?: number): Promise; getTaskMessage(messageId: number, organizationId: number): Promise; createTaskMessage(insertMessage: any, organizationId: number): Promise; updateTaskMessage(id: number, organizationId: number, updates: Partial): Promise; deleteTaskMessage(id: number, organizationId: number): Promise; // Message Reads (Read Receipts) markMessageAsRead(messageId: number, userId: number, organizationId: number): Promise; getMessageReads(messageId: number, organizationId: number): Promise; getMessageReadsByUser(userId: number, organizationId: number): Promise; isMessageReadByUser(messageId: number, userId: number, organizationId: number): Promise; // Bookmark Folders getBookmarkFolder(id: number, organizationId: number, userId: number): Promise; getBookmarkFoldersByOrganization(organizationId: number, userId: number): Promise; getBookmarkFoldersByParent(parentId: number | null, organizationId: number, userId: number): Promise; createBookmarkFolder(insertFolder: InsertBookmarkFolder): Promise; updateBookmarkFolder(id: number, organizationId: number, updates: Partial, userId: number): Promise; deleteBookmarkFolder(id: number, organizationId: number, userId: number): Promise; normalizeBookmarkFolderPositions(organizationId: number, userId: number): Promise; batchUpdateBookmarkFolderPositions(items: { id: number; position: number }[], organizationId: number, userId: number): Promise; // Bookmarks getBookmark(id: number, organizationId: number, userId: number): Promise; getBookmarksByFolder(folderId: number | null, organizationId: number, userId: number): Promise; getBookmarksByOrganization(organizationId: number, userId: number): Promise; createBookmark(insertBookmark: InsertBookmark): Promise; updateBookmark(id: number, organizationId: number, updates: Partial, userId: number): Promise; deleteBookmark(id: number, organizationId: number, userId: number): Promise; normalizeBookmarkPositions(organizationId: number, userId: number): Promise; batchUpdateBookmarkPositions(items: { id: number; position: number }[], organizationId: number, userId: number): Promise; // User Notifications getUserNotifications(userId: number, organizationId: number, isRead?: boolean): Promise; createUserNotification(insertNotification: InsertUserNotification): Promise; markNotificationAsRead(id: number, userId: number, organizationId: number): Promise; markAllNotificationsAsRead(userId: number, organizationId: number): Promise; markTaskNotificationsAsRead(taskId: number, userId: number, organizationId: number): Promise; deleteNotification(id: number, userId: number, organizationId: number): Promise; // User Search searchUsers(query: string, organizationId: number, limit?: number): Promise; // Bots getBot(id: number, organizationId: number): Promise; getBotByLogin(login: string, organizationId: number): Promise; getBotsByOrganization(organizationId: number): Promise; getBotWithSubscriptions(id: number, organizationId: number): Promise; searchBots(query: string, organizationId: number, limit?: number): Promise; createBot(insertBot: InsertBot): Promise; updateBot(id: number, organizationId: number, updates: Partial): Promise; deleteBot(id: number, organizationId: number): Promise; // Bot Subscriptions getBotSubscriptions(botId: number, organizationId: number): Promise; getBotSubscriptionsByForm(formId: number, organizationId: number): Promise; getBotSubscriptionsByStatus(statusId: number, organizationId: number): Promise; getBotSubscriptionsByTransition(transitionId: number, organizationId: number): Promise; createBotSubscription(insertSubscription: InsertBotSubscription): Promise; updateBotSubscription(id: number, organizationId: number, updates: Partial): Promise; deleteBotSubscription(id: number, organizationId: number): Promise; // Bot Sessions createBotSession(session: InsertBotSession): Promise; getBotSessionByToken(refreshToken: string): Promise; deleteBotSession(refreshToken: string): Promise; deleteBotSessions(botId: number): Promise; // Data Tables getDataTable(id: number, organizationId: number): Promise; getDataTablesByOrganization(organizationId: number): Promise; getDataTablesWithAccess(userId: number, organizationId: number): Promise; getDataTableFull(id: number, organizationId: number): Promise; createDataTable(table: InsertDataTable & { organizationId: number; createdBy: number }): Promise; updateDataTable(id: number, organizationId: number, updates: Partial): Promise; deleteDataTable(id: number, organizationId: number): Promise; // Data Table Rows getDataTableRows(tableId: number, organizationId: number): Promise; getDataTableRow(id: number, tableId: number, organizationId: number): Promise; createDataTableRow(row: InsertDataTableRow): Promise; updateDataTableRow(id: number, tableId: number, organizationId: number, updates: Partial): Promise; deleteDataTableRow(id: number, tableId: number, organizationId: number): Promise; bulkCreateDataTableRows(tableId: number, rows: { values: string[]; parentId?: number | null; position?: number }[]): Promise; bulkDeleteDataTableRows(tableId: number, organizationId: number): Promise; applyDataTableSync(tableId: number, deleted: { id: number }[], added: { values: string[]; position: number }[], reordered: { id: number; newPosition: number }[], positionUpdates: { id: number; position: number }[]): Promise; applyDataTableDiff(tableId: number, upsertRows: { values: string[] }[], deleteKeys: string[], currentRows: DataTableRow[]): Promise<{ added: DataTableRow[]; updated: DataTableRow[]; deleted: DataTableRow[] }>; // Data Table Permissions getDataTablePermissions(tableId: number, organizationId: number): Promise<(DataTablePermission & { user: { id: number; firstName: string; lastName: string; email: string } })[]>; getDataTablePermission(tableId: number, userId: number): Promise; getUserTableRole(tableId: number, userId: number, createdBy: number, organizationId?: number): Promise<'admin' | 'editor' | 'reader' | null>; setDataTablePermission(permission: InsertDataTablePermission): Promise; deleteDataTablePermission(tableId: number, userId: number): Promise; // Data Table Access Rules getDataTableAccessRules(tableId: number, organizationId: number): Promise; createDataTableAccessRule(data: InsertDataTableAccessRule): Promise; deleteDataTableAccessRule(id: number, organizationId: number): Promise; getLinkedFormsForTable(tableId: number, organizationId: number): Promise<{ id: number; name: string }[]>; // External Services getExternalServices(organizationId: number): Promise; getExternalService(id: number, organizationId: number): Promise; getExternalServiceByType(serviceType: string, organizationId: number): Promise; createExternalService(service: InsertExternalService): Promise; updateExternalService(id: number, organizationId: number, updates: Partial): Promise; deleteExternalService(id: number, organizationId: number): Promise; // Regular Table Rows (for type='table' tabs) getRegularTableRows(taskId: number, tabId: number): Promise; getRegularTableRow(id: number, taskId: number, tabId: number): Promise; createRegularTableRow(row: InsertRegularTableRow): Promise; updateRegularTableRow(id: number, taskId: number, tabId: number, updates: Partial): Promise; deleteRegularTableRow(id: number, taskId: number, tabId: number): Promise; // Field Templates getFieldTemplates(organizationId: number): Promise; getFieldTemplate(id: number, organizationId: number): Promise; getFieldTemplateByCode(code: string, organizationId: number): Promise; createFieldTemplate(field: InsertFieldTemplate): Promise; updateFieldTemplate(id: number, organizationId: number, updates: Partial): Promise; deleteFieldTemplate(id: number, organizationId: number): Promise; // Custom Tab Modules getCustomTabModules(organizationId: number): Promise; getCustomTabModule(id: number, organizationId: number): Promise; getCustomTabModuleByType(type: string, organizationId: number): Promise; createCustomTabModule(module: InsertCustomTabModule): Promise; updateCustomTabModule(id: number, organizationId: number, updates: Partial): Promise; deleteCustomTabModule(id: number, organizationId: number): Promise; getFormIdsByTabModuleType(type: string, organizationId: number): Promise; getFormTabByModuleType(formId: number, type: string, organizationId: number): Promise; // Custom JS Pages getCustomPages(organizationId: number): Promise; getCustomPage(id: number, organizationId: number): Promise; getCustomPageBySlug(slug: string, organizationId: number): Promise; createCustomPage(page: InsertCustomPage): Promise; updateCustomPage(id: number, organizationId: number, updates: Partial): Promise; deleteCustomPage(id: number, organizationId: number): Promise; // Automations getAutomations(organizationId: number): Promise; getOfflineAutomations(organizationId: number): Promise; getAutomation(id: number, organizationId: number): Promise; createAutomation(automation: InsertAutomation): Promise; updateAutomation(id: number, organizationId: number, updates: Partial): Promise; deleteAutomation(id: number, organizationId: number): Promise; // Task Tab Values (per-task data for custom modules) getTaskTabValues(taskId: number, tabId: number): Promise; getTaskTabValuesByTask(taskId: number): Promise; upsertTaskTabValues(taskId: number, tabId: number, values: Record): Promise; // Organization API Keys (MCP) createApiKey(organizationId: number, createdBy: number, label: string, scopes?: ApiKeyScopes | null, botId?: number | null): Promise<{ key: string; record: OrganizationApiKey }>; updateApiKey(id: number, organizationId: number, data: { label?: string; scopes?: ApiKeyScopes | null }): Promise; listApiKeys(organizationId: number): Promise; deleteApiKey(id: number, organizationId: number): Promise; getApiKeyByHash(rawKey: string): Promise; getApiKeyByLegacyHash(rawKey: string): Promise; touchApiKey(id: number): Promise; getApiKeyByBotId(botId: number, organizationId: number): Promise; setApiKeyActive(id: number, organizationId: number, isActive: boolean): Promise; detachApiKeyFromBot(id: number, organizationId: number): Promise; // Task Relations upsertTaskRelation(data: { parentTaskId: number; childTaskId: number; fieldId?: number | null; organizationId: number }): Promise; // Task Roles getTaskRoles(taskId: number, organizationId: number): Promise>; addTaskRole(taskId: number, roleId: number, organizationId: number): Promise; removeTaskRole(taskId: number, roleId: number, organizationId: number): Promise; // Task Assignees (multiple users) getTaskAssignees(taskId: number, organizationId: number): Promise>; addTaskAssignee(taskId: number, userId: number, organizationId: number): Promise; removeTaskAssignee(taskId: number, userId: number, organizationId: number): Promise; // Task User Access getTaskUserAccess(taskId: number, organizationId: number): Promise>; recordTaskInteraction(taskId: number, userId: number, organizationId: number, grantedVia: string, roleId?: number | null): Promise; recordTaskInteractionAuto(taskId: number, userId: number, organizationId: number): Promise; upsertTaskUserAccess(taskId: number, userId: number, organizationId: number, grantedVia: string): Promise; recordTransitionAccess(taskId: number, userId: number, organizationId: number, roleId: number | null, statusId: number): Promise; revokeTaskUserAccess(taskId: number, userId: number, organizationId: number): Promise; canUserAccessTask(taskId: number, userId: number, organizationId: number, appRole: string): Promise; getAccessibleTaskIds(userId: number, organizationId: number, appRole: string): Promise | null>; resolveTaskAccessGrant(taskId: number, userId: number, organizationId: number): Promise<{ grantedVia: string; roleId: number | null }>; // Form Access Rules getFormAccessRules(formId: number, organizationId: number): Promise; createFormAccessRule(data: import('@shared/schema').InsertFormAccessRule): Promise; updateFormAccessRule(id: number, organizationId: number, updates: Partial>): Promise; deleteFormAccessRule(id: number, organizationId: number): Promise; transferFormOwnership(formId: number, organizationId: number, newAuthorId: number): Promise; canUserAccessForm(userId: number, formId: number, organizationId: number, requiredLevel?: 'participate' | 'view_all' | 'admin'): Promise; deleteTaskRelationByField(fieldId: number, taskId: number, organizationId: number): Promise; getTaskRelations(taskId: number, organizationId: number): Promise; // Task Reminders getTaskReminders(taskId: number, organizationId: number): Promise; createTaskReminder(data: InsertTaskReminder): Promise; deleteTaskReminder(id: number, organizationId: number): Promise; getDueReminders(): Promise; markReminderSent(id: number): Promise; getUsersByRole(role: string, organizationId: number): Promise; getUsersByOrgRoleId(roleId: number, organizationId: number): Promise; // Task Audit Log addTaskAuditLog(entry: InsertTaskAuditLog): Promise; getTaskAuditLog(taskId: number, organizationId: number): Promise; // Task Views recordTaskView(taskId: number, userId: number, organizationId: number): Promise; // Roles getRoles(organizationId: number): Promise<(import('@shared/schema').Role & { memberCount: number; members: { id: number; userId: number; user: { id: number; firstName: string; lastName: string; email: string } }[]; manager: { id: number; firstName: string; lastName: string; middleName: string | null; email: string } | null })[]>; getRole(id: number, organizationId: number): Promise; createRole(data: { organizationId: number; name: string; description?: string | null; parentId?: number | null; managerId?: number | null }): Promise; updateRole(id: number, organizationId: number, updates: { name?: string; description?: string | null; parentId?: number | null; managerId?: number | null }): Promise; deleteRole(id: number, organizationId: number): Promise; getRoleMembers(roleId: number, organizationId: number): Promise<(import('@shared/schema').Role & { members: { id: number; userId: number; user: { id: number; firstName: string; lastName: string; email: string } }[]; manager: { id: number; firstName: string; lastName: string; middleName: string | null; email: string } | null })>; addRoleMember(roleId: number, userId: number, organizationId: number): Promise; removeRoleMember(roleId: number, userId: number, organizationId: number): Promise; getRoleMembersByRole(roleId: number): Promise<{ id: number; userId: number; createdAt: Date | null }[]>; getUserRoles(userId: number, organizationId: number): Promise; // Super Admins getSuperAdminByEmail(email: string): Promise; getSuperAdminById(id: number): Promise; getAllSuperAdmins(): Promise; createSuperAdmin(data: import('@shared/schema').InsertSuperAdmin): Promise; deleteSuperAdmin(id: number): Promise; getSuperAdminCount(): Promise; updateSuperAdminLastLogin(id: number): Promise; updateSuperAdminPassword(id: number, passwordHash: string): Promise; getAllOrganizationsWithStats(): Promise>; updateOrganization(id: number, updates: Partial): Promise; getOrganizationDetailedStats(organizationId: number): Promise<{ forms: number; tasks: number; totalUsers: number; activeUsers: number; lastActivity: Date | null }>; // Billing getBillingSettings(organizationId: number): Promise; getOrCreateBillingSettings(organizationId: number): Promise; updateBillingSettings(organizationId: number, updates: Partial): Promise; addBillingCredit(organizationId: number, amount: number, description: string, createdBy?: number): Promise; getBillingTransactions(organizationId: number, limit?: number): Promise; setBillingBlocked(organizationId: number, blocked: boolean): Promise; getBillingSummary(organizationId: number): Promise<{ balance: string; pricePerUser: string; currency: string; nextBillingDate: string | null; billingBlocked: boolean; activeUsers: number; estimatedCharge: string }>; processBillingCycle(): Promise; // RAG Settings getRagSettings(organizationId: number): Promise; upsertRagSettings(organizationId: number, updates: Partial>): Promise; // Embedding Queue enqueueEmbedding(organizationId: number, entityType: 'form' | 'task' | 'task_message', entityId: number, operation?: 'upsert' | 'delete'): Promise; getPendingEmbeddingQueue(limit?: number): Promise>; markEmbeddingQueueProcessed(ids: number[]): Promise; clearEmbeddingQueue(): Promise; // LLM Providers getLlmProviders(organizationId: number): Promise; getLlmProvider(id: number, organizationId: number): Promise; createLlmProvider(data: InsertLlmProvider): Promise; updateLlmProvider(id: number, organizationId: number, updates: Partial>): Promise; deleteLlmProvider(id: number, organizationId: number): Promise; // System Config getSystemConfig(key: string): Promise; setSystemConfig(key: string, value: string): Promise; // Web Push registerWebPushSubscription(userId: number, organizationId: number, endpoint: string, subscription: string): Promise; unregisterWebPushSubscription(endpoint: string): Promise; getWebPushSubscriptions(userId: number, organizationId: number): Promise; getWebPushSubscriptionsByOrganization(organizationId: number): Promise; clearAllWebPushSubscriptions(): Promise; } export { DatabaseStorage, storage } from "./storage/index";