appwrite-utils-cli 0.9.4 → 0.9.5
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 +1 -0
- package/dist/storage/methods.d.ts +1 -0
- package/dist/storage/methods.js +46 -0
- package/dist/utilsController.d.ts +1 -0
- package/dist/utilsController.js +11 -1
- package/package.json +1 -1
- package/src/storage/methods.ts +65 -0
- package/src/utilsController.ts +14 -0
package/README.md
CHANGED
@@ -124,6 +124,7 @@ This updated CLI ensures that developers have robust tools at their fingertips t
|
|
124
124
|
|
125
125
|
## Changelog
|
126
126
|
|
127
|
+
- 0.9.5: Fixed not checking for storage bucket for each database (checking the creation status) when importing data
|
127
128
|
- 0.9.4: Fixed migrations database ensuring it has the required collections
|
128
129
|
- 0.9.3: Fixed deployment error && fix lack of existing `appwriteConfig.ts` file from causing error (you want to be able to setup yeah? haha)
|
129
130
|
- 0.9.2: Added changelog back, whoops
|
@@ -9,6 +9,7 @@ export declare const deleteBucket: (storage: Storage, bucketId: string) => Promi
|
|
9
9
|
export declare const getFile: (storage: Storage, bucketId: string, fileId: string) => Promise<Models.File>;
|
10
10
|
export declare const listFiles: (storage: Storage, bucketId: string, queries?: string[], search?: string) => Promise<Models.FileList>;
|
11
11
|
export declare const deleteFile: (storage: Storage, bucketId: string, fileId: string) => Promise<{}>;
|
12
|
+
export declare const ensureDatabaseConfigBucketsExist: (storage: Storage, config: AppwriteConfig, databases?: Models.Database[]) => Promise<void>;
|
12
13
|
export declare const wipeDocumentStorage: (storage: Storage, bucketId: string) => Promise<void>;
|
13
14
|
export declare const initOrGetDocumentStorage: (storage: Storage, config: AppwriteConfig, dbId: string, bucketName?: string) => Promise<Models.Bucket>;
|
14
15
|
export declare const initOrGetBackupStorage: (config: AppwriteConfig, storage: Storage) => Promise<Models.Bucket>;
|
package/dist/storage/methods.js
CHANGED
@@ -34,6 +34,52 @@ export const listFiles = async (storage, bucketId, queries, search) => {
|
|
34
34
|
export const deleteFile = async (storage, bucketId, fileId) => {
|
35
35
|
return await storage.deleteFile(bucketId, fileId);
|
36
36
|
};
|
37
|
+
export const ensureDatabaseConfigBucketsExist = async (storage, config, databases = []) => {
|
38
|
+
for (const db of databases) {
|
39
|
+
const database = config.databases?.find((d) => d.$id === db.$id);
|
40
|
+
if (database?.bucket) {
|
41
|
+
try {
|
42
|
+
await storage.getBucket(database.bucket.$id);
|
43
|
+
console.log(`Bucket ${database.bucket.$id} already exists.`);
|
44
|
+
}
|
45
|
+
catch (e) {
|
46
|
+
const permissions = [];
|
47
|
+
if (database.bucket.permissions &&
|
48
|
+
database.bucket.permissions.length > 0) {
|
49
|
+
for (const permission of database.bucket.permissions) {
|
50
|
+
switch (permission.permission) {
|
51
|
+
case "read":
|
52
|
+
permissions.push(Permission.read(permission.target));
|
53
|
+
break;
|
54
|
+
case "create":
|
55
|
+
permissions.push(Permission.create(permission.target));
|
56
|
+
break;
|
57
|
+
case "update":
|
58
|
+
permissions.push(Permission.update(permission.target));
|
59
|
+
break;
|
60
|
+
case "delete":
|
61
|
+
permissions.push(Permission.delete(permission.target));
|
62
|
+
break;
|
63
|
+
case "write":
|
64
|
+
permissions.push(Permission.write(permission.target));
|
65
|
+
break;
|
66
|
+
default:
|
67
|
+
console.warn(`Unknown permission: ${permission.permission}`);
|
68
|
+
break;
|
69
|
+
}
|
70
|
+
}
|
71
|
+
}
|
72
|
+
try {
|
73
|
+
await storage.createBucket(database.bucket.$id, database.bucket.name, permissions, database.bucket.fileSecurity, database.bucket.enabled, database.bucket.maximumFileSize, database.bucket.allowedFileExtensions, database.bucket.compression, database.bucket.encryption, database.bucket.antivirus);
|
74
|
+
console.log(`Bucket ${database.bucket.$id} created successfully.`);
|
75
|
+
}
|
76
|
+
catch (createError) {
|
77
|
+
console.error(`Failed to create bucket ${database.bucket.$id}:`, createError);
|
78
|
+
}
|
79
|
+
}
|
80
|
+
}
|
81
|
+
}
|
82
|
+
};
|
37
83
|
export const wipeDocumentStorage = async (storage, bucketId) => {
|
38
84
|
console.log(`Wiping storage for bucket ID: ${bucketId}`);
|
39
85
|
let moreFiles = true;
|
@@ -27,6 +27,7 @@ export declare class UtilsController {
|
|
27
27
|
constructor(currentUserDir: string);
|
28
28
|
init(): Promise<void>;
|
29
29
|
setupMigrationDatabase(): Promise<void>;
|
30
|
+
ensureDatabaseConfigBucketsExist(databases?: Models.Database[]): Promise<void>;
|
30
31
|
ensureDatabasesExist(databases?: Models.Database[]): Promise<void>;
|
31
32
|
getDatabasesByIds(ids: string[]): Promise<Models.Database[]>;
|
32
33
|
wipeOtherDatabases(databasesToKeep: Models.Database[]): Promise<void>;
|
package/dist/utilsController.js
CHANGED
@@ -7,7 +7,7 @@ import { ImportController } from "./migrations/importController.js";
|
|
7
7
|
import { ImportDataActions } from "./migrations/importDataActions.js";
|
8
8
|
import { setupMigrationDatabase, ensureDatabasesExist, wipeOtherDatabases, } from "./migrations/setupDatabase.js";
|
9
9
|
import { createOrUpdateCollections, wipeDatabase, generateSchemas, fetchAllCollections, } from "./collections/methods.js";
|
10
|
-
import { backupDatabase, initOrGetBackupStorage, wipeDocumentStorage, } from "./storage/methods.js";
|
10
|
+
import { backupDatabase, ensureDatabaseConfigBucketsExist, initOrGetBackupStorage, wipeDocumentStorage, } from "./storage/methods.js";
|
11
11
|
import path from "path";
|
12
12
|
import { converterFunctions, validationRules, } from "appwrite-utils";
|
13
13
|
import { afterImportActions } from "./migrations/afterImportActions.js";
|
@@ -59,11 +59,20 @@ export class UtilsController {
|
|
59
59
|
throw new Error("Config not initialized");
|
60
60
|
await setupMigrationDatabase(this.config);
|
61
61
|
}
|
62
|
+
async ensureDatabaseConfigBucketsExist(databases = []) {
|
63
|
+
await this.init();
|
64
|
+
if (!this.storage)
|
65
|
+
throw new Error("Storage not initialized");
|
66
|
+
if (!this.config)
|
67
|
+
throw new Error("Config not initialized");
|
68
|
+
await ensureDatabaseConfigBucketsExist(this.storage, this.config, databases);
|
69
|
+
}
|
62
70
|
async ensureDatabasesExist(databases) {
|
63
71
|
await this.init();
|
64
72
|
if (!this.config)
|
65
73
|
throw new Error("Config not initialized");
|
66
74
|
await this.setupMigrationDatabase();
|
75
|
+
await this.ensureDatabaseConfigBucketsExist(databases);
|
67
76
|
await ensureDatabasesExist(this.config);
|
68
77
|
}
|
69
78
|
async getDatabasesByIds(ids) {
|
@@ -153,6 +162,7 @@ export class UtilsController {
|
|
153
162
|
throw new Error("Database not initialized");
|
154
163
|
const databases = await fetchAllDatabases(this.database);
|
155
164
|
await this.ensureDatabasesExist(databases);
|
165
|
+
await this.ensureDatabaseConfigBucketsExist(databases);
|
156
166
|
await this.createOrUpdateCollectionsForDatabases(databases);
|
157
167
|
}
|
158
168
|
getAppwriteFolderPath() {
|
package/package.json
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
{
|
2
2
|
"name": "appwrite-utils-cli",
|
3
3
|
"description": "Appwrite Utility Functions to help with database management, data conversion, data import, migrations, and much more. Meant to be used as a CLI tool, I do not recommend installing this in frontend environments.",
|
4
|
-
"version": "0.9.
|
4
|
+
"version": "0.9.5",
|
5
5
|
"main": "src/main.ts",
|
6
6
|
"type": "module",
|
7
7
|
"repository": {
|
package/src/storage/methods.ts
CHANGED
@@ -100,6 +100,71 @@ export const deleteFile = async (
|
|
100
100
|
return await storage.deleteFile(bucketId, fileId);
|
101
101
|
};
|
102
102
|
|
103
|
+
export const ensureDatabaseConfigBucketsExist = async (
|
104
|
+
storage: Storage,
|
105
|
+
config: AppwriteConfig,
|
106
|
+
databases: Models.Database[] = []
|
107
|
+
) => {
|
108
|
+
for (const db of databases) {
|
109
|
+
const database = config.databases?.find((d) => d.$id === db.$id);
|
110
|
+
if (database?.bucket) {
|
111
|
+
try {
|
112
|
+
await storage.getBucket(database.bucket.$id);
|
113
|
+
console.log(`Bucket ${database.bucket.$id} already exists.`);
|
114
|
+
} catch (e) {
|
115
|
+
const permissions: string[] = [];
|
116
|
+
if (
|
117
|
+
database.bucket.permissions &&
|
118
|
+
database.bucket.permissions.length > 0
|
119
|
+
) {
|
120
|
+
for (const permission of database.bucket.permissions) {
|
121
|
+
switch (permission.permission) {
|
122
|
+
case "read":
|
123
|
+
permissions.push(Permission.read(permission.target));
|
124
|
+
break;
|
125
|
+
case "create":
|
126
|
+
permissions.push(Permission.create(permission.target));
|
127
|
+
break;
|
128
|
+
case "update":
|
129
|
+
permissions.push(Permission.update(permission.target));
|
130
|
+
break;
|
131
|
+
case "delete":
|
132
|
+
permissions.push(Permission.delete(permission.target));
|
133
|
+
break;
|
134
|
+
case "write":
|
135
|
+
permissions.push(Permission.write(permission.target));
|
136
|
+
break;
|
137
|
+
default:
|
138
|
+
console.warn(`Unknown permission: ${permission.permission}`);
|
139
|
+
break;
|
140
|
+
}
|
141
|
+
}
|
142
|
+
}
|
143
|
+
try {
|
144
|
+
await storage.createBucket(
|
145
|
+
database.bucket.$id,
|
146
|
+
database.bucket.name,
|
147
|
+
permissions,
|
148
|
+
database.bucket.fileSecurity,
|
149
|
+
database.bucket.enabled,
|
150
|
+
database.bucket.maximumFileSize,
|
151
|
+
database.bucket.allowedFileExtensions,
|
152
|
+
database.bucket.compression as Compression,
|
153
|
+
database.bucket.encryption,
|
154
|
+
database.bucket.antivirus
|
155
|
+
);
|
156
|
+
console.log(`Bucket ${database.bucket.$id} created successfully.`);
|
157
|
+
} catch (createError) {
|
158
|
+
console.error(
|
159
|
+
`Failed to create bucket ${database.bucket.$id}:`,
|
160
|
+
createError
|
161
|
+
);
|
162
|
+
}
|
163
|
+
}
|
164
|
+
}
|
165
|
+
}
|
166
|
+
};
|
167
|
+
|
103
168
|
export const wipeDocumentStorage = async (
|
104
169
|
storage: Storage,
|
105
170
|
bucketId: string
|
package/src/utilsController.ts
CHANGED
@@ -18,6 +18,7 @@ import {
|
|
18
18
|
} from "./collections/methods.js";
|
19
19
|
import {
|
20
20
|
backupDatabase,
|
21
|
+
ensureDatabaseConfigBucketsExist,
|
21
22
|
initOrGetBackupStorage,
|
22
23
|
wipeDocumentStorage,
|
23
24
|
} from "./storage/methods.js";
|
@@ -101,10 +102,22 @@ export class UtilsController {
|
|
101
102
|
await setupMigrationDatabase(this.config);
|
102
103
|
}
|
103
104
|
|
105
|
+
async ensureDatabaseConfigBucketsExist(databases: Models.Database[] = []) {
|
106
|
+
await this.init();
|
107
|
+
if (!this.storage) throw new Error("Storage not initialized");
|
108
|
+
if (!this.config) throw new Error("Config not initialized");
|
109
|
+
await ensureDatabaseConfigBucketsExist(
|
110
|
+
this.storage,
|
111
|
+
this.config,
|
112
|
+
databases
|
113
|
+
);
|
114
|
+
}
|
115
|
+
|
104
116
|
async ensureDatabasesExist(databases?: Models.Database[]) {
|
105
117
|
await this.init();
|
106
118
|
if (!this.config) throw new Error("Config not initialized");
|
107
119
|
await this.setupMigrationDatabase();
|
120
|
+
await this.ensureDatabaseConfigBucketsExist(databases);
|
108
121
|
await ensureDatabasesExist(this.config);
|
109
122
|
}
|
110
123
|
|
@@ -231,6 +244,7 @@ export class UtilsController {
|
|
231
244
|
if (!this.database) throw new Error("Database not initialized");
|
232
245
|
const databases = await fetchAllDatabases(this.database);
|
233
246
|
await this.ensureDatabasesExist(databases);
|
247
|
+
await this.ensureDatabaseConfigBucketsExist(databases);
|
234
248
|
await this.createOrUpdateCollectionsForDatabases(databases);
|
235
249
|
}
|
236
250
|
|