diff --git a/server/prisma/schema.prisma b/server/prisma/schema.prisma index dc603c8..7dbf003 100644 --- a/server/prisma/schema.prisma +++ b/server/prisma/schema.prisma @@ -7,35 +7,6 @@ datasource db { url = env("DATABASE_URL") } -model Attachment { - attachmentID Int @id @default(autoincrement()) - createdAt DateTime @db.Timestamp(0) - fileName String @unique(map: "fileName") @db.VarChar(255) - mimeType String @db.VarChar(255) - blobValue String - NotebookbookID Int - Notebook Notebook @relation(fields: [NotebookbookID], references: [bookID], onDelete: Cascade, onUpdate: NoAction, map: "attached") - Attachment_Page Attachment_Page[] - - @@index([NotebookbookID], map: "attached") -} - -model Attachment_Page { - AttachmentattachmentID Int - PagepageID Int - Attachment Attachment @relation(fields: [AttachmentattachmentID], references: [attachmentID], onDelete: Cascade, onUpdate: NoAction, map: "related to page") - Page Page @relation(fields: [PagepageID], references: [pageID], onDelete: Cascade, onUpdate: NoAction, map: "may involve") - - @@id([AttachmentattachmentID, PagepageID]) - @@index([PagepageID], map: "may involve") -} - -model CloudStorage { - storageID Int @id @default(autoincrement()) - name String @db.VarChar(255) - description String -} - model EditorSettings { editorID Int @id @default(autoincrement()) spellCheck Boolean @db.Boolean @@ -50,35 +21,6 @@ model EditorSettings { @@index([SettingssettingsID], map: "covers 1") } -model Folder { - folderID Int @id @default(autoincrement()) - name String @db.VarChar(255) - createdAt DateTime @db.Timestamp(0) - updatedAt DateTime @db.Timestamp(0) - NotebookbookID Int - ParentfolderID Int? - Notebook Notebook @relation(fields: [NotebookbookID], references: [bookID], onDelete: Cascade, onUpdate: NoAction, map: "contains") - Folder Folder? @relation("FolderToFolder_ParentfolderID", fields: [ParentfolderID], references: [folderID], onDelete: Cascade, onUpdate: NoAction, map: "includes") - other_Folder Folder[] @relation("FolderToFolder_ParentfolderID") - Page Page[] - - @@index([NotebookbookID], map: "contains") - @@index([ParentfolderID], map: "includes") -} - -model Notebook { - bookID Int @id @default(autoincrement()) - createdAt DateTime @db.Timestamp(0) - updatedAt DateTime @db.Timestamp(0) - name String @unique(map: "name") @db.VarChar(255) - UseruserID Int - User User @relation(fields: [UseruserID], references: [userID], onDelete: Cascade, onUpdate: NoAction, map: "writes in") - Attachment Attachment[] - Folder Folder[] - - @@index([UseruserID], map: "writes in") -} - model OneTimeVerificationCode { codeID Int @id @default(autoincrement()) code String @db.Char(6) @@ -89,19 +31,6 @@ model OneTimeVerificationCode { @@index([UseruserID], map: "completes") } -model Page { - pageID Int @id @default(autoincrement()) - name String @db.VarChar(255) - createdAt DateTime @db.Timestamp(0) - updatedAt DateTime @db.Timestamp(0) - content String - FolderfolderID Int - Folder Folder @relation(fields: [FolderfolderID], references: [folderID], onDelete: Cascade, onUpdate: NoAction, map: "consists of") - Attachment_Page Attachment_Page[] - - @@index([FolderfolderID], map: "consists of") -} - model Settings { settingsID Int @id @default(autoincrement()) UseruserID Int @@ -128,7 +57,6 @@ model User { email String @unique(map: "email") @db.VarChar(255) password String @db.VarChar(255) verified Boolean - Notebook Notebook[] OneTimeVerificationCode OneTimeVerificationCode[] Settings Settings[] VaultSubscription VaultSubscription[] @@ -147,6 +75,11 @@ model VaultSubscription { @@index([UseruserID], map: "has") } +model NotebookItem { + id String @unique @id + content String @db.Text +} + model session { sid String @id @db.VarChar sess Json @db.Json diff --git a/server/src/controllers/userController/user.ts b/server/src/controllers/userController/user.ts index 9ab3885..5949bef 100644 --- a/server/src/controllers/userController/user.ts +++ b/server/src/controllers/userController/user.ts @@ -1,7 +1,7 @@ import { Response, Request } from 'express'; export const user = async (req: Request, res: Response) => { - if (req.session.user) { + if (!req.session.user) { res.json({ message: 'no authenticated user' }); return; diff --git a/server/src/controllers/userController/verify.ts b/server/src/controllers/userController/verify.ts index becb561..8dffc79 100644 --- a/server/src/controllers/userController/verify.ts +++ b/server/src/controllers/userController/verify.ts @@ -1,5 +1,5 @@ import { Response, Request } from 'express'; -import { verifyUserValidation } from '../../Validation/verifyUserValidation'; +import { verifyUserValidation } from '../../validation/verifyUserValidation'; import { retrieveVerificationCode, verifyUser diff --git a/server/src/controllers/vaultController/addItem.ts b/server/src/controllers/vaultController/addItem.ts new file mode 100644 index 0000000..0cf58f8 --- /dev/null +++ b/server/src/controllers/vaultController/addItem.ts @@ -0,0 +1,25 @@ +import { Request, Response } from 'express'; +import { db } from '../../database/sync'; +import { Item } from '../../types'; + +export const addItem = async (req: Request, res: Response) => { + if (!req.session.user) { + return res.status(400).send(`Not authenticated to Vault.`); + } + + const item: Item = req.body.item; + const notebookStructure: Item = req.body.notebookStructure; + + const response = await db.addItem( + req.ctx!, + item + ); + + await db.updateNotebookStructure(req.ctx!, notebookStructure); + + response + ? res.status(200).send(`Item ${item.id} was created successfully.`) + : res.status(400).send(`Item ${item.id} could not be created.`); + + return; +} \ No newline at end of file diff --git a/server/src/controllers/vaultController/createNotebook.ts b/server/src/controllers/vaultController/createNotebook.ts new file mode 100644 index 0000000..eb36ec2 --- /dev/null +++ b/server/src/controllers/vaultController/createNotebook.ts @@ -0,0 +1,13 @@ +import { Response, Request } from 'express'; +import { Item } from '../../types'; +import { db } from '../../database/sync'; + +export const createNotebook = async (req: Request, __: Response) => { + console.log(req.body.notebookStructure); + + const notebookStructure: Item[] = req.body.notebookStructure; + + notebookStructure.forEach((item) => { + db.addItem(req.ctx!, item); + }); +}; diff --git a/server/src/controllers/vaultController/deleteItem.ts b/server/src/controllers/vaultController/deleteItem.ts new file mode 100644 index 0000000..4a3dc70 --- /dev/null +++ b/server/src/controllers/vaultController/deleteItem.ts @@ -0,0 +1,15 @@ +import { Request, Response } from 'express'; +import { db } from '../../database/sync'; +import {Item} from '../../types'; + +export const deleteItem = async (req: Request, res: Response) => { + const itemId: string = req.body.itemId; + const notebookStructure: Item = req.body.notebookStructure; + + const response = await db.deleteItem(req.ctx!, itemId); + db.updateNotebookStructure(req.ctx!, notebookStructure); + + response + ? res.status(200).send(`Deleted file ${itemId}`) + : res.status(400).send('An error occurred when deleting file.'); +} \ No newline at end of file diff --git a/server/src/controllers/vaultController/downloadItem.ts b/server/src/controllers/vaultController/downloadItem.ts new file mode 100644 index 0000000..e4b676c --- /dev/null +++ b/server/src/controllers/vaultController/downloadItem.ts @@ -0,0 +1,14 @@ +import { Request, Response } from 'express'; +import { db } from '../../database/sync'; + +export const downloadItem = async (req: Request, res: Response) => { + const itemId: string = req.query.itemId as unknown as string; + + const response = await db.downloadItem(req.ctx!, itemId); + + response + ? res.status(200).json({ + content: response.content + }) + : res.status(400).send(`Item ${itemId} could not be downloaded.`); +} \ No newline at end of file diff --git a/server/src/controllers/vaultController/index.ts b/server/src/controllers/vaultController/index.ts index 18df9fb..4ebdaa0 100644 --- a/server/src/controllers/vaultController/index.ts +++ b/server/src/controllers/vaultController/index.ts @@ -1,5 +1,14 @@ -import { createNotebook } from './notebook'; +import { createNotebook } from './createNotebook'; +import { deleteItem } from './deleteItem'; +import { updateItem } from './updateItem'; +import { addItem } from './addItem'; +import { downloadItem } from './downloadItem'; export const vaultController = { - createNotebook + createNotebook, + + addItem, + updateItem, + deleteItem, + downloadItem }; diff --git a/server/src/controllers/vaultController/notebook.ts b/server/src/controllers/vaultController/notebook.ts deleted file mode 100644 index b738112..0000000 --- a/server/src/controllers/vaultController/notebook.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Response, Request } from 'express'; - -export const createNotebook = async (req: Request, res: Response) => { - if (true) { - console.log(req.session.user); - } else { - console.log(res); - } -}; diff --git a/server/src/controllers/vaultController/updateItem.ts b/server/src/controllers/vaultController/updateItem.ts new file mode 100644 index 0000000..95c0171 --- /dev/null +++ b/server/src/controllers/vaultController/updateItem.ts @@ -0,0 +1,19 @@ +import { Request, Response } from 'express'; +import { db } from '../../database/sync'; +import { Item } from '../../types'; + +export const updateItem = async (req: Request, res: Response) => { + const item: Item = req.body.item; + const notebookStructure: Item = req.body.notebookStructure; + + const response = await db.updateItem( + req.ctx!, + item + ); + + await db.updateNotebookStructure(req.ctx!, notebookStructure); + + response + ? res.status(200).send(`File ${item.id} was updated successfully.`) + : res.status(400).send(`File ${item.id} could not be updated.`); +} \ No newline at end of file diff --git a/server/src/database/sync/addItem.ts b/server/src/database/sync/addItem.ts new file mode 100644 index 0000000..393f216 --- /dev/null +++ b/server/src/database/sync/addItem.ts @@ -0,0 +1,12 @@ +import { Context, Item } from "../../types"; + +export async function addItem(ctx: Context, item: Item) { + const response = await ctx.prisma.notebookItem.create({ + data: { + id: item.id, + content: item.content + } + }); + + return response !== undefined; +} \ No newline at end of file diff --git a/server/src/database/sync/deleteItem.ts b/server/src/database/sync/deleteItem.ts new file mode 100644 index 0000000..e6800c5 --- /dev/null +++ b/server/src/database/sync/deleteItem.ts @@ -0,0 +1,11 @@ +import { Context } from '../../types'; + +export async function deleteItem(ctx: Context, itemId: string) { + const response = await ctx.prisma.notebookItem.delete({ + where: { + id: itemId + } + }); + + return response !== undefined; +} \ No newline at end of file diff --git a/server/src/database/sync/downloadItem.ts b/server/src/database/sync/downloadItem.ts new file mode 100644 index 0000000..d171a46 --- /dev/null +++ b/server/src/database/sync/downloadItem.ts @@ -0,0 +1,12 @@ +import { Context } from '../../types'; + +export async function downloadItem(ctx: Context, itemId: string) { + console.log(itemId); + const response = await ctx.prisma.notebookItem.findUnique({ + where: { + id: itemId + } + }) + + return response !== null ? response : undefined; +} \ No newline at end of file diff --git a/server/src/database/sync/index.ts b/server/src/database/sync/index.ts new file mode 100644 index 0000000..d055d0f --- /dev/null +++ b/server/src/database/sync/index.ts @@ -0,0 +1,13 @@ +import { deleteItem } from './deleteItem'; +import { addItem } from './addItem'; +import { updateItem } from './updateItem'; +import { downloadItem } from './downloadItem'; +import { updateNotebookStructure } from './updateNotebookStructure'; + +export const db = { + addItem, + deleteItem, + updateItem, + downloadItem, + updateNotebookStructure +}; \ No newline at end of file diff --git a/server/src/database/sync/updateItem.ts b/server/src/database/sync/updateItem.ts new file mode 100644 index 0000000..119f7f8 --- /dev/null +++ b/server/src/database/sync/updateItem.ts @@ -0,0 +1,14 @@ +import { Context, Item } from '../../types'; + +export async function updateItem(ctx: Context, item: Item) { + const response = await ctx.prisma.notebookItem.update({ + data: { + content: item.content + }, + where: { + id: item.id + } + }); + + return response !== undefined; +} \ No newline at end of file diff --git a/server/src/database/sync/updateNotebookStructure.ts b/server/src/database/sync/updateNotebookStructure.ts new file mode 100644 index 0000000..adcfff5 --- /dev/null +++ b/server/src/database/sync/updateNotebookStructure.ts @@ -0,0 +1,14 @@ +import {Context, Item} from '../../types'; + +export async function updateNotebookStructure(ctx: Context, notebookStructure: Item) { + const response = await ctx.prisma.notebookItem.update({ + data: { + content: notebookStructure.content + }, + where: { + id: notebookStructure.id + } + }) + + return response !== undefined; +} \ No newline at end of file diff --git a/server/src/routes.ts b/server/src/routes.ts index 3b442f8..dd78660 100644 --- a/server/src/routes.ts +++ b/server/src/routes.ts @@ -5,22 +5,24 @@ import { vaultController } from './controllers'; const router = Router(); +// Auth router.post('/verify', userController.verify); - router.post('/register', userController.register); - router.post('/login', userController.login); - router.post('/logout', userController.logout); router.get('/user', userController.user); router.post('/forgot-password', userController.forgotPassword); - router.post('/reset-password', userController.resetPassword); router.get('/google-drive/get-token', providerController.googleGetAuthCode); -router.post('/vault/notebook', vaultController.createNotebook); +// Vault +router.post('/vault/create-notebook', vaultController.createNotebook); +router.post('/vault/add', vaultController.addItem); +router.post('/vault/update', vaultController.updateItem); +router.post('/vault/delete', vaultController.deleteItem); +router.get('/vault/download', vaultController.downloadItem) export { router }; diff --git a/server/src/types.d.ts b/server/src/types.d.ts index b82e16b..fcdacb7 100644 --- a/server/src/types.d.ts +++ b/server/src/types.d.ts @@ -17,3 +17,10 @@ export interface CreateUserData { } export type RegisterData = CreateUserData; export type LoginData = CreateUserData; // need to refactor + +export interface Item { + id: string; + content: string; +} + +export type NotebookStructure = NotebookItem[]; \ No newline at end of file diff --git a/server/src/utils/mapStructureToModel.ts b/server/src/utils/mapStructureToModel.ts new file mode 100644 index 0000000..e69de29