@nurama/sdk 0.0.0-stage → 1.4.1
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/LICENSE +202 -0
- package/NOTICE +5 -0
- package/README.md +1080 -2
- package/dist/BotClient.d.ts +66 -0
- package/dist/BotClient.d.ts.map +1 -0
- package/dist/BotClient.js +68 -0
- package/dist/BotClient.js.map +1 -0
- package/dist/NuramaClient.d.ts +480 -0
- package/dist/NuramaClient.d.ts.map +1 -0
- package/dist/NuramaClient.js +902 -0
- package/dist/NuramaClient.js.map +1 -0
- package/dist/browser/nurama-bot-sdk.js +12051 -0
- package/dist/browser/nurama-bot-sdk.min.js +1 -0
- package/dist/browser/nurama-sdk.js +12003 -0
- package/dist/browser/nurama-sdk.min.js +1 -0
- package/dist/routes/ai.d.ts +280 -0
- package/dist/routes/ai.d.ts.map +1 -0
- package/dist/routes/ai.js +173 -0
- package/dist/routes/ai.js.map +1 -0
- package/dist/routes/asset.d.ts +493 -0
- package/dist/routes/asset.d.ts.map +1 -0
- package/dist/routes/asset.js +848 -0
- package/dist/routes/asset.js.map +1 -0
- package/dist/routes/auth.d.ts +218 -0
- package/dist/routes/auth.d.ts.map +1 -0
- package/dist/routes/auth.js +454 -0
- package/dist/routes/auth.js.map +1 -0
- package/dist/routes/blogPosts.d.ts +17 -0
- package/dist/routes/blogPosts.d.ts.map +1 -0
- package/dist/routes/blogPosts.js +29 -0
- package/dist/routes/blogPosts.js.map +1 -0
- package/dist/routes/board.d.ts +187 -0
- package/dist/routes/board.d.ts.map +1 -0
- package/dist/routes/board.js +270 -0
- package/dist/routes/board.js.map +1 -0
- package/dist/routes/bot.d.ts +202 -0
- package/dist/routes/bot.d.ts.map +1 -0
- package/dist/routes/bot.js +229 -0
- package/dist/routes/bot.js.map +1 -0
- package/dist/routes/chat.d.ts +842 -0
- package/dist/routes/chat.d.ts.map +1 -0
- package/dist/routes/chat.js +863 -0
- package/dist/routes/chat.js.map +1 -0
- package/dist/routes/chatAi.d.ts +51 -0
- package/dist/routes/chatAi.d.ts.map +1 -0
- package/dist/routes/chatAi.js +109 -0
- package/dist/routes/chatAi.js.map +1 -0
- package/dist/routes/config.d.ts +11 -0
- package/dist/routes/config.d.ts.map +1 -0
- package/dist/routes/config.js +24 -0
- package/dist/routes/config.js.map +1 -0
- package/dist/routes/convo.d.ts +169 -0
- package/dist/routes/convo.d.ts.map +1 -0
- package/dist/routes/convo.js +284 -0
- package/dist/routes/convo.js.map +1 -0
- package/dist/routes/credits.d.ts +82 -0
- package/dist/routes/credits.d.ts.map +1 -0
- package/dist/routes/credits.js +49 -0
- package/dist/routes/credits.js.map +1 -0
- package/dist/routes/device.d.ts +74 -0
- package/dist/routes/device.d.ts.map +1 -0
- package/dist/routes/device.js +122 -0
- package/dist/routes/device.js.map +1 -0
- package/dist/routes/folder.d.ts +75 -0
- package/dist/routes/folder.d.ts.map +1 -0
- package/dist/routes/folder.js +99 -0
- package/dist/routes/folder.js.map +1 -0
- package/dist/routes/invite.d.ts +61 -0
- package/dist/routes/invite.d.ts.map +1 -0
- package/dist/routes/invite.js +86 -0
- package/dist/routes/invite.js.map +1 -0
- package/dist/routes/joinLink.d.ts +88 -0
- package/dist/routes/joinLink.d.ts.map +1 -0
- package/dist/routes/joinLink.js +205 -0
- package/dist/routes/joinLink.js.map +1 -0
- package/dist/routes/membership.d.ts +116 -0
- package/dist/routes/membership.d.ts.map +1 -0
- package/dist/routes/membership.js +183 -0
- package/dist/routes/membership.js.map +1 -0
- package/dist/routes/notification.d.ts +103 -0
- package/dist/routes/notification.d.ts.map +1 -0
- package/dist/routes/notification.js +89 -0
- package/dist/routes/notification.js.map +1 -0
- package/dist/routes/oauthGrant.d.ts +45 -0
- package/dist/routes/oauthGrant.d.ts.map +1 -0
- package/dist/routes/oauthGrant.js +32 -0
- package/dist/routes/oauthGrant.js.map +1 -0
- package/dist/routes/payment.d.ts +56 -0
- package/dist/routes/payment.d.ts.map +1 -0
- package/dist/routes/payment.js +78 -0
- package/dist/routes/payment.js.map +1 -0
- package/dist/routes/product.d.ts +43 -0
- package/dist/routes/product.d.ts.map +1 -0
- package/dist/routes/product.js +53 -0
- package/dist/routes/product.js.map +1 -0
- package/dist/routes/project.d.ts +821 -0
- package/dist/routes/project.d.ts.map +1 -0
- package/dist/routes/project.js +1153 -0
- package/dist/routes/project.js.map +1 -0
- package/dist/routes/public.d.ts +269 -0
- package/dist/routes/public.d.ts.map +1 -0
- package/dist/routes/public.js +412 -0
- package/dist/routes/public.js.map +1 -0
- package/dist/routes/scratch.d.ts +70 -0
- package/dist/routes/scratch.d.ts.map +1 -0
- package/dist/routes/scratch.js +67 -0
- package/dist/routes/scratch.js.map +1 -0
- package/dist/routes/settings.d.ts +102 -0
- package/dist/routes/settings.d.ts.map +1 -0
- package/dist/routes/settings.js +94 -0
- package/dist/routes/settings.js.map +1 -0
- package/dist/routes/shortlink.d.ts +79 -0
- package/dist/routes/shortlink.d.ts.map +1 -0
- package/dist/routes/shortlink.js +25 -0
- package/dist/routes/shortlink.js.map +1 -0
- package/dist/routes/socket.d.ts +108 -0
- package/dist/routes/socket.d.ts.map +1 -0
- package/dist/routes/socket.js +573 -0
- package/dist/routes/socket.js.map +1 -0
- package/dist/routes/storage.d.ts +44 -0
- package/dist/routes/storage.d.ts.map +1 -0
- package/dist/routes/storage.js +49 -0
- package/dist/routes/storage.js.map +1 -0
- package/dist/routes/subscription.d.ts +184 -0
- package/dist/routes/subscription.d.ts.map +1 -0
- package/dist/routes/subscription.js +219 -0
- package/dist/routes/subscription.js.map +1 -0
- package/dist/routes/supportChat.d.ts +40 -0
- package/dist/routes/supportChat.d.ts.map +1 -0
- package/dist/routes/supportChat.js +53 -0
- package/dist/routes/supportChat.js.map +1 -0
- package/dist/routes/supportTicket.d.ts +89 -0
- package/dist/routes/supportTicket.d.ts.map +1 -0
- package/dist/routes/supportTicket.js +54 -0
- package/dist/routes/supportTicket.js.map +1 -0
- package/dist/routes/tag.d.ts +72 -0
- package/dist/routes/tag.d.ts.map +1 -0
- package/dist/routes/tag.js +81 -0
- package/dist/routes/tag.js.map +1 -0
- package/dist/routes/task.d.ts +252 -0
- package/dist/routes/task.d.ts.map +1 -0
- package/dist/routes/task.js +284 -0
- package/dist/routes/task.js.map +1 -0
- package/dist/routes/taskRelation.d.ts +80 -0
- package/dist/routes/taskRelation.d.ts.map +1 -0
- package/dist/routes/taskRelation.js +71 -0
- package/dist/routes/taskRelation.js.map +1 -0
- package/dist/routes/token.d.ts +97 -0
- package/dist/routes/token.d.ts.map +1 -0
- package/dist/routes/token.js +73 -0
- package/dist/routes/token.js.map +1 -0
- package/dist/routes/user.d.ts +112 -0
- package/dist/routes/user.d.ts.map +1 -0
- package/dist/routes/user.js +151 -0
- package/dist/routes/user.js.map +1 -0
- package/dist/routes/version.d.ts +42 -0
- package/dist/routes/version.d.ts.map +1 -0
- package/dist/routes/version.js +38 -0
- package/dist/routes/version.js.map +1 -0
- package/dist/routes/webhook.d.ts +170 -0
- package/dist/routes/webhook.d.ts.map +1 -0
- package/dist/routes/webhook.js +173 -0
- package/dist/routes/webhook.js.map +1 -0
- package/dist/routes/workspace.d.ts +120 -0
- package/dist/routes/workspace.d.ts.map +1 -0
- package/dist/routes/workspace.js +199 -0
- package/dist/routes/workspace.js.map +1 -0
- package/dist/utils/uploadSessionManager.d.ts +133 -0
- package/dist/utils/uploadSessionManager.d.ts.map +1 -0
- package/dist/utils/uploadSessionManager.js +321 -0
- package/dist/utils/uploadSessionManager.js.map +1 -0
- package/dist/utils/urlParams.d.ts +35 -0
- package/dist/utils/urlParams.d.ts.map +1 -0
- package/dist/utils/urlParams.js +146 -0
- package/dist/utils/urlParams.js.map +1 -0
- package/dist/version.d.ts +15 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +12 -0
- package/dist/version.js.map +1 -0
- package/package.json +87 -3
- package/src/BotClient.ts +113 -0
- package/src/NuramaClient.ts +1253 -0
- package/src/bot-browser-entry.js +15 -0
- package/src/browser-entry.js +20 -0
- package/src/routes/ai.ts +378 -0
- package/src/routes/asset.ts +1104 -0
- package/src/routes/auth.ts +587 -0
- package/src/routes/blogPosts.ts +29 -0
- package/src/routes/board.ts +403 -0
- package/src/routes/bot.ts +356 -0
- package/src/routes/chat.ts +1292 -0
- package/src/routes/chatAi.ts +125 -0
- package/src/routes/config.ts +31 -0
- package/src/routes/convo.ts +321 -0
- package/src/routes/credits.ts +112 -0
- package/src/routes/device.ts +133 -0
- package/src/routes/folder.ts +154 -0
- package/src/routes/invite.ts +133 -0
- package/src/routes/joinLink.ts +233 -0
- package/src/routes/membership.ts +237 -0
- package/src/routes/notification.ts +166 -0
- package/src/routes/oauthGrant.ts +64 -0
- package/src/routes/payment.ts +104 -0
- package/src/routes/product.ts +67 -0
- package/src/routes/project.ts +1528 -0
- package/src/routes/public.ts +496 -0
- package/src/routes/scratch.ts +94 -0
- package/src/routes/settings.ts +152 -0
- package/src/routes/shortlink.ts +90 -0
- package/src/routes/socket.ts +757 -0
- package/src/routes/storage.ts +83 -0
- package/src/routes/subscription.ts +307 -0
- package/src/routes/supportChat.ts +62 -0
- package/src/routes/supportTicket.ts +114 -0
- package/src/routes/tag.ts +131 -0
- package/src/routes/task.ts +431 -0
- package/src/routes/taskRelation.ts +125 -0
- package/src/routes/token.ts +152 -0
- package/src/routes/user.ts +214 -0
- package/src/routes/version.ts +62 -0
- package/src/routes/webhook.ts +295 -0
- package/src/routes/workspace.ts +223 -0
- package/src/utils/uploadSessionManager.ts +407 -0
- package/src/utils/urlParams.ts +181 -0
- package/src/version.ts +22 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import NuramaClient from '../NuramaClient.js';
|
|
2
|
+
import { type Folder, type Asset, type PaginatedResult, type CursorPaginatedResult } from '@nurama/types';
|
|
3
|
+
export type PaginatedResponse<T> = (PaginatedResult | CursorPaginatedResult) & {
|
|
4
|
+
results?: T[];
|
|
5
|
+
};
|
|
6
|
+
export interface PaginationParams {
|
|
7
|
+
limit?: number;
|
|
8
|
+
page?: number;
|
|
9
|
+
}
|
|
10
|
+
export interface SortParams {
|
|
11
|
+
sort?: Record<string, 1 | -1>;
|
|
12
|
+
}
|
|
13
|
+
export interface UpdateFolderData {
|
|
14
|
+
name?: string;
|
|
15
|
+
color?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface UpdateFolderIconData {
|
|
18
|
+
name: string;
|
|
19
|
+
checksum: string;
|
|
20
|
+
sizeInMB: number;
|
|
21
|
+
}
|
|
22
|
+
export interface TagFolderData {
|
|
23
|
+
tagId: string;
|
|
24
|
+
}
|
|
25
|
+
export interface UntagFolderData {
|
|
26
|
+
tagId: string;
|
|
27
|
+
}
|
|
28
|
+
export interface GetFoldersAssetsParams extends PaginationParams, SortParams {
|
|
29
|
+
visibility?: 'creator' | 'reviewer';
|
|
30
|
+
chats?: boolean;
|
|
31
|
+
messages?: number;
|
|
32
|
+
replies?: number;
|
|
33
|
+
}
|
|
34
|
+
export type FolderResponse = Folder;
|
|
35
|
+
export type AssetResponse = Asset;
|
|
36
|
+
/**
|
|
37
|
+
* Defines folder-related methods for the NuramaClient.
|
|
38
|
+
* @param {NuramaClient} client - The NuramaClient instance.
|
|
39
|
+
* @returns {object} An object containing the folder-related methods.
|
|
40
|
+
*/
|
|
41
|
+
export default function createFolderMethods(client: NuramaClient): {
|
|
42
|
+
/** Fetch a single folder by id. */
|
|
43
|
+
getFolder(folderId: string): Promise<FolderResponse>;
|
|
44
|
+
/**
|
|
45
|
+
* Updates a folder's name and/or color.
|
|
46
|
+
* @param {string} folderId - The ID of the folder to update.
|
|
47
|
+
* @param {UpdateFolderData} data - Data containing the name and/or color to update.
|
|
48
|
+
* @returns {Promise<FolderResponse>} The updated folder object.
|
|
49
|
+
*/
|
|
50
|
+
updateFolder(folderId: string, data: UpdateFolderData): Promise<FolderResponse>;
|
|
51
|
+
/**
|
|
52
|
+
* Updates a folder's icon.
|
|
53
|
+
* @param {string} folderId - The ID of the folder to update.
|
|
54
|
+
* @param {UpdateFolderIconData} data - Icon file data including name, checksum, and size.
|
|
55
|
+
* @returns {Promise<any>} Object containing the updated folder and signed upload URLs.
|
|
56
|
+
*/
|
|
57
|
+
updateFolderIcon(folderId: string, data: UpdateFolderIconData): Promise<any>;
|
|
58
|
+
/** List the assets that live directly inside a folder (does not recurse). */
|
|
59
|
+
getFoldersAssets(folderId: string, params?: GetFoldersAssetsParams): Promise<PaginatedResponse<AssetResponse>>;
|
|
60
|
+
/**
|
|
61
|
+
* Tags a folder with a specific tag.
|
|
62
|
+
* @param {string} folderId - The ID of the folder to tag.
|
|
63
|
+
* @param {TagFolderData} tagData - Data containing the tag ID.
|
|
64
|
+
* @returns {Promise<FolderResponse>} The updated folder object.
|
|
65
|
+
*/
|
|
66
|
+
tagFolder(folderId: string, tagData: TagFolderData): Promise<FolderResponse>;
|
|
67
|
+
/**
|
|
68
|
+
* Untags a folder by removing a specific tag.
|
|
69
|
+
* @param {string} folderId - The ID of the folder to untag.
|
|
70
|
+
* @param {UntagFolderData} untagData - Data containing the tag ID to remove.
|
|
71
|
+
* @returns {Promise<FolderResponse>} The updated folder object.
|
|
72
|
+
*/
|
|
73
|
+
untagFolder(folderId: string, untagData: UntagFolderData): Promise<FolderResponse>;
|
|
74
|
+
};
|
|
75
|
+
//# sourceMappingURL=folder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"folder.d.ts","sourceRoot":"","sources":["../../src/routes/folder.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EACL,KAAK,MAAM,EACX,KAAK,KAAK,EACV,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC3B,MAAM,eAAe,CAAC;AAIvB,MAAM,MAAM,iBAAiB,CAAC,CAAC,IAAI,CAAC,eAAe,GAAG,qBAAqB,CAAC,GAAG;IAC7E,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;CACf,CAAC;AAGF,MAAM,WAAW,gBAAgB;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CACjC;AAGD,MAAM,WAAW,gBAAgB;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CACpB;AAID,MAAM,WAAW,aAAa;IAC1B,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC5B,KAAK,EAAE,MAAM,CAAC;CACjB;AAGD,MAAM,WAAW,sBAAuB,SAAQ,gBAAgB,EAAE,UAAU;IACxE,UAAU,CAAC,EAAE,SAAS,GAAG,UAAU,CAAC;IACpC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAGD,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC;AACpC,MAAM,MAAM,aAAa,GAAG,KAAK,CAAC;AAElC;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,mBAAmB,CAAC,MAAM,EAAE,YAAY;IAE5D,mCAAmC;wBACT,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAS1D;;;;;OAKG;2BAC0B,MAAM,QAAQ,gBAAgB,GAAG,OAAO,CAAC,cAAc,CAAC;IAUrF;;;;;OAKG;+BAC8B,MAAM,QAAQ,oBAAoB,GAAG,OAAO,CAAC,GAAG,CAAC;IAUlF,6EAA6E;+BAC5C,MAAM,WAAW,sBAAsB,GAAG,OAAO,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC;IAUpH;;;;;OAKG;wBACuB,MAAM,WAAW,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;IAWlF;;;;;OAKG;0BACyB,MAAM,aAAa,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;EAY3F"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Defines folder-related methods for the NuramaClient.
|
|
3
|
+
* @param {NuramaClient} client - The NuramaClient instance.
|
|
4
|
+
* @returns {object} An object containing the folder-related methods.
|
|
5
|
+
*/
|
|
6
|
+
export default function createFolderMethods(client) {
|
|
7
|
+
return {
|
|
8
|
+
/** Fetch a single folder by id. */
|
|
9
|
+
async getFolder(folderId) {
|
|
10
|
+
if (!folderId)
|
|
11
|
+
throw new Error('folderId is required.');
|
|
12
|
+
return client._request({
|
|
13
|
+
method: 'GET',
|
|
14
|
+
endpoint: `/v1/folders/${folderId}`,
|
|
15
|
+
sendJWT: true,
|
|
16
|
+
});
|
|
17
|
+
},
|
|
18
|
+
/**
|
|
19
|
+
* Updates a folder's name and/or color.
|
|
20
|
+
* @param {string} folderId - The ID of the folder to update.
|
|
21
|
+
* @param {UpdateFolderData} data - Data containing the name and/or color to update.
|
|
22
|
+
* @returns {Promise<FolderResponse>} The updated folder object.
|
|
23
|
+
*/
|
|
24
|
+
async updateFolder(folderId, data) {
|
|
25
|
+
if (!folderId)
|
|
26
|
+
throw new Error('folderId is required.');
|
|
27
|
+
return client._request({
|
|
28
|
+
method: 'PUT',
|
|
29
|
+
endpoint: `/v1/folders/${folderId}`,
|
|
30
|
+
body: data,
|
|
31
|
+
sendJWT: true,
|
|
32
|
+
});
|
|
33
|
+
},
|
|
34
|
+
/**
|
|
35
|
+
* Updates a folder's icon.
|
|
36
|
+
* @param {string} folderId - The ID of the folder to update.
|
|
37
|
+
* @param {UpdateFolderIconData} data - Icon file data including name, checksum, and size.
|
|
38
|
+
* @returns {Promise<any>} Object containing the updated folder and signed upload URLs.
|
|
39
|
+
*/
|
|
40
|
+
async updateFolderIcon(folderId, data) {
|
|
41
|
+
if (!folderId)
|
|
42
|
+
throw new Error('folderId is required.');
|
|
43
|
+
return client._request({
|
|
44
|
+
method: 'PUT',
|
|
45
|
+
endpoint: `/v1/folders/${folderId}/icon`,
|
|
46
|
+
body: data,
|
|
47
|
+
sendJWT: true,
|
|
48
|
+
});
|
|
49
|
+
},
|
|
50
|
+
/** List the assets that live directly inside a folder (does not recurse). */
|
|
51
|
+
async getFoldersAssets(folderId, params) {
|
|
52
|
+
if (!folderId)
|
|
53
|
+
throw new Error('folderId is required.');
|
|
54
|
+
return client._request({
|
|
55
|
+
method: 'GET',
|
|
56
|
+
endpoint: `/v1/folders/${folderId}/assets`,
|
|
57
|
+
params: params,
|
|
58
|
+
sendJWT: true,
|
|
59
|
+
});
|
|
60
|
+
},
|
|
61
|
+
/**
|
|
62
|
+
* Tags a folder with a specific tag.
|
|
63
|
+
* @param {string} folderId - The ID of the folder to tag.
|
|
64
|
+
* @param {TagFolderData} tagData - Data containing the tag ID.
|
|
65
|
+
* @returns {Promise<FolderResponse>} The updated folder object.
|
|
66
|
+
*/
|
|
67
|
+
async tagFolder(folderId, tagData) {
|
|
68
|
+
if (!folderId)
|
|
69
|
+
throw new Error('folderId is required.');
|
|
70
|
+
if (!tagData.tagId)
|
|
71
|
+
throw new Error('tagId is required.');
|
|
72
|
+
return client._request({
|
|
73
|
+
method: 'PUT',
|
|
74
|
+
endpoint: `/v1/folders/${folderId}/tag`,
|
|
75
|
+
body: tagData,
|
|
76
|
+
sendJWT: true,
|
|
77
|
+
});
|
|
78
|
+
},
|
|
79
|
+
/**
|
|
80
|
+
* Untags a folder by removing a specific tag.
|
|
81
|
+
* @param {string} folderId - The ID of the folder to untag.
|
|
82
|
+
* @param {UntagFolderData} untagData - Data containing the tag ID to remove.
|
|
83
|
+
* @returns {Promise<FolderResponse>} The updated folder object.
|
|
84
|
+
*/
|
|
85
|
+
async untagFolder(folderId, untagData) {
|
|
86
|
+
if (!folderId)
|
|
87
|
+
throw new Error('folderId is required.');
|
|
88
|
+
if (!untagData.tagId)
|
|
89
|
+
throw new Error('tagId is required.');
|
|
90
|
+
return client._request({
|
|
91
|
+
method: 'PUT',
|
|
92
|
+
endpoint: `/v1/folders/${folderId}/untag`,
|
|
93
|
+
body: untagData,
|
|
94
|
+
sendJWT: true,
|
|
95
|
+
});
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=folder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"folder.js","sourceRoot":"","sources":["../../src/routes/folder.ts"],"names":[],"mappings":"AA0DA;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,mBAAmB,CAAC,MAAoB;IAC9D,OAAO;QACL,mCAAmC;QACnC,KAAK,CAAC,SAAS,CAAC,QAAgB;YAC9B,IAAI,CAAC,QAAQ;gBAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;YACxD,OAAO,MAAM,CAAC,QAAQ,CAAiB;gBACrC,MAAM,EAAE,KAAK;gBACb,QAAQ,EAAE,eAAe,QAAQ,EAAE;gBACnC,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;QACL,CAAC;QAED;;;;;WAKG;QACH,KAAK,CAAC,YAAY,CAAC,QAAgB,EAAE,IAAsB;YACzD,IAAI,CAAC,QAAQ;gBAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;YACxD,OAAO,MAAM,CAAC,QAAQ,CAAiB;gBACrC,MAAM,EAAE,KAAK;gBACb,QAAQ,EAAE,eAAe,QAAQ,EAAE;gBACnC,IAAI,EAAE,IAAI;gBACV,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;QACL,CAAC;QAED;;;;;WAKG;QACH,KAAK,CAAC,gBAAgB,CAAC,QAAgB,EAAE,IAA0B;YACjE,IAAI,CAAC,QAAQ;gBAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;YACxD,OAAO,MAAM,CAAC,QAAQ,CAAM;gBAC1B,MAAM,EAAE,KAAK;gBACb,QAAQ,EAAE,eAAe,QAAQ,OAAO;gBACxC,IAAI,EAAE,IAAI;gBACV,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;QACL,CAAC;QAED,6EAA6E;QAC7E,KAAK,CAAC,gBAAgB,CAAC,QAAgB,EAAE,MAA+B;YACtE,IAAI,CAAC,QAAQ;gBAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;YACxD,OAAO,MAAM,CAAC,QAAQ,CAAmC;gBACvD,MAAM,EAAE,KAAK;gBACb,QAAQ,EAAE,eAAe,QAAQ,SAAS;gBAC1C,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;QACL,CAAC;QAED;;;;;WAKG;QACH,KAAK,CAAC,SAAS,CAAC,QAAgB,EAAE,OAAsB;YACtD,IAAI,CAAC,QAAQ;gBAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;YACxD,IAAI,CAAC,OAAO,CAAC,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;YAC1D,OAAO,MAAM,CAAC,QAAQ,CAAiB;gBACrC,MAAM,EAAE,KAAK;gBACb,QAAQ,EAAE,eAAe,QAAQ,MAAM;gBACvC,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;QACL,CAAC;QAED;;;;;WAKG;QACH,KAAK,CAAC,WAAW,CAAC,QAAgB,EAAE,SAA0B;YAC5D,IAAI,CAAC,QAAQ;gBAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;YACxD,IAAI,CAAC,SAAS,CAAC,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;YAC5D,OAAO,MAAM,CAAC,QAAQ,CAAiB;gBACrC,MAAM,EAAE,KAAK;gBACb,QAAQ,EAAE,eAAe,QAAQ,QAAQ;gBACzC,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;QACL,CAAC;KAEF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import NuramaClient from '../NuramaClient.js';
|
|
2
|
+
import { type Invite, type Membership, type PaginatedResult, type CursorPaginatedResult } from '@nurama/types';
|
|
3
|
+
export type PaginatedResponse<T> = (PaginatedResult | CursorPaginatedResult) & {
|
|
4
|
+
results?: T[];
|
|
5
|
+
};
|
|
6
|
+
export interface InviteUserToResourceData {
|
|
7
|
+
inviteeEmail: string;
|
|
8
|
+
resourceType: string;
|
|
9
|
+
resourceId: string;
|
|
10
|
+
role: string;
|
|
11
|
+
/** Optional workspace-level roles granted alongside the primary role
|
|
12
|
+
* (subset of the backend `additionalRoles`, e.g. workspaceChatMember,
|
|
13
|
+
* workspaceAdmin). Applied to the workspace membership on accept. */
|
|
14
|
+
additionalRoles?: string[];
|
|
15
|
+
}
|
|
16
|
+
export type InviteStatus = 'active' | 'canceled' | 'accepted';
|
|
17
|
+
export interface GetUsersInvitesParams {
|
|
18
|
+
inviteType?: 'all' | 'inviter' | 'invitee';
|
|
19
|
+
status?: InviteStatus | InviteStatus[];
|
|
20
|
+
}
|
|
21
|
+
export interface GetInvitesToResourceParams {
|
|
22
|
+
status?: InviteStatus | InviteStatus[];
|
|
23
|
+
}
|
|
24
|
+
export type InviteResponse = Invite;
|
|
25
|
+
export type PaginatedInvitesResponse = PaginatedResponse<Invite> | {
|
|
26
|
+
inviter: Invite[];
|
|
27
|
+
invitee: Invite[];
|
|
28
|
+
} | Invite[];
|
|
29
|
+
export type AcceptInviteResponse = {
|
|
30
|
+
membership: Membership;
|
|
31
|
+
invite: Invite;
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Defines invite-related methods for the NuramaClient.
|
|
35
|
+
* @param {NuramaClient} client - The NuramaClient instance.
|
|
36
|
+
* @returns {object} An object containing the invite-related methods.
|
|
37
|
+
*/
|
|
38
|
+
export default function createInviteMethods(client: NuramaClient): {
|
|
39
|
+
/**
|
|
40
|
+
* Invite a user (by email) to a workspace or project at a given role.
|
|
41
|
+
* Triggers an invitation email; the recipient accepts via the link.
|
|
42
|
+
*/
|
|
43
|
+
inviteUser(data: InviteUserToResourceData): Promise<InviteResponse>;
|
|
44
|
+
/** List invites the current user has issued (pending, accepted, expired). */
|
|
45
|
+
getInvites(params?: GetUsersInvitesParams): Promise<PaginatedInvitesResponse>;
|
|
46
|
+
/**
|
|
47
|
+
* Look up an invite by id. Public — no auth — so the recipient can
|
|
48
|
+
* preview the invite (target resource, role, inviter) before signing
|
|
49
|
+
* up or logging in.
|
|
50
|
+
*/
|
|
51
|
+
getInviteById(inviteId: string): Promise<InviteResponse>;
|
|
52
|
+
/** Revoke a pending invite. */
|
|
53
|
+
cancelInvite(inviteId: string): Promise<InviteResponse>;
|
|
54
|
+
/** List pending invites attached to a workspace or project resource. */
|
|
55
|
+
getInvitesForResource(resourceId: string, params?: GetInvitesToResourceParams): Promise<InviteResponse[]>;
|
|
56
|
+
/** Accept an invite for the authenticated user. Creates the membership. */
|
|
57
|
+
acceptInvite(inviteId: string): Promise<AcceptInviteResponse>;
|
|
58
|
+
/** Re-send a pending invite email (does not extend or reissue the token). */
|
|
59
|
+
resendInvite(inviteId: string): Promise<InviteResponse>;
|
|
60
|
+
};
|
|
61
|
+
//# sourceMappingURL=invite.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invite.d.ts","sourceRoot":"","sources":["../../src/routes/invite.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EACL,KAAK,MAAM,EACX,KAAK,UAAU,EACf,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC3B,MAAM,eAAe,CAAC;AAIvB,MAAM,MAAM,iBAAiB,CAAC,CAAC,IAAI,CAAC,eAAe,GAAG,qBAAqB,CAAC,GAAG;IAC7E,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;CACf,CAAC;AAGF,MAAM,WAAW,wBAAwB;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb;;0EAEsE;IACtE,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC9B;AAGD,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,UAAU,GAAG,UAAU,CAAC;AAE9D,MAAM,WAAW,qBAAqB;IAClC,UAAU,CAAC,EAAE,KAAK,GAAG,SAAS,GAAG,SAAS,CAAC;IAC3C,MAAM,CAAC,EAAE,YAAY,GAAG,YAAY,EAAE,CAAC;CAC1C;AAED,MAAM,WAAW,0BAA0B;IACvC,MAAM,CAAC,EAAE,YAAY,GAAG,YAAY,EAAE,CAAC;CAC1C;AAGD,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC;AAEpC,MAAM,MAAM,wBAAwB,GAAG,iBAAiB,CAAC,MAAM,CAAC,GAAG;IAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,MAAM,EAAE,CAAC;AACvH,MAAM,MAAM,oBAAoB,GAAG;IAC/B,UAAU,EAAE,UAAU,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,mBAAmB,CAAC,MAAM,EAAE,YAAY;IAE5D;;;OAGG;qBACoB,wBAAwB,GAAG,OAAO,CAAC,cAAc,CAAC;IASzE,6EAA6E;wBACnD,qBAAqB,GAAG,OAAO,CAAC,wBAAwB,CAAC;IASnF;;;;OAIG;4BAC2B,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAS9D,+BAA+B;2BACF,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAS7D,wEAAwE;sCAChC,MAAM,WAAW,0BAA0B,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAU/G,2EAA2E;2BAC9C,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IASnE,6EAA6E;2BAChD,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;EAShE"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Defines invite-related methods for the NuramaClient.
|
|
3
|
+
* @param {NuramaClient} client - The NuramaClient instance.
|
|
4
|
+
* @returns {object} An object containing the invite-related methods.
|
|
5
|
+
*/
|
|
6
|
+
export default function createInviteMethods(client) {
|
|
7
|
+
return {
|
|
8
|
+
/**
|
|
9
|
+
* Invite a user (by email) to a workspace or project at a given role.
|
|
10
|
+
* Triggers an invitation email; the recipient accepts via the link.
|
|
11
|
+
*/
|
|
12
|
+
async inviteUser(data) {
|
|
13
|
+
return client._request({
|
|
14
|
+
method: 'POST',
|
|
15
|
+
endpoint: '/v1/invites',
|
|
16
|
+
body: data,
|
|
17
|
+
sendJWT: true,
|
|
18
|
+
});
|
|
19
|
+
},
|
|
20
|
+
/** List invites the current user has issued (pending, accepted, expired). */
|
|
21
|
+
async getInvites(params) {
|
|
22
|
+
return client._request({
|
|
23
|
+
method: 'GET',
|
|
24
|
+
endpoint: '/v1/invites',
|
|
25
|
+
params: params,
|
|
26
|
+
sendJWT: true,
|
|
27
|
+
});
|
|
28
|
+
},
|
|
29
|
+
/**
|
|
30
|
+
* Look up an invite by id. Public — no auth — so the recipient can
|
|
31
|
+
* preview the invite (target resource, role, inviter) before signing
|
|
32
|
+
* up or logging in.
|
|
33
|
+
*/
|
|
34
|
+
async getInviteById(inviteId) {
|
|
35
|
+
if (!inviteId)
|
|
36
|
+
throw new Error('inviteId is required.');
|
|
37
|
+
return client._request({
|
|
38
|
+
method: 'GET',
|
|
39
|
+
endpoint: `/v1/invites/${inviteId}`,
|
|
40
|
+
sendJWT: false, // Public route - no authentication required
|
|
41
|
+
});
|
|
42
|
+
},
|
|
43
|
+
/** Revoke a pending invite. */
|
|
44
|
+
async cancelInvite(inviteId) {
|
|
45
|
+
if (!inviteId)
|
|
46
|
+
throw new Error('inviteId is required.');
|
|
47
|
+
return client._request({
|
|
48
|
+
method: 'DELETE',
|
|
49
|
+
endpoint: `/v1/invites/${inviteId}`,
|
|
50
|
+
sendJWT: true,
|
|
51
|
+
});
|
|
52
|
+
},
|
|
53
|
+
/** List pending invites attached to a workspace or project resource. */
|
|
54
|
+
async getInvitesForResource(resourceId, params) {
|
|
55
|
+
if (!resourceId)
|
|
56
|
+
throw new Error('resourceId is required.');
|
|
57
|
+
return client._request({
|
|
58
|
+
method: 'GET',
|
|
59
|
+
endpoint: `/v1/invites/resource/${resourceId}`,
|
|
60
|
+
params: params,
|
|
61
|
+
sendJWT: true,
|
|
62
|
+
});
|
|
63
|
+
},
|
|
64
|
+
/** Accept an invite for the authenticated user. Creates the membership. */
|
|
65
|
+
async acceptInvite(inviteId) {
|
|
66
|
+
if (!inviteId)
|
|
67
|
+
throw new Error('inviteId is required.');
|
|
68
|
+
return client._request({
|
|
69
|
+
method: 'POST',
|
|
70
|
+
endpoint: `/v1/invites/accept/${inviteId}`,
|
|
71
|
+
sendJWT: true,
|
|
72
|
+
});
|
|
73
|
+
},
|
|
74
|
+
/** Re-send a pending invite email (does not extend or reissue the token). */
|
|
75
|
+
async resendInvite(inviteId) {
|
|
76
|
+
if (!inviteId)
|
|
77
|
+
throw new Error('inviteId is required.');
|
|
78
|
+
return client._request({
|
|
79
|
+
method: 'POST',
|
|
80
|
+
endpoint: `/v1/invites/resend/${inviteId}`,
|
|
81
|
+
sendJWT: true,
|
|
82
|
+
});
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=invite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invite.js","sourceRoot":"","sources":["../../src/routes/invite.ts"],"names":[],"mappings":"AA+CA;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,mBAAmB,CAAC,MAAoB;IAC9D,OAAO;QACL;;;WAGG;QACH,KAAK,CAAC,UAAU,CAAC,IAA8B;YAC7C,OAAO,MAAM,CAAC,QAAQ,CAAiB;gBACrC,MAAM,EAAE,MAAM;gBACd,QAAQ,EAAE,aAAa;gBACvB,IAAI,EAAE,IAAI;gBACV,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;QACL,CAAC;QAED,6EAA6E;QAC7E,KAAK,CAAC,UAAU,CAAC,MAA8B;YAC7C,OAAO,MAAM,CAAC,QAAQ,CAA2B;gBAC/C,MAAM,EAAE,KAAK;gBACb,QAAQ,EAAE,aAAa;gBACvB,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;QACL,CAAC;QAED;;;;WAIG;QACH,KAAK,CAAC,aAAa,CAAC,QAAgB;YAClC,IAAI,CAAC,QAAQ;gBAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;YACxD,OAAO,MAAM,CAAC,QAAQ,CAAiB;gBACrC,MAAM,EAAE,KAAK;gBACb,QAAQ,EAAE,eAAe,QAAQ,EAAE;gBACnC,OAAO,EAAE,KAAK,EAAE,4CAA4C;aAC7D,CAAC,CAAC;QACL,CAAC;QAED,+BAA+B;QAC/B,KAAK,CAAC,YAAY,CAAC,QAAgB;YACjC,IAAI,CAAC,QAAQ;gBAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;YACxD,OAAO,MAAM,CAAC,QAAQ,CAAiB;gBACrC,MAAM,EAAE,QAAQ;gBAChB,QAAQ,EAAE,eAAe,QAAQ,EAAE;gBACnC,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;QACL,CAAC;QAED,wEAAwE;QACxE,KAAK,CAAC,qBAAqB,CAAC,UAAkB,EAAE,MAAmC;YACjF,IAAI,CAAC,UAAU;gBAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;YAC5D,OAAO,MAAM,CAAC,QAAQ,CAAmB;gBACvC,MAAM,EAAE,KAAK;gBACb,QAAQ,EAAE,wBAAwB,UAAU,EAAE;gBAC9C,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;QACL,CAAC;QAED,2EAA2E;QAC3E,KAAK,CAAC,YAAY,CAAC,QAAgB;YACjC,IAAI,CAAC,QAAQ;gBAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;YACxD,OAAO,MAAM,CAAC,QAAQ,CAAuB;gBAC3C,MAAM,EAAE,MAAM;gBACd,QAAQ,EAAE,sBAAsB,QAAQ,EAAE;gBAC1C,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;QACL,CAAC;QAED,6EAA6E;QAC7E,KAAK,CAAC,YAAY,CAAC,QAAgB;YACjC,IAAI,CAAC,QAAQ;gBAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;YACxD,OAAO,MAAM,CAAC,QAAQ,CAAiB;gBACrC,MAAM,EAAE,MAAM;gBACd,QAAQ,EAAE,sBAAsB,QAAQ,EAAE;gBAC1C,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import NuramaClient from '../NuramaClient.js';
|
|
2
|
+
import { type JoinLink, type JoinLinkPreview, type CreateJoinLinkPayload, type UpdateJoinLinkPayload, type RedeemJoinLinkResult, type ListJoinRequestsResponse, type ListMyJoinRequestsResponse, type ApproveJoinRequestResponse, type RejectJoinRequestRequest, type RejectJoinRequestResponse, type UpdateJoinRequestCooldownRequest, type ProjectJoinRequest, type ListBansResponse, type CreateResourceBanRequest, type ResourceBan } from '@nurama/types';
|
|
3
|
+
export interface GetJoinLinksParams {
|
|
4
|
+
projectId: string;
|
|
5
|
+
}
|
|
6
|
+
export type JoinLinkResponse = JoinLink;
|
|
7
|
+
export interface JoinLinksListResponse {
|
|
8
|
+
results: JoinLink[];
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Defines join-link ("invite link") methods for the NuramaClient. A join link
|
|
12
|
+
* lets people join a project via a shareable URL; management is gated by the
|
|
13
|
+
* caller's grant authority and the workspace plan's per-mode capability
|
|
14
|
+
* (enforced server-side).
|
|
15
|
+
* @param {NuramaClient} client - The NuramaClient instance.
|
|
16
|
+
* @returns {object} An object containing the join-link methods.
|
|
17
|
+
*/
|
|
18
|
+
export default function createJoinLinkMethods(client: NuramaClient): {
|
|
19
|
+
/** Create a join link for a project. */
|
|
20
|
+
createJoinLink(data: CreateJoinLinkPayload): Promise<JoinLinkResponse>;
|
|
21
|
+
/** List a project's join links. */
|
|
22
|
+
getJoinLinks(params: GetJoinLinksParams): Promise<JoinLinksListResponse>;
|
|
23
|
+
/** The queue of people waiting on a decision for this project. */
|
|
24
|
+
getJoinRequests(params: {
|
|
25
|
+
projectId: string;
|
|
26
|
+
}): Promise<ListJoinRequestsResponse>;
|
|
27
|
+
/**
|
|
28
|
+
* The caller's own requests still waiting on a decision.
|
|
29
|
+
*
|
|
30
|
+
* Needs no `projectId`: it is scoped server-side to the caller, who is not
|
|
31
|
+
* a member of the projects they are waiting on and so cannot read those
|
|
32
|
+
* projects' queues.
|
|
33
|
+
*/
|
|
34
|
+
getMyJoinRequests(): Promise<ListMyJoinRequestsResponse>;
|
|
35
|
+
/**
|
|
36
|
+
* Approve a request and admit the person.
|
|
37
|
+
*
|
|
38
|
+
* Seats and the link's remaining uses are re-checked here, not when the
|
|
39
|
+
* request was made — a queue outlives the capacity that existed when it was
|
|
40
|
+
* filled, so approval can legitimately fail on a seat limit.
|
|
41
|
+
*/
|
|
42
|
+
approveJoinRequest(requestId: string, projectId: string): Promise<ApproveJoinRequestResponse>;
|
|
43
|
+
/**
|
|
44
|
+
* Reject a request, optionally barring the person.
|
|
45
|
+
*
|
|
46
|
+
* Passing `ban` is destructive beyond the refusal: a ban REMOVES an existing
|
|
47
|
+
* membership, so it can take away access the person already had in scope.
|
|
48
|
+
* It is a separate field for that reason, never implied by the rejection.
|
|
49
|
+
*/
|
|
50
|
+
rejectJoinRequest(requestId: string, data: RejectJoinRequestRequest): Promise<RejectJoinRequestResponse>;
|
|
51
|
+
/**
|
|
52
|
+
* Change or lift the cooldown on a rejected request.
|
|
53
|
+
*
|
|
54
|
+
* Only a rejected request has one; `reapplyAfter: null` lifts it, letting
|
|
55
|
+
* the person ask again straight away. A barred person is refused — the ban
|
|
56
|
+
* already blocks every path, so lifting that is the action that matters.
|
|
57
|
+
*/
|
|
58
|
+
updateJoinRequestCooldown(requestId: string, data: UpdateJoinRequestCooldownRequest): Promise<ProjectJoinRequest>;
|
|
59
|
+
/**
|
|
60
|
+
* Bar someone, without a request to refuse.
|
|
61
|
+
*
|
|
62
|
+
* Destructive: the ban REMOVES every membership the person holds in its
|
|
63
|
+
* scope, so a `workspace` ban clears them out of every project in it. An
|
|
64
|
+
* owner cannot be barred, and neither can you bar yourself.
|
|
65
|
+
*/
|
|
66
|
+
createResourceBan(data: CreateResourceBanRequest): Promise<ResourceBan>;
|
|
67
|
+
/** People barred from this project, newest first. */
|
|
68
|
+
getResourceBans(params: {
|
|
69
|
+
projectId: string;
|
|
70
|
+
}): Promise<ListBansResponse>;
|
|
71
|
+
/** Lift a ban. It does not restore any membership the ban removed. */
|
|
72
|
+
liftResourceBan(banId: string): Promise<ResourceBan>;
|
|
73
|
+
/** Update a join link's settings (role, mode, domains, expiry, enable/disable). */
|
|
74
|
+
updateJoinLink(linkId: string, data: UpdateJoinLinkPayload): Promise<JoinLinkResponse>;
|
|
75
|
+
/**
|
|
76
|
+
* Rotate a link's token, invalidating the old URL. Optionally reset expiry.
|
|
77
|
+
* Existing memberships are untouched.
|
|
78
|
+
*/
|
|
79
|
+
rollJoinLink(linkId: string, expiresAt?: string | null): Promise<JoinLinkResponse>;
|
|
80
|
+
/**
|
|
81
|
+
* Public preview of a join link by token — no auth — so the join landing
|
|
82
|
+
* page can show "Join <project>" before the visitor signs in.
|
|
83
|
+
*/
|
|
84
|
+
getJoinByToken(token: string): Promise<JoinLinkPreview>;
|
|
85
|
+
/** Redeem a join link for the authenticated user. */
|
|
86
|
+
joinByToken(token: string): Promise<RedeemJoinLinkResult>;
|
|
87
|
+
};
|
|
88
|
+
//# sourceMappingURL=joinLink.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"joinLink.d.ts","sourceRoot":"","sources":["../../src/routes/joinLink.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EACL,KAAK,QAAQ,EACb,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,KAAK,wBAAwB,EAC7B,KAAK,0BAA0B,EAC/B,KAAK,0BAA0B,EAC/B,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,EAC9B,KAAK,gCAAgC,EACrC,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,wBAAwB,EAC7B,KAAK,WAAW,EACjB,MAAM,eAAe,CAAC;AAGvB,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;CACnB;AAGD,MAAM,MAAM,gBAAgB,GAAG,QAAQ,CAAC;AACxC,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,QAAQ,EAAE,CAAC;CACrB;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,OAAO,UAAU,qBAAqB,CAAC,MAAM,EAAE,YAAY;IAE9D,wCAAwC;yBACb,qBAAqB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAS5E,mCAAmC;yBACR,kBAAkB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAU9E,kEAAkE;4BACpC;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAUvF;;;;;;OAMG;yBACwB,OAAO,CAAC,0BAA0B,CAAC;IAQ9D;;;;;;OAMG;kCACiC,MAAM,aAAa,MAAM,GAAG,OAAO,CAAC,0BAA0B,CAAC;IAWnG;;;;;;OAMG;iCACgC,MAAM,QAAQ,wBAAwB,GAAG,OAAO,CAAC,yBAAyB,CAAC;IAW9G;;;;;;OAMG;yCAEU,MAAM,QACX,gCAAgC,GACrC,OAAO,CAAC,kBAAkB,CAAC;IAW9B;;;;;;OAMG;4BAC2B,wBAAwB,GAAG,OAAO,CAAC,WAAW,CAAC;IAY7E,qDAAqD;4BACvB;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAU/E,sEAAsE;2BACzC,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAS1D,mFAAmF;2BACtD,MAAM,QAAQ,qBAAqB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAU5F;;;OAGG;yBACwB,MAAM,cAAc,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAUxF;;;OAGG;0BACyB,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAS7D,qDAAqD;uBAC5B,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;EASlE"}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Defines join-link ("invite link") methods for the NuramaClient. A join link
|
|
3
|
+
* lets people join a project via a shareable URL; management is gated by the
|
|
4
|
+
* caller's grant authority and the workspace plan's per-mode capability
|
|
5
|
+
* (enforced server-side).
|
|
6
|
+
* @param {NuramaClient} client - The NuramaClient instance.
|
|
7
|
+
* @returns {object} An object containing the join-link methods.
|
|
8
|
+
*/
|
|
9
|
+
export default function createJoinLinkMethods(client) {
|
|
10
|
+
return {
|
|
11
|
+
/** Create a join link for a project. */
|
|
12
|
+
async createJoinLink(data) {
|
|
13
|
+
return client._request({
|
|
14
|
+
method: 'POST',
|
|
15
|
+
endpoint: '/v1/join-links',
|
|
16
|
+
body: data,
|
|
17
|
+
sendJWT: true,
|
|
18
|
+
});
|
|
19
|
+
},
|
|
20
|
+
/** List a project's join links. */
|
|
21
|
+
async getJoinLinks(params) {
|
|
22
|
+
if (!params?.projectId)
|
|
23
|
+
throw new Error('projectId is required.');
|
|
24
|
+
return client._request({
|
|
25
|
+
method: 'GET',
|
|
26
|
+
endpoint: '/v1/join-links',
|
|
27
|
+
params,
|
|
28
|
+
sendJWT: true,
|
|
29
|
+
});
|
|
30
|
+
},
|
|
31
|
+
/** The queue of people waiting on a decision for this project. */
|
|
32
|
+
async getJoinRequests(params) {
|
|
33
|
+
if (!params?.projectId)
|
|
34
|
+
throw new Error('projectId is required.');
|
|
35
|
+
return client._request({
|
|
36
|
+
method: 'GET',
|
|
37
|
+
endpoint: '/v1/join-links/requests',
|
|
38
|
+
params,
|
|
39
|
+
sendJWT: true,
|
|
40
|
+
});
|
|
41
|
+
},
|
|
42
|
+
/**
|
|
43
|
+
* The caller's own requests still waiting on a decision.
|
|
44
|
+
*
|
|
45
|
+
* Needs no `projectId`: it is scoped server-side to the caller, who is not
|
|
46
|
+
* a member of the projects they are waiting on and so cannot read those
|
|
47
|
+
* projects' queues.
|
|
48
|
+
*/
|
|
49
|
+
async getMyJoinRequests() {
|
|
50
|
+
return client._request({
|
|
51
|
+
method: 'GET',
|
|
52
|
+
endpoint: '/v1/join-links/requests/mine',
|
|
53
|
+
sendJWT: true,
|
|
54
|
+
});
|
|
55
|
+
},
|
|
56
|
+
/**
|
|
57
|
+
* Approve a request and admit the person.
|
|
58
|
+
*
|
|
59
|
+
* Seats and the link's remaining uses are re-checked here, not when the
|
|
60
|
+
* request was made — a queue outlives the capacity that existed when it was
|
|
61
|
+
* filled, so approval can legitimately fail on a seat limit.
|
|
62
|
+
*/
|
|
63
|
+
async approveJoinRequest(requestId, projectId) {
|
|
64
|
+
if (!requestId)
|
|
65
|
+
throw new Error('requestId is required.');
|
|
66
|
+
if (!projectId)
|
|
67
|
+
throw new Error('projectId is required.');
|
|
68
|
+
return client._request({
|
|
69
|
+
method: 'POST',
|
|
70
|
+
endpoint: `/v1/join-links/requests/${requestId}/approve`,
|
|
71
|
+
body: { projectId },
|
|
72
|
+
sendJWT: true,
|
|
73
|
+
});
|
|
74
|
+
},
|
|
75
|
+
/**
|
|
76
|
+
* Reject a request, optionally barring the person.
|
|
77
|
+
*
|
|
78
|
+
* Passing `ban` is destructive beyond the refusal: a ban REMOVES an existing
|
|
79
|
+
* membership, so it can take away access the person already had in scope.
|
|
80
|
+
* It is a separate field for that reason, never implied by the rejection.
|
|
81
|
+
*/
|
|
82
|
+
async rejectJoinRequest(requestId, data) {
|
|
83
|
+
if (!requestId)
|
|
84
|
+
throw new Error('requestId is required.');
|
|
85
|
+
if (!data?.projectId)
|
|
86
|
+
throw new Error('projectId is required.');
|
|
87
|
+
return client._request({
|
|
88
|
+
method: 'POST',
|
|
89
|
+
endpoint: `/v1/join-links/requests/${requestId}/reject`,
|
|
90
|
+
body: data,
|
|
91
|
+
sendJWT: true,
|
|
92
|
+
});
|
|
93
|
+
},
|
|
94
|
+
/**
|
|
95
|
+
* Change or lift the cooldown on a rejected request.
|
|
96
|
+
*
|
|
97
|
+
* Only a rejected request has one; `reapplyAfter: null` lifts it, letting
|
|
98
|
+
* the person ask again straight away. A barred person is refused — the ban
|
|
99
|
+
* already blocks every path, so lifting that is the action that matters.
|
|
100
|
+
*/
|
|
101
|
+
async updateJoinRequestCooldown(requestId, data) {
|
|
102
|
+
if (!requestId)
|
|
103
|
+
throw new Error('requestId is required.');
|
|
104
|
+
if (!data?.projectId)
|
|
105
|
+
throw new Error('projectId is required.');
|
|
106
|
+
return client._request({
|
|
107
|
+
method: 'PATCH',
|
|
108
|
+
endpoint: `/v1/join-links/requests/${requestId}/cooldown`,
|
|
109
|
+
body: { projectId: data.projectId, reapplyAfter: data.reapplyAfter ?? null },
|
|
110
|
+
sendJWT: true,
|
|
111
|
+
});
|
|
112
|
+
},
|
|
113
|
+
/**
|
|
114
|
+
* Bar someone, without a request to refuse.
|
|
115
|
+
*
|
|
116
|
+
* Destructive: the ban REMOVES every membership the person holds in its
|
|
117
|
+
* scope, so a `workspace` ban clears them out of every project in it. An
|
|
118
|
+
* owner cannot be barred, and neither can you bar yourself.
|
|
119
|
+
*/
|
|
120
|
+
async createResourceBan(data) {
|
|
121
|
+
if (!data?.projectId)
|
|
122
|
+
throw new Error('projectId is required.');
|
|
123
|
+
if (!data?.userId)
|
|
124
|
+
throw new Error('userId is required.');
|
|
125
|
+
if (!data?.scope)
|
|
126
|
+
throw new Error('scope is required.');
|
|
127
|
+
return client._request({
|
|
128
|
+
method: 'POST',
|
|
129
|
+
endpoint: '/v1/join-links/bans',
|
|
130
|
+
body: data,
|
|
131
|
+
sendJWT: true,
|
|
132
|
+
});
|
|
133
|
+
},
|
|
134
|
+
/** People barred from this project, newest first. */
|
|
135
|
+
async getResourceBans(params) {
|
|
136
|
+
if (!params?.projectId)
|
|
137
|
+
throw new Error('projectId is required.');
|
|
138
|
+
return client._request({
|
|
139
|
+
method: 'GET',
|
|
140
|
+
endpoint: '/v1/join-links/bans',
|
|
141
|
+
params,
|
|
142
|
+
sendJWT: true,
|
|
143
|
+
});
|
|
144
|
+
},
|
|
145
|
+
/** Lift a ban. It does not restore any membership the ban removed. */
|
|
146
|
+
async liftResourceBan(banId) {
|
|
147
|
+
if (!banId)
|
|
148
|
+
throw new Error('banId is required.');
|
|
149
|
+
return client._request({
|
|
150
|
+
method: 'DELETE',
|
|
151
|
+
endpoint: `/v1/join-links/bans/${banId}`,
|
|
152
|
+
sendJWT: true,
|
|
153
|
+
});
|
|
154
|
+
},
|
|
155
|
+
/** Update a join link's settings (role, mode, domains, expiry, enable/disable). */
|
|
156
|
+
async updateJoinLink(linkId, data) {
|
|
157
|
+
if (!linkId)
|
|
158
|
+
throw new Error('linkId is required.');
|
|
159
|
+
return client._request({
|
|
160
|
+
method: 'PATCH',
|
|
161
|
+
endpoint: `/v1/join-links/${linkId}`,
|
|
162
|
+
body: data,
|
|
163
|
+
sendJWT: true,
|
|
164
|
+
});
|
|
165
|
+
},
|
|
166
|
+
/**
|
|
167
|
+
* Rotate a link's token, invalidating the old URL. Optionally reset expiry.
|
|
168
|
+
* Existing memberships are untouched.
|
|
169
|
+
*/
|
|
170
|
+
async rollJoinLink(linkId, expiresAt) {
|
|
171
|
+
if (!linkId)
|
|
172
|
+
throw new Error('linkId is required.');
|
|
173
|
+
return client._request({
|
|
174
|
+
method: 'POST',
|
|
175
|
+
endpoint: `/v1/join-links/${linkId}/roll`,
|
|
176
|
+
body: expiresAt !== undefined ? { expiresAt } : {},
|
|
177
|
+
sendJWT: true,
|
|
178
|
+
});
|
|
179
|
+
},
|
|
180
|
+
/**
|
|
181
|
+
* Public preview of a join link by token — no auth — so the join landing
|
|
182
|
+
* page can show "Join <project>" before the visitor signs in.
|
|
183
|
+
*/
|
|
184
|
+
async getJoinByToken(token) {
|
|
185
|
+
if (!token)
|
|
186
|
+
throw new Error('token is required.');
|
|
187
|
+
return client._request({
|
|
188
|
+
method: 'GET',
|
|
189
|
+
endpoint: `/v1/join/${token}`,
|
|
190
|
+
sendJWT: false, // Public route - no authentication required
|
|
191
|
+
});
|
|
192
|
+
},
|
|
193
|
+
/** Redeem a join link for the authenticated user. */
|
|
194
|
+
async joinByToken(token) {
|
|
195
|
+
if (!token)
|
|
196
|
+
throw new Error('token is required.');
|
|
197
|
+
return client._request({
|
|
198
|
+
method: 'POST',
|
|
199
|
+
endpoint: `/v1/join/${token}`,
|
|
200
|
+
sendJWT: true,
|
|
201
|
+
});
|
|
202
|
+
},
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=joinLink.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"joinLink.js","sourceRoot":"","sources":["../../src/routes/joinLink.ts"],"names":[],"mappings":"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"}
|