Merge branch 'main' into iain/ratelimiter-should-respect-configuration

This commit is contained in:
Iain Sproat
2025-03-04 16:36:43 +00:00
107 changed files with 2650 additions and 1014 deletions
@@ -43,7 +43,6 @@ import { getInvitationTargetUsersFactory } from '@/modules/serverinvites/service
import { authorizeResolver } from '@/modules/shared'
import {
getFeatureFlags,
getServerOrigin,
isRateLimiterEnabled
} from '@/modules/shared/helpers/envHelper'
import { getEventBus } from '@/modules/shared/services/eventBus'
@@ -169,17 +168,12 @@ import {
listWorkspaceSsoMembershipsFactory
} from '@/modules/workspaces/repositories/sso'
import { getDecryptor } from '@/modules/workspaces/helpers/sso'
import { getWorkspaceFunctions } from '@/modules/automate/clients/executionEngine'
import { getFunctionsFactory } from '@/modules/automate/clients/executionEngine'
import {
ExecutionEngineFailedResponseError,
ExecutionEngineNetworkError
} from '@/modules/automate/errors/executionEngine'
import { getDefaultRegionFactory } from '@/modules/workspaces/repositories/regions'
import {
AuthCodePayloadAction,
createStoredAuthCodeFactory
} from '@/modules/automate/services/authCode'
import { getGenericRedis } from '@/modules/shared/redis/redis'
import { convertFunctionToGraphQLReturn } from '@/modules/automate/services/functionManagement'
import {
getWorkspacePlanFactory,
@@ -202,6 +196,13 @@ import { OperationTypeNode } from 'graphql'
import { updateWorkspacePlanFactory } from '@/modules/gatekeeper/services/workspacePlans'
import { GetWorkspaceCollaboratorsArgs } from '@/modules/workspaces/domain/operations'
import { WorkspaceTeamMember } from '@/modules/workspaces/domain/types'
import { UsersMeta } from '@/modules/core/dbSchema'
import { setUserActiveWorkspaceFactory } from '@/modules/workspaces/repositories/users'
import { getGenericRedis } from '@/modules/shared/redis/redis'
import {
AuthCodePayloadAction,
createStoredAuthCodeFactory
} from '@/modules/automate/services/authCode'
const eventBus = getEventBus()
const getServerInfo = getServerInfoFactory({ db })
@@ -1079,6 +1080,13 @@ export = FF_WORKSPACES_MODULE_ENABLED
},
automateFunctions: async (parent, args, context) => {
try {
await authorizeResolver(
context.userId,
parent.id,
Roles.Workspace.Member,
context.resourceAccessRules
)
const authCode = await createStoredAuthCodeFactory({
redis: getGenericRedis()
})({
@@ -1086,14 +1094,18 @@ export = FF_WORKSPACES_MODULE_ENABLED
action: AuthCodePayloadAction.ListWorkspaceFunctions
})
const res = await getWorkspaceFunctions({
workspaceId: parent.id,
query: removeNullOrUndefinedKeys(args),
body: {
speckleServerAuthenticationPayload: {
...authCode,
origin: getServerOrigin()
}
const res = await getFunctionsFactory({
logger: context.log
})({
auth: authCode,
filters: {
query: args.filter?.search ?? undefined,
cursor: args.cursor ?? undefined,
limit: args.limit,
requireRelease: true,
includeFeatured: true,
includeWorkspaces: [parent.id],
includeUsers: []
}
})
@@ -1105,12 +1117,12 @@ export = FF_WORKSPACES_MODULE_ENABLED
}
}
const items = res.functions.map(convertFunctionToGraphQLReturn)
const items = res.items.map(convertFunctionToGraphQLReturn)
return {
cursor: undefined,
totalCount: res.functions.length,
items
items,
cursor: res.cursor,
totalCount: res.totalCount
}
} catch (e) {
const isNotFound =
@@ -1296,6 +1308,26 @@ export = FF_WORKSPACES_MODULE_ENABLED
})
return await getInvites(parent.id)
},
async activeWorkspace(parent, _args, ctx) {
const metaVal = await ctx.loaders.users.getUserMeta.load({
userId: parent.id,
key: UsersMeta.metaKey.activeWorkspace
})
if (!metaVal?.value) return null
return await getWorkspaceBySlugFactory({ db })({
workspaceSlug: metaVal.value
})
},
async isProjectsActive(parent, _args, ctx) {
const metaVal = await ctx.loaders.users.getUserMeta.load({
userId: parent.id,
key: UsersMeta.metaKey.isProjectsActive
})
return !!metaVal?.value
}
},
Project: {
@@ -1386,6 +1418,31 @@ export = FF_WORKSPACES_MODULE_ENABLED
return team
}
},
ActiveUserMutations: {
async setActiveWorkspace(_parent, args, ctx) {
const userId = ctx.userId
if (!userId) return false
await Promise.all([
ctx.loaders.users.getUserMeta.clear({
userId,
key: UsersMeta.metaKey.activeWorkspace
}),
ctx.loaders.users.getUserMeta.clear({
userId,
key: UsersMeta.metaKey.isProjectsActive
})
])
await setUserActiveWorkspaceFactory({ db })({
userId,
workspaceSlug: args.slug ?? null,
isProjectsActive: !!args.isProjectsActive
})
return true
}
},
Subscription: {
workspaceProjectsUpdated: {
subscribe: filteredSubscribe(