Use props passed to identify to define session

This commit is contained in:
perso182 2025-03-28 11:02:56 +01:00
parent 38ab685143
commit 2c80aa0b24
2 changed files with 20 additions and 5 deletions

View file

@ -18,6 +18,7 @@ const schema = z.object({
payload: z.object({ payload: z.object({
website: z.string().uuid(), website: z.string().uuid(),
data: anyObjectParam.optional(), data: anyObjectParam.optional(),
identity: anyObjectParam.optional(),
hostname: z.string().max(100).optional(), hostname: z.string().max(100).optional(),
language: z.string().max(35).optional(), language: z.string().max(35).optional(),
referrer: urlOrPathParam.optional(), referrer: urlOrPathParam.optional(),
@ -59,6 +60,7 @@ export async function POST(request: Request) {
title, title,
tag, tag,
timestamp, timestamp,
identity,
} = payload; } = payload;
// Cache check // Cache check
@ -97,7 +99,13 @@ export async function POST(request: Request) {
const sessionSalt = hash(startOfMonth(createdAt).toUTCString()); const sessionSalt = hash(startOfMonth(createdAt).toUTCString());
const visitSalt = hash(startOfHour(createdAt).toUTCString()); const visitSalt = hash(startOfHour(createdAt).toUTCString());
const sessionId = uuid(websiteId, ip, userAgent, sessionSalt); const sessionId = uuid(
websiteId,
ip,
userAgent,
sessionSalt,
identity ? JSON.stringify(identity) : '',
);
// Find session // Find session
if (!clickhouse.enabled && !cache?.sessionId) { if (!clickhouse.enabled && !cache?.sessionId) {

View file

@ -233,21 +233,28 @@
}; };
const track = (obj, data) => { const track = (obj, data) => {
const identity = JSON.parse(localStorage.getItem('umami.identity'));
if (typeof obj === 'string') { if (typeof obj === 'string') {
return send({ return send({
...getPayload(), ...getPayload(),
name: obj, name: obj,
data: typeof data === 'object' ? data : undefined, data: typeof data === 'object' ? data : undefined,
identity: identity !== null ? identity : undefined,
}); });
} else if (typeof obj === 'object') { } else if (typeof obj === 'object') {
return send(obj); return send({ ...obj, identity: identity !== null ? identity : undefined });
} else if (typeof obj === 'function') { } else if (typeof obj === 'function') {
return send(obj(getPayload())); return send({ ...obj(getPayload()), identity: identity !== null ? identity : undefined });
} }
return send(getPayload()); return send({ ...getPayload(), identity: identity !== null ? identity : undefined });
}; };
const identify = data => send({ ...getPayload(), data }, 'identify'); const identify = data => {
localStorage.setItem('umami.identity', JSON.stringify(data));
/* Clear cache since this will result in another session */
cache = '';
send({ ...getPayload(), data, identity: data }, 'identify');
};
/* Start */ /* Start */