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 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>;
@@ -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>;
@@ -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",
4
+ "version": "0.9.5",
5
5
  "main": "src/main.ts",
6
6
  "type": "module",
7
7
  "repository": {
@@ -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
@@ -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