From 332e618d52483feab80e5aed76a6cdd8b90dc93e Mon Sep 17 00:00:00 2001 From: Mathias Wagner Date: Sun, 22 Jan 2023 15:14:24 +0100 Subject: [PATCH] Updated the projects.ts controller & added the listProjects & getProject method --- src/controller/projects.ts | 67 +++++++++++++++++++++++++------------- 1 file changed, 45 insertions(+), 22 deletions(-) diff --git a/src/controller/projects.ts b/src/controller/projects.ts index 823aa4a..5f76fbb 100644 --- a/src/controller/projects.ts +++ b/src/controller/projects.ts @@ -1,47 +1,70 @@ -import { Project } from "@models/Project"; +import { IProject, Project } from "@models/Project"; import { encryptClearField } from "@utils/decryption"; import { Types } from "mongoose"; import crypto from "crypto"; -export const createProject = async (name: string, userId?: string) => { - const count = await Project.countDocuments({ creatorId: encryptClearField(userId || "") }); +export const checkProjectAccess = async (userId: string, projectId: string) => { + if (!Types.ObjectId.isValid(projectId)) + return { code: 3, message: "Invalid object id provided" }; + + const project = await Project.findOne({ _id: projectId, creatorId: encryptClearField(userId) }); + if (project === null) return { code: 5009, message: "The provided project id does not exist" }; + + // TODO: Get project where userId is a member + + return project; +}; + +const projectMapper = (project: IProject) => ({ + id: project._id, name: project.name, validationKey: project.validationKey, + defaults: project.defaults, +}); + +export const listProjects = async (userId?: string) => { + const projects = await Project.find({ creatorId: encryptClearField(userId || "") }); + + // TODO: Find projects where userId is a member + + return projects.map(project => projectMapper(project)); +}; + +export const getProject = async (projectId: string, userId: string) => { + const project = await checkProjectAccess(userId, projectId); + if ("code" in project) return project; + + return projectMapper(project); +}; + +export const createProject = async (name: string, userId: string) => { + const count = await Project.countDocuments({ creatorId: encryptClearField(userId) }); if (count > 5) return { code: 95, message: "You have exceeded the project limit" }; await Project.create({ name, creatorId: userId }); }; -export const deleteProject = async (id: string) => { - if (!Types.ObjectId.isValid(id)) - return { code: 3, message: "Invalid object id provided" }; - - const project = await Project.findById(id); - if (project === null) return { code: 5009, message: "The provided project id does not exist" }; +export const deleteProject = async (id: string, userId: string) => { + const project = await checkProjectAccess(userId, id); + if ("code" in project) return project; // TODO: Delete all licenses, groups, permissions, .. - await project.delete(); + await project?.delete(); }; -export const patchProject = async (id: string, config: { +export const patchProject = async (id: string, userId: string, config: { name: string, defaults: { licenseKey: string, groups: [], permissions: [], expirationDate: Date } }) => { - if (!Types.ObjectId.isValid(id)) - return { code: 3, message: "Invalid object id provided" }; - - const project = await Project.findById(id); - if (project === null) return { code: 5009, message: "The provided project id does not exist" }; + const project = await checkProjectAccess(userId, id); + if ("code" in project) return project; // TODO: Check if groups & permissions exist await project.updateOne({ name: config.name, defaults: Object.assign(project.defaults, config.defaults) }); }; -export const regenerateKey = async (id: string) => { - if (!Types.ObjectId.isValid(id)) - return { code: 3, message: "Invalid object id provided" }; - - const project = await Project.findById(id); - if (project === null) return { code: 5009, message: "The provided project id does not exist" }; +export const regenerateKey = async (id: string, userId: string) => { + const project = await checkProjectAccess(userId, id); + if ("code" in project) return project; await project.updateOne({ validationKey: crypto.randomBytes(24).toString("hex") }); }; \ No newline at end of file