From b69874168748f13bc968a262811a6cdde566a30c Mon Sep 17 00:00:00 2001 From: DCCONSTRUCTIONS Date: Tue, 12 May 2026 18:28:26 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A4=D0=A3=D0=9D=D0=9A=D0=A6=D0=98=D0=98=20-?= =?UTF-8?q?=20=D0=9C=D0=95=D0=96=D0=9F=D0=A0=D0=9E=D0=95=D0=9A=D0=A2=D0=9D?= =?UTF-8?q?=D0=90=D0=AF=20=D0=9A=D0=9E=D0=9C=D0=9C=D0=A3=D0=9D=D0=98=D0=9A?= =?UTF-8?q?=D0=90=D0=A6=D0=98=D0=AF:=20=D0=BC=D0=B0=D0=BF=D0=BF=D0=B8?= =?UTF-8?q?=D0=BD=D0=B3=20=D0=B8=D0=BC=D0=B5=D0=BD=D0=B8=20=D0=BF=D1=80?= =?UTF-8?q?=D0=BE=D1=84=D0=B8=D0=BB=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/dev-server.mjs | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) 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), }, });