new selfhosted version

This commit is contained in:
antonio
2025-11-28 14:11:51 +01:00
parent afda29997d
commit 951860f67e
1046 changed files with 72586 additions and 574750 deletions

View File

@@ -0,0 +1,25 @@
import { ProjectShareModel, TProjectShare } from "~/shared/schema/project/ProjectShareSchema";
import crypto from 'crypto';
async function createNewShareableLink() {
const link = crypto.randomBytes(16).toString('hex');
const exists = await ProjectShareModel.findOne({ link });
if (exists) return await createNewShareableLink();
return link;
}
export default defineEventHandler(async event => {
const ctx = await getRequestContext(event, 'pid');
const { project_id } = ctx;
const { isPublic, password, description, domain } = await readBody(event);
const link = await createNewShareableLink();
await ProjectShareModel.create({
project_id,
link,
domain,
password: isPublic ? undefined : password,
description
});
});

View File

@@ -0,0 +1,9 @@
import { ProjectShareModel, TProjectShare } from "~/shared/schema/project/ProjectShareSchema";
export default defineEventHandler(async event => {
const ctx = await getRequestContext(event, 'pid');
const { project_id } = ctx;
const { id } = getQuery(event);
if (!id) return;
await ProjectShareModel.deleteOne({ _id: id?.toString(), project_id });
});

View File

@@ -0,0 +1,16 @@
import { ProjectShareModel } from "~/shared/schema/project/ProjectShareSchema";
export default defineEventHandler(async event => {
const ctx = await getRequestContext(event, 'flag:allowAnon');
const { linkId } = getQuery(event)
const target = await ProjectShareModel.findOne({
link: linkId?.toString()
});
if (!target) return;
return {
project_id: target.project_id,
hasPassword: (target.password != undefined && target.password.length > 0)
}
});

View File

@@ -0,0 +1,8 @@
import { ProjectShareModel, TProjectShare } from "~/shared/schema/project/ProjectShareSchema";
export default defineEventHandler(async event => {
const ctx = await getRequestContext(event, 'pid');
const { project_id } = ctx;
const list = await ProjectShareModel.find({ project_id });
return list.map(e => e.toJSON()) as TProjectShare[];
});

View File

@@ -0,0 +1,35 @@
import dayjs from "dayjs";
import { VisitModel } from "~/shared/schema/metrics/VisitSchema";
import { ProjectShareModel } from "~/shared/schema/project/ProjectShareSchema";
export default defineEventHandler(async event => {
const ctx = await getRequestContext(event, 'pid', 'flag:allowShare');
const { linkId } = getQuery(event);
if (!linkId) return;
const target = await ProjectShareModel.findOne({ link: linkId.toString() });
if (!target) return;
const timespan = dayjs(Date.now() - 1000 * 60 * 5).utc().toDate()
const live_users = await VisitModel.aggregate([
{
$match: {
project_id: target._id,
created_at: { $gte: timespan }
}
},
{
$group: {
_id: '$session',
session: { $sum: 1 }
}
},
{
$count: 'sessions'
}
]);
return live_users[0]?.sessions || 0 as number;
});

View File

@@ -0,0 +1,11 @@
import { ProjectShareModel } from "~/shared/schema/project/ProjectShareSchema";
export default defineEventHandler(async event => {
const ctx = await getRequestContext(event, 'flag:allowAnon');
const { linkId, password } = getQuery(event)
const target = await ProjectShareModel.findOne({ link: linkId?.toString(), password: password?.toString() });
if (!target) return false;
return true;
});