added logic for parent/child dirs

no styling, but displaying the basic results in the DOM
This commit is contained in:
Smigz 2025-05-06 16:40:30 -04:00
parent eedab606f8
commit 1c5e2d1055
10 changed files with 123 additions and 44 deletions

View file

@ -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")
}

View file

@ -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 };

View file

@ -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 };

View file

@ -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);

View file

@ -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) {

View file

@ -9,5 +9,6 @@ fileRouter.post(
fileController.fileUpload,
);
fileRouter.post('/directory', fileController.createDirectory);
fileRouter.get('/directory', fileController.directoryContents);
module.exports = fileRouter;

View file

@ -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

View file

@ -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 };

View file

@ -14,5 +14,7 @@
<a href="/auth/register">Click here to register</a>
</form>
<% } %>
<%- include('partials/directoryListing') %>
<%- include('partials/footer') %>

View file

@ -0,0 +1,13 @@
<div class="container">
<h1> <%= directoryListing.name %> </h1>
<h2> Folders</h2>
<ul>
<% directoryListing.Directories.forEach(d => { %>
<li><a href="/<%= currentUser.username %>/<%= d.id %>"> <%= d.name %> </a></li>
<% }); %>
</ul>
<h2> Files: </h2>
<% directoryListing.File.forEach(f => { %>
<p> <%= f.name %> </p>
<% }); %>
</div>