{countryNames[country] || formatMessage(labels.unknown)},
- browser: {BROWSERS[browser]},
- os: {OS_NAMES[os] || os},
- device: {formatMessage(labels[device] || labels.unknown)},
+ country: {countryNames[country] || formatMessage(labels.unknown)},
+ browser: {BROWSERS[browser]},
+ os: {OS_NAMES[os] || os},
+ device: {formatMessage(labels[device] || labels.unknown)},
});
}
};
diff --git a/src/app/(main)/websites/[websiteId]/sessions/SessionsWeekly.tsx b/src/app/(main)/websites/[websiteId]/sessions/SessionsWeekly.tsx
index 6663a563c..283a7ea08 100644
--- a/src/app/(main)/websites/[websiteId]/sessions/SessionsWeekly.tsx
+++ b/src/app/(main)/websites/[websiteId]/sessions/SessionsWeekly.tsx
@@ -62,10 +62,10 @@ export function SessionsWeekly({ websiteId }: { websiteId: string }) {
{format(getDayOfWeekAsDate(index), 'EEE', { locale: dateLocale })}
- {day?.map((hour: number) => {
+ {day?.map((hour: number, j) => {
const pct = hour / max;
return (
-
+
{hour > 0 && (
1800) {
- visitId = uuid(sessionId, visitSalt());
+ if (!timestamp && now - iat > 1800) {
+ visitId = uuid(sessionId, visitSalt);
iat = now;
}
@@ -160,12 +169,12 @@ export async function POST(request: Request) {
websiteId,
sessionId,
visitId,
- urlPath,
+ urlPath: safeDecodeURI(urlPath),
urlQuery,
- referrerPath,
+ referrerPath: safeDecodeURI(referrerPath),
referrerQuery,
referrerDomain,
- pageTitle: title,
+ pageTitle: safeDecodeURIComponent(title),
eventName: name,
eventData: data,
hostname: hostname || urlDomain,
@@ -179,6 +188,7 @@ export async function POST(request: Request) {
subdivision2,
city,
tag,
+ createdAt,
});
}
@@ -191,12 +201,13 @@ export async function POST(request: Request) {
websiteId,
sessionId,
sessionData: data,
+ createdAt,
});
}
const token = createToken({ websiteId, sessionId, visitId, iat }, secret());
- return json({ cache: token });
+ return json({ cache: token, sessionId, visitId });
} catch (e) {
return serverError(e);
}
diff --git a/src/app/api/users/[userId]/route.ts b/src/app/api/users/[userId]/route.ts
index abb3331d0..09c77744f 100644
--- a/src/app/api/users/[userId]/route.ts
+++ b/src/app/api/users/[userId]/route.ts
@@ -1,9 +1,8 @@
-import { z } from 'zod';
-import { canUpdateUser, canViewUser, canDeleteUser } from '@/lib/auth';
-import { getUser, getUserByUsername, updateUser, deleteUser } from '@/queries';
-import { json, unauthorized, badRequest, ok } from '@/lib/response';
-import { hashPassword } from '@/lib/auth';
+import { canDeleteUser, canUpdateUser, canViewUser, hashPassword } from '@/lib/auth';
import { parseRequest } from '@/lib/request';
+import { badRequest, json, ok, unauthorized } from '@/lib/response';
+import { deleteUser, getUser, getUserByUsername, updateUser } from '@/queries';
+import { z } from 'zod';
export async function GET(request: Request, { params }: { params: Promise<{ userId: string }> }) {
const { auth, error } = await parseRequest(request);
@@ -26,7 +25,7 @@ export async function GET(request: Request, { params }: { params: Promise<{ user
export async function POST(request: Request, { params }: { params: Promise<{ userId: string }> }) {
const schema = z.object({
username: z.string().max(255),
- password: z.string().max(255),
+ password: z.string().max(255).optional(),
role: z.string().regex(/admin|user|view-only/i),
});
diff --git a/src/app/api/users/route.ts b/src/app/api/users/route.ts
index f6b32fe7e..c5896f892 100644
--- a/src/app/api/users/route.ts
+++ b/src/app/api/users/route.ts
@@ -8,6 +8,7 @@ import { createUser, getUserByUsername } from '@/queries';
export async function POST(request: Request) {
const schema = z.object({
+ id: z.string().uuid().optional(),
username: z.string().max(255),
password: z.string(),
role: z.string().regex(/admin|user|view-only/i),
@@ -23,7 +24,7 @@ export async function POST(request: Request) {
return unauthorized();
}
- const { username, password, role } = body;
+ const { id, username, password, role } = body;
const existingUser = await getUserByUsername(username, { showDeleted: true });
@@ -32,7 +33,7 @@ export async function POST(request: Request) {
}
const user = await createUser({
- id: uuid(),
+ id: id || uuid(),
username,
password: hashPassword(password),
role: role ?? ROLES.user,
diff --git a/src/app/layout.tsx b/src/app/layout.tsx
index f88d8169c..ebe313e62 100644
--- a/src/app/layout.tsx
+++ b/src/app/layout.tsx
@@ -23,7 +23,7 @@ export default function ({ children }) {
-
+
{children}
diff --git a/src/app/login/LoginForm.tsx b/src/app/login/LoginForm.tsx
index 1da3106c6..a808c622d 100644
--- a/src/app/login/LoginForm.tsx
+++ b/src/app/login/LoginForm.tsx
@@ -16,7 +16,7 @@ import Logo from '@/assets/logo.svg';
import styles from './LoginForm.module.css';
export function LoginForm() {
- const { formatMessage, labels } = useMessages();
+ const { formatMessage, labels, getMessage } = useMessages();
const router = useRouter();
const { post, useMutation } = useApi();
const { mutate, error, isPending } = useMutation({
@@ -40,7 +40,7 @@ export function LoginForm() {
umami
-