Improve workspace auth context surface (#18164)

This commit is contained in:
Weiko
2026-03-05 16:13:59 +01:00
committed by GitHub
parent 5853891b02
commit cfeea43eaf
118 changed files with 453 additions and 677 deletions
@@ -1,11 +1,11 @@
import { type QueryResultFieldValue } from 'src/engine/api/graphql/workspace-query-runner/factories/query-result-getters/interfaces/query-result-field-value';
import { type ResolverArgs } from 'src/engine/api/graphql/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface';
import { type AuthContext } from 'src/engine/core-modules/auth/types/auth-context.type';
import { type WorkspaceAuthContext } from 'src/engine/core-modules/auth/types/workspace-auth-context.type';
export interface WorkspacePreQueryHookInstance {
execute(
authContext: AuthContext,
authContext: WorkspaceAuthContext,
objectName: string,
payload: ResolverArgs,
): Promise<ResolverArgs>;
@@ -13,7 +13,7 @@ export interface WorkspacePreQueryHookInstance {
export interface WorkspacePostQueryHookInstance {
execute(
authContext: AuthContext,
authContext: WorkspaceAuthContext,
objectName: string,
payload: QueryResultFieldValue,
): Promise<void>;
@@ -12,6 +12,8 @@ import {
type WorkspacePreQueryHookInstance,
} from 'src/engine/api/graphql/workspace-query-runner/workspace-query-hook/interfaces/workspace-query-hook.interface';
import { isApiKeyAuthContext } from 'src/engine/core-modules/auth/guards/is-api-key-auth-context.guard';
import { isUserAuthContext } from 'src/engine/core-modules/auth/guards/is-user-auth-context.guard';
import { STANDARD_ERROR_MESSAGE } from 'src/engine/api/common/common-query-runners/errors/standard-error-message.constant';
import {
GraphqlQueryRunnerException,
@@ -171,14 +173,24 @@ export class WorkspaceQueryHookExplorer implements OnModuleInit {
const contextId = createContextId();
if (this.moduleRef.registerRequestByContextId) {
const authContext = executeParams[0];
this.moduleRef.registerRequestByContextId(
{
req: {
workspaceId: workspace.id,
userWorkspaceId: executeParams?.[0].userWorkspaceId,
apiKey: executeParams?.[0].apiKey,
workspaceMemberId: executeParams?.[0].workspaceMemberId,
user: executeParams?.[0].user,
userWorkspaceId: isUserAuthContext(authContext)
? authContext.userWorkspaceId
: undefined,
apiKey: isApiKeyAuthContext(authContext)
? authContext.apiKey
: undefined,
workspaceMemberId: isUserAuthContext(authContext)
? authContext.workspaceMemberId
: undefined,
user: isUserAuthContext(authContext)
? authContext.user
: undefined,
},
},
contextId,
@@ -10,7 +10,7 @@ import { type WorkspaceQueryHookKey } from 'src/engine/api/graphql/workspace-que
import { WorkspaceQueryHookStorage } from 'src/engine/api/graphql/workspace-query-runner/workspace-query-hook/storage/workspace-query-hook.storage';
import { type WorkspacePreQueryHookPayload } from 'src/engine/api/graphql/workspace-query-runner/workspace-query-hook/types/workspace-query-hook.type';
import { WorkspaceQueryHookExplorer } from 'src/engine/api/graphql/workspace-query-runner/workspace-query-hook/workspace-query-hook.explorer';
import { type AuthContext } from 'src/engine/core-modules/auth/types/auth-context.type';
import { type WorkspaceAuthContext } from 'src/engine/core-modules/auth/types/workspace-auth-context.type';
@Injectable()
export class WorkspaceQueryHookService {
@@ -23,7 +23,7 @@ export class WorkspaceQueryHookService {
public async executePreQueryHooks<
T extends WorkspaceResolverBuilderMethodNames | CommonQueryNames,
>(
authContext: AuthContext,
authContext: WorkspaceAuthContext,
// TODO: We should allow wildcard for object name
objectName: string,
methodName: T,
@@ -56,7 +56,7 @@ export class WorkspaceQueryHookService {
public async executePostQueryHooks<
T extends WorkspaceResolverBuilderMethodNames,
>(
authContext: AuthContext,
authContext: WorkspaceAuthContext,
// TODO: We should allow wildcard for object name
objectName: string,
methodName: T,
@@ -36,7 +36,6 @@ export class CreateManyResolverFactory
const resolverContext = createQueryRunnerContext({
workspaceSchemaBuilderContext: internalContext,
request: requestContext.req,
});
try {
@@ -35,7 +35,6 @@ export class CreateOneResolverFactory
const resolverContext = createQueryRunnerContext({
workspaceSchemaBuilderContext: internalContext,
request: requestContext.req,
});
try {
@@ -36,7 +36,6 @@ export class DeleteManyResolverFactory
const resolverContext = createQueryRunnerContext({
workspaceSchemaBuilderContext: internalContext,
request: requestContext.req,
});
try {
@@ -35,7 +35,6 @@ export class DeleteOneResolverFactory
const resolverContext = createQueryRunnerContext({
workspaceSchemaBuilderContext: internalContext,
request: requestContext.req,
});
try {
@@ -36,7 +36,6 @@ export class DestroyManyResolverFactory
const resolverContext = createQueryRunnerContext({
workspaceSchemaBuilderContext: internalContext,
request: requestContext.req,
});
try {
@@ -35,7 +35,6 @@ export class DestroyOneResolverFactory
const resolverContext = createQueryRunnerContext({
workspaceSchemaBuilderContext: internalContext,
request: requestContext.req,
});
try {
@@ -36,7 +36,6 @@ export class FindDuplicatesResolverFactory
const resolverContext = createQueryRunnerContext({
workspaceSchemaBuilderContext: internalContext,
request: requestContext.req,
});
try {
@@ -36,7 +36,6 @@ export class FindManyResolverFactory
const resolverContext = createQueryRunnerContext({
workspaceSchemaBuilderContext: internalContext,
request: requestContext.req,
});
try {
@@ -36,7 +36,6 @@ export class FindOneResolverFactory
const resolverContext = createQueryRunnerContext({
workspaceSchemaBuilderContext: internalContext,
request: requestContext.req,
});
const record = await this.commonFindOneQueryRunnerService.execute(
@@ -36,7 +36,6 @@ export class GroupByResolverFactory
const resolverContext = createQueryRunnerContext({
workspaceSchemaBuilderContext: internalContext,
request: requestContext.req,
});
const shouldIncludeRecords =
@@ -35,7 +35,6 @@ export class MergeManyResolverFactory
const resolverContext = createQueryRunnerContext({
workspaceSchemaBuilderContext: internalContext,
request: requestContext.req,
});
try {
@@ -36,7 +36,6 @@ export class RestoreManyResolverFactory
const resolverContext = createQueryRunnerContext({
workspaceSchemaBuilderContext: internalContext,
request: requestContext.req,
});
try {
@@ -35,7 +35,6 @@ export class RestoreOneResolverFactory
const resolverContext = createQueryRunnerContext({
workspaceSchemaBuilderContext: internalContext,
request: requestContext.req,
});
try {
@@ -36,7 +36,6 @@ export class UpdateManyResolverFactory
const resolverContext = createQueryRunnerContext({
workspaceSchemaBuilderContext: internalContext,
request: requestContext.req,
});
try {
@@ -35,7 +35,6 @@ export class UpdateOneResolverFactory
const resolverContext = createQueryRunnerContext({
workspaceSchemaBuilderContext: internalContext,
request: requestContext.req,
});
try {
@@ -1,41 +1,15 @@
import { type WorkspaceSchemaBuilderContext } from 'src/engine/api/graphql/workspace-schema-builder/interfaces/workspace-schema-builder-context.interface';
import { type CommonBaseQueryRunnerContext } from 'src/engine/api/common/types/common-base-query-runner-context.type';
import { type AuthContext } from 'src/engine/core-modules/auth/types/auth-context.type';
import { getWorkspaceAuthContext } from 'src/engine/core-modules/auth/storage/workspace-auth-context.storage';
export const createQueryRunnerContext = ({
workspaceSchemaBuilderContext,
request,
}: {
workspaceSchemaBuilderContext: WorkspaceSchemaBuilderContext;
request: AuthContext;
}): CommonBaseQueryRunnerContext => {
const {
user,
workspace,
apiKey,
workspaceMemberId,
userWorkspaceId,
userWorkspace,
authProvider,
impersonationContext,
workspaceMember,
application,
} = request;
return {
...workspaceSchemaBuilderContext,
authContext: {
user,
workspace,
apiKey,
workspaceMemberId,
userWorkspaceId,
userWorkspace,
authProvider,
impersonationContext,
workspaceMember,
application,
},
authContext: getWorkspaceAuthContext(),
};
};