mirror of
https://github.com/mauriceboe/TREK.git
synced 2026-10-22 06:56:35 +00:00
6ef6a7efd2
seedDocumentProviders() had no caller left: the migration that creates the tables and DocumentProviderSeeder both import only the DOCUMENT_PROVIDERS and DOCUMENT_PROVIDER_FIELDS constants. Its two INSERT OR IGNORE statements were the only SQLite-only spellings in the file and had been baselined rather than removed. Deleting it lets the file leave the dialect baseline (13 hits down to 11) and the better-sqlite3 import allowlist in eslint.config.mjs, since nothing in it touches the driver any more. DOCUMENT_PROVIDER_SEED_IDS goes with it, it had no importer either.
339 lines
7.9 KiB
TypeScript
339 lines
7.9 KiB
TypeScript
|
|
/**
|
|
* The five document providers and the fields their connection form asks for.
|
|
*
|
|
* Shared by the migration that introduces the tables and by
|
|
* DocumentProviderSeeder, so a fresh install and an upgraded one end up with
|
|
* the same rows. Both insert without overwriting an existing row, which is what
|
|
* lets an operator rename or re-sort a row without a later boot undoing it.
|
|
*
|
|
* `label` and `hint` are i18n key suffixes, never display text: the client
|
|
* resolves them as `docsync.<label>`, the same way the photo provider form
|
|
* resolves `memories.<label>`.
|
|
*
|
|
* Nextcloud and OpenCloud are separate rows although one WebDAV adapter serves
|
|
* both: the fields differ (a Nextcloud login name and app password against a
|
|
* folder, an OpenCloud username and app token against a space), and an operator
|
|
* scanning the addon shelf should find the product they actually run.
|
|
*/
|
|
|
|
export interface ProviderRow {
|
|
id: string;
|
|
name: string;
|
|
description: string;
|
|
icon: string;
|
|
sort_order: number;
|
|
}
|
|
|
|
export interface ProviderFieldRow {
|
|
provider_id: string;
|
|
field_key: string;
|
|
label: string;
|
|
input_type: 'text' | 'url' | 'password' | 'checkbox';
|
|
placeholder: string | null;
|
|
hint: string | null;
|
|
required: 0 | 1;
|
|
secret: 0 | 1;
|
|
sort_order: number;
|
|
}
|
|
|
|
export const DOCUMENT_PROVIDERS: ProviderRow[] = [
|
|
{
|
|
id: 'paperless',
|
|
name: 'Paperless-ngx',
|
|
description: 'Two-way document sync with a Paperless-ngx instance, scoped by tag',
|
|
icon: 'FileText',
|
|
sort_order: 0,
|
|
},
|
|
{
|
|
id: 'papra',
|
|
name: 'Papra',
|
|
description: 'Two-way document sync with a Papra organisation, scoped by tag',
|
|
icon: 'FileText',
|
|
sort_order: 1,
|
|
},
|
|
{
|
|
id: 'nextcloud',
|
|
name: 'Nextcloud',
|
|
description: 'Two-way document sync with a Nextcloud folder over WebDAV',
|
|
icon: 'Cloud',
|
|
sort_order: 2,
|
|
},
|
|
{
|
|
id: 'opencloud',
|
|
name: 'OpenCloud',
|
|
description: 'Two-way document sync with an OpenCloud space over WebDAV',
|
|
icon: 'Cloud',
|
|
sort_order: 3,
|
|
},
|
|
{
|
|
id: 'synologydrive',
|
|
name: 'Synology Drive',
|
|
description: 'Two-way document sync with a folder on a Synology NAS',
|
|
icon: 'HardDrive',
|
|
sort_order: 4,
|
|
},
|
|
];
|
|
|
|
/**
|
|
* `allow_insecure_tls` defaults to 0 on every provider, unlike the Synology
|
|
* photo provider, where skipping verification is the stored default. A LAN
|
|
* instance with a self-signed certificate is common enough to need the switch
|
|
* and not common enough to justify shipping it on.
|
|
*/
|
|
export const DOCUMENT_PROVIDER_FIELDS: ProviderFieldRow[] = [
|
|
// Paperless-ngx: token auth, tag scope.
|
|
{
|
|
provider_id: 'paperless',
|
|
field_key: 'base_url',
|
|
label: 'providerUrl',
|
|
input_type: 'url',
|
|
placeholder: 'https://paperless.example.com',
|
|
hint: null,
|
|
required: 1,
|
|
secret: 0,
|
|
sort_order: 0,
|
|
},
|
|
{
|
|
provider_id: 'paperless',
|
|
field_key: 'api_token',
|
|
label: 'providerApiToken',
|
|
input_type: 'password',
|
|
placeholder: 'API token',
|
|
hint: 'hintPaperlessToken',
|
|
required: 1,
|
|
secret: 1,
|
|
sort_order: 1,
|
|
},
|
|
{
|
|
provider_id: 'paperless',
|
|
field_key: 'allow_insecure_tls',
|
|
label: 'allowInsecureTls',
|
|
input_type: 'checkbox',
|
|
placeholder: null,
|
|
hint: null,
|
|
required: 0,
|
|
secret: 0,
|
|
sort_order: 2,
|
|
},
|
|
|
|
// Papra: bearer key, and an organisation the key must already belong to.
|
|
{
|
|
provider_id: 'papra',
|
|
field_key: 'base_url',
|
|
label: 'providerUrl',
|
|
input_type: 'url',
|
|
placeholder: 'https://papra.example.com',
|
|
hint: null,
|
|
required: 1,
|
|
secret: 0,
|
|
sort_order: 0,
|
|
},
|
|
{
|
|
provider_id: 'papra',
|
|
field_key: 'api_key',
|
|
label: 'providerApiKey',
|
|
input_type: 'password',
|
|
placeholder: 'ppapi_…',
|
|
hint: 'hintPapraKey',
|
|
required: 1,
|
|
secret: 1,
|
|
sort_order: 1,
|
|
},
|
|
{
|
|
provider_id: 'papra',
|
|
field_key: 'organization_id',
|
|
label: 'providerOrganization',
|
|
input_type: 'text',
|
|
placeholder: 'org_…',
|
|
hint: 'hintPapraOrg',
|
|
required: 1,
|
|
secret: 0,
|
|
sort_order: 2,
|
|
},
|
|
{
|
|
provider_id: 'papra',
|
|
field_key: 'allow_insecure_tls',
|
|
label: 'allowInsecureTls',
|
|
input_type: 'checkbox',
|
|
placeholder: null,
|
|
hint: null,
|
|
required: 0,
|
|
secret: 0,
|
|
sort_order: 3,
|
|
},
|
|
|
|
// Nextcloud: an app password, never the account password. The latter breaks
|
|
// the moment the account turns on 2FA or logs in through OIDC.
|
|
{
|
|
provider_id: 'nextcloud',
|
|
field_key: 'base_url',
|
|
label: 'providerUrl',
|
|
input_type: 'url',
|
|
placeholder: 'https://cloud.example.com',
|
|
hint: null,
|
|
required: 1,
|
|
secret: 0,
|
|
sort_order: 0,
|
|
},
|
|
{
|
|
provider_id: 'nextcloud',
|
|
field_key: 'login_name',
|
|
label: 'providerUsername',
|
|
input_type: 'text',
|
|
placeholder: 'username',
|
|
hint: 'hintNextcloudLogin',
|
|
required: 1,
|
|
secret: 0,
|
|
sort_order: 1,
|
|
},
|
|
{
|
|
provider_id: 'nextcloud',
|
|
field_key: 'app_password',
|
|
label: 'providerAppPassword',
|
|
input_type: 'password',
|
|
placeholder: 'app password',
|
|
hint: 'hintNextcloudAppPassword',
|
|
required: 1,
|
|
secret: 1,
|
|
sort_order: 2,
|
|
},
|
|
{
|
|
provider_id: 'nextcloud',
|
|
field_key: 'base_path',
|
|
label: 'providerBasePath',
|
|
input_type: 'text',
|
|
placeholder: '/TREK',
|
|
hint: 'hintBasePath',
|
|
required: 0,
|
|
secret: 0,
|
|
sort_order: 3,
|
|
},
|
|
{
|
|
provider_id: 'nextcloud',
|
|
field_key: 'allow_insecure_tls',
|
|
label: 'allowInsecureTls',
|
|
input_type: 'checkbox',
|
|
placeholder: null,
|
|
hint: null,
|
|
required: 0,
|
|
secret: 0,
|
|
sort_order: 4,
|
|
},
|
|
|
|
// OpenCloud: auth-app token, spaces instead of folders.
|
|
{
|
|
provider_id: 'opencloud',
|
|
field_key: 'base_url',
|
|
label: 'providerUrl',
|
|
input_type: 'url',
|
|
placeholder: 'https://opencloud.example.com',
|
|
hint: null,
|
|
required: 1,
|
|
secret: 0,
|
|
sort_order: 0,
|
|
},
|
|
{
|
|
provider_id: 'opencloud',
|
|
field_key: 'username',
|
|
label: 'providerUsername',
|
|
input_type: 'text',
|
|
placeholder: 'username',
|
|
hint: null,
|
|
required: 1,
|
|
secret: 0,
|
|
sort_order: 1,
|
|
},
|
|
{
|
|
provider_id: 'opencloud',
|
|
field_key: 'app_token',
|
|
label: 'providerAppToken',
|
|
input_type: 'password',
|
|
placeholder: 'app token',
|
|
hint: 'hintOpenCloudToken',
|
|
required: 1,
|
|
secret: 1,
|
|
sort_order: 2,
|
|
},
|
|
{
|
|
provider_id: 'opencloud',
|
|
field_key: 'allow_insecure_tls',
|
|
label: 'allowInsecureTls',
|
|
input_type: 'checkbox',
|
|
placeholder: null,
|
|
hint: null,
|
|
required: 0,
|
|
secret: 0,
|
|
sort_order: 3,
|
|
},
|
|
|
|
// Synology: DSM has no app tokens at all, so this is a real account. The OTP
|
|
// is used once to obtain a device token, which is what gets stored.
|
|
{
|
|
provider_id: 'synologydrive',
|
|
field_key: 'base_url',
|
|
label: 'providerUrl',
|
|
input_type: 'url',
|
|
placeholder: 'https://nas.example.com:5001',
|
|
hint: 'hintSynologyUrl',
|
|
required: 1,
|
|
secret: 0,
|
|
sort_order: 0,
|
|
},
|
|
{
|
|
provider_id: 'synologydrive',
|
|
field_key: 'username',
|
|
label: 'providerUsername',
|
|
input_type: 'text',
|
|
placeholder: 'username',
|
|
hint: 'hintSynologyUser',
|
|
required: 1,
|
|
secret: 0,
|
|
sort_order: 1,
|
|
},
|
|
{
|
|
provider_id: 'synologydrive',
|
|
field_key: 'password',
|
|
label: 'providerPassword',
|
|
input_type: 'password',
|
|
placeholder: 'password',
|
|
hint: null,
|
|
required: 1,
|
|
secret: 1,
|
|
sort_order: 2,
|
|
},
|
|
{
|
|
provider_id: 'synologydrive',
|
|
field_key: 'otp_code',
|
|
label: 'providerOTP',
|
|
input_type: 'text',
|
|
placeholder: '123456',
|
|
hint: 'hintSynologyOtp',
|
|
required: 0,
|
|
secret: 1,
|
|
sort_order: 3,
|
|
},
|
|
{
|
|
provider_id: 'synologydrive',
|
|
field_key: 'base_path',
|
|
label: 'providerBasePath',
|
|
input_type: 'text',
|
|
placeholder: '/trek',
|
|
hint: 'hintBasePath',
|
|
required: 0,
|
|
secret: 0,
|
|
sort_order: 4,
|
|
},
|
|
{
|
|
provider_id: 'synologydrive',
|
|
field_key: 'allow_insecure_tls',
|
|
label: 'allowInsecureTls',
|
|
input_type: 'checkbox',
|
|
placeholder: null,
|
|
hint: null,
|
|
required: 0,
|
|
secret: 0,
|
|
sort_order: 5,
|
|
},
|
|
];
|