@tblabs/storage 5.7.3 → 5.8.2
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/Datasets.d.ts +22 -0
- package/Datasets.js +147 -0
- package/IRepos.d.ts +11 -0
- package/IRepos.js +1 -0
- package/OnlineStorage.js +26 -17
- package/index.d.ts +2 -0
- package/index.js +2 -0
- package/package.json +1 -1
- package/tblabs-storage-5.8.2.tgz +0 -0
- package/tblabs-storage-5.7.3.tgz +0 -0
package/Datasets.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { IConverter } from "./IConverter";
|
|
2
|
+
import { IRepos } from "./IRepos";
|
|
3
|
+
import { IStorageUserPrivileges } from "./IStorageUserPrivileges";
|
|
4
|
+
import { OnlineStorage } from "./OnlineStorage";
|
|
5
|
+
import { dir } from "./Types/dir";
|
|
6
|
+
export declare class Datasets<T extends object> implements IRepos<T> {
|
|
7
|
+
private _db;
|
|
8
|
+
private _converter;
|
|
9
|
+
private datasets;
|
|
10
|
+
constructor(_db: OnlineStorage, _converter: IConverter<any, T>, datasets: dir[]);
|
|
11
|
+
get Names(): string[];
|
|
12
|
+
get Database(): OnlineStorage;
|
|
13
|
+
CanUserDo(action: keyof IStorageUserPrivileges): boolean;
|
|
14
|
+
GetOne(dataset: dir, id: string): Promise<T>;
|
|
15
|
+
GetAll(dataset: dir): Promise<T[]>;
|
|
16
|
+
GetAllIds(dataset: dir): Promise<string[]>;
|
|
17
|
+
Add(dataset: dir, id: string, item: T): Promise<void>;
|
|
18
|
+
Update(dataset: dir, id: string, item: T): Promise<void>;
|
|
19
|
+
Move(id: string, sourceDataset: dir, targetDataset: dir): Promise<void>;
|
|
20
|
+
Delete(dataset: dir, id: string): Promise<void>;
|
|
21
|
+
Drop(datasets?: dir[]): Promise<void>;
|
|
22
|
+
}
|
package/Datasets.js
ADDED
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { AddFileCommand } from "./Messages/AddFileCommand";
|
|
2
|
+
import { DeleteFileCommand } from "./Messages/DeleteFileCommand";
|
|
3
|
+
import { DropDatasetCommand } from "./Messages/DropDatasetCommand";
|
|
4
|
+
import { GetFileQuery } from "./Messages/GetFileQuery";
|
|
5
|
+
import { ListFilesIdsQuery } from "./Messages/ListFilesIdsQuery";
|
|
6
|
+
import { ListFilesQuery } from "./Messages/ListFilesQuery";
|
|
7
|
+
import { MoveFileCommand } from "./Messages/MoveFileCommand";
|
|
8
|
+
import { UpdateFileCommand } from "./Messages/UpdateFileCommand";
|
|
9
|
+
export class Datasets {
|
|
10
|
+
_db;
|
|
11
|
+
_converter;
|
|
12
|
+
datasets;
|
|
13
|
+
constructor(_db, _converter, datasets) {
|
|
14
|
+
this._db = _db;
|
|
15
|
+
this._converter = _converter;
|
|
16
|
+
this.datasets = datasets;
|
|
17
|
+
if (datasets.length <= 1) {
|
|
18
|
+
throw new Error("Datasets must have at least 2 datasets. If one - use Dataset<T> instead.");
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
get Names() {
|
|
22
|
+
return this.datasets;
|
|
23
|
+
}
|
|
24
|
+
get Database() {
|
|
25
|
+
return this._db;
|
|
26
|
+
}
|
|
27
|
+
CanUserDo(action) {
|
|
28
|
+
if (!this._db.User.Privileges) {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
const privilege = this._db.User.Privileges[action];
|
|
32
|
+
if (!privilege) {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
// ex. AddFile: { Datasets: "all" } or AddFile: { Datasets: ["Public"] }
|
|
36
|
+
if (typeof privilege === "object") {
|
|
37
|
+
const allowedDatasets = privilege.Datasets;
|
|
38
|
+
// ex. AddFile: { Datasets: "all" }
|
|
39
|
+
if (typeof allowedDatasets === "string") {
|
|
40
|
+
if (allowedDatasets == "all") {
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
else if (allowedDatasets == "none") {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// ex. AddFile: { Datasets: ["Public"] }
|
|
51
|
+
else if (typeof allowedDatasets === "object") {
|
|
52
|
+
if (Array.isArray(allowedDatasets)) {
|
|
53
|
+
for (const dataset of this.datasets) {
|
|
54
|
+
if (allowedDatasets.includes(dataset)) {
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// ex. CreateUser: true
|
|
63
|
+
else if (typeof privilege === "boolean") {
|
|
64
|
+
return privilege;
|
|
65
|
+
}
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
async GetOne(dataset, id) {
|
|
69
|
+
this._db.Log(`Fetching "${id}" from "${dataset}"...`);
|
|
70
|
+
const queryResult = await this._db.Send(new GetFileQuery(this._db.DatabaseDir, dataset, id));
|
|
71
|
+
if (!queryResult.IsSuccess) {
|
|
72
|
+
throw new Error("Failed to get one item: " + queryResult.ErrorMessage);
|
|
73
|
+
}
|
|
74
|
+
const rawItem = queryResult.Result;
|
|
75
|
+
const item = this._converter.FromRaw(rawItem);
|
|
76
|
+
this._db.Log(`Fetched "${id}" from "${dataset}".`);
|
|
77
|
+
return item;
|
|
78
|
+
}
|
|
79
|
+
async GetAll(dataset) {
|
|
80
|
+
this._db.Log(`Fetching all from "${dataset}"...`);
|
|
81
|
+
const queryResult = await this._db.Send(new ListFilesQuery(this._db.DatabaseDir, dataset));
|
|
82
|
+
if (!queryResult.IsSuccess) {
|
|
83
|
+
throw new Error("Failed to fetch all items: " + queryResult.ErrorMessage);
|
|
84
|
+
}
|
|
85
|
+
const rawItems = queryResult.Result;
|
|
86
|
+
const items = rawItems.map((raw) => this._converter.FromRaw(raw));
|
|
87
|
+
this._db.Log(`Fetched ${items.length} items from "${dataset}".`);
|
|
88
|
+
return items;
|
|
89
|
+
}
|
|
90
|
+
async GetAllIds(dataset) {
|
|
91
|
+
this._db.Log(`Fetching all files IDs from "${dataset}"...`);
|
|
92
|
+
const queryResult = await this._db.Send(new ListFilesIdsQuery(this._db.DatabaseDir, dataset));
|
|
93
|
+
if (!queryResult.IsSuccess) {
|
|
94
|
+
throw new Error("Failed to fetch all items ids: " + queryResult.ErrorMessage);
|
|
95
|
+
}
|
|
96
|
+
const ids = queryResult.Result;
|
|
97
|
+
this._db.Log(`Found ${ids.length} files in "${dataset}".`);
|
|
98
|
+
return ids;
|
|
99
|
+
}
|
|
100
|
+
async Add(dataset, id, item) {
|
|
101
|
+
this._db.Log(`Adding "${id}" to "${dataset}"...`);
|
|
102
|
+
const rawItem = this._converter.ToRaw(item);
|
|
103
|
+
const result = await this._db.Send(new AddFileCommand(this._db.DatabaseDir, dataset, id, rawItem));
|
|
104
|
+
if (!result.IsSuccess) {
|
|
105
|
+
throw new Error("Failed to add item: " + result.ErrorMessage);
|
|
106
|
+
}
|
|
107
|
+
this._db.Log(`"${id}" added to "${dataset}".`);
|
|
108
|
+
}
|
|
109
|
+
;
|
|
110
|
+
async Update(dataset, id, item) {
|
|
111
|
+
this._db.Log(`Updating "${id}"...`);
|
|
112
|
+
const rawItem = this._converter.ToRaw(item);
|
|
113
|
+
const result = await this._db.Send(new UpdateFileCommand(this._db.DatabaseDir, dataset, id, rawItem));
|
|
114
|
+
if (!result.IsSuccess) {
|
|
115
|
+
throw new Error("Failed to update item: " + result.ErrorMessage);
|
|
116
|
+
}
|
|
117
|
+
this._db.Log(`"${id}" updated in "${dataset}".`);
|
|
118
|
+
}
|
|
119
|
+
;
|
|
120
|
+
async Move(id, sourceDataset, targetDataset) {
|
|
121
|
+
this._db.Log(`Moving "${id}" from "${sourceDataset}" to "${targetDataset}"...`);
|
|
122
|
+
const result = await this._db.Send(new MoveFileCommand(this._db.DatabaseDir, id, sourceDataset, targetDataset));
|
|
123
|
+
if (!result.IsSuccess) {
|
|
124
|
+
throw new Error("Failed to move item: " + result.ErrorMessage);
|
|
125
|
+
}
|
|
126
|
+
this._db.Log(`"${id}" moved from "${sourceDataset}" to "${targetDataset}".`);
|
|
127
|
+
}
|
|
128
|
+
async Delete(dataset, id) {
|
|
129
|
+
this._db.Log(`Deleting "${id}" from "${dataset}"...`);
|
|
130
|
+
const result = await this._db.Send(new DeleteFileCommand(this._db.DatabaseDir, dataset, id));
|
|
131
|
+
if (!result.IsSuccess) {
|
|
132
|
+
throw new Error("Failed to delete item: " + result.ErrorMessage);
|
|
133
|
+
}
|
|
134
|
+
this._db.Log(`Deleted "${id}" from "${dataset}".`);
|
|
135
|
+
}
|
|
136
|
+
async Drop(datasets) {
|
|
137
|
+
this._db.Log(`Dropping "${(datasets ? datasets.join(", ") : "all")}" datasets...`);
|
|
138
|
+
for (const dataset of datasets ?? this.datasets) {
|
|
139
|
+
const result = await this._db.Send(new DropDatasetCommand(this._db.DatabaseDir, dataset));
|
|
140
|
+
if (!result.IsSuccess) {
|
|
141
|
+
throw new Error("Failed to drop dataset: " + result.ErrorMessage);
|
|
142
|
+
}
|
|
143
|
+
this._db.Log(`"${dataset}" dropped.`);
|
|
144
|
+
}
|
|
145
|
+
;
|
|
146
|
+
}
|
|
147
|
+
}
|
package/IRepos.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { IStorageUserPrivileges } from "./IStorageUserPrivileges";
|
|
2
|
+
export interface IRepos<T> {
|
|
3
|
+
CanUserDo(action: keyof IStorageUserPrivileges): boolean;
|
|
4
|
+
Add(dataset: string, id: string, item: T): Promise<void>;
|
|
5
|
+
GetAll(dataset: string): Promise<T[]>;
|
|
6
|
+
GetOne(dataset: string, id: string): Promise<T | null>;
|
|
7
|
+
Update(dataset: string, id: string, item: T): Promise<void>;
|
|
8
|
+
Delete(dataset: string, id: string): Promise<void>;
|
|
9
|
+
Drop(datasets?: string[]): Promise<void>;
|
|
10
|
+
Move(id: string, sourceDataset: string, targetDataset: string): Promise<void>;
|
|
11
|
+
}
|
package/IRepos.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/OnlineStorage.js
CHANGED
|
@@ -57,39 +57,48 @@ export class OnlineStorage {
|
|
|
57
57
|
async ListDatasets() {
|
|
58
58
|
const result = await this._bus.SendMessage(new ListDatasetsQuery(this.DatabaseDir));
|
|
59
59
|
if (!result.IsSuccess) {
|
|
60
|
-
throw new Error(`
|
|
60
|
+
throw new Error(`Failed to list datasets: ${result.ErrorMessage}`);
|
|
61
61
|
}
|
|
62
62
|
return result.Result;
|
|
63
63
|
}
|
|
64
64
|
async ListUsers() {
|
|
65
65
|
const result = await this._bus.SendMessage(new ListUsersQuery(this.DatabaseDir));
|
|
66
66
|
if (!result.IsSuccess) {
|
|
67
|
-
throw new Error(`
|
|
67
|
+
throw new Error(`Failed to list users: ${result.ErrorMessage}`);
|
|
68
68
|
}
|
|
69
69
|
return result.Result;
|
|
70
70
|
}
|
|
71
71
|
async GetUser(userId) {
|
|
72
72
|
const result = await this._bus.SendMessage(new GetUserQuery(this.DatabaseDir, userId));
|
|
73
73
|
if (!result.IsSuccess) {
|
|
74
|
-
throw new Error(`
|
|
74
|
+
throw new Error(`Failed to get user: ${result.ErrorMessage}`);
|
|
75
75
|
}
|
|
76
76
|
return result.Result;
|
|
77
77
|
}
|
|
78
78
|
async AddUser(user) {
|
|
79
79
|
this.Log(`Adding user "${user.Id}"...`);
|
|
80
|
-
await this._bus.SendMessage(new AddUserCommand(this.DatabaseDir, user));
|
|
80
|
+
const result = await this._bus.SendMessage(new AddUserCommand(this.DatabaseDir, user));
|
|
81
|
+
if (!result.IsSuccess) {
|
|
82
|
+
throw new Error("Failed to add user: " + result.ErrorMessage);
|
|
83
|
+
}
|
|
81
84
|
this.Log(`User "${user.Id}" added.`);
|
|
82
85
|
}
|
|
83
86
|
;
|
|
84
87
|
async UpdateUser(user) {
|
|
85
88
|
this.Log(`Updating user "${user.Id}"...`);
|
|
86
|
-
await this._bus.SendMessage(new UpdateUserCommand(this.DatabaseDir, user));
|
|
89
|
+
const result = await this._bus.SendMessage(new UpdateUserCommand(this.DatabaseDir, user));
|
|
90
|
+
if (!result.IsSuccess) {
|
|
91
|
+
throw new Error("Failed to update user: " + result.ErrorMessage);
|
|
92
|
+
}
|
|
87
93
|
this.Log(`User "${user.Id}" updated.`);
|
|
88
94
|
}
|
|
89
95
|
;
|
|
90
96
|
async DeleteUser(user) {
|
|
91
97
|
this.Log(`Deleting user "${user.Id}"...`);
|
|
92
|
-
await this._bus.SendMessage(new DeleteUserCommand(this.DatabaseDir, user.Id));
|
|
98
|
+
const result = await this._bus.SendMessage(new DeleteUserCommand(this.DatabaseDir, user.Id));
|
|
99
|
+
if (!result.IsSuccess) {
|
|
100
|
+
throw new Error("Failed to delete user: " + result.ErrorMessage);
|
|
101
|
+
}
|
|
93
102
|
this.Log(`User "${user.Id}" deleted.`);
|
|
94
103
|
}
|
|
95
104
|
;
|
|
@@ -116,7 +125,7 @@ export class OnlineStorage {
|
|
|
116
125
|
async Login(password, login) {
|
|
117
126
|
const result = await this._bus.SendMessage(new LoginUserQuery(this.DatabaseDir, password, login));
|
|
118
127
|
if (!result.IsSuccess) {
|
|
119
|
-
throw new Error(`
|
|
128
|
+
throw new Error(`Failed to login: ${result.ErrorMessage}`);
|
|
120
129
|
}
|
|
121
130
|
this.user = result.Result || this.ANONYMOUS_USER;
|
|
122
131
|
this.SetUser(this.user);
|
|
@@ -200,7 +209,7 @@ export class OnlineStorage {
|
|
|
200
209
|
this.Log(`Creating dataset "${datasetName}"...`);
|
|
201
210
|
const result = await this._bus.SendMessage(new CreateDatasetCommand(this.DatabaseDir, datasetName));
|
|
202
211
|
if (!result.IsSuccess) {
|
|
203
|
-
throw new Error(`
|
|
212
|
+
throw new Error(`Failed to add dataset: ${result.ErrorMessage}`);
|
|
204
213
|
}
|
|
205
214
|
this.Log(`Dataset "${datasetName}" created.`);
|
|
206
215
|
}
|
|
@@ -208,7 +217,7 @@ export class OnlineStorage {
|
|
|
208
217
|
this.Log(`Checking if dataset "${datasetName}" exists...`);
|
|
209
218
|
const result = await this._bus.SendMessage(new DatasetExistsCommand(this.DatabaseDir, datasetName));
|
|
210
219
|
if (!result.IsSuccess) {
|
|
211
|
-
throw new Error(`
|
|
220
|
+
throw new Error(`Failed to check if dataset exists: ${result.ErrorMessage}`);
|
|
212
221
|
}
|
|
213
222
|
this.Log(`Dataset "${datasetName}" ${result.Result ? "exists" : "does not exist"}.`);
|
|
214
223
|
return result.Result;
|
|
@@ -217,7 +226,7 @@ export class OnlineStorage {
|
|
|
217
226
|
this.Log(`Removing dataset "${datasetName}"...`);
|
|
218
227
|
const result = await this._bus.SendMessage(new RemoveDatasetCommand(this.DatabaseDir, datasetName));
|
|
219
228
|
if (!result.IsSuccess) {
|
|
220
|
-
throw new Error(`
|
|
229
|
+
throw new Error(`Failed to remove dataset: ${result.ErrorMessage}`);
|
|
221
230
|
}
|
|
222
231
|
this.Log(`Dataset "${datasetName}" removed.`);
|
|
223
232
|
}
|
|
@@ -225,21 +234,21 @@ export class OnlineStorage {
|
|
|
225
234
|
this.Log(`Moving "${fileId}" from "${sourceDataset.Name}" to "${targetDataset.Name}"...`);
|
|
226
235
|
const result = await this._bus.SendMessage(new MoveFileCommand(this.DatabaseDir, fileId, sourceDataset.Name, targetDataset.Name));
|
|
227
236
|
if (!result.IsSuccess) {
|
|
228
|
-
throw new Error(`
|
|
237
|
+
throw new Error(`Failed to move "${fileId}" from "${sourceDataset.Name}" to "${targetDataset.Name}": ${result.ErrorMessage}`);
|
|
229
238
|
}
|
|
230
239
|
this.Log(`"${fileId}" moved from "${sourceDataset.Name}" to "${targetDataset.Name}".`);
|
|
231
240
|
}
|
|
232
241
|
async GetLogsList() {
|
|
233
242
|
const result = await this._bus.SendMessage(new ListLogsIdsQuery(this.DatabaseDir));
|
|
234
243
|
if (!result.IsSuccess) {
|
|
235
|
-
throw new Error(`
|
|
244
|
+
throw new Error(`Failed to get logs list: ${result.ErrorMessage}`);
|
|
236
245
|
}
|
|
237
246
|
return result.Result;
|
|
238
247
|
}
|
|
239
248
|
async GetLog(id) {
|
|
240
249
|
const result = await this._bus.SendMessage(new GetLogQuery(this.DatabaseDir, id));
|
|
241
250
|
if (!result.IsSuccess) {
|
|
242
|
-
throw new Error(`
|
|
251
|
+
throw new Error(`Failed to get log '${id}': ${result.ErrorMessage}`);
|
|
243
252
|
}
|
|
244
253
|
return result.Result;
|
|
245
254
|
}
|
|
@@ -258,7 +267,7 @@ export class OnlineStorage {
|
|
|
258
267
|
// const result = await this._bus.SendMessage(new SearchQuery(this.DatabaseDir, fileId));
|
|
259
268
|
// if (!result.IsSuccess)
|
|
260
269
|
// {
|
|
261
|
-
// throw new Error(`
|
|
270
|
+
// throw new Error(`Failed to find "${fileId}": ${result.ErrorMessage}`);
|
|
262
271
|
// }
|
|
263
272
|
// const datasetName = result.Result.Dataset;
|
|
264
273
|
// const dataset = this.GetDataset<T>(datasetName, converter); ?????????
|
|
@@ -268,20 +277,20 @@ export class OnlineStorage {
|
|
|
268
277
|
async ListDatabases() {
|
|
269
278
|
const result = await this._bus.SendMessage(new ListDatabasesQuery());
|
|
270
279
|
if (!result.IsSuccess) {
|
|
271
|
-
throw new Error(`
|
|
280
|
+
throw new Error(`Failed to list databases: ${result.ErrorMessage}`);
|
|
272
281
|
}
|
|
273
282
|
return result.Result;
|
|
274
283
|
}
|
|
275
284
|
async CreateDatabase(databaseDir) {
|
|
276
285
|
const result = await this._bus.SendMessage(new CreateDatabaseCommand(databaseDir));
|
|
277
286
|
if (!result.IsSuccess) {
|
|
278
|
-
throw new Error(`
|
|
287
|
+
throw new Error(`Failed to create database: ${result.ErrorMessage}`);
|
|
279
288
|
}
|
|
280
289
|
}
|
|
281
290
|
async DeleteDatabase(databaseDir) {
|
|
282
291
|
const result = await this._bus.SendMessage(new DeleteDatabaseCommand(databaseDir));
|
|
283
292
|
if (!result.IsSuccess) {
|
|
284
|
-
throw new Error(`
|
|
293
|
+
throw new Error(`Failed to delete database: ${result.ErrorMessage}`);
|
|
285
294
|
}
|
|
286
295
|
}
|
|
287
296
|
CanUser(action) {
|
package/index.d.ts
CHANGED
|
@@ -5,6 +5,8 @@ export * from "./IStorageUser";
|
|
|
5
5
|
export * from "./IConverter";
|
|
6
6
|
export * from "./Converter";
|
|
7
7
|
export * from "./IRepo";
|
|
8
|
+
export * from "./IRepos";
|
|
8
9
|
export * from "./Dataset";
|
|
10
|
+
export * from "./Datasets";
|
|
9
11
|
export * from "./OnlineStorage";
|
|
10
12
|
export * from "./Utils/OperationRepeater";
|
package/index.js
CHANGED
|
@@ -5,6 +5,8 @@ export * from "./IStorageUser";
|
|
|
5
5
|
export * from "./IConverter";
|
|
6
6
|
export * from "./Converter";
|
|
7
7
|
export * from "./IRepo";
|
|
8
|
+
export * from "./IRepos";
|
|
8
9
|
export * from "./Dataset";
|
|
10
|
+
export * from "./Datasets";
|
|
9
11
|
export * from "./OnlineStorage";
|
|
10
12
|
export * from "./Utils/OperationRepeater";
|
package/package.json
CHANGED
|
Binary file
|
package/tblabs-storage-5.7.3.tgz
DELETED
|
Binary file
|