Skip to content

Commit b906cab

Browse files
committed
Merge branch 'release' of https://github.com/appsmithorg/appsmith into fix/reactive-cyclic-dependencies
2 parents 8275179 + b2bab20 commit b906cab

File tree

10 files changed

+134
-53
lines changed

10 files changed

+134
-53
lines changed
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
import * as utils from "./utils";
2+
3+
export async function run() {
4+
const dbUrl = utils.getDburl();
5+
const redisUrl = utils.getRedisUrl();
6+
7+
// Validate required configuration
8+
if (!dbUrl) {
9+
throw new Error(
10+
"Database URL not found. Please check APPSMITH_DB_URL or APPSMITH_MONGODB_URI configuration.",
11+
);
12+
}
13+
14+
if (!redisUrl) {
15+
throw new Error(
16+
"Redis URL not found. Please check APPSMITH_REDIS_URL configuration.",
17+
);
18+
}
19+
20+
await utils.ensureSupervisorIsRunning();
21+
22+
let organizationId: string;
23+
24+
try {
25+
// First, check if the organization exists
26+
const orgCheckResult = await utils.execCommandReturningOutput([
27+
"mongosh",
28+
dbUrl,
29+
"--eval",
30+
"db.organization.findOne({slug:'default'},{_id:1,slug:1})",
31+
"--json",
32+
]);
33+
34+
const orgData = JSON.parse(orgCheckResult);
35+
if (!orgData || !orgData._id) {
36+
throw new Error("Organization with slug 'default' not found in database");
37+
}
38+
39+
console.log("Found organization:", orgData.slug);
40+
41+
// Update the organization to enable form login
42+
await utils.execCommand([
43+
"mongosh",
44+
dbUrl,
45+
"--eval",
46+
"db.organization.updateOne({slug:'default'}, {$set:{'organizationConfiguration.isFormLoginEnabled':true}})",
47+
"--json",
48+
]);
49+
50+
organizationId = orgData._id.$oid;
51+
console.log("Organization ID:", organizationId);
52+
53+
console.log("Successfully updated organization configuration");
54+
} catch (error) {
55+
console.error("Failed to execute mongo command:", error);
56+
throw error;
57+
}
58+
59+
// Clear Redis cache for the organization
60+
try {
61+
await utils.execCommand([
62+
"redis-cli",
63+
"--quoted-input",
64+
"-h",
65+
redisUrl,
66+
"-p",
67+
"6379",
68+
"DEL",
69+
`organization:${organizationId}`,
70+
]);
71+
console.log("Successfully cleared organization cache from Redis");
72+
} catch (error) {
73+
console.error("Failed to execute redis command:", error);
74+
// Don't throw here as the main operation (enabling form login) was successful
75+
console.warn(
76+
"Warning: Failed to clear cache, but form login was enabled successfully",
77+
);
78+
}
79+
}

app/client/packages/rts/src/ctl/index.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import * as export_db from "./export_db";
66
import * as import_db from "./import_db";
77
import * as backup from "./backup";
88
import * as restore from "./restore";
9+
import * as enable_form_login from "./enable_form_login";
910
import * as check_replica_set from "./check_replica_set";
1011
import * as version from "./version";
1112
import * as mongo_shell_utils from "./mongo_shell_utils";
@@ -60,6 +61,13 @@ if (["export-db", "export_db", "ex"].includes(command)) {
6061
version.exec();
6162
} else if (["mongo-eval", "mongo_eval", "mongoEval"].includes(command)) {
6263
mongo_shell_utils.exec();
64+
} else if (["efl", "enable-form-login"].includes(command)) {
65+
console.log("Enabling form login");
66+
try {
67+
enable_form_login.run();
68+
} catch (error) {
69+
console.error("Failed to enable form login:", error.message);
70+
}
6371
} else {
6472
showHelp();
6573
}

app/client/packages/rts/src/ctl/utils.ts

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import * as Constants from "./constants";
33
import childProcess from "child_process";
44
import fs from "node:fs";
55
import { ConnectionString } from "mongodb-connection-string-url";
6+
import { parse } from "acorn";
67

78
export function showHelp() {
89
console.log(
@@ -14,6 +15,7 @@ export function showHelp() {
1415
console.log("\tcrs, check_replica_set\tCheck replica set mongoDB.\r");
1516
console.log("\tbackup\t\t\tTake a backup of Appsmith instance.\r");
1617
console.log("\trestore\t\t\tRestore Appsmith instance from a backup.\r");
18+
console.log("\tefl, enable-form-login\t\tEnable form login.\r");
1719
console.log("\t--help\t\t\t" + "Show help.");
1820
}
1921

@@ -38,6 +40,50 @@ export async function start(apps) {
3840
console.log("Started", apps);
3941
}
4042

43+
export function parseRedisUrl(redisUrlObject) {
44+
if (redisUrlObject && redisUrlObject !== "undefined") {
45+
try {
46+
const redisUrl = new URL(redisUrlObject);
47+
return redisUrl.hostname;
48+
} catch (err) {
49+
console.error("Error parsing redis URL:", err);
50+
}
51+
}
52+
return null;
53+
}
54+
55+
export function getRedisUrl() {
56+
let redisUrl = null;
57+
let redisUrlObject = process.env.APPSMITH_REDIS_URL;
58+
// Make sure redisUrl takes precedence over process.env.APPSMITH_REDIS_URL
59+
if (redisUrlObject && redisUrlObject !== "undefined") {
60+
try {
61+
return parseRedisUrl(redisUrlObject);
62+
} catch (err) {
63+
console.error("Error parsing redis URL from environment variable:", err);
64+
}
65+
}
66+
// If environment variable APPSMITH_REDIS_URL is not set, read from the environment file
67+
try {
68+
const env_array = fs
69+
.readFileSync(Constants.ENV_PATH, "utf8")
70+
.toString()
71+
.split("\n");
72+
73+
for (const i in env_array) {
74+
if (env_array[i].startsWith("APPSMITH_REDIS_URL")) {
75+
const redisUrl = parseRedisUrl(
76+
env_array[i].toString().split("=")[1].trim(),
77+
);
78+
break;
79+
}
80+
}
81+
} catch (err) {
82+
console.error("Error reading the environment file:", err);
83+
}
84+
return redisUrl;
85+
}
86+
4187
export function getDburl() {
4288
let dbUrl = "";
4389

app/client/src/workers/Evaluation/__tests__/evaluation.test.ts

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -634,7 +634,6 @@ describe("DataTreeEvaluator", () => {
634634
updatedConfigTree,
635635
unEvalUpdates,
636636
[],
637-
evaluator.evalTree,
638637
);
639638
const dataTree = evaluator.evalTree;
640639

@@ -674,7 +673,6 @@ describe("DataTreeEvaluator", () => {
674673
updatedConfigTree,
675674
unEvalUpdates,
676675
[],
677-
evaluator.evalTree,
678676
);
679677

680678
const dataTree = evaluator.evalTree;
@@ -722,7 +720,6 @@ describe("DataTreeEvaluator", () => {
722720
updatedConfigTree,
723721
unEvalUpdates,
724722
[],
725-
evaluator.evalTree,
726723
);
727724
const dataTree = evaluator.evalTree;
728725

@@ -787,7 +784,6 @@ describe("DataTreeEvaluator", () => {
787784
updatedConfigTree,
788785
unEvalUpdates,
789786
[],
790-
evaluator.evalTree,
791787
);
792788
const dataTree = evaluator.evalTree;
793789
const updatedDependencies = evaluator.dependencies;
@@ -832,7 +828,6 @@ describe("DataTreeEvaluator", () => {
832828
updatedConfigTree,
833829
unEvalUpdates,
834830
[],
835-
evaluator.evalTree,
836831
);
837832
const dataTree = evaluator.evalTree;
838833
const updatedDependencies = evaluator.dependencies;
@@ -898,7 +893,6 @@ describe("DataTreeEvaluator", () => {
898893
updatedConfigTree,
899894
unEvalUpdates,
900895
[],
901-
evaluator.evalTree,
902896
);
903897
const dataTree = evaluator.evalTree;
904898
const updatedDependencies = evaluator.dependencies;
@@ -971,7 +965,6 @@ describe("DataTreeEvaluator", () => {
971965
updatedConfigTree1,
972966
unEvalUpdates,
973967
[],
974-
evaluator.evalTree,
975968
);
976969
expect(evaluator.dependencies["Api2.config.body"]).toStrictEqual([
977970
"Api2.config.pluginSpecifiedTemplates[0].value",
@@ -1007,7 +1000,6 @@ describe("DataTreeEvaluator", () => {
10071000
updatedConfigTree2,
10081001
unEvalUpdates2,
10091002
[],
1010-
evaluator.evalTree,
10111003
);
10121004
const dataTree = evaluator.evalTree;
10131005

@@ -1050,7 +1042,6 @@ describe("DataTreeEvaluator", () => {
10501042
updatedConfigTree3,
10511043
unEvalUpdates3,
10521044
[],
1053-
evaluator.evalTree,
10541045
);
10551046
const dataTree3 = evaluator.evalTree;
10561047

@@ -1094,7 +1085,6 @@ describe("DataTreeEvaluator", () => {
10941085
updatedConfigTree,
10951086
unEvalUpdates,
10961087
[],
1097-
evaluator.evalTree,
10981088
);
10991089
const dataTree = evaluator.evalTree;
11001090

@@ -1135,7 +1125,6 @@ describe("DataTreeEvaluator", () => {
11351125
updatedConfigTree,
11361126
unEvalUpdates,
11371127
[],
1138-
evaluator.evalTree,
11391128
);
11401129
// Hard check to not regress on the number of clone operations. Try to improve this number.
11411130
// Not a good assertion because in one piece of code im cloning multiple times, however the value im cloning is very small.

app/client/src/workers/Evaluation/evalTreeWithChanges.test.ts

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,6 @@ describe("evaluateAndPushResponse", () => {
130130
},
131131
[],
132132
[],
133-
{},
134133
);
135134
// check if push response has been called
136135
expect(pushResponseToMainThreadMock).toHaveBeenCalled();
@@ -226,7 +225,6 @@ describe("evaluateAndGenerateResponse", () => {
226225
},
227226
[],
228227
[],
229-
{},
230228
);
231229
const parsedUpdates = getParsedUpdatesFromWebWorkerResp(webworkerResponse);
232230

@@ -261,7 +259,6 @@ describe("evaluateAndGenerateResponse", () => {
261259
},
262260
[],
263261
[],
264-
{},
265262
);
266263
const parsedUpdates = getParsedUpdatesFromWebWorkerResp(webworkerResponse);
267264

@@ -301,7 +298,6 @@ describe("evaluateAndGenerateResponse", () => {
301298
updateTreeResponse,
302299
[],
303300
[],
304-
{},
305301
);
306302

307303
expect(webworkerResponse.workerResponse.dependencies).toEqual({
@@ -342,7 +338,6 @@ describe("evaluateAndGenerateResponse", () => {
342338
updateTreeResponse,
343339
[],
344340
[],
345-
{},
346341
);
347342
const parsedUpdates =
348343
getParsedUpdatesFromWebWorkerResp(webworkerResponse);
@@ -376,7 +371,6 @@ describe("evaluateAndGenerateResponse", () => {
376371
updateTreeResponse,
377372
[],
378373
[],
379-
{},
380374
);
381375

382376
const parsedUpdates =
@@ -420,7 +414,6 @@ describe("evaluateAndGenerateResponse", () => {
420414
updateTreeResponse,
421415
[],
422416
["Text1.text"],
423-
{},
424417
);
425418
const parsedUpdates =
426419
getParsedUpdatesFromWebWorkerResp(webworkerResponse);
@@ -466,7 +459,6 @@ describe("evaluateAndGenerateResponse", () => {
466459
response,
467460
metaUpdates,
468461
[],
469-
{},
470462
);
471463

472464
expect(workerResponse.evalMetaUpdates).toEqual(metaUpdates);
@@ -497,7 +489,6 @@ describe("evaluateAndGenerateResponse", () => {
497489
response,
498490
metaUpdates,
499491
[],
500-
{},
501492
);
502493

503494
// the function properties should be stripped out
@@ -529,7 +520,6 @@ describe("evaluateAndGenerateResponse", () => {
529520
updateTreeResponse,
530521
[],
531522
[],
532-
{},
533523
);
534524

535525
const parsedUpdates =
@@ -568,7 +558,6 @@ describe("evaluateAndGenerateResponse", () => {
568558
updateTreeResponse,
569559
[],
570560
[],
571-
{},
572561
);
573562
const parsedUpdates =
574563
getParsedUpdatesFromWebWorkerResp(webworkerResponse);

0 commit comments

Comments
 (0)