appwrite-utils-cli 0.9.98 → 0.9.982
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/migrations/databases.js +2 -0
- package/dist/migrations/users.d.ts +2 -2
- package/dist/migrations/users.js +13 -23
- package/dist/utils/helperFunctions.js +10 -3
- package/package.json +1 -1
- package/src/migrations/databases.ts +1 -0
- package/src/migrations/users.ts +22 -32
- package/src/utils/helperFunctions.ts +9 -3
package/README.md
CHANGED
@@ -125,6 +125,7 @@ This updated CLI ensures that developers have robust tools at their fingertips t
|
|
125
125
|
|
126
126
|
## Changelog
|
127
127
|
|
128
|
+
- 0.9.981: Try fixing `tryAwaitWithRetry` to catch `522` errors from Cloudflare, they were appearing for some users, also added a 1000ms delay to `tryAwaitWithRetry`
|
128
129
|
- 0.9.98: Fixing some import errors reported by users
|
129
130
|
- 0.9.95: Updated to include new version of `appwrite-utils`
|
130
131
|
- 0.9.93: Updated `selectDatabases` and `selectCollections` from the interactive CLI to prefer local collections or databases when synchronizing the databases
|
@@ -2,6 +2,8 @@ import { Client, Databases, IndexType, Query, } from "node-appwrite";
|
|
2
2
|
import { getAppwriteClient, tryAwaitWithRetry, } from "../utils/helperFunctions.js";
|
3
3
|
export const fetchAllDatabases = async (database) => {
|
4
4
|
const databases = await tryAwaitWithRetry(async () => await database.list([Query.limit(25)]));
|
5
|
+
if (!databases)
|
6
|
+
return [];
|
5
7
|
const allDatabases = databases.databases;
|
6
8
|
if (allDatabases.length === 0)
|
7
9
|
return [];
|
@@ -8,8 +8,8 @@ export declare class UsersController {
|
|
8
8
|
constructor(config: AppwriteConfig, db: Databases);
|
9
9
|
wipeUsers(): Promise<void>;
|
10
10
|
getAllUsers(): Promise<Models.User<Models.Preferences>[]>;
|
11
|
-
createUsersAndReturn(items: AuthUserCreate[]): Promise<Models.User<Models.Preferences>[]>;
|
12
|
-
createUserAndReturn(item: AuthUserCreate
|
11
|
+
createUsersAndReturn(items: AuthUserCreate[]): Promise<(Models.User<Models.Preferences> | undefined)[]>;
|
12
|
+
createUserAndReturn(item: AuthUserCreate): Promise<Models.User<Models.Preferences> | undefined>;
|
13
13
|
createAndCheckForUserAndReturn(item: AuthUserCreate): Promise<Models.User<Models.Preferences> | undefined>;
|
14
14
|
getUserIdByEmailOrPhone(email?: string, phone?: string): Promise<string | undefined>;
|
15
15
|
transferUsersBetweenDbsLocalToRemote: (endpoint: string, projectId: string, apiKey: string) => Promise<void>;
|
package/dist/migrations/users.js
CHANGED
@@ -78,36 +78,26 @@ export class UsersController {
|
|
78
78
|
const users = await Promise.all(items.map((item) => this.createUserAndReturn(item)));
|
79
79
|
return users;
|
80
80
|
}
|
81
|
-
async createUserAndReturn(item
|
81
|
+
async createUserAndReturn(item) {
|
82
82
|
try {
|
83
|
-
const user = await
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
83
|
+
const user = await tryAwaitWithRetry(async () => {
|
84
|
+
const createdUser = await this.users.create(item.userId || ID.unique(), item.email || undefined, item.phone && item.phone.length < 15 && item.phone.startsWith("+")
|
85
|
+
? item.phone
|
86
|
+
: undefined, `changeMe${item.email?.toLowerCase()}` || `changeMePlease`, item.name || undefined);
|
87
|
+
if (item.labels) {
|
88
|
+
await this.users.updateLabels(createdUser.$id, item.labels);
|
89
|
+
}
|
90
|
+
if (item.prefs) {
|
91
|
+
await this.users.updatePrefs(createdUser.$id, item.prefs);
|
92
|
+
}
|
93
|
+
return createdUser;
|
94
|
+
}); // Set throwError to true since we want to handle errors
|
92
95
|
return user;
|
93
96
|
}
|
94
97
|
catch (e) {
|
95
|
-
if (e instanceof AppwriteException) {
|
96
|
-
if (e.message.toLowerCase().includes("fetch failed") ||
|
97
|
-
e.message.toLowerCase().includes("server error")) {
|
98
|
-
const numberOfAttempts = numAttempts || 0;
|
99
|
-
if (numberOfAttempts > 5) {
|
100
|
-
throw e;
|
101
|
-
}
|
102
|
-
const user = await this.createUserAndReturn(item, numberOfAttempts + 1);
|
103
|
-
return user;
|
104
|
-
}
|
105
|
-
}
|
106
98
|
if (e instanceof Error) {
|
107
99
|
logger.error("FAILED CREATING USER: ", e.message, item);
|
108
100
|
}
|
109
|
-
console.log("FAILED CREATING USER: ", e, item);
|
110
|
-
throw e;
|
111
101
|
}
|
112
102
|
}
|
113
103
|
async createAndCheckForUserAndReturn(item) {
|
@@ -92,14 +92,21 @@ export const tryAwaitWithRetry = async (createFunction, attemptNum = 0, throwErr
|
|
92
92
|
return await createFunction();
|
93
93
|
}
|
94
94
|
catch (error) {
|
95
|
-
if (error instanceof AppwriteException &&
|
95
|
+
if ((error instanceof AppwriteException &&
|
96
96
|
(error.message.toLowerCase().includes("fetch failed") ||
|
97
|
-
error.message.toLowerCase().includes("server error")))
|
97
|
+
error.message.toLowerCase().includes("server error"))) ||
|
98
|
+
(error.code === 522 || error.code === "522")) {
|
99
|
+
if (error.code === 522) {
|
100
|
+
console.log("Cloudflare error. Retrying...");
|
101
|
+
}
|
102
|
+
else {
|
103
|
+
console.log(`Fetch failed on attempt ${attemptNum}. Retrying...`);
|
104
|
+
}
|
98
105
|
numTimesFailedTotal++;
|
99
|
-
console.log(`Fetch failed on attempt ${attemptNum}. Retrying...`);
|
100
106
|
if (attemptNum > 5) {
|
101
107
|
throw error;
|
102
108
|
}
|
109
|
+
await delay(2500);
|
103
110
|
return tryAwaitWithRetry(createFunction, attemptNum + 1);
|
104
111
|
}
|
105
112
|
if (throwError) {
|
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.982",
|
5
5
|
"main": "src/main.ts",
|
6
6
|
"type": "module",
|
7
7
|
"repository": {
|
@@ -16,6 +16,7 @@ export const fetchAllDatabases = async (
|
|
16
16
|
const databases = await tryAwaitWithRetry(
|
17
17
|
async () => await database.list([Query.limit(25)])
|
18
18
|
);
|
19
|
+
if (!databases) return [];
|
19
20
|
const allDatabases = databases.databases;
|
20
21
|
if (allDatabases.length === 0) return [];
|
21
22
|
let lastDatabaseId = allDatabases[allDatabases.length - 1].$id;
|
package/src/migrations/users.ts
CHANGED
@@ -111,44 +111,34 @@ export class UsersController {
|
|
111
111
|
return users;
|
112
112
|
}
|
113
113
|
|
114
|
-
async createUserAndReturn(item: AuthUserCreate
|
114
|
+
async createUserAndReturn(item: AuthUserCreate) {
|
115
115
|
try {
|
116
|
-
const user = await
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
116
|
+
const user = await tryAwaitWithRetry(async () => {
|
117
|
+
const createdUser = await this.users.create(
|
118
|
+
item.userId || ID.unique(),
|
119
|
+
item.email || undefined,
|
120
|
+
item.phone && item.phone.length < 15 && item.phone.startsWith("+")
|
121
|
+
? item.phone
|
122
|
+
: undefined,
|
123
|
+
`changeMe${item.email?.toLowerCase()}` || `changeMePlease`,
|
124
|
+
item.name || undefined
|
125
|
+
);
|
126
|
+
|
127
|
+
if (item.labels) {
|
128
|
+
await this.users.updateLabels(createdUser.$id, item.labels);
|
129
|
+
}
|
130
|
+
if (item.prefs) {
|
131
|
+
await this.users.updatePrefs(createdUser.$id, item.prefs);
|
132
|
+
}
|
133
|
+
|
134
|
+
return createdUser;
|
135
|
+
}); // Set throwError to true since we want to handle errors
|
136
|
+
|
131
137
|
return user;
|
132
138
|
} catch (e) {
|
133
|
-
if (e instanceof AppwriteException) {
|
134
|
-
if (
|
135
|
-
e.message.toLowerCase().includes("fetch failed") ||
|
136
|
-
e.message.toLowerCase().includes("server error")
|
137
|
-
) {
|
138
|
-
const numberOfAttempts = numAttempts || 0;
|
139
|
-
if (numberOfAttempts > 5) {
|
140
|
-
throw e;
|
141
|
-
}
|
142
|
-
const user: Models.User<Models.Preferences> =
|
143
|
-
await this.createUserAndReturn(item, numberOfAttempts + 1);
|
144
|
-
return user;
|
145
|
-
}
|
146
|
-
}
|
147
139
|
if (e instanceof Error) {
|
148
140
|
logger.error("FAILED CREATING USER: ", e.message, item);
|
149
141
|
}
|
150
|
-
console.log("FAILED CREATING USER: ", e, item);
|
151
|
-
throw e;
|
152
142
|
}
|
153
143
|
}
|
154
144
|
|
@@ -149,15 +149,21 @@ export const tryAwaitWithRetry = async <T>(
|
|
149
149
|
return await createFunction();
|
150
150
|
} catch (error) {
|
151
151
|
if (
|
152
|
-
error instanceof AppwriteException &&
|
152
|
+
(error instanceof AppwriteException &&
|
153
153
|
(error.message.toLowerCase().includes("fetch failed") ||
|
154
|
-
error.message.toLowerCase().includes("server error"))
|
154
|
+
error.message.toLowerCase().includes("server error"))) ||
|
155
|
+
((error as any).code === 522 || (error as any).code === "522")
|
155
156
|
) {
|
157
|
+
if ((error as any).code === 522) {
|
158
|
+
console.log("Cloudflare error. Retrying...");
|
159
|
+
} else {
|
160
|
+
console.log(`Fetch failed on attempt ${attemptNum}. Retrying...`);
|
161
|
+
}
|
156
162
|
numTimesFailedTotal++;
|
157
|
-
console.log(`Fetch failed on attempt ${attemptNum}. Retrying...`);
|
158
163
|
if (attemptNum > 5) {
|
159
164
|
throw error;
|
160
165
|
}
|
166
|
+
await delay(2500);
|
161
167
|
return tryAwaitWithRetry(createFunction, attemptNum + 1);
|
162
168
|
}
|
163
169
|
if (throwError) {
|