This commit is contained in:
wayneshn
2026-03-20 12:15:19 +00:00
parent 893b0026fe
commit d28ecd6978
428 changed files with 5663 additions and 1237 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

40
api/api-keys.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

File diff suppressed because one or more lines are too long

47
api/iam.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

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

35
api/settings.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

32
api/upload.html Normal file

File diff suppressed because one or more lines are too long

59
api/users.html Normal file

File diff suppressed because one or more lines are too long

View File

@@ -1 +1 @@
import{_ as a,c as i,o as r,ag as t}from"./chunks/framework.S-Qvb3wi.js";const f=JSON.parse('{"title":"Table of contents","description":"","frontmatter":{},"headers":[],"relativePath":"SUMMARY.md","filePath":"SUMMARY.md"}'),l={name:"SUMMARY.md"};function o(s,e,n,c,u,d){return r(),i("div",null,e[0]||(e[0]=[t('<h1 id="table-of-contents" tabindex="-1">Table of contents <a class="header-anchor" href="#table-of-contents" aria-label="Permalink to &quot;Table of contents&quot;"></a></h1><h2 id="user-guides" tabindex="-1">User guides <a class="header-anchor" href="#user-guides" aria-label="Permalink to &quot;User guides&quot;"></a></h2><ul><li><a href="./">Get started</a></li><li><a href="./user-guides/installation.html">Installation</a></li><li><a href="./user-guides/email-providers/">email-providers</a><ul><li><a href="./user-guides/email-providers/google-workspace.html">Connecting to Google Workspace</a></li><li><a href="./user-guides/email-providers/imap.html">Connecting to a Generic IMAP Server</a></li><li><a href="./user-guides/email-providers/microsoft-365.html">Connecting to Microsoft 365</a></li></ul></li></ul><hr><ul><li><a href="./api/">api</a><ul><li><a href="./api/ingestion.html">Ingestion Sources API Documentation</a></li></ul></li><li><a href="./services/">services</a><ul><li><a href="./services/storage-service.html">Pluggable Storage Service (StorageService)</a></li></ul></li></ul>',5)]))}const m=a(l,[["render",o]]);export{f as __pageData,m as default};
import{_ as a,c as i,o as r,ax as t}from"./chunks/framework.DHqKNX4U.js";const f=JSON.parse('{"title":"Table of contents","description":"","frontmatter":{},"headers":[],"relativePath":"SUMMARY.md","filePath":"SUMMARY.md"}'),l={name:"SUMMARY.md"};function o(s,e,n,c,u,d){return r(),i("div",null,e[0]||(e[0]=[t('<h1 id="table-of-contents" tabindex="-1">Table of contents <a class="header-anchor" href="#table-of-contents" aria-label="Permalink to &quot;Table of contents&quot;"></a></h1><h2 id="user-guides" tabindex="-1">User guides <a class="header-anchor" href="#user-guides" aria-label="Permalink to &quot;User guides&quot;"></a></h2><ul><li><a href="./">Get started</a></li><li><a href="./user-guides/installation.html">Installation</a></li><li><a href="./user-guides/email-providers/">email-providers</a><ul><li><a href="./user-guides/email-providers/google-workspace.html">Connecting to Google Workspace</a></li><li><a href="./user-guides/email-providers/imap.html">Connecting to a Generic IMAP Server</a></li><li><a href="./user-guides/email-providers/microsoft-365.html">Connecting to Microsoft 365</a></li></ul></li></ul><hr><ul><li><a href="./api/">api</a><ul><li><a href="./api/ingestion.html">Ingestion Sources API Documentation</a></li></ul></li><li><a href="./services/">services</a><ul><li><a href="./services/storage-service.html">Pluggable Storage Service (StorageService)</a></li></ul></li></ul>',5)]))}const m=a(l,[["render",o]]);export{f as __pageData,m as default};

View File

@@ -1 +1 @@
import{_ as a,c as i,o as r,ag as t}from"./chunks/framework.S-Qvb3wi.js";const f=JSON.parse('{"title":"Table of contents","description":"","frontmatter":{},"headers":[],"relativePath":"SUMMARY.md","filePath":"SUMMARY.md"}'),l={name:"SUMMARY.md"};function o(s,e,n,c,u,d){return r(),i("div",null,e[0]||(e[0]=[t("",5)]))}const m=a(l,[["render",o]]);export{f as __pageData,m as default};
import{_ as a,c as i,o as r,ax as t}from"./chunks/framework.DHqKNX4U.js";const f=JSON.parse('{"title":"Table of contents","description":"","frontmatter":{},"headers":[],"relativePath":"SUMMARY.md","filePath":"SUMMARY.md"}'),l={name:"SUMMARY.md"};function o(s,e,n,c,u,d){return r(),i("div",null,e[0]||(e[0]=[t("",5)]))}const m=a(l,[["render",o]]);export{f as __pageData,m as default};

View File

@@ -0,0 +1 @@
import{_ as n,C as i,c as o,o as p,j as a,G as s,a as t}from"./chunks/framework.DHqKNX4U.js";const c=JSON.parse('{"title":"API Keys","description":"","frontmatter":{"aside":false},"headers":[],"relativePath":"api/api-keys.md","filePath":"api/api-keys.md"}'),l={name:"api/api-keys.md"};function d(y,e,m,k,h,A){const r=i("OAOperation");return p(),o("div",null,[e[0]||(e[0]=a("h1",{id:"api-keys",tabindex:"-1"},[t("API Keys "),a("a",{class:"header-anchor",href:"#api-keys","aria-label":'Permalink to "API Keys"'},"")],-1)),e[1]||(e[1]=a("p",null,"Generate and manage API keys for programmatic access to the Open Archiver API. API keys are scoped to the user that created them and carry the same permissions as that user. The raw key value is only shown once at creation time.",-1)),e[2]||(e[2]=a("h2",{id:"generate-an-api-key",tabindex:"-1"},[t("Generate an API Key "),a("a",{class:"header-anchor",href:"#generate-an-api-key","aria-label":'Permalink to "Generate an API Key"'},"")],-1)),s(r,{operationId:"generateApiKey"}),e[3]||(e[3]=a("h2",{id:"list-api-keys",tabindex:"-1"},[t("List API Keys "),a("a",{class:"header-anchor",href:"#list-api-keys","aria-label":'Permalink to "List API Keys"'},"")],-1)),s(r,{operationId:"getApiKeys"}),e[4]||(e[4]=a("h2",{id:"delete-an-api-key",tabindex:"-1"},[t("Delete an API Key "),a("a",{class:"header-anchor",href:"#delete-an-api-key","aria-label":'Permalink to "Delete an API Key"'},"")],-1)),s(r,{operationId:"deleteApiKey"})])}const I=n(l,[["render",d]]);export{c as __pageData,I as default};

View File

@@ -0,0 +1 @@
import{_ as n,C as i,c as o,o as p,j as a,G as s,a as t}from"./chunks/framework.DHqKNX4U.js";const c=JSON.parse('{"title":"API Keys","description":"","frontmatter":{"aside":false},"headers":[],"relativePath":"api/api-keys.md","filePath":"api/api-keys.md"}'),l={name:"api/api-keys.md"};function d(y,e,m,k,h,A){const r=i("OAOperation");return p(),o("div",null,[e[0]||(e[0]=a("h1",{id:"api-keys",tabindex:"-1"},[t("API Keys "),a("a",{class:"header-anchor",href:"#api-keys","aria-label":'Permalink to "API Keys"'},"")],-1)),e[1]||(e[1]=a("p",null,"Generate and manage API keys for programmatic access to the Open Archiver API. API keys are scoped to the user that created them and carry the same permissions as that user. The raw key value is only shown once at creation time.",-1)),e[2]||(e[2]=a("h2",{id:"generate-an-api-key",tabindex:"-1"},[t("Generate an API Key "),a("a",{class:"header-anchor",href:"#generate-an-api-key","aria-label":'Permalink to "Generate an API Key"'},"")],-1)),s(r,{operationId:"generateApiKey"}),e[3]||(e[3]=a("h2",{id:"list-api-keys",tabindex:"-1"},[t("List API Keys "),a("a",{class:"header-anchor",href:"#list-api-keys","aria-label":'Permalink to "List API Keys"'},"")],-1)),s(r,{operationId:"getApiKeys"}),e[4]||(e[4]=a("h2",{id:"delete-an-api-key",tabindex:"-1"},[t("Delete an API Key "),a("a",{class:"header-anchor",href:"#delete-an-api-key","aria-label":'Permalink to "Delete an API Key"'},"")],-1)),s(r,{operationId:"deleteApiKey"})])}const I=n(l,[["render",d]]);export{c as __pageData,I as default};

View File

@@ -0,0 +1 @@
import{_ as n,C as l,c as o,o as s,j as a,G as t,a as i}from"./chunks/framework.DHqKNX4U.js";const E=JSON.parse('{"title":"Archived Email API","description":"","frontmatter":{"aside":false},"headers":[],"relativePath":"api/archived-email.md","filePath":"api/archived-email.md"}'),d={name:"api/archived-email.md"};function m(p,e,c,h,f,v){const r=l("OAOperation");return s(),o("div",null,[e[0]||(e[0]=a("h1",{id:"archived-email-api",tabindex:"-1"},[i("Archived Email API "),a("a",{class:"header-anchor",href:"#archived-email-api","aria-label":'Permalink to "Archived Email API"'},"")],-1)),e[1]||(e[1]=a("p",null,[i("Endpoints for retrieving and deleting archived emails. All endpoints require authentication and the appropriate "),a("code",null,"archive"),i(" permission.")],-1)),e[2]||(e[2]=a("h2",{id:"list-emails-for-an-ingestion-source",tabindex:"-1"},[i("List Emails for an Ingestion Source "),a("a",{class:"header-anchor",href:"#list-emails-for-an-ingestion-source","aria-label":'Permalink to "List Emails for an Ingestion Source"'},"")],-1)),t(r,{operationId:"getArchivedEmails"}),e[3]||(e[3]=a("h2",{id:"get-a-single-email",tabindex:"-1"},[i("Get a Single Email "),a("a",{class:"header-anchor",href:"#get-a-single-email","aria-label":'Permalink to "Get a Single Email"'},"")],-1)),t(r,{operationId:"getArchivedEmailById"}),e[4]||(e[4]=a("h2",{id:"delete-an-email",tabindex:"-1"},[i("Delete an Email "),a("a",{class:"header-anchor",href:"#delete-an-email","aria-label":'Permalink to "Delete an Email"'},"")],-1)),t(r,{operationId:"deleteArchivedEmail"})])}const u=n(d,[["render",m]]);export{E as __pageData,u as default};

View File

@@ -0,0 +1 @@
import{_ as n,C as l,c as o,o as s,j as a,G as t,a as i}from"./chunks/framework.DHqKNX4U.js";const E=JSON.parse('{"title":"Archived Email API","description":"","frontmatter":{"aside":false},"headers":[],"relativePath":"api/archived-email.md","filePath":"api/archived-email.md"}'),d={name:"api/archived-email.md"};function m(p,e,c,h,f,v){const r=l("OAOperation");return s(),o("div",null,[e[0]||(e[0]=a("h1",{id:"archived-email-api",tabindex:"-1"},[i("Archived Email API "),a("a",{class:"header-anchor",href:"#archived-email-api","aria-label":'Permalink to "Archived Email API"'},"")],-1)),e[1]||(e[1]=a("p",null,[i("Endpoints for retrieving and deleting archived emails. All endpoints require authentication and the appropriate "),a("code",null,"archive"),i(" permission.")],-1)),e[2]||(e[2]=a("h2",{id:"list-emails-for-an-ingestion-source",tabindex:"-1"},[i("List Emails for an Ingestion Source "),a("a",{class:"header-anchor",href:"#list-emails-for-an-ingestion-source","aria-label":'Permalink to "List Emails for an Ingestion Source"'},"")],-1)),t(r,{operationId:"getArchivedEmails"}),e[3]||(e[3]=a("h2",{id:"get-a-single-email",tabindex:"-1"},[i("Get a Single Email "),a("a",{class:"header-anchor",href:"#get-a-single-email","aria-label":'Permalink to "Get a Single Email"'},"")],-1)),t(r,{operationId:"getArchivedEmailById"}),e[4]||(e[4]=a("h2",{id:"delete-an-email",tabindex:"-1"},[i("Delete an Email "),a("a",{class:"header-anchor",href:"#delete-an-email","aria-label":'Permalink to "Delete an Email"'},"")],-1)),t(r,{operationId:"deleteArchivedEmail"})])}const u=n(d,[["render",m]]);export{E as __pageData,u as default};

View File

@@ -1,31 +0,0 @@
import{_ as s,c as t,o as a,ag as e}from"./chunks/framework.S-Qvb3wi.js";const E=JSON.parse('{"title":"Archived Email Service API","description":"","frontmatter":{},"headers":[],"relativePath":"api/archived-email.md","filePath":"api/archived-email.md"}'),n={name:"api/archived-email.md"};function l(h,i,r,p,d,o){return a(),t("div",null,i[0]||(i[0]=[e(`<h1 id="archived-email-service-api" tabindex="-1">Archived Email Service API <a class="header-anchor" href="#archived-email-service-api" aria-label="Permalink to &quot;Archived Email Service API&quot;"></a></h1><p>The Archived Email Service is responsible for retrieving archived emails and their details from the database and storage.</p><h2 id="endpoints" tabindex="-1">Endpoints <a class="header-anchor" href="#endpoints" aria-label="Permalink to &quot;Endpoints&quot;"></a></h2><p>All endpoints in this service require authentication.</p><h3 id="get-api-v1-archived-emails-ingestion-source-ingestionsourceid" tabindex="-1">GET /api/v1/archived-emails/ingestion-source/:ingestionSourceId <a class="header-anchor" href="#get-api-v1-archived-emails-ingestion-source-ingestionsourceid" aria-label="Permalink to &quot;GET /api/v1/archived-emails/ingestion-source/:ingestionSourceId&quot;"></a></h3><p>Retrieves a paginated list of archived emails for a specific ingestion source.</p><p><strong>Access:</strong> Authenticated</p><h4 id="url-parameters" tabindex="-1">URL Parameters <a class="header-anchor" href="#url-parameters" aria-label="Permalink to &quot;URL Parameters&quot;"></a></h4><table tabindex="0"><thead><tr><th style="text-align:left;">Parameter</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>ingestionSourceId</code></td><td style="text-align:left;">string</td><td style="text-align:left;">The ID of the ingestion source to get emails for.</td></tr></tbody></table><h4 id="query-parameters" tabindex="-1">Query Parameters <a class="header-anchor" href="#query-parameters" aria-label="Permalink to &quot;Query Parameters&quot;"></a></h4><table tabindex="0"><thead><tr><th style="text-align:left;">Parameter</th><th style="text-align:left;">Type</th><th style="text-align:left;">Description</th><th style="text-align:left;">Default</th></tr></thead><tbody><tr><td style="text-align:left;"><code>page</code></td><td style="text-align:left;">number</td><td style="text-align:left;">The page number for pagination.</td><td style="text-align:left;">1</td></tr><tr><td style="text-align:left;"><code>limit</code></td><td style="text-align:left;">number</td><td style="text-align:left;">The number of items per page.</td><td style="text-align:left;">10</td></tr></tbody></table><h4 id="responses" tabindex="-1">Responses <a class="header-anchor" href="#responses" aria-label="Permalink to &quot;Responses&quot;"></a></h4><ul><li><p><strong>200 OK:</strong> A paginated list of archived emails.</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;items&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;email-id&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;subject&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;Test 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;from&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;sender@example.com&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;sentAt&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;2023-10-27T10: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;hasAttachments&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;recipients&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [{ </span><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;Recipient 1&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">&quot;email&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;recipient1@example.com&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:#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;">10</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div></li><li><p><strong>500 Internal Server Error:</strong> An unexpected error occurred.</p></li></ul><h3 id="get-api-v1-archived-emails-id" tabindex="-1">GET /api/v1/archived-emails/:id <a class="header-anchor" href="#get-api-v1-archived-emails-id" aria-label="Permalink to &quot;GET /api/v1/archived-emails/:id&quot;"></a></h3><p>Retrieves a single archived email by its ID, including its raw content and attachments.</p><p><strong>Access:</strong> Authenticated</p><h4 id="url-parameters-1" tabindex="-1">URL Parameters <a class="header-anchor" href="#url-parameters-1" aria-label="Permalink to &quot;URL Parameters&quot;"></a></h4><table tabindex="0"><thead><tr><th style="text-align:left;">Parameter</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>id</code></td><td style="text-align:left;">string</td><td style="text-align:left;">The ID of the archived email.</td></tr></tbody></table><h4 id="responses-1" tabindex="-1">Responses <a class="header-anchor" href="#responses-1" aria-label="Permalink to &quot;Responses&quot;"></a></h4><ul><li><p><strong>200 OK:</strong> The archived email details.</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;id&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;email-id&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;subject&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;Test 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;from&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;sender@example.com&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;sentAt&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;2023-10-27T10: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;hasAttachments&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;recipients&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [{ </span><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;Recipient 1&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">&quot;email&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;recipient1@example.com&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }],</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;raw&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;attachments&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;attachment-id&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;mimeType&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;application/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;sizeBytes&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">12345</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></li><li><p><strong>404 Not Found:</strong> The archived email with the specified ID was not found.</p></li><li><p><strong>500 Internal Server Error:</strong> An unexpected error occurred.</p></li></ul><h2 id="service-methods" tabindex="-1">Service Methods <a class="header-anchor" href="#service-methods" aria-label="Permalink to &quot;Service Methods&quot;"></a></h2><h3 id="getarchivedemails-ingestionsourceid-string-page-number-limit-number-promise-paginatedarchivedemails" tabindex="-1"><code>getArchivedEmails(ingestionSourceId: string, page: number, limit: number): Promise&lt;PaginatedArchivedEmails&gt;</code> <a class="header-anchor" href="#getarchivedemails-ingestionsourceid-string-page-number-limit-number-promise-paginatedarchivedemails" aria-label="Permalink to &quot;\`getArchivedEmails(ingestionSourceId: string, page: number, limit: number): Promise&lt;PaginatedArchivedEmails&gt;\`&quot;"></a></h3><p>Retrieves a paginated list of archived emails from the database for a given ingestion source.</p><ul><li><strong>ingestionSourceId:</strong> The ID of the ingestion source.</li><li><strong>page:</strong> The page number for pagination.</li><li><strong>limit:</strong> The number of items per page.</li><li><strong>Returns:</strong> A promise that resolves to a <code>PaginatedArchivedEmails</code> object.</li></ul><h3 id="getarchivedemailbyid-emailid-string-promise-archivedemail-null" tabindex="-1"><code>getArchivedEmailById(emailId: string): Promise&lt;ArchivedEmail | null&gt;</code> <a class="header-anchor" href="#getarchivedemailbyid-emailid-string-promise-archivedemail-null" aria-label="Permalink to &quot;\`getArchivedEmailById(emailId: string): Promise&lt;ArchivedEmail | null&gt;\`&quot;"></a></h3><p>Retrieves a single archived email by its ID, including its raw content and attachments.</p><ul><li><strong>emailId:</strong> The ID of the archived email.</li><li><strong>Returns:</strong> A promise that resolves to an <code>ArchivedEmail</code> object or <code>null</code> if not found.</li></ul>`,27)]))}const g=s(n,[["render",l]]);export{E as __pageData,g as default};

View File

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

View File

@@ -1,14 +0,0 @@
import{_ as i,c as e,o as t,ag as a}from"./chunks/framework.S-Qvb3wi.js";const u=JSON.parse('{"title":"Auth Service API","description":"","frontmatter":{},"headers":[],"relativePath":"api/auth.md","filePath":"api/auth.md"}'),n={name:"api/auth.md"};function o(l,s,r,h,p,d){return t(),e("div",null,s[0]||(s[0]=[a(`<h1 id="auth-service-api" tabindex="-1">Auth Service API <a class="header-anchor" href="#auth-service-api" aria-label="Permalink to &quot;Auth Service API&quot;"></a></h1><p>The Auth Service is responsible for handling user authentication, including login and token verification.</p><h2 id="endpoints" tabindex="-1">Endpoints <a class="header-anchor" href="#endpoints" aria-label="Permalink to &quot;Endpoints&quot;"></a></h2><h3 id="post-api-v1-auth-login" tabindex="-1">POST /api/v1/auth/login <a class="header-anchor" href="#post-api-v1-auth-login" aria-label="Permalink to &quot;POST /api/v1/auth/login&quot;"></a></h3><p>Authenticates a user and returns a JWT if the credentials are valid.</p><p><strong>Access:</strong> Public</p><p><strong>Rate Limiting:</strong> This endpoint is rate-limited to prevent brute-force attacks.</p><h4 id="request-body" tabindex="-1">Request Body <a class="header-anchor" href="#request-body" aria-label="Permalink to &quot;Request Body&quot;"></a></h4><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>email</code></td><td style="text-align:left;">string</td><td style="text-align:left;">The user&#39;s email address.</td></tr><tr><td style="text-align:left;"><code>password</code></td><td style="text-align:left;">string</td><td style="text-align:left;">The user&#39;s password.</td></tr></tbody></table><h4 id="responses" tabindex="-1">Responses <a class="header-anchor" href="#responses" aria-label="Permalink to &quot;Responses&quot;"></a></h4><ul><li><p><strong>200 OK:</strong> Authentication successful.</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;accessToken&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;your.jwt.token&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &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;id&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;user-id&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;email&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;user@example.com&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;role&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;user&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></li><li><p><strong>400 Bad Request:</strong> Email or password not provided.</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;message&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;Email and password are required&quot;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div></li><li><p><strong>401 Unauthorized:</strong> Invalid credentials.</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;message&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;Invalid credentials&quot;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div></li><li><p><strong>500 Internal Server Error:</strong> An unexpected error occurred.</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;message&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;An internal server error occurred&quot;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div></li></ul><h2 id="service-methods" tabindex="-1">Service Methods <a class="header-anchor" href="#service-methods" aria-label="Permalink to &quot;Service Methods&quot;"></a></h2><h3 id="verifypassword-password-string-hash-string-promise-boolean" tabindex="-1"><code>verifyPassword(password: string, hash: string): Promise&lt;boolean&gt;</code> <a class="header-anchor" href="#verifypassword-password-string-hash-string-promise-boolean" aria-label="Permalink to &quot;\`verifyPassword(password: string, hash: string): Promise&lt;boolean&gt;\`&quot;"></a></h3><p>Compares a plain-text password with a hashed password to verify its correctness.</p><ul><li><strong>password:</strong> The plain-text password.</li><li><strong>hash:</strong> The hashed password to compare against.</li><li><strong>Returns:</strong> A promise that resolves to <code>true</code> if the password is valid, otherwise <code>false</code>.</li></ul><h3 id="login-email-string-password-string-promise-loginresponse-null" tabindex="-1"><code>login(email: string, password: string): Promise&lt;LoginResponse | null&gt;</code> <a class="header-anchor" href="#login-email-string-password-string-promise-loginresponse-null" aria-label="Permalink to &quot;\`login(email: string, password: string): Promise&lt;LoginResponse | null&gt;\`&quot;"></a></h3><p>Handles the user login process. It finds the user by email, verifies the password, and generates a JWT upon successful authentication.</p><ul><li><strong>email:</strong> The user&#39;s email.</li><li><strong>password:</strong> The user&#39;s password.</li><li><strong>Returns:</strong> A promise that resolves to a <code>LoginResponse</code> object containing the <code>accessToken</code> and <code>user</code> details, or <code>null</code> if authentication fails.</li></ul><h3 id="verifytoken-token-string-promise-authtokenpayload-null" tabindex="-1"><code>verifyToken(token: string): Promise&lt;AuthTokenPayload | null&gt;</code> <a class="header-anchor" href="#verifytoken-token-string-promise-authtokenpayload-null" aria-label="Permalink to &quot;\`verifyToken(token: string): Promise&lt;AuthTokenPayload | null&gt;\`&quot;"></a></h3><p>Verifies the authenticity and expiration of a JWT.</p><ul><li><strong>token:</strong> The JWT string to verify.</li><li><strong>Returns:</strong> A promise that resolves to the token&#39;s <code>AuthTokenPayload</code> if valid, otherwise <code>null</code>.</li></ul>`,21)]))}const g=i(n,[["render",o]]);export{u as __pageData,g as default};

View File

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

View File

@@ -0,0 +1 @@
import{_ as o,C as s,c as r,o as u,j as t,G as i,a as e}from"./chunks/framework.DHqKNX4U.js";const P=JSON.parse('{"title":"Auth API","description":"","frontmatter":{"aside":false},"headers":[],"relativePath":"api/auth.md","filePath":"api/auth.md"}'),p={name:"api/auth.md"};function l(d,a,h,c,m,f){const n=s("OAOperation");return u(),r("div",null,[a[0]||(a[0]=t("h1",{id:"auth-api",tabindex:"-1"},[e("Auth API "),t("a",{class:"header-anchor",href:"#auth-api","aria-label":'Permalink to "Auth API"'},"")],-1)),a[1]||(a[1]=t("p",null,"Handles user authentication including initial setup, login, and application setup status.",-1)),a[2]||(a[2]=t("h2",{id:"setup",tabindex:"-1"},[e("Setup "),t("a",{class:"header-anchor",href:"#setup","aria-label":'Permalink to "Setup"'},"")],-1)),i(n,{operationId:"authSetup"}),a[3]||(a[3]=t("h2",{id:"login",tabindex:"-1"},[e("Login "),t("a",{class:"header-anchor",href:"#login","aria-label":'Permalink to "Login"'},"")],-1)),i(n,{operationId:"authLogin"}),a[4]||(a[4]=t("h2",{id:"check-setup-status",tabindex:"-1"},[e("Check Setup Status "),t("a",{class:"header-anchor",href:"#check-setup-status","aria-label":'Permalink to "Check Setup Status"'},"")],-1)),i(n,{operationId:"authStatus"})])}const S=o(p,[["render",l]]);export{P as __pageData,S as default};

View File

@@ -0,0 +1 @@
import{_ as o,C as s,c as r,o as u,j as t,G as i,a as e}from"./chunks/framework.DHqKNX4U.js";const P=JSON.parse('{"title":"Auth API","description":"","frontmatter":{"aside":false},"headers":[],"relativePath":"api/auth.md","filePath":"api/auth.md"}'),p={name:"api/auth.md"};function l(d,a,h,c,m,f){const n=s("OAOperation");return u(),r("div",null,[a[0]||(a[0]=t("h1",{id:"auth-api",tabindex:"-1"},[e("Auth API "),t("a",{class:"header-anchor",href:"#auth-api","aria-label":'Permalink to "Auth API"'},"")],-1)),a[1]||(a[1]=t("p",null,"Handles user authentication including initial setup, login, and application setup status.",-1)),a[2]||(a[2]=t("h2",{id:"setup",tabindex:"-1"},[e("Setup "),t("a",{class:"header-anchor",href:"#setup","aria-label":'Permalink to "Setup"'},"")],-1)),i(n,{operationId:"authSetup"}),a[3]||(a[3]=t("h2",{id:"login",tabindex:"-1"},[e("Login "),t("a",{class:"header-anchor",href:"#login","aria-label":'Permalink to "Login"'},"")],-1)),i(n,{operationId:"authLogin"}),a[4]||(a[4]=t("h2",{id:"check-setup-status",tabindex:"-1"},[e("Check Setup Status "),t("a",{class:"header-anchor",href:"#check-setup-status","aria-label":'Permalink to "Check Setup Status"'},"")],-1)),i(n,{operationId:"authStatus"})])}const S=o(p,[["render",l]]);export{P as __pageData,S as default};

View File

@@ -0,0 +1,3 @@
import{_ as e,c as t,o as i,ax as s}from"./chunks/framework.DHqKNX4U.js";const k=JSON.parse('{"title":"API Authentication","description":"","frontmatter":{"aside":false},"headers":[],"relativePath":"api/authentication.md","filePath":"api/authentication.md"}'),n={name:"api/authentication.md"};function o(h,a,r,p,d,l){return i(),t("div",null,a[0]||(a[0]=[s(`<h1 id="api-authentication" tabindex="-1">API Authentication <a class="header-anchor" href="#api-authentication" aria-label="Permalink to &quot;API Authentication&quot;"></a></h1><p>The API supports two authentication methods. Use whichever fits your use case.</p><h2 id="method-1-jwt-user-login" tabindex="-1">Method 1: JWT (User Login) <a class="header-anchor" href="#method-1-jwt-user-login" aria-label="Permalink to &quot;Method 1: JWT (User Login)&quot;"></a></h2><p>Obtain a short-lived JWT by calling <code>POST /v1/auth/login</code> with your email and password, then pass it as a Bearer token in the <code>Authorization</code> header.</p><p><strong>Example:</strong></p><div class="language-http vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">http</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">GET</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> /api/v1/dashboard/stats</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">Authorization</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...</span></span></code></pre></div><h2 id="method-2-api-key" tabindex="-1">Method 2: API Key <a class="header-anchor" href="#method-2-api-key" aria-label="Permalink to &quot;Method 2: API Key&quot;"></a></h2><p>Long-lived API keys are suited for automated scripts and integrations. Create one in <strong>Settings &gt; API Keys</strong>, then pass it in the <code>X-API-KEY</code> header.</p><p><strong>Example:</strong></p><div class="language-http vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">http</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">GET</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> /api/v1/dashboard/stats</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">X-API-KEY</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2</span></span></code></pre></div><h3 id="creating-an-api-key" tabindex="-1">Creating an API Key <a class="header-anchor" href="#creating-an-api-key" aria-label="Permalink to &quot;Creating an API Key&quot;"></a></h3><ol><li>Navigate to <strong>Settings &gt; API Keys</strong> in the dashboard.</li><li>Click <strong>&quot;Generate API Key&quot;</strong>.</li><li>Provide a descriptive name and select an expiration period (max 2 years).</li><li>Copy the key immediately — it will not be shown again.</li></ol><hr><p>If the token or API key is missing, expired, or invalid, the API responds with <code>401 Unauthorized</code>.</p>`,14)]))}const g=e(n,[["render",o]]);export{k as __pageData,g as default};

View File

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

View File

@@ -1,2 +0,0 @@
import{_ as a,c as t,o as i,ag as n}from"./chunks/framework.S-Qvb3wi.js";const u=JSON.parse('{"title":"API Authentication","description":"","frontmatter":{},"headers":[],"relativePath":"api/authentication.md","filePath":"api/authentication.md"}'),s={name:"api/authentication.md"};function o(r,e,d,c,h,l){return i(),t("div",null,e[0]||(e[0]=[n(`<h1 id="api-authentication" tabindex="-1">API Authentication <a class="header-anchor" href="#api-authentication" aria-label="Permalink to &quot;API Authentication&quot;"></a></h1><p>To access protected API endpoints, you need to include a user-generated API key in the <code>X-API-KEY</code> header of your requests.</p><h2 id="_1-creating-an-api-key" tabindex="-1">1. Creating an API Key <a class="header-anchor" href="#_1-creating-an-api-key" aria-label="Permalink to &quot;1. Creating an API Key&quot;"></a></h2><p>You can create, manage, and view your API keys through the application&#39;s user interface.</p><ol><li>Navigate to <strong>Settings &gt; API Keys</strong> in the dashboard.</li><li>Click the <strong>&quot;Generate API Key&quot;</strong> button.</li><li>Provide a descriptive name for your key and select an expiration period.</li><li>The new API key will be displayed. <strong>Copy this key immediately and store it in a secure location. You will not be able to see it again.</strong></li></ol><h2 id="_2-making-authenticated-requests" tabindex="-1">2. Making Authenticated Requests <a class="header-anchor" href="#_2-making-authenticated-requests" aria-label="Permalink to &quot;2. Making Authenticated Requests&quot;"></a></h2><p>Once you have your API key, you must include it in the <code>X-API-KEY</code> header of all subsequent requests to protected API endpoints.</p><p><strong>Example:</strong></p><div class="language-http vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">http</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">GET</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> /api/v1/dashboard/stats</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">X-API-KEY</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2</span></span></code></pre></div><p>If the API key is missing, expired, or invalid, the API will respond with a <code>401 Unauthorized</code> status code.</p>`,10)]))}const g=a(s,[["render",o]]);export{u as __pageData,g as default};

View File

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

View File

@@ -0,0 +1 @@
import{_ as n,C as i,c as o,o as d,j as a,G as r,a as t}from"./chunks/framework.DHqKNX4U.js";const u=JSON.parse('{"title":"Dashboard API","description":"","frontmatter":{"aside":false},"headers":[],"relativePath":"api/dashboard.md","filePath":"api/dashboard.md"}'),l={name:"api/dashboard.md"};function h(g,e,m,p,b,c){const s=i("OAOperation");return d(),o("div",null,[e[0]||(e[0]=a("h1",{id:"dashboard-api",tabindex:"-1"},[t("Dashboard API "),a("a",{class:"header-anchor",href:"#dashboard-api","aria-label":'Permalink to "Dashboard API"'},"")],-1)),e[1]||(e[1]=a("p",null,[t("Aggregated statistics and summaries for the dashboard UI. Requires "),a("code",null,"read:dashboard"),t(" permission.")],-1)),e[2]||(e[2]=a("h2",{id:"get-stats",tabindex:"-1"},[t("Get Stats "),a("a",{class:"header-anchor",href:"#get-stats","aria-label":'Permalink to "Get Stats"'},"")],-1)),r(s,{operationId:"getDashboardStats"}),e[3]||(e[3]=a("h2",{id:"get-ingestion-history",tabindex:"-1"},[t("Get Ingestion History "),a("a",{class:"header-anchor",href:"#get-ingestion-history","aria-label":'Permalink to "Get Ingestion History"'},"")],-1)),r(s,{operationId:"getIngestionHistory"}),e[4]||(e[4]=a("h2",{id:"get-ingestion-source-summaries",tabindex:"-1"},[t("Get Ingestion Source Summaries "),a("a",{class:"header-anchor",href:"#get-ingestion-source-summaries","aria-label":'Permalink to "Get Ingestion Source Summaries"'},"")],-1)),r(s,{operationId:"getDashboardIngestionSources"}),e[5]||(e[5]=a("h2",{id:"get-recent-syncs",tabindex:"-1"},[t("Get Recent Syncs "),a("a",{class:"header-anchor",href:"#get-recent-syncs","aria-label":'Permalink to "Get Recent Syncs"'},"")],-1)),r(s,{operationId:"getRecentSyncs"}),e[6]||(e[6]=a("h2",{id:"get-indexed-email-insights",tabindex:"-1"},[t("Get Indexed Email Insights "),a("a",{class:"header-anchor",href:"#get-indexed-email-insights","aria-label":'Permalink to "Get Indexed Email Insights"'},"")],-1)),r(s,{operationId:"getIndexedInsights"})])}const f=n(l,[["render",h]]);export{u as __pageData,f as default};

View File

@@ -0,0 +1 @@
import{_ as n,C as i,c as o,o as d,j as a,G as r,a as t}from"./chunks/framework.DHqKNX4U.js";const u=JSON.parse('{"title":"Dashboard API","description":"","frontmatter":{"aside":false},"headers":[],"relativePath":"api/dashboard.md","filePath":"api/dashboard.md"}'),l={name:"api/dashboard.md"};function h(g,e,m,p,b,c){const s=i("OAOperation");return d(),o("div",null,[e[0]||(e[0]=a("h1",{id:"dashboard-api",tabindex:"-1"},[t("Dashboard API "),a("a",{class:"header-anchor",href:"#dashboard-api","aria-label":'Permalink to "Dashboard API"'},"")],-1)),e[1]||(e[1]=a("p",null,[t("Aggregated statistics and summaries for the dashboard UI. Requires "),a("code",null,"read:dashboard"),t(" permission.")],-1)),e[2]||(e[2]=a("h2",{id:"get-stats",tabindex:"-1"},[t("Get Stats "),a("a",{class:"header-anchor",href:"#get-stats","aria-label":'Permalink to "Get Stats"'},"")],-1)),r(s,{operationId:"getDashboardStats"}),e[3]||(e[3]=a("h2",{id:"get-ingestion-history",tabindex:"-1"},[t("Get Ingestion History "),a("a",{class:"header-anchor",href:"#get-ingestion-history","aria-label":'Permalink to "Get Ingestion History"'},"")],-1)),r(s,{operationId:"getIngestionHistory"}),e[4]||(e[4]=a("h2",{id:"get-ingestion-source-summaries",tabindex:"-1"},[t("Get Ingestion Source Summaries "),a("a",{class:"header-anchor",href:"#get-ingestion-source-summaries","aria-label":'Permalink to "Get Ingestion Source Summaries"'},"")],-1)),r(s,{operationId:"getDashboardIngestionSources"}),e[5]||(e[5]=a("h2",{id:"get-recent-syncs",tabindex:"-1"},[t("Get Recent Syncs "),a("a",{class:"header-anchor",href:"#get-recent-syncs","aria-label":'Permalink to "Get Recent Syncs"'},"")],-1)),r(s,{operationId:"getRecentSyncs"}),e[6]||(e[6]=a("h2",{id:"get-indexed-email-insights",tabindex:"-1"},[t("Get Indexed Email Insights "),a("a",{class:"header-anchor",href:"#get-indexed-email-insights","aria-label":'Permalink to "Get Indexed Email Insights"'},"")],-1)),r(s,{operationId:"getIndexedInsights"})])}const f=n(l,[["render",h]]);export{u as __pageData,f as default};

View File

@@ -1,38 +0,0 @@
import{_ as i,c as a,o as t,ag as n}from"./chunks/framework.S-Qvb3wi.js";const E=JSON.parse('{"title":"Dashboard Service API","description":"","frontmatter":{},"headers":[],"relativePath":"api/dashboard.md","filePath":"api/dashboard.md"}'),e={name:"api/dashboard.md"};function h(p,s,l,o,r,k){return t(),a("div",null,s[0]||(s[0]=[n(`<h1 id="dashboard-service-api" tabindex="-1">Dashboard Service API <a class="header-anchor" href="#dashboard-service-api" aria-label="Permalink to &quot;Dashboard Service API&quot;"></a></h1><p>The Dashboard Service provides endpoints for retrieving statistics and data for the main dashboard.</p><h2 id="endpoints" tabindex="-1">Endpoints <a class="header-anchor" href="#endpoints" aria-label="Permalink to &quot;Endpoints&quot;"></a></h2><p>All endpoints in this service require authentication.</p><h3 id="get-api-v1-dashboard-stats" tabindex="-1">GET /api/v1/dashboard/stats <a class="header-anchor" href="#get-api-v1-dashboard-stats" aria-label="Permalink to &quot;GET /api/v1/dashboard/stats&quot;"></a></h3><p>Retrieves overall statistics, including the total number of archived emails, total storage used, and the number of failed ingestions in the last 7 days.</p><p><strong>Access:</strong> Authenticated</p><h4 id="responses" tabindex="-1">Responses <a class="header-anchor" href="#responses" aria-label="Permalink to &quot;Responses&quot;"></a></h4><ul><li><p><strong>200 OK:</strong> An object containing the dashboard statistics.</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;totalEmailsArchived&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">12345</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;totalStorageUsed&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">54321098</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;failedIngestionsLast7Days&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">3</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div></li></ul><h3 id="get-api-v1-dashboard-ingestion-history" tabindex="-1">GET /api/v1/dashboard/ingestion-history <a class="header-anchor" href="#get-api-v1-dashboard-ingestion-history" aria-label="Permalink to &quot;GET /api/v1/dashboard/ingestion-history&quot;"></a></h3><p>Retrieves the email ingestion history for the last 30 days, grouped by day.</p><p><strong>Access:</strong> Authenticated</p><h4 id="responses-1" tabindex="-1">Responses <a class="header-anchor" href="#responses-1" aria-label="Permalink to &quot;Responses&quot;"></a></h4><ul><li><p><strong>200 OK:</strong> An object containing the ingestion history.</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;history&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;date&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;2023-09-27T00: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;count&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">150</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;date&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;2023-09-28T00: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;count&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">200</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></li></ul><h3 id="get-api-v1-dashboard-ingestion-sources" tabindex="-1">GET /api/v1/dashboard/ingestion-sources <a class="header-anchor" href="#get-api-v1-dashboard-ingestion-sources" aria-label="Permalink to &quot;GET /api/v1/dashboard/ingestion-sources&quot;"></a></h3><p>Retrieves a list of all ingestion sources along with their status and storage usage.</p><p><strong>Access:</strong> Authenticated</p><h4 id="responses-2" tabindex="-1">Responses <a class="header-anchor" href="#responses-2" aria-label="Permalink to &quot;Responses&quot;"></a></h4><ul><li><p><strong>200 OK:</strong> An array of ingestion source objects.</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:#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;source-id-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;Google Workspace&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;provider&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;google&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;status&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;active&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;storageUsed&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">12345678</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;id&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;source-id-2&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;Microsoft 365&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;provider&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;microsoft&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;status&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;error&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;storageUsed&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">87654321</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></li></ul><h3 id="get-api-v1-dashboard-recent-syncs" tabindex="-1">GET /api/v1/dashboard/recent-syncs <a class="header-anchor" href="#get-api-v1-dashboard-recent-syncs" aria-label="Permalink to &quot;GET /api/v1/dashboard/recent-syncs&quot;"></a></h3><p>Retrieves a list of recent synchronization jobs. (Note: This is currently a placeholder and will return an empty array).</p><p><strong>Access:</strong> Authenticated</p><h4 id="responses-3" tabindex="-1">Responses <a class="header-anchor" href="#responses-3" aria-label="Permalink to &quot;Responses&quot;"></a></h4><ul><li><p><strong>200 OK:</strong> An empty array.</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></code></pre></div></li></ul><h3 id="get-api-v1-dashboard-indexed-insights" tabindex="-1">GET /api/v1/dashboard/indexed-insights <a class="header-anchor" href="#get-api-v1-dashboard-indexed-insights" aria-label="Permalink to &quot;GET /api/v1/dashboard/indexed-insights&quot;"></a></h3><p>Retrieves insights from the indexed email data, such as the top senders.</p><p><strong>Access:</strong> Authenticated</p><h4 id="responses-4" tabindex="-1">Responses <a class="header-anchor" href="#responses-4" aria-label="Permalink to &quot;Responses&quot;"></a></h4><ul><li><p><strong>200 OK:</strong> An object containing indexed insights.</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;topSenders&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;sender&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;user@example.com&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;count&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">42</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></li></ul>`,29)]))}const g=i(e,[["render",h]]);export{E as __pageData,g as default};

View File

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

View File

@@ -0,0 +1 @@
import{_ as t,C as i,c as n,o as s,j as e,G as o,a as l}from"./chunks/framework.DHqKNX4U.js";const I=JSON.parse('{"title":"IAM API","description":"","frontmatter":{"aside":false},"headers":[],"relativePath":"api/iam.md","filePath":"api/iam.md"}'),d={name:"api/iam.md"};function p(m,a,R,f,h,u){const r=i("OAOperation");return s(),n("div",null,[a[0]||(a[0]=e("h1",{id:"iam-api",tabindex:"-1"},[l("IAM API "),e("a",{class:"header-anchor",href:"#iam-api","aria-label":'Permalink to "IAM API"'},"")],-1)),a[1]||(a[1]=e("p",null,[l("Manage Identity and Access Management roles and their CASL policy statements. Role management requires Super Admin ("),e("code",null,"manage:all"),l(") permission. Reading roles requires "),e("code",null,"read:roles"),l(" permission.")],-1)),a[2]||(a[2]=e("h2",{id:"list-all-roles",tabindex:"-1"},[l("List All Roles "),e("a",{class:"header-anchor",href:"#list-all-roles","aria-label":'Permalink to "List All Roles"'},"")],-1)),o(r,{operationId:"getRoles"}),a[3]||(a[3]=e("h2",{id:"create-a-role",tabindex:"-1"},[l("Create a Role "),e("a",{class:"header-anchor",href:"#create-a-role","aria-label":'Permalink to "Create a Role"'},"")],-1)),o(r,{operationId:"createRole"}),a[4]||(a[4]=e("h2",{id:"get-a-role",tabindex:"-1"},[l("Get a Role "),e("a",{class:"header-anchor",href:"#get-a-role","aria-label":'Permalink to "Get a Role"'},"")],-1)),o(r,{operationId:"getRoleById"}),a[5]||(a[5]=e("h2",{id:"update-a-role",tabindex:"-1"},[l("Update a Role "),e("a",{class:"header-anchor",href:"#update-a-role","aria-label":'Permalink to "Update a Role"'},"")],-1)),o(r,{operationId:"updateRole"}),a[6]||(a[6]=e("h2",{id:"delete-a-role",tabindex:"-1"},[l("Delete a Role "),e("a",{class:"header-anchor",href:"#delete-a-role","aria-label":'Permalink to "Delete a Role"'},"")],-1)),o(r,{operationId:"deleteRole"})])}const b=t(d,[["render",p]]);export{I as __pageData,b as default};

View File

@@ -0,0 +1 @@
import{_ as t,C as i,c as n,o as s,j as e,G as o,a as l}from"./chunks/framework.DHqKNX4U.js";const I=JSON.parse('{"title":"IAM API","description":"","frontmatter":{"aside":false},"headers":[],"relativePath":"api/iam.md","filePath":"api/iam.md"}'),d={name:"api/iam.md"};function p(m,a,R,f,h,u){const r=i("OAOperation");return s(),n("div",null,[a[0]||(a[0]=e("h1",{id:"iam-api",tabindex:"-1"},[l("IAM API "),e("a",{class:"header-anchor",href:"#iam-api","aria-label":'Permalink to "IAM API"'},"")],-1)),a[1]||(a[1]=e("p",null,[l("Manage Identity and Access Management roles and their CASL policy statements. Role management requires Super Admin ("),e("code",null,"manage:all"),l(") permission. Reading roles requires "),e("code",null,"read:roles"),l(" permission.")],-1)),a[2]||(a[2]=e("h2",{id:"list-all-roles",tabindex:"-1"},[l("List All Roles "),e("a",{class:"header-anchor",href:"#list-all-roles","aria-label":'Permalink to "List All Roles"'},"")],-1)),o(r,{operationId:"getRoles"}),a[3]||(a[3]=e("h2",{id:"create-a-role",tabindex:"-1"},[l("Create a Role "),e("a",{class:"header-anchor",href:"#create-a-role","aria-label":'Permalink to "Create a Role"'},"")],-1)),o(r,{operationId:"createRole"}),a[4]||(a[4]=e("h2",{id:"get-a-role",tabindex:"-1"},[l("Get a Role "),e("a",{class:"header-anchor",href:"#get-a-role","aria-label":'Permalink to "Get a Role"'},"")],-1)),o(r,{operationId:"getRoleById"}),a[5]||(a[5]=e("h2",{id:"update-a-role",tabindex:"-1"},[l("Update a Role "),e("a",{class:"header-anchor",href:"#update-a-role","aria-label":'Permalink to "Update a Role"'},"")],-1)),o(r,{operationId:"updateRole"}),a[6]||(a[6]=e("h2",{id:"delete-a-role",tabindex:"-1"},[l("Delete a Role "),e("a",{class:"header-anchor",href:"#delete-a-role","aria-label":'Permalink to "Delete a Role"'},"")],-1)),o(r,{operationId:"deleteRole"})])}const b=t(d,[["render",p]]);export{I as __pageData,b as default};

View File

@@ -0,0 +1 @@
import{_ as a,c as t,o as i,ax as r}from"./chunks/framework.DHqKNX4U.js";const p=JSON.parse('{"title":"API Overview","description":"","frontmatter":{"aside":false},"headers":[],"relativePath":"api/index.md","filePath":"api/index.md"}'),o={name:"api/index.md"};function n(s,e,h,l,d,c){return i(),t("div",null,e[0]||(e[0]=[r('<h1 id="api-overview" tabindex="-1">API Overview <a class="header-anchor" href="#api-overview" aria-label="Permalink to &quot;API Overview&quot;"></a></h1><p>Welcome to the Open Archiver API documentation. This section provides detailed information about the available API endpoints.</p><p>All API endpoints are prefixed with <code>/api/v1</code>.</p><h2 id="authentication" tabindex="-1">Authentication <a class="header-anchor" href="#authentication" aria-label="Permalink to &quot;Authentication&quot;"></a></h2><p>Before making requests to protected endpoints, you must authenticate with the API. See the <a href="./authentication.html">Authentication Guide</a> for details on how to obtain and use API tokens.</p><h2 id="api-services" tabindex="-1">API Services <a class="header-anchor" href="#api-services" aria-label="Permalink to &quot;API Services&quot;"></a></h2><ul><li><a href="./auth.html"><strong>Auth Service</strong></a>: Handles user authentication.</li><li><a href="./archived-email.html"><strong>Archived Email Service</strong></a>: Manages archived emails.</li><li><a href="./dashboard.html"><strong>Dashboard Service</strong></a>: Provides data for the main dashboard.</li><li><a href="./ingestion.html"><strong>Ingestion Service</strong></a>: Manages email ingestion sources.</li><li><a href="./search.html"><strong>Search Service</strong></a>: Handles email search functionality.</li><li><a href="./storage.html"><strong>Storage Service</strong></a>: Manages file storage and downloads.</li></ul>',7)]))}const m=a(o,[["render",n]]);export{p as __pageData,m as default};

View File

@@ -0,0 +1 @@
import{_ as a,c as t,o as i,ax as r}from"./chunks/framework.DHqKNX4U.js";const p=JSON.parse('{"title":"API Overview","description":"","frontmatter":{"aside":false},"headers":[],"relativePath":"api/index.md","filePath":"api/index.md"}'),o={name:"api/index.md"};function n(s,e,h,l,d,c){return i(),t("div",null,e[0]||(e[0]=[r("",7)]))}const m=a(o,[["render",n]]);export{p as __pageData,m as default};

View File

@@ -1 +0,0 @@
import{_ as a,c as t,o as i,ag as r}from"./chunks/framework.S-Qvb3wi.js";const p=JSON.parse('{"title":"API Overview","description":"","frontmatter":{},"headers":[],"relativePath":"api/index.md","filePath":"api/index.md"}'),o={name:"api/index.md"};function n(s,e,h,l,d,c){return i(),t("div",null,e[0]||(e[0]=[r('<h1 id="api-overview" tabindex="-1">API Overview <a class="header-anchor" href="#api-overview" aria-label="Permalink to &quot;API Overview&quot;"></a></h1><p>Welcome to the Open Archiver API documentation. This section provides detailed information about the available API endpoints.</p><p>All API endpoints are prefixed with <code>/api/v1</code>.</p><h2 id="authentication" tabindex="-1">Authentication <a class="header-anchor" href="#authentication" aria-label="Permalink to &quot;Authentication&quot;"></a></h2><p>Before making requests to protected endpoints, you must authenticate with the API. See the <a href="./authentication.html">Authentication Guide</a> for details on how to obtain and use API tokens.</p><h2 id="api-services" tabindex="-1">API Services <a class="header-anchor" href="#api-services" aria-label="Permalink to &quot;API Services&quot;"></a></h2><ul><li><a href="./auth.html"><strong>Auth Service</strong></a>: Handles user authentication.</li><li><a href="./archived-email.html"><strong>Archived Email Service</strong></a>: Manages archived emails.</li><li><a href="./dashboard.html"><strong>Dashboard Service</strong></a>: Provides data for the main dashboard.</li><li><a href="./ingestion.html"><strong>Ingestion Service</strong></a>: Manages email ingestion sources.</li><li><a href="./search.html"><strong>Search Service</strong></a>: Handles email search functionality.</li><li><a href="./storage.html"><strong>Storage Service</strong></a>: Manages file storage and downloads.</li></ul>',7)]))}const m=a(o,[["render",n]]);export{p as __pageData,m as default};

View File

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

View File

@@ -0,0 +1 @@
import{_ as r,C as t,c as s,o as l,j as n,G as a,a as i}from"./chunks/framework.DHqKNX4U.js";const S=JSON.parse('{"title":"Ingestion API","description":"","frontmatter":{"aside":false},"headers":[],"relativePath":"api/ingestion.md","filePath":"api/ingestion.md"}'),d={name:"api/ingestion.md"};function g(c,e,u,p,I,m){const o=t("OAOperation");return l(),s("div",null,[e[0]||(e[0]=n("h1",{id:"ingestion-api",tabindex:"-1"},[i("Ingestion API "),n("a",{class:"header-anchor",href:"#ingestion-api","aria-label":'Permalink to "Ingestion API"'},"")],-1)),e[1]||(e[1]=n("p",null,"Manage ingestion sources — the configured connections to email providers (Google Workspace, Microsoft 365, IMAP, and file imports). Credentials are never returned in responses.",-1)),e[2]||(e[2]=n("h2",{id:"create-an-ingestion-source",tabindex:"-1"},[i("Create an Ingestion Source "),n("a",{class:"header-anchor",href:"#create-an-ingestion-source","aria-label":'Permalink to "Create an Ingestion Source"'},"")],-1)),a(o,{operationId:"createIngestionSource"}),e[3]||(e[3]=n("h2",{id:"list-ingestion-sources",tabindex:"-1"},[i("List Ingestion Sources "),n("a",{class:"header-anchor",href:"#list-ingestion-sources","aria-label":'Permalink to "List Ingestion Sources"'},"")],-1)),a(o,{operationId:"listIngestionSources"}),e[4]||(e[4]=n("h2",{id:"get-an-ingestion-source",tabindex:"-1"},[i("Get an Ingestion Source "),n("a",{class:"header-anchor",href:"#get-an-ingestion-source","aria-label":'Permalink to "Get an Ingestion Source"'},"")],-1)),a(o,{operationId:"getIngestionSourceById"}),e[5]||(e[5]=n("h2",{id:"update-an-ingestion-source",tabindex:"-1"},[i("Update an Ingestion Source "),n("a",{class:"header-anchor",href:"#update-an-ingestion-source","aria-label":'Permalink to "Update an Ingestion Source"'},"")],-1)),a(o,{operationId:"updateIngestionSource"}),e[6]||(e[6]=n("h2",{id:"delete-an-ingestion-source",tabindex:"-1"},[i("Delete an Ingestion Source "),n("a",{class:"header-anchor",href:"#delete-an-ingestion-source","aria-label":'Permalink to "Delete an Ingestion Source"'},"")],-1)),a(o,{operationId:"deleteIngestionSource"}),e[7]||(e[7]=n("h2",{id:"trigger-initial-import",tabindex:"-1"},[i("Trigger Initial Import "),n("a",{class:"header-anchor",href:"#trigger-initial-import","aria-label":'Permalink to "Trigger Initial Import"'},"")],-1)),a(o,{operationId:"triggerInitialImport"}),e[8]||(e[8]=n("h2",{id:"pause-an-ingestion-source",tabindex:"-1"},[i("Pause an Ingestion Source "),n("a",{class:"header-anchor",href:"#pause-an-ingestion-source","aria-label":'Permalink to "Pause an Ingestion Source"'},"")],-1)),a(o,{operationId:"pauseIngestionSource"}),e[9]||(e[9]=n("h2",{id:"force-sync",tabindex:"-1"},[i("Force Sync "),n("a",{class:"header-anchor",href:"#force-sync","aria-label":'Permalink to "Force Sync"'},"")],-1)),a(o,{operationId:"triggerForceSync"})])}const h=r(d,[["render",g]]);export{S as __pageData,h as default};

View File

@@ -0,0 +1 @@
import{_ as r,C as t,c as s,o as l,j as n,G as a,a as i}from"./chunks/framework.DHqKNX4U.js";const S=JSON.parse('{"title":"Ingestion API","description":"","frontmatter":{"aside":false},"headers":[],"relativePath":"api/ingestion.md","filePath":"api/ingestion.md"}'),d={name:"api/ingestion.md"};function g(c,e,u,p,I,m){const o=t("OAOperation");return l(),s("div",null,[e[0]||(e[0]=n("h1",{id:"ingestion-api",tabindex:"-1"},[i("Ingestion API "),n("a",{class:"header-anchor",href:"#ingestion-api","aria-label":'Permalink to "Ingestion API"'},"")],-1)),e[1]||(e[1]=n("p",null,"Manage ingestion sources — the configured connections to email providers (Google Workspace, Microsoft 365, IMAP, and file imports). Credentials are never returned in responses.",-1)),e[2]||(e[2]=n("h2",{id:"create-an-ingestion-source",tabindex:"-1"},[i("Create an Ingestion Source "),n("a",{class:"header-anchor",href:"#create-an-ingestion-source","aria-label":'Permalink to "Create an Ingestion Source"'},"")],-1)),a(o,{operationId:"createIngestionSource"}),e[3]||(e[3]=n("h2",{id:"list-ingestion-sources",tabindex:"-1"},[i("List Ingestion Sources "),n("a",{class:"header-anchor",href:"#list-ingestion-sources","aria-label":'Permalink to "List Ingestion Sources"'},"")],-1)),a(o,{operationId:"listIngestionSources"}),e[4]||(e[4]=n("h2",{id:"get-an-ingestion-source",tabindex:"-1"},[i("Get an Ingestion Source "),n("a",{class:"header-anchor",href:"#get-an-ingestion-source","aria-label":'Permalink to "Get an Ingestion Source"'},"")],-1)),a(o,{operationId:"getIngestionSourceById"}),e[5]||(e[5]=n("h2",{id:"update-an-ingestion-source",tabindex:"-1"},[i("Update an Ingestion Source "),n("a",{class:"header-anchor",href:"#update-an-ingestion-source","aria-label":'Permalink to "Update an Ingestion Source"'},"")],-1)),a(o,{operationId:"updateIngestionSource"}),e[6]||(e[6]=n("h2",{id:"delete-an-ingestion-source",tabindex:"-1"},[i("Delete an Ingestion Source "),n("a",{class:"header-anchor",href:"#delete-an-ingestion-source","aria-label":'Permalink to "Delete an Ingestion Source"'},"")],-1)),a(o,{operationId:"deleteIngestionSource"}),e[7]||(e[7]=n("h2",{id:"trigger-initial-import",tabindex:"-1"},[i("Trigger Initial Import "),n("a",{class:"header-anchor",href:"#trigger-initial-import","aria-label":'Permalink to "Trigger Initial Import"'},"")],-1)),a(o,{operationId:"triggerInitialImport"}),e[8]||(e[8]=n("h2",{id:"pause-an-ingestion-source",tabindex:"-1"},[i("Pause an Ingestion Source "),n("a",{class:"header-anchor",href:"#pause-an-ingestion-source","aria-label":'Permalink to "Pause an Ingestion Source"'},"")],-1)),a(o,{operationId:"pauseIngestionSource"}),e[9]||(e[9]=n("h2",{id:"force-sync",tabindex:"-1"},[i("Force Sync "),n("a",{class:"header-anchor",href:"#force-sync","aria-label":'Permalink to "Force Sync"'},"")],-1)),a(o,{operationId:"triggerForceSync"})])}const h=r(d,[["render",g]]);export{S as __pageData,h as default};

File diff suppressed because one or more lines are too long

View File

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

View File

@@ -0,0 +1 @@
import{_ as r,C as n,c as o,o as s,j as t,G as c,a}from"./chunks/framework.DHqKNX4U.js";const f=JSON.parse('{"title":"Integrity Check API","description":"","frontmatter":{"aside":false},"headers":[],"relativePath":"api/integrity.md","filePath":"api/integrity.md"}'),l={name:"api/integrity.md"};function h(d,e,p,m,g,y){const i=n("OAOperation");return s(),o("div",null,[e[0]||(e[0]=t("h1",{id:"integrity-check-api",tabindex:"-1"},[a("Integrity Check API "),t("a",{class:"header-anchor",href:"#integrity-check-api","aria-label":'Permalink to "Integrity Check API"'},"")],-1)),e[1]||(e[1]=t("p",null,"Verify the SHA-256 hash of an archived email and all its attachments against the hashes stored at archival time.",-1)),e[2]||(e[2]=t("h2",{id:"check-email-integrity",tabindex:"-1"},[a("Check Email Integrity "),t("a",{class:"header-anchor",href:"#check-email-integrity","aria-label":'Permalink to "Check Email Integrity"'},"")],-1)),c(i,{operationId:"checkIntegrity"})])}const I=r(l,[["render",h]]);export{f as __pageData,I as default};

View File

@@ -0,0 +1 @@
import{_ as r,C as n,c as o,o as s,j as t,G as c,a}from"./chunks/framework.DHqKNX4U.js";const f=JSON.parse('{"title":"Integrity Check API","description":"","frontmatter":{"aside":false},"headers":[],"relativePath":"api/integrity.md","filePath":"api/integrity.md"}'),l={name:"api/integrity.md"};function h(d,e,p,m,g,y){const i=n("OAOperation");return s(),o("div",null,[e[0]||(e[0]=t("h1",{id:"integrity-check-api",tabindex:"-1"},[a("Integrity Check API "),t("a",{class:"header-anchor",href:"#integrity-check-api","aria-label":'Permalink to "Integrity Check API"'},"")],-1)),e[1]||(e[1]=t("p",null,"Verify the SHA-256 hash of an archived email and all its attachments against the hashes stored at archival time.",-1)),e[2]||(e[2]=t("h2",{id:"check-email-integrity",tabindex:"-1"},[a("Check Email Integrity "),t("a",{class:"header-anchor",href:"#check-email-integrity","aria-label":'Permalink to "Check Email Integrity"'},"")],-1)),c(i,{operationId:"checkIntegrity"})])}const I=r(l,[["render",h]]);export{f as __pageData,I as default};

View File

@@ -1,14 +0,0 @@
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

@@ -1 +0,0 @@
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

@@ -1,61 +0,0 @@
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

@@ -1 +0,0 @@
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

@@ -0,0 +1 @@
import{_ as i,C as n,c as t,o as d,ax as r,G as a,j as s,a as c}from"./chunks/framework.DHqKNX4U.js";const f=JSON.parse('{"title":"Jobs API","description":"","frontmatter":{"aside":false},"headers":[],"relativePath":"api/jobs.md","filePath":"api/jobs.md"}'),l={name:"api/jobs.md"};function u(p,e,b,h,m,_){const o=n("OAOperation");return d(),t("div",null,[e[0]||(e[0]=r('<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>Monitor BullMQ job queues for asynchronous tasks such as email ingestion, indexing, and sync scheduling. Requires Super Admin (<code>manage:all</code>) permission.</p><p>There are two queues:</p><ul><li><strong><code>ingestion</code></strong> — handles all email ingestion and sync jobs (<code>initial-import</code>, <code>continuous-sync</code>, <code>process-mailbox</code>, <code>sync-cycle-finished</code>, <code>schedule-continuous-sync</code>)</li><li><strong><code>indexing</code></strong> — handles batched Meilisearch document indexing (<code>index-email-batch</code>)</li></ul><h2 id="list-all-queues" tabindex="-1">List All Queues <a class="header-anchor" href="#list-all-queues" aria-label="Permalink to &quot;List All Queues&quot;"></a></h2>',5)),a(o,{operationId:"getQueues"}),e[1]||(e[1]=s("h2",{id:"get-jobs-in-a-queue",tabindex:"-1"},[c("Get Jobs in a Queue "),s("a",{class:"header-anchor",href:"#get-jobs-in-a-queue","aria-label":'Permalink to "Get Jobs in a Queue"'},"")],-1)),a(o,{operationId:"getQueueJobs"})])}const x=i(l,[["render",u]]);export{f as __pageData,x as default};

View File

@@ -0,0 +1 @@
import{_ as i,C as n,c as t,o as d,ax as r,G as a,j as s,a as c}from"./chunks/framework.DHqKNX4U.js";const f=JSON.parse('{"title":"Jobs API","description":"","frontmatter":{"aside":false},"headers":[],"relativePath":"api/jobs.md","filePath":"api/jobs.md"}'),l={name:"api/jobs.md"};function u(p,e,b,h,m,_){const o=n("OAOperation");return d(),t("div",null,[e[0]||(e[0]=r("",5)),a(o,{operationId:"getQueues"}),e[1]||(e[1]=s("h2",{id:"get-jobs-in-a-queue",tabindex:"-1"},[c("Get Jobs in a Queue "),s("a",{class:"header-anchor",href:"#get-jobs-in-a-queue","aria-label":'Permalink to "Get Jobs in a Queue"'},"")],-1)),a(o,{operationId:"getQueueJobs"})])}const x=i(l,[["render",u]]);export{f as __pageData,x as default};

View File

@@ -1,4 +1,4 @@
import{_ as i,c as t,o as a,ag as s}from"./chunks/framework.S-Qvb3wi.js";const p=JSON.parse('{"title":"Rate Limiting","description":"","frontmatter":{},"headers":[],"relativePath":"api/rate-limiting.md","filePath":"api/rate-limiting.md"}'),n={name:"api/rate-limiting.md"};function o(r,e,l,d,h,c){return a(),t("div",null,e[0]||(e[0]=[s(`<h1 id="rate-limiting" tabindex="-1">Rate Limiting <a class="header-anchor" href="#rate-limiting" aria-label="Permalink to &quot;Rate Limiting&quot;"></a></h1><p>The API implements rate limiting as a security measure to protect your instance from denial-of-service (DoS) and brute-force attacks. This is a crucial feature for maintaining the security and stability of the application.</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>The rate limiter restricts the number of requests an IP address can make within a specific time frame. These limits are configurable via environment variables to suit your security needs.</p><p>By default, the limits are:</p><ul><li><strong>100 requests</strong> per <strong>1 minute</strong> per IP address.</li></ul><p>If this limit is exceeded, the API will respond with an HTTP <code>429 Too Many Requests</code> status code.</p><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><p>When an IP address is rate-limited, the API will return a JSON response with the following format:</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>
import{_ as i,c as t,o as a,ax as s}from"./chunks/framework.DHqKNX4U.js";const p=JSON.parse('{"title":"Rate Limiting","description":"","frontmatter":{"aside":false},"headers":[],"relativePath":"api/rate-limiting.md","filePath":"api/rate-limiting.md"}'),n={name:"api/rate-limiting.md"};function o(r,e,l,d,h,c){return a(),t("div",null,e[0]||(e[0]=[s(`<h1 id="rate-limiting" tabindex="-1">Rate Limiting <a class="header-anchor" href="#rate-limiting" aria-label="Permalink to &quot;Rate Limiting&quot;"></a></h1><p>The API implements rate limiting as a security measure to protect your instance from denial-of-service (DoS) and brute-force attacks. This is a crucial feature for maintaining the security and stability of the application.</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>The rate limiter restricts the number of requests an IP address can make within a specific time frame. These limits are configurable via environment variables to suit your security needs.</p><p>By default, the limits are:</p><ul><li><strong>100 requests</strong> per <strong>1 minute</strong> per IP address.</li></ul><p>If this limit is exceeded, the API will respond with an HTTP <code>429 Too Many Requests</code> status code.</p><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><p>When an IP address is rate-limited, the API will return a JSON response with the following format:</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;status&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">429</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;Too many requests from this IP, please try again after 15 minutes&quot;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div><h2 id="configuration" tabindex="-1">Configuration <a class="header-anchor" href="#configuration" aria-label="Permalink to &quot;Configuration&quot;"></a></h2><p>You can customize the rate-limiting settings by setting the following environment variables in your <code>.env</code> file:</p><ul><li><code>RATE_LIMIT_WINDOW_MS</code>: The time window in milliseconds. Defaults to <code>60000</code> (1 minute).</li><li><code>RATE_LIMIT_MAX_REQUESTS</code>: The maximum number of requests allowed per IP address within the time window. Defaults to <code>100</code>.</li></ul><h2 id="handling-rate-limits" tabindex="-1">Handling Rate Limits <a class="header-anchor" href="#handling-rate-limits" aria-label="Permalink to &quot;Handling Rate Limits&quot;"></a></h2><p>If you are developing a client that interacts with the API, you should handle rate limiting gracefully:</p><ol><li><strong>Check the Status Code</strong>: Monitor for a <code>429</code> HTTP status code in responses.</li><li><strong>Implement a Retry Mechanism</strong>: When you receive a <code>429</code> response, it is best practice to wait before retrying the request. Implementing an exponential backoff strategy is recommended.</li><li><strong>Check Headers</strong>: The response will include the following standard headers to help you manage your request rate: <ul><li><code>RateLimit-Limit</code>: The maximum number of requests allowed in the current window.</li><li><code>RateLimit-Remaining</code>: The number of requests you have left in the current window.</li><li><code>RateLimit-Reset</code>: The time when the rate limit window will reset, in UTC epoch seconds.</li></ul></li></ol><h2 id="excluded-endpoints" tabindex="-1">Excluded Endpoints <a class="header-anchor" href="#excluded-endpoints" aria-label="Permalink to &quot;Excluded Endpoints&quot;"></a></h2><p>Certain essential endpoints are excluded from rate limiting to ensure the application&#39;s UI remains responsive. These are:</p><ul><li><code>/auth/status</code></li><li><code>/settings/system</code></li></ul><p>These endpoints can be called as needed without affecting your rate limit count.</p>`,20)]))}const m=i(n,[["render",o]]);export{p as __pageData,m as default};

View File

@@ -0,0 +1 @@
import{_ as i,c as t,o as a,ax as s}from"./chunks/framework.DHqKNX4U.js";const p=JSON.parse('{"title":"Rate Limiting","description":"","frontmatter":{"aside":false},"headers":[],"relativePath":"api/rate-limiting.md","filePath":"api/rate-limiting.md"}'),n={name:"api/rate-limiting.md"};function o(r,e,l,d,h,c){return a(),t("div",null,e[0]||(e[0]=[s("",20)]))}const m=i(n,[["render",o]]);export{p as __pageData,m as default};

View File

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

View File

@@ -1,17 +0,0 @@
import{_ as s,c as i,o as a,ag as e}from"./chunks/framework.S-Qvb3wi.js";const E=JSON.parse('{"title":"Search Service API","description":"","frontmatter":{},"headers":[],"relativePath":"api/search.md","filePath":"api/search.md"}'),n={name:"api/search.md"};function l(h,t,r,p,d,k){return a(),i("div",null,t[0]||(t[0]=[e(`<h1 id="search-service-api" tabindex="-1">Search Service API <a class="header-anchor" href="#search-service-api" aria-label="Permalink to &quot;Search Service API&quot;"></a></h1><p>The Search Service provides an endpoint for searching indexed emails.</p><h2 id="endpoints" tabindex="-1">Endpoints <a class="header-anchor" href="#endpoints" aria-label="Permalink to &quot;Endpoints&quot;"></a></h2><p>All endpoints in this service require authentication.</p><h3 id="get-api-v1-search" tabindex="-1">GET /api/v1/search <a class="header-anchor" href="#get-api-v1-search" aria-label="Permalink to &quot;GET /api/v1/search&quot;"></a></h3><p>Performs a search query against the indexed emails.</p><p><strong>Access:</strong> Authenticated</p><h4 id="query-parameters" tabindex="-1">Query Parameters <a class="header-anchor" href="#query-parameters" aria-label="Permalink to &quot;Query Parameters&quot;"></a></h4><table tabindex="0"><thead><tr><th style="text-align:left;">Parameter</th><th style="text-align:left;">Type</th><th style="text-align:left;">Description</th><th style="text-align:left;">Default</th></tr></thead><tbody><tr><td style="text-align:left;"><code>keywords</code></td><td style="text-align:left;">string</td><td style="text-align:left;">The search query.</td><td style="text-align:left;"></td></tr><tr><td style="text-align:left;"><code>page</code></td><td style="text-align:left;">number</td><td style="text-align:left;">The page number for pagination.</td><td style="text-align:left;">1</td></tr><tr><td style="text-align:left;"><code>limit</code></td><td style="text-align:left;">number</td><td style="text-align:left;">The number of items per page.</td><td style="text-align:left;">10</td></tr><tr><td style="text-align:left;"><code>matchingStrategy</code></td><td style="text-align:left;">string</td><td style="text-align:left;">The matching strategy to use (<code>all</code> or <code>last</code>).</td><td style="text-align:left;"><code>last</code></td></tr><tr><td style="text-align:left;"><code>filters</code></td><td style="text-align:left;">object</td><td style="text-align:left;">Key-value pairs for filtering results (e.g., <code>from=user@example.com</code>).</td><td style="text-align:left;"></td></tr></tbody></table><h4 id="responses" tabindex="-1">Responses <a class="header-anchor" href="#responses" aria-label="Permalink to &quot;Responses&quot;"></a></h4><ul><li><p><strong>200 OK:</strong> A search result object.</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;hits&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;email-id&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;subject&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;Test 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;from&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;sender@example.com&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;_formatted&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;subject&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;&lt;em&gt;Test&lt;/em&gt; Email&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:#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;">1</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;">10</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;processingTimeMs&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">5</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div></li><li><p><strong>400 Bad Request:</strong> Keywords are required.</p></li><li><p><strong>500 Internal Server Error:</strong> An unexpected error occurred.</p></li></ul>`,11)]))}const c=s(n,[["render",l]]);export{E as __pageData,c as default};

View File

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

View File

@@ -0,0 +1 @@
import{_ as t,C as i,c as o,o as n,j as a,G as l,a as r}from"./chunks/framework.DHqKNX4U.js";const P=JSON.parse('{"title":"Search API","description":"","frontmatter":{"aside":false},"headers":[],"relativePath":"api/search.md","filePath":"api/search.md"}'),c={name:"api/search.md"};function d(h,e,p,m,f,x){const s=i("OAOperation");return n(),o("div",null,[e[0]||(e[0]=a("h1",{id:"search-api",tabindex:"-1"},[r("Search API "),a("a",{class:"header-anchor",href:"#search-api","aria-label":'Permalink to "Search API"'},"")],-1)),e[1]||(e[1]=a("p",null,"Full-text search over indexed archived emails, powered by Meilisearch.",-1)),e[2]||(e[2]=a("h2",{id:"search-emails",tabindex:"-1"},[r("Search Emails "),a("a",{class:"header-anchor",href:"#search-emails","aria-label":'Permalink to "Search Emails"'},"")],-1)),l(s,{operationId:"searchEmails"})])}const _=t(c,[["render",d]]);export{P as __pageData,_ as default};

View File

@@ -0,0 +1 @@
import{_ as t,C as i,c as o,o as n,j as a,G as l,a as r}from"./chunks/framework.DHqKNX4U.js";const P=JSON.parse('{"title":"Search API","description":"","frontmatter":{"aside":false},"headers":[],"relativePath":"api/search.md","filePath":"api/search.md"}'),c={name:"api/search.md"};function d(h,e,p,m,f,x){const s=i("OAOperation");return n(),o("div",null,[e[0]||(e[0]=a("h1",{id:"search-api",tabindex:"-1"},[r("Search API "),a("a",{class:"header-anchor",href:"#search-api","aria-label":'Permalink to "Search API"'},"")],-1)),e[1]||(e[1]=a("p",null,"Full-text search over indexed archived emails, powered by Meilisearch.",-1)),e[2]||(e[2]=a("h2",{id:"search-emails",tabindex:"-1"},[r("Search Emails "),a("a",{class:"header-anchor",href:"#search-emails","aria-label":'Permalink to "Search Emails"'},"")],-1)),l(s,{operationId:"searchEmails"})])}const _=t(c,[["render",d]]);export{P as __pageData,_ as default};

View File

@@ -0,0 +1 @@
import{_ as i,C as o,c as r,o as d,j as e,G as n,a as s}from"./chunks/framework.DHqKNX4U.js";const y=JSON.parse('{"title":"Settings API","description":"","frontmatter":{"aside":false},"headers":[],"relativePath":"api/settings.md","filePath":"api/settings.md"}'),p={name:"api/settings.md"};function l(m,t,g,u,S,c){const a=o("OAOperation");return d(),r("div",null,[t[0]||(t[0]=e("h1",{id:"settings-api",tabindex:"-1"},[s("Settings API "),e("a",{class:"header-anchor",href:"#settings-api","aria-label":'Permalink to "Settings API"'},"")],-1)),t[1]||(t[1]=e("p",null,[s("Read and update system-wide configuration. The "),e("code",null,"GET"),s(" endpoint is public. The "),e("code",null,"PUT"),s(" endpoint requires "),e("code",null,"manage:settings"),s(" permission.")],-1)),t[2]||(t[2]=e("h2",{id:"get-system-settings",tabindex:"-1"},[s("Get System Settings "),e("a",{class:"header-anchor",href:"#get-system-settings","aria-label":'Permalink to "Get System Settings"'},"")],-1)),n(a,{operationId:"getSystemSettings"}),t[3]||(t[3]=e("h2",{id:"update-system-settings",tabindex:"-1"},[s("Update System Settings "),e("a",{class:"header-anchor",href:"#update-system-settings","aria-label":'Permalink to "Update System Settings"'},"")],-1)),n(a,{operationId:"updateSystemSettings"})])}const h=i(p,[["render",l]]);export{y as __pageData,h as default};

View File

@@ -0,0 +1 @@
import{_ as i,C as o,c as r,o as d,j as e,G as n,a as s}from"./chunks/framework.DHqKNX4U.js";const y=JSON.parse('{"title":"Settings API","description":"","frontmatter":{"aside":false},"headers":[],"relativePath":"api/settings.md","filePath":"api/settings.md"}'),p={name:"api/settings.md"};function l(m,t,g,u,S,c){const a=o("OAOperation");return d(),r("div",null,[t[0]||(t[0]=e("h1",{id:"settings-api",tabindex:"-1"},[s("Settings API "),e("a",{class:"header-anchor",href:"#settings-api","aria-label":'Permalink to "Settings API"'},"")],-1)),t[1]||(t[1]=e("p",null,[s("Read and update system-wide configuration. The "),e("code",null,"GET"),s(" endpoint is public. The "),e("code",null,"PUT"),s(" endpoint requires "),e("code",null,"manage:settings"),s(" permission.")],-1)),t[2]||(t[2]=e("h2",{id:"get-system-settings",tabindex:"-1"},[s("Get System Settings "),e("a",{class:"header-anchor",href:"#get-system-settings","aria-label":'Permalink to "Get System Settings"'},"")],-1)),n(a,{operationId:"getSystemSettings"}),t[3]||(t[3]=e("h2",{id:"update-system-settings",tabindex:"-1"},[s("Update System Settings "),e("a",{class:"header-anchor",href:"#update-system-settings","aria-label":'Permalink to "Update System Settings"'},"")],-1)),n(a,{operationId:"updateSystemSettings"})])}const h=i(p,[["render",l]]);export{y as __pageData,h as default};

View File

@@ -0,0 +1 @@
import{_ as t,C as s,c as n,o as i,j as a,G as l,a as o}from"./chunks/framework.DHqKNX4U.js";const P=JSON.parse('{"title":"Storage API","description":"","frontmatter":{"aside":false},"headers":[],"relativePath":"api/storage.md","filePath":"api/storage.md"}'),d={name:"api/storage.md"};function p(c,e,f,m,g,u){const r=s("OAOperation");return i(),n("div",null,[e[0]||(e[0]=a("h1",{id:"storage-api",tabindex:"-1"},[o("Storage API "),a("a",{class:"header-anchor",href:"#storage-api","aria-label":'Permalink to "Storage API"'},"")],-1)),e[1]||(e[1]=a("p",null,[o("Download files from the configured storage backend (local filesystem or S3-compatible). Requires "),a("code",null,"read:archive"),o(" permission.")],-1)),e[2]||(e[2]=a("h2",{id:"download-a-file",tabindex:"-1"},[o("Download a File "),a("a",{class:"header-anchor",href:"#download-a-file","aria-label":'Permalink to "Download a File"'},"")],-1)),l(r,{operationId:"downloadFile"})])}const _=t(d,[["render",p]]);export{P as __pageData,_ as default};

View File

@@ -0,0 +1 @@
import{_ as t,C as s,c as n,o as i,j as a,G as l,a as o}from"./chunks/framework.DHqKNX4U.js";const P=JSON.parse('{"title":"Storage API","description":"","frontmatter":{"aside":false},"headers":[],"relativePath":"api/storage.md","filePath":"api/storage.md"}'),d={name:"api/storage.md"};function p(c,e,f,m,g,u){const r=s("OAOperation");return i(),n("div",null,[e[0]||(e[0]=a("h1",{id:"storage-api",tabindex:"-1"},[o("Storage API "),a("a",{class:"header-anchor",href:"#storage-api","aria-label":'Permalink to "Storage API"'},"")],-1)),e[1]||(e[1]=a("p",null,[o("Download files from the configured storage backend (local filesystem or S3-compatible). Requires "),a("code",null,"read:archive"),o(" permission.")],-1)),e[2]||(e[2]=a("h2",{id:"download-a-file",tabindex:"-1"},[o("Download a File "),a("a",{class:"header-anchor",href:"#download-a-file","aria-label":'Permalink to "Download a File"'},"")],-1)),l(r,{operationId:"downloadFile"})])}const _=t(d,[["render",p]]);export{P as __pageData,_ as default};

View File

@@ -1 +0,0 @@
import{_ as t,c as a,o as r,ag as o}from"./chunks/framework.S-Qvb3wi.js";const g=JSON.parse('{"title":"Storage Service API","description":"","frontmatter":{},"headers":[],"relativePath":"api/storage.md","filePath":"api/storage.md"}'),i={name:"api/storage.md"};function s(n,e,l,d,h,p){return r(),a("div",null,e[0]||(e[0]=[o('<h1 id="storage-service-api" tabindex="-1">Storage Service API <a class="header-anchor" href="#storage-service-api" aria-label="Permalink to &quot;Storage Service API&quot;"></a></h1><p>The Storage Service provides an endpoint for downloading files from the configured storage provider.</p><h2 id="endpoints" tabindex="-1">Endpoints <a class="header-anchor" href="#endpoints" aria-label="Permalink to &quot;Endpoints&quot;"></a></h2><p>All endpoints in this service require authentication.</p><h3 id="get-api-v1-storage-download" tabindex="-1">GET /api/v1/storage/download <a class="header-anchor" href="#get-api-v1-storage-download" aria-label="Permalink to &quot;GET /api/v1/storage/download&quot;"></a></h3><p>Downloads a file from the storage.</p><p><strong>Access:</strong> Authenticated</p><h4 id="query-parameters" tabindex="-1">Query Parameters <a class="header-anchor" href="#query-parameters" aria-label="Permalink to &quot;Query Parameters&quot;"></a></h4><table tabindex="0"><thead><tr><th style="text-align:left;">Parameter</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>path</code></td><td style="text-align:left;">string</td><td style="text-align:left;">The path to the file within the storage provider.</td></tr></tbody></table><h4 id="responses" tabindex="-1">Responses <a class="header-anchor" href="#responses" aria-label="Permalink to &quot;Responses&quot;"></a></h4><ul><li><strong>200 OK:</strong> The file stream.</li><li><strong>400 Bad Request:</strong> File path is required or invalid.</li><li><strong>404 Not Found:</strong> File not found.</li><li><strong>500 Internal Server Error:</strong> An unexpected error occurred.</li></ul>',11)]))}const u=t(i,[["render",s]]);export{g as __pageData,u as default};

View File

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

View File

@@ -0,0 +1 @@
import{_ as t,C as d,c as r,o as i,j as e,G as n,a as o}from"./chunks/framework.DHqKNX4U.js";const b=JSON.parse('{"title":"Upload API","description":"","frontmatter":{"aside":false},"headers":[],"relativePath":"api/upload.md","filePath":"api/upload.md"}'),p={name:"api/upload.md"};function s(u,a,c,f,m,h){const l=d("OAOperation");return i(),r("div",null,[a[0]||(a[0]=e("h1",{id:"upload-api",tabindex:"-1"},[o("Upload API "),e("a",{class:"header-anchor",href:"#upload-api","aria-label":'Permalink to "Upload API"'},"")],-1)),a[1]||(a[1]=e("p",null,[o("Upload files (PST, EML, MBOX) to temporary storage before creating a file-based ingestion source. The returned "),e("code",null,"filePath"),o(" should be passed as "),e("code",null,"uploadedFilePath"),o(" in the ingestion source "),e("code",null,"providerConfig"),o(".")],-1)),a[2]||(a[2]=e("h2",{id:"upload-a-file",tabindex:"-1"},[o("Upload a File "),e("a",{class:"header-anchor",href:"#upload-a-file","aria-label":'Permalink to "Upload a File"'},"")],-1)),n(l,{operationId:"uploadFile"})])}const _=t(p,[["render",s]]);export{b as __pageData,_ as default};

View File

@@ -0,0 +1 @@
import{_ as t,C as d,c as r,o as i,j as e,G as n,a as o}from"./chunks/framework.DHqKNX4U.js";const b=JSON.parse('{"title":"Upload API","description":"","frontmatter":{"aside":false},"headers":[],"relativePath":"api/upload.md","filePath":"api/upload.md"}'),p={name:"api/upload.md"};function s(u,a,c,f,m,h){const l=d("OAOperation");return i(),r("div",null,[a[0]||(a[0]=e("h1",{id:"upload-api",tabindex:"-1"},[o("Upload API "),e("a",{class:"header-anchor",href:"#upload-api","aria-label":'Permalink to "Upload API"'},"")],-1)),a[1]||(a[1]=e("p",null,[o("Upload files (PST, EML, MBOX) to temporary storage before creating a file-based ingestion source. The returned "),e("code",null,"filePath"),o(" should be passed as "),e("code",null,"uploadedFilePath"),o(" in the ingestion source "),e("code",null,"providerConfig"),o(".")],-1)),a[2]||(a[2]=e("h2",{id:"upload-a-file",tabindex:"-1"},[o("Upload a File "),e("a",{class:"header-anchor",href:"#upload-a-file","aria-label":'Permalink to "Upload a File"'},"")],-1)),n(l,{operationId:"uploadFile"})])}const _=t(p,[["render",s]]);export{b as __pageData,_ as default};

View File

@@ -0,0 +1 @@
import{_ as i,C as o,c as l,o as d,j as r,G as t,a}from"./chunks/framework.DHqKNX4U.js";const b=JSON.parse('{"title":"Users API","description":"","frontmatter":{"aside":false},"headers":[],"relativePath":"api/users.md","filePath":"api/users.md"}'),n={name:"api/users.md"};function p(u,e,f,U,m,P){const s=o("OAOperation");return d(),l("div",null,[e[0]||(e[0]=r("h1",{id:"users-api",tabindex:"-1"},[a("Users API "),r("a",{class:"header-anchor",href:"#users-api","aria-label":'Permalink to "Users API"'},"")],-1)),e[1]||(e[1]=r("p",null,[a("Manage user accounts. Creating, updating, and deleting users requires Super Admin ("),r("code",null,"manage:all"),a(") permission.")],-1)),e[2]||(e[2]=r("h2",{id:"list-all-users",tabindex:"-1"},[a("List All Users "),r("a",{class:"header-anchor",href:"#list-all-users","aria-label":'Permalink to "List All Users"'},"")],-1)),t(s,{operationId:"getUsers"}),e[3]||(e[3]=r("h2",{id:"create-a-user",tabindex:"-1"},[a("Create a User "),r("a",{class:"header-anchor",href:"#create-a-user","aria-label":'Permalink to "Create a User"'},"")],-1)),t(s,{operationId:"createUser"}),e[4]||(e[4]=r("h2",{id:"get-a-user",tabindex:"-1"},[a("Get a User "),r("a",{class:"header-anchor",href:"#get-a-user","aria-label":'Permalink to "Get a User"'},"")],-1)),t(s,{operationId:"getUser"}),e[5]||(e[5]=r("h2",{id:"update-a-user",tabindex:"-1"},[a("Update a User "),r("a",{class:"header-anchor",href:"#update-a-user","aria-label":'Permalink to "Update a User"'},"")],-1)),t(s,{operationId:"updateUser"}),e[6]||(e[6]=r("h2",{id:"delete-a-user",tabindex:"-1"},[a("Delete a User "),r("a",{class:"header-anchor",href:"#delete-a-user","aria-label":'Permalink to "Delete a User"'},"")],-1)),t(s,{operationId:"deleteUser"}),e[7]||(e[7]=r("h2",{id:"get-current-user-profile",tabindex:"-1"},[a("Get Current User Profile "),r("a",{class:"header-anchor",href:"#get-current-user-profile","aria-label":'Permalink to "Get Current User Profile"'},"")],-1)),t(s,{operationId:"getProfile"}),e[8]||(e[8]=r("h2",{id:"update-current-user-profile",tabindex:"-1"},[a("Update Current User Profile "),r("a",{class:"header-anchor",href:"#update-current-user-profile","aria-label":'Permalink to "Update Current User Profile"'},"")],-1)),t(s,{operationId:"updateProfile"}),e[9]||(e[9]=r("h2",{id:"update-password",tabindex:"-1"},[a("Update Password "),r("a",{class:"header-anchor",href:"#update-password","aria-label":'Permalink to "Update Password"'},"")],-1)),t(s,{operationId:"updatePassword"})])}const g=i(n,[["render",p]]);export{b as __pageData,g as default};

View File

@@ -0,0 +1 @@
import{_ as i,C as o,c as l,o as d,j as r,G as t,a}from"./chunks/framework.DHqKNX4U.js";const b=JSON.parse('{"title":"Users API","description":"","frontmatter":{"aside":false},"headers":[],"relativePath":"api/users.md","filePath":"api/users.md"}'),n={name:"api/users.md"};function p(u,e,f,U,m,P){const s=o("OAOperation");return d(),l("div",null,[e[0]||(e[0]=r("h1",{id:"users-api",tabindex:"-1"},[a("Users API "),r("a",{class:"header-anchor",href:"#users-api","aria-label":'Permalink to "Users API"'},"")],-1)),e[1]||(e[1]=r("p",null,[a("Manage user accounts. Creating, updating, and deleting users requires Super Admin ("),r("code",null,"manage:all"),a(") permission.")],-1)),e[2]||(e[2]=r("h2",{id:"list-all-users",tabindex:"-1"},[a("List All Users "),r("a",{class:"header-anchor",href:"#list-all-users","aria-label":'Permalink to "List All Users"'},"")],-1)),t(s,{operationId:"getUsers"}),e[3]||(e[3]=r("h2",{id:"create-a-user",tabindex:"-1"},[a("Create a User "),r("a",{class:"header-anchor",href:"#create-a-user","aria-label":'Permalink to "Create a User"'},"")],-1)),t(s,{operationId:"createUser"}),e[4]||(e[4]=r("h2",{id:"get-a-user",tabindex:"-1"},[a("Get a User "),r("a",{class:"header-anchor",href:"#get-a-user","aria-label":'Permalink to "Get a User"'},"")],-1)),t(s,{operationId:"getUser"}),e[5]||(e[5]=r("h2",{id:"update-a-user",tabindex:"-1"},[a("Update a User "),r("a",{class:"header-anchor",href:"#update-a-user","aria-label":'Permalink to "Update a User"'},"")],-1)),t(s,{operationId:"updateUser"}),e[6]||(e[6]=r("h2",{id:"delete-a-user",tabindex:"-1"},[a("Delete a User "),r("a",{class:"header-anchor",href:"#delete-a-user","aria-label":'Permalink to "Delete a User"'},"")],-1)),t(s,{operationId:"deleteUser"}),e[7]||(e[7]=r("h2",{id:"get-current-user-profile",tabindex:"-1"},[a("Get Current User Profile "),r("a",{class:"header-anchor",href:"#get-current-user-profile","aria-label":'Permalink to "Get Current User Profile"'},"")],-1)),t(s,{operationId:"getProfile"}),e[8]||(e[8]=r("h2",{id:"update-current-user-profile",tabindex:"-1"},[a("Update Current User Profile "),r("a",{class:"header-anchor",href:"#update-current-user-profile","aria-label":'Permalink to "Update Current User Profile"'},"")],-1)),t(s,{operationId:"updateProfile"}),e[9]||(e[9]=r("h2",{id:"update-password",tabindex:"-1"},[a("Update Password "),r("a",{class:"header-anchor",href:"#update-password","aria-label":'Permalink to "Update Password"'},"")],-1)),t(s,{operationId:"updatePassword"})])}const g=i(n,[["render",p]]);export{b as __pageData,g as default};

View File

@@ -1 +1 @@
import{t as p}from"./chunks/theme.Bkbn0jhI.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{R as p}from"./chunks/theme.W2NStNbJ.js";import{R as s,ay as i,az as u,aA as c,aB as l,aC as f,aD as d,aE as m,aF as h,aG as A,aH as g,d as v,u as y,v as C,s as R,aI as w,aJ as P,aK as E,ah as b}from"./chunks/framework.DHqKNX4U.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(()=>{R(()=>{document.documentElement.lang=a.value,document.documentElement.dir=t.value})}),e.value.router.prefetchLinks&&w(),P(),E(),n.setup&&n.setup(),()=>b(n.Layout)}});async function T(){globalThis.__VITEPRESS__=!0;const e=F(),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 g(S)}function F(){let e=s;return h(a=>{let t=A(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

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

View File

@@ -0,0 +1 @@
const e=Object.freeze(JSON.parse(`{"displayName":"Berry","name":"berry","patterns":[{"include":"#controls"},{"include":"#strings"},{"include":"#comment-block"},{"include":"#comments"},{"include":"#keywords"},{"include":"#function"},{"include":"#member"},{"include":"#identifier"},{"include":"#number"},{"include":"#operator"}],"repository":{"comment-block":{"begin":"#-","end":"-#","name":"comment.berry","patterns":[{}]},"comments":{"begin":"#","end":"\\\\n","name":"comment.line.berry","patterns":[{}]},"controls":{"patterns":[{"match":"\\\\b(if|elif|else|for|while|do|end|break|continue|return|try|except|raise)\\\\b","name":"keyword.control.berry"}]},"function":{"patterns":[{"match":"\\\\b([A-Z_a-z][0-9A-Z_a-z]*(?=\\\\s*\\\\())","name":"entity.name.function.berry"}]},"identifier":{"patterns":[{"match":"\\\\b[A-Z_a-z]\\\\w+\\\\b","name":"identifier.berry"}]},"keywords":{"patterns":[{"match":"\\\\b(var|static|def|class|true|false|nil|self|super|import|as|_class)\\\\b","name":"keyword.berry"}]},"member":{"patterns":[{"captures":{"0":{"name":"entity.other.attribute-name.berry"}},"match":"\\\\.([A-Z_a-z][0-9A-Z_a-z]*)"}]},"number":{"patterns":[{"match":"0x\\\\h+|\\\\d+|(\\\\d+\\\\.?|\\\\.\\\\d)\\\\d*([Ee][-+]?\\\\d+)?","name":"constant.numeric.berry"}]},"operator":{"patterns":[{"match":"[-\\\\]!%\\\\&(-+./:<=>\\\\[^|~]","name":"keyword.operator.berry"}]},"strings":{"patterns":[{"begin":"f(?=[\\"'])","patterns":[{"begin":"\\"","end":"\\"","name":"string.quoted.other.berry","patterns":[{"match":"(\\\\\\\\x\\\\h{2})|(\\\\\\\\[0-7]{3})|(\\\\\\\\\\\\\\\\)|(\\\\\\\\\\")|(\\\\\\\\')|(\\\\\\\\a)|(\\\\\\\\b)|(\\\\\\\\f)|(\\\\\\\\n)|(\\\\\\\\r)|(\\\\\\\\t)|(\\\\\\\\v)","name":"constant.character.escape.berry"},{"match":"\\\\{\\\\{[^}]*}}","name":"string.quoted.other.berry"},{"begin":"\\\\{","end":"}","name":"keyword.other.unit.berry","patterns":[{"include":"#keywords"},{"include":"#numbers"},{"include":"#identifier"},{"include":"#operator"},{"include":"#member"},{"include":"#function"}]}]},{"begin":"'","end":"'","name":"string.quoted.other.berry","patterns":[{"match":"(\\\\\\\\x\\\\h{2})|(\\\\\\\\[0-7]{3})|(\\\\\\\\\\\\\\\\)|(\\\\\\\\\\")|(\\\\\\\\')|(\\\\\\\\a)|(\\\\\\\\b)|(\\\\\\\\f)|(\\\\\\\\n)|(\\\\\\\\r)|(\\\\\\\\t)|(\\\\\\\\v)","name":"constant.character.escape.berry"},{"match":"\\\\{\\\\{[^}]*}}","name":"string.quoted.other.berry"},{"begin":"\\\\{","end":"}","name":"keyword.other.unit.berry","patterns":[{"include":"#keywords"},{"include":"#numbers"},{"include":"#identifier"},{"include":"#operator"},{"include":"#member"},{"include":"#function"}]}]}],"while":"\\\\G|^[\\\\t ]*(?=[\\"'])"},{"begin":"([\\"'])","end":"\\\\1","name":"string.quoted.double.berry","patterns":[{"match":"(\\\\\\\\x\\\\h{2})|(\\\\\\\\[0-7]{3})|(\\\\\\\\\\\\\\\\)|(\\\\\\\\\\")|(\\\\\\\\')|(\\\\\\\\a)|(\\\\\\\\b)|(\\\\\\\\f)|(\\\\\\\\n)|(\\\\\\\\r)|(\\\\\\\\t)|(\\\\\\\\v)","name":"constant.character.escape.berry"}]}]}},"scopeName":"source.berry","aliases":["be"]}`)),r=[e];export{r as default};

View File

@@ -0,0 +1 @@
const e=Object.freeze(JSON.parse('{"displayName":"BibTeX","name":"bibtex","patterns":[{"captures":{"0":{"name":"punctuation.definition.comment.bibtex"}},"match":"@(?i:comment)(?=[({\\\\s])","name":"comment.block.at-sign.bibtex"},{"include":"#preamble"},{"include":"#string"},{"include":"#entry"},{"begin":"[^\\\\n@]","end":"(?=@)","name":"comment.block.bibtex"}],"repository":{"entry":{"patterns":[{"begin":"((@)[-!$\\\\&*+./:;<>-z|~][!$\\\\&*+\\\\--<>-z|~]*)\\\\s*(\\\\{)\\\\s*([^,}\\\\s]*)","beginCaptures":{"1":{"name":"keyword.other.entry-type.bibtex"},"2":{"name":"punctuation.definition.keyword.bibtex"},"3":{"name":"punctuation.section.entry.begin.bibtex"},"4":{"name":"entity.name.type.entry-key.bibtex"}},"end":"}","endCaptures":{"0":{"name":"punctuation.section.entry.end.bibtex"}},"name":"meta.entry.braces.bibtex","patterns":[{"begin":"([-!$\\\\&*+./:;<>-z|~][!$\\\\&*+\\\\--<>-z|~]*)\\\\s*(=)","beginCaptures":{"1":{"name":"support.function.key.bibtex"},"2":{"name":"punctuation.separator.key-value.bibtex"}},"end":"(?=[,}])","name":"meta.key-assignment.bibtex","patterns":[{"include":"#field_value"}]}]},{"begin":"((@)[-!$\\\\&*+./:;<>-z|~][!$\\\\&*+\\\\--<>-z|~]*)\\\\s*(\\\\()\\\\s*([^,\\\\s]*)","beginCaptures":{"1":{"name":"keyword.other.entry-type.bibtex"},"2":{"name":"punctuation.definition.keyword.bibtex"},"3":{"name":"punctuation.section.entry.begin.bibtex"},"4":{"name":"entity.name.type.entry-key.bibtex"}},"end":"\\\\)","endCaptures":{"0":{"name":"punctuation.section.entry.end.bibtex"}},"name":"meta.entry.parenthesis.bibtex","patterns":[{"begin":"([-!$\\\\&*+./:;<>-z|~][!$\\\\&*+\\\\--<>-z|~]*)\\\\s*(=)","beginCaptures":{"1":{"name":"support.function.key.bibtex"},"2":{"name":"punctuation.separator.key-value.bibtex"}},"end":"(?=[),])","name":"meta.key-assignment.bibtex","patterns":[{"include":"#field_value"}]}]}]},"field_value":{"patterns":[{"include":"#string_content"},{"include":"#integer"},{"include":"#string_var"},{"match":"#","name":"keyword.operator.bibtex"}]},"integer":{"captures":{"1":{"name":"constant.numeric.bibtex"}},"match":"\\\\s*(\\\\d+)\\\\s*"},"nested_braces":{"begin":"\\\\{","beginCaptures":{"0":{"name":"punctuation.definition.group.begin.bibtex"}},"end":"}","endCaptures":{"0":{"name":"punctuation.definition.group.end.bibtex"}},"patterns":[{"include":"#nested_braces"}]},"preamble":{"patterns":[{"begin":"((@)(?i:preamble))\\\\s*(\\\\{)\\\\s*","beginCaptures":{"1":{"name":"keyword.other.preamble.bibtex"},"2":{"name":"punctuation.definition.keyword.bibtex"},"3":{"name":"punctuation.section.preamble.begin.bibtex"}},"end":"}","endCaptures":{"0":{"name":"punctuation.section.preamble.end.bibtex"}},"name":"meta.preamble.braces.bibtex","patterns":[{"include":"#field_value"}]},{"begin":"((@)(?i:preamble))\\\\s*(\\\\()\\\\s*","beginCaptures":{"1":{"name":"keyword.other.preamble.bibtex"},"2":{"name":"punctuation.definition.keyword.bibtex"},"3":{"name":"punctuation.section.preamble.begin.bibtex"}},"end":"\\\\)","endCaptures":{"0":{"name":"punctuation.section.preamble.end.bibtex"}},"name":"meta.preamble.parenthesis.bibtex","patterns":[{"include":"#field_value"}]}]},"string":{"patterns":[{"begin":"((@)(?i:string))\\\\s*(\\\\{)\\\\s*([-!$\\\\&*+./:;<>-z|~][!$\\\\&*+\\\\--<>-z|~]*)","beginCaptures":{"1":{"name":"keyword.other.string-constant.bibtex"},"2":{"name":"punctuation.definition.keyword.bibtex"},"3":{"name":"punctuation.section.string-constant.begin.bibtex"},"4":{"name":"variable.other.bibtex"}},"end":"}","endCaptures":{"0":{"name":"punctuation.section.string-constant.end.bibtex"}},"name":"meta.string-constant.braces.bibtex","patterns":[{"include":"#field_value"}]},{"begin":"((@)(?i:string))\\\\s*(\\\\()\\\\s*([-!$\\\\&*+./:;<>-z|~][!$\\\\&*+\\\\--<>-z|~]*)","beginCaptures":{"1":{"name":"keyword.other.string-constant.bibtex"},"2":{"name":"punctuation.definition.keyword.bibtex"},"3":{"name":"punctuation.section.string-constant.begin.bibtex"},"4":{"name":"variable.other.bibtex"}},"end":"\\\\)","endCaptures":{"0":{"name":"punctuation.section.string-constant.end.bibtex"}},"name":"meta.string-constant.parenthesis.bibtex","patterns":[{"include":"#field_value"}]}]},"string_content":{"patterns":[{"begin":"\\\\{","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.bibtex"}},"end":"}","endCaptures":{"0":{"name":"punctuation.definition.string.end.bibtex"}},"patterns":[{"include":"#nested_braces"}]},{"begin":"\\"","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.bibtex"}},"end":"\\"","endCaptures":{"0":{"name":"punctuation.definition.string.end.bibtex"}},"patterns":[{"include":"#nested_braces"}]}]},"string_var":{"captures":{"0":{"name":"support.variable.bibtex"}},"match":"[-!$\\\\&*+./:;<>-z|~][!$\\\\&*+\\\\--<>-z|~]*"}},"scopeName":"text.bibtex"}')),n=[e];export{n 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

Some files were not shown because too many files have changed in this diff Show More