diff --git a/packages/server/modules/auth/domain/operations.ts b/packages/server/modules/auth/domain/operations.ts index 3bcaf4ed8..893ffe614 100644 --- a/packages/server/modules/auth/domain/operations.ts +++ b/packages/server/modules/auth/domain/operations.ts @@ -14,6 +14,10 @@ export type GetAllAppsCreatedByUser = (params: { userId: string }) => Promise +export type GetAllAppsAuthorizedByUser = (params: { + userId: string +}) => Promise + export type GetAllScopes = () => Promise export type RegisterDefaultApp = (app: DefaultAppWithUnwrappedScopes) => Promise diff --git a/packages/server/modules/auth/graph/resolvers/apps.js b/packages/server/modules/auth/graph/resolvers/apps.js index 346bb486e..f42905e53 100644 --- a/packages/server/modules/auth/graph/resolvers/apps.js +++ b/packages/server/modules/auth/graph/resolvers/apps.js @@ -1,6 +1,5 @@ const { ForbiddenError } = require('@/modules/shared/errors') const { - getAllAppsAuthorizedByUser, createApp, updateApp, deleteApp, @@ -10,13 +9,15 @@ const { Roles } = require('@speckle/shared') const { getAppFactory, getAllPublicAppsFactory, - getAllAppsCreatedByUserFactory + getAllAppsCreatedByUserFactory, + getAllAppsAuthorizedByUserFactory } = require('@/modules/auth/repositories/apps') const { db } = require('@/db/knex') const getApp = getAppFactory({ db }) const getAllPublicApps = getAllPublicAppsFactory({ db }) const getAllAppsCreatedByUser = getAllAppsCreatedByUserFactory({ db }) +const getAllAppsAuthorizedByUser = getAllAppsAuthorizedByUserFactory({ db }) module.exports = { Query: { diff --git a/packages/server/modules/auth/repositories/apps.ts b/packages/server/modules/auth/repositories/apps.ts index 060e29d7f..d0aa25d3a 100644 --- a/packages/server/modules/auth/repositories/apps.ts +++ b/packages/server/modules/auth/repositories/apps.ts @@ -1,6 +1,7 @@ import { moduleLogger } from '@/logging/logging' import { getDefaultApp } from '@/modules/auth/defaultApps' import { + GetAllAppsAuthorizedByUser, GetAllAppsCreatedByUser, GetAllPublicApps, GetAllScopes, @@ -135,6 +136,30 @@ export const getAllAppsCreatedByUserFactory = })) } +export const getAllAppsAuthorizedByUserFactory = + (deps: { db: Knex }): GetAllAppsAuthorizedByUser => + async ({ userId }) => { + const query = deps.db.raw( + ` + SELECT DISTINCT ON (a."appId") a."appId" as id, sa."name", sa."description", sa."trustByDefault", sa."redirectUrl" as "redirectUrl", sa.logo, sa."termsAndConditionsLink", json_build_object('name', u.name, 'id', sa."authorId") as author + FROM user_server_app_tokens a + LEFT JOIN server_apps sa ON sa.id = a."appId" + LEFT JOIN users u ON sa."authorId" = u.id + WHERE a."userId" = ? + `, + [userId] + ) + + const { rows } = (await query) as { + rows: Array }> + } + return rows.map((r) => ({ + ...r, + redirectUrl: getAppRedirectUrl(r), + author: r.author?.id ? { ...r.author, avatar: null } : null + })) + } + export const getAllScopesFactory = (deps: { db: Knex }): GetAllScopes => async () => { diff --git a/packages/server/modules/auth/services/apps.js b/packages/server/modules/auth/services/apps.js index e2bfb4fe3..4e6426ab1 100644 --- a/packages/server/modules/auth/services/apps.js +++ b/packages/server/modules/auth/services/apps.js @@ -5,7 +5,6 @@ const knex = require(`@/db/knex`) const { createBareToken, createAppToken } = require(`@/modules/core/services/tokens`) const { logger } = require('@/logging/logging') -const { getDefaultApp } = require('@/modules/auth/defaultApps') const { getAppFactory } = require('@/modules/auth/repositories/apps') const ApiTokens = () => knex('api_tokens') const ServerApps = () => knex('server_apps') @@ -14,35 +13,7 @@ const ServerAppsScopes = () => knex('server_apps_scopes') const AuthorizationCodes = () => knex('authorization_codes') const RefreshTokens = () => knex('refresh_tokens') -const addDefaultAppOverrides = (app) => { - const defaultApp = getDefaultApp({ id: app.id }) - if (defaultApp) app.redirectUrl = defaultApp.redirectUrl - return app -} - module.exports = { - async getAllAppsAuthorizedByUser({ userId }) { - const query = knex.raw( - ` - SELECT DISTINCT ON (a."appId") a."appId" as id, sa."name", sa."description", sa."trustByDefault", sa."redirectUrl" as "redirectUrl", sa.logo, sa."termsAndConditionsLink", json_build_object('name', u.name, 'id', sa."authorId") as author - FROM user_server_app_tokens a - LEFT JOIN server_apps sa ON sa.id = a."appId" - LEFT JOIN users u ON sa."authorId" = u.id - WHERE a."userId" = ? - `, - [userId] - ) - - const { rows } = await query - return rows.map((r) => { - const app = { - ...r, - author: r.author?.id ? r.author : null - } - return addDefaultAppOverrides(app) - }) - }, - async createApp(app) { app.id = crs({ length: 10 }) app.secret = crs({ length: 10 })