feat: enable domain discoverability on workspace creation (#4235)

* frontend changes implemented

* WIP BE

* backend seems to work

* CR fixes
This commit is contained in:
Kristaps Fabians Geikins
2025-04-07 12:34:45 +03:00
committed by GitHub
parent 35e99d6ee7
commit e3d3c1446b
22 changed files with 371 additions and 114 deletions
@@ -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', () => {