This commit is contained in:
wayneshn
2025-10-24 15:11:40 +00:00
parent 4c55701c18
commit 0000736da1
61 changed files with 604 additions and 158 deletions

View File

@@ -9,7 +9,7 @@
<link rel="preload stylesheet" href="/assets/style.BZzyQG4l.css" as="style">
<link rel="preload stylesheet" href="/vp-icons.css" as="style">
<script type="module" src="/assets/app.BlZK-RBi.js"></script>
<script type="module" src="/assets/app.EiSr1Ssv.js"></script>
<link rel="preload" href="/assets/inter-roman-latin.Di8DUHzh.woff2" as="font" type="font/woff2" crossorigin="">
<script defer src="https://analytics.zenceipt.com/script.js" data-website-id="2c8b452e-eab5-4f82-8ead-902d8f8b976f"></script>
<link rel="icon" href="/logo-sq.svg">
@@ -18,7 +18,7 @@
</head>
<body>
<div id="app"></div>
<script>window.__VP_HASH_MAP__=JSON.parse("{\"api_archived-email.md\":\"rYKCgF6R\",\"api_auth.md\":\"BqZ6wN0q\",\"api_authentication.md\":\"CyDXtQYg\",\"api_dashboard.md\":\"lu70c-Pf\",\"api_index.md\":\"DFnFK07E\",\"api_ingestion.md\":\"B8EOVCr7\",\"api_rate-limiting.md\":\"a1m1O0N8\",\"api_search.md\":\"B8tLtEbg\",\"api_storage.md\":\"DKUKvFrO\",\"index.md\":\"9PKJf5H1\",\"services_iam-service_iam-policy.md\":\"BMP46V9x\",\"services_index.md\":\"BLn224J3\",\"services_ocr-service.md\":\"aPypYfme\",\"services_storage-service.md\":\"Bgos1Y2E\",\"summary.md\":\"5seSND4L\",\"user-guides_email-providers_eml.md\":\"a288N17s\",\"user-guides_email-providers_google-workspace.md\":\"BWo_12De\",\"user-guides_email-providers_imap.md\":\"DnuaRv-0\",\"user-guides_email-providers_index.md\":\"C3XNPTNj\",\"user-guides_email-providers_mbox.md\":\"Cavm6di7\",\"user-guides_email-providers_microsoft-365.md\":\"QHHVfYxW\",\"user-guides_email-providers_pst.md\":\"c6jOF8P1\",\"user-guides_installation.md\":\"DfRfk8Oe\",\"user-guides_settings_system.md\":\"DZw4puzm\",\"user-guides_upgrade-and-migration_meilisearch-upgrade.md\":\"xQXm1E12\",\"user-guides_upgrade-and-migration_upgrade.md\":\"DieppEdN\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"en-US\",\"dir\":\"ltr\",\"title\":\"Open Archiver Docs\",\"description\":\"Official documentation for the Open Archiver project.\",\"base\":\"/\",\"head\":[],\"router\":{\"prefetchLinks\":true},\"appearance\":true,\"themeConfig\":{\"search\":{\"provider\":\"local\"},\"logo\":{\"src\":\"/logo-sq.svg\"},\"nav\":[{\"text\":\"Home\",\"link\":\"/\"},{\"text\":\"Github\",\"link\":\"https://github.com/LogicLabs-OU/OpenArchiver\"},{\"text\":\"Website\",\"link\":\"https://openarchiver.com/\"},{\"text\":\"Discord\",\"link\":\"https://discord.gg/MTtD7BhuTQ\"}],\"sidebar\":[{\"text\":\"User Guides\",\"items\":[{\"text\":\"Get Started\",\"link\":\"/\"},{\"text\":\"Installation\",\"link\":\"/user-guides/installation\"},{\"text\":\"Email Providers\",\"link\":\"/user-guides/email-providers/\",\"collapsed\":true,\"items\":[{\"text\":\"Generic IMAP Server\",\"link\":\"/user-guides/email-providers/imap\"},{\"text\":\"Google Workspace\",\"link\":\"/user-guides/email-providers/google-workspace\"},{\"text\":\"Microsoft 365\",\"link\":\"/user-guides/email-providers/microsoft-365\"},{\"text\":\"EML Import\",\"link\":\"/user-guides/email-providers/eml\"},{\"text\":\"PST Import\",\"link\":\"/user-guides/email-providers/pst\"},{\"text\":\"Mbox Import\",\"link\":\"/user-guides/email-providers/mbox\"}]},{\"text\":\"Settings\",\"collapsed\":true,\"items\":[{\"text\":\"System\",\"link\":\"/user-guides/settings/system\"}]},{\"text\":\"Upgrading and Migration\",\"collapsed\":true,\"items\":[{\"text\":\"Upgrading\",\"link\":\"/user-guides/upgrade-and-migration/upgrade\"},{\"text\":\"Meilisearch Upgrade\",\"link\":\"/user-guides/upgrade-and-migration/meilisearch-upgrade\"}]}]},{\"text\":\"API Reference\",\"items\":[{\"text\":\"Overview\",\"link\":\"/api/\"},{\"text\":\"Authentication\",\"link\":\"/api/authentication\"},{\"text\":\"Rate Limiting\",\"link\":\"/api/rate-limiting\"},{\"text\":\"Auth\",\"link\":\"/api/auth\"},{\"text\":\"Archived Email\",\"link\":\"/api/archived-email\"},{\"text\":\"Dashboard\",\"link\":\"/api/dashboard\"},{\"text\":\"Ingestion\",\"link\":\"/api/ingestion\"},{\"text\":\"Search\",\"link\":\"/api/search\"},{\"text\":\"Storage\",\"link\":\"/api/storage\"}]},{\"text\":\"Services\",\"items\":[{\"text\":\"Overview\",\"link\":\"/services/\"},{\"text\":\"Storage Service\",\"link\":\"/services/storage-service\"},{\"text\":\"OCR Service\",\"link\":\"/services/ocr-service\"},{\"text\":\"IAM Service\",\"items\":[{\"text\":\"IAM Policies\",\"link\":\"/services/iam-service/iam-policy\"}]}]}]},\"locales\":{},\"scrollOffset\":134,\"cleanUrls\":false}");</script>
<script>window.__VP_HASH_MAP__=JSON.parse("{\"api_archived-email.md\":\"rYKCgF6R\",\"api_auth.md\":\"BqZ6wN0q\",\"api_authentication.md\":\"CyDXtQYg\",\"api_dashboard.md\":\"lu70c-Pf\",\"api_index.md\":\"DFnFK07E\",\"api_ingestion.md\":\"B8EOVCr7\",\"api_integrity.md\":\"CTx79Yjz\",\"api_jobs.md\":\"1HdD59Aa\",\"api_rate-limiting.md\":\"a1m1O0N8\",\"api_search.md\":\"B8tLtEbg\",\"api_storage.md\":\"DKUKvFrO\",\"enterprise_audit-log_api.md\":\"BVTisviS\",\"enterprise_audit-log_audit-service.md\":\"BSa897FH\",\"enterprise_audit-log_guide.md\":\"CV4dRt8z\",\"enterprise_audit-log_index.md\":\"D4TEa94R\",\"index.md\":\"9PKJf5H1\",\"services_iam-service_iam-policy.md\":\"BMP46V9x\",\"services_index.md\":\"BLn224J3\",\"services_ocr-service.md\":\"aPypYfme\",\"services_storage-service.md\":\"Bgos1Y2E\",\"summary.md\":\"5seSND4L\",\"user-guides_email-providers_eml.md\":\"a288N17s\",\"user-guides_email-providers_google-workspace.md\":\"BWo_12De\",\"user-guides_email-providers_imap.md\":\"DnuaRv-0\",\"user-guides_email-providers_index.md\":\"C3XNPTNj\",\"user-guides_email-providers_mbox.md\":\"Cavm6di7\",\"user-guides_email-providers_microsoft-365.md\":\"QHHVfYxW\",\"user-guides_email-providers_pst.md\":\"c6jOF8P1\",\"user-guides_installation.md\":\"wSyVr6UW\",\"user-guides_integrity-check.md\":\"I-8CVL-T\",\"user-guides_settings_system.md\":\"DZw4puzm\",\"user-guides_troubleshooting_cors-errors.md\":\"DJT7M9F5\",\"user-guides_upgrade-and-migration_meilisearch-upgrade.md\":\"xQXm1E12\",\"user-guides_upgrade-and-migration_upgrade.md\":\"DieppEdN\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"en-US\",\"dir\":\"ltr\",\"title\":\"Open Archiver Docs\",\"description\":\"Official documentation for the Open Archiver project.\",\"base\":\"/\",\"head\":[],\"router\":{\"prefetchLinks\":true},\"appearance\":true,\"themeConfig\":{\"search\":{\"provider\":\"local\"},\"logo\":{\"src\":\"/logo-sq.svg\"},\"nav\":[{\"text\":\"Home\",\"link\":\"/\"},{\"text\":\"Github\",\"link\":\"https://github.com/LogicLabs-OU/OpenArchiver\"},{\"text\":\"Website\",\"link\":\"https://openarchiver.com/\"},{\"text\":\"Discord\",\"link\":\"https://discord.gg/MTtD7BhuTQ\"}],\"sidebar\":[{\"text\":\"User Guides\",\"items\":[{\"text\":\"Get Started\",\"link\":\"/\"},{\"text\":\"Installation\",\"link\":\"/user-guides/installation\"},{\"text\":\"Email Integrity Check\",\"link\":\"/user-guides/integrity-check\"},{\"text\":\"Email Providers\",\"link\":\"/user-guides/email-providers/\",\"collapsed\":true,\"items\":[{\"text\":\"Generic IMAP Server\",\"link\":\"/user-guides/email-providers/imap\"},{\"text\":\"Google Workspace\",\"link\":\"/user-guides/email-providers/google-workspace\"},{\"text\":\"Microsoft 365\",\"link\":\"/user-guides/email-providers/microsoft-365\"},{\"text\":\"EML Import\",\"link\":\"/user-guides/email-providers/eml\"},{\"text\":\"PST Import\",\"link\":\"/user-guides/email-providers/pst\"},{\"text\":\"Mbox Import\",\"link\":\"/user-guides/email-providers/mbox\"}]},{\"text\":\"Settings\",\"collapsed\":true,\"items\":[{\"text\":\"System\",\"link\":\"/user-guides/settings/system\"}]},{\"text\":\"Upgrading and Migration\",\"collapsed\":true,\"items\":[{\"text\":\"Upgrading\",\"link\":\"/user-guides/upgrade-and-migration/upgrade\"},{\"text\":\"Meilisearch Upgrade\",\"link\":\"/user-guides/upgrade-and-migration/meilisearch-upgrade\"}]}]},{\"text\":\"API Reference\",\"items\":[{\"text\":\"Overview\",\"link\":\"/api/\"},{\"text\":\"Authentication\",\"link\":\"/api/authentication\"},{\"text\":\"Rate Limiting\",\"link\":\"/api/rate-limiting\"},{\"text\":\"Auth\",\"link\":\"/api/auth\"},{\"text\":\"Archived Email\",\"link\":\"/api/archived-email\"},{\"text\":\"Dashboard\",\"link\":\"/api/dashboard\"},{\"text\":\"Ingestion\",\"link\":\"/api/ingestion\"},{\"text\":\"Integrity Check\",\"link\":\"/api/integrity\"},{\"text\":\"Search\",\"link\":\"/api/search\"},{\"text\":\"Storage\",\"link\":\"/api/storage\"},{\"text\":\"Jobs\",\"link\":\"/api/jobs\"}]},{\"text\":\"Services\",\"items\":[{\"text\":\"Overview\",\"link\":\"/services/\"},{\"text\":\"Storage Service\",\"link\":\"/services/storage-service\"},{\"text\":\"OCR Service\",\"link\":\"/services/ocr-service\"},{\"text\":\"IAM Service\",\"items\":[{\"text\":\"IAM Policies\",\"link\":\"/services/iam-service/iam-policy\"}]}]}]},\"locales\":{},\"scrollOffset\":134,\"cleanUrls\":false}");</script>
</body>
</html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

40
api/integrity.html Normal file

File diff suppressed because one or more lines are too long

87
api/jobs.html Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,14 @@
import{_ as e,c as s,o as i,ag as a}from"./chunks/framework.S-Qvb3wi.js";const k=JSON.parse('{"title":"Integrity Check API","description":"","frontmatter":{},"headers":[],"relativePath":"api/integrity.md","filePath":"api/integrity.md"}'),n={name:"api/integrity.md"};function l(h,t,o,r,d,p){return i(),s("div",null,t[0]||(t[0]=[a(`<h1 id="integrity-check-api" tabindex="-1">Integrity Check API <a class="header-anchor" href="#integrity-check-api" aria-label="Permalink to &quot;Integrity Check API&quot;"></a></h1><p>The Integrity Check API provides an endpoint to verify the cryptographic hash of an archived email and its attachments against the stored values in the database. This allows you to ensure that the stored files have not been tampered with or corrupted since they were archived.</p><h2 id="check-email-integrity" tabindex="-1">Check Email Integrity <a class="header-anchor" href="#check-email-integrity" aria-label="Permalink to &quot;Check Email Integrity&quot;"></a></h2><p>Verifies the integrity of a specific archived email and all of its associated attachments.</p><ul><li><strong>URL:</strong> <code>/api/v1/integrity/:id</code></li><li><strong>Method:</strong> <code>GET</code></li><li><strong>URL Params:</strong><ul><li><code>id=[string]</code> (required) - The UUID of the archived email to check.</li></ul></li><li><strong>Permissions:</strong> <code>read:archive</code></li><li><strong>Success Response:</strong><ul><li><strong>Code:</strong> 200 OK</li><li><strong>Content:</strong> <code>IntegrityCheckResult[]</code></li></ul></li></ul><h3 id="response-body-integritycheckresult" tabindex="-1">Response Body <code>IntegrityCheckResult</code> <a class="header-anchor" href="#response-body-integritycheckresult" aria-label="Permalink to &quot;Response Body \`IntegrityCheckResult\`&quot;"></a></h3><p>An array of objects, each representing the result of an integrity check for a single file (either the email itself or an attachment).</p><table tabindex="0"><thead><tr><th style="text-align:left;">Field</th><th style="text-align:left;">Type</th><th style="text-align:left;">Description</th></tr></thead><tbody><tr><td style="text-align:left;"><code>type</code></td><td style="text-align:left;"><code>&#39;email&#39; | &#39;attachment&#39;</code></td><td style="text-align:left;">The type of the file being checked.</td></tr><tr><td style="text-align:left;"><code>id</code></td><td style="text-align:left;"><code>string</code></td><td style="text-align:left;">The UUID of the email or attachment.</td></tr><tr><td style="text-align:left;"><code>filename</code></td><td style="text-align:left;"><code>string</code> (optional)</td><td style="text-align:left;">The filename of the attachment. This field is only present for attachments.</td></tr><tr><td style="text-align:left;"><code>isValid</code></td><td style="text-align:left;"><code>boolean</code></td><td style="text-align:left;"><code>true</code> if the current hash matches the stored hash, otherwise <code>false</code>.</td></tr><tr><td style="text-align:left;"><code>reason</code></td><td style="text-align:left;"><code>string</code> (optional)</td><td style="text-align:left;">A reason for the failure. Only present if <code>isValid</code> is <code>false</code>.</td></tr></tbody></table><h3 id="example-response" tabindex="-1">Example Response <a class="header-anchor" href="#example-response" aria-label="Permalink to &quot;Example Response&quot;"></a></h3><div class="language-json vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">[</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;type&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;email&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;id&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;a1b2c3d4-e5f6-7890-1234-567890abcdef&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;isValid&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">true</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;type&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;attachment&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;id&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;b2c3d4e5-f6a7-8901-2345-67890abcdef1&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;filename&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;document.pdf&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;isValid&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">false</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;reason&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;Stored hash does not match current hash.&quot;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">]</span></span></code></pre></div><ul><li><strong>Error Response:</strong><ul><li><strong>Code:</strong> 404 Not Found</li><li><strong>Content:</strong> <code>{ &quot;message&quot;: &quot;Archived email not found&quot; }</code></li></ul></li></ul>`,11)]))}const g=e(n,[["render",l]]);export{k as __pageData,g as default};

View File

@@ -0,0 +1 @@
import{_ as e,c as s,o as i,ag as a}from"./chunks/framework.S-Qvb3wi.js";const k=JSON.parse('{"title":"Integrity Check API","description":"","frontmatter":{},"headers":[],"relativePath":"api/integrity.md","filePath":"api/integrity.md"}'),n={name:"api/integrity.md"};function l(h,t,o,r,d,p){return i(),s("div",null,t[0]||(t[0]=[a("",11)]))}const g=e(n,[["render",l]]);export{k as __pageData,g as default};

View File

@@ -0,0 +1,61 @@
import{_ as i,c as a,o as t,ag as n}from"./chunks/framework.S-Qvb3wi.js";const E=JSON.parse('{"title":"Jobs API","description":"","frontmatter":{},"headers":[],"relativePath":"api/jobs.md","filePath":"api/jobs.md"}'),e={name:"api/jobs.md"};function l(h,s,p,k,o,r){return t(),a("div",null,s[0]||(s[0]=[n(`<h1 id="jobs-api" tabindex="-1">Jobs API <a class="header-anchor" href="#jobs-api" aria-label="Permalink to &quot;Jobs API&quot;"></a></h1><p>The Jobs API provides endpoints for monitoring the job queues and the jobs within them.</p><h2 id="overview" tabindex="-1">Overview <a class="header-anchor" href="#overview" aria-label="Permalink to &quot;Overview&quot;"></a></h2><p>Open Archiver uses a job queue system to handle asynchronous tasks like email ingestion and indexing. The system is built on Redis and BullMQ and uses a producer-consumer pattern.</p><h3 id="job-statuses" tabindex="-1">Job Statuses <a class="header-anchor" href="#job-statuses" aria-label="Permalink to &quot;Job Statuses&quot;"></a></h3><p>Jobs can have one of the following statuses:</p><ul><li><strong>active:</strong> The job is currently being processed.</li><li><strong>completed:</strong> The job has been completed successfully.</li><li><strong>failed:</strong> The job has failed after all retry attempts.</li><li><strong>delayed:</strong> The job is delayed and will be processed at a later time.</li><li><strong>waiting:</strong> The job is waiting to be processed.</li><li><strong>paused:</strong> The job is paused and will not be processed until it is resumed.</li></ul><h3 id="errors" tabindex="-1">Errors <a class="header-anchor" href="#errors" aria-label="Permalink to &quot;Errors&quot;"></a></h3><p>When a job fails, the <code>failedReason</code> and <code>stacktrace</code> fields will contain information about the error. The <code>error</code> field will also be populated with the <code>failedReason</code> for easier access.</p><h3 id="job-preservation" tabindex="-1">Job Preservation <a class="header-anchor" href="#job-preservation" aria-label="Permalink to &quot;Job Preservation&quot;"></a></h3><p>Jobs are preserved for a limited time after they are completed or failed. This means that the job counts and the jobs that you see in the API are for a limited time.</p><ul><li><strong>Completed jobs:</strong> The last 1000 completed jobs are preserved.</li><li><strong>Failed jobs:</strong> The last 5000 failed jobs are preserved.</li></ul><h2 id="get-all-queues" tabindex="-1">Get All Queues <a class="header-anchor" href="#get-all-queues" aria-label="Permalink to &quot;Get All Queues&quot;"></a></h2><ul><li><strong>Endpoint:</strong> <code>GET /v1/jobs/queues</code></li><li><strong>Description:</strong> Retrieves a list of all job queues and their job counts.</li><li><strong>Permissions:</strong> <code>manage:all</code></li><li><strong>Responses:</strong><ul><li><code>200 OK</code>: Returns a list of queue overviews.</li><li><code>401 Unauthorized</code>: If the user is not authenticated.</li><li><code>403 Forbidden</code>: If the user does not have the required permissions.</li></ul></li></ul><h3 id="response-body" tabindex="-1">Response Body <a class="header-anchor" href="#response-body" aria-label="Permalink to &quot;Response Body&quot;"></a></h3><div class="language-json vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">{</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;queues&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;name&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;ingestion&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;counts&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;active&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;completed&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">56</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;failed&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">4</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;delayed&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">3</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;waiting&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;paused&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">0</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;name&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;indexing&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;counts&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;active&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;completed&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;failed&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;delayed&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;waiting&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;paused&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">0</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> ]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div><h2 id="get-queue-jobs" tabindex="-1">Get Queue Jobs <a class="header-anchor" href="#get-queue-jobs" aria-label="Permalink to &quot;Get Queue Jobs&quot;"></a></h2><ul><li><strong>Endpoint:</strong> <code>GET /v1/jobs/queues/:queueName</code></li><li><strong>Description:</strong> Retrieves a list of jobs within a specific queue, with pagination and filtering by status.</li><li><strong>Permissions:</strong> <code>manage:all</code></li><li><strong>URL Parameters:</strong><ul><li><code>queueName</code> (string, required): The name of the queue to retrieve jobs from.</li></ul></li><li><strong>Query Parameters:</strong><ul><li><code>status</code> (string, optional): The status of the jobs to retrieve. Can be one of <code>active</code>, <code>completed</code>, <code>failed</code>, <code>delayed</code>, <code>waiting</code>, <code>paused</code>. Defaults to <code>failed</code>.</li><li><code>page</code> (number, optional): The page number to retrieve. Defaults to <code>1</code>.</li><li><code>limit</code> (number, optional): The number of jobs to retrieve per page. Defaults to <code>10</code>.</li></ul></li><li><strong>Responses:</strong><ul><li><code>200 OK</code>: Returns a detailed view of the queue, including a paginated list of jobs.</li><li><code>401 Unauthorized</code>: If the user is not authenticated.</li><li><code>403 Forbidden</code>: If the user does not have the required permissions.</li><li><code>404 Not Found</code>: If the specified queue does not exist.</li></ul></li></ul><h3 id="response-body-1" tabindex="-1">Response Body <a class="header-anchor" href="#response-body-1" aria-label="Permalink to &quot;Response Body&quot;"></a></h3><div class="language-json vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">{</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;name&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;ingestion&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;counts&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;active&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;completed&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">56</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;failed&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">4</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;delayed&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">3</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;waiting&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;paused&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">0</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> },</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;jobs&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;id&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;1&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;name&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;initial-import&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;data&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;ingestionSourceId&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;clx1y2z3a0000b4d2e5f6g7h8&quot;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> },</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;state&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;failed&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;failedReason&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;Error: Connection timed out&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;timestamp&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">1678886400000</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;processedOn&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">1678886401000</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;finishedOn&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">1678886402000</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;attemptsMade&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">5</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;stacktrace&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;...&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">],</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;returnValue&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">null</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;ingestionSourceId&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;clx1y2z3a0000b4d2e5f6g7h8&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;error&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;Error: Connection timed out&quot;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> ],</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;pagination&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;currentPage&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;totalPages&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;totalJobs&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">4</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;limit&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">10</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div>`,20)]))}const u=i(e,[["render",l]]);export{E as __pageData,u as default};

View File

@@ -0,0 +1 @@
import{_ as i,c as a,o as t,ag as n}from"./chunks/framework.S-Qvb3wi.js";const E=JSON.parse('{"title":"Jobs API","description":"","frontmatter":{},"headers":[],"relativePath":"api/jobs.md","filePath":"api/jobs.md"}'),e={name:"api/jobs.md"};function l(h,s,p,k,o,r){return t(),a("div",null,s[0]||(s[0]=[n("",20)]))}const u=i(e,[["render",l]]);export{E as __pageData,u as default};

View File

@@ -1 +1 @@
import{t as p}from"./chunks/theme.D8FHTUZQ.js";import{R as s,a2 as i,a3 as u,a4 as c,a5 as l,a6 as f,a7 as d,a8 as m,a9 as h,aa as g,ab as A,d as v,u as y,v as C,s as P,ac as b,ad as w,ae as R,af as E}from"./chunks/framework.S-Qvb3wi.js";function r(e){if(e.extends){const a=r(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const n=r(p),S=v({name:"VitePressApp",setup(){const{site:e,lang:a,dir:t}=y();return C(()=>{P(()=>{document.documentElement.lang=a.value,document.documentElement.dir=t.value})}),e.value.router.prefetchLinks&&b(),w(),R(),n.setup&&n.setup(),()=>E(n.Layout)}});async function T(){globalThis.__VITEPRESS__=!0;const e=_(),a=D();a.provide(u,e);const t=c(e.route);return a.provide(l,t),a.component("Content",f),a.component("ClientOnly",d),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),n.enhanceApp&&await n.enhanceApp({app:a,router:e,siteData:m}),{app:a,router:e,data:t}}function D(){return A(S)}function _(){let e=s;return h(a=>{let t=g(a),o=null;return t&&(e&&(t=t.replace(/\.js$/,".lean.js")),o=import(t)),s&&(e=!1),o},n.NotFound)}s&&T().then(({app:e,router:a,data:t})=>{a.go().then(()=>{i(a.route,t.site),e.mount("#app")})});export{T as createApp};
import{t as p}from"./chunks/theme.BXIbNDN2.js";import{R as s,a2 as i,a3 as u,a4 as c,a5 as l,a6 as f,a7 as d,a8 as m,a9 as h,aa as g,ab as A,d as v,u as y,v as C,s as P,ac as b,ad as w,ae as R,af as E}from"./chunks/framework.S-Qvb3wi.js";function r(e){if(e.extends){const a=r(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const n=r(p),S=v({name:"VitePressApp",setup(){const{site:e,lang:a,dir:t}=y();return C(()=>{P(()=>{document.documentElement.lang=a.value,document.documentElement.dir=t.value})}),e.value.router.prefetchLinks&&b(),w(),R(),n.setup&&n.setup(),()=>E(n.Layout)}});async function T(){globalThis.__VITEPRESS__=!0;const e=_(),a=D();a.provide(u,e);const t=c(e.route);return a.provide(l,t),a.component("Content",f),a.component("ClientOnly",d),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),n.enhanceApp&&await n.enhanceApp({app:a,router:e,siteData:m}),{app:a,router:e,data:t}}function D(){return A(S)}function _(){let e=s;return h(a=>{let t=g(a),o=null;return t&&(e&&(t=t.replace(/\.js$/,".lean.js")),o=import(t)),s&&(e=!1),o},n.NotFound)}s&&T().then(({app:e,router:a,data:t})=>{a.go().then(()=>{i(a.route,t.site),e.mount("#app")})});export{T as createApp};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,28 @@
import{_ as i,c as t,o as a,ag as e}from"./chunks/framework.S-Qvb3wi.js";const E=JSON.parse('{"title":"Audit Log: API Endpoints","description":"","frontmatter":{},"headers":[],"relativePath":"enterprise/audit-log/api.md","filePath":"enterprise/audit-log/api.md"}'),n={name:"enterprise/audit-log/api.md"};function l(h,s,p,d,o,r){return a(),t("div",null,s[0]||(s[0]=[e(`<h1 id="audit-log-api-endpoints" tabindex="-1">Audit Log: API Endpoints <a class="header-anchor" href="#audit-log-api-endpoints" aria-label="Permalink to &quot;Audit Log: API Endpoints&quot;"></a></h1><p>The audit log feature exposes two API endpoints for retrieving and verifying audit log data. Both endpoints require authentication and are only accessible to users with the appropriate permissions.</p><h2 id="get-audit-logs" tabindex="-1">Get Audit Logs <a class="header-anchor" href="#get-audit-logs" aria-label="Permalink to &quot;Get Audit Logs&quot;"></a></h2><p>Retrieves a paginated list of audit log entries, with support for filtering and sorting.</p><ul><li><strong>Endpoint:</strong> <code>GET /api/v1/enterprise/audit-logs</code></li><li><strong>Method:</strong> <code>GET</code></li><li><strong>Authentication:</strong> Required</li></ul><h3 id="query-parameters" tabindex="-1">Query Parameters <a class="header-anchor" href="#query-parameters" aria-label="Permalink to &quot;Query Parameters&quot;"></a></h3><table tabindex="0"><thead><tr><th>Parameter</th><th>Type</th><th>Description</th></tr></thead><tbody><tr><td><code>page</code></td><td><code>number</code></td><td>The page number to retrieve. Defaults to <code>1</code>.</td></tr><tr><td><code>limit</code></td><td><code>number</code></td><td>The number of entries to retrieve per page. Defaults to <code>20</code>.</td></tr><tr><td><code>startDate</code></td><td><code>date</code></td><td>The start date for the date range filter.</td></tr><tr><td><code>endDate</code></td><td><code>date</code></td><td>The end date for the date range filter.</td></tr><tr><td><code>actor</code></td><td><code>string</code></td><td>The actor identifier to filter by.</td></tr><tr><td><code>actionType</code></td><td><code>string</code></td><td>The action type to filter by (e.g., <code>LOGIN</code>, <code>CREATE</code>).</td></tr><tr><td><code>sort</code></td><td><code>string</code></td><td>The sort order for the results. Can be <code>asc</code> or <code>desc</code>. Defaults to <code>desc</code>.</td></tr></tbody></table><h3 id="response-body" tabindex="-1">Response Body <a class="header-anchor" href="#response-body" aria-label="Permalink to &quot;Response Body&quot;"></a></h3><div class="language-json vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">{</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;data&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;id&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;previousHash&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">null</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;timestamp&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;2025-10-03T00:00:00.000Z&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;actorIdentifier&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;e8026a75-b58a-4902-8858-eb8780215f82&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;actorIp&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;::1&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;actionType&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;LOGIN&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;targetType&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;User&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;targetId&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;e8026a75-b58a-4902-8858-eb8780215f82&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;details&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: {},</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;currentHash&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;...&quot;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> ],</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;meta&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;total&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">100</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;page&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;limit&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">20</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div><h2 id="verify-audit-log-integrity" tabindex="-1">Verify Audit Log Integrity <a class="header-anchor" href="#verify-audit-log-integrity" aria-label="Permalink to &quot;Verify Audit Log Integrity&quot;"></a></h2><p>Initiates a verification process to check the integrity of the entire audit log chain.</p><ul><li><strong>Endpoint:</strong> <code>POST /api/v1/enterprise/audit-logs/verify</code></li><li><strong>Method:</strong> <code>POST</code></li><li><strong>Authentication:</strong> Required</li></ul><h3 id="response-body-1" tabindex="-1">Response Body <a class="header-anchor" href="#response-body-1" aria-label="Permalink to &quot;Response Body&quot;"></a></h3><p><strong>Success</strong></p><div class="language-json vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">{</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;ok&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;message&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;Audit log integrity verified successfully.&quot;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div><p><strong>Failure</strong></p><div class="language-json vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">{</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;ok&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">false</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;message&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;Audit log chain is broken!&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;logId&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">123</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div>`,17)]))}const g=i(n,[["render",l]]);export{E as __pageData,g as default};

View File

@@ -0,0 +1 @@
import{_ as i,c as t,o as a,ag as e}from"./chunks/framework.S-Qvb3wi.js";const E=JSON.parse('{"title":"Audit Log: API Endpoints","description":"","frontmatter":{},"headers":[],"relativePath":"enterprise/audit-log/api.md","filePath":"enterprise/audit-log/api.md"}'),n={name:"enterprise/audit-log/api.md"};function l(h,s,p,d,o,r){return a(),t("div",null,s[0]||(s[0]=[e("",17)]))}const g=i(n,[["render",l]]);export{E as __pageData,g as default};

View File

@@ -0,0 +1 @@
import{_ as t,c as i,o as a,ag as o}from"./chunks/framework.S-Qvb3wi.js";const u=JSON.parse('{"title":"Audit Log: Backend Implementation","description":"","frontmatter":{},"headers":[],"relativePath":"enterprise/audit-log/audit-service.md","filePath":"enterprise/audit-log/audit-service.md"}'),n={name:"enterprise/audit-log/audit-service.md"};function r(s,e,c,h,l,d){return a(),i("div",null,e[0]||(e[0]=[o('<h1 id="audit-log-backend-implementation" tabindex="-1">Audit Log: Backend Implementation <a class="header-anchor" href="#audit-log-backend-implementation" aria-label="Permalink to &quot;Audit Log: Backend Implementation&quot;"></a></h1><p>The backend implementation of the audit log is handled by the <code>AuditService</code>, located in <code>packages/backend/src/services/AuditService.ts</code>. This service encapsulates all the logic for creating, retrieving, and verifying audit log entries.</p><h2 id="hashing-and-verification-logic" tabindex="-1">Hashing and Verification Logic <a class="header-anchor" href="#hashing-and-verification-logic" aria-label="Permalink to &quot;Hashing and Verification Logic&quot;"></a></h2><p>The core of the audit log&#39;s immutability lies in its hashing and verification logic.</p><h3 id="hash-calculation" tabindex="-1">Hash Calculation <a class="header-anchor" href="#hash-calculation" aria-label="Permalink to &quot;Hash Calculation&quot;"></a></h3><p>The <code>calculateHash</code> method is responsible for generating a SHA-256 hash of a log entry. To ensure consistency, it performs the following steps:</p><ol><li><strong>Canonical Object Creation:</strong> It constructs a new object with a fixed property order, ensuring that the object&#39;s structure is always the same.</li><li><strong>Timestamp Normalization:</strong> It converts the <code>timestamp</code> to milliseconds since the epoch (<code>getTime()</code>) to avoid any precision-related discrepancies between the application and the database.</li><li><strong>Canonical Stringification:</strong> It uses a custom <code>canonicalStringify</code> function to create a JSON string representation of the object. This function sorts the object keys, ensuring that the output is always the same, regardless of the in-memory property order.</li><li><strong>Hash Generation:</strong> It computes a SHA-256 hash of the canonical string.</li></ol><h3 id="verification-process" tabindex="-1">Verification Process <a class="header-anchor" href="#verification-process" aria-label="Permalink to &quot;Verification Process&quot;"></a></h3><p>The <code>verifyAuditLog</code> method is designed to be highly scalable and efficient, even with millions of log entries. It processes the logs in manageable chunks (e.g., 1000 at a time) to avoid loading the entire table into memory.</p><p>The verification process involves the following steps:</p><ol><li><strong>Iterative Processing:</strong> It fetches the logs in batches within a <code>while</code> loop.</li><li><strong>Chain Verification:</strong> For each log entry, it compares the <code>previousHash</code> with the <code>currentHash</code> of the preceding log. If they do not match, the chain is broken, and the verification fails.</li><li><strong>Hash Recalculation:</strong> It recalculates the hash of the current log entry using the same <code>calculateHash</code> method used during creation.</li><li><strong>Integrity Check:</strong> It compares the recalculated hash with the <code>currentHash</code> stored in the database. If they do not match, the log entry has been tampered with, and the verification fails.</li></ol><h2 id="service-integration" tabindex="-1">Service Integration <a class="header-anchor" href="#service-integration" aria-label="Permalink to &quot;Service Integration&quot;"></a></h2><p>The <code>AuditService</code> is integrated into the application through the <code>AuditLogModule</code> (<code>packages/enterprise/src/modules/audit-log/audit-log.module.ts</code>), which registers the API routes for the audit log feature. The service&#39;s <code>createAuditLog</code> method is called from various other services throughout the application to record significant events.</p>',13)]))}const p=t(n,[["render",r]]);export{u as __pageData,p as default};

View File

@@ -0,0 +1 @@
import{_ as t,c as i,o as a,ag as o}from"./chunks/framework.S-Qvb3wi.js";const u=JSON.parse('{"title":"Audit Log: Backend Implementation","description":"","frontmatter":{},"headers":[],"relativePath":"enterprise/audit-log/audit-service.md","filePath":"enterprise/audit-log/audit-service.md"}'),n={name:"enterprise/audit-log/audit-service.md"};function r(s,e,c,h,l,d){return a(),i("div",null,e[0]||(e[0]=[o("",13)]))}const p=t(n,[["render",r]]);export{u as __pageData,p as default};

View File

@@ -0,0 +1 @@
import{_ as t,c as i,o as a,ag as o}from"./chunks/framework.S-Qvb3wi.js";const u=JSON.parse('{"title":"Audit Log: User Interface","description":"","frontmatter":{},"headers":[],"relativePath":"enterprise/audit-log/guide.md","filePath":"enterprise/audit-log/guide.md"}'),n={name:"enterprise/audit-log/guide.md"};function r(s,e,l,h,d,g){return a(),i("div",null,e[0]||(e[0]=[o('<h1 id="audit-log-user-interface" tabindex="-1">Audit Log: User Interface <a class="header-anchor" href="#audit-log-user-interface" aria-label="Permalink to &quot;Audit Log: User Interface&quot;"></a></h1><p>The audit log user interface provides a comprehensive view of all significant events that have occurred within the Open Archiver system. It is designed to be intuitive and user-friendly, allowing administrators to easily monitor and review system activity.</p><h2 id="viewing-audit-logs" tabindex="-1">Viewing Audit Logs <a class="header-anchor" href="#viewing-audit-logs" aria-label="Permalink to &quot;Viewing Audit Logs&quot;"></a></h2><p>The main audit log page displays a table of log entries, with the following columns:</p><ul><li><strong>Timestamp:</strong> The date and time of the event.</li><li><strong>Actor:</strong> The identifier of the user or system process that performed the action.</li><li><strong>IP Address:</strong> The IP address from which the action was initiated.</li><li><strong>Action:</strong> The type of action performed, displayed as a color-coded badge for easy identification.</li><li><strong>Target Type:</strong> The type of resource that was affected.</li><li><strong>Target ID:</strong> The unique identifier of the affected resource.</li><li><strong>Details:</strong> A truncated preview of the event&#39;s details. The full JSON object is displayed in a pop-up card on hover.</li></ul><h2 id="filtering-and-sorting" tabindex="-1">Filtering and Sorting <a class="header-anchor" href="#filtering-and-sorting" aria-label="Permalink to &quot;Filtering and Sorting&quot;"></a></h2><p>The table can be sorted by timestamp by clicking the &quot;Timestamp&quot; header. This allows you to view the logs in either chronological or reverse chronological order.</p><h2 id="pagination" tabindex="-1">Pagination <a class="header-anchor" href="#pagination" aria-label="Permalink to &quot;Pagination&quot;"></a></h2><p>Pagination controls are available below the table, allowing you to navigate through the entire history of audit log entries.</p><h2 id="verifying-log-integrity" tabindex="-1">Verifying Log Integrity <a class="header-anchor" href="#verifying-log-integrity" aria-label="Permalink to &quot;Verifying Log Integrity&quot;"></a></h2><p>The &quot;Verify Log Integrity&quot; button allows you to initiate a verification process to check the integrity of the entire audit log chain. This process recalculates the hash of each log entry and compares it to the stored hash, ensuring that the cryptographic chain is unbroken and no entries have been tampered with.</p><h3 id="verification-responses" tabindex="-1">Verification Responses <a class="header-anchor" href="#verification-responses" aria-label="Permalink to &quot;Verification Responses&quot;"></a></h3><ul><li><p><strong>Success:</strong> A success notification is displayed, confirming that the audit log integrity has been verified successfully. This means that the log chain is complete and no entries have been tampered with.</p></li><li><p><strong>Failure:</strong> An error notification is displayed, indicating that the audit log chain is broken or an entry has been tampered with. The notification will include the ID of the log entry where the issue was detected. There are two types of failures:</p><ul><li><strong>Audit log chain is broken:</strong> This means that the <code>previousHash</code> of a log entry does not match the <code>currentHash</code> of the preceding entry. This indicates that one or more log entries may have been deleted or inserted into the chain.</li><li><strong>Audit log entry is tampered!:</strong> This means that the recalculated hash of a log entry does not match its stored <code>currentHash</code>. This indicates that the data within the log entry has been altered.</li></ul></li></ul><h2 id="viewing-log-details" tabindex="-1">Viewing Log Details <a class="header-anchor" href="#viewing-log-details" aria-label="Permalink to &quot;Viewing Log Details&quot;"></a></h2><p>You can view the full details of any log entry by clicking on its row in the table. This will open a dialog containing all the information associated with the log entry, including the previous and current hashes.</p>',15)]))}const f=t(n,[["render",r]]);export{u as __pageData,f as default};

View File

@@ -0,0 +1 @@
import{_ as t,c as i,o as a,ag as o}from"./chunks/framework.S-Qvb3wi.js";const u=JSON.parse('{"title":"Audit Log: User Interface","description":"","frontmatter":{},"headers":[],"relativePath":"enterprise/audit-log/guide.md","filePath":"enterprise/audit-log/guide.md"}'),n={name:"enterprise/audit-log/guide.md"};function r(s,e,l,h,d,g){return a(),i("div",null,e[0]||(e[0]=[o("",15)]))}const f=t(n,[["render",r]]);export{u as __pageData,f as default};

View File

@@ -0,0 +1 @@
import{_ as t,c as a,o as i,ag as r}from"./chunks/framework.S-Qvb3wi.js";const p=JSON.parse('{"title":"Audit Log","description":"","frontmatter":{},"headers":[],"relativePath":"enterprise/audit-log/index.md","filePath":"enterprise/audit-log/index.md"}'),n={name:"enterprise/audit-log/index.md"};function o(s,e,d,l,c,h){return i(),a("div",null,e[0]||(e[0]=[r('<h1 id="audit-log" tabindex="-1">Audit Log <a class="header-anchor" href="#audit-log" aria-label="Permalink to &quot;Audit Log&quot;"></a></h1><p>The Audit Log is an enterprise-grade feature designed to provide a complete, immutable, and verifiable record of every significant action that occurs within the Open Archiver system. Its primary purpose is to ensure compliance with strict regulatory standards, such as the German GoBD, by establishing a tamper-proof chain of evidence for all activities.</p><h2 id="core-principles" tabindex="-1">Core Principles <a class="header-anchor" href="#core-principles" aria-label="Permalink to &quot;Core Principles&quot;"></a></h2><p>To fulfill its compliance and security functions, the audit log adheres to the following core principles:</p><h3 id="_1-immutability" tabindex="-1">1. Immutability <a class="header-anchor" href="#_1-immutability" aria-label="Permalink to &quot;1. Immutability&quot;"></a></h3><p>Every log entry is cryptographically chained to the previous one. Each new entry contains a SHA-256 hash of the preceding entry&#39;s hash, creating a verifiable chain. Any attempt to alter or delete a past entry would break this chain and be immediately detectable through the verification process.</p><h3 id="_2-completeness" tabindex="-1">2. Completeness <a class="header-anchor" href="#_2-completeness" aria-label="Permalink to &quot;2. Completeness&quot;"></a></h3><p>The system is designed to log every significant event without exception. This includes not only user-initiated actions (like logins, searches, and downloads) but also automated system processes, such as data ingestion and policy-based deletions.</p><h3 id="_3-attribution" tabindex="-1">3. Attribution <a class="header-anchor" href="#_3-attribution" aria-label="Permalink to &quot;3. Attribution&quot;"></a></h3><p>Each log entry is unambiguously linked to the actor that initiated the event. This could be a specific authenticated user, an external auditor, or an automated system process. The actor&#39;s identifier and source IP address are recorded to ensure full traceability.</p><h3 id="_4-clarity-and-detail" tabindex="-1">4. Clarity and Detail <a class="header-anchor" href="#_4-clarity-and-detail" aria-label="Permalink to &quot;4. Clarity and Detail&quot;"></a></h3><p>Log entries are structured to be detailed and human-readable, providing sufficient context for an auditor to understand the event without needing specialized system knowledge. This includes the action performed, the target resource affected, and a JSON object with specific, contextual details of the event.</p><h3 id="_5-verifiability" tabindex="-1">5. Verifiability <a class="header-anchor" href="#_5-verifiability" aria-label="Permalink to &quot;5. Verifiability&quot;"></a></h3><p>The integrity of the entire audit log can be verified at any time. A dedicated process iterates through the logs from the beginning, recalculating the hash of each entry and comparing it to the stored hash, ensuring the cryptographic chain is unbroken and no entries have been tampered with.</p>',14)]))}const m=t(n,[["render",o]]);export{p as __pageData,m as default};

View File

@@ -0,0 +1 @@
import{_ as t,c as a,o as i,ag as r}from"./chunks/framework.S-Qvb3wi.js";const p=JSON.parse('{"title":"Audit Log","description":"","frontmatter":{},"headers":[],"relativePath":"enterprise/audit-log/index.md","filePath":"enterprise/audit-log/index.md"}'),n={name:"enterprise/audit-log/index.md"};function o(s,e,d,l,c,h){return i(),a("div",null,e[0]||(e[0]=[r("",14)]))}const m=t(n,[["render",o]]);export{p as __pageData,m as default};

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
import{_ as s,c as t,o as i,ag as a}from"./chunks/framework.S-Qvb3wi.js";const k=JSON.parse('{"title":"Installation Guide","description":"","frontmatter":{},"headers":[],"relativePath":"user-guides/installation.md","filePath":"user-guides/installation.md"}'),o={name:"user-guides/installation.md"};function n(r,e,l,d,h,c){return i(),t("div",null,e[0]||(e[0]=[a("",100)]))}const g=s(o,[["render",n]]);export{k as __pageData,g as default};

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
import{_ as t,c as s,o as i,ag as a}from"./chunks/framework.S-Qvb3wi.js";const k=JSON.parse('{"title":"Installation Guide","description":"","frontmatter":{},"headers":[],"relativePath":"user-guides/installation.md","filePath":"user-guides/installation.md"}'),o={name:"user-guides/installation.md"};function n(r,e,d,l,h,c){return i(),s("div",null,e[0]||(e[0]=[a("",95)]))}const g=t(o,[["render",n]]);export{k as __pageData,g as default};

View File

@@ -0,0 +1 @@
import{_ as t,c as a,o as i,ag as r}from"./chunks/framework.S-Qvb3wi.js";const g=JSON.parse('{"title":"Email Integrity Check","description":"","frontmatter":{},"headers":[],"relativePath":"user-guides/integrity-check.md","filePath":"user-guides/integrity-check.md"}'),o={name:"user-guides/integrity-check.md"};function s(n,e,h,l,c,d){return i(),a("div",null,e[0]||(e[0]=[r('<h1 id="email-integrity-check" tabindex="-1">Email Integrity Check <a class="header-anchor" href="#email-integrity-check" aria-label="Permalink to &quot;Email Integrity Check&quot;"></a></h1><p>Open Archiver allows you to verify the integrity of your archived emails and their attachments. This guide explains how the integrity check works and what the results mean.</p><h2 id="how-it-works" tabindex="-1">How It Works <a class="header-anchor" href="#how-it-works" aria-label="Permalink to &quot;How It Works&quot;"></a></h2><p>When an email is archived, Open Archiver calculates a unique cryptographic signature (a SHA256 hash) for the email&#39;s raw <code>.eml</code> file and for each of its attachments. These signatures are stored in the database alongside the email&#39;s metadata.</p><p>The integrity check feature recalculates these signatures for the stored files and compares them to the original signatures stored in the database. This process allows you to verify that the content of your archived emails has not been altered, corrupted, or tampered with since the moment they were archived.</p><h2 id="the-integrity-report" tabindex="-1">The Integrity Report <a class="header-anchor" href="#the-integrity-report" aria-label="Permalink to &quot;The Integrity Report&quot;"></a></h2><p>When you view an email in the Open Archiver interface, an integrity report is automatically generated and displayed. This report provides a clear, at-a-glance status for the email file and each of its attachments.</p><h3 id="statuses" tabindex="-1">Statuses <a class="header-anchor" href="#statuses" aria-label="Permalink to &quot;Statuses&quot;"></a></h3><ul><li><p><strong>Valid (Green Badge):</strong> A &quot;Valid&quot; status means that the current signature of the file matches the original signature stored in the database. This is the expected status and indicates that the file&#39;s integrity is intact.</p></li><li><p><strong>Invalid (Red Badge):</strong> An &quot;Invalid&quot; status means that the current signature of the file does <em>not</em> match the original signature. This indicates that the file&#39;s content has changed since it was archived.</p></li></ul><h3 id="reasons-for-an-invalid-status" tabindex="-1">Reasons for an &quot;Invalid&quot; Status <a class="header-anchor" href="#reasons-for-an-invalid-status" aria-label="Permalink to &quot;Reasons for an &quot;Invalid&quot; Status&quot;"></a></h3><p>If a file is marked as &quot;Invalid,&quot; you can hover over the badge to see a reason for the failure. Common reasons include:</p><ul><li><p><strong>Stored hash does not match current hash:</strong> This is the most common reason and indicates that the file&#39;s content has been modified. This could be due to accidental changes, data corruption, or unauthorized tampering.</p></li><li><p><strong>Could not read attachment file from storage:</strong> This message indicates that the file could not be read from its storage location. This could be due to a storage system issue, a file permission problem, or because the file has been deleted.</p></li></ul><h2 id="what-to-do-if-an-integrity-check-fails" tabindex="-1">What to Do If an Integrity Check Fails <a class="header-anchor" href="#what-to-do-if-an-integrity-check-fails" aria-label="Permalink to &quot;What to Do If an Integrity Check Fails&quot;"></a></h2><p>If you encounter an &quot;Invalid&quot; status for an email or attachment, it is important to investigate the issue. Here are some steps you can take:</p><ol><li><strong>Check Storage:</strong> Verify that the file exists in its storage location and that its permissions are correct.</li><li><strong>Review Audit Logs:</strong> If you have audit logging enabled, review the logs for any unauthorized access or modifications to the file.</li><li><strong>Restore from Backup:</strong> If you suspect data corruption, you may need to restore the affected file from a backup.</li></ol><p>The integrity check feature is a crucial tool for ensuring the long-term reliability and trustworthiness of your email archive. By regularly monitoring the integrity of your archived data, you can be confident that your records are accurate and complete.</p>',16)]))}const f=t(o,[["render",s]]);export{g as __pageData,f as default};

View File

@@ -0,0 +1 @@
import{_ as t,c as a,o as i,ag as r}from"./chunks/framework.S-Qvb3wi.js";const g=JSON.parse('{"title":"Email Integrity Check","description":"","frontmatter":{},"headers":[],"relativePath":"user-guides/integrity-check.md","filePath":"user-guides/integrity-check.md"}'),o={name:"user-guides/integrity-check.md"};function s(n,e,h,l,c,d){return i(),a("div",null,e[0]||(e[0]=[r("",16)]))}const f=t(o,[["render",s]]);export{g as __pageData,f as default};

View File

@@ -0,0 +1,7 @@
import{_ as s,c as i,o as a,ag as o}from"./chunks/framework.S-Qvb3wi.js";const u=JSON.parse('{"title":"Troubleshooting CORS Errors","description":"","frontmatter":{},"headers":[],"relativePath":"user-guides/troubleshooting/cors-errors.md","filePath":"user-guides/troubleshooting/cors-errors.md"}'),t={name:"user-guides/troubleshooting/cors-errors.md"};function n(r,e,l,p,c,h){return a(),i("div",null,e[0]||(e[0]=[o(`<h1 id="troubleshooting-cors-errors" tabindex="-1">Troubleshooting CORS Errors <a class="header-anchor" href="#troubleshooting-cors-errors" aria-label="Permalink to &quot;Troubleshooting CORS Errors&quot;"></a></h1><p>Cross-Origin Resource Sharing (CORS) is a security feature that controls how web applications in one domain can request and interact with resources in another. If not configured correctly, you may encounter errors when performing actions like uploading files.</p><p>This guide will help you diagnose and resolve common CORS-related issues.</p><h2 id="symptoms" tabindex="-1">Symptoms <a class="header-anchor" href="#symptoms" aria-label="Permalink to &quot;Symptoms&quot;"></a></h2><p>You may be experiencing a CORS issue if you see one of the following errors in your browser&#39;s developer console or in the application&#39;s logs:</p><ul><li><code>TypeError: fetch failed</code></li><li><code>Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource.</code></li><li><code>Unexpected token &#39;C&#39;, &quot;Cross-site&quot;... is not valid JSON</code></li><li>A JSON error response similar to the following:<div class="language-json vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">{</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;message&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;CORS Error: This origin is not allowed.&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;requiredOrigin&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;http://localhost:3000&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;receivedOrigin&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;https://localhost:3000&quot;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div></li></ul><h2 id="root-cause" tabindex="-1">Root Cause <a class="header-anchor" href="#root-cause" aria-label="Permalink to &quot;Root Cause&quot;"></a></h2><p>These errors typically occur when the URL you are using to access the application in your browser does not exactly match the <code>APP_URL</code> configured in your <code>.env</code> file.</p><p>This can happen for several reasons:</p><ul><li>You are accessing the application via a different port.</li><li>You are using a reverse proxy that changes the protocol (e.g., from <code>http</code> to <code>https</code>).</li><li>The SvelteKit server, in a production build, is incorrectly guessing its public-facing URL.</li></ul><h2 id="solution" tabindex="-1">Solution <a class="header-anchor" href="#solution" aria-label="Permalink to &quot;Solution&quot;"></a></h2><p>The solution is to ensure that the application&#39;s frontend and backend are correctly configured with the public-facing URL of your instance. This is done by setting two environment variables: <code>APP_URL</code> and <code>ORIGIN</code>.</p><ol><li><p><strong>Open your <code>.env</code> file</strong> in a text editor.</p></li><li><p><strong>Set <code>APP_URL</code></strong>: Define the <code>APP_URL</code> variable with the exact URL you use to access the application in your browser.</p><div class="language-env vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">env</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>APP_URL=http://your-domain-or-ip:3000</span></span></code></pre></div></li><li><p><strong>Set <code>ORIGIN</code></strong>: The SvelteKit server requires a specific <code>ORIGIN</code> variable to correctly identify itself. This should always be set to the value of your <code>APP_URL</code>.</p><div class="language-env vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">env</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>ORIGIN=$APP_URL</span></span></code></pre></div><p>By using <code>$APP_URL</code>, you ensure that both variables are always in sync.</p></li></ol><h3 id="example-configuration" tabindex="-1">Example Configuration <a class="header-anchor" href="#example-configuration" aria-label="Permalink to &quot;Example Configuration&quot;"></a></h3><p>If you are running the application locally on port <code>3000</code>, your configuration should look like this:</p><div class="language-env vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">env</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>APP_URL=http://localhost:3000</span></span>
<span class="line"><span>ORIGIN=$APP_URL</span></span></code></pre></div><p>If your application is behind a reverse proxy and is accessible at <code>https://archive.mycompany.com</code>, your configuration should be:</p><div class="language-env vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">env</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>APP_URL=https://archive.mycompany.com</span></span>
<span class="line"><span>ORIGIN=$APP_URL</span></span></code></pre></div><p>After making these changes to your <code>.env</code> file, you must restart the application for them to take effect:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> compose</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> up</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -d</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --force-recreate</span></span></code></pre></div><p>This will ensure that the backend&#39;s CORS policy and the frontend server&#39;s origin are correctly aligned, resolving the errors.</p>`,21)]))}const g=s(t,[["render",n]]);export{u as __pageData,g as default};

View File

@@ -0,0 +1 @@
import{_ as s,c as i,o as a,ag as o}from"./chunks/framework.S-Qvb3wi.js";const u=JSON.parse('{"title":"Troubleshooting CORS Errors","description":"","frontmatter":{},"headers":[],"relativePath":"user-guides/troubleshooting/cors-errors.md","filePath":"user-guides/troubleshooting/cors-errors.md"}'),t={name:"user-guides/troubleshooting/cors-errors.md"};function n(r,e,l,p,c,h){return a(),i("div",null,e[0]||(e[0]=[o("",21)]))}const g=s(t,[["render",n]]);export{u as __pageData,g as default};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1 +1 @@
{"api_archived-email.md":"rYKCgF6R","api_auth.md":"BqZ6wN0q","api_authentication.md":"CyDXtQYg","api_dashboard.md":"lu70c-Pf","api_index.md":"DFnFK07E","api_ingestion.md":"B8EOVCr7","api_rate-limiting.md":"a1m1O0N8","api_search.md":"B8tLtEbg","api_storage.md":"DKUKvFrO","index.md":"9PKJf5H1","services_iam-service_iam-policy.md":"BMP46V9x","services_index.md":"BLn224J3","services_ocr-service.md":"aPypYfme","services_storage-service.md":"Bgos1Y2E","summary.md":"5seSND4L","user-guides_email-providers_eml.md":"a288N17s","user-guides_email-providers_google-workspace.md":"BWo_12De","user-guides_email-providers_imap.md":"DnuaRv-0","user-guides_email-providers_index.md":"C3XNPTNj","user-guides_email-providers_mbox.md":"Cavm6di7","user-guides_email-providers_microsoft-365.md":"QHHVfYxW","user-guides_email-providers_pst.md":"c6jOF8P1","user-guides_installation.md":"DfRfk8Oe","user-guides_settings_system.md":"DZw4puzm","user-guides_upgrade-and-migration_meilisearch-upgrade.md":"xQXm1E12","user-guides_upgrade-and-migration_upgrade.md":"DieppEdN"}
{"api_archived-email.md":"rYKCgF6R","api_auth.md":"BqZ6wN0q","api_authentication.md":"CyDXtQYg","api_dashboard.md":"lu70c-Pf","api_index.md":"DFnFK07E","api_ingestion.md":"B8EOVCr7","api_integrity.md":"CTx79Yjz","api_jobs.md":"1HdD59Aa","api_rate-limiting.md":"a1m1O0N8","api_search.md":"B8tLtEbg","api_storage.md":"DKUKvFrO","enterprise_audit-log_api.md":"BVTisviS","enterprise_audit-log_audit-service.md":"BSa897FH","enterprise_audit-log_guide.md":"CV4dRt8z","enterprise_audit-log_index.md":"D4TEa94R","index.md":"9PKJf5H1","services_iam-service_iam-policy.md":"BMP46V9x","services_index.md":"BLn224J3","services_ocr-service.md":"aPypYfme","services_storage-service.md":"Bgos1Y2E","summary.md":"5seSND4L","user-guides_email-providers_eml.md":"a288N17s","user-guides_email-providers_google-workspace.md":"BWo_12De","user-guides_email-providers_imap.md":"DnuaRv-0","user-guides_email-providers_index.md":"C3XNPTNj","user-guides_email-providers_mbox.md":"Cavm6di7","user-guides_email-providers_microsoft-365.md":"QHHVfYxW","user-guides_email-providers_pst.md":"c6jOF8P1","user-guides_installation.md":"wSyVr6UW","user-guides_integrity-check.md":"I-8CVL-T","user-guides_settings_system.md":"DZw4puzm","user-guides_troubleshooting_cors-errors.md":"DJT7M9F5","user-guides_upgrade-and-migration_meilisearch-upgrade.md":"xQXm1E12","user-guides_upgrade-and-migration_upgrade.md":"DieppEdN"}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long