@sentroy-co/client-sdk 1.1.1 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +82 -1
- package/dist/http.d.ts +15 -0
- package/dist/http.d.ts.map +1 -1
- package/dist/http.js +48 -0
- package/dist/http.js.map +1 -1
- package/dist/index.d.ts +13 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +28 -8
- package/dist/index.js.map +1 -1
- package/dist/resources/buckets.d.ts +27 -0
- package/dist/resources/buckets.d.ts.map +1 -0
- package/dist/resources/buckets.js +40 -0
- package/dist/resources/buckets.js.map +1 -0
- package/dist/resources/media.d.ts +52 -0
- package/dist/resources/media.d.ts.map +1 -0
- package/dist/resources/media.js +88 -0
- package/dist/resources/media.js.map +1 -0
- package/dist/resources/storage.d.ts +23 -0
- package/dist/resources/storage.d.ts.map +1 -0
- package/dist/resources/storage.js +31 -0
- package/dist/resources/storage.js.map +1 -0
- package/dist/types.d.ts +134 -2
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
<p align="center">
|
|
8
8
|
Server-side SDK to interact with the Sentroy platform API.<br />
|
|
9
|
-
|
|
9
|
+
Manage mail (domains, mailboxes, templates, inbox, send) and storage (buckets, media) from a single entry point.
|
|
10
10
|
</p>
|
|
11
11
|
|
|
12
12
|
<p align="center">
|
|
@@ -174,6 +174,79 @@ const result = await sentroy.send.email({
|
|
|
174
174
|
})
|
|
175
175
|
```
|
|
176
176
|
|
|
177
|
+
### Buckets
|
|
178
|
+
|
|
179
|
+
Storage is organized into **buckets** — isolated containers with their own
|
|
180
|
+
visibility (public vs private) and usage counters.
|
|
181
|
+
|
|
182
|
+
```ts
|
|
183
|
+
// List all buckets in the company
|
|
184
|
+
const buckets = await sentroy.buckets.list()
|
|
185
|
+
|
|
186
|
+
// Get a single bucket by its slug
|
|
187
|
+
const bucket = await sentroy.buckets.get("product-assets")
|
|
188
|
+
|
|
189
|
+
// Create a bucket (slug auto-derived from name if omitted)
|
|
190
|
+
const created = await sentroy.buckets.create({
|
|
191
|
+
name: "User Uploads",
|
|
192
|
+
description: "Avatars and profile media",
|
|
193
|
+
isPublic: false,
|
|
194
|
+
})
|
|
195
|
+
|
|
196
|
+
// Update a bucket — toggling isPublic cascades to every file's ACL
|
|
197
|
+
await sentroy.buckets.update("product-assets", { isPublic: true })
|
|
198
|
+
|
|
199
|
+
// Delete a bucket (409 if it has files; use force to purge everything)
|
|
200
|
+
await sentroy.buckets.delete("product-assets", { force: true })
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
### Media
|
|
204
|
+
|
|
205
|
+
Upload, list, download, and delete files inside a bucket. The same token
|
|
206
|
+
that authorizes mail calls also authorizes storage calls.
|
|
207
|
+
|
|
208
|
+
```ts
|
|
209
|
+
// List files in a bucket
|
|
210
|
+
const { items, total } = await sentroy.media.list("product-assets", {
|
|
211
|
+
type: "image",
|
|
212
|
+
limit: 50,
|
|
213
|
+
})
|
|
214
|
+
|
|
215
|
+
// Get a single media record
|
|
216
|
+
const media = await sentroy.media.get("product-assets", mediaId)
|
|
217
|
+
|
|
218
|
+
// Upload — browser (File from <input>)
|
|
219
|
+
const input = document.querySelector<HTMLInputElement>("input[type=file]")!
|
|
220
|
+
const file = input.files![0]
|
|
221
|
+
const uploaded = await sentroy.media.upload("product-assets", {
|
|
222
|
+
body: file,
|
|
223
|
+
folder: "products",
|
|
224
|
+
tags: ["v1", "cover"],
|
|
225
|
+
})
|
|
226
|
+
console.log(uploaded.url) // Public URL from the CDN
|
|
227
|
+
|
|
228
|
+
// Upload — Node.js (Blob from fs)
|
|
229
|
+
import { openAsBlob } from "node:fs"
|
|
230
|
+
const blob = await openAsBlob("./photo.jpg")
|
|
231
|
+
const uploaded = await sentroy.media.upload("product-assets", {
|
|
232
|
+
body: blob,
|
|
233
|
+
filename: "photo.jpg",
|
|
234
|
+
isPublic: true,
|
|
235
|
+
})
|
|
236
|
+
|
|
237
|
+
// Download — streams from the storage backend; works for both public
|
|
238
|
+
// and private buckets (auth-gated for private).
|
|
239
|
+
const blob = await sentroy.media.download("product-assets", mediaId)
|
|
240
|
+
// Variant: ask for a pre-generated thumbnail width (falls back to
|
|
241
|
+
// original if that size wasn't generated for this file).
|
|
242
|
+
const thumb = await sentroy.media.download("product-assets", mediaId, {
|
|
243
|
+
quality: 500,
|
|
244
|
+
})
|
|
245
|
+
|
|
246
|
+
// Delete — removes S3 objects (original + thumbnails) + Media record
|
|
247
|
+
await sentroy.media.delete("product-assets", mediaId)
|
|
248
|
+
```
|
|
249
|
+
|
|
177
250
|
## Error Handling
|
|
178
251
|
|
|
179
252
|
```ts
|
|
@@ -203,6 +276,14 @@ try {
|
|
|
203
276
|
- Node.js 18+ (uses native `fetch`)
|
|
204
277
|
- Server-side only
|
|
205
278
|
|
|
279
|
+
## Raw Documentation
|
|
280
|
+
|
|
281
|
+
For AI agents and LLMs — plain-text version of this document:
|
|
282
|
+
|
|
283
|
+
```
|
|
284
|
+
https://raw.githubusercontent.com/Sentroy-Co/client-sdk/refs/heads/main/typescript/README.md
|
|
285
|
+
```
|
|
286
|
+
|
|
206
287
|
## License
|
|
207
288
|
|
|
208
289
|
[MIT](LICENSE)
|
package/dist/http.d.ts
CHANGED
|
@@ -9,10 +9,25 @@ export declare class HttpClient {
|
|
|
9
9
|
private timeout;
|
|
10
10
|
constructor(baseUrl: string, token: string, timeout?: number);
|
|
11
11
|
private buildUrl;
|
|
12
|
+
/**
|
|
13
|
+
* Raw fetch — JSON parse etmez, Response döner. Binary endpoint'ler
|
|
14
|
+
* (media download) için kullanılır. Authorization header eklenir.
|
|
15
|
+
*/
|
|
16
|
+
fetchRaw(path: string, init?: {
|
|
17
|
+
method?: string;
|
|
18
|
+
query?: Record<string, unknown>;
|
|
19
|
+
}): Promise<Response>;
|
|
12
20
|
private request;
|
|
13
21
|
get<T>(path: string, query?: Record<string, unknown>): Promise<T>;
|
|
14
22
|
post<T>(path: string, body?: unknown): Promise<T>;
|
|
15
23
|
put<T>(path: string, body?: unknown): Promise<T>;
|
|
24
|
+
patch<T>(path: string, body?: unknown): Promise<T>;
|
|
16
25
|
del<T>(path: string, query?: Record<string, unknown>): Promise<T>;
|
|
26
|
+
/**
|
|
27
|
+
* Multipart upload. Body is a FormData; we deliberately do not set
|
|
28
|
+
* Content-Type so the runtime (browser or Node undici) writes the
|
|
29
|
+
* correct `multipart/form-data; boundary=...` header.
|
|
30
|
+
*/
|
|
31
|
+
postForm<T>(path: string, form: FormData): Promise<T>;
|
|
17
32
|
}
|
|
18
33
|
//# sourceMappingURL=http.d.ts.map
|
package/dist/http.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAEA,qBAAa,YAAa,SAAQ,KAAK;aAEnB,UAAU,EAAE,MAAM;aAClB,IAAI,EAAE,OAAO;gBADb,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,OAAO,EAC7B,OAAO,CAAC,EAAE,MAAM;CAKnB;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,OAAO,CAAQ;gBAEX,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,SAAS;IAM5D,OAAO,CAAC,QAAQ;
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAEA,qBAAa,YAAa,SAAQ,KAAK;aAEnB,UAAU,EAAE,MAAM;aAClB,IAAI,EAAE,OAAO;gBADb,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,OAAO,EAC7B,OAAO,CAAC,EAAE,MAAM;CAKnB;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,OAAO,CAAQ;gBAEX,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,SAAS;IAM5D,OAAO,CAAC,QAAQ;IAYhB;;;OAGG;IACG,QAAQ,CACZ,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,GAC1D,OAAO,CAAC,QAAQ,CAAC;YAeN,OAAO;IA2Cf,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAIjE,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAIjD,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAIhD,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAIlD,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAIvE;;;;OAIG;IACG,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC;CAwB5D"}
|
package/dist/http.js
CHANGED
|
@@ -32,6 +32,25 @@ class HttpClient {
|
|
|
32
32
|
}
|
|
33
33
|
return url.toString();
|
|
34
34
|
}
|
|
35
|
+
/**
|
|
36
|
+
* Raw fetch — JSON parse etmez, Response döner. Binary endpoint'ler
|
|
37
|
+
* (media download) için kullanılır. Authorization header eklenir.
|
|
38
|
+
*/
|
|
39
|
+
async fetchRaw(path, init) {
|
|
40
|
+
const url = this.buildUrl(path, init?.query);
|
|
41
|
+
const controller = new AbortController();
|
|
42
|
+
const timer = setTimeout(() => controller.abort(), this.timeout);
|
|
43
|
+
try {
|
|
44
|
+
return await fetch(url, {
|
|
45
|
+
method: init?.method || "GET",
|
|
46
|
+
headers: { Authorization: `Bearer ${this.token}` },
|
|
47
|
+
signal: controller.signal,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
finally {
|
|
51
|
+
clearTimeout(timer);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
35
54
|
async request(method, path, options) {
|
|
36
55
|
const url = this.buildUrl(path, options?.query);
|
|
37
56
|
const controller = new AbortController();
|
|
@@ -68,9 +87,38 @@ class HttpClient {
|
|
|
68
87
|
async put(path, body) {
|
|
69
88
|
return this.request("PUT", path, { body });
|
|
70
89
|
}
|
|
90
|
+
async patch(path, body) {
|
|
91
|
+
return this.request("PATCH", path, { body });
|
|
92
|
+
}
|
|
71
93
|
async del(path, query) {
|
|
72
94
|
return this.request("DELETE", path, { query });
|
|
73
95
|
}
|
|
96
|
+
/**
|
|
97
|
+
* Multipart upload. Body is a FormData; we deliberately do not set
|
|
98
|
+
* Content-Type so the runtime (browser or Node undici) writes the
|
|
99
|
+
* correct `multipart/form-data; boundary=...` header.
|
|
100
|
+
*/
|
|
101
|
+
async postForm(path, form) {
|
|
102
|
+
const url = this.buildUrl(path);
|
|
103
|
+
const controller = new AbortController();
|
|
104
|
+
const timer = setTimeout(() => controller.abort(), this.timeout);
|
|
105
|
+
try {
|
|
106
|
+
const res = await fetch(url, {
|
|
107
|
+
method: "POST",
|
|
108
|
+
headers: { Authorization: `Bearer ${this.token}` },
|
|
109
|
+
body: form,
|
|
110
|
+
signal: controller.signal,
|
|
111
|
+
});
|
|
112
|
+
const json = (await res.json());
|
|
113
|
+
if (!res.ok) {
|
|
114
|
+
throw new SentroyError(res.status, json, json.error || `Upload failed with status ${res.status}`);
|
|
115
|
+
}
|
|
116
|
+
return json.data;
|
|
117
|
+
}
|
|
118
|
+
finally {
|
|
119
|
+
clearTimeout(timer);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
74
122
|
}
|
|
75
123
|
exports.HttpClient = HttpClient;
|
|
76
124
|
//# sourceMappingURL=http.js.map
|
package/dist/http.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,6 +3,9 @@ import { Mailboxes } from "./resources/mailboxes";
|
|
|
3
3
|
import { Templates } from "./resources/templates";
|
|
4
4
|
import { Inbox } from "./resources/inbox";
|
|
5
5
|
import { Send } from "./resources/send";
|
|
6
|
+
import { Buckets } from "./resources/buckets";
|
|
7
|
+
import { MediaResource } from "./resources/media";
|
|
8
|
+
import { Storage } from "./resources/storage";
|
|
6
9
|
import type { SentroyClientConfig } from "./types";
|
|
7
10
|
export declare class Sentroy {
|
|
8
11
|
readonly domains: Domains;
|
|
@@ -10,9 +13,17 @@ export declare class Sentroy {
|
|
|
10
13
|
readonly templates: Templates;
|
|
11
14
|
readonly inbox: Inbox;
|
|
12
15
|
readonly send: Send;
|
|
16
|
+
readonly buckets: Buckets;
|
|
17
|
+
readonly media: MediaResource;
|
|
18
|
+
readonly storage: Storage;
|
|
13
19
|
/**
|
|
14
20
|
* Create a new Sentroy client.
|
|
15
21
|
*
|
|
22
|
+
* Single `baseUrl` covers every resource: the platform gateway routes
|
|
23
|
+
* `/api/mail/companies/...` to the mail backend and
|
|
24
|
+
* `/api/storage/companies/...` to the storage backend. The same
|
|
25
|
+
* access token works across both.
|
|
26
|
+
*
|
|
16
27
|
* @example
|
|
17
28
|
* ```ts
|
|
18
29
|
* const sentroy = new Sentroy({
|
|
@@ -22,10 +33,11 @@ export declare class Sentroy {
|
|
|
22
33
|
* })
|
|
23
34
|
*
|
|
24
35
|
* const domains = await sentroy.domains.list()
|
|
36
|
+
* const buckets = await sentroy.buckets.list()
|
|
25
37
|
* ```
|
|
26
38
|
*/
|
|
27
39
|
constructor(config: SentroyClientConfig);
|
|
28
40
|
}
|
|
29
|
-
export type { SentroyClientConfig, ApiResponse, Domain, MailboxUser, Template, LocalizedString, MessageAddress, MessageSummary, MessageDetail, AttachmentInfo, Mailbox, InboxListParams, Attachment, SendParams, SendResult, } from "./types";
|
|
41
|
+
export type { SentroyClientConfig, ApiResponse, Domain, MailboxUser, Template, LocalizedString, MessageAddress, MessageSummary, MessageDetail, AttachmentInfo, Mailbox, InboxListParams, Attachment, SendParams, SendResult, Bucket, CreateBucketParams, UpdateBucketParams, Media, MediaType, MediaThumbnail, MediaImageMeta, MediaListParams, MediaListResult, UploadMediaParams, StorageQuota, StorageUsage, StorageUsageBucket, StorageUsageByType, } from "./types";
|
|
30
42
|
export { SentroyError } from "./http";
|
|
31
43
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACjD,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AACvC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAA;AAElD,qBAAa,OAAO;IAClB,SAAgB,OAAO,EAAE,OAAO,CAAA;IAChC,SAAgB,SAAS,EAAE,SAAS,CAAA;IACpC,SAAgB,SAAS,EAAE,SAAS,CAAA;IACpC,SAAgB,KAAK,EAAE,KAAK,CAAA;IAC5B,SAAgB,IAAI,EAAE,IAAI,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACjD,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAC7C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAA;AAElD,qBAAa,OAAO;IAClB,SAAgB,OAAO,EAAE,OAAO,CAAA;IAChC,SAAgB,SAAS,EAAE,SAAS,CAAA;IACpC,SAAgB,SAAS,EAAE,SAAS,CAAA;IACpC,SAAgB,KAAK,EAAE,KAAK,CAAA;IAC5B,SAAgB,IAAI,EAAE,IAAI,CAAA;IAC1B,SAAgB,OAAO,EAAE,OAAO,CAAA;IAChC,SAAgB,KAAK,EAAE,aAAa,CAAA;IACpC,SAAgB,OAAO,EAAE,OAAO,CAAA;IAEhC;;;;;;;;;;;;;;;;;;;OAmBG;gBACS,MAAM,EAAE,mBAAmB;CA6BxC;AAGD,YAAY,EACV,mBAAmB,EACnB,WAAW,EACX,MAAM,EACN,WAAW,EACX,QAAQ,EACR,eAAe,EACf,cAAc,EACd,cAAc,EACd,aAAa,EACb,cAAc,EACd,OAAO,EACP,eAAe,EACf,UAAU,EACV,UAAU,EACV,UAAU,EACV,MAAM,EACN,kBAAkB,EAClB,kBAAkB,EAClB,KAAK,EACL,SAAS,EACT,cAAc,EACd,cAAc,EACd,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,YAAY,EACZ,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,SAAS,CAAA;AAEhB,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -7,15 +7,26 @@ const mailboxes_1 = require("./resources/mailboxes");
|
|
|
7
7
|
const templates_1 = require("./resources/templates");
|
|
8
8
|
const inbox_1 = require("./resources/inbox");
|
|
9
9
|
const send_1 = require("./resources/send");
|
|
10
|
+
const buckets_1 = require("./resources/buckets");
|
|
11
|
+
const media_1 = require("./resources/media");
|
|
12
|
+
const storage_1 = require("./resources/storage");
|
|
10
13
|
class Sentroy {
|
|
11
14
|
domains;
|
|
12
15
|
mailboxes;
|
|
13
16
|
templates;
|
|
14
17
|
inbox;
|
|
15
18
|
send;
|
|
19
|
+
buckets;
|
|
20
|
+
media;
|
|
21
|
+
storage;
|
|
16
22
|
/**
|
|
17
23
|
* Create a new Sentroy client.
|
|
18
24
|
*
|
|
25
|
+
* Single `baseUrl` covers every resource: the platform gateway routes
|
|
26
|
+
* `/api/mail/companies/...` to the mail backend and
|
|
27
|
+
* `/api/storage/companies/...` to the storage backend. The same
|
|
28
|
+
* access token works across both.
|
|
29
|
+
*
|
|
19
30
|
* @example
|
|
20
31
|
* ```ts
|
|
21
32
|
* const sentroy = new Sentroy({
|
|
@@ -25,17 +36,26 @@ class Sentroy {
|
|
|
25
36
|
* })
|
|
26
37
|
*
|
|
27
38
|
* const domains = await sentroy.domains.list()
|
|
39
|
+
* const buckets = await sentroy.buckets.list()
|
|
28
40
|
* ```
|
|
29
41
|
*/
|
|
30
42
|
constructor(config) {
|
|
31
|
-
const
|
|
32
|
-
const
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
43
|
+
const root = config.baseUrl.replace(/\/+$/, "");
|
|
44
|
+
const slug = encodeURIComponent(config.companySlug);
|
|
45
|
+
// Mail resources hit the `/api/mail/companies` gateway path — core
|
|
46
|
+
// forwards to the mail subdomain. The SDK consumer never sees the
|
|
47
|
+
// subdomain split.
|
|
48
|
+
const mailHttp = new http_1.HttpClient(`${root}/api/mail/companies/${slug}`, config.accessToken, config.timeout);
|
|
49
|
+
// Storage uses the same pattern via `/api/storage/companies`.
|
|
50
|
+
const storageHttp = new http_1.HttpClient(`${root}/api/storage/companies/${slug}`, config.accessToken, config.timeout);
|
|
51
|
+
this.domains = new domains_1.Domains(mailHttp);
|
|
52
|
+
this.mailboxes = new mailboxes_1.Mailboxes(mailHttp);
|
|
53
|
+
this.templates = new templates_1.Templates(mailHttp);
|
|
54
|
+
this.inbox = new inbox_1.Inbox(mailHttp);
|
|
55
|
+
this.send = new send_1.Send(mailHttp);
|
|
56
|
+
this.buckets = new buckets_1.Buckets(storageHttp);
|
|
57
|
+
this.media = new media_1.MediaResource(storageHttp);
|
|
58
|
+
this.storage = new storage_1.Storage(storageHttp);
|
|
39
59
|
}
|
|
40
60
|
}
|
|
41
61
|
exports.Sentroy = Sentroy;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,iCAAmC;AACnC,iDAA6C;AAC7C,qDAAiD;AACjD,qDAAiD;AACjD,6CAAyC;AACzC,2CAAuC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,iCAAmC;AACnC,iDAA6C;AAC7C,qDAAiD;AACjD,qDAAiD;AACjD,6CAAyC;AACzC,2CAAuC;AACvC,iDAA6C;AAC7C,6CAAiD;AACjD,iDAA6C;AAG7C,MAAa,OAAO;IACF,OAAO,CAAS;IAChB,SAAS,CAAW;IACpB,SAAS,CAAW;IACpB,KAAK,CAAO;IACZ,IAAI,CAAM;IACV,OAAO,CAAS;IAChB,KAAK,CAAe;IACpB,OAAO,CAAS;IAEhC;;;;;;;;;;;;;;;;;;;OAmBG;IACH,YAAY,MAA2B;QACrC,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;QAC/C,MAAM,IAAI,GAAG,kBAAkB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;QAEnD,mEAAmE;QACnE,kEAAkE;QAClE,mBAAmB;QACnB,MAAM,QAAQ,GAAG,IAAI,iBAAU,CAC7B,GAAG,IAAI,uBAAuB,IAAI,EAAE,EACpC,MAAM,CAAC,WAAW,EAClB,MAAM,CAAC,OAAO,CACf,CAAA;QAED,8DAA8D;QAC9D,MAAM,WAAW,GAAG,IAAI,iBAAU,CAChC,GAAG,IAAI,0BAA0B,IAAI,EAAE,EACvC,MAAM,CAAC,WAAW,EAClB,MAAM,CAAC,OAAO,CACf,CAAA;QAED,IAAI,CAAC,OAAO,GAAG,IAAI,iBAAO,CAAC,QAAQ,CAAC,CAAA;QACpC,IAAI,CAAC,SAAS,GAAG,IAAI,qBAAS,CAAC,QAAQ,CAAC,CAAA;QACxC,IAAI,CAAC,SAAS,GAAG,IAAI,qBAAS,CAAC,QAAQ,CAAC,CAAA;QACxC,IAAI,CAAC,KAAK,GAAG,IAAI,aAAK,CAAC,QAAQ,CAAC,CAAA;QAChC,IAAI,CAAC,IAAI,GAAG,IAAI,WAAI,CAAC,QAAQ,CAAC,CAAA;QAC9B,IAAI,CAAC,OAAO,GAAG,IAAI,iBAAO,CAAC,WAAW,CAAC,CAAA;QACvC,IAAI,CAAC,KAAK,GAAG,IAAI,qBAAa,CAAC,WAAW,CAAC,CAAA;QAC3C,IAAI,CAAC,OAAO,GAAG,IAAI,iBAAO,CAAC,WAAW,CAAC,CAAA;IACzC,CAAC;CACF;AA3DD,0BA2DC;AAmCD,+BAAqC;AAA5B,oGAAA,YAAY,OAAA"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { HttpClient } from "../http";
|
|
2
|
+
import type { Bucket, CreateBucketParams, UpdateBucketParams } from "../types";
|
|
3
|
+
export declare class Buckets {
|
|
4
|
+
private http;
|
|
5
|
+
constructor(http: HttpClient);
|
|
6
|
+
/** List all buckets in the company. */
|
|
7
|
+
list(): Promise<Bucket[]>;
|
|
8
|
+
/** Get a single bucket by its slug. */
|
|
9
|
+
get(slug: string): Promise<Bucket>;
|
|
10
|
+
/** Create a new bucket. Slug is auto-derived from name if omitted. */
|
|
11
|
+
create(params: CreateBucketParams): Promise<Bucket>;
|
|
12
|
+
/**
|
|
13
|
+
* Update a bucket's name, description, or visibility. Toggling
|
|
14
|
+
* `isPublic` cascades to every existing file in the bucket (S3 ACL +
|
|
15
|
+
* Media doc); this call can take a while for large buckets.
|
|
16
|
+
*/
|
|
17
|
+
update(slug: string, params: UpdateBucketParams): Promise<Bucket>;
|
|
18
|
+
/**
|
|
19
|
+
* Delete a bucket. Fails with 409 if the bucket has any files unless
|
|
20
|
+
* `force: true` is passed — then every file is purged from storage
|
|
21
|
+
* before the bucket is removed.
|
|
22
|
+
*/
|
|
23
|
+
delete(slug: string, opts?: {
|
|
24
|
+
force?: boolean;
|
|
25
|
+
}): Promise<void>;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=buckets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buckets.d.ts","sourceRoot":"","sources":["../../src/resources/buckets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACzC,OAAO,KAAK,EACV,MAAM,EACN,kBAAkB,EAClB,kBAAkB,EACnB,MAAM,UAAU,CAAA;AAEjB,qBAAa,OAAO;IACN,OAAO,CAAC,IAAI;gBAAJ,IAAI,EAAE,UAAU;IAEpC,uCAAuC;IACjC,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAI/B,uCAAuC;IACjC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIxC,sEAAsE;IAChE,MAAM,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC;IAIzD;;;;OAIG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC;IAOvE;;;;OAIG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAOtE"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Buckets = void 0;
|
|
4
|
+
class Buckets {
|
|
5
|
+
http;
|
|
6
|
+
constructor(http) {
|
|
7
|
+
this.http = http;
|
|
8
|
+
}
|
|
9
|
+
/** List all buckets in the company. */
|
|
10
|
+
async list() {
|
|
11
|
+
return this.http.get("/buckets");
|
|
12
|
+
}
|
|
13
|
+
/** Get a single bucket by its slug. */
|
|
14
|
+
async get(slug) {
|
|
15
|
+
return this.http.get(`/buckets/${encodeURIComponent(slug)}`);
|
|
16
|
+
}
|
|
17
|
+
/** Create a new bucket. Slug is auto-derived from name if omitted. */
|
|
18
|
+
async create(params) {
|
|
19
|
+
return this.http.post("/buckets", params);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Update a bucket's name, description, or visibility. Toggling
|
|
23
|
+
* `isPublic` cascades to every existing file in the bucket (S3 ACL +
|
|
24
|
+
* Media doc); this call can take a while for large buckets.
|
|
25
|
+
*/
|
|
26
|
+
async update(slug, params) {
|
|
27
|
+
return this.http.patch(`/buckets/${encodeURIComponent(slug)}`, params);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Delete a bucket. Fails with 409 if the bucket has any files unless
|
|
31
|
+
* `force: true` is passed — then every file is purged from storage
|
|
32
|
+
* before the bucket is removed.
|
|
33
|
+
*/
|
|
34
|
+
async delete(slug, opts) {
|
|
35
|
+
const query = opts?.force ? { force: "true" } : undefined;
|
|
36
|
+
await this.http.del(`/buckets/${encodeURIComponent(slug)}`, query);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
exports.Buckets = Buckets;
|
|
40
|
+
//# sourceMappingURL=buckets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buckets.js","sourceRoot":"","sources":["../../src/resources/buckets.ts"],"names":[],"mappings":";;;AAOA,MAAa,OAAO;IACE;IAApB,YAAoB,IAAgB;QAAhB,SAAI,GAAJ,IAAI,CAAY;IAAG,CAAC;IAExC,uCAAuC;IACvC,KAAK,CAAC,IAAI;QACR,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAW,UAAU,CAAC,CAAA;IAC5C,CAAC;IAED,uCAAuC;IACvC,KAAK,CAAC,GAAG,CAAC,IAAY;QACpB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAS,YAAY,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACtE,CAAC;IAED,sEAAsE;IACtE,KAAK,CAAC,MAAM,CAAC,MAA0B;QACrC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAS,UAAU,EAAE,MAAM,CAAC,CAAA;IACnD,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,MAAM,CAAC,IAAY,EAAE,MAA0B;QACnD,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CACpB,YAAY,kBAAkB,CAAC,IAAI,CAAC,EAAE,EACtC,MAAM,CACP,CAAA;IACH,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,MAAM,CAAC,IAAY,EAAE,IAA0B;QACnD,MAAM,KAAK,GAAG,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CAAA;QACzD,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CACjB,YAAY,kBAAkB,CAAC,IAAI,CAAC,EAAE,EACtC,KAAK,CACN,CAAA;IACH,CAAC;CACF;AA1CD,0BA0CC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { HttpClient } from "../http";
|
|
2
|
+
import type { Media, MediaListParams, MediaListResult, UploadMediaParams } from "../types";
|
|
3
|
+
export declare class MediaResource {
|
|
4
|
+
private http;
|
|
5
|
+
constructor(http: HttpClient);
|
|
6
|
+
/** List files in a bucket (paginated). */
|
|
7
|
+
list(bucketSlug: string, params?: MediaListParams): Promise<MediaListResult>;
|
|
8
|
+
/** Get a single media record. */
|
|
9
|
+
get(bucketSlug: string, mediaId: string): Promise<Media>;
|
|
10
|
+
/**
|
|
11
|
+
* Upload a file to a bucket. Works in Node and the browser: `body`
|
|
12
|
+
* is a `Blob` or `File`. Returns the full serialized media record
|
|
13
|
+
* (with `url`, `downloadUrl`, image thumbnails when applicable).
|
|
14
|
+
*
|
|
15
|
+
* @example Browser
|
|
16
|
+
* ```ts
|
|
17
|
+
* const file = input.files[0]
|
|
18
|
+
* const media = await sentroy.media.upload("my-bucket", { body: file })
|
|
19
|
+
* console.log(media.url)
|
|
20
|
+
* ```
|
|
21
|
+
*
|
|
22
|
+
* @example Node 18+
|
|
23
|
+
* ```ts
|
|
24
|
+
* import { openAsBlob } from "node:fs"
|
|
25
|
+
* const blob = await openAsBlob("./photo.jpg")
|
|
26
|
+
* const media = await sentroy.media.upload("my-bucket", {
|
|
27
|
+
* body: blob,
|
|
28
|
+
* filename: "photo.jpg",
|
|
29
|
+
* })
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
upload(bucketSlug: string, params: UploadMediaParams): Promise<Media>;
|
|
33
|
+
/**
|
|
34
|
+
* Delete a file. Cascades through the CDN: S3 objects (original +
|
|
35
|
+
* thumbnails) are removed, then the Media record. If any S3 delete
|
|
36
|
+
* fails the record is kept so you can retry.
|
|
37
|
+
*/
|
|
38
|
+
delete(bucketSlug: string, mediaId: string): Promise<void>;
|
|
39
|
+
/**
|
|
40
|
+
* Download a media file. For private buckets this is the only way to
|
|
41
|
+
* fetch the bytes since the CDN public URL won't serve them; the
|
|
42
|
+
* storage app proxies through after auth.
|
|
43
|
+
*
|
|
44
|
+
* Pass `quality` to request a pre-generated thumbnail variant (e.g.
|
|
45
|
+
* `quality: 500` for 500px wide). Falls back to the original if the
|
|
46
|
+
* variant doesn't exist for that file.
|
|
47
|
+
*/
|
|
48
|
+
download(bucketSlug: string, mediaId: string, opts?: {
|
|
49
|
+
quality?: number | "original";
|
|
50
|
+
}): Promise<Blob>;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=media.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../../src/resources/media.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACzC,OAAO,KAAK,EACV,KAAK,EACL,eAAe,EACf,eAAe,EACf,iBAAiB,EAClB,MAAM,UAAU,CAAA;AAEjB,qBAAa,aAAa;IACZ,OAAO,CAAC,IAAI;gBAAJ,IAAI,EAAE,UAAU;IAEpC,0CAA0C;IACpC,IAAI,CACR,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,eAAe,GACvB,OAAO,CAAC,eAAe,CAAC;IAO3B,iCAAiC;IAC3B,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;IAM9D;;;;;;;;;;;;;;;;;;;;;OAqBG;IACG,MAAM,CACV,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,iBAAiB,GACxB,OAAO,CAAC,KAAK,CAAC;IAqBjB;;;;OAIG;IACG,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMhE;;;;;;;;OAQG;IACG,QAAQ,CACZ,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,GAAG,UAAU,CAAA;KAAE,GACvC,OAAO,CAAC,IAAI,CAAC;CAejB"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MediaResource = void 0;
|
|
4
|
+
class MediaResource {
|
|
5
|
+
http;
|
|
6
|
+
constructor(http) {
|
|
7
|
+
this.http = http;
|
|
8
|
+
}
|
|
9
|
+
/** List files in a bucket (paginated). */
|
|
10
|
+
async list(bucketSlug, params) {
|
|
11
|
+
return this.http.get(`/buckets/${encodeURIComponent(bucketSlug)}/media`, params);
|
|
12
|
+
}
|
|
13
|
+
/** Get a single media record. */
|
|
14
|
+
async get(bucketSlug, mediaId) {
|
|
15
|
+
return this.http.get(`/buckets/${encodeURIComponent(bucketSlug)}/media/${encodeURIComponent(mediaId)}`);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Upload a file to a bucket. Works in Node and the browser: `body`
|
|
19
|
+
* is a `Blob` or `File`. Returns the full serialized media record
|
|
20
|
+
* (with `url`, `downloadUrl`, image thumbnails when applicable).
|
|
21
|
+
*
|
|
22
|
+
* @example Browser
|
|
23
|
+
* ```ts
|
|
24
|
+
* const file = input.files[0]
|
|
25
|
+
* const media = await sentroy.media.upload("my-bucket", { body: file })
|
|
26
|
+
* console.log(media.url)
|
|
27
|
+
* ```
|
|
28
|
+
*
|
|
29
|
+
* @example Node 18+
|
|
30
|
+
* ```ts
|
|
31
|
+
* import { openAsBlob } from "node:fs"
|
|
32
|
+
* const blob = await openAsBlob("./photo.jpg")
|
|
33
|
+
* const media = await sentroy.media.upload("my-bucket", {
|
|
34
|
+
* body: blob,
|
|
35
|
+
* filename: "photo.jpg",
|
|
36
|
+
* })
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
async upload(bucketSlug, params) {
|
|
40
|
+
const form = new FormData();
|
|
41
|
+
const filename = params.filename ||
|
|
42
|
+
params.body.name ||
|
|
43
|
+
"upload.bin";
|
|
44
|
+
form.append("file", params.body, filename);
|
|
45
|
+
if (params.folder)
|
|
46
|
+
form.append("folder", params.folder);
|
|
47
|
+
if (params.isPublic !== undefined) {
|
|
48
|
+
form.append("public", params.isPublic ? "true" : "false");
|
|
49
|
+
}
|
|
50
|
+
if (params.alt)
|
|
51
|
+
form.append("alt", params.alt);
|
|
52
|
+
if (params.caption)
|
|
53
|
+
form.append("caption", params.caption);
|
|
54
|
+
if (params.tags?.length)
|
|
55
|
+
form.append("tags", params.tags.join(","));
|
|
56
|
+
return this.http.postForm(`/buckets/${encodeURIComponent(bucketSlug)}/media`, form);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Delete a file. Cascades through the CDN: S3 objects (original +
|
|
60
|
+
* thumbnails) are removed, then the Media record. If any S3 delete
|
|
61
|
+
* fails the record is kept so you can retry.
|
|
62
|
+
*/
|
|
63
|
+
async delete(bucketSlug, mediaId) {
|
|
64
|
+
await this.http.del(`/buckets/${encodeURIComponent(bucketSlug)}/media/${encodeURIComponent(mediaId)}`);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Download a media file. For private buckets this is the only way to
|
|
68
|
+
* fetch the bytes since the CDN public URL won't serve them; the
|
|
69
|
+
* storage app proxies through after auth.
|
|
70
|
+
*
|
|
71
|
+
* Pass `quality` to request a pre-generated thumbnail variant (e.g.
|
|
72
|
+
* `quality: 500` for 500px wide). Falls back to the original if the
|
|
73
|
+
* variant doesn't exist for that file.
|
|
74
|
+
*/
|
|
75
|
+
async download(bucketSlug, mediaId, opts) {
|
|
76
|
+
const quality = opts?.quality;
|
|
77
|
+
const query = quality && quality !== "original"
|
|
78
|
+
? { quality: String(quality) }
|
|
79
|
+
: undefined;
|
|
80
|
+
const res = await this.http.fetchRaw(`/buckets/${encodeURIComponent(bucketSlug)}/media/${encodeURIComponent(mediaId)}/download`, { query });
|
|
81
|
+
if (!res.ok) {
|
|
82
|
+
throw new Error(`Download failed with status ${res.status}`);
|
|
83
|
+
}
|
|
84
|
+
return res.blob();
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
exports.MediaResource = MediaResource;
|
|
88
|
+
//# sourceMappingURL=media.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media.js","sourceRoot":"","sources":["../../src/resources/media.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { HttpClient } from "../http";
|
|
2
|
+
import type { StorageQuota, StorageUsage } from "../types";
|
|
3
|
+
/**
|
|
4
|
+
* Storage observability — read-only quota + breakdown endpoints. Bucket
|
|
5
|
+
* and media CRUD lives on `client.buckets` / `client.media`.
|
|
6
|
+
*/
|
|
7
|
+
export declare class Storage {
|
|
8
|
+
private http;
|
|
9
|
+
constructor(http: HttpClient);
|
|
10
|
+
/**
|
|
11
|
+
* Plan storage quota for the company. `used` reflects bucket totals,
|
|
12
|
+
* `mailUsed` what the mail product has stored under the same plan
|
|
13
|
+
* pool, and `limit: 0` means unlimited.
|
|
14
|
+
*/
|
|
15
|
+
quota(): Promise<StorageQuota>;
|
|
16
|
+
/**
|
|
17
|
+
* Combined dashboard payload — plan quota + per-bucket byte/file
|
|
18
|
+
* counts + per-type aggregation across the company. Single round-trip
|
|
19
|
+
* intended for usage UIs.
|
|
20
|
+
*/
|
|
21
|
+
usage(): Promise<StorageUsage>;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/resources/storage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACzC,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAE1D;;;GAGG;AACH,qBAAa,OAAO;IACN,OAAO,CAAC,IAAI;gBAAJ,IAAI,EAAE,UAAU;IAEpC;;;;OAIG;IACG,KAAK,IAAI,OAAO,CAAC,YAAY,CAAC;IAIpC;;;;OAIG;IACG,KAAK,IAAI,OAAO,CAAC,YAAY,CAAC;CAGrC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Storage = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Storage observability — read-only quota + breakdown endpoints. Bucket
|
|
6
|
+
* and media CRUD lives on `client.buckets` / `client.media`.
|
|
7
|
+
*/
|
|
8
|
+
class Storage {
|
|
9
|
+
http;
|
|
10
|
+
constructor(http) {
|
|
11
|
+
this.http = http;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Plan storage quota for the company. `used` reflects bucket totals,
|
|
15
|
+
* `mailUsed` what the mail product has stored under the same plan
|
|
16
|
+
* pool, and `limit: 0` means unlimited.
|
|
17
|
+
*/
|
|
18
|
+
async quota() {
|
|
19
|
+
return this.http.get("/storage-quota");
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Combined dashboard payload — plan quota + per-bucket byte/file
|
|
23
|
+
* counts + per-type aggregation across the company. Single round-trip
|
|
24
|
+
* intended for usage UIs.
|
|
25
|
+
*/
|
|
26
|
+
async usage() {
|
|
27
|
+
return this.http.get("/usage");
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
exports.Storage = Storage;
|
|
31
|
+
//# sourceMappingURL=storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/resources/storage.ts"],"names":[],"mappings":";;;AAGA;;;GAGG;AACH,MAAa,OAAO;IACE;IAApB,YAAoB,IAAgB;QAAhB,SAAI,GAAJ,IAAI,CAAY;IAAG,CAAC;IAExC;;;;OAIG;IACH,KAAK,CAAC,KAAK;QACT,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAe,gBAAgB,CAAC,CAAA;IACtD,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,KAAK;QACT,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAe,QAAQ,CAAC,CAAA;IAC9C,CAAC;CACF;AApBD,0BAoBC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,9 +1,16 @@
|
|
|
1
1
|
export interface SentroyClientConfig {
|
|
2
|
-
/**
|
|
2
|
+
/**
|
|
3
|
+
* Platform root URL, e.g. "https://sentroy.com". Every resource —
|
|
4
|
+
* mail (domains, mailboxes, templates, inbox, send) and storage
|
|
5
|
+
* (buckets, media) — is reached through this single origin. The
|
|
6
|
+
* platform gateway transparently forwards mail requests to the mail
|
|
7
|
+
* subdomain and storage requests to the storage subdomain; consumers
|
|
8
|
+
* never see the split.
|
|
9
|
+
*/
|
|
3
10
|
baseUrl: string;
|
|
4
11
|
/** Company slug */
|
|
5
12
|
companySlug: string;
|
|
6
|
-
/** Access token (stk_...) */
|
|
13
|
+
/** Access token (stk_...). Same token works for mail + storage. */
|
|
7
14
|
accessToken: string;
|
|
8
15
|
/** Request timeout in milliseconds (default: 30000) */
|
|
9
16
|
timeout?: number;
|
|
@@ -129,4 +136,129 @@ export interface SendResult {
|
|
|
129
136
|
status: string;
|
|
130
137
|
scheduledAt?: string;
|
|
131
138
|
}
|
|
139
|
+
export interface Bucket {
|
|
140
|
+
id: string;
|
|
141
|
+
companyId: string;
|
|
142
|
+
name: string;
|
|
143
|
+
slug: string;
|
|
144
|
+
description?: string;
|
|
145
|
+
isPublic: boolean;
|
|
146
|
+
storageUsed: number;
|
|
147
|
+
fileCount: number;
|
|
148
|
+
createdAt: string;
|
|
149
|
+
updatedAt: string;
|
|
150
|
+
}
|
|
151
|
+
export interface CreateBucketParams {
|
|
152
|
+
name: string;
|
|
153
|
+
/** URL-safe slug. Auto-derived from name if omitted. */
|
|
154
|
+
slug?: string;
|
|
155
|
+
description?: string;
|
|
156
|
+
/** Public buckets serve files without auth; private requires proxy. */
|
|
157
|
+
isPublic?: boolean;
|
|
158
|
+
}
|
|
159
|
+
export interface UpdateBucketParams {
|
|
160
|
+
name?: string;
|
|
161
|
+
description?: string;
|
|
162
|
+
/** Toggling cascades to every file's S3 ACL + Media doc. */
|
|
163
|
+
isPublic?: boolean;
|
|
164
|
+
}
|
|
165
|
+
export type MediaType = "image" | "video" | "audio" | "document" | "other";
|
|
166
|
+
export interface MediaThumbnail {
|
|
167
|
+
width: number;
|
|
168
|
+
height: number;
|
|
169
|
+
fileName: string;
|
|
170
|
+
size: number;
|
|
171
|
+
}
|
|
172
|
+
export interface MediaImageMeta {
|
|
173
|
+
width: number;
|
|
174
|
+
height: number;
|
|
175
|
+
orientation: "landscape" | "portrait" | "square";
|
|
176
|
+
thumbnails: MediaThumbnail[];
|
|
177
|
+
}
|
|
178
|
+
export interface Media {
|
|
179
|
+
id: string;
|
|
180
|
+
bucketId: string;
|
|
181
|
+
companyId: string;
|
|
182
|
+
fileName: string;
|
|
183
|
+
originalName: string;
|
|
184
|
+
type: MediaType;
|
|
185
|
+
size: number;
|
|
186
|
+
mimeType: string;
|
|
187
|
+
folder: string;
|
|
188
|
+
uploadedBy: string;
|
|
189
|
+
tags: string[];
|
|
190
|
+
alt?: string;
|
|
191
|
+
caption?: string;
|
|
192
|
+
isPublic: boolean;
|
|
193
|
+
imageMeta?: MediaImageMeta;
|
|
194
|
+
createdAt: string;
|
|
195
|
+
updatedAt: string;
|
|
196
|
+
}
|
|
197
|
+
export interface MediaListResult {
|
|
198
|
+
items: Media[];
|
|
199
|
+
total: number;
|
|
200
|
+
limit: number;
|
|
201
|
+
skip: number;
|
|
202
|
+
}
|
|
203
|
+
export interface MediaListParams {
|
|
204
|
+
type?: MediaType;
|
|
205
|
+
folder?: string;
|
|
206
|
+
limit?: number;
|
|
207
|
+
skip?: number;
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Upload input. Works in both Node and the browser:
|
|
211
|
+
* - Node: pass a `Blob` via `new Blob([buffer])` or `File` polyfill.
|
|
212
|
+
* - Browser: pass a `File` (from input) or `Blob` directly.
|
|
213
|
+
*
|
|
214
|
+
* `filename` is required when `body` is a raw `Blob` without a `.name`;
|
|
215
|
+
* otherwise the client reads `body.name` (File) or defaults to
|
|
216
|
+
* `"upload.bin"`.
|
|
217
|
+
*/
|
|
218
|
+
export interface UploadMediaParams {
|
|
219
|
+
body: Blob;
|
|
220
|
+
filename?: string;
|
|
221
|
+
/** Folder name inside the bucket (default "uploads"). */
|
|
222
|
+
folder?: string;
|
|
223
|
+
/** Sets media.isPublic; bucket must itself be public for this to take. */
|
|
224
|
+
isPublic?: boolean;
|
|
225
|
+
alt?: string;
|
|
226
|
+
caption?: string;
|
|
227
|
+
tags?: string[];
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Plan-level storage quota for the company. Mail and storage share the
|
|
231
|
+
* same byte pool; `used` reports storage's slice and `mailUsed` what mail
|
|
232
|
+
* has occupied. `limit` of `0` means the plan is unlimited.
|
|
233
|
+
*/
|
|
234
|
+
export interface StorageQuota {
|
|
235
|
+
used: number;
|
|
236
|
+
limit: number;
|
|
237
|
+
mailUsed: number;
|
|
238
|
+
planName?: string;
|
|
239
|
+
}
|
|
240
|
+
/** Per-bucket usage row inside `StorageUsage.buckets`. */
|
|
241
|
+
export interface StorageUsageBucket {
|
|
242
|
+
id: string;
|
|
243
|
+
name: string;
|
|
244
|
+
slug: string;
|
|
245
|
+
storageUsed: number;
|
|
246
|
+
fileCount: number;
|
|
247
|
+
isPublic: boolean;
|
|
248
|
+
}
|
|
249
|
+
/** Per-type aggregation row inside `StorageUsage.byType`. */
|
|
250
|
+
export interface StorageUsageByType {
|
|
251
|
+
type: MediaType;
|
|
252
|
+
count: number;
|
|
253
|
+
bytes: number;
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Combined snapshot for a "Usage" dashboard: plan quota + every bucket
|
|
257
|
+
* with its byte/file counts + a media-type breakdown across the company.
|
|
258
|
+
*/
|
|
259
|
+
export interface StorageUsage {
|
|
260
|
+
quota: StorageQuota;
|
|
261
|
+
buckets: StorageUsageBucket[];
|
|
262
|
+
byType: StorageUsageByType[];
|
|
263
|
+
}
|
|
132
264
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,mBAAmB;IAClC
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|