@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 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(`Could not list datasets: ${result.ErrorMessage}`);
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(`Could not list users: ${result.ErrorMessage}`);
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(`Could not get user: ${result.ErrorMessage}`);
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(`Could not login: ${result.ErrorMessage}`);
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(`Could not add dataset: ${result.ErrorMessage}`);
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(`Could not check if dataset exists: ${result.ErrorMessage}`);
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(`Could not remove dataset: ${result.ErrorMessage}`);
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(`Could not move "${fileId}" from "${sourceDataset.Name}" to "${targetDataset.Name}": ${result.ErrorMessage}`);
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(`Could not get logs list: ${result.ErrorMessage}`);
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(`Could not get log '${id}': ${result.ErrorMessage}`);
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(`Could not find "${fileId}": ${result.ErrorMessage}`);
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(`Could not list databases: ${result.ErrorMessage}`);
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(`Could not create database: ${result.ErrorMessage}`);
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(`Could not delete database: ${result.ErrorMessage}`);
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tblabs/storage",
3
- "version": "5.7.3",
3
+ "version": "5.8.2",
4
4
  "description": "online storage module with auth",
5
5
  "license": "beerware",
6
6
  "main": "index.js",
Binary file
Binary file