feat: enable domain discoverability on workspace creation (#4235)
* frontend changes implemented * WIP BE * backend seems to work * CR fixes
This commit is contained in:
committed by
GitHub
parent
35e99d6ee7
commit
e3d3c1446b
@@ -439,37 +439,90 @@ export = FF_WORKSPACES_MODULE_ENABLED
|
||||
},
|
||||
WorkspaceMutations: {
|
||||
create: async (_parent, args, context) => {
|
||||
const { name, description, logo, slug } = args.input
|
||||
const {
|
||||
name,
|
||||
description,
|
||||
logo,
|
||||
slug,
|
||||
enableDomainDiscoverabilityForDomain
|
||||
} = args.input
|
||||
|
||||
const createWorkspace = createWorkspaceFactory({
|
||||
validateSlug: validateSlugFactory({
|
||||
getWorkspaceBySlug: getWorkspaceBySlugFactory({ db })
|
||||
}),
|
||||
generateValidSlug: generateValidSlugFactory({
|
||||
getWorkspaceBySlug: getWorkspaceBySlugFactory({ db })
|
||||
}),
|
||||
upsertWorkspace: upsertWorkspaceFactory({ db }),
|
||||
upsertWorkspaceRole: upsertWorkspaceRoleFactory({ db }),
|
||||
emitWorkspaceEvent: getEventBus().emit,
|
||||
ensureValidWorkspaceRoleSeat: ensureValidWorkspaceRoleSeatFactory({
|
||||
createWorkspaceSeat: createWorkspaceSeatFactory({ db }),
|
||||
getWorkspaceUserSeat: getWorkspaceUserSeatFactory({ db }),
|
||||
eventEmit: getEventBus().emit
|
||||
})
|
||||
const createWorkspace = commandFactory({
|
||||
db,
|
||||
eventBus,
|
||||
operationFactory: ({ trx, emit }) => {
|
||||
const createWorkspace = createWorkspaceFactory({
|
||||
validateSlug: validateSlugFactory({
|
||||
getWorkspaceBySlug: getWorkspaceBySlugFactory({ db: trx })
|
||||
}),
|
||||
generateValidSlug: generateValidSlugFactory({
|
||||
getWorkspaceBySlug: getWorkspaceBySlugFactory({ db: trx })
|
||||
}),
|
||||
upsertWorkspace: upsertWorkspaceFactory({ db: trx }),
|
||||
upsertWorkspaceRole: upsertWorkspaceRoleFactory({ db: trx }),
|
||||
emitWorkspaceEvent: emit,
|
||||
ensureValidWorkspaceRoleSeat: ensureValidWorkspaceRoleSeatFactory({
|
||||
createWorkspaceSeat: createWorkspaceSeatFactory({ db: trx }),
|
||||
getWorkspaceUserSeat: getWorkspaceUserSeatFactory({ db: trx }),
|
||||
eventEmit: emit
|
||||
})
|
||||
})
|
||||
|
||||
const updateWorkspace = updateWorkspaceFactory({
|
||||
validateSlug: validateSlugFactory({
|
||||
getWorkspaceBySlug: getWorkspaceBySlugFactory({ db: trx })
|
||||
}),
|
||||
getWorkspace: getWorkspaceWithDomainsFactory({ db: trx }),
|
||||
getWorkspaceSsoProviderRecord: getWorkspaceSsoProviderFactory({
|
||||
db: trx,
|
||||
decrypt: getDecryptor()
|
||||
}),
|
||||
upsertWorkspace: upsertWorkspaceFactory({ db: trx }),
|
||||
emitWorkspaceEvent: emit
|
||||
})
|
||||
|
||||
const addDomain = addDomainToWorkspaceFactory({
|
||||
getWorkspace: getWorkspaceFactory({ db: trx }),
|
||||
findEmailsByUserId: findEmailsByUserIdFactory({ db: trx }),
|
||||
storeWorkspaceDomain: storeWorkspaceDomainFactory({ db: trx }),
|
||||
getDomains: getWorkspaceDomainsFactory({ db: trx }),
|
||||
emitWorkspaceEvent: emit
|
||||
})
|
||||
|
||||
return async () => {
|
||||
let workspace = await createWorkspace({
|
||||
userId: context.userId!,
|
||||
workspaceInput: {
|
||||
name,
|
||||
slug,
|
||||
description: description ?? null,
|
||||
logo: logo ?? null
|
||||
},
|
||||
userResourceAccessLimits: context.resourceAccessRules
|
||||
})
|
||||
|
||||
if (enableDomainDiscoverabilityForDomain) {
|
||||
// Add domain & enable discoverability
|
||||
await addDomain({
|
||||
workspaceId: workspace.id,
|
||||
userId: context.userId!,
|
||||
domain: enableDomainDiscoverabilityForDomain
|
||||
})
|
||||
|
||||
workspace = await updateWorkspace({
|
||||
workspaceId: workspace.id,
|
||||
workspaceInput: {
|
||||
discoverabilityEnabled: true
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
return workspace
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
const workspace = await createWorkspace({
|
||||
userId: context.userId!,
|
||||
workspaceInput: {
|
||||
name,
|
||||
slug,
|
||||
description: description ?? null,
|
||||
logo: logo ?? null
|
||||
},
|
||||
userResourceAccessLimits: context.resourceAccessRules
|
||||
})
|
||||
|
||||
return workspace
|
||||
return await createWorkspace()
|
||||
},
|
||||
delete: async (_parent, args, context) => {
|
||||
const { workspaceId } = args
|
||||
|
||||
@@ -56,11 +56,46 @@ import {
|
||||
import { grantStreamPermissionsFactory } from '@/modules/core/repositories/streams'
|
||||
import { WorkspaceNotFoundError } from '@/modules/workspaces/errors/workspace'
|
||||
import { getFeatureFlags } from '@/modules/shared/helpers/envHelper'
|
||||
import { validateAndCreateUserEmailFactory } from '@/modules/core/services/userEmails'
|
||||
import {
|
||||
createUserEmailFactory,
|
||||
ensureNoPrimaryEmailForUserFactory,
|
||||
findEmailFactory
|
||||
} from '@/modules/core/repositories/userEmails'
|
||||
import { requestNewEmailVerificationFactory } from '@/modules/emails/services/verification/request'
|
||||
import { finalizeInvitedServerRegistrationFactory } from '@/modules/serverinvites/services/processing'
|
||||
import {
|
||||
deleteServerOnlyInvitesFactory,
|
||||
updateAllInviteTargetsFactory
|
||||
} from '@/modules/serverinvites/repositories/serverInvites'
|
||||
import { getUserFactory } from '@/modules/core/repositories/users'
|
||||
import { getServerInfoFactory } from '@/modules/core/repositories/server'
|
||||
import { deleteOldAndInsertNewVerificationFactory } from '@/modules/emails/repositories'
|
||||
import { sendEmail } from '@/modules/emails/services/sending'
|
||||
import { renderEmail } from '@/modules/emails/services/emailRendering'
|
||||
import { itEach } from '@/test/assertionHelper'
|
||||
import { assignWorkspaceSeatFactory } from '@/modules/workspaces/services/workspaceSeat'
|
||||
import { createWorkspaceSeatFactory } from '@/modules/gatekeeper/repositories/workspaceSeat'
|
||||
import { WorkspaceSeatType } from '@/modules/gatekeeper/domain/billing'
|
||||
|
||||
const grantStreamPermissions = grantStreamPermissionsFactory({ db })
|
||||
const validateAndCreateUserEmail = validateAndCreateUserEmailFactory({
|
||||
createUserEmail: createUserEmailFactory({ db }),
|
||||
ensureNoPrimaryEmailForUser: ensureNoPrimaryEmailForUserFactory({ db }),
|
||||
findEmail: findEmailFactory({ db }),
|
||||
updateEmailInvites: finalizeInvitedServerRegistrationFactory({
|
||||
deleteServerOnlyInvites: deleteServerOnlyInvitesFactory({ db }),
|
||||
updateAllInviteTargets: updateAllInviteTargetsFactory({ db })
|
||||
}),
|
||||
requestNewEmailVerification: requestNewEmailVerificationFactory({
|
||||
findEmail: findEmailFactory({ db }),
|
||||
getUser: getUserFactory({ db }),
|
||||
getServerInfo: getServerInfoFactory({ db }),
|
||||
deleteOldAndInsertNewVerification: deleteOldAndInsertNewVerificationFactory({ db }),
|
||||
sendEmail,
|
||||
renderEmail
|
||||
})
|
||||
})
|
||||
const { FF_GATEKEEPER_FORCE_FREE_PLAN } = getFeatureFlags()
|
||||
|
||||
describe('Workspaces GQL CRUD', () => {
|
||||
@@ -883,6 +918,107 @@ describe('Workspaces GQL CRUD', () => {
|
||||
expect(getRes.data?.workspace?.name).to.equal(workspaceName)
|
||||
expect(getRes.data?.workspace?.slug).to.equal(workspaceSlug)
|
||||
})
|
||||
|
||||
describe('when attempting to enable domain discoverability', () => {
|
||||
const guyWithNoVerifiedEmails: BasicTestUser = {
|
||||
id: '',
|
||||
name: 'Guy with no verified emails',
|
||||
email: 'guy-with-no-verified-emails@bozo1.org',
|
||||
verified: false
|
||||
}
|
||||
|
||||
const guyWithMultipleVerifiedEmails: BasicTestUser = {
|
||||
id: '',
|
||||
name: 'Guy with multiple verified emails',
|
||||
email: 'guy-with-multiple-verified-emails@bozo2.org',
|
||||
verified: true
|
||||
}
|
||||
|
||||
const guyWithOneVerifiedEmail: BasicTestUser = {
|
||||
id: '',
|
||||
name: 'Guy with one verified email',
|
||||
email: 'guy-with-one-verified-email@bozo3.org',
|
||||
verified: true
|
||||
}
|
||||
|
||||
const guyWithOneBlockedVerifiedEmail: BasicTestUser = {
|
||||
id: '',
|
||||
name: 'Guy with one blocked verified email',
|
||||
email: 'guy-with-one-blocked-verified-email@gmail.com',
|
||||
verified: true,
|
||||
allowPersonalEmail: true
|
||||
}
|
||||
|
||||
const getDomain = (user: BasicTestUser) => user.email.split('@')[1]
|
||||
|
||||
before(async () => {
|
||||
await createTestUsers([
|
||||
guyWithNoVerifiedEmails,
|
||||
guyWithMultipleVerifiedEmails,
|
||||
guyWithOneVerifiedEmail,
|
||||
guyWithOneBlockedVerifiedEmail
|
||||
])
|
||||
|
||||
await Promise.all([
|
||||
validateAndCreateUserEmail({
|
||||
userEmail: {
|
||||
userId: guyWithMultipleVerifiedEmails.id,
|
||||
email: 'guy-with-multiple-verified-emails@bozo22.org',
|
||||
verified: true
|
||||
}
|
||||
}),
|
||||
validateAndCreateUserEmail({
|
||||
userEmail: {
|
||||
userId: guyWithMultipleVerifiedEmails.id,
|
||||
email: 'guy-with-multiple-verified-emails@bozo23.org',
|
||||
verified: true
|
||||
}
|
||||
})
|
||||
])
|
||||
})
|
||||
|
||||
itEach(
|
||||
[guyWithOneVerifiedEmail, guyWithMultipleVerifiedEmails],
|
||||
(user) => `${user.name} can create with enabled domain discoverability`,
|
||||
async (user) => {
|
||||
const apollo = await testApolloServer({
|
||||
authUserId: user.id
|
||||
})
|
||||
const createRes = await apollo.execute(CreateWorkspaceDocument, {
|
||||
input: {
|
||||
name: `${user.name} Domain Discoverability Workspace`,
|
||||
slug: cryptoRandomString({ length: 10 }),
|
||||
enableDomainDiscoverabilityForDomain: getDomain(user)
|
||||
}
|
||||
})
|
||||
|
||||
expect(createRes).to.not.haveGraphQLErrors()
|
||||
expect(createRes.data?.workspaceMutations.create.id).to.be.ok
|
||||
expect(createRes.data!.workspaceMutations.create.discoverabilityEnabled).to
|
||||
.be.true
|
||||
}
|
||||
)
|
||||
|
||||
itEach(
|
||||
[guyWithNoVerifiedEmails, guyWithOneBlockedVerifiedEmail],
|
||||
(user) => `${user.name} can not create with enabled domain discoverability`,
|
||||
async (user) => {
|
||||
const apollo = await testApolloServer({
|
||||
authUserId: user.id
|
||||
})
|
||||
const createRes = await apollo.execute(CreateWorkspaceDocument, {
|
||||
input: {
|
||||
name: `${user.name} Domain Discoverability Workspace`,
|
||||
slug: cryptoRandomString({ length: 10 }),
|
||||
enableDomainDiscoverabilityForDomain: getDomain(user)
|
||||
}
|
||||
})
|
||||
|
||||
expect(createRes).to.haveGraphQLErrors()
|
||||
expect(createRes.data?.workspaceMutations.create).to.not.be.ok
|
||||
}
|
||||
)
|
||||
})
|
||||
})
|
||||
|
||||
describe('mutation workspaceMutations.delete', () => {
|
||||
|
||||
Reference in New Issue
Block a user