mirror of
https://github.com/Litlyx/litlyx
synced 2025-12-10 15:58:38 +01:00
new selfhosted version
This commit is contained in:
25
dashboard/server/api/share/create.post.ts
Normal file
25
dashboard/server/api/share/create.post.ts
Normal 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
|
||||
});
|
||||
});
|
||||
9
dashboard/server/api/share/delete.delete.ts
Normal file
9
dashboard/server/api/share/delete.delete.ts
Normal 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 });
|
||||
});
|
||||
16
dashboard/server/api/share/info.ts
Normal file
16
dashboard/server/api/share/info.ts
Normal 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)
|
||||
}
|
||||
});
|
||||
8
dashboard/server/api/share/list.ts
Normal file
8
dashboard/server/api/share/list.ts
Normal 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[];
|
||||
});
|
||||
35
dashboard/server/api/share/live_users.ts
Normal file
35
dashboard/server/api/share/live_users.ts
Normal 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;
|
||||
|
||||
});
|
||||
11
dashboard/server/api/share/verify.ts
Normal file
11
dashboard/server/api/share/verify.ts
Normal 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;
|
||||
});
|
||||
Reference in New Issue
Block a user