Skip to content

Commit b737850

Browse files
committed
Merge branch 'main' into cezudas/OPS-3021-infrastructure
2 parents 86da4b0 + 9f025aa commit b737850

18 files changed

Lines changed: 101 additions & 64 deletions

File tree

packages/blocks/framework/src/lib/context.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import {
22
AppConnectionValue,
3+
EncryptedObject,
34
ExecutionType,
45
FlowRunId,
56
PauseMetadata,
@@ -126,10 +127,7 @@ export type ServerContext = {
126127
publicUrl: string;
127128
token: string;
128129
tablesDatabaseId: number;
129-
tablesDatabaseToken: {
130-
iv: string;
131-
data: string;
132-
};
130+
tablesDatabaseToken: EncryptedObject;
133131
};
134132
export type BaseActionContext<
135133
ET extends ExecutionType,

packages/engine/src/lib/handler/context/engine-constants.ts

Lines changed: 47 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import {
2-
EncryptedDatabaseToken,
2+
EncryptedObject,
33
ExecuteFlowOperation,
44
ExecutePropsOptions,
55
ExecuteStepOperation,
@@ -39,8 +39,6 @@ export class EngineConstants {
3939
public static readonly BLOCK_SOURCES =
4040
process.env.OPS_BLOCKS_SOURCE ?? 'FILE';
4141

42-
private project: Project | null = null;
43-
4442
public get baseCodeDirectory(): string {
4543
return EngineConstants.BASE_CODE_DIRECTORY;
4644
}
@@ -69,13 +67,18 @@ export class EngineConstants {
6967
public readonly testRunActionLimits: TestRunLimitSettings,
7068
public readonly isTestRun: boolean,
7169
public readonly tablesDatabaseId: number,
72-
public readonly tablesDatabaseToken: EncryptedDatabaseToken,
70+
public readonly tablesDatabaseToken: EncryptedObject,
7371
public readonly resumePayload?: ResumePayload,
7472
) {}
7573

76-
public static fromExecuteFlowInput(
74+
public static async fromExecuteFlowInput(
7775
input: ExecuteFlowOperation,
78-
): EngineConstants {
76+
): Promise<EngineConstants> {
77+
const project = await EngineConstants.fetchProject(
78+
input.internalApiUrl,
79+
input.engineToken,
80+
);
81+
7982
return new EngineConstants(
8083
input.executionCorrelationId,
8184
input.flowVersion.flowId,
@@ -99,17 +102,22 @@ export class EngineConstants {
99102
input.serverHandlerId ?? null,
100103
input.flowVersion.testRunActionLimits,
101104
input.runEnvironment === 'TESTING',
102-
input.tablesDatabaseId,
103-
input.tablesDatabaseToken,
105+
project.tablesDatabaseId,
106+
project.tablesDatabaseToken,
104107
input.executionType === ExecutionType.RESUME
105108
? input.resumePayload
106109
: undefined,
107110
);
108111
}
109112

110-
public static fromExecuteStepInput(
113+
public static async fromExecuteStepInput(
111114
input: ExecuteStepOperation,
112-
): EngineConstants {
115+
): Promise<EngineConstants> {
116+
const project = await EngineConstants.fetchProject(
117+
input.internalApiUrl,
118+
input.engineToken,
119+
);
120+
113121
return new EngineConstants(
114122
null,
115123
input.flowVersion.flowId,
@@ -133,14 +141,19 @@ export class EngineConstants {
133141
null,
134142
input.flowVersion.testRunActionLimits,
135143
true,
136-
input.tablesDatabaseId,
137-
input.tablesDatabaseToken,
144+
project.tablesDatabaseId,
145+
project.tablesDatabaseToken,
138146
);
139147
}
140148

141-
public static fromExecutePropertyInput(
149+
public static async fromExecutePropertyInput(
142150
input: ExecutePropsOptions,
143-
): EngineConstants {
151+
): Promise<EngineConstants> {
152+
const project = await EngineConstants.fetchProject(
153+
input.internalApiUrl,
154+
input.engineToken,
155+
);
156+
144157
return new EngineConstants(
145158
null,
146159
input.flowVersion.flowId,
@@ -164,14 +177,19 @@ export class EngineConstants {
164177
null,
165178
input.flowVersion.testRunActionLimits,
166179
true,
167-
input.tablesDatabaseId,
168-
input.tablesDatabaseToken,
180+
project.tablesDatabaseId,
181+
project.tablesDatabaseToken,
169182
);
170183
}
171184

172-
public static fromExecuteTriggerInput(
185+
public static async fromExecuteTriggerInput(
173186
input: ExecuteTriggerOperation<TriggerHookType>,
174-
): EngineConstants {
187+
): Promise<EngineConstants> {
188+
const project = await EngineConstants.fetchProject(
189+
input.internalApiUrl,
190+
input.engineToken,
191+
);
192+
175193
return new EngineConstants(
176194
null,
177195
input.flowVersion.flowId,
@@ -195,26 +213,26 @@ export class EngineConstants {
195213
null,
196214
input.flowVersion.testRunActionLimits,
197215
input.test,
198-
input.tablesDatabaseId,
199-
input.tablesDatabaseToken,
216+
project.tablesDatabaseId,
217+
project.tablesDatabaseToken,
200218
);
201219
}
202220

203-
private async getProject(): Promise<Project> {
204-
if (this.project) {
205-
return this.project;
206-
}
207-
208-
const getWorkerProjectEndpoint = `${this.internalApiUrl}v1/worker/project`;
221+
private static async fetchProject(
222+
internalApiUrl: string,
223+
engineToken: string,
224+
): Promise<Project> {
225+
const getWorkerProjectEndpoint = `${addTrailingSlashIfMissing(
226+
internalApiUrl,
227+
)}v1/worker/project`;
209228

210229
const response = await fetch(getWorkerProjectEndpoint, {
211230
headers: {
212-
Authorization: `Bearer ${this.engineToken}`,
231+
Authorization: `Bearer ${engineToken}`,
213232
},
214233
});
215234

216-
this.project = (await response.json()) as Project;
217-
return this.project;
235+
return (await response.json()) as Project;
218236
}
219237
}
220238

packages/engine/src/lib/operations.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ const executeFlow = async (
4545
context: FlowExecutorContext,
4646
): Promise<EngineResponse<Pick<FlowRunResponse, 'status' | 'error'>>> => {
4747
try {
48-
const constants = EngineConstants.fromExecuteFlowInput(input);
48+
const constants = await EngineConstants.fromExecuteFlowInput(input);
4949

5050
const response = await flowExecutor.triggerFlowExecutor({
5151
trigger: input.flowVersion.trigger,
@@ -92,7 +92,7 @@ async function executeStep(
9292
engineToken: input.engineToken,
9393
stepTestOutputs: input.stepTestOutputs,
9494
}),
95-
constants: EngineConstants.fromExecuteStepInput(input),
95+
constants: await EngineConstants.fromExecuteStepInput(input),
9696
});
9797

9898
const stepResult = output.steps[step.name];
@@ -203,7 +203,7 @@ export async function execute(
203203
stepTestOutputs: input.stepTestOutputs,
204204
}),
205205
searchValue: input.searchValue,
206-
constants: EngineConstants.fromExecutePropertyInput(input),
206+
constants: await EngineConstants.fromExecutePropertyInput(input),
207207
});
208208

209209
return {
@@ -222,7 +222,7 @@ export async function execute(
222222

223223
const output = await triggerHelper.executeTrigger({
224224
params: input,
225-
constants: EngineConstants.fromExecuteTriggerInput(input),
225+
constants: await EngineConstants.fromExecuteTriggerInput(input),
226226
});
227227

228228
return {

packages/engine/src/lib/resolve-variable.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ export async function resolveVariable(
99
input: ResolveVariableOperation,
1010
): Promise<ResolveVariableResponse> {
1111
try {
12-
const constants = EngineConstants.fromExecuteStepInput({
12+
const constants = await EngineConstants.fromExecuteStepInput({
1313
projectId: input.projectId,
1414
engineToken: input.engineToken,
1515
internalApiUrl: input.internalApiUrl,

packages/engine/test/resolve-variable.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ describe('resolveVariable', () => {
6262

6363
beforeEach(() => {
6464
jest.clearAllMocks();
65-
mockEngineConstants.fromExecuteStepInput = jest.fn().mockReturnValue(mockConstants);
65+
mockEngineConstants.fromExecuteStepInput = jest.fn().mockResolvedValue(mockConstants);
6666
mockTestExecutionContext.stateFromFlowVersion = jest.fn().mockResolvedValue(mockExecutionState);
6767
});
6868

packages/openops/src/lib/axios-wrapper.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ export async function makeHttpRequest<T>(
3939

4040
if (axiosError && axiosError.response?.data) {
4141
logger.error(logMessage, {
42-
...axiosError.response?.data,
42+
error: axiosError,
43+
errorResponse: axiosError.response?.data,
4344
status: axiosError.response?.status,
4445
statusText: axiosError.response?.statusText,
4546
timeTaken,
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import { FlagsMap } from '@/app/lib/flags-api';
2+
3+
export const getFederatedUrlBasedOnFlags = (flags: FlagsMap) =>
4+
flags.FEDERATED_LOGIN_ENABLED
5+
? (flags.FRONTEGG_URL as string | undefined)
6+
: undefined;

packages/react-ui/src/app/common/guards/allow-logged-in-user-only-guard.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { jwtDecode } from 'jwt-decode';
44
import { Suspense, useEffect } from 'react';
55
import { Navigate, useLocation, useNavigate } from 'react-router-dom';
66

7+
import { getFederatedUrlBasedOnFlags } from '@/app/common/auth/lib/utils';
78
import { flagsHooks } from '@/app/common/hooks/flags-hooks';
89
import { platformHooks } from '@/app/common/hooks/platform-hooks';
910
import { projectHooks } from '@/app/common/hooks/project-hooks';
@@ -61,7 +62,7 @@ export const AllowOnlyLoggedInUserOnlyGuard = ({
6162
await authenticationSession.logOut({
6263
userInitiated: false,
6364
navigate,
64-
federatedLoginUrl: flags?.FRONTEGG_URL as string | undefined,
65+
federatedLoginUrl: getFederatedUrlBasedOnFlags(flags),
6566
});
6667
} catch (e) {
6768
if (isMounted) {

packages/react-ui/src/app/features/authentication/components/sign-in-form.tsx

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import { t } from 'i18next';
1515
import { SubmitHandler, useForm } from 'react-hook-form';
1616
import { Link, useNavigate } from 'react-router-dom';
1717

18+
import { getFederatedUrlBasedOnFlags } from '@/app/common/auth/lib/utils';
1819
import { flagsHooks } from '@/app/common/hooks/flags-hooks';
1920
import { HttpError, api } from '@/app/lib/api';
2021
import { authenticationApi } from '@/app/lib/authentication-api';
@@ -26,7 +27,7 @@ import {
2627
SignInRequest,
2728
emailRegex,
2829
} from '@openops/shared';
29-
import { useEffectOnce } from 'react-use';
30+
import { useEffect } from 'react';
3031
import { navigationUtil } from '../../../lib/navigation-util';
3132

3233
const SignInSchema = Type.Object({
@@ -52,11 +53,17 @@ const SignInForm: React.FC = () => {
5253
mode: 'onChange',
5354
});
5455

55-
useEffectOnce(() => {
56+
const { data: flags } = flagsHooks.useFlags();
57+
58+
useEffect(() => {
59+
if (!flags) {
60+
return;
61+
}
5662
authenticationSession.logOut({
5763
userInitiated: false,
64+
federatedLoginUrl: getFederatedUrlBasedOnFlags(flags),
5865
});
59-
});
66+
}, [flags]);
6067

6168
const { data: edition } = flagsHooks.useFlag(FlagId.EDITION);
6269
const { data: showSignUpLink } = flagsHooks.useFlag(FlagId.SHOW_SIGN_UP_LINK);

packages/react-ui/src/app/interceptors.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { getFederatedUrlBasedOnFlags } from '@/app/common/auth/lib/utils';
12
import { API_URL, isUrlRelative } from '@/app/lib/api';
23
import { authenticationSession } from '@/app/lib/authentication-session';
34
import axios, { AxiosError, HttpStatusCode } from 'axios';
@@ -60,12 +61,13 @@ axios.interceptors.response.use(
6061
if (url !== OPENOPS_CLOUD_USER_INFO_API_URL && !isSignInRoute) {
6162
console.warn('JWT expired logging out');
6263

63-
const flags = queryClient.getQueryData<FlagsMap>([QueryKeys.flags]);
64+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
65+
const flags = queryClient.getQueryData<FlagsMap>([QueryKeys.flags])!;
6466
authenticationSession.logOut({
6567
userInitiated: false,
66-
federatedLoginUrl: flags?.FRONTEGG_URL as string | undefined,
68+
federatedLoginUrl: getFederatedUrlBasedOnFlags(flags),
6769
});
68-
if (!flags?.FRONTEGG_URL) {
70+
if (!flags?.FEDERATED_LOGIN_ENABLED) {
6971
window.location.reload();
7072
}
7173
}

0 commit comments

Comments
 (0)