Files
speckle-server/packages/server/modules/serverinvites/helpers/inviteHelper.js
T
Gergő Jedlicska c6cd4c311d feat(serverinvites): create domain module in server invites (#2401)
* 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>
2024-06-25 13:24:37 +02:00

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
}