From 0d2fb7db9bfbfd8f154db1cbcffe1be39a34a8bb Mon Sep 17 00:00:00 2001 From: Kristaps Fabians Geikins Date: Thu, 17 Oct 2024 13:23:13 +0300 Subject: [PATCH] chore(server): core IoC #82 - (most) branches resolvers to TS --- packages/server/codegen.yml | 1 + .../modules/core/graph/generated/graphql.ts | 6 +- .../modules/core/graph/resolvers/branches.js | 124 ------------------ .../core/graph/resolvers/branchesNew.ts | 124 ++++++++++++++++++ .../server/modules/core/helpers/graphTypes.ts | 2 + 5 files changed, 130 insertions(+), 127 deletions(-) create mode 100644 packages/server/modules/core/graph/resolvers/branchesNew.ts diff --git a/packages/server/codegen.yml b/packages/server/codegen.yml index cba5e0666..1b2a77399 100644 --- a/packages/server/codegen.yml +++ b/packages/server/codegen.yml @@ -72,6 +72,7 @@ generates: ServerApp: '@/modules/auth/helpers/graphTypes#ServerAppGraphQLReturn' ServerAppListItem: '@/modules/auth/helpers/graphTypes#ServerAppListItemGraphQLReturn' ServerInfo: '@/modules/core/helpers/graphTypes#ServerInfoGraphQLReturn' + Branch: '@/modules/core/helpers/graphTypes#BranchGraphQLReturn' modules/cross-server-sync/graph/generated/graphql.ts: plugins: - 'typescript' diff --git a/packages/server/modules/core/graph/generated/graphql.ts b/packages/server/modules/core/graph/generated/graphql.ts index 4dccc29f8..5db603fcc 100644 --- a/packages/server/modules/core/graph/generated/graphql.ts +++ b/packages/server/modules/core/graph/generated/graphql.ts @@ -1,5 +1,5 @@ import { GraphQLResolveInfo, GraphQLScalarType, GraphQLScalarTypeConfig } from 'graphql'; -import { StreamGraphQLReturn, CommitGraphQLReturn, ProjectGraphQLReturn, ObjectGraphQLReturn, VersionGraphQLReturn, ServerInviteGraphQLReturnType, ModelGraphQLReturn, ModelsTreeItemGraphQLReturn, MutationsObjectGraphQLReturn, LimitedUserGraphQLReturn, UserGraphQLReturn, GraphQLEmptyReturn, StreamCollaboratorGraphQLReturn, ServerInfoGraphQLReturn } from '@/modules/core/helpers/graphTypes'; +import { StreamGraphQLReturn, CommitGraphQLReturn, ProjectGraphQLReturn, ObjectGraphQLReturn, VersionGraphQLReturn, ServerInviteGraphQLReturnType, ModelGraphQLReturn, ModelsTreeItemGraphQLReturn, MutationsObjectGraphQLReturn, LimitedUserGraphQLReturn, UserGraphQLReturn, GraphQLEmptyReturn, StreamCollaboratorGraphQLReturn, ServerInfoGraphQLReturn, BranchGraphQLReturn } from '@/modules/core/helpers/graphTypes'; import { StreamAccessRequestGraphQLReturn, ProjectAccessRequestGraphQLReturn } from '@/modules/accessrequests/helpers/graphTypes'; import { CommentReplyAuthorCollectionGraphQLReturn, CommentGraphQLReturn } from '@/modules/comments/helpers/graphTypes'; import { PendingStreamCollaboratorGraphQLReturn } from '@/modules/serverinvites/helpers/graphTypes'; @@ -4339,7 +4339,7 @@ export type ResolversTypes = { BlobMetadata: ResolverTypeWrapper; BlobMetadataCollection: ResolverTypeWrapper & { items?: Maybe> }>; Boolean: ResolverTypeWrapper; - Branch: ResolverTypeWrapper & { activity?: Maybe, author?: Maybe, commits?: Maybe }>; + Branch: ResolverTypeWrapper; BranchCollection: ResolverTypeWrapper & { items?: Maybe> }>; BranchCreateInput: BranchCreateInput; BranchDeleteInput: BranchDeleteInput; @@ -4599,7 +4599,7 @@ export type ResolversParentTypes = { BlobMetadata: BlobStorageItem; BlobMetadataCollection: Omit & { items?: Maybe> }; Boolean: Scalars['Boolean']['output']; - Branch: Omit & { activity?: Maybe, author?: Maybe, commits?: Maybe }; + Branch: BranchGraphQLReturn; BranchCollection: Omit & { items?: Maybe> }; BranchCreateInput: BranchCreateInput; BranchDeleteInput: BranchDeleteInput; diff --git a/packages/server/modules/core/graph/resolvers/branches.js b/packages/server/modules/core/graph/resolvers/branches.js index 4710d40a3..0ca94e8e5 100644 --- a/packages/server/modules/core/graph/resolvers/branches.js +++ b/packages/server/modules/core/graph/resolvers/branches.js @@ -1,142 +1,18 @@ -'use strict' - const { withFilter } = require('graphql-subscriptions') - const { pubsub, BranchSubscriptions: BranchPubsubEvents } = require('@/modules/shared/utils/subscriptions') const { authorizeResolver } = require('@/modules/shared') - -const { - createBranchAndNotifyFactory, - updateBranchAndNotifyFactory, - deleteBranchAndNotifyFactory -} = require('@/modules/core/services/branch/management') -const { - getPaginatedStreamBranches -} = require('@/modules/core/services/branch/retrieval') - const { Roles } = require('@speckle/shared') -const { - getBranchByIdFactory, - getStreamBranchByNameFactory, - createBranchFactory, - updateBranchFactory, - deleteBranchByIdFactory -} = require('@/modules/core/repositories/branches') -const { db } = require('@/db/knex') -const { - addBranchCreatedActivity, - addBranchUpdatedActivity, - addBranchDeletedActivity -} = require('@/modules/activitystream/services/branchActivity') -const { - getStreamFactory, - markBranchStreamUpdatedFactory -} = require('@/modules/core/repositories/streams') -const { ModelsEmitter } = require('@/modules/core/events/modelsEmitter') -const { legacyGetUserFactory } = require('@/modules/core/repositories/users') // subscription events const BRANCH_CREATED = BranchPubsubEvents.BranchCreated const BRANCH_UPDATED = BranchPubsubEvents.BranchUpdated const BRANCH_DELETED = BranchPubsubEvents.BranchDeleted -const markBranchStreamUpdated = markBranchStreamUpdatedFactory({ db }) -const getStream = getStreamFactory({ db }) -const getBranchById = getBranchByIdFactory({ db }) -const getStreamBranchByName = getStreamBranchByNameFactory({ db }) -const createBranchAndNotify = createBranchAndNotifyFactory({ - getStreamBranchByName, - createBranch: createBranchFactory({ db }), - addBranchCreatedActivity -}) -const updateBranchAndNotify = updateBranchAndNotifyFactory({ - getBranchById, - updateBranch: updateBranchFactory({ db }), - addBranchUpdatedActivity -}) -const deleteBranchAndNotify = deleteBranchAndNotifyFactory({ - getStream, - getBranchById: getBranchByIdFactory({ db }), - modelsEventsEmitter: ModelsEmitter.emit, - markBranchStreamUpdated, - addBranchDeletedActivity, - deleteBranchById: deleteBranchByIdFactory({ db }) -}) -const getUser = legacyGetUserFactory({ db }) - /** @type {import('@/modules/core/graph/generated/graphql').Resolvers} */ module.exports = { - Query: {}, - Stream: { - async branches(parent, args) { - return await getPaginatedStreamBranches(parent.id, args) - }, - - async branch(parent, args) { - // TODO: TEMPORARY HACK - // Temporary "Forwards" compatibility layer to allow .NET and PY clients - // to use FE2 urls without major changes. - // When getting a branch by name, if not found, we try to do a 'hail mary' attempt - // and get it by id as well (this would be coming from a FE2 url). - - const branchByName = await getStreamBranchByName(parent.id, args.name) - if (branchByName) return branchByName - - const branchByIdRes = await getBranchById(args.name) - if (!branchByIdRes) return null - - // Extra validation to check if it actually belongs to the stream - if (branchByIdRes.streamId !== parent.id) return null - return branchByIdRes - } - }, - Branch: { - async author(parent, args, context) { - if (parent.authorId && context.auth) return await getUser(parent.authorId) - else return null - } - }, - Mutation: { - async branchCreate(parent, args, context) { - await authorizeResolver( - context.userId, - args.branch.streamId, - Roles.Stream.Contributor, - context.resourceAccessRules - ) - - const { id } = await createBranchAndNotify(args.branch, context.userId) - - return id - }, - - async branchUpdate(parent, args, context) { - await authorizeResolver( - context.userId, - args.branch.streamId, - Roles.Stream.Contributor, - context.resourceAccessRules - ) - - const newBranch = await updateBranchAndNotify(args.branch, context.userId) - return !!newBranch - }, - - async branchDelete(parent, args, context) { - await authorizeResolver( - context.userId, - args.branch.streamId, - Roles.Stream.Contributor, - context.resourceAccessRules - ) - - const deleted = await deleteBranchAndNotify(args.branch, context.userId) - return deleted - } - }, Subscription: { branchCreated: { subscribe: withFilter( diff --git a/packages/server/modules/core/graph/resolvers/branchesNew.ts b/packages/server/modules/core/graph/resolvers/branchesNew.ts new file mode 100644 index 000000000..3847b93c0 --- /dev/null +++ b/packages/server/modules/core/graph/resolvers/branchesNew.ts @@ -0,0 +1,124 @@ +import { authorizeResolver } from '@/modules/shared' +import { + createBranchAndNotifyFactory, + updateBranchAndNotifyFactory, + deleteBranchAndNotifyFactory +} from '@/modules/core/services/branch/management' +import { getPaginatedStreamBranches } from '@/modules/core/services/branch/retrieval' + +import { Roles } from '@speckle/shared' +import { + getBranchByIdFactory, + getStreamBranchByNameFactory, + createBranchFactory, + updateBranchFactory, + deleteBranchByIdFactory +} from '@/modules/core/repositories/branches' +import { db } from '@/db/knex' +import { + addBranchCreatedActivity, + addBranchUpdatedActivity, + addBranchDeletedActivity +} from '@/modules/activitystream/services/branchActivity' +import { + getStreamFactory, + markBranchStreamUpdatedFactory +} from '@/modules/core/repositories/streams' +import { ModelsEmitter } from '@/modules/core/events/modelsEmitter' +import { legacyGetUserFactory } from '@/modules/core/repositories/users' +import { Resolvers } from '@/modules/core/graph/generated/graphql' + +const markBranchStreamUpdated = markBranchStreamUpdatedFactory({ db }) +const getStream = getStreamFactory({ db }) +const getBranchById = getBranchByIdFactory({ db }) +const getStreamBranchByName = getStreamBranchByNameFactory({ db }) +const createBranchAndNotify = createBranchAndNotifyFactory({ + getStreamBranchByName, + createBranch: createBranchFactory({ db }), + addBranchCreatedActivity +}) +const updateBranchAndNotify = updateBranchAndNotifyFactory({ + getBranchById, + updateBranch: updateBranchFactory({ db }), + addBranchUpdatedActivity +}) +const deleteBranchAndNotify = deleteBranchAndNotifyFactory({ + getStream, + getBranchById: getBranchByIdFactory({ db }), + modelsEventsEmitter: ModelsEmitter.emit, + markBranchStreamUpdated, + addBranchDeletedActivity, + deleteBranchById: deleteBranchByIdFactory({ db }) +}) +const getUser = legacyGetUserFactory({ db }) + +export = { + Query: {}, + Stream: { + async branches(parent, args) { + return await getPaginatedStreamBranches(parent.id, args) + }, + + async branch(parent, args) { + // TODO: TEMPORARY HACK + // Temporary "Forwards" compatibility layer to allow .NET and PY clients + // to use FE2 urls without major changes. + // When getting a branch by name, if not found, we try to do a 'hail mary' attempt + // and get it by id as well (this would be coming from a FE2 url). + + const branchByName = await getStreamBranchByName(parent.id, args.name) + if (branchByName) return branchByName + + const branchByIdRes = await getBranchById(args.name) + if (!branchByIdRes) return null + + // Extra validation to check if it actually belongs to the stream + if (branchByIdRes.streamId !== parent.id) return null + return branchByIdRes + } + }, + Branch: { + async author(parent, _args, context) { + if (parent.authorId && context.auth) return await getUser(parent.authorId) + else return null + } + }, + Mutation: { + async branchCreate(_parent, args, context) { + await authorizeResolver( + context.userId, + args.branch.streamId, + Roles.Stream.Contributor, + context.resourceAccessRules + ) + + const { id } = await createBranchAndNotify(args.branch, context.userId!) + + return id + }, + + async branchUpdate(_parent, args, context) { + await authorizeResolver( + context.userId, + args.branch.streamId, + Roles.Stream.Contributor, + context.resourceAccessRules + ) + + const newBranch = await updateBranchAndNotify(args.branch, context.userId!) + return !!newBranch + }, + + async branchDelete(_parent, args, context) { + await authorizeResolver( + context.userId, + args.branch.streamId, + Roles.Stream.Contributor, + context.resourceAccessRules + ) + + const deleted = await deleteBranchAndNotify(args.branch, context.userId!) + return deleted + } + } +} as Resolvers diff --git a/packages/server/modules/core/helpers/graphTypes.ts b/packages/server/modules/core/helpers/graphTypes.ts index 9998833b2..ffdc80791 100644 --- a/packages/server/modules/core/helpers/graphTypes.ts +++ b/packages/server/modules/core/helpers/graphTypes.ts @@ -40,6 +40,8 @@ export type CommitGraphQLReturn = Commit & { author: Nullable } +export type BranchGraphQLReturn = BranchRecord + export type ProjectGraphQLReturn = StreamGraphQLReturn export type ModelGraphQLReturn = BranchRecord