diff --git a/.dockerignore b/.dockerignore deleted file mode 100644 index a3bd578..0000000 --- a/.dockerignore +++ /dev/null @@ -1,133 +0,0 @@ -*.db -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -lerna-debug.log* -.pnpm-debug.log* - -# Diagnostic reports (https://nodejs.org/api/report.html) -report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json - -# Runtime data -pids -*.pid -*.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage -*.lcov - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Bower dependency directory (https://bower.io/) -bower_components - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (https://nodejs.org/api/addons.html) -build/Release - -# Dependency directories -node_modules/ -jspm_packages/ - -# Snowpack dependency directory (https://snowpack.dev/) -web_modules/ - -# TypeScript cache -*.tsbuildinfo - -# Optional npm cache directory -.npm - -# Optional eslint cache -.eslintcache - -# Optional stylelint cache -.stylelintcache - -# Microbundle cache -.rpt2_cache/ -.rts2_cache_cjs/ -.rts2_cache_es/ -.rts2_cache_umd/ - -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' -*.tgz - -# Yarn Integrity file -.yarn-integrity - -# dotenv environment variable files -.env -.env.development.local -.env.test.local -.env.production.local -.env.local - -# parcel-bundler cache (https://parceljs.org/) -.cache -.parcel-cache - -# Next.js build output -.next -out - -# Nuxt.js build / generate output -.nuxt -dist - -# Gatsby files -.cache/ -# Comment in the public line in if your project uses Gatsby and not Next.js -# https://nextjs.org/blog/next-9-1#public-directory-support -# public - -# vuepress build output -.vuepress/dist - -# vuepress v2.x temp and cache directory -.temp -.cache - -# Docusaurus cache and generated files -.docusaurus - -# Serverless directories -.serverless/ - -# FuseBox cache -.fusebox/ - -# DynamoDB Local files -.dynamodb/ - -# TernJS port file -.tern-port - -# Stores VSCode versions used for testing VSCode extensions -.vscode-test - -# yarn v2 -.yarn/cache -.yarn/unplugged -.yarn/build-state.yml -.yarn/install-state.gz -.pnp.* - -.DS_STORE diff --git a/file-uploader/prisma/schema.prisma b/file-uploader/prisma/schema.prisma index dcdc230..9b55480 100644 --- a/file-uploader/prisma/schema.prisma +++ b/file-uploader/prisma/schema.prisma @@ -25,23 +25,22 @@ model User { } model File { - id String @id @default(uuid()) - name String @db.VarChar(255) - url String - size Int - mimetype String - createdAt DateTime @default(now()) - modifiedAt DateTime @default("2020-03-19T14:21:00+02:00") - owner User? @relation(fields: [ownerId], references: [id]) - ownerId String? - folder Folder? @relation(fields: [folderId], references: [id]) - folderId String? + id String @id @default(uuid()) + name String @db.VarChar(255) + url String + size Int + mimetype String + createdAt DateTime @default(now()) + owner User? @relation(fields: [ownerId], references: [id]) + ownerId String? + folder Folder? @relation(fields: [folderId], references: [id]) + folderId String? } model Folder { id String @id @default(uuid()) name String @db.VarChar(255) - createdAt DateTime @default(now()) + creation_date DateTime @default(now()) modification_date DateTime @default(now()) File File[] owner User? @relation(fields: [owner_user_id], references: [id]) diff --git a/file-uploader/public/css/style.css b/file-uploader/public/css/style.css index df9bda9..ab92e28 100644 --- a/file-uploader/public/css/style.css +++ b/file-uploader/public/css/style.css @@ -24,11 +24,6 @@ body { -webkit-font-smoothing: antialiased; } -html, -body { - height: 100%; -} - /* 6. Improve media defaults */ img, picture, @@ -139,32 +134,9 @@ input[type='file']:focus::file-selector-button { } } -main { - display: flex; - justify-content: center; - width: 100%; -} - -main > div { - width: 100%; -} - -aside { - min-width: 250px; - padding: 1em; -} -.flex { - display: flex; -} - -.directory-grid { - display: grid; - grid-template-columns: 1fr 1fr 1fr; -} - -.app { - height: 100%; -} - -@media screen and (max-width: 600px) { -} +/* .file { */ +/* opacity: 0; */ +/* width: 0.1px; */ +/* height: 0.1px; */ +/* position: absolute; */ +/* } */ diff --git a/file-uploader/src/controllers/fileController.js b/file-uploader/src/controllers/fileController.js index a95d5ba..f6d1f58 100644 --- a/file-uploader/src/controllers/fileController.js +++ b/file-uploader/src/controllers/fileController.js @@ -1,16 +1,17 @@ const multer = require('multer'); +const Db = require('../models/db'); const { - uploadToStorage, + uploadFile, mkDirectory, getDirectoryContents, - createFileRecord, - getFileMetaData, - editFile, + getProperPath, } = require('../services/fileService'); -const { getFullUploadPath, formatBytes } = require('../utils/formatHelpers'); -const { Prisma } = require('@prisma/client'); +// const storage = multer.memoryStorage(); +// const upload = multer({ storage: storage }); const upload = multer({ dest: '/tmp/odin/' }); +const db = new Db(); + const createDirectory = async (req, res) => { const { parentId, 'directory-name': directoryName } = req.body; const referer = req.get('referer'); @@ -27,45 +28,35 @@ const fileUpload = async (req, res) => { const { folderId, folderName } = req.body; const referer = req.get('referer'); + let fullPath = await getProperPath(folderId); + fullPath = + fullPath === '/' ? `/${folderName}` : fullPath + `/${folderName}`; + + const path = `${req.user.username}/${fullPath}/${req.file.originalname}`; + const file = { + name: req.file.originalname, + path: path, + folderId: folderId, + mimetype: req.file.mimetype, + size: req.file.size, + }; + const data = { + name: req.file.originalname, + path: path, + data: req.file.filename, + }; + try { - const path = await getFullUploadPath( - folderId, - folderName, - req.user.username, - req.file.originalname, - ); - - const fileMetaData = { - name: req.file.originalname, - path: path, - folderId: folderId, - mimetype: req.file.mimetype, - size: req.file.size, - }; - const data = { - name: req.file.originalname, - path: path, - data: req.file.filename, - }; - - const supabaseResult = await uploadToStorage(data); - if (!supabaseResult.error) { - // make sure the uploaded file and the db have the same ID - fileMetaData.id = supabaseResult.data.id; - const result = await createFileRecord(req.user.id, fileMetaData); - if (result instanceof Prisma.PrismaClientKnownRequestError) { - // if user uploads the samefile name, just overwrite it - await editFile(fileMetaData); - } - res.redirect(referer); - } else { - console.error(supabaseResult.error); - res.status(500).redirect(referer); + const supabaseResult = await uploadFile(data); + if (supabaseResult.error === null) { + const result = await db.file.createFile(req.user.id, file); + console.log(result); } } catch (e) { console.error(e); - res.status(500).redirect(referer); } + + res.redirect(referer); }; const directoryContents = async (req, res) => { @@ -83,31 +74,6 @@ const directoryContents = async (req, res) => { } }; -const getFileData = async (req, res) => { - const { fileId } = req.query; +const getFiles = (req, res) => {}; - try { - const file = await getFileMetaData(fileId); - file.size = formatBytes(file.size); - - res.render('partials/fileInfo', { - file: file, - pageTitle: 'FileUpload - File Details', - }); - } catch (e) { - console.error(e); - res.redirect('/'); - } -}; - -const editFilePost = async (req, res) => { - const { id, name, url, modifiedAt, mimetype } = req.body; -}; - -module.exports = { - createDirectory, - upload, - fileUpload, - directoryContents, - getFileData, -}; +module.exports = { createDirectory, upload, fileUpload, directoryContents }; diff --git a/file-uploader/src/controllers/indexController.js b/file-uploader/src/controllers/indexController.js index ddb1e60..4da1d99 100644 --- a/file-uploader/src/controllers/indexController.js +++ b/file-uploader/src/controllers/indexController.js @@ -2,10 +2,9 @@ const { getDirectoryContents, getParentDirectories, } = require('../services/fileService'); -const { formatBytes } = require('../utils/formatHelpers'); const indexGet = async (req, res) => { - if (req.isAuthenticated()) { + if (req.user) { res.redirect(`/fs/${req.user.username}/${req.user.rootDirectoryId}`); // if unauthenticated redirect } else { @@ -28,7 +27,6 @@ const userDirectoryNavigation = async (req, res) => { folder: { id: directoryId, name: dirContents.name }, directoryListing: dirContents, parentDirectories: parentDirectories, - formatBytes: formatBytes, }); }; diff --git a/file-uploader/src/middlewares/auth.js b/file-uploader/src/middlewares/auth.js index a56c6fe..21a4cf4 100644 --- a/file-uploader/src/middlewares/auth.js +++ b/file-uploader/src/middlewares/auth.js @@ -51,7 +51,7 @@ passport.deserializeUser(async (id, done) => { }); const loggedIn = function (req, res, next) { - if (!req.isAuthenticated()) res.redirect('/'); + if (!req.user) res.redirect('/'); next(); }; diff --git a/file-uploader/src/models/file.js b/file-uploader/src/models/file.js index 2b62aac..574a538 100644 --- a/file-uploader/src/models/file.js +++ b/file-uploader/src/models/file.js @@ -1,4 +1,4 @@ -const { Prisma, PrismaClient } = require('@prisma/client'); +const { PrismaClient } = require('@prisma/client'); class File { constructor() { @@ -87,6 +87,8 @@ class File { } } + async getDirectoriesByUser() {} + async createFile(userId, file) { try { const result = await this.prisma.file.create({ @@ -97,48 +99,6 @@ class File { url: file.path, folderId: file.folderId, ownerId: userId, - id: file.id, - }, - }); - return result; - } catch (e) { - return e; - } - } - - async editFile(file) { - const data = await this.prisma.file.update({ - where: { id: file.id }, - data: { - name: file.name, - size: file.size, - mimetype: file.mimetype, - url: file.path, - modifiedAt: new Date(), - }, - }); - return data; - } - - async deleteFile(userId, fileId) { - try { - const result = await this.prisma.file.delete({ - data: { - id: fileId, - ownerId: userId, - }, - }); - return result; - } catch (e) { - console.error(e); - return e; - } - } - async getFileMetaData(fileId) { - try { - const result = await this.prisma.file.findUnique({ - where: { - id: fileId, }, }); return result; diff --git a/file-uploader/src/routes/fileRouter.js b/file-uploader/src/routes/fileRouter.js index 8382642..f095dcf 100644 --- a/file-uploader/src/routes/fileRouter.js +++ b/file-uploader/src/routes/fileRouter.js @@ -11,6 +11,5 @@ fileRouter.post( ); fileRouter.post('/directory', loggedIn, fileController.createDirectory); fileRouter.get('/directory', loggedIn, fileController.directoryContents); -fileRouter.get('/file', loggedIn, fileController.getFileData); module.exports = fileRouter; diff --git a/file-uploader/src/services/fileService.js b/file-uploader/src/services/fileService.js index 73ce4aa..2d74ba2 100644 --- a/file-uploader/src/services/fileService.js +++ b/file-uploader/src/services/fileService.js @@ -8,14 +8,6 @@ const supabase = createClient(supabaseUrl, supabaseKey); const db = new Db(); -async function createFileRecord(userId, fileData) { - return await db.file.createFile(userId, fileData); -} - -async function editFile(file) { - return await db.file.editFile(file); -} - async function getDirectoryContents(directoryId, userId) { return await db.file.getDirectoryContents(directoryId, userId); } @@ -24,10 +16,10 @@ async function getParentDirectories(directoryId) { return await db.file.getParentFolders(directoryId); } -async function uploadToStorage(file) { +async function uploadFile(file) { const { data, error } = await supabase.storage .from('odin') - .upload(file.path, file.data, { upsert: true }); + .upload(file.path, file.data); return { data: data, error: error }; } @@ -60,18 +52,11 @@ async function getProperPath(directoryId) { return directories.join('/'); } -async function getFileMetaData(fileId) { - return await db.file.getFileMetaData(fileId); -} - module.exports = { - createFileRecord, - editFile, - uploadToStorage, + uploadFile, mkDirectory, getParentDirectories, getDirectoryContents, getProperPath, rmDirectory, - getFileMetaData, }; diff --git a/file-uploader/src/utils/formatHelpers.js b/file-uploader/src/utils/formatHelpers.js deleted file mode 100644 index 5dc87dd..0000000 --- a/file-uploader/src/utils/formatHelpers.js +++ /dev/null @@ -1,32 +0,0 @@ -const { getProperPath } = require('../services/fileService'); - -const getFullUploadPath = async (folderId, folderName, username, filename) => { - let fullPath = await getProperPath(folderId); - fullPath = fullPath === '/' ? `${folderName}` : fullPath + `/${folderName}`; - - return `${username}/${fullPath}/${filename}`; -}; - -const formatBytes = (bytes, decimals = 2) => { - if (!+bytes) return '-'; - - const k = 1024; - const dm = decimals < 0 ? 0 : decimals; - const sizes = [ - 'Bytes', - 'KiB', - 'MiB', - 'GiB', - 'TiB', - 'PiB', - 'EiB', - 'ZiB', - 'YiB', - ]; - - const i = Math.floor(Math.log(bytes) / Math.log(k)); - - return `${parseFloat((bytes / Math.pow(k, i)).toFixed(dm))} ${sizes[i]}`; -}; - -module.exports = { formatBytes, getFullUploadPath }; diff --git a/file-uploader/src/views/main.ejs b/file-uploader/src/views/main.ejs index 40592db..f068957 100644 --- a/file-uploader/src/views/main.ejs +++ b/file-uploader/src/views/main.ejs @@ -1,33 +1,20 @@ <%- include('partials/header') %>
<% if(currentUser) { %> -Hello <%= currentUser.username %>
+ sign out + <%- include('partials/fileUpload') %> + <%- include('partials/parentDirectories') %> + <%- include('partials/directoryListing') %> <% } else { %> -Name
-Size
-Created
-<%= formatBytes(item?.size) %>
-<%= item?.createdAt %>
-<%= f.name %> <%= f.id %>
+ <% }); %> ++
<% parentDirectories.forEach(d => { %> <%= d.name %> / + <% }); %> - <%= directoryListing.name %> + <%= directoryListing.name %>