This commit is contained in:
Emily
2024-10-07 15:26:57 +02:00
parent c2846ca595
commit b27cacf4e6
50 changed files with 512 additions and 583 deletions

View File

@@ -1,59 +0,0 @@
import type { TProject } from "@schema/ProjectSchema";
const projects = useFetch<TProject[]>('/api/project/list', {
key: 'projectslist', ...signHeaders()
});
export function useProjectsList() {
return { ...projects, projects: projects.data }
}
const guestProjects = useFetch<TProject[]>('/api/project/list_guest', {
key: 'guestProjectslist', ...signHeaders()
});
export function useGuestProjectsList() {
return { ...guestProjects, guestProjects: guestProjects.data }
}
const activeProjectId = useFetch<string>(`/api/user/active_project`, {
key: 'activeProjectId', ...signHeaders(),
});
export const isGuest = computed(() => {
if (!guestProjects.data.value) return false;
const guestTarget = guestProjects.data.value.find(e => e._id.toString() == activeProjectId.data.value);
if (guestTarget) return true;
return false;
});
export function useActiveProjectId() {
return { ...activeProjectId, pid: activeProjectId.data }
}
export function useActiveProject() {
if (isLiveDemo()) {
const { data: liveDemoProject } = useLiveDemo();
return liveDemoProject;
}
return computed(() => {
if (!projects.data.value) return;
if (!activeProjectId.data.value) return;
const target = projects.data.value.find(e => e._id.toString() == activeProjectId.data.value);
if (target) return target;
if (!guestProjects.data.value) return;
const guestTarget = guestProjects.data.value.find(e => e._id.toString() == activeProjectId.data.value);
return guestTarget;
});
}
export async function setActiveProject(project_id: string) {
changingProject.value = true;
await new Promise(e => setTimeout(e, 500));
await $fetch<string>(`/api/user/set_active_project?project_id=${project_id}`, signHeaders());
await activeProjectId.refresh();
changingProject.value = false;
}
export const changingProject = ref<boolean>(false);

View File

@@ -1,19 +0,0 @@
export function createRequestOptions(method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH', sign: boolean, body?: Record<string, any>, headers: Record<string, string> = {}) {
const requestHeaders = sign ? signHeaders(headers) : headers;
let requestBody;
if (method === 'POST' || method == 'PUT' || method == 'PATCH') {
requestBody = body ? JSON.stringify(body) : undefined;
}
return {
method,
headers: requestHeaders,
body: requestBody
}
}

View File

@@ -1,169 +0,0 @@
import type { Slice } from "@services/DateService";
import DateService from "@services/DateService";
import type { MetricsCounts } from "~/server/api/metrics/[project_id]/counts";
import type { BrowsersAggregated } from "~/server/api/metrics/[project_id]/data/browsers";
import type { CountriesAggregated } from "~/server/api/metrics/[project_id]/data/countries";
import type { DevicesAggregated } from "~/server/api/metrics/[project_id]/data/devices";
import type { CustomEventsAggregated } from "~/server/api/metrics/[project_id]/data/events";
import type { OssAggregated } from "~/server/api/metrics/[project_id]/data/oss";
import type { ReferrersAggregated } from "~/server/api/metrics/[project_id]/data/referrers";
import type { VisitsWebsiteAggregated } from "~/server/api/metrics/[project_id]/data/websites";
import type { MetricsTimeline } from "~/server/api/metrics/[project_id]/timeline/generic";
export function useMetricsData() {
const activeProject = useActiveProject();
const metricsInfo = useFetch<MetricsCounts>(`/api/metrics/${activeProject.value?._id}/counts`, {
...signHeaders(),
lazy: true
});
return metricsInfo;
}
// const { safeSnapshotDates, snapshot } = useSnapshot()
// const activeProject = useActiveProject();
// const createFromToHeaders = (headers: Record<string, string> = {}) => ({
// 'x-from': safeSnapshotDates.value.from,
// 'x-to': safeSnapshotDates.value.to,
// ...headers
// });
// const createFromToBody = (body: Record<string, any> = {}) => ({
// from: safeSnapshotDates.value.from,
// to: safeSnapshotDates.value.to,
// ...body
// });
// export function useFirstInteractionData() {
// const activeProject = useActiveProject();
// const metricsInfo = useFetch<boolean>(`/api/metrics/${activeProject.value?._id}/first_interaction`, signHeaders());
// return metricsInfo;
// }
// export function useTimelineAdvanced<T>(endpoint: string, slice: Ref<Slice>, customBody: Object = {}) {
// const response = useCustomFetch<T>(
// `/api/metrics/${activeProject.value?._id}/timeline/${endpoint}`,
// () => signHeaders({ 'Content-Type': 'application/json' }).headers, {
// method: 'POST',
// getBody: () => createFromToBody({ slice: slice.value, ...customBody }),
// lazy: true,
// watchProps: [snapshot, slice]
// });
// return response;
// }
// export function useTimeline(endpoint: 'visits' | 'sessions' | 'referrers' | 'events_stacked', slice: Ref<Slice>) {
// return useTimelineAdvanced<{ _id: string, count: number }[]>(endpoint, slice);
// }
// export async function useReferrersTimeline(referrer: string, slice: Ref<Slice>) {
// return await useTimelineAdvanced<{ _id: string, count: number }[]>('referrers', slice, { referrer });
// }
// export function useEventsStackedTimeline(slice: Ref<Slice>) {
// return useTimelineAdvanced<{ _id: string, name: string, count: number }[]>('events_stacked', slice);
// }
// export async function useTimelineDataRaw(timelineEndpointName: string, slice: SliceName) {
// const activeProject = useActiveProject();
// const response = await $fetch<{ data: MetricsTimeline[], from: string, to: string }>(
// `/api/metrics/${activeProject.value?._id}/timeline/${timelineEndpointName}`, {
// method: 'POST',
// ...signHeaders({ 'Content-Type': 'application/json' }),
// body: JSON.stringify({ slice }),
// });
// return response;
// }
// export async function useTimelineData(timelineEndpointName: string, slice: SliceName) {
// const response = await useTimelineDataRaw(timelineEndpointName, slice);
// if (!response) return;
// const fixed = fixMetrics(response, slice);
// return fixed;
// }
// export function usePagesData(website: string, limit: number = 10) {
// const activeProject = useActiveProject();
// const res = useFetch<VisitsWebsiteAggregated[]>(`/api/metrics/${activeProject.value?._id}/data/pages`, {
// ...signHeaders({
// 'x-query-limit': limit.toString(),
// 'x-website-name': website
// }),
// key: `pages_data:${website}:${limit}`,
// lazy: true
// });
// return res;
// }
// export function useWebsitesData(limit: number = 10) {
// const res = useCustomFetch<VisitsWebsiteAggregated[]>(`/api/metrics/${activeProject.value?._id}/data/websites`,
// () => signHeaders(createFromToHeaders({ 'x-query-limit': limit.toString() })).headers,
// { lazy: false, watchProps: [snapshot] }
// );
// return res;
// }
// export function useEventsData(limit: number = 10) {
// const res = useCustomFetch<CustomEventsAggregated[]>(`/api/metrics/${activeProject.value?._id}/data/events`,
// () => signHeaders(createFromToHeaders({ 'x-query-limit': limit.toString() })).headers,
// { lazy: false, watchProps: [snapshot] }
// );
// return res;
// }
// export function useReferrersData(limit: number = 10) {
// const res = useCustomFetch<ReferrersAggregated[]>(`/api/metrics/${activeProject.value?._id}/data/referrers`,
// () => signHeaders(createFromToHeaders({ 'x-query-limit': limit.toString() })).headers,
// { lazy: false, watchProps: [snapshot] }
// );
// return res;
// }
// export function useBrowsersData(limit: number = 10) {
// const res = useCustomFetch<BrowsersAggregated[]>(`/api/metrics/${activeProject.value?._id}/data/browsers`,
// () => signHeaders(createFromToHeaders({ 'x-query-limit': limit.toString() })).headers,
// { lazy: false, watchProps: [snapshot] }
// );
// return res;
// }
// export function useOssData(limit: number = 10) {
// const res = useCustomFetch<OssAggregated[]>(`/api/metrics/${activeProject.value?._id}/data/oss`,
// () => signHeaders(createFromToHeaders({ 'x-query-limit': limit.toString() })).headers,
// { lazy: false, watchProps: [snapshot] }
// );
// return res;
// }
// export function useGeolocationData(limit: number = 10) {
// const res = useCustomFetch<CountriesAggregated[]>(`/api/metrics/${activeProject.value?._id}/data/countries`,
// () => signHeaders(createFromToHeaders({ 'x-query-limit': limit.toString() })).headers,
// { lazy: false, watchProps: [snapshot] }
// );
// return res;
// }
// export function useDevicesData(limit: number = 10) {
// const res = useCustomFetch<DevicesAggregated[]>(`/api/metrics/${activeProject.value?._id}/data/devices`,
// () => signHeaders(createFromToHeaders({ 'x-query-limit': limit.toString() })).headers,
// { lazy: false, watchProps: [snapshot] }
// );
// return res;
// }

View File

@@ -7,6 +7,9 @@ const setLoggedUser = (authContext?: AuthContext) => {
loggedUser.value = authContext;
};
const isLogged = computed(() => {
return loggedUser.value?.logged;
})
function getUserRoles() {
const isPremium = computed(() => {
@@ -17,6 +20,7 @@ function getUserRoles() {
if (!loggedUser.value?.logged) return false;
return loggedUser.value.user.roles.includes('ADMIN');
});
return { isPremium, isAdmin }
}
@@ -24,6 +28,7 @@ export const isAdminHidden = ref<boolean>(false);
export function useLoggedUser() {
return {
isLogged,
user: loggedUser,
userRoles: getUserRoles(),
setLoggedUser

View File

@@ -1,20 +1,15 @@
const onlineUsers = ref<number>(-1);
async function getOnlineUsers() {
const activeProject = useActiveProject();
if (!activeProject.value) return onlineUsers.value = -1;
const online = await $fetch<number>(`/api/metrics/${activeProject.value._id}/live_users`, signHeaders());
onlineUsers.value = online;
}
const onlineUsers = await useFetch<number>(`/api/data/live_users`, {
headers: useComputedHeaders({ useSnapshotDates: false }), immediate: false
});
let watching: any;
function startWatching(instant: boolean = true) {
if (instant) getOnlineUsers();
if (instant) onlineUsers.execute();
watching = setInterval(async () => {
await getOnlineUsers();
onlineUsers.refresh();
}, 20000);
}
@@ -26,7 +21,6 @@ export function useOnlineUsers() {
return {
onlineUsers,
getOnlineUsers,
startWatching,
stopWatching
}

View File

@@ -13,7 +13,26 @@ const projectsRequest = useFetch<TProject[]>('/api/project/list', {
})
});
const projectList = computed(() => projectsRequest.data.value);
const guestProjectsRequest = useFetch<TProject[]>('/api/project/list_guest', {
headers: computed(() => {
return {
'Authorization': `Bearer ${token.value}`
}
})
});
const projectList = computed(() => {
return projectsRequest.data.value;
});
const allProjectList = computed(() => {
return [...(projectsRequest.data.value || []), ...(guestProjectsRequest.data.value || [])]
})
const guestProjectList = computed(() => {
return guestProjectsRequest.data.value;
})
const refreshProjectsList = () => projectsRequest.refresh();
const activeProjectId = ref<string | undefined>();
@@ -42,6 +61,11 @@ const project = computed(() => {
return projectList.value[0];
})
const isGuest = computed(() => {
return (projectList.value || []).find(e => e._id.toString() === activeProjectId.value);
})
export function useProject() {
const actions = {
@@ -49,5 +73,5 @@ export function useProject() {
setActiveProject
}
return { project, projectList, actions, projectId: activeProjectId }
return { project, allProjectList, guestProjectList, projectList, actions, projectId: activeProjectId, isGuest }
}

View File

@@ -1,31 +1,37 @@
import type { TProjectSnapshot } from "@schema/ProjectSnapshot";
const { projectId, project } = useProject();
const headers = computed(() => {
return {
'Authorization': signHeaders().headers.Authorization,
'x-pid': projectId.value ?? ''
}
});
const remoteSnapshots = useFetch<TProjectSnapshot[]>('/api/project/snapshots', {
...signHeaders(),
immediate: false
headers
});
const activeProject = useActiveProject();
watch(activeProject, async () => {
watch(project, async () => {
await remoteSnapshots.refresh();
snapshot.value = isLiveDemo() ? snapshots.value[0] : snapshots.value[1];
});
const snapshots = computed(() => {
const activeProject = useActiveProject();
const getDefaultSnapshots: () => TProjectSnapshot[] = () => [
{
project_id: activeProject.value?._id as any,
project_id: project.value?._id as any,
_id: 'default0' as any,
name: 'All',
from: new Date(activeProject.value?.created_at || 0),
from: new Date(project.value?.created_at || 0),
to: new Date(Date.now()),
color: '#CCCCCC'
},
{
project_id: activeProject.value?._id as any,
project_id: project.value?._id as any,
_id: 'default1' as any,
name: 'Last month',
from: new Date(Date.now() - 1000 * 60 * 60 * 24 * 30),
@@ -33,7 +39,7 @@ const snapshots = computed(() => {
color: '#00CC00'
},
{
project_id: activeProject.value?._id as any,
project_id: project.value?._id as any,
_id: 'default2' as any,
name: 'Last week',
from: new Date(Date.now() - 1000 * 60 * 60 * 24 * 7),
@@ -41,7 +47,7 @@ const snapshots = computed(() => {
color: '#0F02D2'
},
{
project_id: activeProject.value?._id as any,
project_id: project.value?._id as any,
_id: 'default3' as any,
name: 'Last day',
from: new Date(Date.now() - 1000 * 60 * 60 * 24),
@@ -75,8 +81,5 @@ const snapshotDuration = computed(() => {
});
export function useSnapshot() {
if (remoteSnapshots.status.value === 'idle') {
remoteSnapshots.execute();
}
return { snapshot, snapshots, safeSnapshotDates, updateSnapshots, snapshotDuration }
}