refactoring

This commit is contained in:
Emily
2025-03-06 10:55:46 +01:00
parent 63fa3995c5
commit 942d074f99
28 changed files with 253 additions and 83 deletions

View File

@@ -13,23 +13,28 @@ export default defineEventHandler(async event => {
const body = await readBody(event);
if (body.name.length == 0) return setResponseStatus(event, 400, 'name is required');
if (body.name.length < 3) return setResponseStatus(event, 400, 'name too short');
if (body.name.length > 32) return setResponseStatus(event, 400, 'name too long');
const data = await getRequestDataOld(event, { allowGuests: false, allowLitlyx: false, });
const data = await getRequestData(event, [], ['OWNER']);
if (!data) return;
if (!body.name) return setResponseStatus(event, 400, 'body is required');
if (body.name.trim().length == 0) return setResponseStatus(event, 400, 'name is required');
if (body.name.trim().length < 3) return setResponseStatus(event, 400, 'name too short');
if (body.name.trim().length > 32) return setResponseStatus(event, 400, 'name too long');
const { project_id } = data;
const sameName = await ApiSettingsModel.exists({ project_id, apiName: body.name.trim() });
if (sameName) return setResponseStatus(event, 400, 'An api key with the same name exists');
const key = generateApiKey();
const keyNumbers = await ApiSettingsModel.countDocuments({ project_id });
if (keyNumbers >= 5) return setResponseStatus(event, 400, 'Api key limit reached');
const newApiSettings = await ApiSettingsModel.create({ project_id, apiKey: key, apiName: body.name, created_at: Date.now(), usage: 0 });
const newApiSettings = await ApiSettingsModel.create({ project_id, apiKey: key, apiName: body.name.trim(), created_at: Date.now(), usage: 0 });
return newApiSettings.toJSON();

View File

@@ -1,16 +1,18 @@
export default defineEventHandler(async event => {
const data = await getRequestDataOld(event, { requireSchema: false, allowGuests: false, allowLitlyx: false });
const data = await getRequestData(event, [], ['OWNER']);
if (!data) return;
const { project } = data;
const { name } = await readBody(event);
if (name.length == 0) return setResponseStatus(event, 400, 'name is required');
if (name.trim()) return setResponseStatus(event, 400, 'name is required');
if (name.trim().length < 2) return setResponseStatus(event, 400, 'name too short');
if (name.trim().length > 32) return setResponseStatus(event, 400, 'name too long');
project.name = name;
project.name = name.trim();
await project.save();
return { ok: true };

View File

@@ -8,7 +8,7 @@ export default defineEventHandler(async event => {
const body = await readBody(event);
const newProjectName = body.name;
const newProjectName = body.name.trim();
if (!newProjectName) return setResponseStatus(event, 400, 'ProjectName too short');
if (newProjectName.length < 2) return setResponseStatus(event, 400, 'ProjectName too short');

View File

@@ -7,9 +7,7 @@ export default defineEventHandler(async event => {
if (!userData?.logged) return [];
const members = await TeamMemberModel.find({
user_id: userData.id
});
const members = await TeamMemberModel.find({ user_id: userData.id, pending: false });
const projects: TProject[] = [];

View File

@@ -10,6 +10,8 @@ export default defineEventHandler(async event => {
const { project_id } = body;
if (!project_id) return setResponseStatus(event, 400, 'project_id is required');
console.log({ project_id, user_id: data.user.id });
const member = await TeamMemberModel.findOne({ project_id, user_id: data.user.id });
if (!member) return setResponseStatus(event, 400, 'member not found');

View File

@@ -9,12 +9,16 @@ export default defineEventHandler(async event => {
const data = await getRequestData(event, [], ['OWNER']);
if (!data) return;
const { project_id, project } = data;
const { project_id, project, user } = data;
const { email } = await readBody(event);
const targetUser = await UserModel.findOne({ email });
if (targetUser && targetUser._id.toString() === project.owner.toString()) {
return setResponseStatus(event, 400, 'You cannot invite yourself');
}
const link = `http://127.0.0.1:3000/accept_invite?project_id=${project_id.toString()}`;

View File

@@ -4,7 +4,7 @@ import { TeamMemberModel } from "@schema/TeamMemberSchema";
export default defineEventHandler(async event => {
const data = await getRequestData(event, []);
const data = await getRequestData(event, [], []);
if (!data) return;
const { project_id, user } = data;

View File

@@ -14,7 +14,7 @@ export type MemberWithPermissions = {
export default defineEventHandler(async event => {
const data = await getRequestData(event);
const data = await getRequestData(event, [], ['OWNER']);
if (!data) return;
const { project_id, project, user } = data;

View File

@@ -11,7 +11,7 @@ export default defineEventHandler(async event => {
const { name: newSnapshotName, from, to, color: snapshotColor } = body;
if (!newSnapshotName) return setResponseStatus(event, 400, 'SnapshotName too short');
if (newSnapshotName.length == 0) return setResponseStatus(event, 400, 'SnapshotName too short');
if (newSnapshotName.trim().length == 0) return setResponseStatus(event, 400, 'SnapshotName too short');
if (!from) return setResponseStatus(event, 400, 'from is required');
if (!to) return setResponseStatus(event, 400, 'to is required');
@@ -26,7 +26,7 @@ export default defineEventHandler(async event => {
const newSnapshot = await ProjectSnapshotModel.create({
name: newSnapshotName,
name: newSnapshotName.trim(),
from: new Date(from),
to: new Date(to),
color: snapshotColor,

View File

@@ -12,17 +12,18 @@ export default defineEventHandler(async event => {
const cacheKey = `timeline:visits:${pid}:${slice}:${from}:${to}:${domain}`;
const cacheExp = 20;
return await Redis.useCacheV2(cacheKey, cacheExp, async () => {
const timelineData = await executeAdvancedTimelineAggregation({
projectId: project_id,
model: VisitModel,
from, to, slice, timeOffset, domain
});
return timelineData;
// return await Redis.useCacheV2(cacheKey, cacheExp, async () => {
const timelineData = await executeAdvancedTimelineAggregation({
projectId: project_id,
model: VisitModel,
from, to, slice, timeOffset, domain,
debug: true
});
return timelineData;
// });

View File

@@ -80,10 +80,11 @@ export async function executeAdvancedTimelineAggregation<T = {}>(options: Advanc
range: {
step: 1,
unit: granularity,
bounds: [
new Date(new Date(options.from).getTime() - (timeOffset * 1000 * 60)),
new Date(new Date(options.to).getTime() - (timeOffset * 1000 * 60) + 1),
]
bounds: 'full'
// [
// new Date(new Date(options.from).getTime() - (timeOffset * 1000 * 60)),
// new Date(new Date(options.to).getTime() - (timeOffset * 1000 * 60) + 1),
// ]
}
}
},