Skip to content

Commit 51dd5bd

Browse files
authored
Merge branch 'main' into ops-3103
2 parents 655fd5c + 9f521b7 commit 51dd5bd

38 files changed

Lines changed: 342 additions & 142 deletions

packages/engine/src/engine-executor.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ export async function executeEngine(
1515
): Promise<string> {
1616
const startTime = performance.now();
1717

18-
await encryptionKeyInitializer();
18+
encryptionKeyInitializer();
1919

2020
// TODO: Remove this from the server side
2121
engineInput.publicUrl = await networkUtls.getPublicUrl();

packages/openops/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ export * from './lib/aws/pricing';
3838
export * from './lib/openops-analytics';
3939
export * from './lib/openops-tables/applications-service';
4040
export * from './lib/openops-tables/auth-user';
41+
export * from './lib/openops-tables/create-axios-headers';
4142
export * from './lib/openops-tables/fields';
4243
export * from './lib/openops-tables/filters';
4344
export * from './lib/openops-tables/openops-tables-common-properties';

packages/openops/src/lib/cloud-cli-common.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,12 @@ export function handleCliError({
1010
command: string;
1111
error: unknown;
1212
}): never {
13-
logger.error(`${provider} CLI execution failed.`, {
14-
command,
15-
error,
16-
});
13+
logger.error(
14+
`${provider} CLI execution failed.`,
15+
error instanceof Error
16+
? { command, error }
17+
: { command, errorMessage: error },
18+
);
1719

1820
const message = `An error occurred while running ${provider} CLI command: ${error}`;
1921

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,10 @@ export async function executeFile(
4242

4343
async function getResult(childProcess: ChildProcess, fullCommand: string) {
4444
let stdout = '';
45-
let error = '';
45+
let errorMessage = '';
4646

4747
childProcess.stderr?.on('data', function (data) {
48-
error += data;
48+
errorMessage += data;
4949
});
5050

5151
childProcess.stdout?.on('data', (data) => {
@@ -62,13 +62,13 @@ async function getResult(childProcess: ChildProcess, fullCommand: string) {
6262
command: fullCommand,
6363
exitCode,
6464
stdout,
65-
error,
65+
errorMessage,
6666
});
6767

6868
return {
6969
exitCode: exitCode,
7070
stdOut: trimNewLines(stdout),
71-
stdError: trimNewLines(error),
71+
stdError: trimNewLines(errorMessage),
7272
};
7373
}
7474

packages/openops/src/lib/openops-tables/applications-service.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
1-
import { createAxiosHeaders, makeOpenOpsTablesGet } from './requests-helpers';
1+
import { createAxiosHeaders } from './create-axios-headers';
2+
import { makeOpenOpsTablesGet } from './requests-helpers';
23
import { Application } from './types';
34

45
export const OPENOPS_DEFAULT_DATABASE_NAME = 'OpenOps Dataset';
56

7+
/*
8+
@deprecated The tablesDatabaseId is now stored in the project.
9+
This function will be removed once flag ENABLE_TABLES_DATABASE_TOKEN is removed.
10+
*/
611
export async function getDefaultDatabaseId(
712
token: string,
813
databaseName = OPENOPS_DEFAULT_DATABASE_NAME, // TODO: remove this when all environments are migrated
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import { ServerContext } from '@openops/blocks-framework';
2+
import { AppSystemProp, encryptUtils, system } from '@openops/server-shared';
3+
import { authenticateDefaultUserInOpenOpsTables } from './auth-user';
4+
5+
export function shouldUseDatabaseToken(): boolean {
6+
return system.getBoolean(AppSystemProp.ENABLE_TABLES_DATABASE_TOKEN) ?? false;
7+
}
8+
9+
export type TokenOrResolver = string | { getToken: () => string };
10+
export type TablesServerContext = Pick<
11+
ServerContext,
12+
'tablesDatabaseId' | 'tablesDatabaseToken'
13+
>;
14+
15+
export async function resolveTokenProvider(
16+
serverContext: TablesServerContext,
17+
): Promise<TokenOrResolver> {
18+
if (shouldUseDatabaseToken()) {
19+
return {
20+
getToken: () => {
21+
const { tablesDatabaseToken } = serverContext;
22+
return encryptUtils.decryptString(tablesDatabaseToken);
23+
},
24+
};
25+
}
26+
27+
const { token } = await authenticateDefaultUserInOpenOpsTables();
28+
return token;
29+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import { AxiosHeaders } from 'axios';
2+
import { shouldUseDatabaseToken, TokenOrResolver } from './context-helpers';
3+
4+
export enum AuthType {
5+
JWT = 'JWT',
6+
Token = 'Token',
7+
}
8+
9+
function getToken(tokenOrResolver: TokenOrResolver): string {
10+
return typeof tokenOrResolver === 'string'
11+
? tokenOrResolver
12+
: tokenOrResolver.getToken();
13+
}
14+
15+
function getAuthPrefix(
16+
useJwtOverride: boolean,
17+
shouldUseDatabaseTokenConfig: boolean,
18+
): AuthType {
19+
const useJwt = useJwtOverride || !shouldUseDatabaseTokenConfig;
20+
return useJwt ? AuthType.JWT : AuthType.Token;
21+
}
22+
23+
export const createAxiosHeaders = (
24+
tokenOrResolver: TokenOrResolver,
25+
): AxiosHeaders => {
26+
const useJwtOverride = typeof tokenOrResolver === 'string';
27+
const token = getToken(tokenOrResolver);
28+
29+
const prefix = getAuthPrefix(useJwtOverride, shouldUseDatabaseToken());
30+
31+
return new AxiosHeaders({
32+
'Content-Type': 'application/json',
33+
Authorization: `${prefix} ${token}`,
34+
});
35+
};

packages/openops/src/lib/openops-tables/fields.ts

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,21 @@
11
import { IAxiosRetryConfig } from 'axios-retry';
2-
import {
3-
createAxiosHeaders,
4-
makeOpenOpsTablesGet,
5-
} from '../openops-tables/requests-helpers';
2+
import { makeOpenOpsTablesGet } from '../openops-tables/requests-helpers';
3+
import { TokenOrResolver } from './context-helpers';
4+
import { createAxiosHeaders } from './create-axios-headers';
65

76
export async function getFields(
87
tableId: number,
9-
token: string,
8+
tokenOrResolver: TokenOrResolver,
109
userFieldNames = true,
1110
axiosRetryConfig?: IAxiosRetryConfig,
1211
): Promise<OpenOpsField[]> {
13-
const authenticationHeader = createAxiosHeaders(token);
12+
const authenticationHeader = createAxiosHeaders(tokenOrResolver);
1413
const fields = await makeOpenOpsTablesGet<any[]>(
1514
`api/database/fields/table/${tableId}/?user_field_names=${userFieldNames}`,
1615
authenticationHeader,
1716
axiosRetryConfig,
1817
);
19-
20-
return fields.flatMap((item) => item);
18+
return fields.flat();
2119
}
2220

2321
export interface OpenOpsField {

packages/openops/src/lib/openops-tables/requests-helpers.ts

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,6 @@ import { IAxiosRetryConfig } from 'axios-retry';
55
import { StatusCodes } from 'http-status-codes';
66
import { makeHttpRequest } from '../axios-wrapper';
77

8-
export function createAxiosHeaders(token: string): AxiosHeaders {
9-
return new AxiosHeaders({
10-
'Content-Type': 'application/json',
11-
Authorization: `JWT ${token}`,
12-
});
13-
}
14-
158
const RETRY_DELAY_MS = 1000;
169

1710
const getStatusText = (statusCode: number): string => {

packages/openops/src/lib/openops-tables/rows.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,14 @@ import {
66
ViewFilterTypesEnum,
77
} from '../openops-tables/filters';
88
import {
9-
createAxiosHeaders,
109
makeOpenOpsTablesDelete,
1110
makeOpenOpsTablesGet,
1211
makeOpenOpsTablesPatch,
1312
makeOpenOpsTablesPost,
1413
makeOpenOpsTablesPut,
1514
} from '../openops-tables/requests-helpers';
15+
import { TokenOrResolver } from './context-helpers';
16+
import { createAxiosHeaders } from './create-axios-headers';
1617

1718
export interface OpenOpsRow {
1819
id: number;
@@ -21,7 +22,7 @@ export interface OpenOpsRow {
2122

2223
export interface RowParams {
2324
tableId: number;
24-
token: string;
25+
token: TokenOrResolver;
2526
}
2627

2728
export interface GetRowsParams extends RowParams {
@@ -207,22 +208,22 @@ export async function deleteRow(deleteRowParams: DeleteRowParams) {
207208
}
208209

209210
export async function getRowByPrimaryKeyValue(
210-
token: string,
211+
tokenOrResolver: TokenOrResolver,
211212
tableId: number,
212213
primaryKeyFieldValue: string,
213214
primaryKeyFieldName: any,
214215
primaryKeyFieldType: string,
215216
) {
216217
const rows = await getRows({
217218
tableId: tableId,
218-
token: token,
219219
filters: [
220220
{
221221
fieldName: primaryKeyFieldName,
222222
value: primaryKeyFieldValue,
223223
type: getEqualityFilterType(primaryKeyFieldType),
224224
},
225225
],
226+
token: tokenOrResolver,
226227
});
227228

228229
if (rows.length > 1) {

0 commit comments

Comments
 (0)