c6cd4c311d
* chore(serverinvites): repository refactor for multiregion * chore(serverinvites): remove migrated functions from old repository * chore(serverinvites): refactor serverInviteForToken resolver for multiregion * chore(serverinvites): invite processing service refactor for multiregion * chore(serverinvites): subscription refactor for multiregion * chore(serverinvites): move buildEmailContents to dedicated file * chore(serverinvites): deleteAllStreamInvites function multiregion refactor * chore(serverinvites): refactor deleteServerOnlyInvites multiregion repository * chore(serverinvites): complete repository refactor for multiregion * feat(serverinvites): create domain module in server invites * fix(serverinvites): no relative imports * feat(serverinvites): extract individual types from repository * feat(serverinvites): move interfaces to operations * fix(serverinvites): update imports referencing old interfaces file * fix(serverinvites): type mismatch for insert invite and delete old * chore(serverinvites): refactor to single repo function * test(serverinvites): fix tests * fix(serverinvites): use domain types in all places * feat(serverinvites): WIP unity * feat(serverinvites): move to new facory names and types * feat(serverinvites): fix tests * fix(serverinvites): use factory name --------- Co-authored-by: Alessandro Magionami <alessandro.magionami@gmail.com>
103 lines
2.2 KiB
JavaScript
103 lines
2.2 KiB
JavaScript
const ResourceTargets = Object.freeze({
|
|
Streams: 'streams'
|
|
})
|
|
|
|
/**
|
|
* @typedef {{
|
|
* resourceTarget?: string | null,
|
|
* resourceId?: string | null
|
|
* }} InviteResourceData
|
|
*/
|
|
|
|
/**
|
|
* @typedef {{
|
|
* target: string
|
|
* }} InviteTargetData
|
|
*/
|
|
|
|
/**
|
|
* @typedef {{
|
|
* userId: string | null,
|
|
* userEmail: string | null
|
|
* }} ResolvedTargetData
|
|
*/
|
|
|
|
/**
|
|
* @param {InviteResourceData} inviteOrParams
|
|
* @returns {boolean}
|
|
*/
|
|
function isServerInvite(inviteOrParams) {
|
|
if (!inviteOrParams) return false
|
|
const { resourceTarget, resourceId } = inviteOrParams
|
|
return !resourceTarget || !resourceId
|
|
}
|
|
|
|
/**
|
|
* Check whether the invite is a stream invite
|
|
* @param {InviteResourceData} inviteOrParams
|
|
* @returns {boolean}
|
|
*/
|
|
function isStreamInvite(inviteOrParams) {
|
|
return (
|
|
inviteOrParams &&
|
|
inviteOrParams.resourceTarget === ResourceTargets.Streams &&
|
|
inviteOrParams.resourceId
|
|
)
|
|
}
|
|
|
|
/**
|
|
* Resolve target information. The target can either be an email address or a user ID
|
|
* prefixed by an @ character
|
|
* @param {string} target
|
|
* @returns {ResolvedTargetData}
|
|
*/
|
|
function resolveTarget(target) {
|
|
if (target.startsWith('@')) {
|
|
return {
|
|
userEmail: null,
|
|
userId: target.substring(1)
|
|
}
|
|
} else {
|
|
return {
|
|
userEmail: target,
|
|
userId: null
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Build a valid target value from a user ID
|
|
* @param {string|null|undefined} userId
|
|
* @returns {string|null}
|
|
*/
|
|
function buildUserTarget(userId) {
|
|
if (!userId) return null
|
|
return `@${userId}`
|
|
}
|
|
|
|
/**
|
|
* Resolve a display name for the user being invited
|
|
* @param {import('@/modules/serverinvites/domain/types').ServerInviteRecord} invite
|
|
* @param {import("@/modules/core/helpers/userHelper").LimitedUserRecord | null} user The user,
|
|
* if invite targets a registered user.
|
|
* @returns {string}
|
|
*/
|
|
function resolveInviteTargetTitle(invite, user) {
|
|
const { userId, userEmail } = resolveTarget(invite.target)
|
|
if (userId) {
|
|
// User should be provided otherwise we have to fallback to an ugly ID identifier
|
|
return user ? user.name : `#${userId}`
|
|
}
|
|
|
|
return userEmail
|
|
}
|
|
|
|
module.exports = {
|
|
isServerInvite,
|
|
isStreamInvite,
|
|
resolveTarget,
|
|
buildUserTarget,
|
|
resolveInviteTargetTitle,
|
|
ResourceTargets
|
|
}
|