Skip to content

Commit 077f2ac

Browse files
authored
Move tables admin auth to the api (#1670)
Part of OPS-3123.
1 parent dc26e82 commit 077f2ac

File tree

13 files changed

+175
-35
lines changed

13 files changed

+175
-35
lines changed

packages/server/api/src/app/ai/mcp/tables-tools.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
1-
import {
2-
authenticateDefaultUserInOpenOpsTables,
3-
createAxiosHeaders,
4-
} from '@openops/common';
1+
import { createAxiosHeaders } from '@openops/common';
52
import { AppSystemProp, system } from '@openops/server-shared';
63
import { experimental_createMCPClient as createMCPClient, ToolSet } from 'ai';
74
import { openopsTables } from '../../openops-tables';
5+
import { authenticateAdminUserInOpenOpsTables } from '../../openops-tables/auth-admin-tables';
86
import { MCPTool } from './types';
97

108
export async function getTablesTools(): Promise<MCPTool> {
11-
const { token } = await authenticateDefaultUserInOpenOpsTables();
9+
const { token } = await authenticateAdminUserInOpenOpsTables();
1210
const mcpEndpoint = await openopsTables.getMcpEndpointList(token);
1311
if (!mcpEndpoint) {
1412
return {

packages/server/api/src/app/authentication/new-user/organization-assignment.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { authenticateDefaultUserInOpenOpsTables } from '@openops/common';
21
import { AppSystemProp, system } from '@openops/server-shared';
32
import { ApplicationError, ErrorCode, isNil, User } from '@openops/shared';
43
import { openopsTables } from '../../openops-tables';
@@ -54,7 +53,7 @@ async function addUserToDefaultWorkspace(values: {
5453
workspaceId: number;
5554
}): Promise<void> {
5655
const { token: defaultToken } =
57-
await authenticateDefaultUserInOpenOpsTables();
56+
await openopsTables.authenticateAdminUserInOpenOpsTables();
5857

5958
await openopsTables.addUserToWorkspace(defaultToken, {
6059
...values,

packages/server/api/src/app/database/migrations/1763394159990-AddTablesTokenToProject.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import { authenticateDefaultUserInOpenOpsTables } from '@openops/common';
2-
import { encryptUtils } from '@openops/server-shared';
1+
import { authenticateUserInOpenOpsTables } from '@openops/common';
2+
import { AppSystemProp, encryptUtils, system } from '@openops/server-shared';
33
import { MigrationInterface, QueryRunner } from 'typeorm';
44
import { openopsTables } from '../../openops-tables';
55

@@ -43,7 +43,9 @@ async function createTokensForExistingProjects(
4343
return;
4444
}
4545

46-
const { token } = await authenticateDefaultUserInOpenOpsTables();
46+
const adminEmail = system.getOrThrow(AppSystemProp.OPENOPS_ADMIN_EMAIL);
47+
const password = system.getOrThrow(AppSystemProp.OPENOPS_ADMIN_PASSWORD);
48+
const { token } = await authenticateUserInOpenOpsTables(adminEmail, password);
4749
for (const record of projects) {
4850
const newToken = await openopsTables.createDatabaseToken(
4951
record.tablesWorkspaceId,

packages/server/api/src/app/database/seeds/create-open-ops-tables-mcp-endpoint.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
1-
import { authenticateDefaultUserInOpenOpsTables } from '@openops/common';
21
import { logger } from '@openops/server-shared';
32
import { openopsTables } from '../../openops-tables';
43
import { OPENOPS_DEFAULT_WORKSPACE_NAME } from '../../openops-tables/default-workspace-database';
54

65
export const createOpenOpsTablesMcpEndpoint = async () => {
7-
const { token } = await authenticateDefaultUserInOpenOpsTables();
6+
const { token } = await openopsTables.authenticateAdminUserInOpenOpsTables();
87
const mcpEndpoints = await openopsTables.getMcpEndpointList(token);
98
const workspace = await openopsTables.getWorkspaceByName(
109
token,

packages/server/api/src/app/database/seeds/openops-delete-old-opportunities-table.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
/* TODO: remove this when all environments are migrated */
22

33
import {
4-
authenticateDefaultUserInOpenOpsTables,
54
createAxiosHeaders,
65
getTableByName,
76
makeOpenOpsTablesDelete,
87
} from '@openops/common';
98
import { logger } from '@openops/server-shared';
109
import { FlagEntity } from '../../flags/flag.entity';
10+
import { openopsTables } from '../../openops-tables';
1111
import { SEED_OPENOPS_TABLE_NAME } from '../../openops-tables/template-tables/create-opportunities-table';
1212
import { databaseConnection } from '../database-connection';
1313
import { getDefaultProjectTablesDatabaseToken } from '../get-default-user-db-token';
@@ -53,7 +53,8 @@ export const deleteOldOpportunitiesTable = async (): Promise<void> => {
5353
}
5454

5555
try {
56-
const { token } = await authenticateDefaultUserInOpenOpsTables();
56+
const { token } =
57+
await openopsTables.authenticateAdminUserInOpenOpsTables();
5758

5859
const table = await getTableByName(
5960
SEED_OPENOPS_TABLE_NAME,

packages/server/api/src/app/database/seeds/openops-tables-rename-database.ts

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,13 @@
11
/* TODO: remove this when all environments are migrated */
22

3-
import { logger } from '@openops/server-shared';
4-
import { FlagEntity } from '../../flags/flag.entity';
5-
import { openopsTables } from '../../openops-tables';
6-
import { databaseConnection } from '../database-connection';
7-
83
import {
9-
authenticateDefaultUserInOpenOpsTables,
104
getDefaultDatabaseId,
115
OPENOPS_DEFAULT_DATABASE_NAME,
126
} from '@openops/common';
7+
import { logger } from '@openops/server-shared';
8+
import { FlagEntity } from '../../flags/flag.entity';
9+
import { openopsTables } from '../../openops-tables';
10+
import { databaseConnection } from '../database-connection';
1311

1412
const OPENOPS_TABLES_DATABASE_RENAMED_FLAG = 'TABLES_DB_RENAMED';
1513
const isOpenopsTablesDatabaseAlreadyRenamed = async (): Promise<boolean> => {
@@ -39,7 +37,7 @@ export const updateOpenopsTablesDatabase = async (): Promise<void> => {
3937
return;
4038
}
4139

42-
const { token } = await authenticateDefaultUserInOpenOpsTables();
40+
const { token } = await openopsTables.authenticateAdminUserInOpenOpsTables();
4341

4442
try {
4543
const tablesDatabaseId = await getDefaultDatabaseId(

packages/server/api/src/app/database/seeds/seed-admin.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { authenticateDefaultUserInOpenOpsTables } from '@openops/common';
21
import { AppSystemProp, logger, system } from '@openops/server-shared';
32
import { OrganizationRole, Provider, User } from '@openops/shared';
43
import { authenticationService } from '../../authentication/basic/authentication-service';
@@ -81,7 +80,7 @@ async function ensureOpenOpsTablesWorkspaceAndDatabaseExist(): Promise<{
8180
workspaceId: number;
8281
databaseId: number;
8382
}> {
84-
const { token } = await authenticateDefaultUserInOpenOpsTables();
83+
const { token } = await openopsTables.authenticateAdminUserInOpenOpsTables();
8584

8685
const { workspaceId, databaseId, databaseToken } =
8786
await openopsTables.createDefaultWorkspaceAndDatabase(token);
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import { authenticateUserInOpenOpsTables } from '@openops/common';
2+
import { AppSystemProp, cacheWrapper, system } from '@openops/server-shared';
3+
import { IAxiosRetryConfig } from 'axios-retry';
4+
5+
export type AuthTokens = {
6+
token: string;
7+
refresh_token: string;
8+
};
9+
10+
export async function authenticateAdminUserInOpenOpsTables(
11+
axiosRetryConfig?: IAxiosRetryConfig,
12+
): Promise<AuthTokens> {
13+
const cacheKey = 'openops-tables-token';
14+
const tokenLifetimeMinutes = system.getNumber(
15+
AppSystemProp.TABLES_TOKEN_LIFETIME_MINUTES,
16+
);
17+
const tokenLifetimeSeconds = tokenLifetimeMinutes
18+
? (tokenLifetimeMinutes - 10) * 60
19+
: undefined;
20+
21+
let tokens = await cacheWrapper.getSerializedObject<AuthTokens>(cacheKey);
22+
23+
if (!tokens) {
24+
const email = system.getOrThrow(AppSystemProp.OPENOPS_ADMIN_EMAIL);
25+
const password = system.getOrThrow(AppSystemProp.OPENOPS_ADMIN_PASSWORD);
26+
27+
tokens = await authenticateUserInOpenOpsTables(
28+
email,
29+
password,
30+
axiosRetryConfig,
31+
);
32+
await cacheWrapper.setSerializedObject(
33+
cacheKey,
34+
tokens,
35+
tokenLifetimeSeconds,
36+
);
37+
}
38+
39+
return tokens;
40+
}

packages/server/api/src/app/openops-tables/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { addUserToWorkspace } from './add-user-workspace';
2+
import { authenticateAdminUserInOpenOpsTables } from './auth-admin-tables';
23
import { createDatabase } from './create-database';
34
import { createDatabaseToken } from './create-database-token';
45
import { createMcpEndpoint } from './create-mcp-endpoint';
@@ -28,4 +29,5 @@ export const openopsTables = {
2829
getMcpEndpointList,
2930
createMcpEndpoint,
3031
getWorkspaceByName,
32+
authenticateAdminUserInOpenOpsTables,
3133
};

packages/server/api/src/app/openops-tables/template-tables/seed-tables-for-templates.ts

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
import { authenticateDefaultUserInOpenOpsTables } from '@openops/common';
21
import { AppSystemProp, logger, system } from '@openops/server-shared';
32
import { projectService } from '../../project/project-service';
43
import { userService } from '../../user/user-service';
4+
import { openopsTables } from '../index';
55
import { createAggregatedCostsTable } from './create-aggregated-costs-table';
66
import { createAutoInstancesShutdownTable } from './create-auto-instances-shutdown-table';
77
import { createBusinessUnitsTable } from './create-business-units-table';
@@ -32,8 +32,9 @@ const getProjectTablesDatabaseId = async (): Promise<number> => {
3232
};
3333

3434
export const seedTemplateTablesService = {
35-
async createBaseTemplateTables(): Promise<void> {
36-
const { token } = await authenticateDefaultUserInOpenOpsTables();
35+
async createBaseTemplateTables() {
36+
const { token } =
37+
await openopsTables.authenticateAdminUserInOpenOpsTables();
3738
const databaseId = await getProjectTablesDatabaseId();
3839

3940
const buTable = await createBusinessUnitsTable(databaseId, token);
@@ -48,24 +49,27 @@ export const seedTemplateTablesService = {
4849
logger.info('[Seeding template tables] Done');
4950
},
5051

51-
async createOpportunityTemplateTable(): Promise<void> {
52-
const { token } = await authenticateDefaultUserInOpenOpsTables();
52+
async createOpportunityTemplateTable() {
53+
const { token } =
54+
await openopsTables.authenticateAdminUserInOpenOpsTables();
5355
const databaseId = await getProjectTablesDatabaseId();
5456

5557
await createOpportunitiesTable(token, databaseId);
5658

5759
logger.info('[Seeding opportunity template table] Done');
5860
},
5961

60-
async createAggregatedCostsTable(): Promise<void> {
61-
const { token } = await authenticateDefaultUserInOpenOpsTables();
62+
async createAggregatedCostsTable() {
63+
const { token } =
64+
await openopsTables.authenticateAdminUserInOpenOpsTables();
6265
const databaseId = await getProjectTablesDatabaseId();
6366

6467
await createAggregatedCostsTable(databaseId, token);
6568
},
6669

67-
async createKnownCostTypesByApplicationTable(): Promise<void> {
68-
const { token } = await authenticateDefaultUserInOpenOpsTables();
70+
async createKnownCostTypesByApplicationTable() {
71+
const { token } =
72+
await openopsTables.authenticateAdminUserInOpenOpsTables();
6973
const databaseId = await getProjectTablesDatabaseId();
7074

7175
await createKnownCostTypesByApplicationTable(token, databaseId);
@@ -74,7 +78,8 @@ export const seedTemplateTablesService = {
7478
},
7579

7680
async createAutoInstancesShutdownTable(): Promise<void> {
77-
const { token } = await authenticateDefaultUserInOpenOpsTables();
81+
const { token } =
82+
await openopsTables.authenticateAdminUserInOpenOpsTables();
7883
const databaseId = await getProjectTablesDatabaseId();
7984

8085
await createAutoInstancesShutdownTable(token, databaseId);

0 commit comments

Comments
 (0)