From 0b53e47d4b9c1ed9cb98782e55cb86adb387960d Mon Sep 17 00:00:00 2001 From: Meik Date: Thu, 22 Jan 2026 19:59:39 +0100 Subject: [PATCH] Admin UI abtrennen + google settings in gui + UI enhancement --- .env | 2 + .env.example | 2 + backend/node_modules/.prisma/client/edge.js | 24 +- .../.prisma/client/index-browser.js | 10 +- .../node_modules/.prisma/client/index.d.ts | 1087 ++++++++++++++++- backend/node_modules/.prisma/client/index.js | 24 +- .../node_modules/.prisma/client/package.json | 2 +- .../node_modules/.prisma/client/schema.prisma | 21 +- backend/node_modules/.prisma/client/wasm.js | 10 +- .../20260122190000_app_setting/migration.sql | 12 + backend/prisma/schema.prisma | 21 +- backend/src/admin/routes.ts | 56 + backend/src/admin/settings.ts | 27 + backend/src/config.ts | 16 +- backend/src/mail/gmail.ts | 23 +- backend/src/mail/oauthRoutes.ts | 17 +- backend/src/main.ts | 9 +- backend/src/seed.ts | 39 + docker-compose.yml | 3 +- frontend/src/App.tsx | 413 +++++-- frontend/src/admin.tsx | 361 ++++-- frontend/src/api.ts | 9 +- frontend/src/i18n.ts | 2 +- frontend/src/locales/de/translation.json | 56 +- frontend/src/locales/en/translation.json | 54 +- frontend/src/main.tsx | 5 +- frontend/src/styles.css | 296 ++++- frontend/src/toast.tsx | 67 + screenshot/Screenshot 2026-01-22 194754.png | Bin 0 -> 148567 bytes 29 files changed, 2365 insertions(+), 303 deletions(-) create mode 100644 backend/prisma/migrations/20260122190000_app_setting/migration.sql create mode 100644 backend/src/admin/settings.ts create mode 100644 backend/src/seed.ts create mode 100644 frontend/src/toast.tsx create mode 100644 screenshot/Screenshot 2026-01-22 194754.png diff --git a/.env b/.env index 18e75385..48907b0a 100644 --- a/.env +++ b/.env @@ -35,3 +35,5 @@ SEED_ADMIN_EMAIL=admin@simplemailcleaner.local SEED_ADMIN_PASSWORD=change-me-now SEED_TENANT=Default Tenant SEED_TENANT_ID=seed-tenant +SEED_ENABLED=true +SEED_FORCE_PASSWORD_UPDATE=false diff --git a/.env.example b/.env.example index fdfba237..1f210d65 100644 --- a/.env.example +++ b/.env.example @@ -35,3 +35,5 @@ SEED_ADMIN_EMAIL=admin@simplemailcleaner.local SEED_ADMIN_PASSWORD=change-me-now SEED_TENANT=Default Tenant SEED_TENANT_ID=seed-tenant +SEED_ENABLED=true +SEED_FORCE_PASSWORD_UPDATE=false diff --git a/backend/node_modules/.prisma/client/edge.js b/backend/node_modules/.prisma/client/edge.js index 27e7f1b8..899b64e6 100644 --- a/backend/node_modules/.prisma/client/edge.js +++ b/backend/node_modules/.prisma/client/edge.js @@ -225,6 +225,13 @@ exports.Prisma.CleanupJobEventScalarFieldEnum = { createdAt: 'createdAt' }; +exports.Prisma.AppSettingScalarFieldEnum = { + id: 'id', + key: 'key', + value: 'value', + updatedAt: 'updatedAt' +}; + exports.Prisma.SortOrder = { asc: 'asc', desc: 'desc' @@ -292,7 +299,8 @@ exports.Prisma.ModelName = { RuleAction: 'RuleAction', CleanupJob: 'CleanupJob', UnsubscribeAttempt: 'UnsubscribeAttempt', - CleanupJobEvent: 'CleanupJobEvent' + CleanupJobEvent: 'CleanupJobEvent', + AppSetting: 'AppSetting' }; /** * Create the Client @@ -305,7 +313,7 @@ const config = { "value": "prisma-client-js" }, "output": { - "value": "/root/mailcleaner/backend/node_modules/@prisma/client", + "value": "/app/node_modules/@prisma/client", "fromEnvVar": null }, "config": { @@ -319,10 +327,11 @@ const config = { } ], "previewFeatures": [], - "sourceFilePath": "/root/mailcleaner/backend/prisma/schema.prisma" + "sourceFilePath": "/app/prisma/schema.prisma" }, "relativeEnvPaths": { - "rootEnvPath": null + "rootEnvPath": null, + "schemaEnvPath": "../../../.env" }, "relativePath": "../../../prisma", "clientVersion": "5.22.0", @@ -331,6 +340,7 @@ const config = { "db" ], "activeProvider": "postgresql", + "postinstall": false, "inlineDatasources": { "db": { "url": { @@ -339,13 +349,13 @@ const config = { } } }, - "inlineSchema": "generator client {\n provider = \"prisma-client-js\"\n}\n\ndatasource db {\n provider = \"postgresql\"\n url = env(\"DATABASE_URL\")\n}\n\nenum MailProvider {\n GMAIL\n GMX\n WEBDE\n}\n\nenum UserRole {\n USER\n ADMIN\n}\n\nenum JobStatus {\n QUEUED\n RUNNING\n SUCCEEDED\n FAILED\n CANCELED\n}\n\nenum RuleActionType {\n MOVE\n DELETE\n ARCHIVE\n LABEL\n}\n\nenum RuleConditionType {\n HEADER\n SUBJECT\n FROM\n LIST_UNSUBSCRIBE\n LIST_ID\n}\n\nmodel Tenant {\n id String @id @default(cuid())\n name String\n isActive Boolean @default(true)\n exportJobs ExportJob[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n users User[]\n mailboxAccounts MailboxAccount[]\n rules Rule[]\n jobs CleanupJob[]\n}\n\nenum ExportStatus {\n QUEUED\n RUNNING\n DONE\n FAILED\n}\n\nmodel ExportJob {\n id String @id @default(cuid())\n tenantId String\n status ExportStatus @default(QUEUED)\n format String\n scope String\n progress Int @default(0)\n filePath String?\n error String?\n expiresAt DateTime?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n tenant Tenant @relation(fields: [tenantId], references: [id])\n\n @@index([tenantId])\n}\n\nmodel User {\n id String @id @default(cuid())\n tenantId String\n email String @unique\n password String\n role UserRole @default(USER)\n isActive Boolean @default(true)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n tenant Tenant @relation(fields: [tenantId], references: [id])\n}\n\nmodel MailboxAccount {\n id String @id @default(cuid())\n tenantId String\n email String\n provider MailProvider\n isActive Boolean @default(true)\n imapHost String\n imapPort Int\n imapTLS Boolean\n smtpHost String?\n smtpPort Int?\n smtpTLS Boolean?\n oauthToken String?\n oauthRefreshToken String?\n oauthAccessToken String?\n oauthExpiresAt DateTime?\n providerUserId String?\n oauthLastCheckedAt DateTime?\n oauthLastErrorCode String?\n appPassword String?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n tenant Tenant @relation(fields: [tenantId], references: [id])\n folders MailboxFolder[]\n jobs CleanupJob[]\n\n @@index([tenantId])\n}\n\nmodel MailboxFolder {\n id String @id @default(cuid())\n mailboxAccountId String\n name String\n remoteId String?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n mailboxAccount MailboxAccount @relation(fields: [mailboxAccountId], references: [id])\n mailItems MailItem[]\n\n @@index([mailboxAccountId])\n}\n\nmodel MailItem {\n id String @id @default(cuid())\n folderId String\n messageId String\n subject String?\n from String?\n receivedAt DateTime?\n listId String?\n listUnsubscribe String?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n folder MailboxFolder @relation(fields: [folderId], references: [id])\n\n @@index([folderId])\n @@index([messageId])\n}\n\nmodel Rule {\n id String @id @default(cuid())\n tenantId String\n name String\n enabled Boolean @default(true)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n tenant Tenant @relation(fields: [tenantId], references: [id])\n conditions RuleCondition[]\n actions RuleAction[]\n\n @@index([tenantId])\n}\n\nmodel RuleCondition {\n id String @id @default(cuid())\n ruleId String\n type RuleConditionType\n value String\n\n rule Rule @relation(fields: [ruleId], references: [id])\n\n @@index([ruleId])\n}\n\nmodel RuleAction {\n id String @id @default(cuid())\n ruleId String\n type RuleActionType\n target String?\n\n rule Rule @relation(fields: [ruleId], references: [id])\n\n @@index([ruleId])\n}\n\nmodel CleanupJob {\n id String @id @default(cuid())\n tenantId String\n mailboxAccountId String\n status JobStatus @default(QUEUED)\n dryRun Boolean @default(true)\n unsubscribeEnabled Boolean @default(true)\n routingEnabled Boolean @default(true)\n startedAt DateTime?\n finishedAt DateTime?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n tenant Tenant @relation(fields: [tenantId], references: [id])\n mailboxAccount MailboxAccount @relation(fields: [mailboxAccountId], references: [id])\n unsubscribeAttempts UnsubscribeAttempt[]\n events CleanupJobEvent[]\n\n @@index([tenantId])\n @@index([mailboxAccountId])\n}\n\nmodel UnsubscribeAttempt {\n id String @id @default(cuid())\n jobId String\n mailItemId String?\n method String\n target String\n status String\n createdAt DateTime @default(now())\n\n job CleanupJob @relation(fields: [jobId], references: [id])\n\n @@index([jobId])\n}\n\nmodel CleanupJobEvent {\n id String @id @default(cuid())\n jobId String\n level String\n message String\n progress Int?\n createdAt DateTime @default(now())\n\n job CleanupJob @relation(fields: [jobId], references: [id])\n\n @@index([jobId])\n}\n", - "inlineSchemaHash": "8215bb521bb81721fac5b205bca5af7a38690fa4cc8087b4b16d7967edb43359", + "inlineSchema": "generator client {\n provider = \"prisma-client-js\"\n}\n\ndatasource db {\n provider = \"postgresql\"\n url = env(\"DATABASE_URL\")\n}\n\nenum MailProvider {\n GMAIL\n GMX\n WEBDE\n}\n\nenum UserRole {\n USER\n ADMIN\n}\n\nenum JobStatus {\n QUEUED\n RUNNING\n SUCCEEDED\n FAILED\n CANCELED\n}\n\nenum RuleActionType {\n MOVE\n DELETE\n ARCHIVE\n LABEL\n}\n\nenum RuleConditionType {\n HEADER\n SUBJECT\n FROM\n LIST_UNSUBSCRIBE\n LIST_ID\n}\n\nenum ExportStatus {\n QUEUED\n RUNNING\n DONE\n FAILED\n}\n\nmodel Tenant {\n id String @id @default(cuid())\n name String\n isActive Boolean @default(true)\n exportJobs ExportJob[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n users User[]\n mailboxAccounts MailboxAccount[]\n rules Rule[]\n jobs CleanupJob[]\n}\n\nmodel ExportJob {\n id String @id @default(cuid())\n tenantId String\n status ExportStatus @default(QUEUED)\n format String\n scope String\n progress Int @default(0)\n filePath String?\n error String?\n expiresAt DateTime?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n tenant Tenant @relation(fields: [tenantId], references: [id])\n\n @@index([tenantId])\n}\n\nmodel User {\n id String @id @default(cuid())\n tenantId String\n email String @unique\n password String\n role UserRole @default(USER)\n isActive Boolean @default(true)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n tenant Tenant @relation(fields: [tenantId], references: [id])\n}\n\nmodel MailboxAccount {\n id String @id @default(cuid())\n tenantId String\n email String\n provider MailProvider\n isActive Boolean @default(true)\n imapHost String\n imapPort Int\n imapTLS Boolean\n smtpHost String?\n smtpPort Int?\n smtpTLS Boolean?\n oauthToken String?\n oauthRefreshToken String?\n oauthAccessToken String?\n oauthExpiresAt DateTime?\n providerUserId String?\n oauthLastCheckedAt DateTime?\n oauthLastErrorCode String?\n appPassword String?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n tenant Tenant @relation(fields: [tenantId], references: [id])\n folders MailboxFolder[]\n jobs CleanupJob[]\n\n @@index([tenantId])\n}\n\nmodel MailboxFolder {\n id String @id @default(cuid())\n mailboxAccountId String\n name String\n remoteId String?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n mailboxAccount MailboxAccount @relation(fields: [mailboxAccountId], references: [id])\n mailItems MailItem[]\n\n @@index([mailboxAccountId])\n}\n\nmodel MailItem {\n id String @id @default(cuid())\n folderId String\n messageId String\n subject String?\n from String?\n receivedAt DateTime?\n listId String?\n listUnsubscribe String?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n folder MailboxFolder @relation(fields: [folderId], references: [id])\n\n @@index([folderId])\n @@index([messageId])\n}\n\nmodel Rule {\n id String @id @default(cuid())\n tenantId String\n name String\n enabled Boolean @default(true)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n tenant Tenant @relation(fields: [tenantId], references: [id])\n conditions RuleCondition[]\n actions RuleAction[]\n\n @@index([tenantId])\n}\n\nmodel RuleCondition {\n id String @id @default(cuid())\n ruleId String\n type RuleConditionType\n value String\n\n rule Rule @relation(fields: [ruleId], references: [id])\n\n @@index([ruleId])\n}\n\nmodel RuleAction {\n id String @id @default(cuid())\n ruleId String\n type RuleActionType\n target String?\n\n rule Rule @relation(fields: [ruleId], references: [id])\n\n @@index([ruleId])\n}\n\nmodel CleanupJob {\n id String @id @default(cuid())\n tenantId String\n mailboxAccountId String\n status JobStatus @default(QUEUED)\n dryRun Boolean @default(true)\n unsubscribeEnabled Boolean @default(true)\n routingEnabled Boolean @default(true)\n startedAt DateTime?\n finishedAt DateTime?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n tenant Tenant @relation(fields: [tenantId], references: [id])\n mailboxAccount MailboxAccount @relation(fields: [mailboxAccountId], references: [id])\n unsubscribeAttempts UnsubscribeAttempt[]\n events CleanupJobEvent[]\n\n @@index([tenantId])\n @@index([mailboxAccountId])\n}\n\nmodel UnsubscribeAttempt {\n id String @id @default(cuid())\n jobId String\n mailItemId String?\n method String\n target String\n status String\n createdAt DateTime @default(now())\n\n job CleanupJob @relation(fields: [jobId], references: [id])\n\n @@index([jobId])\n}\n\nmodel CleanupJobEvent {\n id String @id @default(cuid())\n jobId String\n level String\n message String\n progress Int?\n createdAt DateTime @default(now())\n\n job CleanupJob @relation(fields: [jobId], references: [id])\n\n @@index([jobId])\n}\n\nmodel AppSetting {\n id String @id @default(cuid())\n key String @unique\n value String\n updatedAt DateTime @updatedAt\n}\n", + "inlineSchemaHash": "a722a25b5f786847581c71e94e2c62c6a9680977a2bde0ff3dca71f63aec1155", "copyEngine": true } config.dirname = '/' -config.runtimeDataModel = JSON.parse("{\"models\":{\"Tenant\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"cuid\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"exportJobs\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ExportJob\",\"relationName\":\"ExportJobToTenant\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"users\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"relationName\":\"TenantToUser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mailboxAccounts\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MailboxAccount\",\"relationName\":\"MailboxAccountToTenant\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"rules\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Rule\",\"relationName\":\"RuleToTenant\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"jobs\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"CleanupJob\",\"relationName\":\"CleanupJobToTenant\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ExportJob\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"cuid\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"tenantId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"status\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"ExportStatus\",\"default\":\"QUEUED\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"format\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"scope\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"progress\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"filePath\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"error\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"tenant\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Tenant\",\"relationName\":\"ExportJobToTenant\",\"relationFromFields\":[\"tenantId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"User\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"cuid\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"tenantId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"email\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"password\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"role\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"UserRole\",\"default\":\"USER\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"tenant\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Tenant\",\"relationName\":\"TenantToUser\",\"relationFromFields\":[\"tenantId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"MailboxAccount\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"cuid\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"tenantId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"email\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"provider\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MailProvider\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"imapHost\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"imapPort\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"imapTLS\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Boolean\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"smtpHost\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"smtpPort\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"smtpTLS\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Boolean\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"oauthToken\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"oauthRefreshToken\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"oauthAccessToken\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"oauthExpiresAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"providerUserId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"oauthLastCheckedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"oauthLastErrorCode\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"appPassword\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"tenant\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Tenant\",\"relationName\":\"MailboxAccountToTenant\",\"relationFromFields\":[\"tenantId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"folders\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MailboxFolder\",\"relationName\":\"MailboxAccountToMailboxFolder\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"jobs\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"CleanupJob\",\"relationName\":\"CleanupJobToMailboxAccount\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"MailboxFolder\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"cuid\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mailboxAccountId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"remoteId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"mailboxAccount\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MailboxAccount\",\"relationName\":\"MailboxAccountToMailboxFolder\",\"relationFromFields\":[\"mailboxAccountId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mailItems\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MailItem\",\"relationName\":\"MailItemToMailboxFolder\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"MailItem\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"cuid\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"folderId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"messageId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"subject\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"from\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"receivedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"listId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"listUnsubscribe\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"folder\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MailboxFolder\",\"relationName\":\"MailItemToMailboxFolder\",\"relationFromFields\":[\"folderId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Rule\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"cuid\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"tenantId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"enabled\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"tenant\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Tenant\",\"relationName\":\"RuleToTenant\",\"relationFromFields\":[\"tenantId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"conditions\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"RuleCondition\",\"relationName\":\"RuleToRuleCondition\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"actions\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"RuleAction\",\"relationName\":\"RuleToRuleAction\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"RuleCondition\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"cuid\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"ruleId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"RuleConditionType\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"value\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"rule\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Rule\",\"relationName\":\"RuleToRuleCondition\",\"relationFromFields\":[\"ruleId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"RuleAction\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"cuid\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"ruleId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"RuleActionType\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"target\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"rule\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Rule\",\"relationName\":\"RuleToRuleAction\",\"relationFromFields\":[\"ruleId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"CleanupJob\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"cuid\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"tenantId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mailboxAccountId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"status\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"JobStatus\",\"default\":\"QUEUED\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"dryRun\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"unsubscribeEnabled\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"routingEnabled\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"startedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"finishedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"tenant\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Tenant\",\"relationName\":\"CleanupJobToTenant\",\"relationFromFields\":[\"tenantId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mailboxAccount\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MailboxAccount\",\"relationName\":\"CleanupJobToMailboxAccount\",\"relationFromFields\":[\"mailboxAccountId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"unsubscribeAttempts\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"UnsubscribeAttempt\",\"relationName\":\"CleanupJobToUnsubscribeAttempt\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"events\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"CleanupJobEvent\",\"relationName\":\"CleanupJobToCleanupJobEvent\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"UnsubscribeAttempt\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"cuid\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"jobId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mailItemId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"method\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"target\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"status\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"job\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"CleanupJob\",\"relationName\":\"CleanupJobToUnsubscribeAttempt\",\"relationFromFields\":[\"jobId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"CleanupJobEvent\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"cuid\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"jobId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"level\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"message\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"progress\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"job\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"CleanupJob\",\"relationName\":\"CleanupJobToCleanupJobEvent\",\"relationFromFields\":[\"jobId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false}},\"enums\":{\"MailProvider\":{\"values\":[{\"name\":\"GMAIL\",\"dbName\":null},{\"name\":\"GMX\",\"dbName\":null},{\"name\":\"WEBDE\",\"dbName\":null}],\"dbName\":null},\"UserRole\":{\"values\":[{\"name\":\"USER\",\"dbName\":null},{\"name\":\"ADMIN\",\"dbName\":null}],\"dbName\":null},\"JobStatus\":{\"values\":[{\"name\":\"QUEUED\",\"dbName\":null},{\"name\":\"RUNNING\",\"dbName\":null},{\"name\":\"SUCCEEDED\",\"dbName\":null},{\"name\":\"FAILED\",\"dbName\":null},{\"name\":\"CANCELED\",\"dbName\":null}],\"dbName\":null},\"RuleActionType\":{\"values\":[{\"name\":\"MOVE\",\"dbName\":null},{\"name\":\"DELETE\",\"dbName\":null},{\"name\":\"ARCHIVE\",\"dbName\":null},{\"name\":\"LABEL\",\"dbName\":null}],\"dbName\":null},\"RuleConditionType\":{\"values\":[{\"name\":\"HEADER\",\"dbName\":null},{\"name\":\"SUBJECT\",\"dbName\":null},{\"name\":\"FROM\",\"dbName\":null},{\"name\":\"LIST_UNSUBSCRIBE\",\"dbName\":null},{\"name\":\"LIST_ID\",\"dbName\":null}],\"dbName\":null},\"ExportStatus\":{\"values\":[{\"name\":\"QUEUED\",\"dbName\":null},{\"name\":\"RUNNING\",\"dbName\":null},{\"name\":\"DONE\",\"dbName\":null},{\"name\":\"FAILED\",\"dbName\":null}],\"dbName\":null}},\"types\":{}}") +config.runtimeDataModel = JSON.parse("{\"models\":{\"Tenant\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"cuid\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"exportJobs\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ExportJob\",\"relationName\":\"ExportJobToTenant\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"users\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"relationName\":\"TenantToUser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mailboxAccounts\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MailboxAccount\",\"relationName\":\"MailboxAccountToTenant\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"rules\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Rule\",\"relationName\":\"RuleToTenant\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"jobs\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"CleanupJob\",\"relationName\":\"CleanupJobToTenant\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ExportJob\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"cuid\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"tenantId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"status\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"ExportStatus\",\"default\":\"QUEUED\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"format\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"scope\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"progress\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"filePath\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"error\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"tenant\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Tenant\",\"relationName\":\"ExportJobToTenant\",\"relationFromFields\":[\"tenantId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"User\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"cuid\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"tenantId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"email\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"password\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"role\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"UserRole\",\"default\":\"USER\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"tenant\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Tenant\",\"relationName\":\"TenantToUser\",\"relationFromFields\":[\"tenantId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"MailboxAccount\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"cuid\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"tenantId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"email\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"provider\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MailProvider\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"imapHost\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"imapPort\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"imapTLS\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Boolean\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"smtpHost\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"smtpPort\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"smtpTLS\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Boolean\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"oauthToken\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"oauthRefreshToken\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"oauthAccessToken\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"oauthExpiresAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"providerUserId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"oauthLastCheckedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"oauthLastErrorCode\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"appPassword\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"tenant\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Tenant\",\"relationName\":\"MailboxAccountToTenant\",\"relationFromFields\":[\"tenantId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"folders\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MailboxFolder\",\"relationName\":\"MailboxAccountToMailboxFolder\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"jobs\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"CleanupJob\",\"relationName\":\"CleanupJobToMailboxAccount\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"MailboxFolder\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"cuid\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mailboxAccountId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"remoteId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"mailboxAccount\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MailboxAccount\",\"relationName\":\"MailboxAccountToMailboxFolder\",\"relationFromFields\":[\"mailboxAccountId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mailItems\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MailItem\",\"relationName\":\"MailItemToMailboxFolder\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"MailItem\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"cuid\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"folderId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"messageId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"subject\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"from\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"receivedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"listId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"listUnsubscribe\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"folder\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MailboxFolder\",\"relationName\":\"MailItemToMailboxFolder\",\"relationFromFields\":[\"folderId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Rule\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"cuid\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"tenantId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"enabled\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"tenant\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Tenant\",\"relationName\":\"RuleToTenant\",\"relationFromFields\":[\"tenantId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"conditions\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"RuleCondition\",\"relationName\":\"RuleToRuleCondition\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"actions\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"RuleAction\",\"relationName\":\"RuleToRuleAction\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"RuleCondition\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"cuid\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"ruleId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"RuleConditionType\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"value\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"rule\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Rule\",\"relationName\":\"RuleToRuleCondition\",\"relationFromFields\":[\"ruleId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"RuleAction\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"cuid\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"ruleId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"RuleActionType\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"target\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"rule\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Rule\",\"relationName\":\"RuleToRuleAction\",\"relationFromFields\":[\"ruleId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"CleanupJob\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"cuid\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"tenantId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mailboxAccountId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"status\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"JobStatus\",\"default\":\"QUEUED\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"dryRun\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"unsubscribeEnabled\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"routingEnabled\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"startedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"finishedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"tenant\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Tenant\",\"relationName\":\"CleanupJobToTenant\",\"relationFromFields\":[\"tenantId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mailboxAccount\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MailboxAccount\",\"relationName\":\"CleanupJobToMailboxAccount\",\"relationFromFields\":[\"mailboxAccountId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"unsubscribeAttempts\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"UnsubscribeAttempt\",\"relationName\":\"CleanupJobToUnsubscribeAttempt\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"events\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"CleanupJobEvent\",\"relationName\":\"CleanupJobToCleanupJobEvent\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"UnsubscribeAttempt\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"cuid\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"jobId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mailItemId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"method\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"target\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"status\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"job\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"CleanupJob\",\"relationName\":\"CleanupJobToUnsubscribeAttempt\",\"relationFromFields\":[\"jobId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"CleanupJobEvent\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"cuid\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"jobId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"level\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"message\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"progress\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"job\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"CleanupJob\",\"relationName\":\"CleanupJobToCleanupJobEvent\",\"relationFromFields\":[\"jobId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"AppSetting\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"cuid\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"key\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"value\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false}},\"enums\":{\"MailProvider\":{\"values\":[{\"name\":\"GMAIL\",\"dbName\":null},{\"name\":\"GMX\",\"dbName\":null},{\"name\":\"WEBDE\",\"dbName\":null}],\"dbName\":null},\"UserRole\":{\"values\":[{\"name\":\"USER\",\"dbName\":null},{\"name\":\"ADMIN\",\"dbName\":null}],\"dbName\":null},\"JobStatus\":{\"values\":[{\"name\":\"QUEUED\",\"dbName\":null},{\"name\":\"RUNNING\",\"dbName\":null},{\"name\":\"SUCCEEDED\",\"dbName\":null},{\"name\":\"FAILED\",\"dbName\":null},{\"name\":\"CANCELED\",\"dbName\":null}],\"dbName\":null},\"RuleActionType\":{\"values\":[{\"name\":\"MOVE\",\"dbName\":null},{\"name\":\"DELETE\",\"dbName\":null},{\"name\":\"ARCHIVE\",\"dbName\":null},{\"name\":\"LABEL\",\"dbName\":null}],\"dbName\":null},\"RuleConditionType\":{\"values\":[{\"name\":\"HEADER\",\"dbName\":null},{\"name\":\"SUBJECT\",\"dbName\":null},{\"name\":\"FROM\",\"dbName\":null},{\"name\":\"LIST_UNSUBSCRIBE\",\"dbName\":null},{\"name\":\"LIST_ID\",\"dbName\":null}],\"dbName\":null},\"ExportStatus\":{\"values\":[{\"name\":\"QUEUED\",\"dbName\":null},{\"name\":\"RUNNING\",\"dbName\":null},{\"name\":\"DONE\",\"dbName\":null},{\"name\":\"FAILED\",\"dbName\":null}],\"dbName\":null}},\"types\":{}}") defineDmmfProperty(exports.Prisma, config.runtimeDataModel) config.engineWasm = undefined diff --git a/backend/node_modules/.prisma/client/index-browser.js b/backend/node_modules/.prisma/client/index-browser.js index 73a23795..19f67e83 100644 --- a/backend/node_modules/.prisma/client/index-browser.js +++ b/backend/node_modules/.prisma/client/index-browser.js @@ -257,6 +257,13 @@ exports.Prisma.CleanupJobEventScalarFieldEnum = { createdAt: 'createdAt' }; +exports.Prisma.AppSettingScalarFieldEnum = { + id: 'id', + key: 'key', + value: 'value', + updatedAt: 'updatedAt' +}; + exports.Prisma.SortOrder = { asc: 'asc', desc: 'desc' @@ -324,7 +331,8 @@ exports.Prisma.ModelName = { RuleAction: 'RuleAction', CleanupJob: 'CleanupJob', UnsubscribeAttempt: 'UnsubscribeAttempt', - CleanupJobEvent: 'CleanupJobEvent' + CleanupJobEvent: 'CleanupJobEvent', + AppSetting: 'AppSetting' }; /** diff --git a/backend/node_modules/.prisma/client/index.d.ts b/backend/node_modules/.prisma/client/index.d.ts index 1024616c..c8a491a0 100644 --- a/backend/node_modules/.prisma/client/index.d.ts +++ b/backend/node_modules/.prisma/client/index.d.ts @@ -73,6 +73,11 @@ export type UnsubscribeAttempt = $Result.DefaultSelection +/** + * Model AppSetting + * + */ +export type AppSetting = $Result.DefaultSelection /** * Enums @@ -404,6 +409,16 @@ export class PrismaClient< * ``` */ get cleanupJobEvent(): Prisma.CleanupJobEventDelegate; + + /** + * `prisma.appSetting`: Exposes CRUD operations for the **AppSetting** model. + * Example usage: + * ```ts + * // Fetch zero or more AppSettings + * const appSettings = await prisma.appSetting.findMany() + * ``` + */ + get appSetting(): Prisma.AppSettingDelegate; } export namespace Prisma { @@ -856,7 +871,8 @@ export namespace Prisma { RuleAction: 'RuleAction', CleanupJob: 'CleanupJob', UnsubscribeAttempt: 'UnsubscribeAttempt', - CleanupJobEvent: 'CleanupJobEvent' + CleanupJobEvent: 'CleanupJobEvent', + AppSetting: 'AppSetting' }; export type ModelName = (typeof ModelName)[keyof typeof ModelName] @@ -872,7 +888,7 @@ export namespace Prisma { export type TypeMap = { meta: { - modelProps: "tenant" | "exportJob" | "user" | "mailboxAccount" | "mailboxFolder" | "mailItem" | "rule" | "ruleCondition" | "ruleAction" | "cleanupJob" | "unsubscribeAttempt" | "cleanupJobEvent" + modelProps: "tenant" | "exportJob" | "user" | "mailboxAccount" | "mailboxFolder" | "mailItem" | "rule" | "ruleCondition" | "ruleAction" | "cleanupJob" | "unsubscribeAttempt" | "cleanupJobEvent" | "appSetting" txIsolationLevel: Prisma.TransactionIsolationLevel } model: { @@ -1716,6 +1732,76 @@ export namespace Prisma { } } } + AppSetting: { + payload: Prisma.$AppSettingPayload + fields: Prisma.AppSettingFieldRefs + operations: { + findUnique: { + args: Prisma.AppSettingFindUniqueArgs + result: $Utils.PayloadToResult | null + } + findUniqueOrThrow: { + args: Prisma.AppSettingFindUniqueOrThrowArgs + result: $Utils.PayloadToResult + } + findFirst: { + args: Prisma.AppSettingFindFirstArgs + result: $Utils.PayloadToResult | null + } + findFirstOrThrow: { + args: Prisma.AppSettingFindFirstOrThrowArgs + result: $Utils.PayloadToResult + } + findMany: { + args: Prisma.AppSettingFindManyArgs + result: $Utils.PayloadToResult[] + } + create: { + args: Prisma.AppSettingCreateArgs + result: $Utils.PayloadToResult + } + createMany: { + args: Prisma.AppSettingCreateManyArgs + result: BatchPayload + } + createManyAndReturn: { + args: Prisma.AppSettingCreateManyAndReturnArgs + result: $Utils.PayloadToResult[] + } + delete: { + args: Prisma.AppSettingDeleteArgs + result: $Utils.PayloadToResult + } + update: { + args: Prisma.AppSettingUpdateArgs + result: $Utils.PayloadToResult + } + deleteMany: { + args: Prisma.AppSettingDeleteManyArgs + result: BatchPayload + } + updateMany: { + args: Prisma.AppSettingUpdateManyArgs + result: BatchPayload + } + upsert: { + args: Prisma.AppSettingUpsertArgs + result: $Utils.PayloadToResult + } + aggregate: { + args: Prisma.AppSettingAggregateArgs + result: $Utils.Optional + } + groupBy: { + args: Prisma.AppSettingGroupByArgs + result: $Utils.Optional[] + } + count: { + args: Prisma.AppSettingCountArgs + result: $Utils.Optional | number + } + } + } } } & { other: { @@ -14157,6 +14243,872 @@ export namespace Prisma { } + /** + * Model AppSetting + */ + + export type AggregateAppSetting = { + _count: AppSettingCountAggregateOutputType | null + _min: AppSettingMinAggregateOutputType | null + _max: AppSettingMaxAggregateOutputType | null + } + + export type AppSettingMinAggregateOutputType = { + id: string | null + key: string | null + value: string | null + updatedAt: Date | null + } + + export type AppSettingMaxAggregateOutputType = { + id: string | null + key: string | null + value: string | null + updatedAt: Date | null + } + + export type AppSettingCountAggregateOutputType = { + id: number + key: number + value: number + updatedAt: number + _all: number + } + + + export type AppSettingMinAggregateInputType = { + id?: true + key?: true + value?: true + updatedAt?: true + } + + export type AppSettingMaxAggregateInputType = { + id?: true + key?: true + value?: true + updatedAt?: true + } + + export type AppSettingCountAggregateInputType = { + id?: true + key?: true + value?: true + updatedAt?: true + _all?: true + } + + export type AppSettingAggregateArgs = { + /** + * Filter which AppSetting to aggregate. + */ + where?: AppSettingWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of AppSettings to fetch. + */ + orderBy?: AppSettingOrderByWithRelationInput | AppSettingOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the start position + */ + cursor?: AppSettingWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` AppSettings from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` AppSettings. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Count returned AppSettings + **/ + _count?: true | AppSettingCountAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to find the minimum value + **/ + _min?: AppSettingMinAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to find the maximum value + **/ + _max?: AppSettingMaxAggregateInputType + } + + export type GetAppSettingAggregateType = { + [P in keyof T & keyof AggregateAppSetting]: P extends '_count' | 'count' + ? T[P] extends true + ? number + : GetScalarType + : GetScalarType + } + + + + + export type AppSettingGroupByArgs = { + where?: AppSettingWhereInput + orderBy?: AppSettingOrderByWithAggregationInput | AppSettingOrderByWithAggregationInput[] + by: AppSettingScalarFieldEnum[] | AppSettingScalarFieldEnum + having?: AppSettingScalarWhereWithAggregatesInput + take?: number + skip?: number + _count?: AppSettingCountAggregateInputType | true + _min?: AppSettingMinAggregateInputType + _max?: AppSettingMaxAggregateInputType + } + + export type AppSettingGroupByOutputType = { + id: string + key: string + value: string + updatedAt: Date + _count: AppSettingCountAggregateOutputType | null + _min: AppSettingMinAggregateOutputType | null + _max: AppSettingMaxAggregateOutputType | null + } + + type GetAppSettingGroupByPayload = Prisma.PrismaPromise< + Array< + PickEnumerable & + { + [P in ((keyof T) & (keyof AppSettingGroupByOutputType))]: P extends '_count' + ? T[P] extends boolean + ? number + : GetScalarType + : GetScalarType + } + > + > + + + export type AppSettingSelect = $Extensions.GetSelect<{ + id?: boolean + key?: boolean + value?: boolean + updatedAt?: boolean + }, ExtArgs["result"]["appSetting"]> + + export type AppSettingSelectCreateManyAndReturn = $Extensions.GetSelect<{ + id?: boolean + key?: boolean + value?: boolean + updatedAt?: boolean + }, ExtArgs["result"]["appSetting"]> + + export type AppSettingSelectScalar = { + id?: boolean + key?: boolean + value?: boolean + updatedAt?: boolean + } + + + export type $AppSettingPayload = { + name: "AppSetting" + objects: {} + scalars: $Extensions.GetPayloadResult<{ + id: string + key: string + value: string + updatedAt: Date + }, ExtArgs["result"]["appSetting"]> + composites: {} + } + + type AppSettingGetPayload = $Result.GetResult + + type AppSettingCountArgs = + Omit & { + select?: AppSettingCountAggregateInputType | true + } + + export interface AppSettingDelegate { + [K: symbol]: { types: Prisma.TypeMap['model']['AppSetting'], meta: { name: 'AppSetting' } } + /** + * Find zero or one AppSetting that matches the filter. + * @param {AppSettingFindUniqueArgs} args - Arguments to find a AppSetting + * @example + * // Get one AppSetting + * const appSetting = await prisma.appSetting.findUnique({ + * where: { + * // ... provide filter here + * } + * }) + */ + findUnique(args: SelectSubset>): Prisma__AppSettingClient<$Result.GetResult, T, "findUnique"> | null, null, ExtArgs> + + /** + * Find one AppSetting that matches the filter or throw an error with `error.code='P2025'` + * if no matches were found. + * @param {AppSettingFindUniqueOrThrowArgs} args - Arguments to find a AppSetting + * @example + * // Get one AppSetting + * const appSetting = await prisma.appSetting.findUniqueOrThrow({ + * where: { + * // ... provide filter here + * } + * }) + */ + findUniqueOrThrow(args: SelectSubset>): Prisma__AppSettingClient<$Result.GetResult, T, "findUniqueOrThrow">, never, ExtArgs> + + /** + * Find the first AppSetting that matches the filter. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {AppSettingFindFirstArgs} args - Arguments to find a AppSetting + * @example + * // Get one AppSetting + * const appSetting = await prisma.appSetting.findFirst({ + * where: { + * // ... provide filter here + * } + * }) + */ + findFirst(args?: SelectSubset>): Prisma__AppSettingClient<$Result.GetResult, T, "findFirst"> | null, null, ExtArgs> + + /** + * Find the first AppSetting that matches the filter or + * throw `PrismaKnownClientError` with `P2025` code if no matches were found. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {AppSettingFindFirstOrThrowArgs} args - Arguments to find a AppSetting + * @example + * // Get one AppSetting + * const appSetting = await prisma.appSetting.findFirstOrThrow({ + * where: { + * // ... provide filter here + * } + * }) + */ + findFirstOrThrow(args?: SelectSubset>): Prisma__AppSettingClient<$Result.GetResult, T, "findFirstOrThrow">, never, ExtArgs> + + /** + * Find zero or more AppSettings that matches the filter. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {AppSettingFindManyArgs} args - Arguments to filter and select certain fields only. + * @example + * // Get all AppSettings + * const appSettings = await prisma.appSetting.findMany() + * + * // Get first 10 AppSettings + * const appSettings = await prisma.appSetting.findMany({ take: 10 }) + * + * // Only select the `id` + * const appSettingWithIdOnly = await prisma.appSetting.findMany({ select: { id: true } }) + * + */ + findMany(args?: SelectSubset>): Prisma.PrismaPromise<$Result.GetResult, T, "findMany">> + + /** + * Create a AppSetting. + * @param {AppSettingCreateArgs} args - Arguments to create a AppSetting. + * @example + * // Create one AppSetting + * const AppSetting = await prisma.appSetting.create({ + * data: { + * // ... data to create a AppSetting + * } + * }) + * + */ + create(args: SelectSubset>): Prisma__AppSettingClient<$Result.GetResult, T, "create">, never, ExtArgs> + + /** + * Create many AppSettings. + * @param {AppSettingCreateManyArgs} args - Arguments to create many AppSettings. + * @example + * // Create many AppSettings + * const appSetting = await prisma.appSetting.createMany({ + * data: [ + * // ... provide data here + * ] + * }) + * + */ + createMany(args?: SelectSubset>): Prisma.PrismaPromise + + /** + * Create many AppSettings and returns the data saved in the database. + * @param {AppSettingCreateManyAndReturnArgs} args - Arguments to create many AppSettings. + * @example + * // Create many AppSettings + * const appSetting = await prisma.appSetting.createManyAndReturn({ + * data: [ + * // ... provide data here + * ] + * }) + * + * // Create many AppSettings and only return the `id` + * const appSettingWithIdOnly = await prisma.appSetting.createManyAndReturn({ + * select: { id: true }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + createManyAndReturn(args?: SelectSubset>): Prisma.PrismaPromise<$Result.GetResult, T, "createManyAndReturn">> + + /** + * Delete a AppSetting. + * @param {AppSettingDeleteArgs} args - Arguments to delete one AppSetting. + * @example + * // Delete one AppSetting + * const AppSetting = await prisma.appSetting.delete({ + * where: { + * // ... filter to delete one AppSetting + * } + * }) + * + */ + delete(args: SelectSubset>): Prisma__AppSettingClient<$Result.GetResult, T, "delete">, never, ExtArgs> + + /** + * Update one AppSetting. + * @param {AppSettingUpdateArgs} args - Arguments to update one AppSetting. + * @example + * // Update one AppSetting + * const appSetting = await prisma.appSetting.update({ + * where: { + * // ... provide filter here + * }, + * data: { + * // ... provide data here + * } + * }) + * + */ + update(args: SelectSubset>): Prisma__AppSettingClient<$Result.GetResult, T, "update">, never, ExtArgs> + + /** + * Delete zero or more AppSettings. + * @param {AppSettingDeleteManyArgs} args - Arguments to filter AppSettings to delete. + * @example + * // Delete a few AppSettings + * const { count } = await prisma.appSetting.deleteMany({ + * where: { + * // ... provide filter here + * } + * }) + * + */ + deleteMany(args?: SelectSubset>): Prisma.PrismaPromise + + /** + * Update zero or more AppSettings. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {AppSettingUpdateManyArgs} args - Arguments to update one or more rows. + * @example + * // Update many AppSettings + * const appSetting = await prisma.appSetting.updateMany({ + * where: { + * // ... provide filter here + * }, + * data: { + * // ... provide data here + * } + * }) + * + */ + updateMany(args: SelectSubset>): Prisma.PrismaPromise + + /** + * Create or update one AppSetting. + * @param {AppSettingUpsertArgs} args - Arguments to update or create a AppSetting. + * @example + * // Update or create a AppSetting + * const appSetting = await prisma.appSetting.upsert({ + * create: { + * // ... data to create a AppSetting + * }, + * update: { + * // ... in case it already exists, update + * }, + * where: { + * // ... the filter for the AppSetting we want to update + * } + * }) + */ + upsert(args: SelectSubset>): Prisma__AppSettingClient<$Result.GetResult, T, "upsert">, never, ExtArgs> + + + /** + * Count the number of AppSettings. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {AppSettingCountArgs} args - Arguments to filter AppSettings to count. + * @example + * // Count the number of AppSettings + * const count = await prisma.appSetting.count({ + * where: { + * // ... the filter for the AppSettings we want to count + * } + * }) + **/ + count( + args?: Subset, + ): Prisma.PrismaPromise< + T extends $Utils.Record<'select', any> + ? T['select'] extends true + ? number + : GetScalarType + : number + > + + /** + * Allows you to perform aggregations operations on a AppSetting. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {AppSettingAggregateArgs} args - Select which aggregations you would like to apply and on what fields. + * @example + * // Ordered by age ascending + * // Where email contains prisma.io + * // Limited to the 10 users + * const aggregations = await prisma.user.aggregate({ + * _avg: { + * age: true, + * }, + * where: { + * email: { + * contains: "prisma.io", + * }, + * }, + * orderBy: { + * age: "asc", + * }, + * take: 10, + * }) + **/ + aggregate(args: Subset): Prisma.PrismaPromise> + + /** + * Group by AppSetting. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {AppSettingGroupByArgs} args - Group by arguments. + * @example + * // Group by city, order by createdAt, get count + * const result = await prisma.user.groupBy({ + * by: ['city', 'createdAt'], + * orderBy: { + * createdAt: true + * }, + * _count: { + * _all: true + * }, + * }) + * + **/ + groupBy< + T extends AppSettingGroupByArgs, + HasSelectOrTake extends Or< + Extends<'skip', Keys>, + Extends<'take', Keys> + >, + OrderByArg extends True extends HasSelectOrTake + ? { orderBy: AppSettingGroupByArgs['orderBy'] } + : { orderBy?: AppSettingGroupByArgs['orderBy'] }, + OrderFields extends ExcludeUnderscoreKeys>>, + ByFields extends MaybeTupleToUnion, + ByValid extends Has, + HavingFields extends GetHavingFields, + HavingValid extends Has, + ByEmpty extends T['by'] extends never[] ? True : False, + InputErrors extends ByEmpty extends True + ? `Error: "by" must not be empty.` + : HavingValid extends False + ? { + [P in HavingFields]: P extends ByFields + ? never + : P extends string + ? `Error: Field "${P}" used in "having" needs to be provided in "by".` + : [ + Error, + 'Field ', + P, + ` in "having" needs to be provided in "by"`, + ] + }[HavingFields] + : 'take' extends Keys + ? 'orderBy' extends Keys + ? ByValid extends True + ? {} + : { + [P in OrderFields]: P extends ByFields + ? never + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` + }[OrderFields] + : 'Error: If you provide "take", you also need to provide "orderBy"' + : 'skip' extends Keys + ? 'orderBy' extends Keys + ? ByValid extends True + ? {} + : { + [P in OrderFields]: P extends ByFields + ? never + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` + }[OrderFields] + : 'Error: If you provide "skip", you also need to provide "orderBy"' + : ByValid extends True + ? {} + : { + [P in OrderFields]: P extends ByFields + ? never + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` + }[OrderFields] + >(args: SubsetIntersection & InputErrors): {} extends InputErrors ? GetAppSettingGroupByPayload : Prisma.PrismaPromise + /** + * Fields of the AppSetting model + */ + readonly fields: AppSettingFieldRefs; + } + + /** + * The delegate class that acts as a "Promise-like" for AppSetting. + * Why is this prefixed with `Prisma__`? + * Because we want to prevent naming conflicts as mentioned in + * https://github.com/prisma/prisma-client-js/issues/707 + */ + export interface Prisma__AppSettingClient extends Prisma.PrismaPromise { + readonly [Symbol.toStringTag]: "PrismaPromise" + /** + * Attaches callbacks for the resolution and/or rejection of the Promise. + * @param onfulfilled The callback to execute when the Promise is resolved. + * @param onrejected The callback to execute when the Promise is rejected. + * @returns A Promise for the completion of which ever callback is executed. + */ + then(onfulfilled?: ((value: T) => TResult1 | PromiseLike) | undefined | null, onrejected?: ((reason: any) => TResult2 | PromiseLike) | undefined | null): $Utils.JsPromise + /** + * Attaches a callback for only the rejection of the Promise. + * @param onrejected The callback to execute when the Promise is rejected. + * @returns A Promise for the completion of the callback. + */ + catch(onrejected?: ((reason: any) => TResult | PromiseLike) | undefined | null): $Utils.JsPromise + /** + * Attaches a callback that is invoked when the Promise is settled (fulfilled or rejected). The + * resolved value cannot be modified from the callback. + * @param onfinally The callback to execute when the Promise is settled (fulfilled or rejected). + * @returns A Promise for the completion of the callback. + */ + finally(onfinally?: (() => void) | undefined | null): $Utils.JsPromise + } + + + + + /** + * Fields of the AppSetting model + */ + interface AppSettingFieldRefs { + readonly id: FieldRef<"AppSetting", 'String'> + readonly key: FieldRef<"AppSetting", 'String'> + readonly value: FieldRef<"AppSetting", 'String'> + readonly updatedAt: FieldRef<"AppSetting", 'DateTime'> + } + + + // Custom InputTypes + /** + * AppSetting findUnique + */ + export type AppSettingFindUniqueArgs = { + /** + * Select specific fields to fetch from the AppSetting + */ + select?: AppSettingSelect | null + /** + * Filter, which AppSetting to fetch. + */ + where: AppSettingWhereUniqueInput + } + + /** + * AppSetting findUniqueOrThrow + */ + export type AppSettingFindUniqueOrThrowArgs = { + /** + * Select specific fields to fetch from the AppSetting + */ + select?: AppSettingSelect | null + /** + * Filter, which AppSetting to fetch. + */ + where: AppSettingWhereUniqueInput + } + + /** + * AppSetting findFirst + */ + export type AppSettingFindFirstArgs = { + /** + * Select specific fields to fetch from the AppSetting + */ + select?: AppSettingSelect | null + /** + * Filter, which AppSetting to fetch. + */ + where?: AppSettingWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of AppSettings to fetch. + */ + orderBy?: AppSettingOrderByWithRelationInput | AppSettingOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the position for searching for AppSettings. + */ + cursor?: AppSettingWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` AppSettings from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` AppSettings. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/distinct Distinct Docs} + * + * Filter by unique combinations of AppSettings. + */ + distinct?: AppSettingScalarFieldEnum | AppSettingScalarFieldEnum[] + } + + /** + * AppSetting findFirstOrThrow + */ + export type AppSettingFindFirstOrThrowArgs = { + /** + * Select specific fields to fetch from the AppSetting + */ + select?: AppSettingSelect | null + /** + * Filter, which AppSetting to fetch. + */ + where?: AppSettingWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of AppSettings to fetch. + */ + orderBy?: AppSettingOrderByWithRelationInput | AppSettingOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the position for searching for AppSettings. + */ + cursor?: AppSettingWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` AppSettings from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` AppSettings. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/distinct Distinct Docs} + * + * Filter by unique combinations of AppSettings. + */ + distinct?: AppSettingScalarFieldEnum | AppSettingScalarFieldEnum[] + } + + /** + * AppSetting findMany + */ + export type AppSettingFindManyArgs = { + /** + * Select specific fields to fetch from the AppSetting + */ + select?: AppSettingSelect | null + /** + * Filter, which AppSettings to fetch. + */ + where?: AppSettingWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of AppSettings to fetch. + */ + orderBy?: AppSettingOrderByWithRelationInput | AppSettingOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the position for listing AppSettings. + */ + cursor?: AppSettingWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` AppSettings from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` AppSettings. + */ + skip?: number + distinct?: AppSettingScalarFieldEnum | AppSettingScalarFieldEnum[] + } + + /** + * AppSetting create + */ + export type AppSettingCreateArgs = { + /** + * Select specific fields to fetch from the AppSetting + */ + select?: AppSettingSelect | null + /** + * The data needed to create a AppSetting. + */ + data: XOR + } + + /** + * AppSetting createMany + */ + export type AppSettingCreateManyArgs = { + /** + * The data used to create many AppSettings. + */ + data: AppSettingCreateManyInput | AppSettingCreateManyInput[] + skipDuplicates?: boolean + } + + /** + * AppSetting createManyAndReturn + */ + export type AppSettingCreateManyAndReturnArgs = { + /** + * Select specific fields to fetch from the AppSetting + */ + select?: AppSettingSelectCreateManyAndReturn | null + /** + * The data used to create many AppSettings. + */ + data: AppSettingCreateManyInput | AppSettingCreateManyInput[] + skipDuplicates?: boolean + } + + /** + * AppSetting update + */ + export type AppSettingUpdateArgs = { + /** + * Select specific fields to fetch from the AppSetting + */ + select?: AppSettingSelect | null + /** + * The data needed to update a AppSetting. + */ + data: XOR + /** + * Choose, which AppSetting to update. + */ + where: AppSettingWhereUniqueInput + } + + /** + * AppSetting updateMany + */ + export type AppSettingUpdateManyArgs = { + /** + * The data used to update AppSettings. + */ + data: XOR + /** + * Filter which AppSettings to update + */ + where?: AppSettingWhereInput + } + + /** + * AppSetting upsert + */ + export type AppSettingUpsertArgs = { + /** + * Select specific fields to fetch from the AppSetting + */ + select?: AppSettingSelect | null + /** + * The filter to search for the AppSetting to update in case it exists. + */ + where: AppSettingWhereUniqueInput + /** + * In case the AppSetting found by the `where` argument doesn't exist, create a new AppSetting with this data. + */ + create: XOR + /** + * In case the AppSetting was found with the provided `where` argument, update it with this data. + */ + update: XOR + } + + /** + * AppSetting delete + */ + export type AppSettingDeleteArgs = { + /** + * Select specific fields to fetch from the AppSetting + */ + select?: AppSettingSelect | null + /** + * Filter which AppSetting to delete. + */ + where: AppSettingWhereUniqueInput + } + + /** + * AppSetting deleteMany + */ + export type AppSettingDeleteManyArgs = { + /** + * Filter which AppSettings to delete + */ + where?: AppSettingWhereInput + } + + /** + * AppSetting without action + */ + export type AppSettingDefaultArgs = { + /** + * Select specific fields to fetch from the AppSetting + */ + select?: AppSettingSelect | null + } + + /** * Enums */ @@ -14342,6 +15294,16 @@ export namespace Prisma { export type CleanupJobEventScalarFieldEnum = (typeof CleanupJobEventScalarFieldEnum)[keyof typeof CleanupJobEventScalarFieldEnum] + export const AppSettingScalarFieldEnum: { + id: 'id', + key: 'key', + value: 'value', + updatedAt: 'updatedAt' + }; + + export type AppSettingScalarFieldEnum = (typeof AppSettingScalarFieldEnum)[keyof typeof AppSettingScalarFieldEnum] + + export const SortOrder: { asc: 'asc', desc: 'desc' @@ -15418,6 +16380,53 @@ export namespace Prisma { createdAt?: DateTimeWithAggregatesFilter<"CleanupJobEvent"> | Date | string } + export type AppSettingWhereInput = { + AND?: AppSettingWhereInput | AppSettingWhereInput[] + OR?: AppSettingWhereInput[] + NOT?: AppSettingWhereInput | AppSettingWhereInput[] + id?: StringFilter<"AppSetting"> | string + key?: StringFilter<"AppSetting"> | string + value?: StringFilter<"AppSetting"> | string + updatedAt?: DateTimeFilter<"AppSetting"> | Date | string + } + + export type AppSettingOrderByWithRelationInput = { + id?: SortOrder + key?: SortOrder + value?: SortOrder + updatedAt?: SortOrder + } + + export type AppSettingWhereUniqueInput = Prisma.AtLeast<{ + id?: string + key?: string + AND?: AppSettingWhereInput | AppSettingWhereInput[] + OR?: AppSettingWhereInput[] + NOT?: AppSettingWhereInput | AppSettingWhereInput[] + value?: StringFilter<"AppSetting"> | string + updatedAt?: DateTimeFilter<"AppSetting"> | Date | string + }, "id" | "key"> + + export type AppSettingOrderByWithAggregationInput = { + id?: SortOrder + key?: SortOrder + value?: SortOrder + updatedAt?: SortOrder + _count?: AppSettingCountOrderByAggregateInput + _max?: AppSettingMaxOrderByAggregateInput + _min?: AppSettingMinOrderByAggregateInput + } + + export type AppSettingScalarWhereWithAggregatesInput = { + AND?: AppSettingScalarWhereWithAggregatesInput | AppSettingScalarWhereWithAggregatesInput[] + OR?: AppSettingScalarWhereWithAggregatesInput[] + NOT?: AppSettingScalarWhereWithAggregatesInput | AppSettingScalarWhereWithAggregatesInput[] + id?: StringWithAggregatesFilter<"AppSetting"> | string + key?: StringWithAggregatesFilter<"AppSetting"> | string + value?: StringWithAggregatesFilter<"AppSetting"> | string + updatedAt?: DateTimeWithAggregatesFilter<"AppSetting"> | Date | string + } + export type TenantCreateInput = { id?: string name: string @@ -16399,6 +17408,55 @@ export namespace Prisma { createdAt?: DateTimeFieldUpdateOperationsInput | Date | string } + export type AppSettingCreateInput = { + id?: string + key: string + value: string + updatedAt?: Date | string + } + + export type AppSettingUncheckedCreateInput = { + id?: string + key: string + value: string + updatedAt?: Date | string + } + + export type AppSettingUpdateInput = { + id?: StringFieldUpdateOperationsInput | string + key?: StringFieldUpdateOperationsInput | string + value?: StringFieldUpdateOperationsInput | string + updatedAt?: DateTimeFieldUpdateOperationsInput | Date | string + } + + export type AppSettingUncheckedUpdateInput = { + id?: StringFieldUpdateOperationsInput | string + key?: StringFieldUpdateOperationsInput | string + value?: StringFieldUpdateOperationsInput | string + updatedAt?: DateTimeFieldUpdateOperationsInput | Date | string + } + + export type AppSettingCreateManyInput = { + id?: string + key: string + value: string + updatedAt?: Date | string + } + + export type AppSettingUpdateManyMutationInput = { + id?: StringFieldUpdateOperationsInput | string + key?: StringFieldUpdateOperationsInput | string + value?: StringFieldUpdateOperationsInput | string + updatedAt?: DateTimeFieldUpdateOperationsInput | Date | string + } + + export type AppSettingUncheckedUpdateManyInput = { + id?: StringFieldUpdateOperationsInput | string + key?: StringFieldUpdateOperationsInput | string + value?: StringFieldUpdateOperationsInput | string + updatedAt?: DateTimeFieldUpdateOperationsInput | Date | string + } + export type StringFilter<$PrismaModel = never> = { equals?: string | StringFieldRefInput<$PrismaModel> in?: string[] | ListStringFieldRefInput<$PrismaModel> @@ -17268,6 +18326,27 @@ export namespace Prisma { progress?: SortOrder } + export type AppSettingCountOrderByAggregateInput = { + id?: SortOrder + key?: SortOrder + value?: SortOrder + updatedAt?: SortOrder + } + + export type AppSettingMaxOrderByAggregateInput = { + id?: SortOrder + key?: SortOrder + value?: SortOrder + updatedAt?: SortOrder + } + + export type AppSettingMinOrderByAggregateInput = { + id?: SortOrder + key?: SortOrder + value?: SortOrder + updatedAt?: SortOrder + } + export type ExportJobCreateNestedManyWithoutTenantInput = { create?: XOR | ExportJobCreateWithoutTenantInput[] | ExportJobUncheckedCreateWithoutTenantInput[] connectOrCreate?: ExportJobCreateOrConnectWithoutTenantInput | ExportJobCreateOrConnectWithoutTenantInput[] @@ -20543,6 +21622,10 @@ export namespace Prisma { * @deprecated Use CleanupJobEventDefaultArgs instead */ export type CleanupJobEventArgs = CleanupJobEventDefaultArgs + /** + * @deprecated Use AppSettingDefaultArgs instead + */ + export type AppSettingArgs = AppSettingDefaultArgs /** * Batch Payload for updateMany & deleteMany & createMany diff --git a/backend/node_modules/.prisma/client/index.js b/backend/node_modules/.prisma/client/index.js index 8dcda61d..4df09791 100644 --- a/backend/node_modules/.prisma/client/index.js +++ b/backend/node_modules/.prisma/client/index.js @@ -226,6 +226,13 @@ exports.Prisma.CleanupJobEventScalarFieldEnum = { createdAt: 'createdAt' }; +exports.Prisma.AppSettingScalarFieldEnum = { + id: 'id', + key: 'key', + value: 'value', + updatedAt: 'updatedAt' +}; + exports.Prisma.SortOrder = { asc: 'asc', desc: 'desc' @@ -293,7 +300,8 @@ exports.Prisma.ModelName = { RuleAction: 'RuleAction', CleanupJob: 'CleanupJob', UnsubscribeAttempt: 'UnsubscribeAttempt', - CleanupJobEvent: 'CleanupJobEvent' + CleanupJobEvent: 'CleanupJobEvent', + AppSetting: 'AppSetting' }; /** * Create the Client @@ -306,7 +314,7 @@ const config = { "value": "prisma-client-js" }, "output": { - "value": "/root/mailcleaner/backend/node_modules/@prisma/client", + "value": "/app/node_modules/@prisma/client", "fromEnvVar": null }, "config": { @@ -320,10 +328,11 @@ const config = { } ], "previewFeatures": [], - "sourceFilePath": "/root/mailcleaner/backend/prisma/schema.prisma" + "sourceFilePath": "/app/prisma/schema.prisma" }, "relativeEnvPaths": { - "rootEnvPath": null + "rootEnvPath": null, + "schemaEnvPath": "../../../.env" }, "relativePath": "../../../prisma", "clientVersion": "5.22.0", @@ -332,6 +341,7 @@ const config = { "db" ], "activeProvider": "postgresql", + "postinstall": false, "inlineDatasources": { "db": { "url": { @@ -340,8 +350,8 @@ const config = { } } }, - "inlineSchema": "generator client {\n provider = \"prisma-client-js\"\n}\n\ndatasource db {\n provider = \"postgresql\"\n url = env(\"DATABASE_URL\")\n}\n\nenum MailProvider {\n GMAIL\n GMX\n WEBDE\n}\n\nenum UserRole {\n USER\n ADMIN\n}\n\nenum JobStatus {\n QUEUED\n RUNNING\n SUCCEEDED\n FAILED\n CANCELED\n}\n\nenum RuleActionType {\n MOVE\n DELETE\n ARCHIVE\n LABEL\n}\n\nenum RuleConditionType {\n HEADER\n SUBJECT\n FROM\n LIST_UNSUBSCRIBE\n LIST_ID\n}\n\nmodel Tenant {\n id String @id @default(cuid())\n name String\n isActive Boolean @default(true)\n exportJobs ExportJob[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n users User[]\n mailboxAccounts MailboxAccount[]\n rules Rule[]\n jobs CleanupJob[]\n}\n\nenum ExportStatus {\n QUEUED\n RUNNING\n DONE\n FAILED\n}\n\nmodel ExportJob {\n id String @id @default(cuid())\n tenantId String\n status ExportStatus @default(QUEUED)\n format String\n scope String\n progress Int @default(0)\n filePath String?\n error String?\n expiresAt DateTime?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n tenant Tenant @relation(fields: [tenantId], references: [id])\n\n @@index([tenantId])\n}\n\nmodel User {\n id String @id @default(cuid())\n tenantId String\n email String @unique\n password String\n role UserRole @default(USER)\n isActive Boolean @default(true)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n tenant Tenant @relation(fields: [tenantId], references: [id])\n}\n\nmodel MailboxAccount {\n id String @id @default(cuid())\n tenantId String\n email String\n provider MailProvider\n isActive Boolean @default(true)\n imapHost String\n imapPort Int\n imapTLS Boolean\n smtpHost String?\n smtpPort Int?\n smtpTLS Boolean?\n oauthToken String?\n oauthRefreshToken String?\n oauthAccessToken String?\n oauthExpiresAt DateTime?\n providerUserId String?\n oauthLastCheckedAt DateTime?\n oauthLastErrorCode String?\n appPassword String?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n tenant Tenant @relation(fields: [tenantId], references: [id])\n folders MailboxFolder[]\n jobs CleanupJob[]\n\n @@index([tenantId])\n}\n\nmodel MailboxFolder {\n id String @id @default(cuid())\n mailboxAccountId String\n name String\n remoteId String?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n mailboxAccount MailboxAccount @relation(fields: [mailboxAccountId], references: [id])\n mailItems MailItem[]\n\n @@index([mailboxAccountId])\n}\n\nmodel MailItem {\n id String @id @default(cuid())\n folderId String\n messageId String\n subject String?\n from String?\n receivedAt DateTime?\n listId String?\n listUnsubscribe String?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n folder MailboxFolder @relation(fields: [folderId], references: [id])\n\n @@index([folderId])\n @@index([messageId])\n}\n\nmodel Rule {\n id String @id @default(cuid())\n tenantId String\n name String\n enabled Boolean @default(true)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n tenant Tenant @relation(fields: [tenantId], references: [id])\n conditions RuleCondition[]\n actions RuleAction[]\n\n @@index([tenantId])\n}\n\nmodel RuleCondition {\n id String @id @default(cuid())\n ruleId String\n type RuleConditionType\n value String\n\n rule Rule @relation(fields: [ruleId], references: [id])\n\n @@index([ruleId])\n}\n\nmodel RuleAction {\n id String @id @default(cuid())\n ruleId String\n type RuleActionType\n target String?\n\n rule Rule @relation(fields: [ruleId], references: [id])\n\n @@index([ruleId])\n}\n\nmodel CleanupJob {\n id String @id @default(cuid())\n tenantId String\n mailboxAccountId String\n status JobStatus @default(QUEUED)\n dryRun Boolean @default(true)\n unsubscribeEnabled Boolean @default(true)\n routingEnabled Boolean @default(true)\n startedAt DateTime?\n finishedAt DateTime?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n tenant Tenant @relation(fields: [tenantId], references: [id])\n mailboxAccount MailboxAccount @relation(fields: [mailboxAccountId], references: [id])\n unsubscribeAttempts UnsubscribeAttempt[]\n events CleanupJobEvent[]\n\n @@index([tenantId])\n @@index([mailboxAccountId])\n}\n\nmodel UnsubscribeAttempt {\n id String @id @default(cuid())\n jobId String\n mailItemId String?\n method String\n target String\n status String\n createdAt DateTime @default(now())\n\n job CleanupJob @relation(fields: [jobId], references: [id])\n\n @@index([jobId])\n}\n\nmodel CleanupJobEvent {\n id String @id @default(cuid())\n jobId String\n level String\n message String\n progress Int?\n createdAt DateTime @default(now())\n\n job CleanupJob @relation(fields: [jobId], references: [id])\n\n @@index([jobId])\n}\n", - "inlineSchemaHash": "8215bb521bb81721fac5b205bca5af7a38690fa4cc8087b4b16d7967edb43359", + "inlineSchema": "generator client {\n provider = \"prisma-client-js\"\n}\n\ndatasource db {\n provider = \"postgresql\"\n url = env(\"DATABASE_URL\")\n}\n\nenum MailProvider {\n GMAIL\n GMX\n WEBDE\n}\n\nenum UserRole {\n USER\n ADMIN\n}\n\nenum JobStatus {\n QUEUED\n RUNNING\n SUCCEEDED\n FAILED\n CANCELED\n}\n\nenum RuleActionType {\n MOVE\n DELETE\n ARCHIVE\n LABEL\n}\n\nenum RuleConditionType {\n HEADER\n SUBJECT\n FROM\n LIST_UNSUBSCRIBE\n LIST_ID\n}\n\nenum ExportStatus {\n QUEUED\n RUNNING\n DONE\n FAILED\n}\n\nmodel Tenant {\n id String @id @default(cuid())\n name String\n isActive Boolean @default(true)\n exportJobs ExportJob[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n users User[]\n mailboxAccounts MailboxAccount[]\n rules Rule[]\n jobs CleanupJob[]\n}\n\nmodel ExportJob {\n id String @id @default(cuid())\n tenantId String\n status ExportStatus @default(QUEUED)\n format String\n scope String\n progress Int @default(0)\n filePath String?\n error String?\n expiresAt DateTime?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n tenant Tenant @relation(fields: [tenantId], references: [id])\n\n @@index([tenantId])\n}\n\nmodel User {\n id String @id @default(cuid())\n tenantId String\n email String @unique\n password String\n role UserRole @default(USER)\n isActive Boolean @default(true)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n tenant Tenant @relation(fields: [tenantId], references: [id])\n}\n\nmodel MailboxAccount {\n id String @id @default(cuid())\n tenantId String\n email String\n provider MailProvider\n isActive Boolean @default(true)\n imapHost String\n imapPort Int\n imapTLS Boolean\n smtpHost String?\n smtpPort Int?\n smtpTLS Boolean?\n oauthToken String?\n oauthRefreshToken String?\n oauthAccessToken String?\n oauthExpiresAt DateTime?\n providerUserId String?\n oauthLastCheckedAt DateTime?\n oauthLastErrorCode String?\n appPassword String?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n tenant Tenant @relation(fields: [tenantId], references: [id])\n folders MailboxFolder[]\n jobs CleanupJob[]\n\n @@index([tenantId])\n}\n\nmodel MailboxFolder {\n id String @id @default(cuid())\n mailboxAccountId String\n name String\n remoteId String?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n mailboxAccount MailboxAccount @relation(fields: [mailboxAccountId], references: [id])\n mailItems MailItem[]\n\n @@index([mailboxAccountId])\n}\n\nmodel MailItem {\n id String @id @default(cuid())\n folderId String\n messageId String\n subject String?\n from String?\n receivedAt DateTime?\n listId String?\n listUnsubscribe String?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n folder MailboxFolder @relation(fields: [folderId], references: [id])\n\n @@index([folderId])\n @@index([messageId])\n}\n\nmodel Rule {\n id String @id @default(cuid())\n tenantId String\n name String\n enabled Boolean @default(true)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n tenant Tenant @relation(fields: [tenantId], references: [id])\n conditions RuleCondition[]\n actions RuleAction[]\n\n @@index([tenantId])\n}\n\nmodel RuleCondition {\n id String @id @default(cuid())\n ruleId String\n type RuleConditionType\n value String\n\n rule Rule @relation(fields: [ruleId], references: [id])\n\n @@index([ruleId])\n}\n\nmodel RuleAction {\n id String @id @default(cuid())\n ruleId String\n type RuleActionType\n target String?\n\n rule Rule @relation(fields: [ruleId], references: [id])\n\n @@index([ruleId])\n}\n\nmodel CleanupJob {\n id String @id @default(cuid())\n tenantId String\n mailboxAccountId String\n status JobStatus @default(QUEUED)\n dryRun Boolean @default(true)\n unsubscribeEnabled Boolean @default(true)\n routingEnabled Boolean @default(true)\n startedAt DateTime?\n finishedAt DateTime?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n tenant Tenant @relation(fields: [tenantId], references: [id])\n mailboxAccount MailboxAccount @relation(fields: [mailboxAccountId], references: [id])\n unsubscribeAttempts UnsubscribeAttempt[]\n events CleanupJobEvent[]\n\n @@index([tenantId])\n @@index([mailboxAccountId])\n}\n\nmodel UnsubscribeAttempt {\n id String @id @default(cuid())\n jobId String\n mailItemId String?\n method String\n target String\n status String\n createdAt DateTime @default(now())\n\n job CleanupJob @relation(fields: [jobId], references: [id])\n\n @@index([jobId])\n}\n\nmodel CleanupJobEvent {\n id String @id @default(cuid())\n jobId String\n level String\n message String\n progress Int?\n createdAt DateTime @default(now())\n\n job CleanupJob @relation(fields: [jobId], references: [id])\n\n @@index([jobId])\n}\n\nmodel AppSetting {\n id String @id @default(cuid())\n key String @unique\n value String\n updatedAt DateTime @updatedAt\n}\n", + "inlineSchemaHash": "a722a25b5f786847581c71e94e2c62c6a9680977a2bde0ff3dca71f63aec1155", "copyEngine": true } @@ -362,7 +372,7 @@ if (!fs.existsSync(path.join(__dirname, 'schema.prisma'))) { config.isBundled = true } -config.runtimeDataModel = JSON.parse("{\"models\":{\"Tenant\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"cuid\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"exportJobs\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ExportJob\",\"relationName\":\"ExportJobToTenant\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"users\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"relationName\":\"TenantToUser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mailboxAccounts\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MailboxAccount\",\"relationName\":\"MailboxAccountToTenant\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"rules\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Rule\",\"relationName\":\"RuleToTenant\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"jobs\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"CleanupJob\",\"relationName\":\"CleanupJobToTenant\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ExportJob\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"cuid\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"tenantId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"status\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"ExportStatus\",\"default\":\"QUEUED\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"format\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"scope\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"progress\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"filePath\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"error\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"tenant\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Tenant\",\"relationName\":\"ExportJobToTenant\",\"relationFromFields\":[\"tenantId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"User\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"cuid\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"tenantId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"email\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"password\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"role\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"UserRole\",\"default\":\"USER\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"tenant\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Tenant\",\"relationName\":\"TenantToUser\",\"relationFromFields\":[\"tenantId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"MailboxAccount\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"cuid\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"tenantId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"email\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"provider\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MailProvider\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"imapHost\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"imapPort\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"imapTLS\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Boolean\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"smtpHost\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"smtpPort\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"smtpTLS\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Boolean\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"oauthToken\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"oauthRefreshToken\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"oauthAccessToken\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"oauthExpiresAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"providerUserId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"oauthLastCheckedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"oauthLastErrorCode\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"appPassword\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"tenant\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Tenant\",\"relationName\":\"MailboxAccountToTenant\",\"relationFromFields\":[\"tenantId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"folders\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MailboxFolder\",\"relationName\":\"MailboxAccountToMailboxFolder\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"jobs\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"CleanupJob\",\"relationName\":\"CleanupJobToMailboxAccount\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"MailboxFolder\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"cuid\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mailboxAccountId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"remoteId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"mailboxAccount\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MailboxAccount\",\"relationName\":\"MailboxAccountToMailboxFolder\",\"relationFromFields\":[\"mailboxAccountId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mailItems\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MailItem\",\"relationName\":\"MailItemToMailboxFolder\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"MailItem\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"cuid\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"folderId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"messageId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"subject\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"from\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"receivedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"listId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"listUnsubscribe\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"folder\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MailboxFolder\",\"relationName\":\"MailItemToMailboxFolder\",\"relationFromFields\":[\"folderId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Rule\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"cuid\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"tenantId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"enabled\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"tenant\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Tenant\",\"relationName\":\"RuleToTenant\",\"relationFromFields\":[\"tenantId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"conditions\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"RuleCondition\",\"relationName\":\"RuleToRuleCondition\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"actions\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"RuleAction\",\"relationName\":\"RuleToRuleAction\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"RuleCondition\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"cuid\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"ruleId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"RuleConditionType\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"value\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"rule\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Rule\",\"relationName\":\"RuleToRuleCondition\",\"relationFromFields\":[\"ruleId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"RuleAction\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"cuid\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"ruleId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"RuleActionType\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"target\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"rule\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Rule\",\"relationName\":\"RuleToRuleAction\",\"relationFromFields\":[\"ruleId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"CleanupJob\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"cuid\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"tenantId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mailboxAccountId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"status\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"JobStatus\",\"default\":\"QUEUED\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"dryRun\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"unsubscribeEnabled\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"routingEnabled\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"startedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"finishedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"tenant\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Tenant\",\"relationName\":\"CleanupJobToTenant\",\"relationFromFields\":[\"tenantId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mailboxAccount\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MailboxAccount\",\"relationName\":\"CleanupJobToMailboxAccount\",\"relationFromFields\":[\"mailboxAccountId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"unsubscribeAttempts\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"UnsubscribeAttempt\",\"relationName\":\"CleanupJobToUnsubscribeAttempt\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"events\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"CleanupJobEvent\",\"relationName\":\"CleanupJobToCleanupJobEvent\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"UnsubscribeAttempt\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"cuid\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"jobId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mailItemId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"method\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"target\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"status\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"job\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"CleanupJob\",\"relationName\":\"CleanupJobToUnsubscribeAttempt\",\"relationFromFields\":[\"jobId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"CleanupJobEvent\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"cuid\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"jobId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"level\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"message\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"progress\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"job\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"CleanupJob\",\"relationName\":\"CleanupJobToCleanupJobEvent\",\"relationFromFields\":[\"jobId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false}},\"enums\":{\"MailProvider\":{\"values\":[{\"name\":\"GMAIL\",\"dbName\":null},{\"name\":\"GMX\",\"dbName\":null},{\"name\":\"WEBDE\",\"dbName\":null}],\"dbName\":null},\"UserRole\":{\"values\":[{\"name\":\"USER\",\"dbName\":null},{\"name\":\"ADMIN\",\"dbName\":null}],\"dbName\":null},\"JobStatus\":{\"values\":[{\"name\":\"QUEUED\",\"dbName\":null},{\"name\":\"RUNNING\",\"dbName\":null},{\"name\":\"SUCCEEDED\",\"dbName\":null},{\"name\":\"FAILED\",\"dbName\":null},{\"name\":\"CANCELED\",\"dbName\":null}],\"dbName\":null},\"RuleActionType\":{\"values\":[{\"name\":\"MOVE\",\"dbName\":null},{\"name\":\"DELETE\",\"dbName\":null},{\"name\":\"ARCHIVE\",\"dbName\":null},{\"name\":\"LABEL\",\"dbName\":null}],\"dbName\":null},\"RuleConditionType\":{\"values\":[{\"name\":\"HEADER\",\"dbName\":null},{\"name\":\"SUBJECT\",\"dbName\":null},{\"name\":\"FROM\",\"dbName\":null},{\"name\":\"LIST_UNSUBSCRIBE\",\"dbName\":null},{\"name\":\"LIST_ID\",\"dbName\":null}],\"dbName\":null},\"ExportStatus\":{\"values\":[{\"name\":\"QUEUED\",\"dbName\":null},{\"name\":\"RUNNING\",\"dbName\":null},{\"name\":\"DONE\",\"dbName\":null},{\"name\":\"FAILED\",\"dbName\":null}],\"dbName\":null}},\"types\":{}}") +config.runtimeDataModel = JSON.parse("{\"models\":{\"Tenant\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"cuid\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"exportJobs\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ExportJob\",\"relationName\":\"ExportJobToTenant\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"users\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"relationName\":\"TenantToUser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mailboxAccounts\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MailboxAccount\",\"relationName\":\"MailboxAccountToTenant\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"rules\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Rule\",\"relationName\":\"RuleToTenant\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"jobs\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"CleanupJob\",\"relationName\":\"CleanupJobToTenant\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ExportJob\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"cuid\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"tenantId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"status\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"ExportStatus\",\"default\":\"QUEUED\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"format\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"scope\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"progress\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"filePath\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"error\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"tenant\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Tenant\",\"relationName\":\"ExportJobToTenant\",\"relationFromFields\":[\"tenantId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"User\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"cuid\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"tenantId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"email\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"password\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"role\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"UserRole\",\"default\":\"USER\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"tenant\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Tenant\",\"relationName\":\"TenantToUser\",\"relationFromFields\":[\"tenantId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"MailboxAccount\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"cuid\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"tenantId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"email\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"provider\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MailProvider\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"imapHost\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"imapPort\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"imapTLS\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Boolean\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"smtpHost\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"smtpPort\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"smtpTLS\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Boolean\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"oauthToken\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"oauthRefreshToken\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"oauthAccessToken\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"oauthExpiresAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"providerUserId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"oauthLastCheckedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"oauthLastErrorCode\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"appPassword\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"tenant\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Tenant\",\"relationName\":\"MailboxAccountToTenant\",\"relationFromFields\":[\"tenantId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"folders\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MailboxFolder\",\"relationName\":\"MailboxAccountToMailboxFolder\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"jobs\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"CleanupJob\",\"relationName\":\"CleanupJobToMailboxAccount\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"MailboxFolder\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"cuid\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mailboxAccountId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"remoteId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"mailboxAccount\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MailboxAccount\",\"relationName\":\"MailboxAccountToMailboxFolder\",\"relationFromFields\":[\"mailboxAccountId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mailItems\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MailItem\",\"relationName\":\"MailItemToMailboxFolder\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"MailItem\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"cuid\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"folderId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"messageId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"subject\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"from\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"receivedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"listId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"listUnsubscribe\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"folder\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MailboxFolder\",\"relationName\":\"MailItemToMailboxFolder\",\"relationFromFields\":[\"folderId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Rule\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"cuid\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"tenantId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"enabled\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"tenant\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Tenant\",\"relationName\":\"RuleToTenant\",\"relationFromFields\":[\"tenantId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"conditions\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"RuleCondition\",\"relationName\":\"RuleToRuleCondition\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"actions\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"RuleAction\",\"relationName\":\"RuleToRuleAction\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"RuleCondition\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"cuid\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"ruleId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"RuleConditionType\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"value\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"rule\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Rule\",\"relationName\":\"RuleToRuleCondition\",\"relationFromFields\":[\"ruleId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"RuleAction\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"cuid\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"ruleId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"RuleActionType\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"target\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"rule\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Rule\",\"relationName\":\"RuleToRuleAction\",\"relationFromFields\":[\"ruleId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"CleanupJob\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"cuid\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"tenantId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mailboxAccountId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"status\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"JobStatus\",\"default\":\"QUEUED\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"dryRun\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"unsubscribeEnabled\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"routingEnabled\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"startedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"finishedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"tenant\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Tenant\",\"relationName\":\"CleanupJobToTenant\",\"relationFromFields\":[\"tenantId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mailboxAccount\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MailboxAccount\",\"relationName\":\"CleanupJobToMailboxAccount\",\"relationFromFields\":[\"mailboxAccountId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"unsubscribeAttempts\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"UnsubscribeAttempt\",\"relationName\":\"CleanupJobToUnsubscribeAttempt\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"events\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"CleanupJobEvent\",\"relationName\":\"CleanupJobToCleanupJobEvent\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"UnsubscribeAttempt\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"cuid\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"jobId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mailItemId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"method\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"target\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"status\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"job\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"CleanupJob\",\"relationName\":\"CleanupJobToUnsubscribeAttempt\",\"relationFromFields\":[\"jobId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"CleanupJobEvent\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"cuid\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"jobId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"level\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"message\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"progress\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"job\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"CleanupJob\",\"relationName\":\"CleanupJobToCleanupJobEvent\",\"relationFromFields\":[\"jobId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"AppSetting\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"cuid\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"key\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"value\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false}},\"enums\":{\"MailProvider\":{\"values\":[{\"name\":\"GMAIL\",\"dbName\":null},{\"name\":\"GMX\",\"dbName\":null},{\"name\":\"WEBDE\",\"dbName\":null}],\"dbName\":null},\"UserRole\":{\"values\":[{\"name\":\"USER\",\"dbName\":null},{\"name\":\"ADMIN\",\"dbName\":null}],\"dbName\":null},\"JobStatus\":{\"values\":[{\"name\":\"QUEUED\",\"dbName\":null},{\"name\":\"RUNNING\",\"dbName\":null},{\"name\":\"SUCCEEDED\",\"dbName\":null},{\"name\":\"FAILED\",\"dbName\":null},{\"name\":\"CANCELED\",\"dbName\":null}],\"dbName\":null},\"RuleActionType\":{\"values\":[{\"name\":\"MOVE\",\"dbName\":null},{\"name\":\"DELETE\",\"dbName\":null},{\"name\":\"ARCHIVE\",\"dbName\":null},{\"name\":\"LABEL\",\"dbName\":null}],\"dbName\":null},\"RuleConditionType\":{\"values\":[{\"name\":\"HEADER\",\"dbName\":null},{\"name\":\"SUBJECT\",\"dbName\":null},{\"name\":\"FROM\",\"dbName\":null},{\"name\":\"LIST_UNSUBSCRIBE\",\"dbName\":null},{\"name\":\"LIST_ID\",\"dbName\":null}],\"dbName\":null},\"ExportStatus\":{\"values\":[{\"name\":\"QUEUED\",\"dbName\":null},{\"name\":\"RUNNING\",\"dbName\":null},{\"name\":\"DONE\",\"dbName\":null},{\"name\":\"FAILED\",\"dbName\":null}],\"dbName\":null}},\"types\":{}}") defineDmmfProperty(exports.Prisma, config.runtimeDataModel) config.engineWasm = undefined diff --git a/backend/node_modules/.prisma/client/package.json b/backend/node_modules/.prisma/client/package.json index 0032622f..ed5d38f2 100644 --- a/backend/node_modules/.prisma/client/package.json +++ b/backend/node_modules/.prisma/client/package.json @@ -1,5 +1,5 @@ { - "name": "prisma-client-6c67176f7022092b3b8f46007c6286b76456763ea6fcd4c80a580e5070b636e6", + "name": "prisma-client-0dfa452a25e24864bcf3f498cd8b34074b00c8171bdce93526b6a0ab38135aa4", "main": "index.js", "types": "index.d.ts", "browser": "index-browser.js", diff --git a/backend/node_modules/.prisma/client/schema.prisma b/backend/node_modules/.prisma/client/schema.prisma index 02bfd4a2..5574bf0b 100644 --- a/backend/node_modules/.prisma/client/schema.prisma +++ b/backend/node_modules/.prisma/client/schema.prisma @@ -41,6 +41,13 @@ enum RuleConditionType { LIST_ID } +enum ExportStatus { + QUEUED + RUNNING + DONE + FAILED +} + model Tenant { id String @id @default(cuid()) name String @@ -55,13 +62,6 @@ model Tenant { jobs CleanupJob[] } -enum ExportStatus { - QUEUED - RUNNING - DONE - FAILED -} - model ExportJob { id String @id @default(cuid()) tenantId String @@ -240,3 +240,10 @@ model CleanupJobEvent { @@index([jobId]) } + +model AppSetting { + id String @id @default(cuid()) + key String @unique + value String + updatedAt DateTime @updatedAt +} diff --git a/backend/node_modules/.prisma/client/wasm.js b/backend/node_modules/.prisma/client/wasm.js index 73a23795..19f67e83 100644 --- a/backend/node_modules/.prisma/client/wasm.js +++ b/backend/node_modules/.prisma/client/wasm.js @@ -257,6 +257,13 @@ exports.Prisma.CleanupJobEventScalarFieldEnum = { createdAt: 'createdAt' }; +exports.Prisma.AppSettingScalarFieldEnum = { + id: 'id', + key: 'key', + value: 'value', + updatedAt: 'updatedAt' +}; + exports.Prisma.SortOrder = { asc: 'asc', desc: 'desc' @@ -324,7 +331,8 @@ exports.Prisma.ModelName = { RuleAction: 'RuleAction', CleanupJob: 'CleanupJob', UnsubscribeAttempt: 'UnsubscribeAttempt', - CleanupJobEvent: 'CleanupJobEvent' + CleanupJobEvent: 'CleanupJobEvent', + AppSetting: 'AppSetting' }; /** diff --git a/backend/prisma/migrations/20260122190000_app_setting/migration.sql b/backend/prisma/migrations/20260122190000_app_setting/migration.sql new file mode 100644 index 00000000..8de43d1f --- /dev/null +++ b/backend/prisma/migrations/20260122190000_app_setting/migration.sql @@ -0,0 +1,12 @@ +-- CreateTable +CREATE TABLE "AppSetting" ( + "id" TEXT NOT NULL, + "key" TEXT NOT NULL, + "value" TEXT NOT NULL, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "AppSetting_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "AppSetting_key_key" ON "AppSetting"("key"); diff --git a/backend/prisma/schema.prisma b/backend/prisma/schema.prisma index 6a3f6414..6536a4a6 100644 --- a/backend/prisma/schema.prisma +++ b/backend/prisma/schema.prisma @@ -41,6 +41,13 @@ enum RuleConditionType { LIST_ID } +enum ExportStatus { + QUEUED + RUNNING + DONE + FAILED +} + model Tenant { id String @id @default(cuid()) name String @@ -55,13 +62,6 @@ model Tenant { jobs CleanupJob[] } -enum ExportStatus { - QUEUED - RUNNING - DONE - FAILED -} - model ExportJob { id String @id @default(cuid()) tenantId String @@ -240,3 +240,10 @@ model CleanupJobEvent { @@index([jobId]) } + +model AppSetting { + id String @id @default(cuid()) + key String @unique + value String + updatedAt DateTime @updatedAt +} diff --git a/backend/src/admin/routes.ts b/backend/src/admin/routes.ts index 2dcdff45..7ebbb90d 100644 --- a/backend/src/admin/routes.ts +++ b/backend/src/admin/routes.ts @@ -6,6 +6,7 @@ import { queueCleanupJob, removeQueueJob, queueExportJob } from "../queue/queue. import { createReadStream } from "node:fs"; import { access, unlink } from "node:fs/promises"; import { cleanupExpiredExports } from "./exportCleanup.js"; +import { deleteSetting, listSettings, setSetting } from "./settings.js"; const roleSchema = z.object({ role: z.enum(["USER", "ADMIN"]) @@ -19,9 +20,53 @@ const resetSchema = z.object({ password: z.string().min(10) }); +const settingsSchema = z.object({ + settings: z.record(z.string(), z.string().nullable()) +}); + +const allowedSettings = ["google.client_id", "google.client_secret", "google.redirect_uri"] as const; + export async function adminRoutes(app: FastifyInstance) { app.addHook("preHandler", app.requireAdmin); + app.get("/settings", async () => { + const keys = [...allowedSettings]; + const stored = await listSettings(keys); + const envDefaults: Record = { + "google.client_id": process.env.GOOGLE_CLIENT_ID ?? null, + "google.client_secret": process.env.GOOGLE_CLIENT_SECRET ?? null, + "google.redirect_uri": process.env.GOOGLE_REDIRECT_URI ?? null + }; + const settings = keys.reduce>((acc, key) => { + const dbValue = stored[key]; + if (dbValue !== null && dbValue !== undefined) { + acc[key] = { value: dbValue, source: "db" }; + } else if (envDefaults[key]) { + acc[key] = { value: envDefaults[key], source: "env" }; + } else { + acc[key] = { value: null, source: "unset" }; + } + return acc; + }, {}); + return { settings }; + }); + + app.put("/settings", async (request) => { + const input = settingsSchema.parse(request.body); + const entries = Object.entries(input.settings); + for (const [key, value] of entries) { + if (!allowedSettings.includes(key as (typeof allowedSettings)[number])) continue; + if (value === null || value.trim() === "") { + await deleteSetting(key); + } else { + await setSetting(key, value); + } + } + const keys = [...allowedSettings]; + const stored = await listSettings(keys); + return { settings: stored }; + }); + app.get("/tenants", async () => { const tenants = await prisma.tenant.findMany({ include: { _count: { select: { users: true, mailboxAccounts: true, jobs: true } } }, @@ -156,7 +201,18 @@ export async function adminRoutes(app: FastifyInstance) { const tenant = await prisma.tenant.findUnique({ where: { id: params.id } }); if (!tenant) return reply.code(404).send({ message: "Tenant not found" }); + const exportJobs = await prisma.exportJob.findMany({ where: { tenantId: tenant.id } }); + for (const job of exportJobs) { + if (!job.filePath) continue; + try { + await unlink(job.filePath); + } catch { + // ignore missing files + } + } + await prisma.$transaction(async (tx) => { + await tx.exportJob.deleteMany({ where: { tenantId: tenant.id } }); const jobs = await tx.cleanupJob.findMany({ where: { tenantId: tenant.id } }); const jobIds = jobs.map((job) => job.id); await tx.cleanupJobEvent.deleteMany({ where: { jobId: { in: jobIds } } }); diff --git a/backend/src/admin/settings.ts b/backend/src/admin/settings.ts new file mode 100644 index 00000000..5be7aae6 --- /dev/null +++ b/backend/src/admin/settings.ts @@ -0,0 +1,27 @@ +import { prisma } from "../db.js"; + +export const getSetting = async (key: string) => { + const setting = await prisma.appSetting.findUnique({ where: { key } }); + return setting?.value ?? null; +}; + +export const setSetting = async (key: string, value: string) => { + return prisma.appSetting.upsert({ + where: { key }, + update: { value }, + create: { key, value } + }); +}; + +export const listSettings = async (keys: string[]) => { + const settings = await prisma.appSetting.findMany({ where: { key: { in: keys } } }); + const map = new Map(settings.map((s) => [s.key, s.value])); + return keys.reduce>((acc, key) => { + acc[key] = map.get(key) ?? null; + return acc; + }, {}); +}; + +export const deleteSetting = async (key: string) => { + await prisma.appSetting.deleteMany({ where: { key } }); +}; diff --git a/backend/src/config.ts b/backend/src/config.ts index 1916acdd..978e27f5 100644 --- a/backend/src/config.ts +++ b/backend/src/config.ts @@ -9,7 +9,13 @@ const envSchema = z.object({ GOOGLE_CLIENT_ID: z.string().optional(), GOOGLE_CLIENT_SECRET: z.string().optional(), GOOGLE_REDIRECT_URI: z.string().optional(), - TRUST_PROXY: z.coerce.boolean().default(false) + TRUST_PROXY: z.coerce.boolean().default(false), + SEED_ENABLED: z.coerce.boolean().default(true), + SEED_TENANT: z.string().default("Default Tenant"), + SEED_TENANT_ID: z.string().default("seed-tenant"), + SEED_ADMIN_EMAIL: z.string().email().optional(), + SEED_ADMIN_PASSWORD: z.string().min(10).optional(), + SEED_FORCE_PASSWORD_UPDATE: z.coerce.boolean().default(false) }); export type AppConfig = z.infer; @@ -23,7 +29,13 @@ const parsed = envSchema.safeParse({ GOOGLE_CLIENT_ID: process.env.GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET: process.env.GOOGLE_CLIENT_SECRET, GOOGLE_REDIRECT_URI: process.env.GOOGLE_REDIRECT_URI, - TRUST_PROXY: process.env.TRUST_PROXY + TRUST_PROXY: process.env.TRUST_PROXY, + SEED_ENABLED: process.env.SEED_ENABLED, + SEED_TENANT: process.env.SEED_TENANT, + SEED_TENANT_ID: process.env.SEED_TENANT_ID, + SEED_ADMIN_EMAIL: process.env.SEED_ADMIN_EMAIL, + SEED_ADMIN_PASSWORD: process.env.SEED_ADMIN_PASSWORD, + SEED_FORCE_PASSWORD_UPDATE: process.env.SEED_FORCE_PASSWORD_UPDATE }); if (!parsed.success) { diff --git a/backend/src/mail/gmail.ts b/backend/src/mail/gmail.ts index 74ae6a16..03c52d5f 100644 --- a/backend/src/mail/gmail.ts +++ b/backend/src/mail/gmail.ts @@ -2,20 +2,21 @@ import { google } from "googleapis"; import { MailboxAccount } from "@prisma/client"; import { config } from "../config.js"; import { prisma } from "../db.js"; +import { getSetting } from "../admin/settings.js"; -const getOAuthClient = () => { - if (!config.GOOGLE_CLIENT_ID || !config.GOOGLE_CLIENT_SECRET || !config.GOOGLE_REDIRECT_URI) { +const getOAuthClient = async () => { + const clientId = (await getSetting("google.client_id")) ?? config.GOOGLE_CLIENT_ID; + const clientSecret = (await getSetting("google.client_secret")) ?? config.GOOGLE_CLIENT_SECRET; + const redirectUri = (await getSetting("google.redirect_uri")) ?? config.GOOGLE_REDIRECT_URI; + + if (!clientId || !clientSecret || !redirectUri) { throw new Error("Google OAuth config missing"); } - return new google.auth.OAuth2( - config.GOOGLE_CLIENT_ID, - config.GOOGLE_CLIENT_SECRET, - config.GOOGLE_REDIRECT_URI - ); + return new google.auth.OAuth2(clientId, clientSecret, redirectUri); }; -export const getGmailAuthUrl = (state: string) => { - const client = getOAuthClient(); +export const getGmailAuthUrl = async (state: string) => { + const client = await getOAuthClient(); return client.generateAuthUrl({ access_type: "offline", prompt: "consent", @@ -28,7 +29,7 @@ export const getGmailAuthUrl = (state: string) => { }; export const exchangeGmailCode = async (code: string) => { - const client = getOAuthClient(); + const client = await getOAuthClient(); const { tokens } = await client.getToken(code); return tokens; }; @@ -49,7 +50,7 @@ export const gmailClientForAccount = async (account: MailboxAccount) => { throw new Error("Gmail OAuth not configured"); } - const client = getOAuthClient(); + const client = await getOAuthClient(); client.setCredentials({ refresh_token: account.oauthRefreshToken ?? undefined, access_token: account.oauthAccessToken ?? undefined, diff --git a/backend/src/mail/oauthRoutes.ts b/backend/src/mail/oauthRoutes.ts index 9e59f34e..f04c6094 100644 --- a/backend/src/mail/oauthRoutes.ts +++ b/backend/src/mail/oauthRoutes.ts @@ -9,7 +9,7 @@ const urlSchema = z.object({ accountId: z.string() }); export async function oauthRoutes(app: FastifyInstance) { app.addHook("preHandler", app.authenticate); - app.post("/gmail/url", async (request) => { + app.post("/gmail/url", async (request, reply) => { const input = urlSchema.parse(request.body); const account = await prisma.mailboxAccount.findFirst({ where: { id: input.accountId, tenantId: request.user.tenantId, provider: "GMAIL" } @@ -19,8 +19,12 @@ export async function oauthRoutes(app: FastifyInstance) { } const state = `${account.id}:${request.user.tenantId}`; - const url = getGmailAuthUrl(state); - return { url }; + try { + const url = await getGmailAuthUrl(state); + return { url }; + } catch { + return reply.code(400).send({ message: "Google OAuth config missing" }); + } }); app.get("/gmail/callback", async (request, reply) => { @@ -37,7 +41,12 @@ export async function oauthRoutes(app: FastifyInstance) { return reply.code(404).send({ message: "Account not found" }); } - const tokens = await exchangeGmailCode(query.code); + let tokens; + try { + tokens = await exchangeGmailCode(query.code); + } catch { + return reply.code(400).send({ message: "Google OAuth config missing" }); + } await storeGmailTokens(account.id, { access_token: tokens.access_token ?? undefined, refresh_token: tokens.refresh_token ?? undefined, diff --git a/backend/src/main.ts b/backend/src/main.ts index b157731b..ad65213c 100644 --- a/backend/src/main.ts +++ b/backend/src/main.ts @@ -15,6 +15,7 @@ import { queueRoutes } from "./queue/routes.js"; import { rulesRoutes } from "./rules/routes.js"; import { adminRoutes } from "./admin/routes.js"; import { oauthRoutes } from "./mail/oauthRoutes.js"; +import { ensureSeedData } from "./seed.js"; const app = Fastify({ logger: { @@ -26,7 +27,11 @@ const app = Fastify({ trustProxy: config.TRUST_PROXY }); -await app.register(cors, { origin: true }); +await app.register(cors, { + origin: true, + methods: ["GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS"], + allowedHeaders: ["Authorization", "Content-Type"] +}); await app.register(helmet); await app.register(jwt, { secret: config.JWT_SECRET }); await app.register(authPlugin); @@ -48,6 +53,8 @@ await app.register(rulesRoutes, { prefix: "/rules" }); await app.register(adminRoutes, { prefix: "/admin" }); await app.register(oauthRoutes, { prefix: "/oauth" }); +await ensureSeedData(); + const start = async () => { try { await app.listen({ port: config.PORT, host: "0.0.0.0" }); diff --git a/backend/src/seed.ts b/backend/src/seed.ts new file mode 100644 index 00000000..b3a45e08 --- /dev/null +++ b/backend/src/seed.ts @@ -0,0 +1,39 @@ +import argon2 from "argon2"; +import { prisma } from "./db.js"; +import { config } from "./config.js"; + +export const ensureSeedData = async () => { + if (!config.SEED_ENABLED) return; + if (!config.SEED_ADMIN_EMAIL || !config.SEED_ADMIN_PASSWORD) return; + + const existingUser = await prisma.user.findUnique({ where: { email: config.SEED_ADMIN_EMAIL } }); + if (existingUser) { + const updates: { role?: "ADMIN"; isActive?: boolean; password?: string } = {}; + if (existingUser.role !== "ADMIN") updates.role = "ADMIN"; + if (!existingUser.isActive) updates.isActive = true; + if (config.SEED_FORCE_PASSWORD_UPDATE) { + updates.password = await argon2.hash(config.SEED_ADMIN_PASSWORD); + } + if (Object.keys(updates).length) { + await prisma.user.update({ where: { id: existingUser.id }, data: updates }); + } + return; + } + + const tenant = await prisma.tenant.upsert({ + where: { id: config.SEED_TENANT_ID }, + update: { name: config.SEED_TENANT, isActive: true }, + create: { id: config.SEED_TENANT_ID, name: config.SEED_TENANT, isActive: true } + }); + + const hashed = await argon2.hash(config.SEED_ADMIN_PASSWORD); + await prisma.user.create({ + data: { + tenantId: tenant.id, + email: config.SEED_ADMIN_EMAIL, + password: hashed, + role: "ADMIN", + isActive: true + } + }); +}; diff --git a/docker-compose.yml b/docker-compose.yml index c05dff64..967d13ee 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -42,6 +42,7 @@ services: depends_on: - postgres - redis + command: ["sh", "-c", "npm run prisma:generate && npm run dev"] ports: - "${API_PORT:-8000}:${API_PORT:-8000}" volumes: @@ -71,7 +72,7 @@ services: depends_on: - postgres - redis - command: ["npm", "run", "worker:dev"] + command: ["sh", "-c", "npm run prisma:generate && npm run worker:dev"] volumes: - ./backend:/app diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index df32e229..f11a6d3a 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -2,6 +2,7 @@ import { useEffect, useMemo, useState } from "react"; import { useTranslation } from "react-i18next"; import { apiFetch, createEventSource } from "./api"; import AdminPanel from "./admin"; +import { useToast } from "./toast"; const languages = [ { code: "de", label: "Deutsch" }, @@ -47,9 +48,15 @@ const defaultAction = { type: "MOVE", target: "Newsletter" }; export default function App() { const { t, i18n } = useTranslation(); + const { pushToast } = useToast(); const [activeLang, setActiveLang] = useState(i18n.language); const [token, setToken] = useState(localStorage.getItem("token") ?? ""); - const [authMode, setAuthMode] = useState<"login" | "register">("login"); + const [showAdmin, setShowAdmin] = useState( + localStorage.getItem("ui.showAdmin") === "true" + ); + const [authMode, setAuthMode] = useState<"login" | "register">( + (localStorage.getItem("ui.authMode") as "login" | "register") ?? "login" + ); const [authEmail, setAuthEmail] = useState(""); const [authPassword, setAuthPassword] = useState(""); const [tenantName, setTenantName] = useState(""); @@ -58,12 +65,15 @@ export default function App() { const [accounts, setAccounts] = useState([]); const [rules, setRules] = useState([]); const [jobs, setJobs] = useState([]); - const [selectedJobId, setSelectedJobId] = useState(null); + const [selectedJobId, setSelectedJobId] = useState( + localStorage.getItem("ui.selectedJobId") + ); const [events, setEvents] = useState([]); const [accountEmail, setAccountEmail] = useState(""); const [accountProvider, setAccountProvider] = useState("GMAIL"); const [accountPassword, setAccountPassword] = useState(""); + const [showProviderHelp, setShowProviderHelp] = useState(false); const [ruleName, setRuleName] = useState(""); const [ruleEnabled, setRuleEnabled] = useState(true); @@ -82,9 +92,28 @@ export default function App() { const isAuthenticated = useMemo(() => Boolean(token), [token]); + const getErrorMessage = (err: unknown) => { + if (err instanceof Error) { + try { + const parsed = JSON.parse(err.message) as { message?: string }; + if (parsed?.message) return parsed.message; + } catch { + // ignore parsing + } + return err.message; + } + return t("toastGenericError"); + }; + const loadInitial = async (authToken: string) => { const me = await apiFetch("/tenants/me", {}, authToken); setUser(me.user); + if (me.user?.role === "ADMIN") { + const stored = localStorage.getItem("ui.showAdmin"); + if (stored === null) { + setShowAdmin(false); + } + } setTenant(me.tenant); const accountsData = await apiFetch("/mail/accounts", {}, authToken); @@ -119,12 +148,32 @@ export default function App() { useEffect(() => { if (!token) return; - loadInitial(token).catch(() => { - setToken(""); - localStorage.removeItem("token"); + loadInitial(token).catch((err: unknown) => { + const status = (err as { status?: number }).status; + if (status === 401 || status === 403) { + setToken(""); + localStorage.removeItem("token"); + pushToast(t("toastSessionExpired"), "info"); + } }); }, [token]); + useEffect(() => { + localStorage.setItem("ui.showAdmin", String(showAdmin)); + }, [showAdmin]); + + useEffect(() => { + localStorage.setItem("ui.authMode", authMode); + }, [authMode]); + + useEffect(() => { + if (selectedJobId) { + localStorage.setItem("ui.selectedJobId", selectedJobId); + } else { + localStorage.removeItem("ui.selectedJobId"); + } + }, [selectedJobId]); + useEffect(() => { if (!token) return; const interval = setInterval(() => { @@ -156,91 +205,117 @@ export default function App() { }, [selectedJobId, token]); const handleAuth = async () => { - if (authMode === "login") { + try { + if (authMode === "login") { + const result = await apiFetch( + "/auth/login", + { + method: "POST", + body: JSON.stringify({ email: authEmail, password: authPassword }) + } + ); + localStorage.setItem("token", result.token); + setToken(result.token); + pushToast(t("toastLoginSuccess"), "success"); + return; + } + const result = await apiFetch( - "/auth/login", + "/auth/register", { method: "POST", - body: JSON.stringify({ email: authEmail, password: authPassword }) + body: JSON.stringify({ tenantName, email: authEmail, password: authPassword }) } ); localStorage.setItem("token", result.token); setToken(result.token); - return; + pushToast(t("toastRegisterSuccess"), "success"); + } catch (err) { + pushToast(getErrorMessage(err), "error"); } - - const result = await apiFetch( - "/auth/register", - { - method: "POST", - body: JSON.stringify({ tenantName, email: authEmail, password: authPassword }) - } - ); - localStorage.setItem("token", result.token); - setToken(result.token); }; const handleAddAccount = async () => { - const result = await apiFetch( - "/mail/accounts", - { - method: "POST", - body: JSON.stringify({ - email: accountEmail, - provider: accountProvider, - appPassword: accountPassword || undefined - }) - }, - token - ); - setAccounts((prev) => [...prev, result.account]); - setAccountEmail(""); - setAccountPassword(""); + try { + const result = await apiFetch( + "/mail/accounts", + { + method: "POST", + body: JSON.stringify({ + email: accountEmail, + provider: accountProvider, + appPassword: accountPassword || undefined + }) + }, + token + ); + setAccounts((prev) => [...prev, result.account]); + setAccountEmail(""); + setAccountPassword(""); + pushToast(t("toastMailboxAdded"), "success"); + } catch (err) { + pushToast(getErrorMessage(err), "error"); + } }; const handleAddRule = async () => { - const result = await apiFetch( - "/rules", - { - method: "POST", - body: JSON.stringify({ - name: ruleName, - enabled: ruleEnabled, - conditions, - actions - }) - }, - token - ); - setRules((prev) => [...prev, result.rule]); - setRuleName(""); - setConditions([{ ...defaultCondition }]); - setActions([{ ...defaultAction }]); + try { + const result = await apiFetch( + "/rules", + { + method: "POST", + body: JSON.stringify({ + name: ruleName, + enabled: ruleEnabled, + conditions, + actions + }) + }, + token + ); + setRules((prev) => [...prev, result.rule]); + setRuleName(""); + setConditions([{ ...defaultCondition }]); + setActions([{ ...defaultAction }]); + pushToast(t("toastRuleSaved"), "success"); + } catch (err) { + pushToast(getErrorMessage(err), "error"); + } }; const handleDeleteRule = async (ruleId: string) => { - await apiFetch(`/rules/${ruleId}`, { method: "DELETE" }, token); - setRules((prev) => prev.filter((rule) => rule.id !== ruleId)); + try { + await apiFetch(`/rules/${ruleId}`, { method: "DELETE" }, token); + setRules((prev) => prev.filter((rule) => rule.id !== ruleId)); + pushToast(t("toastRuleDeleted"), "info"); + } catch (err) { + pushToast(getErrorMessage(err), "error"); + } }; const handleStartCleanup = async () => { - const result = await apiFetch( - "/mail/cleanup", - { - method: "POST", - body: JSON.stringify({ - mailboxAccountId: cleanupAccountId, - dryRun, - unsubscribeEnabled, - routingEnabled - }) - }, - token - ); - const jobsData = await apiFetch("/jobs", {}, token); - setJobs(jobsData.jobs ?? []); - setSelectedJobId(result.jobId); - setEvents([]); + try { + const result = await apiFetch( + "/mail/cleanup", + { + method: "POST", + body: JSON.stringify({ + mailboxAccountId: cleanupAccountId, + dryRun, + unsubscribeEnabled, + routingEnabled + }) + }, + token + ); + const jobsData = await apiFetch("/jobs", {}, token); + setJobs(jobsData.jobs ?? []); + setSelectedJobId(result.jobId); + setEvents([]); + pushToast(t("toastCleanupStarted"), "success"); + } catch (err) { + pushToast(getErrorMessage(err), "error"); + } }; const handleLogout = () => { @@ -248,6 +323,7 @@ export default function App() { localStorage.removeItem("token"); setUser(null); setTenant(null); + pushToast(t("toastLoggedOut"), "info"); }; const addCondition = () => setConditions((prev) => [...prev, { ...defaultCondition }]); @@ -276,16 +352,26 @@ export default function App() { }; const startGmailOauth = async (accountId: string) => { - const result = await apiFetch( - "/oauth/gmail/url", - { method: "POST", body: JSON.stringify({ accountId }) }, - token - ); - if (result.url) { - window.location.href = result.url; + try { + const result = await apiFetch( + "/oauth/gmail/url", + { method: "POST", body: JSON.stringify({ accountId }) }, + token + ); + if (result.url) { + window.location.href = result.url; + } + } catch (err) { + pushToast(getErrorMessage(err), "error"); } }; + const providerHint = () => { + if (accountProvider === "GMAIL") return t("providerHintGmail"); + if (accountProvider === "GMX") return t("providerHintGmx"); + return t("providerHintWebde"); + }; + if (!isAuthenticated) { return (
@@ -295,8 +381,7 @@ export default function App() {

{t("appName")}

{t("tagline")}

-
- {t("language")} +
{languages.map((lang) => ( ))}
@@ -358,8 +443,8 @@ export default function App() {

{t("appName")}

{tenant?.name ?? t("tenantFallback")}

-
- {user?.email ?? ""} +
+ {user?.email ?? ""}
{languages.map((lang) => ( ))} @@ -413,9 +498,42 @@ export default function App() {
- {user?.role === "ADMIN" && } + {user?.role === "ADMIN" && ( +
+ + {t("admin")} +
+ )} -
+ {user?.role === "ADMIN" && showAdmin ? ( +
+
+
+

{t("adminConsole")}

+

{t("adminConsoleHint")}

+
+
+ +
+ ) : ( +
+
+
+

{t("userWorkspace")}

+

{t("userWorkspaceHint")}

+
+
+
+ )} + + {!showAdmin && ( +

{t("mailboxAdd")}

setAccountPassword(event.target.value)} /> - - {accountProvider === "GMAIL" && cleanupAccountId && ( - - )} + + {accountProvider === "GMAIL" && cleanupAccountId && ( + + )} +
@@ -453,29 +581,33 @@ export default function App() { ))} - - - - +
+ + + +
+
+ +
@@ -485,10 +617,12 @@ export default function App() { value={ruleName} onChange={(event) => setRuleName(event.target.value)} /> - +
+ +

{t("rulesConditions")}

{conditions.map((condition, idx) => ( @@ -522,7 +656,7 @@ export default function App() { />
))} - +

{t("rulesActions")}

@@ -556,15 +690,19 @@ export default function App() { />
))} - + +
+
+
- + )} -
+ {!showAdmin && ( +

{t("adminMailboxStatus")}

{accounts.map((account) => ( @@ -613,8 +751,10 @@ export default function App() { ))}
+ )} -
+ {!showAdmin && ( +

{t("rulesOverview")}

{rules.map((rule) => ( @@ -658,7 +798,28 @@ export default function App() { )}
+ )} + {showProviderHelp && ( +
setShowProviderHelp(false)}> +
event.stopPropagation()}> +
+

{t("providerHelpTitle")}

+ +
+
+

{t("providerGmail")}

+

{t("providerHelpGmail")}

+

{t("providerGmx")}

+

{t("providerHelpGmx")}

+

{t("providerWebde")}

+

{t("providerHelpWebde")}

+
+
+
+ )} ); } diff --git a/frontend/src/admin.tsx b/frontend/src/admin.tsx index 239dc96a..24ec42be 100644 --- a/frontend/src/admin.tsx +++ b/frontend/src/admin.tsx @@ -3,6 +3,7 @@ import { apiFetch, createEventSourceFor } from "./api"; import { downloadFile } from "./export"; import { downloadExport } from "./exportHistory"; import { useTranslation } from "react-i18next"; +import { useToast } from "./toast"; type Tenant = { id: string; @@ -39,6 +40,11 @@ type Job = { mailboxAccount?: { id: string; email: string } | null; }; +type SettingValue = { + value: string | null; + source: "db" | "env" | "unset"; +}; + type Props = { token: string; onImpersonate: (token: string) => void; @@ -46,11 +52,14 @@ type Props = { export default function AdminPanel({ token, onImpersonate }: Props) { const { t } = useTranslation(); + const { pushToast } = useToast(); const [tenants, setTenants] = useState([]); const [users, setUsers] = useState([]); const [accounts, setAccounts] = useState([]); const [jobs, setJobs] = useState([]); - const [activeTab, setActiveTab] = useState<"tenants" | "users" | "accounts" | "jobs">("tenants"); + const [activeTab, setActiveTab] = useState<"tenants" | "users" | "accounts" | "jobs" | "settings">( + (localStorage.getItem("ui.adminTab") as "tenants" | "users" | "accounts" | "jobs" | "settings") ?? "tenants" + ); const [resetUserId, setResetUserId] = useState(null); const [resetPassword, setResetPassword] = useState(""); const [exportTenantId, setExportTenantId] = useState(null); @@ -64,6 +73,14 @@ export default function AdminPanel({ token, onImpersonate }: Props) { const [userSort, setUserSort] = useState<"recent" | "oldest" | "email">("recent"); const [accountSort, setAccountSort] = useState<"recent" | "oldest" | "email">("recent"); const [jobSort, setJobSort] = useState<"recent" | "oldest" | "status">("recent"); + const [settings, setSettings] = useState>({}); + const [settingsDraft, setSettingsDraft] = useState({ + googleClientId: "", + googleClientSecret: "", + googleRedirectUri: "" + }); + const [settingsStatus, setSettingsStatus] = useState<"idle" | "saving" | "saved" | "error">("idle"); + const [showGoogleSecret, setShowGoogleSecret] = useState(false); const loadAll = async () => { const tenantData = await apiFetch("/admin/tenants", {}, token); @@ -77,59 +94,108 @@ export default function AdminPanel({ token, onImpersonate }: Props) { const jobsData = await apiFetch("/admin/jobs", {}, token); setJobs(jobsData.jobs ?? []); - const exportsData = await apiFetch("/admin/exports", {}, token); - setExportHistory(exportsData.exports ?? []); + + const exportsData = await apiFetch("/admin/exports", {}, token); + setExportHistory(exportsData.exports ?? []); + + try { + await loadSettings(); + } catch { + // ignore settings fetch failures in initial load + } + }; + + const getErrorMessage = (err: unknown) => { + if (err instanceof Error) { + try { + const parsed = JSON.parse(err.message) as { message?: string }; + if (parsed?.message) return parsed.message; + } catch { + // ignore parsing + } + return err.message; + } + return t("toastGenericError"); }; useEffect(() => { loadAll().catch(() => undefined); }, []); + useEffect(() => { + localStorage.setItem("ui.adminTab", activeTab); + }, [activeTab]); + + const loadSettings = async () => { + const data = await apiFetch("/admin/settings", {}, token); + const next = data.settings ?? {}; + setSettings(next); + setSettingsDraft({ + googleClientId: next["google.client_id"]?.value ?? "", + googleClientSecret: next["google.client_secret"]?.value ?? "", + googleRedirectUri: next["google.redirect_uri"]?.value ?? "" + }); + }; + const toggleTenant = async (tenant: Tenant) => { - const result = await apiFetch( - `/admin/tenants/${tenant.id}`, - { method: "PUT", body: JSON.stringify({ isActive: !tenant.isActive }) }, - token - ); - setTenants((prev) => prev.map((item) => (item.id === tenant.id ? result.tenant : item))); + try { + const result = await apiFetch( + `/admin/tenants/${tenant.id}`, + { method: "PUT", body: JSON.stringify({ isActive: !tenant.isActive }) }, + token + ); + setTenants((prev) => prev.map((item) => (item.id === tenant.id ? result.tenant : item))); + pushToast(t("toastTenantUpdated"), "success"); + } catch (err) { + pushToast(getErrorMessage(err), "error"); + } }; const exportTenant = async (tenant: Tenant) => { - setExportTenantId(tenant.id); - setExportStatus("loading"); - if (exportFormat === "json") { - const result = await apiFetch(`/admin/tenants/${tenant.id}/export?scope=${exportScope}`, {}, token); - const blob = new Blob([JSON.stringify(result, null, 2)], { type: "application/json" }); - downloadFile(blob, `tenant-${tenant.id}.json`); - } else if (exportFormat === "csv") { - await exportTenantCsv(tenant); - return; - } else { - const result = await apiFetch(`/admin/tenants/${tenant.id}/export?format=zip&scope=${exportScope}`, {}, token); - setExportJobId(result.jobId); - setExportHistory((prev) => [{ id: result.jobId, status: "QUEUED" }, ...prev]); - const source = createEventSourceFor(`exports/${result.jobId}`, token); - source.onmessage = async (event) => { - const data = JSON.parse(event.data); - setExportHistory((prev) => - prev.map((item) => (item.id === data.id ? { ...item, status: data.status, expiresAt: data.expiresAt, progress: data.progress } : item)) - ); - if (data.status === "DONE") { - const response = await downloadExport(token, result.jobId); - const blob = await response.blob(); - downloadFile(blob, `tenant-${tenant.id}.zip`); - setExportStatus("done"); - source.close(); - setTimeout(() => setExportStatus("idle"), 1500); - } else if (data.status === "FAILED") { - setExportStatus("failed"); - source.close(); - } - }; - return; + try { + setExportTenantId(tenant.id); + setExportStatus("loading"); + if (exportFormat === "json") { + const result = await apiFetch(`/admin/tenants/${tenant.id}/export?scope=${exportScope}`, {}, token); + const blob = new Blob([JSON.stringify(result, null, 2)], { type: "application/json" }); + downloadFile(blob, `tenant-${tenant.id}.json`); + pushToast(t("toastExportReady"), "success"); + } else if (exportFormat === "csv") { + await exportTenantCsv(tenant); + return; + } else { + const result = await apiFetch(`/admin/tenants/${tenant.id}/export?format=zip&scope=${exportScope}`, {}, token); + setExportJobId(result.jobId); + setExportHistory((prev) => [{ id: result.jobId, status: "QUEUED" }, ...prev]); + pushToast(t("toastExportQueued"), "info"); + const source = createEventSourceFor(`exports/${result.jobId}`, token); + source.onmessage = async (event) => { + const data = JSON.parse(event.data); + setExportHistory((prev) => + prev.map((item) => (item.id === data.id ? { ...item, status: data.status, expiresAt: data.expiresAt, progress: data.progress } : item)) + ); + if (data.status === "DONE") { + const response = await downloadExport(token, result.jobId); + const blob = await response.blob(); + downloadFile(blob, `tenant-${tenant.id}.zip`); + setExportStatus("done"); + pushToast(t("toastExportReady"), "success"); + source.close(); + setTimeout(() => setExportStatus("idle"), 1500); + } else if (data.status === "FAILED") { + setExportStatus("failed"); + pushToast(t("toastExportFailed"), "error"); + source.close(); + } + }; + return; + } + setExportStatus("done"); + setTimeout(() => setExportStatus("idle"), 1500); + } catch (err) { + setExportStatus("failed"); + pushToast(getErrorMessage(err), "error"); } - setExportStatus("done"); - setTimeout(() => setExportStatus("idle"), 1500); }; const exportTenantCsv = async (tenant: Tenant) => { @@ -139,69 +205,113 @@ export default function AdminPanel({ token, onImpersonate }: Props) { const response = await fetch(`${base}/admin/tenants/${tenant.id}/export?format=csv&scope=${exportScope}`, { headers: { Authorization: `Bearer ${token}` } }); + if (!response.ok) { + throw new Error(await response.text()); + } const text = await response.text(); const blob = new Blob([text], { type: "text/csv" }); downloadFile(blob, `tenant-${tenant.id}.csv`); setExportStatus("done"); setTimeout(() => setExportStatus("idle"), 1500); + pushToast(t("toastExportReady"), "success"); }; const deleteTenant = async (tenant: Tenant) => { if (!confirm(t("adminDeleteConfirm", { name: tenant.name }))) return; - await apiFetch(`/admin/tenants/${tenant.id}`, { method: "DELETE" }, token); - setTenants((prev) => prev.filter((item) => item.id !== tenant.id)); + try { + await apiFetch(`/admin/tenants/${tenant.id}`, { method: "DELETE" }, token); + setTenants((prev) => prev.filter((item) => item.id !== tenant.id)); + pushToast(t("toastTenantDeleted"), "info"); + } catch (err) { + pushToast(getErrorMessage(err), "error"); + } }; const toggleUser = async (user: User) => { - const result = await apiFetch( - `/admin/users/${user.id}`, - { method: "PUT", body: JSON.stringify({ isActive: !user.isActive }) }, - token - ); - setUsers((prev) => prev.map((item) => (item.id === user.id ? result.user : item))); + try { + const result = await apiFetch( + `/admin/users/${user.id}`, + { method: "PUT", body: JSON.stringify({ isActive: !user.isActive }) }, + token + ); + setUsers((prev) => prev.map((item) => (item.id === user.id ? result.user : item))); + pushToast(t("toastUserUpdated"), "success"); + } catch (err) { + pushToast(getErrorMessage(err), "error"); + } }; const toggleAccount = async (account: Account) => { - const result = await apiFetch( - `/admin/accounts/${account.id}`, - { method: "PUT", body: JSON.stringify({ isActive: !account.isActive }) }, - token - ); - setAccounts((prev) => prev.map((item) => (item.id === account.id ? result.account : item))); + try { + const result = await apiFetch( + `/admin/accounts/${account.id}`, + { method: "PUT", body: JSON.stringify({ isActive: !account.isActive }) }, + token + ); + setAccounts((prev) => prev.map((item) => (item.id === account.id ? result.account : item))); + pushToast(t("toastAccountUpdated"), "success"); + } catch (err) { + pushToast(getErrorMessage(err), "error"); + } }; const setRole = async (user: User, role: "USER" | "ADMIN") => { - const result = await apiFetch( - `/admin/users/${user.id}/role`, - { method: "PUT", body: JSON.stringify({ role }) }, - token - ); - setUsers((prev) => prev.map((item) => (item.id === user.id ? result.user : item))); + try { + const result = await apiFetch( + `/admin/users/${user.id}/role`, + { method: "PUT", body: JSON.stringify({ role }) }, + token + ); + setUsers((prev) => prev.map((item) => (item.id === user.id ? result.user : item))); + pushToast(t("toastRoleUpdated"), "success"); + } catch (err) { + pushToast(getErrorMessage(err), "error"); + } }; const impersonate = async (user: User) => { - const result = await apiFetch(`/admin/impersonate/${user.id}`, { method: "POST" }, token); - onImpersonate(result.token); + try { + const result = await apiFetch(`/admin/impersonate/${user.id}`, { method: "POST" }, token); + onImpersonate(result.token); + pushToast(t("toastImpersonate"), "info"); + } catch (err) { + pushToast(getErrorMessage(err), "error"); + } }; const resetPasswordForUser = async () => { if (!resetUserId || resetPassword.length < 10) return; - await apiFetch(`/admin/users/${resetUserId}/reset`, { - method: "POST", - body: JSON.stringify({ password: resetPassword }) - }, token); - setResetUserId(null); - setResetPassword(""); + try { + await apiFetch(`/admin/users/${resetUserId}/reset`, { + method: "POST", + body: JSON.stringify({ password: resetPassword }) + }, token); + setResetUserId(null); + setResetPassword(""); + pushToast(t("toastPasswordReset"), "success"); + } catch (err) { + pushToast(getErrorMessage(err), "error"); + } }; const cancelJob = async (job: Job) => { - await apiFetch(`/admin/jobs/${job.id}/cancel`, { method: "POST" }, token); - setJobs((prev) => prev.map((item) => (item.id === job.id ? { ...item, status: "CANCELED" } : item))); + try { + await apiFetch(`/admin/jobs/${job.id}/cancel`, { method: "POST" }, token); + setJobs((prev) => prev.map((item) => (item.id === job.id ? { ...item, status: "CANCELED" } : item))); + pushToast(t("toastJobCanceled"), "info"); + } catch (err) { + pushToast(getErrorMessage(err), "error"); + } }; const retryJob = async (job: Job) => { - await apiFetch(`/admin/jobs/${job.id}/retry`, { method: "POST" }, token); - loadAll().catch(() => undefined); + try { + await apiFetch(`/admin/jobs/${job.id}/retry`, { method: "POST" }, token); + loadAll().catch(() => undefined); + pushToast(t("toastJobRetry"), "success"); + } catch (err) { + pushToast(getErrorMessage(err), "error"); + } }; const sortBy = (items: T[], mode: string, getKey: (item: T) => string) => { @@ -243,10 +353,37 @@ export default function AdminPanel({ token, onImpersonate }: Props) { } }; + const saveSettings = async () => { + try { + setSettingsStatus("saving"); + await apiFetch( + "/admin/settings", + { + method: "PUT", + body: JSON.stringify({ + settings: { + "google.client_id": settingsDraft.googleClientId, + "google.client_secret": settingsDraft.googleClientSecret, + "google.redirect_uri": settingsDraft.googleRedirectUri + } + }) + }, + token + ); + await loadSettings(); + setSettingsStatus("saved"); + setTimeout(() => setSettingsStatus("idle"), 1500); + pushToast(t("toastSettingsSaved"), "success"); + } catch { + setSettingsStatus("error"); + pushToast(t("toastSettingsFailed"), "error"); + } + }; + return (
- {(["tenants", "users", "accounts", "jobs"] as const).map((tab) => ( + {(["tenants", "users", "accounts", "jobs", "settings"] as const).map((tab) => ( + + {settingsStatus === "saved" && {t("adminSettingsSaved")}} + {settingsStatus === "error" && {t("adminSettingsError")}} +
+
+ {t("adminSettingsSource", { + id: settings["google.client_id"]?.source ?? "unset", + secret: settings["google.client_secret"]?.source ?? "unset", + redirect: settings["google.redirect_uri"]?.source ?? "unset" + })} +
+ + + )}
); } diff --git a/frontend/src/api.ts b/frontend/src/api.ts index 7438ac75..1966ea11 100644 --- a/frontend/src/api.ts +++ b/frontend/src/api.ts @@ -2,7 +2,10 @@ const apiUrl = import.meta.env.VITE_API_URL ?? "http://localhost:8000"; export const apiFetch = async (path: string, options: RequestInit = {}, token?: string) => { const headers = new Headers(options.headers ?? {}); - headers.set("Content-Type", "application/json"); + const hasBody = options.body !== undefined && options.body !== null; + if (hasBody && !headers.has("Content-Type")) { + headers.set("Content-Type", "application/json"); + } if (token) { headers.set("Authorization", `Bearer ${token}`); } @@ -14,7 +17,9 @@ export const apiFetch = async (path: string, options: RequestInit = {}, token?: if (!response.ok) { const message = await response.text(); - throw new Error(message || `Request failed: ${response.status}`); + const error = new Error(message || `Request failed: ${response.status}`) as Error & { status?: number }; + error.status = response.status; + throw error; } return response.json(); diff --git a/frontend/src/i18n.ts b/frontend/src/i18n.ts index aa324d1d..22c6b8a0 100644 --- a/frontend/src/i18n.ts +++ b/frontend/src/i18n.ts @@ -8,7 +8,7 @@ i18n.use(initReactI18next).init({ en: { translation: en }, de: { translation: de } }, - lng: "de", + lng: typeof window !== "undefined" && window.navigator.language.toLowerCase().startsWith("de") ? "de" : "en", fallbackLng: "en", interpolation: { escapeValue: false } }); diff --git a/frontend/src/locales/de/translation.json b/frontend/src/locales/de/translation.json index a2dc228e..d27678e3 100644 --- a/frontend/src/locales/de/translation.json +++ b/frontend/src/locales/de/translation.json @@ -31,6 +31,7 @@ "adminUsers": "User", "adminAccounts": "Accounts", "adminJobs": "Jobs", + "adminSettings": "Einstellungen", "adminExport": "Export", "adminDisable": "Deaktivieren", "adminEnable": "Aktivieren", @@ -43,6 +44,19 @@ "adminResetPlaceholder": "Neues Passwort (min 10 Zeichen)", "adminCancel": "Abbrechen", "adminConfirmReset": "Reset", + "adminSettingsHint": "OAuth-Einstellungen aus der Umgebung überschreiben. Leer lassen, um auf .env zurückzufallen.", + "adminGoogleSettings": "Google OAuth", + "adminGoogleSettingsHelp": "Lege in der Google Cloud Console einen OAuth‑Client an. Trage die Redirect‑URL unten als erlaubte Weiterleitungs‑URL ein. Consent Screen auf „extern“ setzen und Gmail API aktivieren.", + "adminGoogleClientId": "Client-ID", + "adminGoogleClientSecret": "Client-Secret", + "adminGoogleRedirectUri": "Redirect-URL", + "adminSaveSettings": "Einstellungen speichern", + "adminSaving": "Speichert...", + "adminSettingsSaved": "Gespeichert", + "adminSettingsError": "Speichern fehlgeschlagen", + "adminShowSecret": "Secret anzeigen", + "adminHideSecret": "Secret verbergen", + "adminSettingsSource": "Quellen - Client-ID: {{id}}, Secret: {{secret}}, Redirect: {{redirect}}", "adminRetry": "Retry", "adminCancelJob": "Cancel", "adminMailboxStatus": "Mailbox Status", @@ -63,7 +77,7 @@ "rulesActions": "Aktionen", "rulesAddCondition": "+ Bedingung", "rulesAddAction": "+ Aktion", - "rulesSave": "Rule speichern", + "rulesSave": "Regel speichern", "rulesOverview": "Regeln Übersicht", "jobsTitle": "Jobs", "jobEvents": "Job Events", @@ -83,6 +97,15 @@ "countAccounts": "{{count}} Accounts", "countJobs": "{{count}} Jobs", "placeholderEmail": "email@example.com", + "providerHintGmail": "Gmail nutzt OAuth. Du kannst das Passwort leer lassen und per OAuth verbinden.", + "providerHintGmx": "GMX nutzt IMAP. Gib hier dein App‑Passwort oder IMAP‑Passwort ein.", + "providerHintWebde": "web.de nutzt IMAP. Gib hier dein App‑Passwort oder IMAP‑Passwort ein.", + "providerHelp": "Hilfe zur Mailbox‑Einrichtung", + "providerHelpTitle": "Mailbox‑Einrichtung", + "providerHelpGmail": "Erstelle einen Google OAuth‑Client und verbinde per OAuth‑Button. Das Passwortfeld ist bei OAuth nicht nötig.", + "providerHelpGmx": "Aktiviere IMAP in den GMX‑Einstellungen und erstelle ein App‑Passwort. Dieses Passwort hier verwenden.", + "providerHelpWebde": "Aktiviere IMAP in den web.de‑Einstellungen und erstelle ein App‑Passwort. Dieses Passwort hier verwenden.", + "close": "Schließen", "providerGmail": "Gmail", "providerGmx": "GMX", "providerWebde": "web.de", @@ -153,5 +176,34 @@ "exportStatusFailed": "Fehlgeschlagen", "exportStatusExpired": "Abgelaufen", "adminExportPurge": "Abgelaufene löschen", - "exportProgress": "Fortschritt {{progress}}%" + "exportProgress": "Fortschritt {{progress}}%", + "adminConsole": "Admin-Konsole", + "adminConsoleHint": "Globale Steuerung für Tenants, User, Accounts, Exporte und Jobs.", + "userWorkspace": "User-Bereich", + "userWorkspaceHint": "Alles darunter betrifft nur dein eigenes Postfach und deine Regeln.", + "toastGenericError": "Etwas ist schiefgelaufen.", + "toastSessionExpired": "Session abgelaufen. Bitte erneut einloggen.", + "toastLoginSuccess": "Erfolgreich eingeloggt.", + "toastRegisterSuccess": "Account erfolgreich erstellt.", + "toastMailboxAdded": "Mailbox hinzugefügt.", + "toastRuleSaved": "Regel gespeichert.", + "toastRuleDeleted": "Regel gelöscht.", + "toastCleanupStarted": "Bereinigung gestartet.", + "toastLoggedOut": "Ausgeloggt.", + "toastExportQueued": "Export in Warteschlange.", + "toastExportReady": "Export bereit.", + "toastExportFailed": "Export fehlgeschlagen.", + "toastExportPurged": "Abgelaufene Exporte entfernt.", + "toastExportDeleted": "Export gelöscht.", + "toastTenantUpdated": "Tenant aktualisiert.", + "toastTenantDeleted": "Tenant gelöscht.", + "toastUserUpdated": "User aktualisiert.", + "toastAccountUpdated": "Account aktualisiert.", + "toastRoleUpdated": "Rolle aktualisiert.", + "toastImpersonate": "Impersonation gestartet.", + "toastPasswordReset": "Passwort zurückgesetzt.", + "toastJobCanceled": "Job abgebrochen.", + "toastJobRetry": "Job neu gestartet.", + "toastSettingsSaved": "Einstellungen gespeichert.", + "toastSettingsFailed": "Einstellungen konnten nicht gespeichert werden." } diff --git a/frontend/src/locales/en/translation.json b/frontend/src/locales/en/translation.json index c572e95d..f4fa1415 100644 --- a/frontend/src/locales/en/translation.json +++ b/frontend/src/locales/en/translation.json @@ -31,6 +31,7 @@ "adminUsers": "Users", "adminAccounts": "Accounts", "adminJobs": "Jobs", + "adminSettings": "Settings", "adminExport": "Export", "adminDisable": "Disable", "adminEnable": "Enable", @@ -43,6 +44,19 @@ "adminResetPlaceholder": "New password (min 10 characters)", "adminCancel": "Cancel", "adminConfirmReset": "Reset", + "adminSettingsHint": "Override OAuth settings stored in the environment. Leave empty to fall back to .env.", + "adminGoogleSettings": "Google OAuth", + "adminGoogleSettingsHelp": "Create an OAuth client in Google Cloud Console. Add the Redirect URL below as an authorized redirect URI. Use OAuth consent screen in external mode and enable Gmail API.", + "adminGoogleClientId": "Client ID", + "adminGoogleClientSecret": "Client secret", + "adminGoogleRedirectUri": "Redirect URL", + "adminSaveSettings": "Save settings", + "adminSaving": "Saving...", + "adminSettingsSaved": "Saved", + "adminSettingsError": "Save failed", + "adminShowSecret": "Show secret", + "adminHideSecret": "Hide secret", + "adminSettingsSource": "Sources - Client ID: {{id}}, Secret: {{secret}}, Redirect: {{redirect}}", "adminRetry": "Retry", "adminCancelJob": "Cancel", "adminMailboxStatus": "Mailbox status", @@ -83,6 +97,15 @@ "countAccounts": "{{count}} accounts", "countJobs": "{{count}} jobs", "placeholderEmail": "email@example.com", + "providerHintGmail": "Gmail uses OAuth. You can leave the password empty and connect via the OAuth button.", + "providerHintGmx": "GMX uses IMAP. Enter your app password or IMAP password for this mailbox.", + "providerHintWebde": "web.de uses IMAP. Enter your app password or IMAP password for this mailbox.", + "providerHelp": "Help for mailbox setup", + "providerHelpTitle": "Mailbox setup help", + "providerHelpGmail": "Create a Google OAuth Client and connect via the OAuth button. The password field is not required when OAuth is used.", + "providerHelpGmx": "Enable IMAP in your GMX settings and create an app password. Use that password here.", + "providerHelpWebde": "Enable IMAP in your web.de account settings and create an app password. Use that password here.", + "close": "Close", "providerGmail": "Gmail", "providerGmx": "GMX", "providerWebde": "web.de", @@ -153,5 +176,34 @@ "exportStatusFailed": "Failed", "exportStatusExpired": "Expired", "adminExportPurge": "Purge expired", - "exportProgress": "Progress {{progress}}%" + "exportProgress": "Progress {{progress}}%", + "adminConsole": "Admin console", + "adminConsoleHint": "Global controls for tenants, users, accounts, exports, and jobs.", + "userWorkspace": "User workspace", + "userWorkspaceHint": "Everything below affects only your own mailbox and rules.", + "toastGenericError": "Something went wrong.", + "toastSessionExpired": "Session expired. Please log in again.", + "toastLoginSuccess": "Logged in successfully.", + "toastRegisterSuccess": "Account created successfully.", + "toastMailboxAdded": "Mailbox added.", + "toastRuleSaved": "Rule saved.", + "toastRuleDeleted": "Rule deleted.", + "toastCleanupStarted": "Cleanup job started.", + "toastLoggedOut": "Logged out.", + "toastExportQueued": "Export queued.", + "toastExportReady": "Export ready.", + "toastExportFailed": "Export failed.", + "toastExportPurged": "Expired exports purged.", + "toastExportDeleted": "Export deleted.", + "toastTenantUpdated": "Tenant updated.", + "toastTenantDeleted": "Tenant deleted.", + "toastUserUpdated": "User updated.", + "toastAccountUpdated": "Account updated.", + "toastRoleUpdated": "Role updated.", + "toastImpersonate": "Impersonation started.", + "toastPasswordReset": "Password reset.", + "toastJobCanceled": "Job canceled.", + "toastJobRetry": "Job retried.", + "toastSettingsSaved": "Settings saved.", + "toastSettingsFailed": "Settings save failed." } diff --git a/frontend/src/main.tsx b/frontend/src/main.tsx index 178a4711..c9e7b7d8 100644 --- a/frontend/src/main.tsx +++ b/frontend/src/main.tsx @@ -3,9 +3,12 @@ import ReactDOM from "react-dom/client"; import "./i18n"; import "./styles.css"; import App from "./App"; +import { ToastProvider } from "./toast"; ReactDOM.createRoot(document.getElementById("root")!).render( - + + + ); diff --git a/frontend/src/styles.css b/frontend/src/styles.css index eefcbfc7..15bfb7e2 100644 --- a/frontend/src/styles.css +++ b/frontend/src/styles.css @@ -2,13 +2,13 @@ :root { color-scheme: light; - --bg: #f4f6f3; - --bg-accent: #eef1ea; - --ink: #111413; - --muted: #5b615b; - --primary: #0f766e; - --primary-strong: #0b5f59; - --accent: #e2b644; + --bg: #f3f6fb; + --bg-accent: #e9f0ff; + --ink: #101827; + --muted: #5a6375; + --primary: #2563eb; + --primary-strong: #1d4ed8; + --accent: #7c3aed; --card: #ffffff; --border: rgba(17, 20, 19, 0.08); --shadow: 0 16px 40px rgba(17, 20, 19, 0.08); @@ -27,6 +27,66 @@ body { min-height: 100vh; } +.toast-container { + position: fixed; + top: 20px; + right: 20px; + display: grid; + gap: 12px; + z-index: 9999; + max-width: min(360px, 90vw); +} + +.toast { + background: #ffffff; + border: 1px solid var(--border); + border-left: 4px solid var(--primary); + border-radius: 12px; + padding: 12px 14px; + display: flex; + align-items: center; + gap: 12px; + box-shadow: 0 16px 40px rgba(17, 20, 19, 0.12); + animation: toast-in 0.2s ease-out; +} + +.toast span { + flex: 1; + font-size: 14px; + color: var(--ink); +} + +.toast button { + border: none; + background: transparent; + font-size: 18px; + cursor: pointer; + color: var(--muted); +} + +.toast-success { + border-left-color: #1d4ed8; +} + +.toast-error { + border-left-color: #dc2626; +} + +.toast-info { + border-left-color: #2563eb; +} + +@keyframes toast-in { + from { + opacity: 0; + transform: translateY(-6px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + .app { max-width: 1200px; margin: 0 auto; @@ -60,40 +120,35 @@ h1 { font-size: 16px; } -.lang { - background: var(--card); - border: 1px solid var(--border); - border-radius: 16px; - padding: 12px 16px; - box-shadow: var(--shadow); - min-width: 200px; +.lang-compact { + display: flex; + flex-direction: column; + align-items: flex-end; + gap: 6px; } -.lang span { - display: block; - font-size: 11px; - text-transform: uppercase; - letter-spacing: 0.12em; +.lang-compact .user-label { + font-size: 12px; color: var(--muted); - margin-bottom: 10px; } .lang-buttons { display: flex; - gap: 8px; + gap: 6px; flex-wrap: wrap; } -.lang button { +.lang-compact button { border: 1px solid var(--border); - background: transparent; - padding: 6px 10px; + background: #fff; + padding: 4px 8px; border-radius: 999px; cursor: pointer; + font-size: 12px; font-weight: 600; } -.lang button.active { +.lang-compact button.active { background: var(--primary); color: #fff; border-color: var(--primary); @@ -132,7 +187,7 @@ button.primary { border-radius: 12px; font-weight: 700; cursor: pointer; - box-shadow: 0 10px 24px rgba(15, 118, 110, 0.25); + box-shadow: 0 10px 24px rgba(37, 99, 235, 0.25); } button.ghost { @@ -165,7 +220,7 @@ button.ghost { } .progress-bar { - background: rgba(15, 118, 110, 0.12); + background: rgba(37, 99, 235, 0.12); border-radius: 999px; height: 8px; overflow: hidden; @@ -204,6 +259,7 @@ button.ghost { grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 16px; margin-bottom: 28px; + align-items: stretch; } .card { @@ -212,10 +268,80 @@ button.ghost { border-radius: 18px; padding: 18px; box-shadow: 0 12px 28px rgba(17, 20, 19, 0.06); - display: grid; + display: flex; + flex-direction: column; gap: 10px; } +.card-actions { + margin-top: auto; + display: grid; + gap: 8px; +} + +.card button.primary, +.card button.ghost, +.card .add-button { + width: 100%; + height: 40px; + font-size: 13px; + padding: 0 14px; +} + +.card button { + font-size: 13px; + line-height: 1.1; +} + +.panel { + background: var(--bg-accent); + border: 1px solid var(--border); + border-radius: 16px; + padding: 16px; + display: grid; + gap: 12px; +} + +.section-block { + margin: 16px 0 18px; + padding: 12px 14px; + border-radius: 16px; + border: 1px dashed var(--border); + background: rgba(255, 255, 255, 0.6); +} + +.admin-only { + margin: 16px 0 24px; + padding: 16px; + border-radius: 18px; + border: 1px solid rgba(37, 99, 235, 0.2); + background: #f7f9ff; + box-shadow: var(--shadow); +} + +.admin-switch { + display: flex; + align-items: center; + gap: 10px; + margin-bottom: 12px; +} + +.section-header { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; +} + +.section-header h3 { + font-size: 18px; +} + +.section-header p { + color: var(--muted); + font-size: 13px; +} + .card h3 { margin-bottom: 4px; } @@ -237,7 +363,9 @@ button.ghost { input, select { width: 100%; - padding: 9px 12px; + padding: 8px 12px; + min-height: 40px; + height: 40px; border-radius: 10px; border: 1px solid var(--border); font-family: inherit; @@ -245,10 +373,37 @@ select { } .toggle { - display: flex; + display: grid; + grid-template-columns: 16px 1fr; align-items: center; - gap: 8px; + gap: 10px; font-size: 14px; + line-height: 1.2; + margin: 0; +} + +.toggle input { + margin: 0; + justify-self: start; +} + +.toggle-group { + display: grid; + gap: 8px; +} + +.field-row { + display: grid; + grid-template-columns: 140px 1fr; + gap: 12px; + align-items: center; + font-size: 13px; +} + +@media (max-width: 720px) { + .field-row { + grid-template-columns: 1fr; + } } .row { @@ -263,6 +418,30 @@ select { gap: 8px; } +.rule-actions { + display: grid; + gap: 8px; +} + +.add-button { + border: 1px solid rgba(37, 99, 235, 0.28); + background: linear-gradient(135deg, #f2f6ff, #e2ebff); + color: var(--primary-strong); + padding: 8px 14px; + border-radius: 999px; + font-weight: 600; + cursor: pointer; + width: fit-content; + transition: transform 0.15s ease, box-shadow 0.15s ease, border-color 0.15s ease; + box-shadow: 0 8px 18px rgba(37, 99, 235, 0.12); +} + +.add-button:hover { + transform: translateY(-1px); + border-color: rgba(37, 99, 235, 0.45); + box-shadow: 0 12px 22px rgba(37, 99, 235, 0.18); +} + .list-item { display: flex; justify-content: space-between; @@ -282,7 +461,7 @@ select { .event { padding: 10px 12px; border-radius: 10px; - background: rgba(15, 118, 110, 0.12); + background: rgba(37, 99, 235, 0.12); display: grid; grid-template-columns: 40px 1fr; gap: 12px; @@ -290,7 +469,7 @@ select { } .event.error { - background: rgba(226, 182, 68, 0.25); + background: rgba(124, 58, 237, 0.2); } .auth-panel { @@ -306,6 +485,51 @@ select { gap: 10px; } +.hint-text { + font-size: 12px; + color: var(--muted); + line-height: 1.5; +} + +.modal-backdrop { + position: fixed; + inset: 0; + background: rgba(9, 16, 32, 0.45); + display: grid; + place-items: center; + padding: 20px; + z-index: 1200; +} + +.modal { + width: min(640px, 92vw); + background: #fff; + border-radius: 18px; + border: 1px solid var(--border); + box-shadow: 0 24px 60px rgba(17, 20, 19, 0.25); + padding: 20px; + display: grid; + gap: 14px; +} + +.modal-header { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; +} + +.modal-body { + display: grid; + gap: 10px; + font-size: 14px; + color: var(--ink); +} + +.modal-body h4 { + margin-top: 6px; +} + .admin-panel { margin: 16px 0 32px; display: grid; @@ -401,13 +625,13 @@ select { font-size: 10px; text-transform: uppercase; letter-spacing: 0.12em; - background: rgba(15, 118, 110, 0.16); + background: rgba(37, 99, 235, 0.16); color: var(--primary-strong); } .status-badge.missing { - background: rgba(226, 182, 68, 0.25); - color: #8a5d00; + background: rgba(124, 58, 237, 0.18); + color: #5b21b6; } button:disabled { diff --git a/frontend/src/toast.tsx b/frontend/src/toast.tsx new file mode 100644 index 00000000..aebc30bd --- /dev/null +++ b/frontend/src/toast.tsx @@ -0,0 +1,67 @@ +import { createContext, useCallback, useContext, useMemo, useRef, useState } from "react"; + +type ToastVariant = "success" | "error" | "info"; + +export type Toast = { + id: string; + message: string; + variant: ToastVariant; +}; + +type ToastContextValue = { + toasts: Toast[]; + pushToast: (message: string, variant?: ToastVariant, durationMs?: number) => void; + dismissToast: (id: string) => void; +}; + +const ToastContext = createContext(null); + +export const ToastProvider = ({ children }: { children: React.ReactNode }) => { + const [toasts, setToasts] = useState([]); + const timers = useRef(new Map()); + + const dismissToast = useCallback((id: string) => { + setToasts((prev) => prev.filter((toast) => toast.id !== id)); + const timer = timers.current.get(id); + if (timer) { + window.clearTimeout(timer); + timers.current.delete(id); + } + }, []); + + const pushToast = useCallback( + (message: string, variant: ToastVariant = "info", durationMs = 4000) => { + const id = `${Date.now()}-${Math.random().toString(36).slice(2, 8)}`; + setToasts((prev) => [...prev, { id, message, variant }]); + const timer = window.setTimeout(() => dismissToast(id), durationMs); + timers.current.set(id, timer); + }, + [dismissToast] + ); + + const value = useMemo(() => ({ toasts, pushToast, dismissToast }), [toasts, pushToast, dismissToast]); + + return ( + + {children} +
+ {toasts.map((toast) => ( +
+ {toast.message} + +
+ ))} +
+
+ ); +}; + +export const useToast = () => { + const ctx = useContext(ToastContext); + if (!ctx) { + throw new Error("useToast must be used within ToastProvider"); + } + return ctx; +}; diff --git a/screenshot/Screenshot 2026-01-22 194754.png b/screenshot/Screenshot 2026-01-22 194754.png new file mode 100644 index 0000000000000000000000000000000000000000..51a6dc582226bde73d6449e484acd0fe81b8133f GIT binary patch literal 148567 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�&0iOtve1IAscV-vL`sj66{t9BeUI7}woKv0HSODFG$wy^ z^-P)!0s^foLKJdg2#TRu?{}XUy&v36nsqgH#euPpJkxkRvW*MLsBbwciw6+zoOm4l zN5M|5x~Z#yG!zy1z}DJG97q7>!x%Z4Z**+_vpNspuML4rE&qaX%g6rz<5P`vIeJKfsAD}LLgGst__NK)H{#RyF~Fs6pK;Gqwd#hi z@(jyF1uUI|>{|OTIlb>w++>klgMGyuZos{wo2LwGkbH)iiVU@=MwjESh_2j2)BfoE zm8E}wBxfhIz9hPps=XrPuSah`uGSsPx)_&-8tTRZ4#;;D!E3wmln^C zVlUH?4AGU;ju1DrMXAua+{V~Re=y^Blg*Exwb%H(pAG{VeAo=?4?(nyKV9ypafn0# z1WTNx7r$^Css*7S!~v!WH`~*-H9j-OxHQqRFBU4j*y;Ex=_A;sis%FncSQp5JBsj% z(El7-QR?ZBN#B_G;uNyR<2m@s1b(>oJEZ2%ESk}&5yRI;Inj_BdSiGt4X0EH9)idZ zyg!Q5BR4Ro9e~r04lT7+7A&>b?*{<9`_Y)NX!Es6?N5*qa>-!J1U`zvOPLMT#VRBi zZh+cCgdUA{e=hO8-`xBG=b-t52l0ocIVAPahfWTj7STi#G6p!Pevv&2U45;T7D1#- zv2yCK%ECoZ@9R{Riz_LtP!+|cNV-V$)8-9Gd$=Tp~#KUWq*De*RBU=2%M(ay^62g!Mu z63@H01UGd7M44G!I1DscYNFE#r4jklWs7+@ykuv(w&y|KWqlw6K4CZ%Ej)a{*p1$4nO}PB_99Uao zA;`i=AJ!Z4tQM7xd}LX#QAW~jOa7Wjg}04}MVdD~efXtj665#W{l{tkvrWf5dOs}r zwK9g&BT7$x zyIk5uA<->-cQB6NAJP$v=XhQT{-$)axBL5F15g3ZH>h4=Mh2v(iTIoSx7!=3HbjCn zYr8nb(MYp^Ke(O)e;N)!fg%~TcjS#uo_sp=Wo|Cx=W&Ex66K}4@K)!5`nw%MiOq)p z$TiXidfvk2YctKHiogK`0gY#MDUMp&V(S=tpSPUn_AMq+t|ALDb%j8S?p$;tDG-gD zS6W8c;dtE5!Sk2qsV(!Ri&>&>@c}FC;6KA_>7L9Uotbl3~!B&j06H%wxG~Cs$Tm*sREclQ_Qvfs^Ywa zS}}fYO1+M@67)M)V>6(+M1@a@xMu^CKyX9+YEtBOwM5P7z$iXO7-RX1efVm1yq3Fj zAXH|%jc_X~GJL#R=H5G~6dq*B zU9bzoYqeWqHSikVE(J-mgfp`mcJp{3s7t01B05f}yVqX^1%fyhTfs!fQ49WeUZ+XY zRfBX5>!EnsMV9)UM0^gvKS7X`CeX8n5|5N*y#co6hd9O z5vk&a`FxGnu68&%=_(vzhT5KDiFV!{ZCDN667IkbsJ|O--+1pek?cpp*SB+s!_}4U zrzXV(^2Tcwi|tSczX#C01VP#=b2ntPGwQL#>REd-V%Q*cwY@mDRqA@_vxt9PjJ6Wm zf&Tm_bFw0hG13yAO0V$ONw$6P>~6hqf}J@&_nNU`&Mj zFI2hX^13)IFD&5Cftl*-)7z@G#cZT)iLdi|Db~?JXECC?mkFbCEupX_ti#_=#87WO z200>BcG?SFn^L-H|7}=2OwH4bc#@|Ej%7e?%Tw|*H(}}mHH<%M*T}3r6nEMpwU(!3 zv+1qMj9s3|PjPC9nh*X~vpDh6%`)eJ&oL{dqpPJVeOz c^QH{Za#ijLeR2?P?@^ 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 foIt2`UvsB`Q`rrP1Gbz literal 0 HcmV?d00001