diff --git a/server/dev-server.mjs b/server/dev-server.mjs index 340f3dd..936742f 100644 --- a/server/dev-server.mjs +++ b/server/dev-server.mjs @@ -1775,7 +1775,16 @@ function sanitizeSelfProfilePatch(payload) { function sanitizeTaskerProfilePatch(payload) { const patch = {}; - const name = firstNonEmptyString(payload?.displayName, payload?.display_name, payload?.name); + const changedFields = Array.isArray(payload?.changedFields) ? payload.changedFields : []; + const taskerFullName = joinTaskerProfileName( + payload?.firstName ?? payload?.first_name, + payload?.lastName ?? payload?.last_name + ); + const taskerDisplayName = firstNonEmptyString(payload?.displayName, payload?.display_name, payload?.name); + const name = + hasChangedField(changedFields, ["display_name"]) || !hasChangedField(changedFields, ["first_name", "last_name"]) + ? firstNonEmptyString(taskerDisplayName, taskerFullName) + : firstNonEmptyString(taskerFullName, taskerDisplayName); const hasAvatar = Object.hasOwn(payload ?? {}, "avatarUrl") || Object.hasOwn(payload ?? {}, "avatar_url") || @@ -1800,6 +1809,24 @@ function firstNonEmptyString(...values) { return null; } +function joinTaskerProfileName(firstName, lastName) { + return [firstName, lastName].filter((value) => typeof value === "string" && value.trim()).join(" ").trim(); +} + +function splitTaskerProfileName(name) { + const trimmedName = typeof name === "string" ? name.trim() : ""; + const parts = trimmedName.split(/\s+/, 2); + + return { + firstName: parts[0] ?? "", + lastName: parts.length > 1 ? trimmedName.slice(parts[0].length).trim() : "", + }; +} + +function hasChangedField(changedFields, fields) { + return fields.some((field) => changedFields.includes(field)); +} + function nullableProfileUrl(value) { return typeof value === "string" && value.trim() ? value.trim() : null; } @@ -2090,6 +2117,8 @@ async function syncTaskManagerUserProfile(user) { return null; } + const taskerNameParts = splitTaskerProfileName(user.name); + try { return await requestTaskManagerInternalJson("/api/internal/nodedc/users/profile-sync/", { method: "POST", @@ -2097,6 +2126,9 @@ async function syncTaskManagerUserProfile(user) { email: user.email, subject: user.authentikUserId ?? undefined, name: user.name, + displayName: user.name, + firstName: taskerNameParts.firstName, + lastName: taskerNameParts.lastName, avatarUrl: resolveUserAvatarPublicUrl(user), }, });