diff --git a/file-uploader/prisma/schema.prisma b/file-uploader/prisma/schema.prisma index 4534c09..8845d5c 100644 --- a/file-uploader/prisma/schema.prisma +++ b/file-uploader/prisma/schema.prisma @@ -5,8 +5,9 @@ // Try Prisma Accelerate: https://pris.ly/cli/accelerate-init generator client { - provider = "prisma-client-js" - output = "../node_modules/.prisma/client" + provider = "prisma-client-js" + previewFeatures = ["relationJoins"] + output = "../node_modules/.prisma/client" } datasource db { @@ -45,7 +46,7 @@ model Folder { owner User? @relation(fields: [owner_user_id], references: [id]) owner_user_id Int? parentId Int? - parent Folder? @relation("ParentDirectory", fields: [parentId], references: [id]) + parent Folder? @relation("ParentDirectory", fields: [parentId], references: [id]) Directories Folder[] @relation("ParentDirectory") } diff --git a/file-uploader/src/controllers/fileController.js b/file-uploader/src/controllers/fileController.js index c4b9f1d..3152209 100644 --- a/file-uploader/src/controllers/fileController.js +++ b/file-uploader/src/controllers/fileController.js @@ -1,34 +1,26 @@ const multer = require('multer'); const Db = require('../models/db'); +const { + mkDirectory, + getDirectoryContents, +} = require('../services/fileService'); const upload = multer({ dest: '/tmp/testing/' }); const db = new Db(); -// -// const createUserRootDir = async () => { -// const user = await db.auth.getUserByUsername(username); -// console.log(`USERID: ${user.id}`); -// const dir = await db.file.createDirectory(user, 'root'); -// if (dir.error) { -// console.log(dir.error); -// } else { -// console.log(dir.message); -// } -// }; const createDirectory = async (req, res) => { const { parentId, 'directory-name': directoryName } = req.body; + const referer = req.get('referer'); + const result = await mkDirectory(directoryName, req.user, Number(parentId)); - const result = await db.file.createDirectory( - req.user, - directoryName, - Number(parentId), - ); - - res.redirect('/'); + if (referer && result) { + res.redirect(referer); + } else { + res.redirect('/'); + } }; const fileUpload = async (req, res) => { - console.log(req.file); const { folderId } = req.body; const file = { name: req.file.originalname, @@ -38,7 +30,6 @@ const fileUpload = async (req, res) => { mimetype: req.file.mimetype, size: req.file.size, }; - console.log(file, req.user); try { const result = await db.file.createFile(req.user.id, file); console.log(result); @@ -49,10 +40,23 @@ const fileUpload = async (req, res) => { res.redirect('/'); }; -const userDirs = (req, res) => { - if (req.user) { - // logic to grab the current dir based on path maybe - // logic to grab all user dirs? +const directoryContents = async (req, res) => { + if (!req.user) return res.redirect('/'); + + const { directoryId } = req.query; + const { id } = req.user; + const directoryListing = await getDirectoryContents( + Number(directoryId), + id, + ); + + if (directoryListing) { + res.render('partials/directoryListing', { + directoryListing: directoryListing, + pageTitle: `FileUpload - ${directoryListing.name}`, + }); + } else { + res.redirect('/'); } }; @@ -62,4 +66,4 @@ const getFiles = (req, res) => { } }; -module.exports = { createDirectory, upload, fileUpload }; +module.exports = { createDirectory, upload, fileUpload, directoryContents }; diff --git a/file-uploader/src/controllers/indexController.js b/file-uploader/src/controllers/indexController.js index bd51222..0fe6c3b 100644 --- a/file-uploader/src/controllers/indexController.js +++ b/file-uploader/src/controllers/indexController.js @@ -1,17 +1,32 @@ -const Db = require('../models/db'); +const { getDirectoryContents } = require('../services/fileService'); -const db = new Db(); const indexGet = async (req, res) => { - // const data = await db.allUsers() - // console.dir(data) if (req.user) { - const id = await db.file.getUserRootDirectoryId(req.user.id); - if (id === null) console.log('id is null'); - console.log(id); - res.render('main', { pageTitle: 'FileUpload', folder: { id: id } }); + // res.render('main', { + // pageTitle: 'FileUpload', + // folder: { id: req.user.rootDirectoryId }, + // }); + + res.redirect(`/${req.user.username}/${req.user.rootDirectoryId}`); + // if unauthenticated } else { res.render('main', { pageTitle: 'FileUpload', folder: {} }); } }; -module.exports = { indexGet }; +const userDirectoryNavigation = async (req, res) => { + const { username, directoryId } = req.params; + if (username !== req.user.username) res.redirect('/'); + + const dirContents = await getDirectoryContents(directoryId, req.user.id); + + if (!dirContents) res.redirect('/'); + + res.render('main', { + pageTitle: 'FileUpload - Dashboard', + folder: { id: directoryId }, + directoryListing: dirContents, + }); +}; + +module.exports = { indexGet, userDirectoryNavigation }; diff --git a/file-uploader/src/middlewares/auth.js b/file-uploader/src/middlewares/auth.js index 12f4129..259b4cf 100644 --- a/file-uploader/src/middlewares/auth.js +++ b/file-uploader/src/middlewares/auth.js @@ -25,9 +25,9 @@ passport.use( // ensure users root directory has been created const rootDirId = await db.file.getUserRootDirectoryId(user.id); - console.log(rootDirId); if (rootDirId === null) await db.file.createDirectory(user, 'root', null); + return done(null, user); } catch (err) { return done(err); @@ -42,6 +42,8 @@ passport.serializeUser((user, done) => { passport.deserializeUser(async (id, done) => { try { const user = await db.auth.getUserById(id); + const rootDirId = await db.file.getUserRootDirectoryId(user.id); + user.rootDirectoryId = rootDirId; done(null, user); } catch (err) { done(err); diff --git a/file-uploader/src/models/file.js b/file-uploader/src/models/file.js index d5c222c..4e287fb 100644 --- a/file-uploader/src/models/file.js +++ b/file-uploader/src/models/file.js @@ -21,7 +21,7 @@ class File { } } - async getDirectoryIdByName(dirId, userId) { + async getDirectoryIdByName(dirId) { try { await this.prisma.folder.findUnique({ where: { @@ -54,6 +54,26 @@ class File { } } + async getDirectoryContents(directoryId, ownerId) { + try { + const contents = await this.prisma.folder.findFirst({ + relationLoadStrategy: 'join', + include: { + File: true, + Directories: true, + }, + where: { + id: directoryId, + owner_user_id: ownerId, + }, + }); + return contents; + } catch (e) { + console.error(e); + return { error: e }; + } + } + async getDirectoriesByUser() {} async createFile(userId, file) { diff --git a/file-uploader/src/routes/fileRouter.js b/file-uploader/src/routes/fileRouter.js index 3a33c6e..0564e02 100644 --- a/file-uploader/src/routes/fileRouter.js +++ b/file-uploader/src/routes/fileRouter.js @@ -9,5 +9,6 @@ fileRouter.post( fileController.fileUpload, ); fileRouter.post('/directory', fileController.createDirectory); +fileRouter.get('/directory', fileController.directoryContents); module.exports = fileRouter; diff --git a/file-uploader/src/routes/indexRouter.js b/file-uploader/src/routes/indexRouter.js index 89c8a3a..9753835 100644 --- a/file-uploader/src/routes/indexRouter.js +++ b/file-uploader/src/routes/indexRouter.js @@ -1,8 +1,12 @@ -const { Router } = require("express") -const indexController = require("../controllers/indexController") +const { Router } = require('express'); +const indexController = require('../controllers/indexController'); -indexRouter = Router() -indexRouter.get("/", indexController.indexGet) +indexRouter = Router(); +indexRouter.get('/', indexController.indexGet); +indexRouter.get( + '/:username/:directoryId', + indexController.userDirectoryNavigation, +); +module.exports = indexRouter; -module.exports = indexRouter \ No newline at end of file diff --git a/file-uploader/src/services/fileService.js b/file-uploader/src/services/fileService.js new file mode 100644 index 0000000..c5f6382 --- /dev/null +++ b/file-uploader/src/services/fileService.js @@ -0,0 +1,17 @@ +const Db = require('../models/db'); + +const db = new Db(); + +async function getDirectoryContents(directoryId, userId) { + return await db.file.getDirectoryContents(Number(directoryId), userId); +} + +async function mkDirectory(directoryName, user, parentDirectoryId) { + return await db.file.createDirectory( + user, + directoryName, + Number(parentDirectoryId), + ); +} + +module.exports = { mkDirectory, getDirectoryContents }; diff --git a/file-uploader/src/views/main.ejs b/file-uploader/src/views/main.ejs index ac5deba..f1156db 100644 --- a/file-uploader/src/views/main.ejs +++ b/file-uploader/src/views/main.ejs @@ -14,5 +14,7 @@ Click here to register + <% } %> + <%- include('partials/directoryListing') %> <%- include('partials/footer') %> diff --git a/file-uploader/src/views/partials/directoryListing.ejs b/file-uploader/src/views/partials/directoryListing.ejs new file mode 100644 index 0000000..fb1107c --- /dev/null +++ b/file-uploader/src/views/partials/directoryListing.ejs @@ -0,0 +1,13 @@ +
<%= f.name %>
+ <% }); %> +