069f64afc9
* feat: user guest role switching in FE1 * removed stream create buttons * fe1 done * fe1 - specifying role in invite dialogs * fe1 - bulk invites * WIP FE2 changes * fe1: allow role select condition fixes * xtra limitations on createForOnboarding * more invite creation validations * no longer able to set guest as project owner in invite * preparations for server role select in invite dialog * team management dialog done * server invite dialog updated * hiding invite dialog * fixed mocks
168 lines
4.8 KiB
JavaScript
168 lines
4.8 KiB
JavaScript
'use strict'
|
|
|
|
const { Roles } = require('@/modules/core/helpers/mainConstants')
|
|
const { removePrivateFields } = require('@/modules/core/helpers/userHelper')
|
|
const { InviteCreateValidationError } = require('@/modules/serverinvites/errors')
|
|
const {
|
|
buildUserTarget,
|
|
ResourceTargets
|
|
} = require('@/modules/serverinvites/helpers/inviteHelper')
|
|
const {
|
|
createAndSendInvite
|
|
} = require('@/modules/serverinvites/services/inviteCreationService')
|
|
const {
|
|
createStreamInviteAndNotify,
|
|
useStreamInviteAndNotify
|
|
} = require('@/modules/serverinvites/services/management')
|
|
const {
|
|
cancelStreamInvite,
|
|
resendInvite,
|
|
deleteInvite
|
|
} = require('@/modules/serverinvites/services/inviteProcessingService')
|
|
const {
|
|
getUserPendingStreamInvite,
|
|
getUserPendingStreamInvites
|
|
} = require('@/modules/serverinvites/services/inviteRetrievalService')
|
|
const { authorizeResolver } = require('@/modules/shared')
|
|
const { chunk } = require('lodash')
|
|
|
|
/** @type {import('@/modules/core/graph/generated/graphql').Resolvers} */
|
|
module.exports = {
|
|
Mutation: {
|
|
async serverInviteCreate(_parent, args, context) {
|
|
await createAndSendInvite({
|
|
target: args.input.email,
|
|
inviterId: context.userId,
|
|
message: args.input.message,
|
|
serverRole: args.input.serverRole
|
|
})
|
|
|
|
return true
|
|
},
|
|
|
|
async streamInviteCreate(_parent, args, context) {
|
|
await authorizeResolver(context.userId, args.input.streamId, Roles.Stream.Owner)
|
|
await createStreamInviteAndNotify(args.input, context.userId)
|
|
|
|
return true
|
|
},
|
|
|
|
async serverInviteBatchCreate(_parent, args, context) {
|
|
const { input: paramsArray } = args
|
|
|
|
// Batch calls so that we don't kill the server
|
|
const batches = chunk(paramsArray, 50)
|
|
for (const paramsBatchArray of batches) {
|
|
await Promise.all(
|
|
paramsBatchArray.map((params) =>
|
|
createAndSendInvite({
|
|
target: params.email,
|
|
inviterId: context.userId,
|
|
message: params.message,
|
|
serverRole: params.serverRole
|
|
})
|
|
)
|
|
)
|
|
}
|
|
|
|
return true
|
|
},
|
|
|
|
async streamInviteBatchCreate(_parent, args, context) {
|
|
const { input: paramsArray } = args
|
|
|
|
// Validate params
|
|
for (const params of paramsArray) {
|
|
const { email, userId } = params
|
|
if (!email && !userId) {
|
|
throw new InviteCreateValidationError(
|
|
'Either email or userId must be specified'
|
|
)
|
|
}
|
|
}
|
|
|
|
// Batch calls so that we don't kill the server
|
|
const batches = chunk(paramsArray, 50)
|
|
for (const paramsBatchArray of batches) {
|
|
await Promise.all(
|
|
paramsBatchArray.map((params) => {
|
|
const { email, userId, message, streamId, role, serverRole } = params
|
|
const target = userId ? buildUserTarget(userId) : email
|
|
return createAndSendInvite({
|
|
target,
|
|
inviterId: context.userId,
|
|
message,
|
|
resourceTarget: ResourceTargets.Streams,
|
|
resourceId: streamId,
|
|
role: role || Roles.Stream.Contributor,
|
|
serverRole
|
|
})
|
|
})
|
|
)
|
|
}
|
|
|
|
return true
|
|
},
|
|
|
|
async streamInviteUse(_parent, args, ctx) {
|
|
await useStreamInviteAndNotify(args, ctx.userId)
|
|
return true
|
|
},
|
|
|
|
async streamInviteCancel(_parent, args, ctx) {
|
|
const { streamId, inviteId } = args
|
|
const { userId } = ctx
|
|
|
|
await authorizeResolver(userId, streamId, Roles.Stream.Owner)
|
|
await cancelStreamInvite(streamId, inviteId)
|
|
|
|
return true
|
|
},
|
|
|
|
async inviteResend(_parent, args) {
|
|
const { inviteId } = args
|
|
|
|
await resendInvite(inviteId)
|
|
|
|
return true
|
|
},
|
|
|
|
async inviteDelete(_parent, args) {
|
|
const { inviteId } = args
|
|
|
|
await deleteInvite(inviteId)
|
|
|
|
return true
|
|
}
|
|
},
|
|
Query: {
|
|
async streamInvite(_parent, args, context) {
|
|
const { streamId, token } = args
|
|
return await getUserPendingStreamInvite(streamId, context.userId, token)
|
|
},
|
|
async projectInvite(_parent, args, context) {
|
|
const { projectId, token } = args
|
|
return await getUserPendingStreamInvite(projectId, context.userId, token)
|
|
},
|
|
async streamInvites(_parrent, _args, context) {
|
|
const { userId } = context
|
|
return await getUserPendingStreamInvites(userId)
|
|
}
|
|
},
|
|
ServerInvite: {
|
|
/**
|
|
* @param {import('@/modules/core/services/users/adminUsersListService').ServerInviteGraphqlReturnType} parent
|
|
* @param {Object} _args
|
|
* @param {import('@/modules/shared/index').GraphQLContext} ctx
|
|
* @returns
|
|
*/
|
|
async invitedBy(parent, _args, ctx) {
|
|
const { invitedById } = parent
|
|
if (!invitedById) return null
|
|
|
|
const user = await ctx.loaders.users.getUser.load(invitedById)
|
|
return user ? removePrivateFields(user) : null
|
|
}
|
|
}
|
|
}
|