From ee5797af280db04676a18643e05042a7a7613905 Mon Sep 17 00:00:00 2001 From: Alessandro Magionami Date: Fri, 10 Jan 2025 18:21:14 +0100 Subject: [PATCH] feat(workspaces): fix dismiss and tests --- .../modules/workspaces/errors/workspace.ts | 6 ----- .../workspaces/graph/resolvers/workspaces.ts | 1 + .../repositories/workspaceJoinRequests.ts | 6 +++-- .../services/workspaceJoinRequests.ts | 18 ++++++++++----- ....spec.ts => workspaceJoinRequests.spec.ts} | 23 ++++++++++++------- .../integration/workspaces.graph.spec.ts | 13 ++--------- 6 files changed, 34 insertions(+), 33 deletions(-) rename packages/server/modules/workspaces/tests/integration/{workspaceJoinReqquests.spec.ts => workspaceJoinRequests.spec.ts} (73%) diff --git a/packages/server/modules/workspaces/errors/workspace.ts b/packages/server/modules/workspaces/errors/workspace.ts index 19d2b012b..5a81b76b1 100644 --- a/packages/server/modules/workspaces/errors/workspace.ts +++ b/packages/server/modules/workspaces/errors/workspace.ts @@ -119,9 +119,3 @@ export class WorkspacePaidPlanActiveError extends BaseError { static code = 'WORKSPACE_PAID_PLAN_ACTIVE' static statusCode = 400 } - -export class WorkspaceJoinRequestNotFoundError extends BaseError { - static defaultMessage = 'Joinable workspace not found' - static code = 'WORKSPACE_JOIN_REQUEST_NOT_FOUND_ERROR' - static statusCode = 404 -} diff --git a/packages/server/modules/workspaces/graph/resolvers/workspaces.ts b/packages/server/modules/workspaces/graph/resolvers/workspaces.ts index da269a6f4..3717918ab 100644 --- a/packages/server/modules/workspaces/graph/resolvers/workspaces.ts +++ b/packages/server/modules/workspaces/graph/resolvers/workspaces.ts @@ -779,6 +779,7 @@ export = FF_WORKSPACES_MODULE_ENABLED projects: () => ({}), dismiss: async (_parent, args, ctx) => { return await dismissWorkspaceJoinRequestFactory({ + getWorkspace: getWorkspaceFactory({ db }), updateWorkspaceJoinRequestStatus: updateWorkspaceJoinRequestStatusFactory({ db }) diff --git a/packages/server/modules/workspaces/repositories/workspaceJoinRequests.ts b/packages/server/modules/workspaces/repositories/workspaceJoinRequests.ts index a8a178231..a9ab04ca5 100644 --- a/packages/server/modules/workspaces/repositories/workspaceJoinRequests.ts +++ b/packages/server/modules/workspaces/repositories/workspaceJoinRequests.ts @@ -13,7 +13,9 @@ export const updateWorkspaceJoinRequestStatusFactory = async ({ workspaceId, userId, status }) => { const [request] = await tables .workspaceJoinRequests(db) - .update({ status }, ['workspaceId', 'userId']) - .where({ workspaceId, userId }) + .insert({ workspaceId, userId, status }) + .onConflict(['workspaceId', 'userId']) + .merge(['status']) + .returning('*') return request } diff --git a/packages/server/modules/workspaces/services/workspaceJoinRequests.ts b/packages/server/modules/workspaces/services/workspaceJoinRequests.ts index a94fa5bf7..f758bc091 100644 --- a/packages/server/modules/workspaces/services/workspaceJoinRequests.ts +++ b/packages/server/modules/workspaces/services/workspaceJoinRequests.ts @@ -1,20 +1,26 @@ -import { UpdateWorkspaceJoinRequestStatus } from '@/modules/workspaces/domain/operations' -import { WorkspaceJoinRequestNotFoundError } from '@/modules/workspaces/errors/workspace' +import { + GetWorkspace, + UpdateWorkspaceJoinRequestStatus +} from '@/modules/workspaces/domain/operations' +import { WorkspaceNotFoundError } from '@/modules/workspaces/errors/workspace' export const dismissWorkspaceJoinRequestFactory = ({ + getWorkspace, updateWorkspaceJoinRequestStatus }: { + getWorkspace: GetWorkspace updateWorkspaceJoinRequestStatus: UpdateWorkspaceJoinRequestStatus }) => async ({ userId, workspaceId }: { userId: string; workspaceId: string }) => { - const updated = await updateWorkspaceJoinRequestStatus({ + const workspace = await getWorkspace({ workspaceId }) + if (!workspace) { + throw new WorkspaceNotFoundError() + } + await updateWorkspaceJoinRequestStatus({ userId, workspaceId, status: 'dismissed' }) - if (!updated) { - throw new WorkspaceJoinRequestNotFoundError() - } return true } diff --git a/packages/server/modules/workspaces/tests/integration/workspaceJoinReqquests.spec.ts b/packages/server/modules/workspaces/tests/integration/workspaceJoinRequests.spec.ts similarity index 73% rename from packages/server/modules/workspaces/tests/integration/workspaceJoinReqquests.spec.ts rename to packages/server/modules/workspaces/tests/integration/workspaceJoinRequests.spec.ts index ac2335486..2f8b3c598 100644 --- a/packages/server/modules/workspaces/tests/integration/workspaceJoinReqquests.spec.ts +++ b/packages/server/modules/workspaces/tests/integration/workspaceJoinRequests.spec.ts @@ -1,7 +1,9 @@ import { db } from '@/db/knex' import { createRandomString } from '@/modules/core/helpers/testHelpers' import { getFeatureFlags } from '@/modules/shared/helpers/envHelper' +import { WorkspaceNotFoundError } from '@/modules/workspaces/errors/workspace' import { updateWorkspaceJoinRequestStatusFactory } from '@/modules/workspaces/repositories/workspaceJoinRequests' +import { getWorkspaceFactory } from '@/modules/workspaces/repositories/workspaces' import { dismissWorkspaceJoinRequestFactory } from '@/modules/workspaces/services/workspaceJoinRequests' import { BasicTestWorkspace, @@ -20,16 +22,18 @@ const { FF_WORKSPACES_MODULE_ENABLED } = getFeatureFlags() 'workspaceJoinRequests services', () => { describe('dismissWorkspaceJoinRequestFactory, returns a function that ', () => { - it('throws a WorkspaceJoinRequestNotFoundError if the updateWorkspaceJoinRequestStatus does not exists', async () => { - expectToThrow(() => + it('throws an error if the workspace does not exists', async () => { + const err = await expectToThrow(() => dismissWorkspaceJoinRequestFactory({ + getWorkspace: getWorkspaceFactory({ db }), updateWorkspaceJoinRequestStatus: updateWorkspaceJoinRequestStatusFactory({ db }) })({ workspaceId: createRandomString(), userId: createRandomString() }) ) + expect(err.message).to.equal(WorkspaceNotFoundError.defaultMessage) }) - it('marks the request as dismissed', async () => { + it('creates the request with the dismissed status', async () => { const user: BasicTestUser = { id: '', name: 'John Speckle', @@ -49,18 +53,21 @@ const { FF_WORKSPACES_MODULE_ENABLED } = getFeatureFlags() } await createTestWorkspace(workspace, user) - await db(WorkspaceJoinRequests.name).insert({ - workspaceId: workspace.id, - userId: user.id, - status: 'pending' - }) expect( await dismissWorkspaceJoinRequestFactory({ + getWorkspace: getWorkspaceFactory({ db }), updateWorkspaceJoinRequestStatus: updateWorkspaceJoinRequestStatusFactory({ db }) })({ workspaceId: workspace.id, userId: user.id }) ).to.equal(true) + + expect( + await db(WorkspaceJoinRequests.name) + .where({ workspaceId: workspace.id, userId: user.id }) + .select('status') + .first() + ).to.deep.equal({ status: 'dismissed' }) }) }) } diff --git a/packages/server/modules/workspaces/tests/integration/workspaces.graph.spec.ts b/packages/server/modules/workspaces/tests/integration/workspaces.graph.spec.ts index 38cd06d30..261665f2c 100644 --- a/packages/server/modules/workspaces/tests/integration/workspaces.graph.spec.ts +++ b/packages/server/modules/workspaces/tests/integration/workspaces.graph.spec.ts @@ -48,8 +48,7 @@ import { } from '@/modules/core/helpers/testHelpers' import { getWorkspaceFactory } from '@/modules/workspaces/repositories/workspaces' import { grantStreamPermissionsFactory } from '@/modules/core/repositories/streams' -import { WorkspaceJoinRequestNotFoundError } from '@/modules/workspaces/errors/workspace' -import { WorkspaceJoinRequests } from '@/modules/workspacesCore/helpers/db' +import { WorkspaceNotFoundError } from '@/modules/workspaces/errors/workspace' const grantStreamPermissions = grantStreamPermissionsFactory({ db }) @@ -845,9 +844,7 @@ describe('Workspaces GQL CRUD', () => { workspaceId: cryptoRandomString({ length: 6 }) } }) - expect(res).to.haveGraphQLErrors( - WorkspaceJoinRequestNotFoundError.defaultMessage - ) + expect(res).to.haveGraphQLErrors(WorkspaceNotFoundError.defaultMessage) }) it('should dismiss a workspace', async () => { const workspace: BasicTestWorkspace = { @@ -859,12 +856,6 @@ describe('Workspaces GQL CRUD', () => { } await createTestWorkspace(workspace, testAdminUser) - await db(WorkspaceJoinRequests.name).insert({ - workspaceId: workspace.id, - userId: testAdminUser.id, - status: 'pending' - }) - const dismissRes = await apollo.execute(DismissWorkspaceDocument, { input: { workspaceId: workspace.id