From b0a268e02b496e918c7d897ae88b821956846326 Mon Sep 17 00:00:00 2001 From: subnub Date: Wed, 4 Mar 2020 17:10:56 -0500 Subject: [PATCH] init commit --- .DS_Store | Bin 0 -> 6148 bytes .babelrc | 4 + .gitignore | 14 + jest.config.json | 9 + key/getKey.js | 25 + key/getNewKey.js | 22 + package.json | 108 ++ public/.DS_Store | Bin 0 -> 8196 bytes public/images/.DS_Store | Bin 0 -> 6148 bytes public/images/add-blue.png | Bin 0 -> 20509 bytes public/images/back.svg | 1 + public/images/bg.jpg | Bin 0 -> 162882 bytes public/images/check-green.png | Bin 0 -> 14262 bytes public/images/close-circle-outline.svg | 1 + public/images/close-white-png.png | Bin 0 -> 5027 bytes public/images/close_icon.png | Bin 0 -> 309 bytes public/images/cloud-svg.svg | 1 + public/images/copy.svg | 1 + public/images/down-arrow-grey-small.png | Bin 0 -> 1259 bytes public/images/down-arrow-white-1.svg | 3 + public/images/down-arrow-white-svg.svg | 11 + public/images/down-arrow-white.png | Bin 0 -> 4298 bytes public/images/download.svg | 1 + public/images/edit.svg | 1 + public/images/error-red.png | Bin 0 -> 10892 bytes public/images/favicon.png | Bin 0 -> 1683 bytes public/images/file-svg.svg | 1 + public/images/folder-svg.svg | 1 + public/images/folder-upload-grey.png | Bin 0 -> 2481 bytes public/images/gear_icon.png | Bin 0 -> 4034 bytes public/images/grey-add-folder.png | Bin 0 -> 2134 bytes public/images/grey-folder.png | Bin 0 -> 1257 bytes public/images/grey_file.png | Bin 0 -> 1304 bytes public/images/grid-icon-svg.svg | 1 + public/images/home.svg | 1 + public/images/info-icon-grey.png | Bin 0 -> 3336 bytes public/images/info.svg | 1 + public/images/list-icon-svg.svg | 1 + public/images/loader.gif | Bin 0 -> 52250 bytes public/images/move.svg | 1 + public/images/my-drive-dropdown.png | Bin 0 -> 11567 bytes public/images/my-drive-icon.png | Bin 0 -> 13327 bytes public/images/my-drive-icon2.png | Bin 0 -> 13531 bytes public/images/plus-grey.png | Bin 0 -> 3101 bytes public/images/rename.svg | 1 + public/images/right-arrow-svg.svg | 1 + public/images/share.svg | 1 + public/images/trash.svg | 1 + public/images/up-arrow-grey-small.png | Bin 0 -> 3131 bytes public/images/up-arrow-white.png | Bin 0 -> 5598 bytes public/images/upload-file-grey.png | Bin 0 -> 2465 bytes public/index.html | 21 + readme.md | 7 + rootpath.js | 1 + server/server.js | 75 ++ server/serverStart.js | 33 + serverUtils/backupDatabase.js | 56 + serverUtils/changeEncryptionPassword.js | 295 +++++ serverUtils/cleanDatabase.js | 118 ++ serverUtils/createIndexes.js | 50 + serverUtils/createTempDirectory.js | 103 ++ serverUtils/createThumbnailBuffer.js | 82 ++ serverUtils/deleteDatabase.js | 81 ++ serverUtils/deleteTempDatabase.js | 79 ++ serverUtils/restoreDatabase.js | 55 + serverUtils/restoreFromTempDirectory.js | 105 ++ src/actions/addOptions.js | 9 + src/actions/auth.js | 163 +++ src/actions/files.js | 216 ++++ src/actions/filter.js | 29 + src/actions/folders.js | 115 ++ src/actions/main.js | 38 + src/actions/mover.js | 10 + src/actions/parent.js | 83 ++ src/actions/photoViewer.js | 8 + src/actions/popupFile.js | 8 + src/actions/quickFiles.js | 32 + src/actions/routes.js | 8 + src/actions/selectedItem.js | 92 ++ src/actions/settings.js | 7 + src/actions/storage.js | 29 + src/actions/uploads.js | 40 + src/app.js | 26 + src/components/ContextItem/ContextItem.js | 11 + src/components/ContextItem/index.js | 83 ++ .../ContextItemFolder/ContextItemFolder.js | 11 + src/components/ContextItemFolder/index.js | 83 ++ src/components/ContextMenu/ContextMenu.js | 20 + src/components/ContextMenu/index.js | 37 + .../ContextMenuFolder/ContextMenuFolder.js | 14 + src/components/ContextMenuFolder/index.js | 37 + src/components/Dataform/DataForm.js | 52 + src/components/Dataform/index.js | 26 + src/components/DownloadPage/DownloadPage.js | 35 + src/components/DownloadPage/index.js | 89 ++ src/components/FileItem/FileItem.js | 64 + src/components/FileItem/index.js | 182 +++ src/components/Filter/Filter.js | 48 + src/components/Filter/index.js | 115 ++ src/components/FolderItem/FolderItem.js | 55 + src/components/FolderItem/index.js | 112 ++ src/components/Header/Header.js | 39 + src/components/Header/index.js | 156 +++ src/components/Homepage/HomePage.js | 28 + src/components/Homepage/index.js | 232 ++++ src/components/LeftSection/LeftSection.js | 56 + src/components/LeftSection/index.js | 95 ++ src/components/LoginPage/LoginPage.js | 69 + src/components/LoginPage/index.js | 115 ++ src/components/MainSection/MainSection.js | 76 ++ src/components/MainSection/index.js | 133 ++ src/components/MoverMenu/MoverMenu.js | 53 + src/components/MoverMenu/index.js | 310 +++++ src/components/PhotoViewer/PhotoViewer.js | 21 + src/components/PhotoViewer/index.js | 56 + src/components/PopupWindow/PopupWindow.js | 53 + src/components/PopupWindow/index.js | 160 +++ src/components/QuickAccess/QuickAccess.js | 18 + src/components/QuickAccess/index.js | 21 + .../QuickAccessItem/QuickAccessItem.js | 33 + src/components/QuickAccessItem/index.js | 121 ++ src/components/RightSection/RightSection.js | 57 + src/components/RightSection/index.js | 189 +++ src/components/RightSectionDetail/index.js | 10 + src/components/SettingsMenu/SettingsMenu.js | 175 +++ src/components/SettingsMenu/index.js | 295 +++++ src/components/ShareMenu/ShareMenu.js | 49 + src/components/ShareMenu/index.js | 204 +++ src/components/Spacer/index.js | 7 + src/components/Spinner/index.js | 7 + src/components/SpinnerLogin/index.js | 7 + src/components/StorageWidget/StorageWidget.js | 24 + src/components/StorageWidget/index.js | 35 + src/components/Subbar/Subbar.js | 85 ++ src/components/Subbar/index.js | 158 +++ src/components/SuggestedItem/index.js | 23 + src/components/UploadItem/UploadItem.js | 40 + src/components/UploadItem/index.js | 90 ++ src/components/Uploader/Uploader.js | 24 + src/components/Uploader/index.js | 61 + src/controllers/file.js | 575 +++++++++ src/controllers/folder.js | 211 ++++ src/controllers/storage.js | 31 + src/controllers/user.js | 148 +++ src/db/mongoose.js | 10 + src/db/mongooseServerUtils.js | 12 + src/db/utils/fileUtils/index.js | 166 +++ src/db/utils/folderUtils/index.js | 61 + src/enviroment/env.js | 9 + src/enviroment/envFrontEnd.js | 6 + src/express-routers/file.js | 56 + src/express-routers/folder.js | 23 + src/express-routers/storage.js | 9 + src/express-routers/user.js | 19 + src/middleware/auth.js | 49 + src/middleware/tempAuth.js | 57 + src/middleware/tempAuthVideo.js | 56 + src/models/folder.js | 32 + src/models/thumbnail.js | 25 + src/models/user.js | 275 ++++ src/reducers/addOptions.js | 26 + src/reducers/auth.js | 13 + src/reducers/files.js | 60 + src/reducers/filter.js | 81 ++ src/reducers/folders.js | 39 + src/reducers/main.js | 85 ++ src/reducers/mover.js | 33 + src/reducers/parent.js | 69 + src/reducers/photoViewer.js | 26 + src/reducers/popupFile.js | 31 + src/reducers/quickFiles.js | 40 + src/reducers/routes.js | 26 + src/reducers/selectedItem.js | 83 ++ src/reducers/settings.js | 32 + src/reducers/storage.js | 25 + src/reducers/uploads.js | 49 + src/routers/AppRouter.js | 29 + src/routers/PrivateRoute.js | 18 + src/routers/PublicRoute.js | 15 + src/services/FileService/index.js | 896 +++++++++++++ .../FileService/utils/createThumbnail.js | 84 ++ .../FileService/utils/removeChunks.js | 26 + src/services/FolderService/index.js | 287 +++++ src/services/UserService/index.js | 79 ++ src/store/configureStore.js | 49 + src/styles/base/_base.scss | 23 + src/styles/base/_settings.scss | 17 + src/styles/components/_ContentMenu.scss | 70 + src/styles/components/_Dataform.scss | 16 + src/styles/components/_DownloadPage.scss | 49 + src/styles/components/_File.scss | 234 ++++ src/styles/components/_Filter.scss | 55 + src/styles/components/_Folder.scss | 91 ++ src/styles/components/_Header.scss | 206 +++ src/styles/components/_HomePage.scss | 47 + src/styles/components/_LeftSection.scss | 203 +++ src/styles/components/_LoginPage.scss | 8 + src/styles/components/_MoverMenu.scss | 158 +++ src/styles/components/_Photoviewer.scss | 41 + src/styles/components/_Popup-window.scss | 127 ++ src/styles/components/_QuickAccess.scss | 96 ++ src/styles/components/_RightSection.scss | 141 +++ src/styles/components/_SettingsMenu.scss | 255 ++++ src/styles/components/_Sharemenu.scss | 134 ++ src/styles/components/_Spacer.scss | 12 + src/styles/components/_Spinner.scss | 21 + src/styles/components/_Subbar.scss | 98 ++ src/styles/components/_Swal.scss | 10 + src/styles/components/_Uploader.scss | 145 +++ src/styles/components/_box-layout.scss | 87 ++ src/styles/components/_button.scss | 50 + src/styles/components/_content-container.scss | 6 + src/styles/components/_loader.scss | 3 + src/styles/styles.scss | 28 + src/utils/InternalServerError.js | 10 + src/utils/NotAuthorizedError.js | 10 + src/utils/NotFoundError.js | 10 + src/utils/capitalize.js | 12 + src/utils/createError.js | 12 + src/utils/createQuery.js | 41 + src/utils/imageChecker.js | 31 + src/utils/mobileCheck.js | 6 + src/utils/sortBySwitch.js | 15 + src/utils/sortBySwitchFolder.js | 15 + src/utils/videoChecker.js | 57 + tests/.DS_Store | Bin 0 -> 6148 bytes tests/db/utils/fileUtils/index.test.js | 1125 +++++++++++++++++ tests/db/utils/folderUtils/index.test.js | 421 ++++++ tests/express-routers/file.test.js | 569 +++++++++ tests/express-routers/folder.test.js | 317 +++++ tests/express-routers/user.test.js | 222 ++++ tests/fixtures/createFile.js | 32 + tests/fixtures/createUser.js | 31 + tests/fixtures/createUser2.js | 31 + tests/fixtures/media/big_buck_bunny.mp4 | Bin 0 -> 5510872 bytes tests/fixtures/media/check.svg | 23 + tests/fixtures/media/error.png | Bin 0 -> 13059 bytes tests/fixtures/media/folder.png | Bin 0 -> 2481 bytes tests/services/FileService/index.test.js | 376 ++++++ tests/services/FolderService/index.test.js | 310 +++++ tests/services/UserService/index.test.js | 137 ++ tests/setupTests.js | 10 + webpack.config.js | 81 ++ 243 files changed, 17112 insertions(+) create mode 100644 .DS_Store create mode 100755 .babelrc create mode 100755 .gitignore create mode 100755 jest.config.json create mode 100644 key/getKey.js create mode 100644 key/getNewKey.js create mode 100755 package.json create mode 100755 public/.DS_Store create mode 100755 public/images/.DS_Store create mode 100644 public/images/add-blue.png create mode 100644 public/images/back.svg create mode 100755 public/images/bg.jpg create mode 100644 public/images/check-green.png create mode 100644 public/images/close-circle-outline.svg create mode 100644 public/images/close-white-png.png create mode 100644 public/images/close_icon.png create mode 100644 public/images/cloud-svg.svg create mode 100644 public/images/copy.svg create mode 100644 public/images/down-arrow-grey-small.png create mode 100644 public/images/down-arrow-white-1.svg create mode 100644 public/images/down-arrow-white-svg.svg create mode 100644 public/images/down-arrow-white.png create mode 100644 public/images/download.svg create mode 100644 public/images/edit.svg create mode 100644 public/images/error-red.png create mode 100755 public/images/favicon.png create mode 100644 public/images/file-svg.svg create mode 100644 public/images/folder-svg.svg create mode 100644 public/images/folder-upload-grey.png create mode 100644 public/images/gear_icon.png create mode 100644 public/images/grey-add-folder.png create mode 100644 public/images/grey-folder.png create mode 100644 public/images/grey_file.png create mode 100644 public/images/grid-icon-svg.svg create mode 100644 public/images/home.svg create mode 100644 public/images/info-icon-grey.png create mode 100644 public/images/info.svg create mode 100644 public/images/list-icon-svg.svg create mode 100755 public/images/loader.gif create mode 100644 public/images/move.svg create mode 100644 public/images/my-drive-dropdown.png create mode 100644 public/images/my-drive-icon.png create mode 100644 public/images/my-drive-icon2.png create mode 100644 public/images/plus-grey.png create mode 100644 public/images/rename.svg create mode 100644 public/images/right-arrow-svg.svg create mode 100644 public/images/share.svg create mode 100644 public/images/trash.svg create mode 100644 public/images/up-arrow-grey-small.png create mode 100644 public/images/up-arrow-white.png create mode 100644 public/images/upload-file-grey.png create mode 100755 public/index.html create mode 100755 readme.md create mode 100644 rootpath.js create mode 100755 server/server.js create mode 100644 server/serverStart.js create mode 100644 serverUtils/backupDatabase.js create mode 100644 serverUtils/changeEncryptionPassword.js create mode 100644 serverUtils/cleanDatabase.js create mode 100644 serverUtils/createIndexes.js create mode 100644 serverUtils/createTempDirectory.js create mode 100644 serverUtils/createThumbnailBuffer.js create mode 100644 serverUtils/deleteDatabase.js create mode 100644 serverUtils/deleteTempDatabase.js create mode 100644 serverUtils/restoreDatabase.js create mode 100644 serverUtils/restoreFromTempDirectory.js create mode 100644 src/actions/addOptions.js create mode 100755 src/actions/auth.js create mode 100644 src/actions/files.js create mode 100644 src/actions/filter.js create mode 100644 src/actions/folders.js create mode 100644 src/actions/main.js create mode 100644 src/actions/mover.js create mode 100644 src/actions/parent.js create mode 100644 src/actions/photoViewer.js create mode 100644 src/actions/popupFile.js create mode 100644 src/actions/quickFiles.js create mode 100644 src/actions/routes.js create mode 100644 src/actions/selectedItem.js create mode 100644 src/actions/settings.js create mode 100644 src/actions/storage.js create mode 100644 src/actions/uploads.js create mode 100755 src/app.js create mode 100644 src/components/ContextItem/ContextItem.js create mode 100644 src/components/ContextItem/index.js create mode 100644 src/components/ContextItemFolder/ContextItemFolder.js create mode 100644 src/components/ContextItemFolder/index.js create mode 100644 src/components/ContextMenu/ContextMenu.js create mode 100644 src/components/ContextMenu/index.js create mode 100644 src/components/ContextMenuFolder/ContextMenuFolder.js create mode 100644 src/components/ContextMenuFolder/index.js create mode 100644 src/components/Dataform/DataForm.js create mode 100644 src/components/Dataform/index.js create mode 100644 src/components/DownloadPage/DownloadPage.js create mode 100644 src/components/DownloadPage/index.js create mode 100644 src/components/FileItem/FileItem.js create mode 100644 src/components/FileItem/index.js create mode 100644 src/components/Filter/Filter.js create mode 100644 src/components/Filter/index.js create mode 100644 src/components/FolderItem/FolderItem.js create mode 100644 src/components/FolderItem/index.js create mode 100644 src/components/Header/Header.js create mode 100644 src/components/Header/index.js create mode 100644 src/components/Homepage/HomePage.js create mode 100644 src/components/Homepage/index.js create mode 100644 src/components/LeftSection/LeftSection.js create mode 100644 src/components/LeftSection/index.js create mode 100755 src/components/LoginPage/LoginPage.js create mode 100644 src/components/LoginPage/index.js create mode 100644 src/components/MainSection/MainSection.js create mode 100644 src/components/MainSection/index.js create mode 100644 src/components/MoverMenu/MoverMenu.js create mode 100644 src/components/MoverMenu/index.js create mode 100644 src/components/PhotoViewer/PhotoViewer.js create mode 100644 src/components/PhotoViewer/index.js create mode 100644 src/components/PopupWindow/PopupWindow.js create mode 100644 src/components/PopupWindow/index.js create mode 100644 src/components/QuickAccess/QuickAccess.js create mode 100644 src/components/QuickAccess/index.js create mode 100644 src/components/QuickAccessItem/QuickAccessItem.js create mode 100644 src/components/QuickAccessItem/index.js create mode 100644 src/components/RightSection/RightSection.js create mode 100644 src/components/RightSection/index.js create mode 100644 src/components/RightSectionDetail/index.js create mode 100644 src/components/SettingsMenu/SettingsMenu.js create mode 100644 src/components/SettingsMenu/index.js create mode 100644 src/components/ShareMenu/ShareMenu.js create mode 100644 src/components/ShareMenu/index.js create mode 100644 src/components/Spacer/index.js create mode 100644 src/components/Spinner/index.js create mode 100644 src/components/SpinnerLogin/index.js create mode 100644 src/components/StorageWidget/StorageWidget.js create mode 100644 src/components/StorageWidget/index.js create mode 100644 src/components/Subbar/Subbar.js create mode 100644 src/components/Subbar/index.js create mode 100644 src/components/SuggestedItem/index.js create mode 100644 src/components/UploadItem/UploadItem.js create mode 100644 src/components/UploadItem/index.js create mode 100644 src/components/Uploader/Uploader.js create mode 100644 src/components/Uploader/index.js create mode 100644 src/controllers/file.js create mode 100644 src/controllers/folder.js create mode 100644 src/controllers/storage.js create mode 100644 src/controllers/user.js create mode 100644 src/db/mongoose.js create mode 100644 src/db/mongooseServerUtils.js create mode 100644 src/db/utils/fileUtils/index.js create mode 100644 src/db/utils/folderUtils/index.js create mode 100644 src/enviroment/env.js create mode 100644 src/enviroment/envFrontEnd.js create mode 100644 src/express-routers/file.js create mode 100644 src/express-routers/folder.js create mode 100644 src/express-routers/storage.js create mode 100644 src/express-routers/user.js create mode 100644 src/middleware/auth.js create mode 100644 src/middleware/tempAuth.js create mode 100644 src/middleware/tempAuthVideo.js create mode 100644 src/models/folder.js create mode 100644 src/models/thumbnail.js create mode 100644 src/models/user.js create mode 100644 src/reducers/addOptions.js create mode 100755 src/reducers/auth.js create mode 100644 src/reducers/files.js create mode 100644 src/reducers/filter.js create mode 100644 src/reducers/folders.js create mode 100644 src/reducers/main.js create mode 100644 src/reducers/mover.js create mode 100644 src/reducers/parent.js create mode 100644 src/reducers/photoViewer.js create mode 100644 src/reducers/popupFile.js create mode 100644 src/reducers/quickFiles.js create mode 100644 src/reducers/routes.js create mode 100644 src/reducers/selectedItem.js create mode 100644 src/reducers/settings.js create mode 100644 src/reducers/storage.js create mode 100644 src/reducers/uploads.js create mode 100755 src/routers/AppRouter.js create mode 100644 src/routers/PrivateRoute.js create mode 100644 src/routers/PublicRoute.js create mode 100644 src/services/FileService/index.js create mode 100644 src/services/FileService/utils/createThumbnail.js create mode 100644 src/services/FileService/utils/removeChunks.js create mode 100644 src/services/FolderService/index.js create mode 100644 src/services/UserService/index.js create mode 100755 src/store/configureStore.js create mode 100644 src/styles/base/_base.scss create mode 100644 src/styles/base/_settings.scss create mode 100644 src/styles/components/_ContentMenu.scss create mode 100644 src/styles/components/_Dataform.scss create mode 100644 src/styles/components/_DownloadPage.scss create mode 100644 src/styles/components/_File.scss create mode 100644 src/styles/components/_Filter.scss create mode 100644 src/styles/components/_Folder.scss create mode 100644 src/styles/components/_Header.scss create mode 100644 src/styles/components/_HomePage.scss create mode 100644 src/styles/components/_LeftSection.scss create mode 100644 src/styles/components/_LoginPage.scss create mode 100644 src/styles/components/_MoverMenu.scss create mode 100644 src/styles/components/_Photoviewer.scss create mode 100644 src/styles/components/_Popup-window.scss create mode 100644 src/styles/components/_QuickAccess.scss create mode 100644 src/styles/components/_RightSection.scss create mode 100644 src/styles/components/_SettingsMenu.scss create mode 100644 src/styles/components/_Sharemenu.scss create mode 100644 src/styles/components/_Spacer.scss create mode 100644 src/styles/components/_Spinner.scss create mode 100644 src/styles/components/_Subbar.scss create mode 100644 src/styles/components/_Swal.scss create mode 100644 src/styles/components/_Uploader.scss create mode 100644 src/styles/components/_box-layout.scss create mode 100644 src/styles/components/_button.scss create mode 100644 src/styles/components/_content-container.scss create mode 100644 src/styles/components/_loader.scss create mode 100644 src/styles/styles.scss create mode 100644 src/utils/InternalServerError.js create mode 100644 src/utils/NotAuthorizedError.js create mode 100644 src/utils/NotFoundError.js create mode 100644 src/utils/capitalize.js create mode 100644 src/utils/createError.js create mode 100644 src/utils/createQuery.js create mode 100644 src/utils/imageChecker.js create mode 100644 src/utils/mobileCheck.js create mode 100644 src/utils/sortBySwitch.js create mode 100644 src/utils/sortBySwitchFolder.js create mode 100644 src/utils/videoChecker.js create mode 100644 tests/.DS_Store create mode 100644 tests/db/utils/fileUtils/index.test.js create mode 100644 tests/db/utils/folderUtils/index.test.js create mode 100644 tests/express-routers/file.test.js create mode 100644 tests/express-routers/folder.test.js create mode 100644 tests/express-routers/user.test.js create mode 100644 tests/fixtures/createFile.js create mode 100644 tests/fixtures/createUser.js create mode 100644 tests/fixtures/createUser2.js create mode 100644 tests/fixtures/media/big_buck_bunny.mp4 create mode 100644 tests/fixtures/media/check.svg create mode 100644 tests/fixtures/media/error.png create mode 100644 tests/fixtures/media/folder.png create mode 100644 tests/services/FileService/index.test.js create mode 100644 tests/services/FolderService/index.test.js create mode 100644 tests/services/UserService/index.test.js create mode 100644 tests/setupTests.js create mode 100755 webpack.config.js diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..104d174d6a9ca10d1dee17a78e5519b810feee6e GIT binary patch literal 6148 zcmeH~%}N6?5XUFB*0dt_Am}j{Z#}er^&~8{9=r)FdQj0_TXkXGl z4sc%N#e?!(nl3G@RK&t^eNYi;y zEO*!#TI9LgjY1inpr3LI(19NK5F&u1H?bVV&>iuPLjrA#BoMzk@a}&a*le2CkkMjo z`BPpu8q9~hi07*nz9FKMZT;s7nC-$R|NKhq0xSVb;HwGH`5>^6Iz}_C>gd2qJpoYj z=vIbpdP`7_FzOi1v|2&l9GtM!ZY1Qe#%;STZFEjH(Ve0ERzfi-0 zIa+OP30MNd1ai7tru%>WXnmcYLv!17JE*}x^4yLDu7bk_/tests/setupTests.js" + ], + "snapshotSerializers": [ + "enzyme-to-json/serializer" + ] +} \ No newline at end of file diff --git a/key/getKey.js b/key/getKey.js new file mode 100644 index 0000000..e9e3a38 --- /dev/null +++ b/key/getKey.js @@ -0,0 +1,25 @@ +const prompt = require('password-prompt') +const env = require("../src/enviroment/env") +const crypto = require("crypto"); + +const getKey = async() => { + + if (process.env.NODE_ENV) { + + let password = await prompt("Enter Server Encryption Password: ", {method: "hide"}); + + password = crypto.createHash("md5").update(password).digest("hex"); + + env.key = password; + + } else { + + let password = "1234"; + + password = crypto.createHash("md5").update(password).digest("hex"); + + env.key = password; + } +} + +module.exports = getKey; \ No newline at end of file diff --git a/key/getNewKey.js b/key/getNewKey.js new file mode 100644 index 0000000..39ccb75 --- /dev/null +++ b/key/getNewKey.js @@ -0,0 +1,22 @@ +const prompt = require('password-prompt') +const env = require("../src/enviroment/env") +const crypto = require("crypto"); + +const getKey = async() => { + + let password = await prompt("Enter New Server Encryption Password: ", {method: "hide"}); + + let confirmPassword = await prompt("Verify New Server Encryption Password: ", {method: "hide"}); + + if (password !== confirmPassword) { + console.log("New Passwords do not match, exiting..."); + process.exit(); + } + + password = crypto.createHash("md5").update(password).digest("hex"); + + env.newKey = password; + +} + +module.exports = getKey; \ No newline at end of file diff --git a/package.json b/package.json new file mode 100755 index 0000000..287e34a --- /dev/null +++ b/package.json @@ -0,0 +1,108 @@ +{ + "name": "my-drive", + "version": "1.0.0", + "main": "index.js", + "license": "", + "scripts": { + "server": "live-server public/", + "build:dev": "webpack", + "build:prod": "cross-env NODE_ENV=production webpack -p --env production", + "dev-server": "webpack-dev-server", + "test": "cross-env NODE_ENV=test env-cmd -f ./config/test.env jest --config=jest.config.json --watchAll --runInBand", + "start:dev": "env-cmd -f ./config/dev.env node server/serverStart.js", + "start": "env-cmd -f ./config/prod.env node server/serverStart.js", + "clean-database": "env-cmd -f ./config/prod.env node serverUtils/cleanDatabase.js", + "clean-database:dev": "env-cmd -f ./config/dev.env node serverUtils/cleanDatabase.js", + "backup-database": "env-cmd -f ./config/prod.env node serverUtils/backupDatabase.js", + "backup-database:dev": "env-cmd -f ./config/dev.env node serverUtils/backupDatabase.js", + "restore-database": "env-cmd -f ./config/prod.env node serverUtils/restoreDatabase.js", + "restore-database:dev": "env-cmd -f ./config/dev.env node serverUtils/restoreDatabase.js", + "delete-temp-database": "env-cmd -f ./config/prod.env node serverUtils/deleteTempDatabase.js", + "delete-temp-database:dev": "env-cmd -f ./config/dev.env node serverUtils/deleteTempDatabase.js", + "delete-database": "env-cmd -f ./config/prod.env node serverUtils/deleteDatabase.js", + "delete-database:dev": "env-cmd -f ./config/dev.env node serverUtils/deleteDatabase.js", + "change-password-database": "env-cmd -f ./config/prod.env node serverUtils/changeEncryptionPassword.js", + "change-password-database:dev": "env-cmd -f ./config/dev.env node serverUtils/changeEncryptionPassword.js", + "create-indexes-database": "env-cmd -f ./config/prod.env node serverUtils/createIndexes.js", + "create-indexes-database:dev": "env-cmd -f ./config/dev.env node serverUtils/createIndexes.js", + "heroku-postbuild": "yarn run build:prod" + }, + "dependencies": { + "@babel/core": "^7.8.4", + "@babel/plugin-proposal-class-properties": "^7.8.3", + "@babel/plugin-proposal-object-rest-spread": "^7.8.3", + "@babel/preset-env": "^7.8.4", + "@babel/preset-react": "^7.8.3", + "axios": "^0.19.2", + "babel-polyfill": "^6.26.0", + "bcrypt": "^3.0.8", + "body-parser": "^1.19.0", + "bytes": "^3.1.0", + "cli-progress": "^3.6.0", + "compression": "^1.7.4", + "concat-stream": "^2.0.0", + "connect-busboy": "0.0.2", + "copy-text-to-clipboard": "^2.1.1", + "core-js": "^3.6.4", + "crypto": "^1.0.1", + "diskusage": "^1.1.3", + "express": "^4.17.1", + "fluent-ffmpeg": "^2.1.2", + "helmet": "^3.21.2", + "history": "^4.10.1", + "jsonwebtoken": "^8.5.1", + "mini-css-extract-plugin": "^0.8.2", + "moment": "^2.24.0", + "mongodb": "^3.5.3", + "mongoose": "^5.9.1", + "normalize.css": "^8.0.1", + "password-prompt": "^1.1.2", + "progress-stream": "^2.0.0", + "prompts": "^2.3.1", + "raf": "^3.4.1", + "react": "^16.12.0", + "react-circular-progressbar": "^2.0.3", + "react-contextmenu": "^2.13.0", + "react-dom": "^16.12.0", + "react-infinite-scroller": "^1.2.4", + "react-redux": "^7.2.0", + "react-router-dom": "^5.1.1", + "redux": "^4.0.5", + "redux-thunk": "^2.3.0", + "regenerator-runtime": "^0.13.3", + "sharp": "^0.23.4", + "sweetalert2": "^9.7.2", + "temp": "^0.9.1", + "uuid": "^3.4.0", + "validator": "^12.2.0", + "webpack": "^4.41.6" + }, + "devDependencies": { + "@typescript-eslint/eslint-plugin": "^2.20.0", + "@typescript-eslint/parser": "^2.20.0", + "babel-loader": "^8.0.6", + "compression-webpack-plugin": "^3.1.0", + "cross-env": "^6.0.3", + "css-loader": "^3.4.2", + "dart-sass": "^1.25.0", + "dotenv": "^8.2.0", + "env-cmd": "^10.1.0", + "enzyme": "^3.11.0", + "enzyme-adapter-react-16": "^1.15.2", + "enzyme-to-json": "^3.4.4", + "eslint": "^6.8.0", + "eslint-plugin-import": "^2.20.1", + "eslint-plugin-react": "^7.18.3", + "jest": "^24.9.0", + "json-loader": "^0.5.7", + "live-server": "^1.2.1", + "react-test-renderer": "^16.12.0", + "sass-loader": "^8.0.2", + "style-loader": "^1.1.3", + "superagent-binary-parser": "^1.0.1", + "supertest": "^4.0.2", + "webpack-bundle-analyzer": "^3.6.0", + "webpack-cli": "^3.3.11", + "webpack-dev-server": "^3.10.3" + } +} diff --git a/public/.DS_Store b/public/.DS_Store new file mode 100755 index 0000000000000000000000000000000000000000..53ec8a215d5607752d7b192df266cbcad9c9f4a9 GIT binary patch literal 8196 zcmeHMU2GLa6rS%=V7DxE3PtLAfh(2&0=N7WM3GBdkOEB`TWAYt*?V`PE8E?AckeAw zYKrma#Tb8xiTZ%?Cu&S28hnIk)I?1*F%p$xeBwbL^g$yp#-B4gdx^bJACZKeWagWl zbI#11bHCZi*~=J1Q^9Ottd=pRP!-6hQFDzV9N?rYcIMQaQcy{?2}H zs53Bvg5PB1_lc(tBk0dY{VvaQuJn!U9@`q~<2B8m8yL205~oW}j+LBLE2nAG_3f?OcWAqM?40Lz+Q+OuUgeXY zt@PNDw~FLbcg}MP1Fql4t8<2vD>z1AZE+l-Ok-7kF7G)`hv(aY?YX@@fpsJ(O*Br_ zv)A|XL321+ALj+%y3eAy?4s2|GtyKu#cJ(?Vj6#smG=qjGHL0e`u2=D$=eq$TebGi zdz#Nz@#>kgYBX&xMbQoHgSM65J!G3ff3M-^EZ4N%L)}H&x3iAbO|*HYn9StwD^h>KJYC->B+Yq?S~D_Ov{=`=dhMi^S*yrqP_5-`beqoo{AM8)|7yBCusxb>Sn2mW@julvmRoH+QY{fRT zqYHb`jUE^{h<@035I&A#7{@V!$MF=N#xr;pFX1)3fj99M-ouCZ2p{7Ue2MRH0b{s` zOZXYT;y1a^M2X66B^M;(cfxV!m8cwjZ%drKHkFehm6zV|RK74n@^|(vb5aYJtz5HV zQ_~d!l>Ox6Sov=vhU}B{3TaoORrtG~Cz{`uoU6?*9fI=1v73l$9Z>|^_*ALAAbE#E z1mjBhs4Y$|Rp}IPNa^C_3Ps@wDN83;t3-T0Ny^q~>lLCnpDd*twYyb11iV5@H)~rI z;yRxqr7hYvl};mP6LR)H8T%C*V?VLWNMI_aV5%`yxuh(|sb>axb5%?b>fQpvR zmL^(wq8GBrwNq3NP!&b!jYyZHx-Zx+u0 literal 0 HcmV?d00001 diff --git a/public/images/.DS_Store b/public/images/.DS_Store new file mode 100755 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 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 literal 0 HcmV?d00001 diff --git a/public/images/back.svg b/public/images/back.svg new file mode 100644 index 0000000..e11e92f --- /dev/null +++ b/public/images/back.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/bg.jpg b/public/images/bg.jpg new file mode 100755 index 0000000000000000000000000000000000000000..f0d2e47ff5b3bef265f4cb28471b542634d766d9 GIT binary patch literal 162882 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 z%0D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 literal 0 HcmV?d00001 diff --git a/public/images/check-green.png b/public/images/check-green.png new file mode 100644 index 0000000000000000000000000000000000000000..7aaeabd66d816f86dcf6f9a0dab07fd339552125 GIT binary patch literal 14262 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 ZH#Jj1MYEvJpFgIPl~R(d5P#+We*pcbJK+ET literal 0 HcmV?d00001 diff --git a/public/images/close-circle-outline.svg b/public/images/close-circle-outline.svg new file mode 100644 index 0000000..0018809 --- /dev/null +++ b/public/images/close-circle-outline.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/close-white-png.png b/public/images/close-white-png.png new file mode 100644 index 0000000000000000000000000000000000000000..1f4efb9f79a890d9b32e7edfbbcbd950a4a3b72e GIT binary patch literal 5027 zcmcgw2~-njyAG&`5Kvh}EJ}oe1{y*V*8CU*LM4$kpaex^NG2poGBF8T1qD$+M2Z-e zDzb+~7SR@Q1q6PK)T)RSD}pH40%8#qMR2(jkfln`-+Rx!H|HdieDglfyFK4K-^pQj z*G(!)tCSE3gbKxpOoOjX*;`Qo{^UPN^@1;QLfR&KM8z$ge)z`{zLSp-fxx_zz2zzz z1~U){r4<}6x`^)LOk_Y@6MzW?fF@yFK5UIZ*n|<`uUt?Bpu)I8JRvb`gWjYC5&kY) z#_FLaO+>pl=+Rx=Q4Wv*M46kInV9O4lu#&?jeyA_(#YR_g2TTy=&?m2J`sxz4GlF3 zC73{hKrGJM+8S$$$KvrA*a9OA=ZSzY3{R*(MKaAp289d(hcDtlJd}(V2!Mh`8}#&K zj%Hp{aq`)a2oka({){`G@KbJZme`rwSe%I|c0K|Thcz4OU$C+}e+z@FHNVF&fd983 zCSwM}4;BPXmW0W`fo?ArvfNfQ}(>B(v>+t8Ft=Ln6h&!Ce5cI6)vuCN>ns(ZK>|ZDE1Io8W9_YdzO) zwq8c;WCwGYg^_9%E`wG&Qxseqs9=kAnb&8Rla#ClV~@vdppki~~-S!wR2| zU7TY%sXAHd135e(hzv1;Wh$kRN$?F5CWlD`tt|+q1T!m)xfRPC zV`dt_!dRQ*aTrSi3y)`*GnjA_CS!4NnUCfRS56$E2oi)(&XbvKJ~>!C!99OnmFZG8 z8G<;I1A-3-grH2v8}z1yJTp;dm}HpA{Xi5#EKw*R0PO7_&mGWGR~*exr6C{s#KOGXwI;LpYseB2w=<@ zmLLW&3ji<#_yyuY7HDAx5Ay%MQiVXse-z35I-Oem>m-?;PG3$Qo2ltX`En2bv&_DL z&$i$b^_+n^b<$!&40wyrD3)k#ZOUW>umUhRg1H&S%F2v^u?nzaVQ>}}0R%G(Q_BD_ zU^;<0WS<;Or90;&HFZpz+`{lVjidxar_X#OB|tqq3qCa(Qpk2*VRFxRYz}#7vFueZ zC6HqB`(W=?krHH3E-LLcOj6rkQeU~gatU8*IJT~<0fAD?xqMo=PCC+>j$Pf~)6@tFzRW;P?{fmxd=dx!Fua-+YxZ2FfqAs$OX$iD`(Yl_32a#zWm3BSV_4AM?t5v?exe&axYl?mYY8=cj_V z8&4_k{o~oi!FOj`){VV6Lekq)`XRyjQG@khW&FzJdkbyr*BS2nebDLBUBB%OwxQ)3 zbsjWrvSrsugPWcF+IJg^UfUg5_2`s!C6u6bzs+tbVpmnZNg1!RkoVY7ZedwL(nI@d z!)F7JQfb|N;%4?@-t_}<-b!a%EDn5EhBWIe$wl70`$07>?&oj5fxPKz>IWQK-4l={ zy5IX!dOF~Q{Kqrp7~;E+5WDXj;0EMA_0ZBz2wJLM^DV%#HI zk@k3KhYa4o)>oVVVt z+PL3&WPfx@^kKCXlJmX~eC@T*_^JspZ#olHo1uF>?3YC89=)pKR~+M!3KN6+8V{C^ zW^rGLB##=s2#u$r^V!{Ib)y!2l}&jyMiQoU+2g(tgQMBZ-I{6n)C;Lc?9;Ee<#;58 z-tXvLyCnL2c|Ye7VIb0zbb26KnQ z<^^w73kd|=xvNZmM9;1xuLZUz&!N(I4Hq+MiU%#9$g0 z4X&M+qm^kyhU@G-rPAlEdt&$7olcdv&Q!V3$Vh7B#EN9iiVAySMA49MOgPu7>{d>d zoQS>mNxb9xhv(7~V|OY4&@lq$#X% zJK-v!(-5JNB^x7mf%FhJN#ns}WUm;ncrUZxOX-duO*?InVSI>*O5dtb`>Ov)_M$7$ zL>N^LkH#+~@9ci^W@RUCdD-6TD-86ajS^}1Xsa?R_SbgriOs5mFAWztjXl=Cy}{WF zIy-EA;Wy%H`|}-Q9bIMLf%Yh?>h!)yV@V7W>;LtgeP{I_uTAh67%vMQt67Kkf1R(9 zS}g6mKR9haz4@8lYJ$^rtUUVB1U)D*N`p#(!FHL;eOkdO-p2yZjF_?Q#$f51$m=#I#Sa-m2UoG{nIuX@hdqW z>T+0J&l;H9%Y$6gRww2BoSL?0Vb`?>zWx_=N)&!65--uACn6ocinKQ=7xz>8O?7ru zknx3S+;mu>^zpY&Hu~=?L1so840o73e{96*;v$ZB$NbitEs7 z?>rW5fuDiP6#knVxx0_X2#%Ri_YGv?#a`aBLMCv{MoPv=Y492wz z%}@HhaK43G^(ZZGlpn(#OV>L@N_TG_{a&4M&XQTE+g|^^g#Fv-{^rF*G_CitmJRT+ zDW-SGh(6@;L7?#Gznb>EGyZVP>SK+S`f079h<5F*V?J*+&WGRocv)gM3+Mc?g90ptkWZZ8ITFge@koqf*9_GiC; Zv`)X18S|BSmF%B0ilZyJ!ruSDe*v!NaP|NI literal 0 HcmV?d00001 diff --git a/public/images/close_icon.png b/public/images/close_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..51b4401ca053ca8cad6e9903646709a2f44444df GIT binary patch literal 309 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY0wn)GsXhaw{&>1LhEy=VysgJ$~x+g}6OvsxLimbaeN-!xQItoH=3nd`|H@dF!kYp_dChV`b9AudQLRn7yg2 zv~UiON9*MGOYAy6D=_*g@;c3(5`S(Hi^X;wk8Ms*3SMP^!WTf z-E_DAd$kLMWY`Z`);MuKF9=d$?_mzLoFj7Xp~|_3ODg!(3;AT&wLoS^O+0tsvcZJ& zD(m_$dNm(!9@n+CTyDa$w$*a^-$!>qK3P{4end8+qbAwoFEAV!JYD@<);T3K0RXh> Be)#|Z literal 0 HcmV?d00001 diff --git a/public/images/cloud-svg.svg b/public/images/cloud-svg.svg new file mode 100644 index 0000000..578422c --- /dev/null +++ b/public/images/cloud-svg.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/copy.svg b/public/images/copy.svg new file mode 100644 index 0000000..0bd7d93 --- /dev/null +++ b/public/images/copy.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/down-arrow-grey-small.png b/public/images/down-arrow-grey-small.png new file mode 100644 index 0000000000000000000000000000000000000000..8f0b50976a8f879031bd2b8c77bf34b8a4318599 GIT binary patch literal 1259 zcmVU8P*7-ZbZ>KLZ*U+lnSp_Ufq@}0xwybFAi#%#fq@|}KQEO56)-X|e7nZL z$iTqBa9P*U#mSX{G{Bl%P*lRez;J+pfx##xwK$o9f#C}S14DXwNkIt%17i#W1A|CX zc0maP17iUL1A|C*NRTrF17iyV0~1e4YDEbH0|SF|enDkXW_m`6f}y3QrGjHhep0GJ zaAk2xYHqQDXI^rCQ9*uDVo7QW0|Nup4h9AW240u^5(W3f%sd4n162kpgNVo|1qcff zJ_s=cNG>fZg9jx8g8+j9g8_pBLjXe}Lp{R+hNBE`7{wV~7)u#fFy3PlV+vxLz;uCG zm^qSpA@ds+OO_6nTdaDlt*rOhEZL^9ePa)2-_4=K(Z%tFGm-NGmm}8}ZcXk5JW@PU zd4+f<@d@)yL(o<5icqT158+-B6_LH7;i6x}CW#w~Uy-Pgl#@Irl`kzV zeL|*8R$ca%T%Wv){2zs_iiJvgN^h0dsuZZ2sQy$tsNSU!s;Q*;LF<6_B%M@UD?LHI zSNcZ`78uqV#TeU~$eS{ozBIdFzSClfs*^S+dw;4dus<{M;#|MXC)T}S9v!D zcV!QCPhBq)ZyO(X-(bH4|NMaZz==UigLj2o41F2S6d@OB6%`R(5i>J(Puzn9wnW{e zu;hl6HK{k#IWjCVGqdJqU(99Cv(K+6*i`tgSi2;vbXD1#3jNBGs$DgVwO(~o>mN4i zHPtkqZIx>)Y(Ls5-Br|mx>vQYvH$Kwn@O`L|D75??eGkZnfg$5<;Xeg_o%+-I&+-3%01W^SH2RkDT>t<8AY({UO#lFTB>(_`g8%^e z{{R4h=>PzAFaQARU;qF*m;eA5Z<1fdMgRZ-O-V#SRCwC#*)eXzFboAyA0c}Jq#Jp_ z4Bf)5Lk`&l?LF9`K@+PIMN<^e0w0_-*m{6v^Alcl`CGLB1Q0*~0R&JIh}^~cDF0Oe z0R#|0009ILKmY+W3$#lG?M6W-`k6TNpgbj z99C93M?ja=Mh3|Rdg8FM((87RJm0_~IY0%6l_c`WoTM(O!igSg7pViPa^kPOgJgml zoRJS>NxIU(4Qg`6T1SV}1R0#sUS^USprgeZZ>|QZ3OdrK#mVUQO;QEa<>bVV2I&{b z!O6-)RZ;H$oII}?u$u>>^gg=S^0R#|00R0ot*8rKk V>|;D(>WKgV002ovPDHLkV1h0K8fE|h literal 0 HcmV?d00001 diff --git a/public/images/down-arrow-white-1.svg b/public/images/down-arrow-white-1.svg new file mode 100644 index 0000000..0390623 --- /dev/null +++ b/public/images/down-arrow-white-1.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/images/down-arrow-white-svg.svg b/public/images/down-arrow-white-svg.svg new file mode 100644 index 0000000..e1cbb7c --- /dev/null +++ b/public/images/down-arrow-white-svg.svg @@ -0,0 +1,11 @@ + + + + + + + diff --git a/public/images/down-arrow-white.png b/public/images/down-arrow-white.png new file mode 100644 index 0000000000000000000000000000000000000000..190344e1e3e20780e75170bc74e097107b53de84 GIT binary patch literal 4298 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 E-vT`Z#sB~S literal 0 HcmV?d00001 diff --git a/public/images/download.svg b/public/images/download.svg new file mode 100644 index 0000000..7e6c456 --- /dev/null +++ b/public/images/download.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/edit.svg b/public/images/edit.svg new file mode 100644 index 0000000..77d7e94 --- /dev/null +++ b/public/images/edit.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/error-red.png b/public/images/error-red.png new file mode 100644 index 0000000000000000000000000000000000000000..db9bd9d2b4a88f881e231a1edf65be26ce5991ec GIT binary patch literal 10892 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 literal 0 HcmV?d00001 diff --git a/public/images/favicon.png b/public/images/favicon.png new file mode 100755 index 0000000000000000000000000000000000000000..5cc128134de3218c45f9704bfd0bc5bb7402e41e GIT binary patch literal 1683 zcmaJ?Ycv}M7^M;?4>lq~r8V`4M?;mOXlsdN5*qJ$L|WNOgRs$cUQ0T%WDTa2h^V3F zQC3V*RD;U24JC@LOH-;I^Jau-w3W{GduKns@1A?^J@@-}zbt=WFKvhsL`_Xin@GR~ z?qk$H1Jc~zi8DpP`=I_+pchuHNpfgOO-++T#9@L{)z`{M@t@-1k7?^r;ZFr!_5jmJ zNG&vhvM70)$KmTExnGdNI_(3H+7=CAPCV+*C^V5umuVl3JNpJBjr~Dg4~co=WttS- zcmuJuo~jBmW-|F3tFDf(S0?aN-5n_xCA)jH^`Y*R^?Q#Ne**9_VEzZZKL%T=TipC_ z0@7<1?E(iRuC&+XrD@M=2k4ScW7^rgr1cD^_R{u_@xPMcXIFgMdT_ltk7N;Z6Q>eJ z?wjxJNGvrx!synqJ;f6c`Ao@|UGIr1w>ZihzGHGeK-!0mUHkG`XY7T-U)rnv{8S9N z0v~cE6Sm;3)5hMr(0Vn9{<3EI3Og=66x3V)I~qy1vy@OMhD*H#xA=unjIVn!#jrH( zh2b~ZxJB(FqFK3lQq%ar7u!nlgW_9_q>oZ44SOZfmW82-{MOu&di-|(rSxAfp%pGo zJJXYe%pj!7V@xsxa6ReVT`ED&{^oKhXO2#L80J12J+U!-z3-bci~Q3zdYGNEGWQ#` zxzH1HOZ>0BP%f+%f%)Cp4!>>E;G8tgE&%ANeCVer>ivu9jTKJa%X)s8m?-(9LbkU# z{NZ_WRy6(uW+%_j<3%d<*f?R?AH85cSg9-hT^5oO^;zmhO4hq_o);XmlRL8J9XeJo zHLJ69omzT-9Okn;@N{juC(@nN`h1oJoq3p=f4+*pDY}?D(Gn6YlzfA=DzCx@#6Phyd$F2;LljmDo za?}H+%@{?n&XT+s=%x#VH0$lSW%G_4bf|}FQ&EG2eUM}2N|dz-aLPBqtQSYkasR8 zy&^kL=df@EsF5Ya0X9b-STtBC8V71gtI!_q{qNE$;)wZRFn$!IXW1^GC10YoHb;PJ zmxIq~1smCKjPnIfTwBnj=Hbs}{^fHA&|xfU6ehGmy@RDfDcB#sL zY!X?Y#i5Csvn@dLGKWFC=s-I?zR7Rb6}$qQU#;!*YE2G~I7ekbi+FEzLoA}f*uBS@ z{@3)KBT@Ud%g1?7O0I@y4@8S#Y)P>SUxHSjYmEOVAs88)-)_{mFH{dBCgCOzVC)+U z1sU2kgRCcP3y_naes!Z;Qb{wQQkMV3!19G5esa#?GcYSOuPQx)EfSm!V?7;j+%>h& zjx{R=2kG2qwbhfDpd7G|4vrAhdP`nPK{e2pQw>`eR#%x!l)TwEu#J1)@=eO61G>#* z5M*cC#%9VcL_GuOr8Osl^_ODqc!ms*_HwI4H4hMgOiG)e!$a+VkiQ?-5)PSUWK$=sdao}P4GOjy4?cC4(aY3kt8 zw?!{1zbhd?!=3tbLx^lePgel=cs~I13D*UW=?e?3UnxV25xc8Q1BcLR&i?85SfTZi z`;bCy249PTLV-YM7=K(ly?ykWQ8HG(hgI6zfE-p^=FN<(c`8>h19#I=iN42$vR=3A zzVjIqpPC1LR5KNDwPJ>45`;T>)9AACN;KtF1lQ^VsyIXvn3Aiv@;b6M~?%~L- z1ty@JtAzN@7)Uf@l`#!vKn}|D$dOXKhG5U5r;kh+*TPXf&D%{o;8J6=8;1ly0|4h^ z9(husf5$I#xcT(u7>`5|46g%c*Oe<0MtZ}mM-AdR!*@&zSV0?S0GzgCMudB1Vp(z< zq9tT*`D+O4+tHp=FE5s`6Dpe=$*%EjwP@(@{*8kSH b%I8(&_d+*|I;eW`{+CfB;(c*VSSsspJhuub literal 0 HcmV?d00001 diff --git a/public/images/file-svg.svg b/public/images/file-svg.svg new file mode 100644 index 0000000..2bc0e5e --- /dev/null +++ b/public/images/file-svg.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/folder-svg.svg b/public/images/folder-svg.svg new file mode 100644 index 0000000..747cf96 --- /dev/null +++ b/public/images/folder-svg.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/folder-upload-grey.png b/public/images/folder-upload-grey.png new file mode 100644 index 0000000000000000000000000000000000000000..3d49f454432fa9fc83ad74b3a052ee3af7094f9c GIT binary patch literal 2481 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 literal 0 HcmV?d00001 diff --git a/public/images/grey-add-folder.png b/public/images/grey-add-folder.png new file mode 100644 index 0000000000000000000000000000000000000000..7d951f2109881b1f87a43807dc9f673813161198 GIT binary patch literal 2134 zcmbVNdu$VR9B<3USOviiI?vYgO(d#yCo}|+y z{wY*cs+FE%hLwUQz)4=-6b^O`T^K^KCdIIXC}!UO|`hd~G@O@!uB6v(l0T&P|SM2&MS&IkA)FRBW}l5uRvFR7B^ zm+nIy-~NXI7+Q}fZsVR>g2A{6Ma^q~Zo~p|Pqb1I3GsLtuSoSW%jY#fndzE0A;u;1 zK$YYQNeT=ls&q&);&N$;p^*#^U;k3zDOKOV_E4Aqgt*Na@PQd#l|0l49oRHOh1BJ}Xds8WxIDH0VGh%8^^cA_viCPCmBil#~4 z%CZ$MWl&JW%OPGTX)U1g-1qU;34V>aGG zV?1T$FfXuKG1lw=7LFqT=>kn{lsGH6|qd}SXq`?sMMONdBUp&%UkcZF{Z#VqoIzskWoZE#p&Kw;TVM<^Fj_>7}<Nt_KYrb*K$1S-vlCi9I<&k3ZqOxYgQy*OYy$wm+Y3b?D-9GMC&92eYMqgcgdQ14~ zTIR!p`>5|D+wLUx?sL?&G-i%FQPy^N!S<2L22nX_waw{G--Wv3W~&DSfC{`D8CGsG=o_p!O@i5K+H**?wHmcROzi8mK6nz`0%=slaY?VV&lYv_G{slC5C z<4zTFIr~~d6grkEallaFKs$)7Z?8XJ+QyWbV z%!&yJIRq4FXly*Fp}N%qsQV!|GqZD5rKck&GjlQzGjp>?P#Kub2x6CcOfUwD1Jwxo zduF);)i5^~*EyyJrd7FhHZ5GbbZJwvS6$F5r-IZ%&#b(SP3dt(b%Bm`fk~cOTtLNF z_}G9TZu%b~*6&Bo*sv-yhq7rkcbw2*<=_^y<1l3L(9_jwW>;lyW@u(=W^875W^h(= zwmr<$wwNbh;;3Y-gtuh4!M$XmWUi!H2TB?vXIM_ERQxP0<~@yXTJ)N#HEY*=zoBz; z*~Z#r{`C827aqBI^kb{>#LrCAm9LBC`MzVd39<>UY^_lL$obj#@$`rBIt!FHI9~|; z&=s)i0{_D}LD7kO7d>1Qe?+ZQx-)*_iV0ID+o(;|*VV0cTILfL`)yjx{5{=&~9s#w#Wt#PHnujS2NnO-%SpF1^M zJIDT(=H1XMwY$Q%uHX3ooy%;`&FcT>O4+~tz|%YP@8*5yJ!e!`?fcoZwA)2&yWY=j zI>kTtPE}m(x4tlPcmCd|ZMn03%<^w$ZOZ-4w|egH^4;$&ckAc;Z*I11uanEPSF5Wz z>iIhO`8k#Oe@p8wxxV#wU#}APx4ib8@9gOE_gC%*@2h{5crSUQ`tSLv`vfX0Ka~E9 z{#h<=XHskQ_s^@>P46Gtv)0Z1b@|u%kN@i#cp3Ojeogxr3(PnQ$sR$z3=CDO3=9p; z3=BX21L>Cx45bDP46hOx7_4S6Fo@?*ia+Ycz`*G3>EaktaqG=(TR&z)iI&9R+{xSl zDVYPeDq9yKKHE! z&{8;1VS1sT9Gkh)@85wtr=I%ABrMt4*1Y;Zw<6nx7f)Y&y2)wS@LTwGx@rsK^INJ6 zDatL3=AN(8fzF?{V?k& zgB>^9mt9+UKkVAf7ZJ(6r=2n0mDz@Y;U?pK28Iy68w?BqmI>Sp4o@3o85pKAS1~YX zvGagrK7if0AnAZ4NPNyUSLSPp2UdSwd2ma{0TZ4b8b7q&T|LGVFQ3CdZ_X^I`;JeZ z7pF{gRK@yVAaPGu KKbLh*2~7Z5-UmMb literal 0 HcmV?d00001 diff --git a/public/images/grey_file.png b/public/images/grey_file.png new file mode 100644 index 0000000000000000000000000000000000000000..46678956e73a331dc821890f2c3ed2df4254b34d GIT binary patch literal 1304 zcmX9-4K&kh7=O3_=3|zRgi%-X?S{xl647k35#}qoj9p71HN~1O*0z7tlygv%>J#=^_ntElH5(vKiWUh>n&s{3+@FH)PzOt_5-Vu|E8SEsHm=<5k12%-uF42mHH zaflEE)8mf(&oL|f2))7w)lrXm3?nBD^+0gGh>{t*SGYqaZER|4l5!$MamvuV%tMTv zgB{X+X@^Cz6j5vjBZq*RhmG~nNISQ*8vp6;!yvo^l&H4>KH2YzH!v~_HrRxtZ}ivz z>pMX(fUz(JhNysQPu+G0TlyoBOHx_0NRie_UN1PSIfRT_q(G8f6Hq0v`>@tBvf8*h zrB&E^we^$QedKaSF~?-z%SVlOAFJj|d@4U+&pAA`JQy{H4~h$l7nBsb%o~1)`sdt4 zx_g7eHR@2Jri`f^GMPv-v#9L7IB_xkuCr{dEWNV1;_R6qXSt_`M{(%oox4~ct5fT5 zo?2R8a*%Yp2>ujoG%h>k7q@(-wIpN>9`0aDD!Y2v*@%&5^UJT3AoV#{C z|0VktPPZgpL}Zjmm|v1gEVdq4V`r6ZVPVEH^YJ+n^9;sy)1F_tHd%Vs?~4DE0B?71 zpU&5N(;sFIb`G|?suLF4cK0~86eNx)2+I$ulq|o~U1_}d+4Y-e{QmN-KOo=lmK!qq z?eoOp;u}d_?H#%~nu5{kqN}qBd8Z+kpI`3m8)VcR74~VRO{Zv^}6{W4GV zXV|;Q@OH8c$7V1x`BC82Qi?O0$0Oj&~;?;y~T(cA2)N^~ry~XHI@+1kti|&9 z0(z|v \ No newline at end of file diff --git a/public/images/home.svg b/public/images/home.svg new file mode 100644 index 0000000..c7a76fc --- /dev/null +++ b/public/images/home.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/info-icon-grey.png b/public/images/info-icon-grey.png new file mode 100644 index 0000000000000000000000000000000000000000..ae2cb7246a1aead996865cf008db343fc3ca72fb GIT binary patch literal 3336 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 Ua%-nr(|;9TAAj#MuN7 \ No newline at end of file diff --git a/public/images/list-icon-svg.svg b/public/images/list-icon-svg.svg new file mode 100644 index 0000000..2e26816 --- /dev/null +++ b/public/images/list-icon-svg.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/loader.gif b/public/images/loader.gif new file mode 100755 index 0000000000000000000000000000000000000000..6d88879065ef8718024b44867cb043f4e1b2a813 GIT binary patch literal 52250 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 F)&Sj^P0s)T literal 0 HcmV?d00001 diff --git a/public/images/move.svg b/public/images/move.svg new file mode 100644 index 0000000..907aef1 --- /dev/null +++ b/public/images/move.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/my-drive-dropdown.png b/public/images/my-drive-dropdown.png new file mode 100644 index 0000000000000000000000000000000000000000..32943d61ce9fd58172d30b91a93e8183f18172c8 GIT binary patch literal 11567 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 literal 0 HcmV?d00001 diff --git a/public/images/my-drive-icon2.png b/public/images/my-drive-icon2.png new file mode 100644 index 0000000000000000000000000000000000000000..50b4e418a69b914f7472e3b5b0b6213d78af9ce7 GIT binary patch literal 13531 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 \ No newline at end of file diff --git a/public/images/right-arrow-svg.svg b/public/images/right-arrow-svg.svg new file mode 100644 index 0000000..8e7175d --- /dev/null +++ b/public/images/right-arrow-svg.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/share.svg b/public/images/share.svg new file mode 100644 index 0000000..60fa607 --- /dev/null +++ b/public/images/share.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/trash.svg b/public/images/trash.svg new file mode 100644 index 0000000..c458c86 --- /dev/null +++ b/public/images/trash.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/up-arrow-grey-small.png b/public/images/up-arrow-grey-small.png new file mode 100644 index 0000000000000000000000000000000000000000..fe7775c4fdaace1205eecc039b30aac7910ac0e3 GIT binary patch literal 3131 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 DkM4VE literal 0 HcmV?d00001 diff --git a/public/index.html b/public/index.html new file mode 100755 index 0000000..8eab094 --- /dev/null +++ b/public/index.html @@ -0,0 +1,21 @@ + + + + + + + + MyDrive + + + + + + + +

+ + + + + \ No newline at end of file diff --git a/readme.md b/readme.md new file mode 100755 index 0000000..f301945 --- /dev/null +++ b/readme.md @@ -0,0 +1,7 @@ +# MyDrive + +Coming Soon :) + +yarn install +yarn run build:prod +yarn start \ No newline at end of file diff --git a/rootpath.js b/rootpath.js new file mode 100644 index 0000000..68db50e --- /dev/null +++ b/rootpath.js @@ -0,0 +1 @@ +module.exports = __dirname \ No newline at end of file diff --git a/server/server.js b/server/server.js new file mode 100755 index 0000000..03be213 --- /dev/null +++ b/server/server.js @@ -0,0 +1,75 @@ +const express = require("express"); +const app = express(); +const path = require("path") +const publicPath = path.join(__dirname, "..", "public"); +const userRouter = require("../src/express-routers/user") +const fileRouter = require("../src/express-routers/file") +const folderRouter = require("../src/express-routers/folder"); +const storageRouter = require("../src/express-routers/storage"); +const bodyParser = require('body-parser'); +const https = require("https"); +const fs = require("fs"); +const helmet = require("helmet"); +const busboy = require("connect-busboy") +const compression = require("compression"); + + +const cert = fs.readFileSync("certificate.crt") +const ca = fs.readFileSync("certificate.ca-bundle"); +const key = fs.readFileSync("certificate.key"); + + +const options = { + cert, + ca, + key +} + +const http = require("http") + +const server = http.createServer(app); +const serverHttps = https.createServer( options, app ); + + +require("../src/db/mongoose") + + +app.use(helmet()) +app.use(compression()); +app.use(express.json()); +app.use(express.static(publicPath)); +app.use(bodyParser.json({limit: "50mb"})); +app.use(bodyParser.urlencoded({limit: "50mb", extended: true, parameterLimit:50000})) + +app.use(busboy({ + highWaterMark: 2 * 1024 * 1024, +})); + +app.use(userRouter, fileRouter, folderRouter, storageRouter); + + +const nodeMode = process.env.NODE_ENV ? "Production" : "Development/Testing"; + +console.log("Node Enviroment Mode:", nodeMode); + + +app.get("*", (req, res) => { + + res.sendFile(path.join(publicPath, "index.html")) +}) + + +if (process.env.NODE_ENV === 'production') { + + module.exports = {server, serverHttps}; + +} else { + + module.exports = server; +} + + + + + + diff --git a/server/serverStart.js b/server/serverStart.js new file mode 100644 index 0000000..7fd1430 --- /dev/null +++ b/server/serverStart.js @@ -0,0 +1,33 @@ +const getKey = require("../key/getKey"); + +const serverStart = async() => { + + await getKey(); + + if (process.env.NODE_ENV === 'production') { + + const {server, serverHttps} = require("./server"); + + server.listen(process.env.HTTP_PORT,process.env.URL, () => { + console.log("Http Server Running On Port:", process.env.HTTP_PORT); + }) + + serverHttps.listen(process.env.HTTPS_PORT, function () { + console.log( 'Https Server Running On Port:', process.env.HTTPS_PORT); + } ); + + } else { + + const server = require("./server"); + + server.listen(process.env.HTTP_PORT,process.env.URL, () => { + console.log("Development Server Running On Port:", process.env.HTTP_PORT); + }) + } +} + +serverStart(); + + + + diff --git a/serverUtils/backupDatabase.js b/serverUtils/backupDatabase.js new file mode 100644 index 0000000..c199ba0 --- /dev/null +++ b/serverUtils/backupDatabase.js @@ -0,0 +1,56 @@ +const mongoose = require("../src/db/mongooseServerUtils"); +const conn = mongoose.connection; +const prompts = require("prompts"); +const createTempDirectory = require("./createTempDirectory"); + +const waitForDatabase = () => { + + return new Promise((resolve, reject) => { + + if (conn.readyState !== 1) { + + conn.once("open", () => { + + resolve(); + + }) + + } else { + + resolve(); + } + + }) +} + +const copyDatabase = async() => { + + console.log("Waiting For Database Connection..."); + await waitForDatabase(); + console.log("Connected To Database\n"); + + const userConfimation = await prompts({ + type: 'text', + message: "Warning: This will create a new Database backup, overwriting\n" + + "the current database backup. Only ONE Database backup\n" + + "can Be Stored At A Time.\n" + + "For more permanent backups, use MongoExport, or \n" + + "Backup data manually. \n" + + "Would you like to continue? (Yes/No)", + name: "value" + }) + + if (!userConfimation.value || userConfimation.value.toLowerCase() !== "yes") { + + console.log("Exiting...") + process.exit() + return; + } + + await createTempDirectory(); + + console.log("Finished Copying Database, Exiting..."); + process.exit(); +} + +copyDatabase() \ No newline at end of file diff --git a/serverUtils/changeEncryptionPassword.js b/serverUtils/changeEncryptionPassword.js new file mode 100644 index 0000000..a7976d5 --- /dev/null +++ b/serverUtils/changeEncryptionPassword.js @@ -0,0 +1,295 @@ +const mongoose = require("../src/db/mongooseServerUtils"); +const conn = mongoose.connection; +const ObjectID = require('mongodb').ObjectID +const imageChecker = require("../src/utils/imageChecker"); +const createThumbnail = require("./createThumbnailBuffer"); +const prompts = require("prompts"); +const getKey = require("../key/getKey"); +const getNewKey = require("../key/getNewKey"); +const crypto = require("crypto"); +const env = require("../src/enviroment/env"); +const cliProgress = require('cli-progress'); +const createTempDirectory = require("./createTempDirectory"); + +const waitForDatabase = () => { + + return new Promise((resolve, reject) => { + + if (conn.readyState !== 1) { + + conn.once("open", () => { + + resolve(); + + }) + + } else { + + resolve(); + } + + }) +} + +const reencryptFile = (file, newKey, user) => { + + return new Promise(async(resolve, reject) => { + + const fileID = file._id; + const filename = file.filename; + + let decryptBucket = new mongoose.mongo.GridFSBucket(conn.db, { + chunkSizeBytes: 1024 * 255, + bucketName: "temp-fs" + }); + + let bucket = new mongoose.mongo.GridFSBucket(conn.db, { + chunkSizeBytes: 1024 * 255 + }); + + const metadata = file.metadata; + + const readStream = decryptBucket.openDownloadStream(ObjectID(fileID)); + + const writeStream = bucket.openUploadStream(filename, {metadata}); + + const foundOldUser = await conn.db.collection("temp-users").findOne({_id: user._id}); + + const password = getOldEncryptionKey(foundOldUser); + + const IV = file.metadata.IV.buffer + + const CIPHER_KEY = crypto.createHash('sha256').update(password).digest() + + const decipher = crypto.createDecipheriv('aes256', CIPHER_KEY, IV); + + const NEW_CIPHER_KEY = crypto.createHash('sha256').update(newKey).digest() + + const cipher = crypto.createCipheriv('aes256', NEW_CIPHER_KEY, IV); + + cipher.on("error", (e) => { + console.log("de", e); + }) + + readStream.pipe(decipher).pipe(cipher).pipe(writeStream); + + writeStream.on("finish", async(newFile) => { + + const imageCheck = imageChecker(filename); + + if (file.length < 15728640 && imageCheck) { + + try { + await createThumbnail(newFile, filename, user, newKey); + } catch (e) { + console.log("Cannot create thumbnail", e); + } + + resolve(); + + } else { + + resolve(); + } + + }) + + }) +} + + +const findFiles = async() => { + + const userListCursor = await conn.db.collection("users").find({}); + const userListCount = await conn.db.collection("users").find({}).count(); + const progressBar = new cliProgress.SingleBar({}, cliProgress.Presets.shades_classic); + + progressBar.start(userListCount, 0); + + for await (const currentUser of userListCursor) { + + const currentUserID = currentUser._id; + + const newEncrpytionKey = getEncryptionKey(currentUser); + + const listCursor = await conn.db.collection("temp-fs.files").find({"metadata.owner": ObjectID(currentUserID)}); + + for await (const currentFile of listCursor) { + + await reencryptFile(currentFile, newEncrpytionKey, currentUser); + } + + progressBar.increment() + } + + progressBar.stop(); +} + +const generateEncryptionKeys = async(user) => { + + const userPassword = user.password; + const masterPassword = env.newKey; + + const randomKey = crypto.randomBytes(32); + + const iv = crypto.randomBytes(16); + const USER_CIPHER_KEY = crypto.createHash('sha256').update(userPassword).digest(); + const cipher = crypto.createCipheriv('aes-256-cbc', USER_CIPHER_KEY, iv); + let encryptedText = cipher.update(randomKey); + encryptedText = Buffer.concat([encryptedText, cipher.final()]); + + const MASTER_CIPHER_KEY = crypto.createHash('sha256').update(masterPassword).digest(); + const masterCipher = crypto.createCipheriv('aes-256-cbc', MASTER_CIPHER_KEY, iv); + let masterEncryptedText = masterCipher.update(encryptedText); + masterEncryptedText = Buffer.concat([masterEncryptedText, masterCipher.final()]).toString("hex"); + + user.privateKey = masterEncryptedText; + user.publicKey = iv.toString("hex"); + + return user; +} + +const getOldEncryptionKey = (user) => { + + const userPassword = user.password; + const masterEncryptedText = user.privateKey; + const masterPassword = env.key; + const iv = Buffer.from(user.publicKey, "hex"); + + const USER_CIPHER_KEY = crypto.createHash('sha256').update(userPassword).digest(); + const MASTER_CIPHER_KEY = crypto.createHash('sha256').update(masterPassword).digest(); + + const unhexMasterText = Buffer.from(masterEncryptedText, "hex"); + const masterDecipher = crypto.createDecipheriv('aes-256-cbc', MASTER_CIPHER_KEY, iv) + let masterDecrypted = masterDecipher.update(unhexMasterText); + masterDecrypted = Buffer.concat([masterDecrypted, masterDecipher.final()]) + + let decipher = crypto.createDecipheriv('aes-256-cbc', USER_CIPHER_KEY, iv); + let decrypted = decipher.update(masterDecrypted); + decrypted = Buffer.concat([decrypted, decipher.final()]); + + return decrypted; +} + +const getEncryptionKey = (user) => { + + const userPassword = user.password; + const masterEncryptedText = user.privateKey; + const masterPassword = env.newKey; + const iv = Buffer.from(user.publicKey, "hex"); + + const USER_CIPHER_KEY = crypto.createHash('sha256').update(userPassword).digest(); + const MASTER_CIPHER_KEY = crypto.createHash('sha256').update(masterPassword).digest(); + + const unhexMasterText = Buffer.from(masterEncryptedText, "hex"); + const masterDecipher = crypto.createDecipheriv('aes-256-cbc', MASTER_CIPHER_KEY, iv) + let masterDecrypted = masterDecipher.update(unhexMasterText); + masterDecrypted = Buffer.concat([masterDecrypted, masterDecipher.final()]) + + let decipher = crypto.createDecipheriv('aes-256-cbc', USER_CIPHER_KEY, iv); + let decrypted = decipher.update(masterDecrypted); + decrypted = Buffer.concat([decrypted, decipher.final()]); + + return decrypted; +} + +const findUsers = async() => { + + const listCursor = await conn.db.collection("temp-users").find({}); + const listCount = await conn.db.collection("temp-users").find({}).count(); + const progressBar = new cliProgress.SingleBar({}, cliProgress.Presets.shades_classic); + + progressBar.start(listCount, 0); + + for await (const currentUser of listCursor) { + + try { + + const newUser = await generateEncryptionKeys(currentUser); + + await conn.db.collection("users").insertOne(newUser); + + progressBar.increment() + + } catch (e) { + console.log("e", e); + } + } + + progressBar.stop(); + +} + +const changeEncryptionPassword = async() => { + + console.log("Waiting For Database..."); + await waitForDatabase(); + console.log("Connected To Database...\n"); + + const userConfimation = await prompts({ + type: 'text', + message: "Warning: This will automatically run Backup-Database,\n" + + "overwriting the current Backup. And will also clear all file chunks\n" + + "other than the Data Backup. Then it will re-encrypt files and move them back over.\n" + + "(Optional) Create a manual Backup for additional safety.\n" + + "Would you like to continue? (Yes/No)", + name: "value" + }) + + if (!userConfimation.value || userConfimation.value.toLowerCase() !== "yes") { + + console.log("Exiting...") + process.exit() + return; + } + + console.log("\nGetting Old Password..."); + await getKey(); + console.log("Got Key\n") + + console.log("Getting New Password..."); + await getNewKey(); + console.log("Got New Key\n"); + + console.log("Creating Temporary Collection...\n"); + await createTempDirectory(); + console.log("Temporary Collection Completed\n") + + console.log("Created New Backup Sucessfully\n") + + console.log("Deleting Current Chunks Collection..."); + try { + await conn.db.collection("fs.chunks").drop(); + } catch (e) {} + console.log("Current Chunk Collection Deleted\n"); + + console.log("Deleting Current File Collection..."); + try { + await conn.db.collection("fs.files").drop(); + } catch (e) {} + console.log("Deleted Current File Collection\n") + + console.log("Delete Current Users..."); + try { + await conn.db.collection("users").drop(); + } catch (e) {} + console.log("Current Users Deleted\n"); + + console.log("Deleting Current Thumbnails..."); + try { + await conn.db.collection("thumbnails").drop(); + } catch (e) {} + console.log("Deleted Current Thumbnails\n"); + + console.log("Generating User Encryption Keys..."); + await findUsers(); + console.log("Generated User Encryption Keys\n") + + console.log("Moving Files By User..."); + await findFiles(); + console.log("Moved All Files...\n") + + process.exit(); +} + +changeEncryptionPassword(); \ No newline at end of file diff --git a/serverUtils/cleanDatabase.js b/serverUtils/cleanDatabase.js new file mode 100644 index 0000000..8393201 --- /dev/null +++ b/serverUtils/cleanDatabase.js @@ -0,0 +1,118 @@ +const mongoose = require("../src/db/mongooseServerUtils"); +const conn = mongoose.connection; +const ObjectID = require('mongodb').ObjectID +const prompts = require("prompts"); +const cliProgress = require('cli-progress'); +const createTempDirectory = require("./createTempDirectory"); + +const waitForDatabase = () => { + + return new Promise((resolve, reject) => { + + if (conn.readyState !== 1) { + + conn.once("open", () => { + + resolve(); + + }) + + } else { + + resolve(); + } + + }) +} + +const moveFileChunks = async(fileID, oldDatabaseChunks, newDatabaseChunks) => { + + const listChunkCursor = await conn.db.collection(oldDatabaseChunks).find({files_id: ObjectID(fileID)}); + + for await (const currentChunk of listChunkCursor) { + + await conn.db.collection(newDatabaseChunks).insertOne(currentChunk); + } +} + +const findFiles = async(oldDatabaseList, oldDatabaseChunks, newDatabaseChunks) => { + + const listCursor = await conn.db.collection(oldDatabaseList).find({}); + const listCount = await conn.db.collection(oldDatabaseList).find({}).count(); + const progressBar = new cliProgress.SingleBar({}, cliProgress.Presets.shades_classic); + + progressBar.start(listCount, 0); + + for await (const currentFile of listCursor) { + + const fileID = currentFile._id; + await moveFileChunks(fileID, oldDatabaseChunks, newDatabaseChunks); + progressBar.increment(); + } + + progressBar.stop(); +} + +const cleanDatabase = async() => { + + console.log("Waiting For Database Connection..."); + await waitForDatabase(); + console.log("Connected To Database\n"); + + const userConfimation = await prompts({ + type: 'text', + message: "Warning: This will automatically run Backup-Database,\n" + + "overwriting the current Backup. And will also clear all file chunks\n" + + "other than the Data Backup. Then it will move only used file chunks\n" + + "over to the Main Database. If this process fails AFTER the Automatic Backup\n" + + "use the Restore-Database feature. \n" + + "Would you like to continue? (Yes/No)", + name: "value" + }) + + if (!userConfimation.value || userConfimation.value.toLowerCase() !== "yes") { + + console.log("Exiting...") + process.exit() + return; + } + + console.log("Creating Temporary Collection...\n"); + await createTempDirectory(); + console.log("Temporary Collection Completed\n") + + console.log("Created New Backup Sucessfully\n") + + console.log("Deleting Current Chunks Collection..."); + try { + await conn.db.collection("fs.chunks").drop(); + } catch (e) {} + console.log("Current Chunk Collection Deleted\n"); + + console.log("Moving Used Files..."); + await findFiles("temp-fs.files", "temp-fs.chunks", "fs.chunks"); + console.log("Moved All Used Files\n"); + + console.log("Creating File Chunks Index..."); + await conn.db.collection("fs.chunks").createIndex({ files_id: 1, n: 1 }, { unique: true }); + console.log("Created File Chunks Index\n"); + + console.log("Deleteing Current Transcoded Video Chunks Collection..."); + try { + await conn.db.collection("videos.chunks").drop(); + } catch (e) {} + console.log("Deleted Current Transcoded Video Chunks Collection\n") + + console.log("Moving Used Video Files..."); + await findFiles("temp-videos.files", "temp-videos.chunks", "videos.chunks"); + console.log("Moved All Used Video Files\n") + + console.log("Creating Transcoded Video Chunks Index..."); + await conn.db.collection("videos.chunks").createIndex({ files_id: 1, n: 1 }, { unique: true }); + console.log("Created Transcoded Video Chunks Index") + + process.exit(); + +} + +cleanDatabase(); \ No newline at end of file diff --git a/serverUtils/createIndexes.js b/serverUtils/createIndexes.js new file mode 100644 index 0000000..dc035d9 --- /dev/null +++ b/serverUtils/createIndexes.js @@ -0,0 +1,50 @@ +const mongoose = require("../src/db/mongoose"); +const conn = mongoose.connection; + +const waitForDatabase = () => { + + return new Promise((resolve, reject) => { + + if (conn.readyState !== 1) { + + conn.once("open", () => { + + resolve(); + + }) + + } else { + + resolve(); + } + + }) +} + +const createIndexes = async() => { + + console.log("Waiting For Database..."); + await waitForDatabase(); + console.log("Connected To Database\n"); + + console.log("Creating Indexes...") + await conn.db.collection("fs.files").createIndex({uploadDate: 1}); + await conn.db.collection("fs.files").createIndex({uploadDate: -1}); + await conn.db.collection("fs.files").createIndex({filename: 1}); + await conn.db.collection("fs.files").createIndex({filename: -1}); + await conn.db.collection("fs.files").createIndex({"metadata.owner": 1}); + + await conn.db.collection("folders").createIndex({createdAt: 1}) + await conn.db.collection("folders").createIndex({createdAt: -1}) + await conn.db.collection("folders").createIndex({name: 1}); + await conn.db.collection("folders").createIndex({name: -1}) + await conn.db.collection("folders").createIndex({owner: 1}) + + await conn.db.collection("thumbnails").createIndex({owner: 1}) + console.log("Indexes Created"); + + process.exit(); + +} + +createIndexes(); \ No newline at end of file diff --git a/serverUtils/createTempDirectory.js b/serverUtils/createTempDirectory.js new file mode 100644 index 0000000..7d14880 --- /dev/null +++ b/serverUtils/createTempDirectory.js @@ -0,0 +1,103 @@ +const mongoose = require("../src/db/mongooseServerUtils"); +const conn = mongoose.connection; +const cliProgress = require('cli-progress'); + +const clearTempDirectory = async() => { + + console.log("Removing Temporary Collections..."); + + try { + await conn.db.collection("temp-fs.files").drop(); + } catch (e) {} + + try { + await conn.db.collection("temp-fs.chunks").drop(); + } catch (e) {} + + try { + await conn.db.collection("temp-thumbnails").drop(); + } catch (e) {} + + try { + await conn.db.collection("temp-folders").drop(); + } catch (e) {} + + try { + await conn.db.collection("temp-videos.files").drop(); + } catch (e) {} + + try { + await conn.db.collection("temp-videos.chunks").drop(); + } catch (e) {} + + try { + await conn.db.collection("temp-users").drop(); + } catch (e) {} + + console.log("Removed Temporary Collections\n") +} + +const moveItem = async(oldPath, newPath) => { + + const listCursor = await conn.db.collection(oldPath).find({}); + const listCount = await conn.db.collection(oldPath).find({}).count(); + const progressBar = new cliProgress.SingleBar({}, cliProgress.Presets.shades_classic); + + progressBar.start(listCount, 0); + + for await (const currentFile of listCursor) { + + await conn.db.collection(newPath).insertOne(currentFile); + progressBar.increment(); + } + + progressBar.stop(); +} + +const createTempDirectory = async() => { + + await clearTempDirectory(); + + console.log("Moving Files...") + await moveItem("fs.files", "temp-fs.files") + console.log("Moved All Files\n"); + + + console.log(`Moving File Chunks...`); + await moveItem("fs.chunks", "temp-fs.chunks"); + console.log("Moved All Chunks \n"); + + console.log("Creating Temp File Chunks Index..."); + await conn.db.collection("temp-fs.chunks").createIndex({ files_id: 1, n: 1 }, { unique: true }); + console.log("Created Temp File Chunks Index\n"); + + console.log(`Moving Thumbnails...`) + await moveItem("thumbnails", "temp-thumbnails"); + console.log("Moved All Thumbnails \n") + + + console.log(`Moving Folders...`); + await moveItem("folders", "temp-folders"); + console.log("All Folders Moved \n"); + + + console.log(`Moving Transcoded Video Files...`); + await moveItem("videos.files", "temp-videos.files") + console.log("All Transcoded Video Files Moved \n"); + + + console.log(`Moving Transcoded Video Chunks...`) + await moveItem("videos.chunks", "temp-videos.chunks") + console.log("All Transcoded Video Chunks Moved \n"); + + console.log("Creating Temp Transcoded Video Chunks Index..."); + await conn.db.collection("videos.chunks").createIndex({ files_id: 1, n: 1 }, { unique: true }) + console.log("Created Temp Transcoded Video Chunks Index \n"); + + + console.log(`Moving Users...`) + await moveItem("users", "temp-users") + console.log("All Users Moved\n"); +} + +module.exports = createTempDirectory; diff --git a/serverUtils/createThumbnailBuffer.js b/serverUtils/createThumbnailBuffer.js new file mode 100644 index 0000000..480e168 --- /dev/null +++ b/serverUtils/createThumbnailBuffer.js @@ -0,0 +1,82 @@ +const mongoose = require("../src/db/mongooseServerUtils") +const conn = mongoose.connection; +const crypto= require("crypto"); +const env = require("../src/enviroment/env"); +const Thumbnail = require("../src/models/thumbnail"); +const ObjectID = require('mongodb').ObjectID +const sharp = require("sharp"); +const concat = require("concat-stream") + +const createThumbnail = async(file, filename, user, newKey) => { + + return new Promise((resolve) => { + + try { + + const password = newKey; + + let CIPHER_KEY = crypto.createHash('sha256').update(password).digest() + + let bucket = new mongoose.mongo.GridFSBucket(conn.db, { + chunkSizeBytes: 1024 * 255, + }) + + const readStream = bucket.openDownloadStream(ObjectID(file._id)) + + readStream.on("error", (e) => { + console.log("File service upload thumbnail error", e); + resolve(file); + }) + + const decipher = crypto.createDecipheriv('aes256', CIPHER_KEY, file.metadata.IV.buffer); + + decipher.on("error", (e) => { + console.log("File service upload thumbnail decipher error", e); + resolve(file) + }) + + const concatStream = concat(async(bufferData) => { + + const thumbnailIV = crypto.randomBytes(16); + + const thumbnailCipher = crypto.createCipheriv("aes256", CIPHER_KEY, thumbnailIV); + + bufferData = Buffer.concat([thumbnailIV, thumbnailCipher.update(bufferData), thumbnailCipher.final()]); + + const thumbnailModel = new Thumbnail({name: filename, owner: user._id, data: bufferData}); + + await thumbnailModel.save(); + + let updatedFile = await conn.db.collection("fs.files") + .findOneAndUpdate({"_id": file._id}, {"$set": {"metadata.hasThumbnail": true, "metadata.thumbnailID": thumbnailModel._id}}) + + updatedFile = updatedFile.value; + + updatedFile = {...updatedFile, metadata: {...updatedFile.metadata, hasThumbnail: true, thumbnailID: thumbnailModel._id}} + + resolve(updatedFile); + + }).on("error", (e) => { + console.log("File service upload concat stream error", e); + resolve(file); + }) + + const imageResize = sharp().resize(300).on("error", (e) => { + + console.log("resize error", e); + resolve(file); + }) + + readStream.pipe(decipher).pipe(imageResize).pipe(concatStream); + + + } catch (e) { + + console.log(e); + resolve(file); + } + + }) +} + +module.exports = createThumbnail; \ No newline at end of file diff --git a/serverUtils/deleteDatabase.js b/serverUtils/deleteDatabase.js new file mode 100644 index 0000000..f635232 --- /dev/null +++ b/serverUtils/deleteDatabase.js @@ -0,0 +1,81 @@ +const mongoose = require("../src/db/mongooseServerUtils"); +const prompts = require("prompts"); +const conn = mongoose.connection; + +const waitForDatabase = () => { + + return new Promise((resolve, reject) => { + + if (conn.readyState !== 1) { + + conn.once("open", () => { + + resolve(); + + }) + + } else { + + resolve(); + } + + }) +} + +const deleteTempDatabase = async() => { + + console.log("Waiting For Database..."); + await waitForDatabase(); + console.log("Connected To Database\n") + + const userConfimation = await prompts({ + type: 'text', + message: "Warning: This will delete all the data in the Main Database,\n" + + "this will not delete any data in the Database Backup.\n" + + "Would you like to continue? (Yes/No)", + name: "value" + }) + + if (!userConfimation.value || userConfimation.value.toLowerCase() !== "yes") { + + console.log("Exiting...") + process.exit() + return; + } + + console.log("Removing Collections..."); + + try { + await conn.db.collection("fs.files").drop(); + } catch (e) {} + + try { + await conn.db.collection("fs.chunks").drop(); + } catch (e) {} + + try { + await conn.db.collection("thumbnails").drop(); + } catch (e) {} + + try { + await conn.db.collection("folders").drop(); + } catch (e) {} + + try { + await conn.db.collection("videos.files").drop(); + } catch (e) {} + + try { + await conn.db.collection("videos.chunks").drop(); + } catch (e) {} + + try { + await conn.db.collection("users").drop(); + } catch (e) {} + + console.log("Removed Collections\n") + + process.exit(); +} + +deleteTempDatabase(); \ No newline at end of file diff --git a/serverUtils/deleteTempDatabase.js b/serverUtils/deleteTempDatabase.js new file mode 100644 index 0000000..2662cad --- /dev/null +++ b/serverUtils/deleteTempDatabase.js @@ -0,0 +1,79 @@ +const mongoose = require("../src/db/mongooseServerUtils"); +const prompts = require("prompts"); +const conn = mongoose.connection; + +const waitForDatabase = () => { + + return new Promise((resolve, reject) => { + + if (conn.readyState !== 1) { + + conn.once("open", () => { + + resolve(); + + }) + + } else { + + resolve(); + } + + }) +} + +const deleteTempDatabase = async() => { + + console.log("Waiting For Database..."); + await waitForDatabase(); + console.log("Connected To Database\n") + + const userConfimation = await prompts({ + type: 'text', + message: "Warning: Deleting the Backup Database cannot be undone,\n" + + "Would you like to continue? (Yes/No)", + name: "value" + }) + + if (!userConfimation.value || userConfimation.value.toLowerCase() !== "yes") { + + console.log("Exiting...") + process.exit() + return; + } + + console.log("Removing Temporary Collections..."); + + try { + await conn.db.collection("temp-fs.files").drop(); + } catch (e) {} + + try { + await conn.db.collection("temp-fs.chunks").drop(); + } catch (e) {} + + try { + await conn.db.collection("temp-thumbnails").drop(); + } catch (e) {} + + try { + await conn.db.collection("temp-folders").drop(); + } catch (e) {} + + try { + await conn.db.collection("temp-videos.files").drop(); + } catch (e) {} + + try { + await conn.db.collection("temp-videos.chunks").drop(); + } catch (e) {} + + try { + await conn.db.collection("temp-users").drop(); + } catch (e) {} + + console.log("Removed Temporary Collections, Exiting..."); + process.exit(); +} + +deleteTempDatabase(); \ No newline at end of file diff --git a/serverUtils/restoreDatabase.js b/serverUtils/restoreDatabase.js new file mode 100644 index 0000000..bd28159 --- /dev/null +++ b/serverUtils/restoreDatabase.js @@ -0,0 +1,55 @@ +const mongoose = require("../src/db/mongooseServerUtils"); +const prompts = require("prompts"); +const restoreFromTempDirectory = require("./restoreFromTempDirectory"); +const conn = mongoose.connection; + +const waitForDatabase = () => { + + return new Promise((resolve, reject) => { + + if (conn.readyState !== 1) { + + conn.once("open", () => { + + resolve(); + + }) + + } else { + + resolve(); + } + + }) +} + +const restoreDatabase = async() => { + + const userConfimation = await prompts({ + type: 'text', + message: "Warning: This will delete ALL data," + + " other than the Data Backup created by CopyDatabase. \nMake sure to first run CopyDatabase, and backup" + + " your data, \nWould you like to continue? (Yes/No)", + name: "value" + }) + + if (!userConfimation.value || userConfimation.value.toLowerCase() !== "yes") { + + console.log("Exiting...") + process.exit() + return; + + } else { + + await waitForDatabase(); + + await restoreFromTempDirectory(); + + console.log("Finished Restoring Data, Exiting..."); + process.exit(); + } + +} + +restoreDatabase() + diff --git a/serverUtils/restoreFromTempDirectory.js b/serverUtils/restoreFromTempDirectory.js new file mode 100644 index 0000000..2749966 --- /dev/null +++ b/serverUtils/restoreFromTempDirectory.js @@ -0,0 +1,105 @@ +const mongoose = require("../src/db/mongooseServerUtils"); +const cliProgress = require('cli-progress'); +const conn = mongoose.connection; + +const clearDirectory = async() => { + + console.log("Removing Collections..."); + + try { + await conn.db.collection("fs.files").drop(); + } catch (e) {} + + try { + await conn.db.collection("fs.chunks").drop(); + } catch (e) {} + + try { + await conn.db.collection("thumbnails").drop(); + } catch (e) {} + + try { + await conn.db.collection("folders").drop(); + } catch (e) {} + + try { + await conn.db.collection("videos.files").drop(); + } catch (e) {} + + try { + await conn.db.collection("videos.chunks").drop(); + } catch (e) {} + + try { + await conn.db.collection("users").drop(); + } catch (e) {} + + console.log("Removed Collections\n") +} + +const moveItem = async(oldPath, newPath) => { + + const listCursor = await conn.db.collection(oldPath).find({}); + const listCount = await conn.db.collection(oldPath).find({}).count(); + const progressBar = new cliProgress.SingleBar({}, cliProgress.Presets.shades_classic); + + progressBar.start(listCount, 0); + + for await (const currentFile of listCursor) { + + await conn.db.collection(newPath).insertOne(currentFile); + progressBar.increment(); + } + + progressBar.stop(); +} + + +const restoreFromTempDirectory = async() => { + + console.log("\n"); + await clearDirectory(); + + console.log("Moving Files...") + await moveItem("temp-fs.files", "fs.files") + console.log("Moved All Files\n"); + + + console.log(`Moving File Chunks...`); + await moveItem("temp-fs.chunks","fs.chunks"); + console.log("Moved All Chunks \n"); + + console.log("Creating File Index..."); + await conn.db.collection("fs.chunks").createIndex({ files_id: 1, n: 1 }, { unique: true }) + console.log("File Index Created \n"); + + console.log(`Moving Thumbnails...`) + await moveItem("temp-thumbnails", "thumbnails"); + console.log("Moved All Thumbnails \n") + + + console.log(`Moving Folders...`); + await moveItem("temp-folders", "folders"); + console.log("All Folders Moved \n"); + + + console.log(`Moving Transcoded Video Files...`); + await moveItem("temp-videos.files", "videos.files") + console.log("All Transcoded Video Files Moved \n"); + + + console.log(`Moving Transcoded Video Chunks...`) + await moveItem("temp-videos.chunks", "videos.chunks") + console.log("All Transcoded Video Chunks Moved \n"); + + console.log("Creating Transcoded Video Chunks Index..."); + await conn.db.collection("videos.chunks").createIndex({ files_id: 1, n: 1 }, { unique: true }) + console.log("Created Transcoded Video Chunks Index \n"); + + + console.log(`Moving Users...`) + await moveItem("temp-users", "users") + console.log("All Users Moved\n"); +} + +module.exports = restoreFromTempDirectory; \ No newline at end of file diff --git a/src/actions/addOptions.js b/src/actions/addOptions.js new file mode 100644 index 0000000..c849504 --- /dev/null +++ b/src/actions/addOptions.js @@ -0,0 +1,9 @@ +export const showAddOptions = (show) => ({ + type: "SHOW_ADD_OPTIONS", + show +}) + +export const showAddOptions2 = (show) => ({ + type: "SHOW_ADD_OPTIONS2", + show +}) \ No newline at end of file diff --git a/src/actions/auth.js b/src/actions/auth.js new file mode 100755 index 0000000..fdbd909 --- /dev/null +++ b/src/actions/auth.js @@ -0,0 +1,163 @@ +import {setLoginFailed} from "./main"; +import {history} from "../routers/AppRouter" +import {resetUpload} from "./uploads" +import axios from "axios"; +import env from "../enviroment/envFrontEnd"; + +const currentURL = env.url; + +export const login = (id) => ({ + type: "LOGIN", + id +}) + +export const logout = () => ({ + type: "LOGOUT" +}) + +export const startLogin = (email, password, currentRoute) => { + + return (dispatch) => { + + const dt = {email, password}; + + axios.post(currentURL+"/user-service/login", dt).then((response) => { + + const token = response.data.token; + const id = response.data.user._id; + + window.localStorage.setItem("token", token); + + dispatch(setLoginFailed(false)) + dispatch(login(id)); + history.push(currentRoute); + + }).catch((err) => { + dispatch(setLoginFailed("Incorrect Email or Password")) + console.log(err); + }) + } +} + +export const startCreateAccount = (email, password) => { + + return (dispatch) => { + + + const dt = {email, password}; + axios.post(currentURL+"/user-service/create", dt).then((response) => { + + const token = response.data.token; + const id = response.data.user._id; + + window.localStorage.setItem("token", token); + + dispatch(setLoginFailed(false)) + dispatch(login(id)); + history.push("/home"); + + }).catch((err) => { + + console.log(err); + + if (err.response) { + + const errStatus = err.response.status; + + if (errStatus === 401) { + + dispatch(setLoginFailed("Create Blocked By Admin")) + + } else { + + dispatch(setLoginFailed("Duplicate Email, or Invalid Password")) + } + + } else { + + dispatch(setLoginFailed("Duplicate Email, or Invalid Password")) + } + }) + } +} + +export const startLoginCheck = (token, currentRoute) => { + + return (dispatch) => { + + const config = { + headers: {'Authorization': "Bearer " + token} + }; + + axios.get(currentURL+"/user-service/user", config).then((response) => { + + const id = response.data._id; + + dispatch(setLoginFailed(false)) + dispatch(login(id)) + history.push(currentRoute); + + }).catch((err) => { + + console.log("login check error", err); + window.localStorage.removeItem("token") + dispatch(setLoginFailed("Login Expired")) + // history.push("/login") + }) + } +} + +export const startLogoutAll = () => { + + return (dispatch) => { + + const token = window.localStorage.getItem("token") + + const config = { + headers: {'Authorization': "Bearer " + token} + }; + + axios.post(currentURL+"/user-service/logout-all", undefined,config).then(() => { + + window.localStorage.removeItem("token") + + dispatch(resetUpload()) + dispatch(setLoginFailed(false)) + dispatch(logout()) + + history.push("/") + + }).catch((err) => { + console.log(err); + }) + + } + +} + +export const startLogout = () => { + + return (dispatch) => { + + const token = window.localStorage.getItem("token") + + const config = { + headers: {'Authorization': "Bearer " + token} + }; + + axios.post(currentURL+"/user-service/logout", undefined,config).then(() => { + + window.localStorage.removeItem("token") + + dispatch(resetUpload()) + dispatch(setLoginFailed(false)) + dispatch(logout()) + + history.push("/") + + }).catch((err) => { + console.log(err); + }) + + } +} \ No newline at end of file diff --git a/src/actions/files.js b/src/actions/files.js new file mode 100644 index 0000000..8e3e452 --- /dev/null +++ b/src/actions/files.js @@ -0,0 +1,216 @@ +import {addUpload, editUpload} from "./uploads"; +import {loadMoreItems, setLoading} from "./main" +import {resetSelected} from "./selectedItem"; +import {addQuickFile, startSetQuickFiles} from "./quickFiles"; +import {startSetStorage} from "./storage" +import uuid from "uuid"; +import axios from "axios"; +import env from "../enviroment/envFrontEnd"; +const http = require('http'); +const https = require('https'); + +const currentURL = env.url; + +export const setFiles = (files) => ({ + type: "SET_FILES", + files +}) + +export const editFile = (id, file) => ({ + type: "EDIT_FILE", + id, + file +}) + +export const editFileMetadata = (id, metadata) => ({ + type: "EDIT_FILE_METADATA", + id, + metadata +}) + +export const startSetFiles = (parent="/", sortby="DEFAULT", search="") => { + + return (dispatch) => { + + const config = { + headers: {'Authorization': "Bearer " + window.localStorage.getItem("token")} + }; + + let limit = window.localStorage.getItem("list-size") || 50 + limit = parseInt(limit) + + dispatch(setFiles([])) + + axios.get(currentURL +`/file-service/list?parent=${parent}&sortby=${sortby}&search=${search}&limit=${limit}`, config).then((results) => { + + dispatch(setLoading(true)) + dispatch(setFiles(results.data)) + dispatch(setLoading(false)) + + if (results.data.length === limit) { + dispatch(loadMoreItems(true)) + } else { + dispatch(loadMoreItems(false)) + } + + }).catch((err) => { + console.log(err) + }) + } +} + +export const loadMoreFiles = (files) => ({ + type: "LOAD_MORE_FILES", + files +}) + +export const startLoadMoreFiles = (parent="/", sortby="DEFAULT", search="", startAtDate, startAtName) => { + + return (dispatch) => { + + const config = { + headers: {'Authorization': "Bearer " + window.localStorage.getItem("token")} + }; + + let limit = window.localStorage.getItem("list-size") || 50 + limit = parseInt(limit) + + axios.get(currentURL +`/file-service/list?limit=${limit}&parent=${parent}&sortby=${sortby}&search=${search}&startAt=${true}&startAtDate=${startAtDate}&startAtName=${startAtName}`, config).then((results) => { + console.log("load more results", results); + + if (results.data.length !== limit) { + + dispatch(loadMoreItems(false)) + + } else { + dispatch(loadMoreItems(true)) + } + + dispatch(loadMoreFiles(results.data)) + + }).catch((err) => { + console.log(err) + }) + } +} + +export const addFile = (file) => ({ + type: "ADD_FILE", + file +}) + +export const startAddFile = (uploadInput, parent, parentList) => { + + return (dispatch, getState) => { + + // Store the parent, incase it changes. + const prevParent = getState().parent.parent; + + for (let i = 0; i < uploadInput.files.length; i++) { + const currentFile = uploadInput.files[i]; + const currentID = uuid(); + + const CancelToken = axios.CancelToken; + const source = CancelToken.source(); + + const httpAgent = new http.Agent({ keepAlive: true }); + const httpsAgent = new https.Agent({ keepAlive: true }); + + const config = { + headers: {'Authorization': "Bearer " + window.localStorage.getItem("token"), + httpAgent, + httpsAgent, + 'Content-Type': 'multipart/form-data', + 'Transfere-Encoding': "chunked"}, + onUploadProgress: (progressEvent) => { + + const currentProgress = Math.round(((progressEvent.loaded / progressEvent.total) * 100)); + + if (currentProgress !== 100) { + + dispatch(editUpload(currentID, currentProgress)) + } + }, + cancelToken: source.token + }; + + dispatch(addUpload({id: currentID, progress: 0, name: currentFile.name, completed: false, source, canceled: false})) + + const data = new FormData(); + + data.append('filename', currentFile.name); + data.append("parent", parent) + data.append("parentList", parentList) + data.append("currentID", currentID) + data.append("size", currentFile.size) + data.append('file', currentFile); + + axios.post(currentURL +'/file-service/upload', data, config) + .then(function (response) { + + const currentParent = getState().parent.parent; + // This can change by the time the file uploads + if (prevParent === currentParent) { + dispatch(addFile(response.data)); + } + + dispatch(addQuickFile(response.data)) + dispatch(editUpload(currentID, 100, true)) + dispatch(resetSelected()) + dispatch(startSetStorage()) + + }) + .catch(function (error) { + console.log(error); + }); + + } + } +} + +export const removeFile = (id) => ({ + type: "REMOVE_FILE", + id +}) + +export const startRemoveFile = (id) => { + + return (dispatch) => { + + const headers = {'Authorization': "Bearer " + window.localStorage.getItem("token")}; + const data = {id} + + axios.delete(currentURL+"/file-service/remove", { + headers, + data + }).then(() => { + dispatch(removeFile(id)) + dispatch(startSetStorage()) + dispatch(startSetQuickFiles()); + }).catch((err) => { + console.log(err) + }) + } +} + + +export const startRenameFile = (id, title) => { + + return (dispatch) => { + + const config = { + headers: {'Authorization': "Bearer " + window.localStorage.getItem("token")} + }; + + const data = {id, title} + + axios.patch(currentURL+"/file-service/rename", data, config).then(() => { + + dispatch(editFile(id, {filename: title})) + + }).catch((err) => { + console.log(err) + }) + + } +} diff --git a/src/actions/filter.js b/src/actions/filter.js new file mode 100644 index 0000000..c2a8df5 --- /dev/null +++ b/src/actions/filter.js @@ -0,0 +1,29 @@ +export const setSortBy = (sortBy) => ({ + type: "SET_SORT_BY", + sortBy +}) + +export const setSearch = (search) => ({ + type: "SET_SEARCH", + search +}) + +export const resetSearch = () => ({ + type: "RESET_SEARCH" +}) + +export const enableListView = () => ({ + type: "ENABLE_LIST_VIEW" +}) + +export const disableListView = () => ({ + type: "DISABLE_LIST_VIEW" +}) + +export const setCurrentlySearching = () => ({ + type: "SET_CURRENTLY_SEARCHING" +}) + +export const resetCurrentlySearching = () => ({ + type: "RESET_CURRENTLY_SEARCHING" +}) \ No newline at end of file diff --git a/src/actions/folders.js b/src/actions/folders.js new file mode 100644 index 0000000..2ec5dce --- /dev/null +++ b/src/actions/folders.js @@ -0,0 +1,115 @@ +import {startSetQuickFiles} from "./quickFiles"; +import env from "../enviroment/envFrontEnd"; +const axios = require("axios"); + +const currentURL = env.url; + +export const addFolder = (folder) => ({ + type: "ADD_FOLDER", + folder +}) + +export const startAddFolder = (name, owner, parent, parentList) => { + + return (dispatch) => { + + if (name.length === 0) { + return; + } + + const config = { + headers: {'Authorization': "Bearer " + window.localStorage.getItem("token")} + }; + + const body = {name, parent, owner, parentList}; + + axios.post(currentURL+"/folder-service/upload", body, config).then((response) => { + + const folder = response.data; + + dispatch(addFolder(folder)) + + }).catch((err) => { + console.log(err) + }) + } +} + +export const setFolders = (folders) => ({ + type: "SET_FOLDERS", + folders +}) + +export const startSetFolders = (parent = "/", sortby="DEFAULT", search="") => { + + return (dispatch) => { + + const config = { + headers: {'Authorization': "Bearer " + window.localStorage.getItem("token")} + } + + dispatch(setFolders([])) + + axios.get(currentURL+`/folder-service/list?parent=${parent}&sortby=${sortby}&search=${search}`, config).then((response) => { + + const folders = response.data; + dispatch(setFolders(folders)) + + }).catch((err) => { + console.log(err); + }) + } +} + +export const removeFolder = (id) => ({ + type: "REMOVE_FOLDER", + id +}) + +export const startRemoveFolder = (id, parentList) => { + + return (dispatch) => { + + const data = {id, parentList}; + + const headers = {'Authorization': "Bearer " + window.localStorage.getItem("token")} + + axios.delete(currentURL+`/folder-service/remove`, { + headers, + data + }).then((response) => { + + dispatch(removeFolder(id)); + dispatch(startSetQuickFiles()) + + }).catch((err) => { + console.log(err); + }) + } +} + +export const editFolder = (id, folder) => ({ + type: "EDIT_FOLDER", + id, + folder +}) + +export const startRenameFolder = (id, title) => { + + return (dispatch) => { + + const config = { + headers: {'Authorization': "Bearer " + window.localStorage.getItem("token")} + }; + + const data = {id, title} + + axios.patch(currentURL+"/folder-service/rename", data, config).then((response) => { + + dispatch(editFolder(id, {name: title})) + + }).catch((err) => { + console.log(err) + }) + } +} diff --git a/src/actions/main.js b/src/actions/main.js new file mode 100644 index 0000000..531fe75 --- /dev/null +++ b/src/actions/main.js @@ -0,0 +1,38 @@ +export const showSideBar = () => ({ + type: "SHOW_SIDEBAR" +}) + +export const hideSideBar = () => ({ + type: "HIDE_SIDEBAR" +}) + +export const goneSideBar = () => ({ + type: "GONE_SIDEBAR" +}) + +export const resetItems = () => ({ + type: "RESET_ITEMS" +}) + +export const showUploader = () => ({ + type: "SHOW_UPLOADER" +}) + +export const hideUploader = () => ({ + type: "HIDE_UPLOADER" +}) + +export const loadMoreItems = (load) => ({ + type: "LOAD_MORE_ITEMS", + load +}) + +export const setLoading = (load) => ({ + type: "SET_LOADING", + load +}) + +export const setLoginFailed = (message) => ({ + type: "SET_LOGIN_FAILED", + message +}) diff --git a/src/actions/mover.js b/src/actions/mover.js new file mode 100644 index 0000000..d295911 --- /dev/null +++ b/src/actions/mover.js @@ -0,0 +1,10 @@ +export const setMoverID = (id, parent, isFile) => ({ + type: "SET_MOVER_ID", + id, + parent, + isFile +}) + +export const resetMoverID = () => ({ + type: "RESET_MOVER_ID" +}) \ No newline at end of file diff --git a/src/actions/parent.js b/src/actions/parent.js new file mode 100644 index 0000000..7c974d5 --- /dev/null +++ b/src/actions/parent.js @@ -0,0 +1,83 @@ +import axios from "axios"; +import env from "../enviroment/envFrontEnd"; + +const currentURL = env.url; + +export const setParent = (parent="/") => ({ + type: "SET_PARENT", + parent +}) + +export const addParentList = (parent, name) => ({ + type: "ADD_PARENT_LIST", + parent, + name +}) + +export const setParentList = (parentList, parentNameList) => ({ + type: "SET_PARENT_LIST", + parentList, + parentNameList +}) + +export const startSetParentList = (id) => { + + return (dispatch) => { + + const config = { + headers: {'Authorization': "Bearer " + window.localStorage.getItem("token")} + } + + axios.get(currentURL+`/folder-service/subfolder-list/?id=${id}`, config).then((response) => { + + const parentList = response.data.folderIDList; + const parentNameList = response.data.folderNameList; + + dispatch(setParentList(parentList, parentNameList)) + + }).catch((err) => { + console.log(err); + }) + + } +} + +export const adjustParentList = (parentList, parentNameList) => ({ + type: "ADJUST_PARENT_LIST", + parentList, + parentNameList +}) + +export const startAdjustParentList = (id, parentList, parentNameList) => { + + return (dispatch) => { + + const adjustedParentList = []; + const adjustedParentNameList = []; + + for (let i = 0; i < parentList.length; i++) { + + const currentID = parentList[i]; + const currentName = parentNameList[i]; + + adjustedParentList.push(currentID) + adjustedParentNameList.push(currentName) + + if (currentID === id) { + break; + } + } + + dispatch(adjustParentList(adjustedParentList, adjustedParentNameList)); + + } +} + +export const addParentNameList = (name) => ({ + type: "ADD_PARENT_NAME_LIST", + name +}) + +export const resetParentList = () => ({ + type: "RESET_PARENT_LIST" +}) \ No newline at end of file diff --git a/src/actions/photoViewer.js b/src/actions/photoViewer.js new file mode 100644 index 0000000..2fddfd6 --- /dev/null +++ b/src/actions/photoViewer.js @@ -0,0 +1,8 @@ +export const setPhotoID = (id) => ({ + type: "SET_PHOTO_ID", + id +}) + +export const resetPhotoID = () => ({ + type: "RESET_PHOTO_ID" +}) \ No newline at end of file diff --git a/src/actions/popupFile.js b/src/actions/popupFile.js new file mode 100644 index 0000000..fd03c6c --- /dev/null +++ b/src/actions/popupFile.js @@ -0,0 +1,8 @@ +export const setPopupFile = (file) => ({ + type: "SET_POPUP_FILE", + file +}) + +export const hidePopup = () => ({ + type: "HIDE_POPUP" +}) \ No newline at end of file diff --git a/src/actions/quickFiles.js b/src/actions/quickFiles.js new file mode 100644 index 0000000..3577950 --- /dev/null +++ b/src/actions/quickFiles.js @@ -0,0 +1,32 @@ +import axios from "axios"; +import env from "../enviroment/envFrontEnd"; + +const currentURL = env.url; + +export const setQuickFiles = (files) => ({ + type: "SET_QUICK_FILES", + files +}) + +export const startSetQuickFiles = () => { + + return (dispatch) => { + + const config = { + headers: {'Authorization': "Bearer " + window.localStorage.getItem("token")} + }; + + axios.get(currentURL +`/file-service/quick-list`, config).then((results) => { + + dispatch(setQuickFiles(results.data)) + + }).catch((err) => { + console.log(err) + }) + } +} + +export const addQuickFile = (file) => ({ + type: "ADD_QUICK_FILE", + file +}) \ No newline at end of file diff --git a/src/actions/routes.js b/src/actions/routes.js new file mode 100644 index 0000000..cac9940 --- /dev/null +++ b/src/actions/routes.js @@ -0,0 +1,8 @@ +export const setCurrentRoute = (route) => ({ + type: "SET_CURRENT_ROUTE", + route +}) + +export const resetCurrentRoute = () => ({ + type: "RESET_CURRENT_ROUTE" +}) \ No newline at end of file diff --git a/src/actions/selectedItem.js b/src/actions/selectedItem.js new file mode 100644 index 0000000..a97ccc9 --- /dev/null +++ b/src/actions/selectedItem.js @@ -0,0 +1,92 @@ +import axios from "axios"; +import env from "../enviroment/envFrontEnd"; + +const currentURL = env.url; + +export const setSelectedItem = (selectedItem) => ({ + type: "SET_SELECTED_ITEM", + selectedItem +}) + +export const startSetSelectedItem = (id, file, fromQuickItems) => { + + return (dispatch) => { + + const config = { + headers: {'Authorization': "Bearer " + window.localStorage.getItem("token")} + }; + + const currentDate = Date.now(); + + dispatch(setLastSelected(currentDate)); + + if (!fromQuickItems) { + dispatch(setSelected(id)) + } else { + dispatch(setSelected("quick-"+id)) + } + + if (file) { + + axios.get(currentURL +`/file-service/info/${id}`, config).then((results) => { + + const {filename: name, length: size, uploadDate: date, parentName: location, metadata, _id: id} = results.data; + + dispatch(setSelectedItem({name, size, date, file, location, transcoded: metadata.transcoded, isVideo: metadata.isVideo, id, linkType: metadata.linkType, link: metadata.link})) + + }).catch((err) => { + console.log(err) + }) + + } else { + + axios.get(currentURL +`/folder-service/info/${id}`, config).then((results) => { + + const {name, 0: size, createdAt: date, parentName: location} = results.data; + + dispatch(setSelectedItem({name, size, date, file, location})) + + }).catch((err) => { + console.log(err) + }) + } + } +} + +export const editSelectedItem = (item) => ({ + type: "EDIT_SELECTED_ITEM", + item +}) + +export const resetSelectedItem = () => ({ + type: "RESET_SELECTED_ITEM" +}) + +export const resetSelected = () => ({ + type: "RESET_SELECTED" +}) + +export const setLastSelected = (lastSelected) => ({ + type: "SET_LAST_SELECTED", + lastSelected +}) + +export const setRightSelected = (selected) => ({ + type: "SET_RIGHT_SELECTED", + selected +}) + +export const setShareSelected = (selected) => ({ + type: "SET_SHARE_SELECTED", + selected +}) + +export const editShareSelected = (selected) => ({ + type: "EDIT_SHARE_SELECTED", + selected +}) + +export const setSelected = (selected) => ({ + type: "SET_SELECTED", + selected +}) \ No newline at end of file diff --git a/src/actions/settings.js b/src/actions/settings.js new file mode 100644 index 0000000..06a86fd --- /dev/null +++ b/src/actions/settings.js @@ -0,0 +1,7 @@ +export const showSettings = () => ({ + type: "SHOW_SETTINGS" +}) + +export const hideSettings = () => ({ + type: "HIDE_SETTINGS" +}) \ No newline at end of file diff --git a/src/actions/storage.js b/src/actions/storage.js new file mode 100644 index 0000000..8805bbe --- /dev/null +++ b/src/actions/storage.js @@ -0,0 +1,29 @@ +import axios from "axios"; +import env from "../enviroment/envFrontEnd"; + +const currentURL = env.url; + +export const setStorage = (info) => ({ + type: "SET_STORAGE", + info +}) + +export const startSetStorage = () => { + + return (dispatch) => { + + const config = { + headers: {'Authorization': "Bearer " + window.localStorage.getItem("token")} + }; + + axios.get(currentURL +`/storage-service/info`, config).then((results) => { + + dispatch(setStorage(results.data)) + + }).catch((err) => { + console.log(err) + }) + + } + +} \ No newline at end of file diff --git a/src/actions/uploads.js b/src/actions/uploads.js new file mode 100644 index 0000000..15b8817 --- /dev/null +++ b/src/actions/uploads.js @@ -0,0 +1,40 @@ +export const addUpload = (upload) => ({ + type: "ADD_UPLOAD", + upload +}) + +export const resetUpload = () => ({ + type: "RESET_UPLOADS" +}) + +export const editUpload = (id, progress, completed = false) => ({ + type: "EDIT_UPLOAD", + id, + progress, + completed +}) + +export const cancelUpload = (id) => ({ + type: "CANCEL_UPLOAD", + id +}) + +export const startCancelAllUploads = (uploads) => { + + return (dispatch) => { + + for (let i = 0; i < uploads.length; i++) { + + const upload = uploads[i]; + + if (!upload.completed) { + + upload.source.cancel("All uploads cancelling") + + dispatch(cancelUpload(upload.id)) + } + } + + dispatch(resetUpload()); + } +} \ No newline at end of file diff --git a/src/app.js b/src/app.js new file mode 100755 index 0000000..7f23880 --- /dev/null +++ b/src/app.js @@ -0,0 +1,26 @@ +import React from "react"; +import ReactDOM from "react-dom"; +import {Provider} from "react-redux" +import configStore from "./store/configureStore" +import AppRouter from "./routers/AppRouter" +import "normalize.css/normalize.css" +import "./styles/styles.scss"; +import "core-js/stable"; +import "regenerator-runtime/runtime"; +import 'react-circular-progressbar/dist/styles.css'; + + + +const store = configStore(); + +const jsxWrapper = ( + + + + +) + +ReactDOM.render(jsxWrapper, document.getElementById("app")) + + + diff --git a/src/components/ContextItem/ContextItem.js b/src/components/ContextItem/ContextItem.js new file mode 100644 index 0000000..b35378d --- /dev/null +++ b/src/components/ContextItem/ContextItem.js @@ -0,0 +1,11 @@ +import React from "react"; + +const ContextItem = (props) => ( +
+ +

{props.title}

+
+) + +export default ContextItem; + diff --git a/src/components/ContextItem/index.js b/src/components/ContextItem/index.js new file mode 100644 index 0000000..9fee57f --- /dev/null +++ b/src/components/ContextItem/index.js @@ -0,0 +1,83 @@ +import ContextItem from "./ContextItem"; +import {setRightSelected, setSelected, setShareSelected} from "../../actions/selectedItem" +import {startRemoveFile, startRenameFile} from "../../actions/files" +import {setMoverID} from "../../actions/mover"; +import Swal from "sweetalert2" +import {connect} from "react-redux" +import React from "react"; + +class ContextItemContainer extends React.Component { + + constructor(props) { + super(props); + } + + onClick = async(e) => { + e.stopPropagation(); + + this.props.dispatch(setSelected("")) + this.props.dispatch(setRightSelected("")) + + const itemTitle = this.props.title; + + if (itemTitle === "Download") { + + this.props.downloadFile(this.props._id, undefined, false, true) + + } else if (itemTitle === "Delete") { + + Swal.fire({ + title: 'Confirm Deletion', + text: "You cannot undo this action", + icon: 'warning', + showCancelButton: true, + confirmButtonColor: '#3085d6', + cancelButtonColor: '#d33', + confirmButtonText: 'Yes, delete' + }).then((result) => { + if (result.value) { + this.props.dispatch(startRemoveFile(this.props._id)) + } + }) + + } else if (itemTitle === "Rename") { + + let inputValue = this.props.filename; + + const { value: folderName} = await Swal.fire({ + title: 'Enter A File Name', + input: 'text', + inputValue: inputValue, + showCancelButton: true, + inputValidator: (value) => { + if (!value) { + return 'Please Enter a Name' + } + } + }) + + if (folderName === undefined || folderName === null) { + + return; + } + + this.props.dispatch(startRenameFile(this.props._id, folderName)) + + } else if (itemTitle === "Share") { + + this.props.dispatch(setShareSelected({...this.props.file})) + + } else if (itemTitle === "Move") { + + this.props.dispatch(setMoverID(this.props._id, this.props.parent, this.props.isFile)); + } + } + + render() { + return + } +} + + +export default connect()(ContextItemContainer); + diff --git a/src/components/ContextItemFolder/ContextItemFolder.js b/src/components/ContextItemFolder/ContextItemFolder.js new file mode 100644 index 0000000..b35378d --- /dev/null +++ b/src/components/ContextItemFolder/ContextItemFolder.js @@ -0,0 +1,11 @@ +import React from "react"; + +const ContextItem = (props) => ( +
+ +

{props.title}

+
+) + +export default ContextItem; + diff --git a/src/components/ContextItemFolder/index.js b/src/components/ContextItemFolder/index.js new file mode 100644 index 0000000..0b3a4b8 --- /dev/null +++ b/src/components/ContextItemFolder/index.js @@ -0,0 +1,83 @@ +import ContextItemFolder from "./ContextItemFolder"; +import {startRemoveFolder, startRenameFolder} from "../../actions/folders" +import {setRightSelected, setSelected, setShareSelected} from "../../actions/selectedItem"; +import {setMoverID} from "../../actions/mover" +import Swal from "sweetalert2" +import {connect} from "react-redux" +import React from "react"; + +class ContextItemFolderContainer extends React.Component { + + constructor(props) { + + super(props); + } + + onClick = async(e) => { + e.stopPropagation(); + + this.props.dispatch(setSelected("")) + this.props.dispatch(setRightSelected("")) + + const itemTitle = this.props.title; + + if (itemTitle === "Download") { + + this.props.downloadFile(this.props._id, undefined, false, true) + + } else if (itemTitle === "Delete") { + + Swal.fire({ + title: 'Confirm Deletion', + text: "You cannot undo this action", + icon: 'warning', + showCancelButton: true, + confirmButtonColor: '#3085d6', + cancelButtonColor: '#d33', + confirmButtonText: 'Yes, delete' + }).then((result) => { + if (result.value) { + this.props.dispatch(startRemoveFolder(this.props._id, [...this.props.parentList, this.props._id])) + } + }) + + } else if (itemTitle === "Rename") { + + let inputValue = this.props.name; + + const { value: folderName} = await Swal.fire({ + title: 'Enter Folder Name', + input: 'text', + inputValue: inputValue, + showCancelButton: true, + inputValidator: (value) => { + if (!value) { + return 'Please Enter a Name' + } + } + }) + + if (folderName === undefined || folderName === null) { + + return; + } + + this.props.dispatch(startRenameFolder(this.props._id, folderName)) + + } else if (itemTitle === "Share") { + + this.props.dispatch(setShareSelected({...this.props.file})) + + } else if (itemTitle === "Move") { + + this.props.dispatch(setMoverID(this.props._id, this.props.parent, this.props.isFile)); + } + } + + render() { + + return + } +} + +export default connect()(ContextItemFolderContainer); \ No newline at end of file diff --git a/src/components/ContextMenu/ContextMenu.js b/src/components/ContextMenu/ContextMenu.js new file mode 100644 index 0000000..1d82ed4 --- /dev/null +++ b/src/components/ContextMenu/ContextMenu.js @@ -0,0 +1,20 @@ +import ContextItem from "../ContextItem"; +import React from "react"; + +const ContextMenu = React.forwardRef((props, ref) => ( + +
+ + + + + {props.quickFile ? undefined : + + } + + +
+)) + +export default ContextMenu + diff --git a/src/components/ContextMenu/index.js b/src/components/ContextMenu/index.js new file mode 100644 index 0000000..9f28a21 --- /dev/null +++ b/src/components/ContextMenu/index.js @@ -0,0 +1,37 @@ +import ContextMenu from "./ContextMenu"; +import {setRightSelected, setSelected} from "../../actions/selectedItem" +import {connect} from "react-redux" +import React from "react"; + +class ContextMenuContainer extends React.Component { + + constructor(props) { + super(props); + + this.wrapperRef = React.createRef(); + } + + handleClickOutside = (e) => { + + if (this.wrapperRef && !this.wrapperRef.current.contains(e.target)) { + + this.props.dispatch(setSelected("")); + this.props.dispatch(setRightSelected("")); + } + } + + componentDidMount = () => { + document.addEventListener('mousedown', this.handleClickOutside); + } + + componentWillUnmount = () => { + document.removeEventListener('mousedown', this.handleClickOutside); + } + + render() { + + return + } +} + +export default connect()(ContextMenuContainer); \ No newline at end of file diff --git a/src/components/ContextMenuFolder/ContextMenuFolder.js b/src/components/ContextMenuFolder/ContextMenuFolder.js new file mode 100644 index 0000000..f6efbe5 --- /dev/null +++ b/src/components/ContextMenuFolder/ContextMenuFolder.js @@ -0,0 +1,14 @@ +import ContextItemFolder from "../ContextItemFolder"; +import React from "react"; + +const ContextMenuFolder = React.forwardRef((props, ref) => ( + +
+ + + +
+)) + +export default ContextMenuFolder; + diff --git a/src/components/ContextMenuFolder/index.js b/src/components/ContextMenuFolder/index.js new file mode 100644 index 0000000..352b51d --- /dev/null +++ b/src/components/ContextMenuFolder/index.js @@ -0,0 +1,37 @@ +import ContextMenuFolder from "./ContextMenuFolder"; +import {setRightSelected, setSelected} from "../../actions/selectedItem"; +import {connect} from "react-redux" +import React from "react"; + +class ContextMenuFolderContainer extends React.Component { + + constructor(props) { + super(props); + + this.wrapperRef = React.createRef() + } + + handleClickOutside = (e) => { + + if (this.wrapperRef && !this.wrapperRef.current.contains(e.target)) { + + this.props.dispatch(setSelected("")); + this.props.dispatch(setRightSelected("")); + } + } + + componentDidMount = () => { + document.addEventListener('mousedown', this.handleClickOutside); + } + + componentWillUnmount = () => { + document.removeEventListener('mousedown', this.handleClickOutside); + } + + render() { + + return + } +} + +export default connect()(ContextMenuFolderContainer); \ No newline at end of file diff --git a/src/components/Dataform/DataForm.js b/src/components/Dataform/DataForm.js new file mode 100644 index 0000000..804b71c --- /dev/null +++ b/src/components/Dataform/DataForm.js @@ -0,0 +1,52 @@ +import FileItem from ".././FileItem" +import FolderItem from ".././FolderItem" +import Spacer from ".././Spacer"; +import React from "react"; + +const DataForm = (props) => ( + +
+ +
+ + {props.folders.length === 0 ? + + (undefined) + : + (
+ {props.folders.map((folder) => + ())} +
)} +
+ + {props.files.length !== 0 ? : undefined} + +
+ + {props.files.length === 0 ? + + (undefined) + : + (
+ + {props.files.map((file) => + ( ))} + +
)} +
+ +
+) + +export default DataForm; \ No newline at end of file diff --git a/src/components/Dataform/index.js b/src/components/Dataform/index.js new file mode 100644 index 0000000..8192ca0 --- /dev/null +++ b/src/components/Dataform/index.js @@ -0,0 +1,26 @@ +import DataForm from "./DataForm"; +import {connect} from "react-redux"; +import React from "react"; + +class DataFormContainer extends React.Component { + + constructor(props) { + + super(props); + } + + render() { + + return + + } +} + +const mapStateToProp = (state) => ({ + files: state.files, + folders: state.folders, + selected: state.selectedItem.selected, + resetItems: state.main.resetItems +}) + +export default connect(mapStateToProp)(DataFormContainer); \ No newline at end of file diff --git a/src/components/DownloadPage/DownloadPage.js b/src/components/DownloadPage/DownloadPage.js new file mode 100644 index 0000000..47f0d57 --- /dev/null +++ b/src/components/DownloadPage/DownloadPage.js @@ -0,0 +1,35 @@ +import Spinner from ".././SpinnerLogin"; +import React from "react"; + +const DownloadPage = ({download,state}) => { + + if (state.size === "" && !state.error) { + + return
+ +
+ } + + return ( + +
+ + {!state.error ? + + (
+

{state.title}

+

Type: {state.type}

+

Size: {state.size}

+ +
) + : +
+

Unauthorized/Not Found Download

+
+ } + +
) +} + +export default DownloadPage; + diff --git a/src/components/DownloadPage/index.js b/src/components/DownloadPage/index.js new file mode 100644 index 0000000..a2d8ac0 --- /dev/null +++ b/src/components/DownloadPage/index.js @@ -0,0 +1,89 @@ +import DownloadPage from "./DownloadPage"; +import capitalize from "../../utils/capitalize"; +import env from "../../enviroment/envFrontEnd"; +import axios from "axios"; +import bytes from "bytes"; +import React from "react"; + +const currentURL = env.url; + +class DownloadPageContainer extends React.Component { + + constructor(props) { + super(props); + + this.state = { + error: false, + title: "", + type: "", + size: "", + } + } + + getFileExtension = (filename) => { + + const filenameSplit = filename.split("."); + + if (filenameSplit.length > 1) { + + const extension = filenameSplit[filenameSplit.length - 1] + + return extension.toUpperCase(); + + } else { + + return "Unknown" + } + + } + + componentDidMount = () => { + + const _id = this.props.match.params.id; + const tempToken = this.props.match.params.tempToken + + const config = { + headers: {'Authorization': "Bearer " + window.localStorage.getItem("token")} + }; + + axios.get(currentURL +`/file-service/public/info/${_id}/${tempToken}`, config).then((results) => { + + const data = results.data; + + const title = capitalize(data.filename); + const size = bytes(data.length); + const type = this.getFileExtension(title); + + this.setState(() => ({ + ...this.state, + title, + type, + size + })) + + }).catch((err) => { + console.log(err) + this.setState(() => ({...this.state, error: true})) + }) + } + + download = () => { + + const _id = this.props.match.params.id; + const tempToken = this.props.match.params.tempToken + const finalUrl = currentURL + `/file-service/public/download/${_id}/${tempToken}` + + const link = document.createElement('a'); + document.body.appendChild(link); + link.href = finalUrl; + link.setAttribute('type', 'hidden'); + link.click(); + } + + render() { + + return + } +} + +export default DownloadPageContainer; \ No newline at end of file diff --git a/src/components/FileItem/FileItem.js b/src/components/FileItem/FileItem.js new file mode 100644 index 0000000..bff1cdc --- /dev/null +++ b/src/components/FileItem/FileItem.js @@ -0,0 +1,64 @@ +import ContextMenu from "../ContextMenu"; +import capitalize from "../../utils/capitalize"; +import bytes from "bytes"; +import moment from "moment"; +import React from "react" + + +const FileItem = (props) => { + + const wrapperClassname = props.getWrapperClassname() + + return ( +
+ + {props.listView ? + +
{props.fileClick(props._id, props)}} + onContextMenu={(e) => props.getContextMenu(e)}> + +
+ {props.image.src = "/images/file-svg.svg"; props.image.className="file__image__listview"; props.failedToLoad = true}}/> +
{capitalize(props.filename)}
+
+
{bytes(props.length)}
+
{moment(props.uploadDate).format("L")}
+ + {(props.rightSelected === props._id && props._id === props.selected) ? + + + : + undefined} + +
+ + : + +
{props.fileClick(props._id, props)}} + onContextMenu={(e) => props.getContextMenu(e)}> + +
+ {props.image.src = "/images/file-svg.svg"; props.image.className="file__image"; props.failedToLoad = true;}}/> +
+ +
{capitalize(props.filename)}
+ + {(props.rightSelected === props._id && props._id === props.selected) ? + + + : + undefined} + + +
+ + } + +
+ ) + +} + +export default FileItem; diff --git a/src/components/FileItem/index.js b/src/components/FileItem/index.js new file mode 100644 index 0000000..cd1ce06 --- /dev/null +++ b/src/components/FileItem/index.js @@ -0,0 +1,182 @@ +import FileItem from "./FileItem"; +import {startSetSelectedItem, setRightSelected, setLastSelected} from "../../actions/selectedItem" +import mobileCheck from "../../utils/mobileCheck" +import env from "../../enviroment/envFrontEnd"; +import axios from "axios"; +import {connect} from "react-redux"; +import React from "react"; + +const currentURL = env.url; + +class FileItemContainer extends React.Component { + + constructor(props) { + super(props); + + this.failedToLoad = false; + + this.state = { + contextMenuPos: {}, + imageSrc: "/images/file-svg.svg", + imageClassname: this.props.listView ? "file__image__listview" : "file__image" + } + } + + getThumbnail = async() => { + + const thumbnailID = this.props.metadata.thumbnailID; + const imageClassname = this.props.listView ? "file__image__listview--no-opacity" : "file__image--no-opacity" + + const config = { + headers: {'Authorization': "Bearer " + window.localStorage.getItem("token")}, + responseType: 'arraybuffer' + }; + + await this.setState(() => ({ + ...this.state, + imageSrc: "/images/file-svg.svg", + imageClassname: this.props.listView ? "file__image__listview" : "file__image" + })) + + axios.get(currentURL +`/file-service/thumbnail/${thumbnailID}`, config).then((results) => { + + const imgFile = new Blob([results.data]); + const imgUrl = URL.createObjectURL(imgFile); + + this.setState(() => ({ + ...this.state, + imageSrc: imgUrl, + imageClassname: imageClassname + })) + + + }).catch((err) => { + console.log(err) + }) + } + + componentDidMount = () => { + + const hasThumbnail = this.props.metadata.hasThumbnail; + + if (hasThumbnail && !this.failedToLoad) { + this.getThumbnail(); + } + } + + shouldComponentUpdate = (nextProp, nextState) => { + + return (nextProp.itemSelected !== this.props.itemSelected + || nextProp.listView !== this.props.listView + || nextProp.rightSelected !== this.props.rightSelected + || nextState.imageSrc !== this.state.imageSrc + || nextState.imageClassname !== this.state.imageClassname + || this.props.filename !== nextProp.filename + || this.props.metadata.transcoded !== nextProp.metadata.transcoded) + } + + + componentDidUpdate = (nextProp) => { + + console.log("file item component updated") + + const hasThumbnail = this.props.metadata.hasThumbnail; + + if (hasThumbnail && !this.failedToLoad && nextProp.listView !== this.props.listView) { + + this.getThumbnail(); + + } else if (nextProp.listView !== this.props.listView) { + + this.setState(() => ({ + ...this.state, + imageClassname: this.props.listView ? "file__image__listview" : "file__image" + })) + } + } + + getContextMenu = (e) => { + + e.preventDefault(); + + const isMobile = mobileCheck(); + + const windowX = window.innerWidth; + const windowY = window.innerHeight; + + let styleObj = {right:0, left:0, top: "-38px", bottom: 0} + + const clientY = e.nativeEvent.clientY; + const clientX = e.nativeEvent.clientX; + + if (clientY < (windowY / 3)) { + + styleObj = {bottom:"-190px", top:"unset"} + } + + if (clientY > ((windowY / 4) * 3.5)) { + + styleObj = {bottom:"unset", top: "-190px"} + } + + if (clientX > windowX / 2) { + + styleObj = {...styleObj, left:"unset", right:0} + + } else { + + styleObj = {...styleObj, left:0, right:"unset"} + } + + if (isMobile) { + + styleObj = {bottom: 0, left: "2px", top: "unset", right: "unset"} + } + + this.setState(() => ({...this.state, contextMenuPos: styleObj})) + + this.props.dispatch(startSetSelectedItem(this.props._id, true, false)) + this.props.dispatch(setLastSelected(0)); + this.props.dispatch(setRightSelected(this.props._id)) + + } + + getWrapperClassname = () => { + + let classname = ""; + + if (this.props.listView) { + + classname += "file__item__listview" + + } else { + + classname += "file__item" + } + + if (this.props._id === this.props.selected) { + + classname += " file__item--selected" + } + + return classname; + } + + render() { + + return + } +} + +const connectStateToProp = (state) => ({ + listView: state.filter.listView, + rightSelected: state.selectedItem.rightSelected, + resetSelected: state.selectedItem.resetSelected, + selected: state.selectedItem.selected +}) + +export default connect(connectStateToProp)(FileItemContainer) \ No newline at end of file diff --git a/src/components/Filter/Filter.js b/src/components/Filter/Filter.js new file mode 100644 index 0000000..152861f --- /dev/null +++ b/src/components/Filter/Filter.js @@ -0,0 +1,48 @@ +import React from "react"; + +const Filter = (props) => { + + const filterOptionType = props.getFilterOptionType(); + const filterOptionValue = props.getFilterOptionValue(); + + return ( + +
+ +
+ + {props.folderListLength === 0 ? + + undefined + : + (
+

Folders

+
)} + +
+ +
+ +
+ + +
+ +
+ + +
+ +
+ +
+ ) +} + + +export default Filter diff --git a/src/components/Filter/index.js b/src/components/Filter/index.js new file mode 100644 index 0000000..a28c498 --- /dev/null +++ b/src/components/Filter/index.js @@ -0,0 +1,115 @@ +import Filter from "./Filter"; +import {setSortBy} from "../../actions/filter"; +import {startSetFiles} from "../../actions/files" +import {startSetFolders} from "../../actions/folders"; +import {resetItems} from "../../actions/main" +import {connect} from "react-redux"; +import React from "react"; + +class FilterContainer extends React.Component { + + constructor(props) { + super(props); + } + + changeOrder = () => { + + const sortBySwitch = this.props.filter.sortBy.split("_"); + const sortByPrefix = sortBySwitch[0]; + + if (this.props.filter.sortBy.includes("asc")) { + + return sortByPrefix + "_desc" + + } else { + + return sortByPrefix + "_asc" + } + } + + changeSortBy = async() => { + + const sortByString = this.changeOrder(); + + const parent = this.props.parent; + const search = this.props.filter.search; + + this.props.dispatch(setSortBy(sortByString)) + this.props.dispatch(startSetFiles(parent, sortByString, search)) + this.props.dispatch(startSetFolders(parent, sortByString, search)) + this.props.dispatch(resetItems()) + } + + changeSelected = (e) => { + + const sortBySwitch = this.props.filter.sortBy.split("_"); + const sortBySuffix = sortBySwitch[1]; + + if (sortBySwitch.includes("date")) { + + return "alp_" + sortBySuffix; + + } else { + + return "date_" + sortBySuffix; + } + + } + + selectedOnChange = async(e) => { + + const sortByString = this.changeSelected(); + + const parent = this.props.parent; + const search = this.props.filter.search; + + this.props.dispatch(setSortBy(sortByString)) + this.props.dispatch(startSetFiles(parent, sortByString, search)) + this.props.dispatch(startSetFolders(parent, sortByString, search)) + this.props.dispatch(resetItems()) + } + + getFilterOptionType = () => { + + if (this.props.filter.sortBy.includes("alp")) { + + return "name" + + } else { + + return "date" + } + } + + getFilterOptionValue = () => { + + if (this.props.filter.sortBy.includes("asc")) { + + return false; + + } else { + + return true; + } + } + + render() { + + return + + } +} + +const connectPropToStore = (state) => ({ + filter: state.filter, + folderListLength: state.folders.length, + parent: state.parent.parent +}) + + +export default connect(connectPropToStore)(FilterContainer); \ No newline at end of file diff --git a/src/components/FolderItem/FolderItem.js b/src/components/FolderItem/FolderItem.js new file mode 100644 index 0000000..fce7027 --- /dev/null +++ b/src/components/FolderItem/FolderItem.js @@ -0,0 +1,55 @@ +import ContextMenuFolder from ".././ContextMenuFolder"; +import moment from "moment"; +import React from "react"; + +const FolderItem = (props) => { + + const wrapperClassname = props.getClassName(); + + return ( + +
+ + {props.listView ? + +
props.folderClick(props._id, props.name)} + onContextMenu={(e) => props.getContextMenu(e)}> + +
+ +
{props.name}
+
+
{moment(props.createdAt).format("L")}
+ + {(props.rightSelected === props._id && props._id === props.selected) ? + + + : + undefined} +
+ + : + +
props.folderClick(props._id, props.name)} + onContextMenu={(e) => props.getContextMenu(e)}> + + +

{props.name}

+ + {(props.rightSelected === props._id && props._id === props.selected) ? + + + : + undefined} + +
+ + } + +
+ ) +} + +export default FolderItem; \ No newline at end of file diff --git a/src/components/FolderItem/index.js b/src/components/FolderItem/index.js new file mode 100644 index 0000000..1e82711 --- /dev/null +++ b/src/components/FolderItem/index.js @@ -0,0 +1,112 @@ +import FolderItem from "./FolderItem" +import {startSetSelectedItem, setRightSelected, setLastSelected} from "../../actions/selectedItem" +import mobileCheck from "../../utils/mobileCheck" +import {connect} from "react-redux"; +import React from "react"; + +class FolderItemContainer extends React.Component { + + constructor(props) { + super(props) + } + + shouldComponentUpdate = (nextProp) => { + + return (nextProp.itemSelected !== this.props.itemSelected + || nextProp.listView !== this.props.listView + || nextProp.rightSelected !== this.props.rightSelected + || nextProp.name !== this.props.name + || nextProp.quickFilesLength !== this.props.quickFilesLength) + } + + getContextMenu = (e) => { + + e.preventDefault(); + + const isMobile = mobileCheck(); + + const windowX = window.innerWidth; + const windowY = window.innerHeight; + + let styleObj = {right:0, left:0, top: "-14px", bottom: 0} + + const clientY = e.nativeEvent.clientY; + const clientX = e.nativeEvent.clientX; + + + if (clientY < (windowY / 3)) { + + const bottomSize = this.props.quickFilesLength === 0 ? "-126px" : "-190px" + + styleObj = {bottom: bottomSize, top:"unset"} + } + + if (clientY > ((windowY / 4) * 3.5)) { + + styleObj = {bottom:"unset", top: "-190px"} + } + + if (clientX > windowX / 2) { + + styleObj = {...styleObj, left:"unset", right:0} + + } else { + + styleObj = {...styleObj, left:0, right:"unset"} + } + + if (isMobile) { + + styleObj = {bottom: 0, left: "2px", top:"unset"} + } + + this.setState(() => styleObj) + + this.props.dispatch(startSetSelectedItem(this.props._id, false)) + this.props.dispatch(setLastSelected(0)); + this.props.dispatch(setRightSelected(this.props._id)) + + } + + getClassName = () => { + + let classname = ""; + + if (this.props.listView) { + + classname += "file__item__listview" + + } else { + + classname += "folder__item__wrapper" + } + + if (this.props._id === this.props.selected) { + + classname += " file__item--selected" + } + + return classname; + } + + + render() { + + return + } + +} + +const connectPropToState = (state) => ({ + listView: state.filter.listView, + rightSelected: state.selectedItem.rightSelected, + resetSelected: state.selectedItem.resetSelected, + selected: state.selectedItem.selected, + quickFilesLength: state.quickFiles.length +}) + +export default connect(connectPropToState)(FolderItemContainer); \ No newline at end of file diff --git a/src/components/Header/Header.js b/src/components/Header/Header.js new file mode 100644 index 0000000..566e34d --- /dev/null +++ b/src/components/Header/Header.js @@ -0,0 +1,39 @@ +import SuggestedItem from ".././SuggestedItem"; +import React from "react"; +import uuid from "uuid"; + +const Header = (props) => ( +
+ + + +
+ + + +
+ + {props.state.suggestedList.folderList.map((suggested) => { + + return + })} + + {props.state.suggestedList.fileList.map((suggested) => { + + return + })} + +
+ +
+ + +
+) + +export default Header \ No newline at end of file diff --git a/src/components/Header/index.js b/src/components/Header/index.js new file mode 100644 index 0000000..65b8f0f --- /dev/null +++ b/src/components/Header/index.js @@ -0,0 +1,156 @@ +import Header from "./Header"; +import {startLogout} from "../../actions/auth" +import {showSettings} from "../../actions/settings"; +import {setSearch} from "../../actions/filter" +import {loadMoreItems} from "../../actions/main"; +import {setParent, resetParentList} from "../../actions/parent"; +import {startSetFiles} from "../../actions/files"; +import {startSetFolders} from "../../actions/folders"; +import env from "../../enviroment/envFrontEnd"; +import {history} from "../../routers/AppRouter"; +import axios from "axios"; +import {connect} from "react-redux"; +import React from "react"; + +const currentURL = env.url; + +class HeaderContainer extends React.Component { + + constructor(props) { + super(props); + + this.searchValue = ""; + + this.state = { + focused: false, + suggestedList: { + fileList: [], + folderList: [] + } + } + } + + searchEvent = (e) => { + e.preventDefault(); + + const value = this.props.search; + + const parent = "/" + this.props.dispatch(setParent(parent)) + this.props.dispatch(loadMoreItems(true)) + this.props.dispatch(startSetFiles(undefined, undefined, value)); + this.props.dispatch(startSetFolders(undefined, undefined, value)); + this.props.dispatch(resetParentList()) + + + } + + searchOnChange = (e) => { + + const value = e.target.value; + this.searchValue = value; + + this.props.dispatch(setSearch(value)) + this.searchSuggested() + } + + showSuggested = () => { + + this.setState(() => { + return { + ...this.state, + focused: true + } + }) + } + + hideSuggested = () => { + + this.setState(() => { + return { + ...this.state, + focused: false + } + }) + } + + selectSuggested = (value) => { + + history.push(`/search/${value}`) + + this.setState(() => { + return { + ...this.state, + suggestedList: { + fileList: [], + folderList: [] + } + } + }) + } + + searchSuggested = () => { + + const config = { + headers: {'Authorization': "Bearer " + window.localStorage.getItem("token")} + }; + + + if (this.searchValue === "") { + + return this.setState(() => { + return { + ...this.state, + suggestedList: { + fileList: [], + folderList: [] + } + } + }) + } + + axios.get(currentURL +`/file-service/suggested-list?search=${this.searchValue}`, config).then((results) => { + + this.setState(() => { + return { + ...this.state, + suggestedList: results.data + } + }) + + + }).catch((err) => { + console.log(err) + }) + } + + showSettings = () => { + + this.props.dispatch(showSettings()) + } + + logoutUser = () => { + + this.props.dispatch(startLogout()) + } + + render() { + + return
+ } +} + +const connectPropToStore = (state) => ({ + search: state.filter.search +}) + +export default connect(connectPropToStore)(HeaderContainer); \ No newline at end of file diff --git a/src/components/Homepage/HomePage.js b/src/components/Homepage/HomePage.js new file mode 100644 index 0000000..de3dfbb --- /dev/null +++ b/src/components/Homepage/HomePage.js @@ -0,0 +1,28 @@ +import Header from ".././Header"; +import LeftSection from ".././LeftSection" +import MainSection from ".././MainSection"; +import Uploader from ".././Uploader"; +import SettingsMenu from ".././SettingsMenu"; +import React from "react"; +import PhotoViewer from "../PhotoViewer" + +const HomePage = (props) => ( + +
+
+
+ + + + + + {props.photoID.length === 0 ? undefined : + } + +
+
+ +) + +export default HomePage + diff --git a/src/components/Homepage/index.js b/src/components/Homepage/index.js new file mode 100644 index 0000000..e65f31b --- /dev/null +++ b/src/components/Homepage/index.js @@ -0,0 +1,232 @@ +import HomePage from "./HomePage"; +import {startLoginCheck} from "../../actions/auth"; +import {startSetStorage} from "../../actions/storage" +import {startSetQuickFiles, setQuickFiles} from "../../actions/quickFiles" +import {resetSelectedItem, resetSelected, setLastSelected, setRightSelected} from "../../actions/selectedItem" +import {startSetFiles} from "../../actions/files" +import {startSetFolders} from "../../actions/folders" +import {goneSideBar, loadMoreItems} from "../../actions/main"; +import {setParent,resetParentList, startSetParentList, setParentList} from "../../actions/parent" +import {enableListView, setSearch, setCurrentlySearching, resetCurrentlySearching} from "../../actions/filter" +import {setCurrentRoute, resetCurrentRoute} from "../../actions/routes"; +import {history} from "../../routers/AppRouter"; +import uuid from "uuid"; +import {connect} from "react-redux"; +import React from "react"; + +class HomePageContainer extends React.Component { + + constructor(props) { + super(props); + + this.lastLocationKey = ""; + } + + listStyleCheck = () => { + + if (window.localStorage.getItem("list-style") === "List") { + + this.props.dispatch(resetSelected()) + this.props.dispatch(enableListView()) + } + } + + loginCheck = () => { + + console.log("login check", this.props.isAuthenticated); + + const pathname = history.location.pathname; + + if (this.props.isAuthenticated) { + + if (pathname === "/home") { + this.getFiles(); + this.props.dispatch(setParent("/")) + this.props.dispatch(resetParentList()); + + } else if (pathname.includes("/search")) { + this.props.dispatch(startSetQuickFiles()); + } + + this.props.dispatch(resetCurrentRoute()); + this.props.dispatch(startSetStorage()); + this.props.dispatch(resetCurrentlySearching()); + this.props.dispatch(startSetStorage()); + + } else { + + const currentPath = history.location.pathname; + console.log("hisory", currentPath); + this.props.dispatch(setCurrentRoute(currentPath)) + history.push("/") + } + + } + + historyUpdateCheck = () => { + + console.log("history update check"); + + const pathname = history.location.pathname + + if (pathname === "/home") { + + this.getFiles(); + this.props.dispatch(startSetStorage()); + this.props.dispatch(resetCurrentlySearching()); + this.props.dispatch(setParent("/")) + this.props.dispatch(resetParentList()); + this.props.dispatch(startSetStorage()); + + } else if (pathname.includes("/folder")) { + + const sortBy = this.props.sortBy + const idSplit = history.location.pathname.split("/folder/"); + const id = idSplit[1]; + + this.props.dispatch(setQuickFiles([])); + this.props.dispatch(setLastSelected(0)); + this.props.dispatch(resetSelectedItem()) + this.props.dispatch(resetCurrentlySearching()); + this.props.dispatch(setLastSelected(0)); + this.props.dispatch(resetSelected()); + this.props.dispatch(setParent(id)); + this.props.dispatch(startSetParentList(id)) + this.props.dispatch(startSetFolders(id, sortBy)); + this.props.dispatch(startSetFiles(id, sortBy)); + this.props.dispatch(setRightSelected("")) + this.props.dispatch(startSetStorage()); + this.props.dispatch(loadMoreItems(true)) + + } else { + + const currentPathnameSplit = pathname.split("/search/"); + const value = currentPathnameSplit[1]; + const parent = "/" + + this.props.dispatch(setCurrentlySearching()); + this.props.dispatch(setParent(parent)) + this.props.dispatch(loadMoreItems(true)) + this.props.dispatch(startSetFiles(undefined, undefined, value)); + this.props.dispatch(startSetFolders(undefined, undefined, value)); + this.props.dispatch(setParent) + this.props.dispatch(setParentList(["/"], ["Home"])) + this.props.dispatch(setSearch("")) + this.props.dispatch(startSetStorage()); + + } + + } + + componentDidMount = () => { + + console.log("Homepage mounted"); + window.addEventListener("resize", () => {this.props.dispatch(goneSideBar())}) + + this.listStyleCheck(); + this.loginCheck(); + this.setSessionStorage(); + // this.historyUpdateCheck(); + } + + setSessionStorage = () => { + + window.sessionStorage.setItem("uuid", uuid()); + } + + componentWillUnmount = () => { + + window.removeEventListener("resize", () => {}); + } + + + + historyUpdateCheckRefresh = () => { + + const currentPathname = history.location.pathname + + if (this.lastLocationKey !== history.location.key && currentPathname !== "/home" && currentPathname.includes("/search")) { + + console.log("search update"); + + const currentPathnameSplit = currentPathname.split("/search/"); + const value = currentPathnameSplit[1]; + const parent = "/" + + this.props.dispatch(setParent(parent)) + this.props.dispatch(loadMoreItems(true)) + this.props.dispatch(startSetFiles(undefined, undefined, value)); + this.props.dispatch(startSetFolders(undefined, undefined, value)); + this.props.dispatch(setCurrentlySearching()); + this.props.dispatch(setParentList(["/"], ["Home"])) + this.props.dispatch(setSearch("")) + this.props.dispatch(startSetStorage()); + + + } else if (this.lastLocationKey !== history.location.key && history.location.pathname !== "/home") { + + console.log("folder update"); + + const sortBy = this.props.sortBy + const idSplit = history.location.pathname.split("/folder/"); + const id = idSplit[1]; + + this.props.dispatch(setQuickFiles([])); + this.props.dispatch(setLastSelected(0)); + this.props.dispatch(resetSelectedItem()) + this.props.dispatch(resetCurrentlySearching()); + this.props.dispatch(setLastSelected(0)); + this.props.dispatch(resetSelected()); + this.props.dispatch(setParent(id)); + this.props.dispatch(startSetParentList(id)) + this.props.dispatch(loadMoreItems(true)) + this.props.dispatch(startSetFolders(id, sortBy)); + this.props.dispatch(startSetFiles(id, sortBy)); + this.props.dispatch(setRightSelected("")) + this.props.dispatch(startSetStorage()); + + } else if (this.lastLocationKey !== history.location.key) { + + console.log("home update"); + + + this.getFiles(); + this.props.dispatch(startSetStorage()); + this.props.dispatch(resetCurrentlySearching()); + this.props.dispatch(setParent("/")) + this.props.dispatch(resetParentList()); + this.props.dispatch(startSetStorage()); + } + + this.lastLocationKey = history.location.key + } + + componentDidUpdate = () => { + + this.historyUpdateCheckRefresh(); + } + + getFiles = () => { + + this.props.dispatch(startSetQuickFiles()) + this.props.dispatch(startSetFolders()); + this.props.dispatch(startSetFiles()) + } + + goHome = () => { + history.push("/home") + } + + render() { + + return + } +} + +const mapStoreToProps = (state) => ({ + sortBy: state.filter.sortBy, + isAuthenticated: !!state.auth.id, + photoID: state.photoViewer.id +}) + +export default connect(mapStoreToProps)(HomePageContainer); \ No newline at end of file diff --git a/src/components/LeftSection/LeftSection.js b/src/components/LeftSection/LeftSection.js new file mode 100644 index 0000000..51a1a26 --- /dev/null +++ b/src/components/LeftSection/LeftSection.js @@ -0,0 +1,56 @@ +import StorageWidget from ".././StorageWidget"; +import React from "react"; + +class LeftSection extends React.Component { + + constructor(props) { + super(props); + } + + render() { + + return ( + +
+ +
+ + + +

New

+ +
+
+ +

Folder

+
+ +
+ + +

File Upload

+ + +
+ +
+ +

Folder Upload

+
+
+ +
+ + {this.props.storage.total !== 0 ? + + : undefined} + +
+ + + ) + } +} + +export default LeftSection; diff --git a/src/components/LeftSection/index.js b/src/components/LeftSection/index.js new file mode 100644 index 0000000..aa44b1b --- /dev/null +++ b/src/components/LeftSection/index.js @@ -0,0 +1,95 @@ +import LeftSection from "./LeftSection"; +import {showAddOptions} from "../../actions/addOptions"; +import {startAddFile} from "../../actions/files"; +import {startAddFolder} from "../../actions/folders" +import Swal from "sweetalert2"; +import {connect} from "react-redux"; +import React from "react"; + +class LeftSectionContainer extends React.Component { + + constructor(props) { + super(props); + + this.wrapperRef = React.createRef(); + this.uploadInput = React.createRef(); + } + + createFolder = async(e) => { + + let inputValue = "" + + const { value: folderName} = await Swal.fire({ + title: 'Enter Folder Name', + input: 'text', + inputValue: inputValue, + showCancelButton: true, + inputValidator: (value) => { + if (!value) { + return 'Please Enter a Name' + } + } + }) + + if (folderName === undefined || folderName === null) { + + return; + } + + const parent = this.props.parent; + const owner = this.props.auth.id; + const parentList = this.props.parentList; + + this.props.dispatch(startAddFolder(folderName, owner, parent, parentList)); + } + + handleClickOutside = (e) => { + + if (this.wrapperRef && !this.wrapperRef.current.contains(event.target) && this.props.showAddOptions) { + this.addButtonEvent(); + } + } + + componentDidMount = () => { + document.addEventListener('mousedown', this.handleClickOutside); + } + + componentWillUnmount = () => { + document.removeEventListener('mousedown', this.handleClickOutside); + } + + addButtonEvent = () => { + + const currentAddOptions = !this.props.showAddOptions + this.props.dispatch(showAddOptions(currentAddOptions)) + } + + handleUpload = (e) => { + e.preventDefault(); + + this.props.dispatch(startAddFile(this.uploadInput.current, this.props.parent, this.props.parentList)) + this.uploadInput.current.value = "" + } + + render() { + + return + } +} + +const connectPropToState = (state) => ({ + auth: state.auth, + parent: state.parent.parent, + parentList: state.parent.parentList, + storage: state.storage, + showAddOptions: state.addOptions.showAddOptions +}) + +export default connect(connectPropToState)(LeftSectionContainer); \ No newline at end of file diff --git a/src/components/LoginPage/LoginPage.js b/src/components/LoginPage/LoginPage.js new file mode 100755 index 0000000..09733e3 --- /dev/null +++ b/src/components/LoginPage/LoginPage.js @@ -0,0 +1,69 @@ +import SpinnerLogin from ".././SpinnerLogin"; +import React from "react"; + +const LoginPage = (props) => { + + if (window.localStorage.getItem("token")) { + props.loginWithToken() + } + + return ( + +
+ + {(window.localStorage.getItem("token") && !props.loginFailed) ? + +
+ +
+ +
+ +
+
+ + +
+ + : + +
+
+
+

MyDrive

+
+ {props.emailInput = ref}}/> + {props.passwordInput = ref}}/> + {props.state.loginMode ? undefined : + {props.passwordInput = ref}}/> + } + +

{props.state.loginMode ? "Create Account": "Back To Login"}

+ + {props.loginFailed ? + +
+ +

{props.loginFailed}

+
+ + : + + undefined} + +
+
+
+
+ + } + +
+ + + + ) + +} + +export default LoginPage \ No newline at end of file diff --git a/src/components/LoginPage/index.js b/src/components/LoginPage/index.js new file mode 100644 index 0000000..c854d76 --- /dev/null +++ b/src/components/LoginPage/index.js @@ -0,0 +1,115 @@ +import LoginPage from "./LoginPage"; +import {startLogin, startLoginCheck, startCreateAccount} from "../../actions/auth" +import {setLoginFailed} from "../../actions/main"; +import {connect} from "react-redux"; +import React from "react"; + +class LoginPageContainer extends React.Component { + + constructor(props) { + super(props); + + this.state = { + value: undefined, + loginMode: true, + email: "", + password: "", + verifyPassword: "", + } + } + + loginWithToken = () => { + + const token = window.localStorage.getItem("token"); + this.props.dispatch(startLoginCheck(token, this.props.currentRoute)) + } + + login = (e) => { + + e.preventDefault(); + + const email = this.state.email + const password = this.state.password + const verifyPassword = this.state.verifyPassword; + + if (this.state.loginMode) { + + this.props.dispatch(startLogin(email, password, this.props.currentRoute)) + + } else if (password === verifyPassword) { + + this.props.dispatch(startCreateAccount(email, password)); + + } else { + + this.props.dispatch(setLoginFailed("Passwords Do Not Match")); + } + } + + switchLoginMode = () => { + + this.setState(() => { + + return { + ...this.state, + loginMode: !this.state.loginMode + } + }) + } + + emailOnChange = (e) => { + + const value = e.target.value; + + this.setState(() => ({ + ...this.state, + email: value + + })) + + } + + passwordOnChange = (e) => { + + const value = e.target.value; + + this.setState(() => ({ + ...this.state, + password: value + })) + + } + + verifyPasswordOnChange = (e) => { + + const value = e.target.value; + + this.setState(() => ({ + ...this.state, + verifyPassword: value + })) + } + + render() { + + return + + } + +} + +const mapStateToProps = (state) => ({ + id: state.auth.id, + loginFailed: state.main.loginFailed, + currentRoute: state.routes.currentRoute +}) + +export default connect(mapStateToProps)(LoginPageContainer) \ No newline at end of file diff --git a/src/components/MainSection/MainSection.js b/src/components/MainSection/MainSection.js new file mode 100644 index 0000000..3545864 --- /dev/null +++ b/src/components/MainSection/MainSection.js @@ -0,0 +1,76 @@ +import Subbar from ".././Subbar"; +import Filter from ".././Filter"; +import DataForm from ".././Dataform"; +import RightSection from ".././RightSection"; +import Spinner from ".././Spinner"; +import QuickAccess from ".././QuickAccess/index"; +import MoverMenu from ".././MoverMenu"; +import Spacer from ".././Spacer" +import PopupWindow from '.././PopupWindow' +import ShareMenu from ".././ShareMenu"; +import InfiniteScroll from 'react-infinite-scroller'; +import React from "react"; + + +const MainSection = React.forwardRef((props, ref) => { + + return ( +
+ + {props.showPopup ? : undefined} + + + +
+ +
+ + {(props.quickFiles.length !== 0 && props.parent === "/") ? +
+ + +
: + undefined} + + + + +
} + useWindow={false} + getScrollParent={() => props.scrollParentRef} + > + + + + + + + + {props.moverID.length === 0 ? undefined : + + } + +
+ + + +
+ + + + +) + +}) + + +export default MainSection \ No newline at end of file diff --git a/src/components/MainSection/index.js b/src/components/MainSection/index.js new file mode 100644 index 0000000..386219e --- /dev/null +++ b/src/components/MainSection/index.js @@ -0,0 +1,133 @@ + +import {startLoadMoreFiles} from "../../actions/files"; +import {startSetSelectedItem, setLastSelected} from "../../actions/selectedItem"; +import {setPopupFile} from "../../actions/popupFile"; +import mobileCheck from "../../utils/mobileCheck" +import MainSection from "./MainSection"; +import env from "../../enviroment/envFrontEnd"; +import axios from "axios"; +import {connect} from "react-redux"; +import {history} from "../../routers/AppRouter"; +import React from "react"; + +const currentURL = env.url; + +class MainSectionContainer extends React.Component { + + constructor(props) { + super(props); + } + + folderClick = (id) => { + + const currentDate = Date.now(); + const mobile = mobileCheck(); + const selectedID = this.props.selected; + + if ((currentDate - this.props.lastSelected < 1500 && selectedID === id) || mobile) { + + history.push(`/folder/${id}`) + + } else { + this.props.dispatch(startSetSelectedItem(id, false)); + } + + } + + fileClick = (fileID, file, fromQuickItems=false) => { + + const currentDate = Date.now(); + + let selectedFileID = fileID; + + if (fromQuickItems) { + selectedFileID = "quick-" + fileID; + } + + if (currentDate - this.props.lastSelected < 1500 && selectedFileID === this.props.selected) { + + this.props.dispatch(setPopupFile({showPopup: true, ...file})) + + } else { + + this.props.dispatch(startSetSelectedItem(fileID, true, fromQuickItems)) + + } + + } + + downloadFile = (fileID) => { + + const config = { + headers: {'Authorization': "Bearer " + window.localStorage.getItem("token")} + }; + + this.props.dispatch(setLastSelected(0)); + + axios.get(currentURL +'/file-service/download/get-token',config) + .then((response) => { + + const tempToken = response.data.tempToken; + const finalUrl = currentURL + `/file-service/download/${fileID}/${tempToken}` + + const link = document.createElement('a'); + document.body.appendChild(link); + link.href = finalUrl; + link.setAttribute('type', 'hidden'); + link.click(); + + }).catch((err) => { + console.log(err) + }) + } + + loadMoreItems = () => { + + console.log("loading more items", this.props.loading); + + let limit = window.localStorage.getItem("list-size") || 50 + limit = parseInt(limit) + + if (this.props.loading) { + + return; + } + + if (this.props.files.length >= limit) { + + const parent = this.props.parent; + const search = this.props.filter.search; + const sortBy = this.props.filter.sortBy; + const lastFileDate = this.props.files[this.props.files.length - 1].uploadDate + const lastFileName = this.props.files[this.props.files.length - 1].filename + + this.props.dispatch(startLoadMoreFiles(parent, sortBy, search, lastFileDate, lastFileName)) + } + } + + render() { + + return + } + +} + +const connectPropToState = (state) => ({ + filter: state.filter, + files: state.files, + allowLoadMoreItems: state.main.loadMoreItems, + loading: state.main.loading, + showPopup: state.popupFile.showPopup, + quickFiles: state.quickFiles, + selected: state.selectedItem.selected, + lastSelected: state.selectedItem.lastSelected, + parent: state.parent.parent, + moverID: state.mover.id, +}) + +export default connect(connectPropToState)(MainSectionContainer); \ No newline at end of file diff --git a/src/components/MoverMenu/MoverMenu.js b/src/components/MoverMenu/MoverMenu.js new file mode 100644 index 0000000..dcaec42 --- /dev/null +++ b/src/components/MoverMenu/MoverMenu.js @@ -0,0 +1,53 @@ +import React from "react"; +import moment from "moment"; + +const MoverMenu = (props) => ( +
+ + + +
+ + 0) ? + "movermenu__back-button" : "movermenu__back-button movermenu__back-button--disabled" + } onClick={props.goBack} src="/images/back.svg"/> +

{props.state.title}

+ 0) ? + "movermenu__home-button" : "movermenu__home-button movermenu__home-button--disabled" + } onClick={props.goHome} src="/images/home.svg"/> + +
+ +
+
+ +
+
+ +
+ {props.state.folders.map((folder) => { + + return
props.folderClick(folder._id, folder.name)} + > + +
+ +
{folder.name}
+
+ +
{moment(folder.createdAt).format("L")}
+ +
+ + })} +
+ +
+ +
+ +
+) + +export default MoverMenu; \ No newline at end of file diff --git a/src/components/MoverMenu/index.js b/src/components/MoverMenu/index.js new file mode 100644 index 0000000..884256b --- /dev/null +++ b/src/components/MoverMenu/index.js @@ -0,0 +1,310 @@ +import React from "react"; +import {connect} from "react-redux"; +import MoverMenu from "./MoverMenu"; +import axios from "axios"; +import env from "../../enviroment/envFrontEnd"; +import {resetMoverID} from "../../actions/mover"; +import {removeFile} from "../../actions/files"; +import {removeFolder} from "../../actions/folders" + +const currentURL = env.url; + +class MoverMenuContainer extends React.Component { + + constructor(props) { + super(props); + + this.state = { + folders: [], + selected: "", + lastClick: 0, + search: "", + title: "Home", + historyList: [] + } + } + + moveItem = () => { + + let id = this.props.ID; + + let parent = "/"; + + if (this.state.selected !== "") { + + parent = this.state.selected; + + } else if (this.state.historyList.length !== 0) { + + parent = this.state.historyList[this.state.historyList.length - 1].id; + } + + + const config = { + headers: {'Authorization': "Bearer " + window.localStorage.getItem("token")} + } + + const data = { + id, + parent + } + + if (this.props.isFile) { + + axios.patch(currentURL+`/file-service/move`, data, config).then((response) => { + + console.log("file moved!"); + + this.props.dispatch(removeFile(id)); + this.props.dispatch(resetMoverID()); + + }) + + } else { + + axios.patch(currentURL+`/folder-service/move`, data, config).then((response) => { + + console.log("folder moved!"); + + this.props.dispatch(removeFolder(id)); + this.props.dispatch(resetMoverID()); + + + }) + + } + + + } + + getButtonName = () => { + + + if (this.state.selected !== "") { + + return "Move To Folder"; + + } else if (this.state.historyList.length === 0) { + + return "Move To Home"; + + } else { + return "Move Here"; + } + } + + search = (e) => { + + e.preventDefault(); + + const searchValue = this.state.search; + + const id = "/" + + const config = { + headers: {'Authorization': "Bearer " + window.localStorage.getItem("token")} + } + + axios.get(currentURL+`/folder-service/list?parent=${id}&search=${searchValue}&sortBy=DEFAULT}`, config).then((response) => { + + let folders = response.data; + + if (!this.props.isFile) folders = folders.filter((folder) => + folder._id !== this.props.ID); + + console.log("folders", folders); + this.setState(() => ({ + ...this.state, + title: "Search", + folders, + selected: "", + historyList:[] + })) + }) + } + + inputChange = (e) => { + + const value = e.target.value; + + this.setState(() => ({ + ...this.state, + search: value + })) + } + + goHome = () => { + + const config = { + headers: {'Authorization': "Bearer " + window.localStorage.getItem("token")} + } + + const id = "/" + + axios.get(currentURL+`/folder-service/list?parent=${id}`, config).then((response) => { + + let folders = response.data; + + if (!this.props.isFile) folders = folders.filter((folder) => + folder._id !== this.props.ID); + + console.log("folders", folders); + this.setState(() => ({ + ...this.state, + folders, + title: "Home", + search: "", + selected: "", + historyList: [] + })) + + }).catch((err) => { + console.log(err); + }) + } + + goBack = () => { + + let currentID = "/" + let currentName = "Home" + let historyList = []; + + if (this.state.historyList.length > 1) { + + historyList = this.state.historyList; + historyList.pop(); + + currentID = this.state.historyList[this.state.historyList.length - 1].id; + currentName = this.state.historyList[this.state.historyList.length - 1].name; + + } else if (this.state.historyList.length !== 0) { + + historyList = this.state.historyList; + historyList.pop(); + } + + const config = { + headers: {'Authorization': "Bearer " + window.localStorage.getItem("token")} + } + + axios.get(currentURL+`/folder-service/list?parent=${currentID}`, config).then((response) => { + + let folders = response.data; + + if (!this.props.isFile) folders = folders.filter((folder) => + folder._id !== this.props.ID); + + console.log("folders", folders); + this.setState(() => ({ + ...this.state, + folders, + title: currentName, + search: "", + selected: "", + historyList + })) + }) + } + + closeMover = () => { + + this.props.dispatch(resetMoverID()); + } + + folderClick = (id, name) => { + + const date = new Date(); + const currentTime = date.getTime(); + const lastTimeDifference = currentTime - this.state.lastClick; + + if (lastTimeDifference < 1500 && id === this.state.selected) { + + const config = { + headers: {'Authorization': "Bearer " + window.localStorage.getItem("token")} + } + + axios.get(currentURL+`/folder-service/list?parent=${id}`, config).then((response) => { + + let folders = response.data; + + if (!this.props.isFile) folders = folders.filter((folder) => + folder._id !== this.props.ID); + + const historyList = this.state.historyList; + historyList.push({id, name}); + console.log("folders", folders); + this.setState(() => ({ + ...this.state, + folders, + title: name, + search: "", + selected: "", + historyList + })) + + }).catch((err) => { + console.log(err); + }) + + } else { + + this.setState(() => ({ + ...this.state, + selected: id, + lastClick: currentTime, + })) + } + } + + componentDidMount = () => { + + console.log("Mover Mounted", this.props.ID, this.props.parent) + + const config = { + headers: {'Authorization': "Bearer " + window.localStorage.getItem("token")} + } + + const id = "/" + + axios.get(currentURL+`/folder-service/list?parent=${id}`, config).then((response) => { + + let folders = response.data; + + if (!this.props.isFile) folders = folders.filter((folder) => + folder._id !== this.props.ID); + + console.log("folders", folders); + + this.setState(() => ({ + ...this.state, + folders + })) + + }).catch((err) => { + console.log(err); + }) + } + + render() { + + return + } + +} + +const connectStateToProps = (state) => ({ + ID: state.mover.id, + parent: state.mover.parent, + isFile: state.mover.isFile +}) + +export default connect(connectStateToProps)(MoverMenuContainer); \ No newline at end of file diff --git a/src/components/PhotoViewer/PhotoViewer.js b/src/components/PhotoViewer/PhotoViewer.js new file mode 100644 index 0000000..c6f7ddd --- /dev/null +++ b/src/components/PhotoViewer/PhotoViewer.js @@ -0,0 +1,21 @@ +import React from "react"; +import Spinner from "../Spinner"; + +const PhotoViewer = (props) => ( +
+ + + + {props.state.image === "" ? +
+ +
+ : + + } + + +
+) + +export default PhotoViewer; \ No newline at end of file diff --git a/src/components/PhotoViewer/index.js b/src/components/PhotoViewer/index.js new file mode 100644 index 0000000..33480d1 --- /dev/null +++ b/src/components/PhotoViewer/index.js @@ -0,0 +1,56 @@ +import PhotoViewer from "./PhotoViewer"; +import {connect} from "react-redux"; +import env from "../../enviroment/envFrontEnd"; +import React from "react"; +import {resetPhotoID} from "../../actions/photoViewer"; +import axios from "axios"; + +const currentURL = env.url; + +class PhotoViewerContainer extends React.Component { + + constructor(props) { + super(props); + + this.state = { + image: "" + } + } + + closePhotoViewer = () => { + + this.props.dispatch(resetPhotoID()) + } + + componentDidMount = () => { + + const config = { + headers: {'Authorization': "Bearer " + window.localStorage.getItem("token")}, + responseType: 'arraybuffer' + }; + + axios.get(currentURL +`/file-service/full-thumbnail/${this.props.photoID}`, config).then((response) => { + + const imgFile = new Blob([response.data]); + const imgUrl = URL.createObjectURL(imgFile); + + this.setState(() => ({ + ...this.state, + image: imgUrl + })) + }) + } + + render() { + + return + } +} + +const connectStateToProp = (state) => ({ + photoID: state.photoViewer.id +}) + +export default connect(connectStateToProp)(PhotoViewerContainer); \ No newline at end of file diff --git a/src/components/PopupWindow/PopupWindow.js b/src/components/PopupWindow/PopupWindow.js new file mode 100644 index 0000000..bc446c4 --- /dev/null +++ b/src/components/PopupWindow/PopupWindow.js @@ -0,0 +1,53 @@ +import Spinner from ".././Spinner"; +import capitalize from "../../utils/capitalize"; +import React from "react"; + +class PopupWindow extends React.Component { + + constructor(props) { + super(props); + + } + + render() { + + + return ( +
+ +

{capitalize(this.props.popupFile.filename)}

+ + {!this.props.popupFile.metadata.isVideo ? + +
+ + {!this.props.popupFile.metadata.hasThumbnail ?

No Preview Available

: undefined} + + {!this.props.popupFile.metadata.hasThumbnail ? + : } + +
+ {!this.props.popupFile.metadata.hasThumbnail ? undefined : } +
+
+ : + + } + + + +
+ ) + } + +} + + +export default PopupWindow + diff --git a/src/components/PopupWindow/index.js b/src/components/PopupWindow/index.js new file mode 100644 index 0000000..78d8e38 --- /dev/null +++ b/src/components/PopupWindow/index.js @@ -0,0 +1,160 @@ +import PopupWindow from "./PopupWindow"; +import {hidePopup} from "../../actions/popupFile" +import axios from "axios"; +import env from "../../enviroment/envFrontEnd"; +import {connect} from "react-redux"; +import React from "react"; +import { setPhotoID } from "../../actions/photoViewer"; + +const currentURL = env.url; + +class PopupWindowContainer extends React.Component { + + constructor(props) { + super(props); + + this.wrapperRef = React.createRef(); + this.video = React.createRef(); + this.imageData = "" + this.tempToken = "" + + this.state = { + image: "/images/cloud-svg.svg", + imageClassname: this.props.popupFile.metadata.hasThumbnail ? "popup-window__image popup-window popup-window--gone" : "popup-window__image", + video: "", + spinnerClassname: "popup-window__spinner__wrapper" + } + } + + getThumbnail = () => { + + const thumbnailID = this.props.popupFile.metadata.thumbnailID + + const config = { + headers: {'Authorization': "Bearer " + window.localStorage.getItem("token")}, + responseType: 'arraybuffer' + }; + + axios.get(currentURL +`/file-service/thumbnail/${thumbnailID}`, config).then((results) => { + + const imgFile = new Blob([results.data]); + const imgUrl = URL.createObjectURL(imgFile); + + this.setState(() => ({ + ...this.state, + image: imgUrl, + imageClassname: "popup-window__image popup-window__image--loaded", + spinnerClassname: "popup-window__spinner__wrapper popup-window--gone" + + })) + + }).catch((err) => { + console.log(err) + }) + } + + handleClickOutside = (e) => { + + if (this.wrapperRef && !this.wrapperRef.current.contains(event.target)) { + this.props.dispatch(hidePopup()) + } + } + + getVideo = () => { + + const config = { + headers: {'Authorization': "Bearer " + window.localStorage.getItem("token"), + uuid: window.sessionStorage.getItem("uuid") + }, + + }; + + axios.get(currentURL +'/file-service/download/get-token-video',config) + .then((response) => { + + this.tempToken = response.data.tempToken; + + const uuidID = window.sessionStorage.getItem("uuid"); + + const finalUrl = !this.props.popupFile.metadata.transcoded ? currentURL + `/file-service/stream-video/${this.props.popupFile._id}/${this.tempToken}/${uuidID}` + : currentURL + `/file-service/stream-video-transcoded/${this.props.popupFile._id}/${this.tempToken}/${uuidID}` + + this.setState(() => ({ + ...this.state, + video: finalUrl + })) + + }).catch((err) => { + console.log(err) + }) + } + + componentWillUnmount = () => { + + document.removeEventListener('mousedown', this.handleClickOutside); + + const headers = {'Authorization': "Bearer " + window.localStorage.getItem("token")} + + if (this.props.popupFile.metadata.isVideo) { + + axios.delete(currentURL +`/file-service/remove/token-video/${this.tempToken}`, { + headers, + }).catch((err) => { + console.log(err); + }) + + this.video.current.pause(); + + this.setState(() => ({ + ...this.state, + video: "" + })) + } + } + + componentDidMount = () => { + + document.addEventListener('mousedown', this.handleClickOutside); + + if (this.props.popupFile.metadata.hasThumbnail) { + + this.getThumbnail() + + } else if (this.props.popupFile.metadata.isVideo) { + + this.getVideo(); + } + } + + hidePopupWindow = () => { + + this.props.dispatch(hidePopup()); + } + + setPhotoViewerWindow = () => { + + console.log("set photoviewer window", this.props.popupFile._id); + this.props.dispatch(setPhotoID(this.props.popupFile._id)) + } + + render() { + + return + } + +} + +const connectPropToState = (state) => ({ + + popupFile: state.popupFile, +}) + + +export default connect(connectPropToState)(PopupWindowContainer) diff --git a/src/components/QuickAccess/QuickAccess.js b/src/components/QuickAccess/QuickAccess.js new file mode 100644 index 0000000..d144c6e --- /dev/null +++ b/src/components/QuickAccess/QuickAccess.js @@ -0,0 +1,18 @@ +import QuickAccessItem from ".././QuickAccessItem"; +import React from "react"; + +const QuickAccess = (props) => ( +
+ + {props.quickFiles + .map((file) => )} + +
+) + + +export default QuickAccess; \ No newline at end of file diff --git a/src/components/QuickAccess/index.js b/src/components/QuickAccess/index.js new file mode 100644 index 0000000..4488015 --- /dev/null +++ b/src/components/QuickAccess/index.js @@ -0,0 +1,21 @@ +import QuickAccess from "./QuickAccess"; +import {connect} from "react-redux"; +import React from "react"; + +class QuickAccessContainer extends React.Component { + + constructor(props) { + super(props); + } + + render() { + return + } + +} + +const connectStateToProp = (state) => ({ + quickFiles: state.quickFiles +}) + +export default connect(connectStateToProp)(QuickAccessContainer) \ No newline at end of file diff --git a/src/components/QuickAccessItem/QuickAccessItem.js b/src/components/QuickAccessItem/QuickAccessItem.js new file mode 100644 index 0000000..19996f5 --- /dev/null +++ b/src/components/QuickAccessItem/QuickAccessItem.js @@ -0,0 +1,33 @@ +import ContextMenu from ".././ContextMenu" +import capitalize from "../../utils/capitalize"; +import moment from "moment"; +import React from "react"; + +const QuickAccessItem = (props) => ( + +
{props.fileClick(props._id, props, true)}} + onContextMenu={(e) => props.getContextMenu(e)}> + +
+ {props.image.src = "/images/file-svg.svg"; props.image.className="quickaccess__item__image"; props.failedToLoad = true}}/> + +
+ +
+

{capitalize(props.filename)}

+

Created {moment(props.uploadDate).calendar()}

+
+ + {("quick-"+props._id === props.rightSelected) ? + + + : + undefined} + + + +
+) + +export default QuickAccessItem + diff --git a/src/components/QuickAccessItem/index.js b/src/components/QuickAccessItem/index.js new file mode 100644 index 0000000..60907c8 --- /dev/null +++ b/src/components/QuickAccessItem/index.js @@ -0,0 +1,121 @@ +import QuickAccessItem from "./QuickAccessItem" +import {setRightSelected, setLastSelected, setSelected} from "../../actions/selectedItem" +import mobileCheck from "../../utils/mobileCheck" +import env from "../../enviroment/envFrontEnd"; +import axios from "axios"; +import {connect} from "react-redux"; +import React from "react"; + +const currentURL = env.url; + +class QuickAccessItemContainer extends React.Component { + + constructor(props) { + super(props); + + this.failedToLoad = false; + + this.state = { + contextMenuPos: {}, + image: "/images/file-svg.svg", + imageClassname: "quickaccess__item__image" + } + } + + componentDidMount = () => { + + const hasThumbnail = this.props.metadata.hasThumbnail; + + if (hasThumbnail && !this.failedToLoad) { + this.getThumbnail(); + } + } + + getThumbnail = async() => { + + const thumbnailID = this.props.metadata.thumbnailID; + const imageClassname = "quickaccess__item__image quickaccess__item__image--no-opacity" + + const config = { + headers: {'Authorization': "Bearer " + window.localStorage.getItem("token")}, + responseType: 'arraybuffer' + }; + + await this.setState(() => ({ + ...this.state, + iimage: "/images/file-svg.svg", + imageClassname: "quickaccess__item__image" + })) + + axios.get(currentURL +`/file-service/thumbnail/${thumbnailID}`, config).then((results) => { + + const imgFile = new Blob([results.data]); + const imgUrl = URL.createObjectURL(imgFile); + + this.setState(() => ({ + ...this.state, + image: imgUrl, + imageClassname: imageClassname + })) + + }).catch((err) => { + console.log(err) + }) + } + getContextMenu = (e) => { + + e.preventDefault(); + + const isMobile = mobileCheck() + + const windowX = window.innerWidth; + const windowY = window.innerHeight; + + let styleObj = {right:0, left:0, top: "-3px", bottom: 0} + + const clientY = e.nativeEvent.clientY; + const clientX = e.nativeEvent.clientX; + + if (clientX > windowX / 2) { + + styleObj = {...styleObj, left:"unset", right:0} + + } else { + + styleObj = {...styleObj, left:0, right:"unset"} + } + + if (isMobile) { + + styleObj = {bottom: 0, left: "2px"} + } + + this.setState(() => ({ + ...this.state, + contextMenuPos: styleObj + })) + + this.props.dispatch(setSelected("quick-"+this.props._id)) + this.props.dispatch(setRightSelected("quick-"+this.props._id)) + this.props.dispatch(setLastSelected(0)); + } + + + + render() { + + return + } + +} + +const connectStateToProp = (state) => ({ + rightSelected: state.selectedItem.rightSelected, + selected: state.selectedItem.selected +}) + +export default connect(connectStateToProp)(QuickAccessItemContainer); + diff --git a/src/components/RightSection/RightSection.js b/src/components/RightSection/RightSection.js new file mode 100644 index 0000000..a8aa4e9 --- /dev/null +++ b/src/components/RightSection/RightSection.js @@ -0,0 +1,57 @@ +import RightSectionDetail from ".././RightSectionDetail" +import capitalize from "../../utils/capitalize"; +import bytes from "bytes"; +import moment from "moment"; +import React from "react"; + +const RightSection = (props) => { + + props.resetState(); + + props.prevID = props.selectedItem.id; + + return ( + +
+ + {props.selectedItem.name === "" ? + ( +
+ +

Select a file or folder to view its details

+
+ ) + : + ( +
+
+

{capitalize(props.selectedItem.name)}

+ +
+ +
+ {props.selectedItem.file ? () : ()} + {props.selectedItem.file ? () : undefined} + + + {props.selectedItem.isVideo ? + : + undefined} + + {props.selectedItem.link ? + props.getPublicStatus() + : undefined} + + {props.getTranscodeButton(props)} + +
+
+ )} + +
+ ) + +} + + +export default RightSection; \ No newline at end of file diff --git a/src/components/RightSection/index.js b/src/components/RightSection/index.js new file mode 100644 index 0000000..adfd2e9 --- /dev/null +++ b/src/components/RightSection/index.js @@ -0,0 +1,189 @@ +import RightSection from "./RightSection"; +import RightSectionDetail from ".././RightSectionDetail" +import {editFileMetadata} from "../../actions/files" +import {resetSelectedItem} from "../../actions/selectedItem"; +import env from "../../enviroment/envFrontEnd"; +import axios from "axios"; +import {connect} from "react-redux"; +import React from "react"; + +const currentURL = env.url; + +class RightSectionContainer extends React.Component { + + constructor(props) { + super(props); + + this.state = { + optimizing: false, + optimizing_finished: false, + optimizing_removed: false + } + + this.prevID = "" + } + + getFileExtension = (filename) => { + + const filenameSplit = filename.split("."); + + if (filenameSplit.length > 1) { + + const extension = filenameSplit[filenameSplit.length - 1] + + return extension.toUpperCase(); + + } else { + + return "Unknown" + } + + + } + + getSidebarClassName = (value) => { + + if (value==="gone") { + return "section section--right section--no-animation" + } else if (value) { + return "section section--right" + } else { + return "section section--right section--minimized" + } + } + + removeTranscodeVideo = (props, e) => { + + const headers = {'Authorization': "Bearer " + window.localStorage.getItem("token")} + + const data = {id: props.selectedItem.id} + + axios.delete(currentURL +'/file-service/transcode-video/remove', { + headers, + data + }).then(() => { + + this.props.dispatch(editFileMetadata(props.selectedItem.id, {transcoded: undefined})) + + this.setState(() => ({ + ...this.state, + optimizing: false, + optimizing_finished: false, + optimizing_removed: true + })) + + }).catch((err) => { + console.log(err) + }) + } + + transcodeVideo = (props, e) => { + + const config = { + headers: {'Authorization': "Bearer " + window.localStorage.getItem("token")}, + file: {_id: props.selectedItem.id} + }; + + const data = {file: {_id: props.selectedItem.id}} + + this.setState(() => ({ + ...this.state, + optimizing: true + })) + + + axios.post(currentURL +'/file-service/transcode-video', data,config) + .then((response) => { + + const data = response.data; + + if (data === "Finished") { + + this.props.dispatch(editFileMetadata(props.selectedItem.id, {isVideo: true, transcoded: true})) + + this.setState(() => ({ + ...this.state, + optimizing: false, + optimizing_finished: true, + optimizing_removed: false + })) + } + + }).catch((err) => { + console.log(err) + }) + } + + getTranscodeButton = (props) => { + + if (!props.selectedItem.isVideo) { + return undefined; + } + + if (this.state.optimizing && !this.state.optimizing_finished) { + return (
+ +
) + + } else if ((props.selectedItem.transcoded || this.state.optimizing_finished) && !this.state.optimizing_removed) { + return (
+ +
) + } else { + return (
+ +
) + } + } + + getPublicStatus = () => { + + if (this.props.selectedItem.linkType === "one") { + + return + + } else { + + return + } + } + + resetState = () => { + + if (this.prevID !== "" && this.prevID !== this.props.selectedItem.id) { + + this.setState(() => ({ + ...this.state, + optimizing: false, + optimizing_finished: false + })) + } + } + + resetSelected = () => { + + this.props.dispatch(resetSelectedItem()); + } + + render() { + + return + } +} + +const connectPropToState = (state) => ({ + selectedItem: state.selectedItem, + showSideBar: state.main.showSideBar, + selected: state.main.selected +}) + +export default connect(connectPropToState)(RightSectionContainer) \ No newline at end of file diff --git a/src/components/RightSectionDetail/index.js b/src/components/RightSectionDetail/index.js new file mode 100644 index 0000000..fb187f8 --- /dev/null +++ b/src/components/RightSectionDetail/index.js @@ -0,0 +1,10 @@ +import React from "react"; + +export default ({title, body, first=true}) => ( + +
+
{title}
+
{body}
+
+ +) \ No newline at end of file diff --git a/src/components/SettingsMenu/SettingsMenu.js b/src/components/SettingsMenu/SettingsMenu.js new file mode 100644 index 0000000..1cf879b --- /dev/null +++ b/src/components/SettingsMenu/SettingsMenu.js @@ -0,0 +1,175 @@ +import StorageWidget from ".././StorageWidget"; +import React from "react"; + +const SettingsMenu = (props) => ( + +
+ + + {/* HEADER */} + +
+ + +
+ +

Settings

+
+ + + + +
+ +
+ + + {/*Storage*/} + +
+ +

Storage

+ +
+ + + +
+ +
+ + + {/*List Style*/} + +
+ +
+

Default List Style

+ +
+ +
+ + + +
+ +
+ + + + {/*List Size*/} +
+ +
+

Default List Size

+ +
+ + +
+ + + +
+ +
+ + + {/*Change password*/} +
+ +

Change Password

+ +
+ + +
+ +
+ + + {/*Logout*/} +
+ +

Logout

+ +
+ + +
+ +
+ + + + {/*Logout-all*/} +
+ +
+

Logout All

+ +
+ +
+ + +
+ +
+ + + + {/*Delete-all*/} +
+ +
+

Delete All

+ +
+ +
+ + +
+ +
+ + +
+ + + + +
+ + +) + +export default SettingsMenu + diff --git a/src/components/SettingsMenu/index.js b/src/components/SettingsMenu/index.js new file mode 100644 index 0000000..4299cbd --- /dev/null +++ b/src/components/SettingsMenu/index.js @@ -0,0 +1,295 @@ +import SettingsMenu from "./SettingsMenu"; +import {setFiles} from "../../actions/files" +import {setQuickFiles} from "../../actions/quickFiles"; +import {setFolders} from "../../actions/folders" +import {resetSelectedItem, setSelected} from "../../actions/selectedItem"; +import {startSetStorage} from "../../actions/storage" +import {hideSettings} from "../../actions/settings"; +import {startLogout, startLogoutAll} from "../../actions/auth"; +import {resetCurrentRoute} from "../../actions/routes" +import env from "../../enviroment/envFrontEnd"; +import Swal from "sweetalert2"; +import axios from "axios"; +import {connect} from "react-redux"; +import React from "react"; + +const currentURL = env.url; + +class SettingsMenuContainer extends React.Component { + + constructor(props) { + super(props); + + this.state = { + style: "List (Default)", + size: "50 (Default)" + } + } + + getProgressWidth = () => { + + const totalSpace = this.props.storage.total + const usedSpace = this.props.storage.total - this.props.storage.available; + + const difference = (usedSpace / totalSpace) * 100; + + return difference + "%" + } + + closeSettings = () => { + + this.props.dispatch(hideSettings()); + } + + setStyle = (e) => { + + const value = e.target.value; + + window.localStorage.setItem("list-style", value) + + this.setState(() => ({ + ...this.state, + style: value + })) + } + + setSize = (e) => { + + const value = e.target.value; + + window.localStorage.setItem("list-size", value) + + this.setState(() => ({ + ...this.state, + size: value + })) + + } + + componentDidMount = () => { + + const prevStyle = window.localStorage.getItem("list-style"); + const prevSize = window.localStorage.getItem("list-size"); + + if (prevSize && prevStyle) { + + this.setState(() => ({ + ...this.state, + size: prevSize, + style: prevStyle + })) + + } else if (prevStyle) { + + this.setState(() => ({ + ...this.state, + style: prevStyle + })) + + } else if (prevSize) { + + this.setState(() => ({ + ...this.state, + size: prevSize + })) + + } + } + + logout = () => { + + this.props.dispatch(resetCurrentRoute()) + this.props.dispatch(setFolders([])); + this.props.dispatch(setFiles([])); + this.props.dispatch(setQuickFiles([])); + this.props.dispatch(hideSettings()) + this.props.dispatch(startLogout()) + } + + logoutAll = () => { + + this.props.dispatch(resetCurrentRoute()) + this.props.dispatch(setFolders([])); + this.props.dispatch(setFiles([])); + this.props.dispatch(setQuickFiles([])); + this.props.dispatch(hideSettings()); + this.props.dispatch(startLogoutAll()); + } + + changePassword = () => { + + Swal.mixin({ + input: 'password', + confirmButtonText: 'Next →', + showCancelButton: true, + }).queue([ + { + title: 'Enter Current Password', + }, + 'Enter New Password', + 'Confirm New Password' + ]).then((result) => { + + if (result.value.length !== 3) {return} + + if (result.value[1] !== result.value[2]) { + + Swal.fire({ + icon: 'error', + title: 'Error', + text: 'New passwords do not match', + }) + + } else if (result.value[0].length === 0) { + + Swal.fire({ + icon: 'error', + title: 'Error', + text: 'Enter a new password', + }) + + } else { + + const config = { + headers: {'Authorization': "Bearer " + window.localStorage.getItem("token")} + }; + + const data = { + newPassword: result.value[1], + oldPassword: result.value[0] + } + + axios.post(currentURL +`/user-service/change-password/`, data, config).then((results) => { + + const newToken = results.data; + window.localStorage.setItem("token", newToken); + + Swal.fire( + 'Password Changed', + 'All other sessions have been logged out', + 'success' + ) + + + }).catch((err) => { + console.log(err) + Swal.fire({ + icon: 'error', + title: 'Error', + text: 'Error changing password', + }) + }) + + } + + }).catch((e) => { + console.log(e) + }) + } + + infoStyle = () => { + + Swal.fire({ + icon: 'info', + title: 'Default Style', + text: 'Changes the default layout of files/folders when the homepage first loads', + + }) + } + + infoSize = () => { + + Swal.fire({ + icon: 'info', + title: 'Default Size', + text: 'Changes how many files are loaded when the homepage first loads.', + + }) + + } + + infoLogoutAll = () => { + + Swal.fire({ + icon: 'info', + title: 'Logout All', + text: 'Logouts all sessions of this account, also removes all temporary tokens.', + + }) + } + + infoDeleteAll = () => { + + Swal.fire({ + icon: 'info', + title: 'Delete All', + text: 'Deletes all files and folders, this cannot be undone.', + + }) + } + + deleteAll = () => { + + Swal.fire({ + title: 'Delete All?', + text: "You cannot undo this action.", + icon: 'warning', + showCancelButton: true, + confirmButtonColor: '#3085d6', + cancelButtonColor: '#d33', + confirmButtonText: 'Yes, delete all' + }).then((result) => { + if (result.value) { + + const headers = {'Authorization': "Bearer " + window.localStorage.getItem("token")} + + axios.delete(currentURL +`/folder-service/remove-all`, { + headers + }).then((results) => { + + Swal.fire( + 'Deleted', + 'All files/folders have been deleted', + 'success' + ) + + this.props.dispatch(setFolders([])); + this.props.dispatch(setFiles([])); + this.props.dispatch(setQuickFiles([])); + this.props.dispatch(resetSelectedItem()); + this.props.dispatch(setSelected("")) + this.props.dispatch(startSetStorage()) + }) + + + } + }) + } + + render() { + + return + } + +} + +const connectStateToProp = (state) => ({ + + showSettings: state.settings.showSettings, +}) + +export default connect(connectStateToProp)(SettingsMenuContainer); + diff --git a/src/components/ShareMenu/ShareMenu.js b/src/components/ShareMenu/ShareMenu.js new file mode 100644 index 0000000..e678fc4 --- /dev/null +++ b/src/components/ShareMenu/ShareMenu.js @@ -0,0 +1,49 @@ +import React from "react"; + +const currentURL = process.env.URL + +const ShareMenu = React.forwardRef((props, ref) => { + + if (props.shareSelected === "") { + + return ( +
+ +
+ ) + + } else { + + return ( +
+ + {props.shareSelected.metadata.link ? + +
+ +
+ +

{currentURL}/download-page/{props.shareSelected._id}/{props.shareSelected.metadata.link}

+
+ + +
+ + : +
+ + +

Or

+ +
+ } + +
+ ) + + } + +}) + +export default ShareMenu \ No newline at end of file diff --git a/src/components/ShareMenu/index.js b/src/components/ShareMenu/index.js new file mode 100644 index 0000000..bd17b9f --- /dev/null +++ b/src/components/ShareMenu/index.js @@ -0,0 +1,204 @@ +import ShareMenu from "./ShareMenu"; +import {editFile} from "../../actions/files" +import {editSelectedItem, setShareSelected, editShareSelected} from "../../actions/selectedItem" +import env from "../../enviroment/envFrontEnd"; +import axios from "axios"; +import Swal from "sweetalert2" +import copy from "copy-text-to-clipboard"; +import {connect} from "react-redux"; +import React from "react"; + +const currentURL = env.url; + +class ShareMenuContainer extends React.Component { + + constructor(props) { + super(props); + + this.wrapperRef = React.createRef(); + + this.showingSwal = false; + + this.state = { + title: "No Link" + } + } + + handleClickOutside = (e) => { + + if (this.wrapperRef && !this.wrapperRef.current.contains(event.target) && !this.showingSwal) { + + this.props.dispatch(setShareSelected("")) + } + } + + hide = () => { + + this.props.dispatch(setShareSelected("")) + } + + componentWillUnmount = () => { + document.removeEventListener('mousedown', this.handleClickOutside); + } + + componentDidMount = () => { + document.addEventListener('mousedown', this.handleClickOutside); + } + + makePublic = () => { + + this.showingSwal = true; + + Swal.fire({ + title: 'Are you sure?', + text: "Making this public, will allow anyone to have access to it", + icon: 'warning', + showCancelButton: true, + confirmButtonColor: '#3085d6', + cancelButtonColor: '#d33', + confirmButtonText: 'Yes, make public' + }).then((result) => { + + this.showingSwal = false; + + if (result.value) { + + const config = { + headers: {'Authorization': "Bearer " + window.localStorage.getItem("token")} + }; + + axios.patch(currentURL +`/file-service/make-public/${this.props.shareSelected._id}`, undefined,config).then((results) => { + + this.props.dispatch(editFile(this.props.shareSelected._id,{"metadata": { + ...this.props.shareSelected.metadata, + link: results.data, + linkType: "public" + }})) + + this.props.dispatch(editSelectedItem({link: results.data, + linkType: "public"})) + + + this.props.dispatch(editShareSelected({"metadata": { + ...this.props.shareSelected.metadata, + link: results.data, + linkType: "public" + }})) + + }).catch((err) => { + console.log(err) + }) + + + } + }) + } + + makeOne = () => { + + this.showingSwal = true; + + Swal.fire({ + title: 'Are you sure?', + text: "One time link, will allow anyone to access this file once", + icon: 'warning', + showCancelButton: true, + confirmButtonColor: '#3085d6', + cancelButtonColor: '#d33', + confirmButtonText: 'Yes, create link' + }).then((result) => { + + this.showingSwal = false; + + if (result.value) { + + const config = { + headers: {'Authorization': "Bearer " + window.localStorage.getItem("token")} + }; + + axios.patch(currentURL +`/file-service/make-one/${this.props.shareSelected._id}`, undefined,config).then((results) => { + + this.props.dispatch(editFile(this.props.shareSelected._id,{"metadata": { + ...this.props.shareSelected.metadata, + link: results.data, + linkType: "one" + }})) + + this.props.dispatch(editSelectedItem({link: results.data, + linkType: "one"})) + + + this.props.dispatch(editShareSelected({"metadata": { + ...this.props.shareSelected.metadata, + link: results.data, + linkType: "one" + }})) + + }).catch((err) => { + console.log(err) + }) + + + } + }) + + } + + removeLink = () => { + + const headers = {'Authorization': "Bearer " + window.localStorage.getItem("token")} + + axios.delete(currentURL +`/file-service/remove-link/${this.props.shareSelected._id}`, { + headers + }).then(() => { + + this.props.dispatch(editFile(this.props.shareSelected._id,{"metadata": { + ...this.props.shareSelected.metadata, + link: undefined, + linkType: undefined + }})) + + this.props.dispatch(editSelectedItem({link: undefined, + linkType: undefined})) + + + this.props.dispatch(editShareSelected({"metadata": { + ...this.props.shareSelected.metadata, + link: undefined, + linkType: undefined + }})) + }).catch((err) => { + console.log(err) + }) + } + + copyLink = () => { + + const link = currentURL + "/download-page/" + this.props.shareSelected._id + "/" + this.props.shareSelected.metadata.link; + + copy(link) + + Swal.fire("Link Copied") + } + + render() { + + return + } +} + +const connectStateToProps = (state) => ({ + + shareSelected: state.selectedItem.shareSelected +}) + +export default connect(connectStateToProps)(ShareMenuContainer); diff --git a/src/components/Spacer/index.js b/src/components/Spacer/index.js new file mode 100644 index 0000000..6a3ef51 --- /dev/null +++ b/src/components/Spacer/index.js @@ -0,0 +1,7 @@ +import React from "react"; + +export default ({title}) => ( +
+

{title}

+
+) \ No newline at end of file diff --git a/src/components/Spinner/index.js b/src/components/Spinner/index.js new file mode 100644 index 0000000..65211c2 --- /dev/null +++ b/src/components/Spinner/index.js @@ -0,0 +1,7 @@ +import React from "react"; + +export default () => ( +
+ +
+) \ No newline at end of file diff --git a/src/components/SpinnerLogin/index.js b/src/components/SpinnerLogin/index.js new file mode 100644 index 0000000..402075d --- /dev/null +++ b/src/components/SpinnerLogin/index.js @@ -0,0 +1,7 @@ +import React from "react"; + +export default () => ( +
+ +
+) \ No newline at end of file diff --git a/src/components/StorageWidget/StorageWidget.js b/src/components/StorageWidget/StorageWidget.js new file mode 100644 index 0000000..62b88bf --- /dev/null +++ b/src/components/StorageWidget/StorageWidget.js @@ -0,0 +1,24 @@ +import bytes from "bytes"; +import React from "react" + +const StorageWidget = (props) => ( +
+ +

Storage

+ +
+ +
+ +
+ +
+ +

{bytes(props.storage.total - props.storage.available)} of {bytes(props.storage.total)}

+
+) + + +export default StorageWidget \ No newline at end of file diff --git a/src/components/StorageWidget/index.js b/src/components/StorageWidget/index.js new file mode 100644 index 0000000..cefcaad --- /dev/null +++ b/src/components/StorageWidget/index.js @@ -0,0 +1,35 @@ +import StorageWidget from "./StorageWidget" +import {connect} from "react-redux"; +import React from "react"; + +class StorageWidgetContainer extends React.Component { + + constructor(props) { + super(props); + } + + + getProgressWidth = (props) => { + + const totalSpace = props.storage.total + const usedSpace = props.storage.total - props.storage.available; + + const difference = (usedSpace / totalSpace) * 100; + + return difference + "%" + } + + render() { + + return + } + +} + +const connectStateToProp = (state) => ({ + storage: state.storage, +}) + +export default connect(connectStateToProp)(StorageWidgetContainer) \ No newline at end of file diff --git a/src/components/Subbar/Subbar.js b/src/components/Subbar/Subbar.js new file mode 100644 index 0000000..7c48ef8 --- /dev/null +++ b/src/components/Subbar/Subbar.js @@ -0,0 +1,85 @@ +import React from "react"; + +export class Subbar extends React.Component { + + constructor(props) { + super(props); + } + + render() { + + return ( +
+ + {!this.props.isMobile ? undefined : + +
+ + + +

New

+ +
+
+ +

Folder

+
+ +
+ + +

File Upload

+ + +
+ +
+ +

Folder Upload

+
+
+
+ + + } + + +
+ + {(this.props.parentList.length !== 1 || this.props.currentlySearching)? + ( +
+ + {this.props.parentNameList.map((parent, index) => { + + const parentID = this.props.parentList[index]; + + return ( +
{this.props.itemClick(parentID, parent, true)}}> +

{parent}

+ + {index !== this.props.parentNameList.length - 1 ? () : undefined} + +
+ ) + })} + +
) + + : undefined} + + + +
+ + + + +
+ ) + } +} + + +export default Subbar \ No newline at end of file diff --git a/src/components/Subbar/index.js b/src/components/Subbar/index.js new file mode 100644 index 0000000..1b6d37f --- /dev/null +++ b/src/components/Subbar/index.js @@ -0,0 +1,158 @@ +import Subbar from "./Subbar"; +import {showSideBar, hideSideBar} from "../../actions/main"; +import {showAddOptions2} from "../../actions/addOptions"; +import {startAddFile} from "../../actions/files"; +import {startAddFolder} from "../../actions/folders" +import {enableListView, disableListView} from "../../actions/filter"; +import {resetSelected} from "../../actions/selectedItem"; +import Swal from "sweetalert2"; +import {connect} from "react-redux"; +import {history} from "../../routers/AppRouter"; +import React from "react"; +import mobileCheck from "../../utils/mobileCheck"; + +class SubbarContainer extends React.Component { + + constructor(props) { + super(props); + + this.uploadInput = React.createRef(); + this.wrapperRef = React.createRef(); + this.isMobile = mobileCheck(); + } + + + createFolder = async(e) => { + + let inputValue = "" + + const { value: folderName} = await Swal.fire({ + title: 'Enter Folder Name', + input: 'text', + inputValue: inputValue, + showCancelButton: true, + inputValidator: (value) => { + if (!value) { + return 'Please Enter a Name' + } + } + }) + + if (folderName === undefined || folderName === null) { + + return; + } + + const parent = this.props.parent; + const owner = this.props.auth.id; + const parentList = this.props.parentList; + + this.props.dispatch(startAddFolder(folderName, owner, parent, parentList)); + } + + handleClickOutside = (e) => { + + if (this.wrapperRef && !this.wrapperRef.current.contains(event.target) && this.props.showAddOptions2) { + this.addButtonEvent(); + } + } + + componentDidMount = () => { + + if (this.isMobile) { + document.addEventListener('mousedown', this.handleClickOutside); + } + } + + componentWillUnmount = () => { + + if (this.isMobile) { + document.removeEventListener('mousedown', this.handleClickOutside); + } + } + + addButtonEvent = () => { + + const currentAddOptions = !this.props.showAddOptions2 + + this.props.dispatch(showAddOptions2(currentAddOptions)) + } + + handleUpload = (e) => { + e.preventDefault(); + + this.props.dispatch(startAddFile(this.uploadInput.current, this.props.parent, this.props.parentList)) + this.uploadInput.current.value = "" + } + + showSideBarEvent = () => { + + let show = this.props.showSideBar; + + if (show === "gone") { + show = false; + } + + if (show) { + this.props.dispatch(hideSideBar()) + } else { + this.props.dispatch(showSideBar()) + } + } + + showListViewEvent = () => { + + let listView = this.props.listView; + + if (listView) { + this.props.dispatch(resetSelected()) + this.props.dispatch(disableListView()) + } else { + this.props.dispatch(resetSelected()) + this.props.dispatch(enableListView()) + } + } + + itemClick = (id) => { + + if (id === "/") { + + history.push("/home") + + } else { + + history.push(`/folder/${id}`) + } + + } + + render() { + + return + } + +} + +const connectPropToState = (state) => ({ + auth: state.auth, + listView: state.filter.listView, + parentList: state.parent.parentList, + parentNameList: state.parent.parentNameList, + parent: state.parent.parent, + sortBy: state.filter.sortBy, + showAddOptions2: state.addOptions.showAddOptions2, + showSideBar: state.main.showSideBar, + currentlySearching: state.filter.currentlySearching +}) + +export default connect(connectPropToState)(SubbarContainer) \ No newline at end of file diff --git a/src/components/SuggestedItem/index.js b/src/components/SuggestedItem/index.js new file mode 100644 index 0000000..27894d0 --- /dev/null +++ b/src/components/SuggestedItem/index.js @@ -0,0 +1,23 @@ +import moment from "moment" +import React from "react"; + +export default ({suggested, folder, itemClick}) => { + + const name = folder ? suggested.name : suggested.filename; + + return( +
itemClick(name)} className="header__input__suggested__item"> + +
+ + +

{name}

+ +
+ +

{folder ? moment(suggested.createdAt).format("L") : moment(suggested.uploadDate).format("L")}

+ +
+ ) + +} \ No newline at end of file diff --git a/src/components/UploadItem/UploadItem.js b/src/components/UploadItem/UploadItem.js new file mode 100644 index 0000000..6ef248e --- /dev/null +++ b/src/components/UploadItem/UploadItem.js @@ -0,0 +1,40 @@ +import { CircularProgressbar } from 'react-circular-progressbar'; +import {connect} from "react-redux"; +import React from "react"; + +const UploadItem = (props) => { + + const completed = props.completed; + const uploadImage = props.getUploadImage(); + const canceled = props.canceled; + + return ( +
+

{props.name}

+ + + + +
+ +
+ + + +
+ +
+ + + +
+ ) +} + +export default connect()(UploadItem); diff --git a/src/components/UploadItem/index.js b/src/components/UploadItem/index.js new file mode 100644 index 0000000..272b7f8 --- /dev/null +++ b/src/components/UploadItem/index.js @@ -0,0 +1,90 @@ +import UploadItem from "./UploadItem" +import {cancelUpload} from "../../actions/uploads"; +import {connect} from "react-redux"; +import React from "react"; + +class UploadItemContainer extends React.Component { + + constructor(props) { + super(props); + + const completed = this.props.completed; + const canceled = this.props.canceled; + + this.uploadFinished = false; + + this.state = { + progressBarStyle: {visibility: (completed || canceled) ? "hidden" : "visible"}, + stopUploadButtonStyle: (completed || canceled) ? {visibility:"visible", opacity: 1} : {visibility: "hidden", opacity: 0} + } + } + + hideProgress = () => { + + this.setState(() => ({ + ...this.state, + progressBarStyle: {visibility: "hidden"}, + stopUploadButtonStyle: {opacity: 1, visibility: "visible"} + + })) + } + + showProgress = () => { + + this.setState(() => ({ + ...this.state, + progressBarStyle: {visibility: "visible"}, + stopUploadButtonStyle: {opacity: 0, visibility: "hidden"} + + })) + } + + cancelUploadEvent = () => { + + if (!this.props.completed) { + this.props.source.cancel("User Canceled Upload") + this.props.dispatch(cancelUpload(this.props.id)) + } + + } + + getUploadImage = () => { + + if (this.props.canceled) { + return "/images/error-red.png" + } else if (this.props.completed) { + return "/images/check-green.png" + } else { + return "/images/close-circle-outline.svg" + } + + } + + componentDidUpdate = () => { + + if (this.props.completed && !this.uploadFinished) { + + this.uploadFinished = true; + + this.setState(() => ({ + ...this.state, + progressBarStyle: {visibility: "hidden"}, + stopUploadButtonStyle: {opacity: 1, visibility: "visible"} + + })) + } + } + + render() { + + return + } +} + +export default connect()(UploadItemContainer) \ No newline at end of file diff --git a/src/components/Uploader/Uploader.js b/src/components/Uploader/Uploader.js new file mode 100644 index 0000000..c073cbf --- /dev/null +++ b/src/components/Uploader/Uploader.js @@ -0,0 +1,24 @@ +import UploadItem from ".././UploadItem"; +import React from "react"; + +const Uploader = React.forwardRef((props, ref) => ( +
+ +
+ +

Uploads

+ +
+ props.minimizeUploader()} src={props.uploaderShow ? "/images/down-arrow-white.png" : "/images/up-arrow-white.png"}/> + props.cancelAllUploadsEvent()} src="/images/close-white-png.png"/> +
+ +
+ +
+ {props.uploads.map((upload) => )} +
+
+)) + +export default Uploader; diff --git a/src/components/Uploader/index.js b/src/components/Uploader/index.js new file mode 100644 index 0000000..e622218 --- /dev/null +++ b/src/components/Uploader/index.js @@ -0,0 +1,61 @@ +import Uploader from "./Uploader"; +import {showUploader, hideUploader} from "../../actions/main"; +import {startCancelAllUploads} from "../../actions/uploads"; +import {connect} from "react-redux"; +import React from "react"; + +class UploaderContainer extends React.Component { + + constructor(props) { + super(props); + + this.uploaderWrapper = React.createRef() + this.prevUploadLength = 0; + } + + minimizeUploader = () => { + + const uploaderShow = this.props.uploaderShow; + const dispatch = this.props.dispatch; + + if (uploaderShow) { + + dispatch(hideUploader()) + + } else { + + dispatch(showUploader()) + } + } + + cancelAllUploadsEvent = () => { + + this.props.dispatch(startCancelAllUploads(this.props.uploads)) + } + + componentDidUpdate = () => { + + if (this.props.uploads.length !== this.prevUploadLength) { + + this.uploaderWrapper.current.scrollTop = 0; + } + + this.prevUploadLength = this.props.uploads.length; + } + + render() { + return + } + +} + +const connectStateToProp = (state) => ({ + uploads: state.uploads, + uploaderShow: state.main.uploaderShow +}) + +export default connect(connectStateToProp)(UploaderContainer); \ No newline at end of file diff --git a/src/controllers/file.js b/src/controllers/file.js new file mode 100644 index 0000000..42ff660 --- /dev/null +++ b/src/controllers/file.js @@ -0,0 +1,575 @@ +const FileService = require("../services/FileService") + +const fileService = new FileService() + +class FileController { + + constructor() { + + } + + + async getThumbnail(req, res) { + + if (!req.user) { + + return; + } + + try { + + const user = req.user; + const id = req.params.id; + + const decryptedThumbnail = await fileService.getThumbnail(user, id); + + res.send(decryptedThumbnail); + + } catch (e) { + + const code = e.code || 500; + + console.log(e); + res.status(code).send(); + } + + } + + async getFullThumbnail(req, res) { + + if (!req.user) { + return; + } + + try { + + const user = req.user; + const fileID = req.params.id; + + await fileService.getFullThumbnail(user, fileID, res); + + } catch (e) { + const code = e.code || 500; + console.log(e.message, e.exception) + return res.status(code).send(); + } + } + + async uploadFile(req, res) { + + if (!req.user) { + + return + } + + try { + + const user = req.user; + const busboy = req.busboy; + + req.pipe(busboy); + + const file = await fileService.upload(user, busboy, req); + + res.send(file); + + console.log("file uploaded"); + + } catch (e) { + const code = e.code || 500; + console.log(e.message, e.exception) + return res.status(code).send(); + } + } + + async getPublicDownload(req, res) { + + try { + + const ID = req.params.id; + const tempToken = req.params.tempToken; + + await fileService.publicDownload(ID, tempToken, res); + + } catch (e) { + + const code = e.code || 500; + const message = e.message || e; + + console.log(message, e); + res.status(code).send(); + } + } + + async removeLink(req, res) { + + if (!req.user) { + return; + } + + try { + + const id = req.params.id; + const userID = req.user._id; + + await fileService.removeLink(userID, id) + + res.send(); + + } catch (e) { + + const code = e.code || 500; + + console.log(e); + res.status(code).send(); + } + + } + + async makePublic(req, res) { + + if (!req.user) { + return; + } + + try { + + const fileID = req.params.id; + const user = req.user; + + const token = await fileService.makePublic(user, fileID); + + res.send(token); + + } catch (e) { + + const code = e.code || 500; + + console.log(e); + res.status(code).send(); + } + } + + async getPublicInfo(req, res) { + + try { + + const id = req.params.id; + const tempToken = req.params.tempToken; + + const file = await fileService.getPublicInfo(id, tempToken); + + res.send(file); + + } catch (e) { + + const code = e.code || 500; + + console.log(e); + res.status(code).send() + } + } + + async makeOneTimePublic(req, res) { + + if (!req.user) { + return; + } + + try { + + const id = req.params.id; + const userID = req.user._id; + + const token = await fileService.makeOneTimePublic(userID, id); + + res.send(token); + + } catch (e) { + + const code = e.code || 500; + + console.log(e); + res.status(code).send() + } + + } + + async getFileInfo(req, res) { + + if (!req.user) { + return; + } + + try { + + const fileID = req.params.id; + const userID = req.user._id; + + const file = await fileService.getFileInfo(userID, fileID); + + res.send(file); + + } catch (e) { + + const code = e.code || 500; + + console.log(e); + res.status(code).send() + } + } + + async getQuickList(req, res) { + + if (!req.user) { + return; + } + + try { + + const userID = req.user._id; + + const quickList = await fileService.getQuickList(userID); + + res.send(quickList); + + } catch (e) { + + const code = e.code || 500; + + console.log(e); + res.status(code).send() + } + } + + async getList(req, res) { + + if (!req.user) { + return + } + + try { + + const query = req.query; + const userID = req.user._id; + + const fileList = await fileService.getList(userID, query); + + res.send(fileList); + + } catch (e) { + + const code = e.code || 500; + + console.log(e); + res.status(code).send() + } + } + + async getDownloadToken(req, res) { + + if (!req.user) { + return + } + + try { + + const user = req.user; + + const tempToken = await fileService.getDownloadToken(user); + + res.send({tempToken}); + + } catch (e) { + + const code = e.code || 500; + + console.log(e); + res.status(code).send() + } + } + + async getDownloadTokenVideo(req, res) { + + if (!req.user) { + return + } + + try { + + const user = req.user; + const cookie = req.headers.uuid + + const tempToken = await fileService.getDownloadTokenVideo(user, cookie); + + res.send({tempToken}); + + } catch (e) { + + const code = e.code || 500; + + console.log(e); + res.status(code).send() + } + } + + async removeTempToken(req, res) { + + if (!req.user) { + return + } + + try { + + const user = req.user + const tempToken = req.params.tempToken; + + await fileService.removeTempToken(user, tempToken); + + res.send(); + + } catch (e) { + + const code = e.code || 500; + + console.log(e); + res.status(code).send() + } + } + + async transcodeVideo(req, res) { + + if (!req.user) { + + return; + } + + try { + + console.log("transcode request", req.body.file._id) + + const user = req.user; + const body = req.body; + + await fileService.transcodeVideo(user, body); + + res.send("Finished"); + + } catch (e) { + + const code = e.code || 500; + console.log(e.message, e.exception) + return res.status(code).send(); + } + } + + async removeTranscodeVideo(req, res) { + + if (!req.user) { + + return; + } + + try { + + const fileID = req.body.id; + const userID = req.user._id; + + await fileService.removeTranscodeVideo(userID, fileID); + + res.send(); + + } catch (e) { + + const code = e.code || 500; + + console.log(e); + res.status(code).send() + } + } + + async streamTranscodedVideo(req, res) { + + if (!req.auth || !req.user) { + return; + } + + try { + + console.log("stream request transcoded", req.params.id) + + const fileID = req.params.id; + const userID = req.user._id; + const headers = req.headers; + + await fileService.streamTranscodedVideo(userID, fileID, headers, res); + + } catch (e) { + + const code = e.code || 500; + const message = e.message || e; + + console.log(message, e); + res.status(code).send(); + } + } + + async streamVideo(req, res) { + + if (!req.auth || !req.user) { + return; + } + + try { + + const user = req.user; + const fileID = req.params.id; + const headers = req.headers; + + console.log("stream request", req.params.id) + + await fileService.streamVideo(user, fileID, headers, res); + + } catch (e) { + + const code = e.code || 500; + const message = e.message || e; + + console.log(message, e); + res.status(code).send(); + } + + } + + async downloadFile(req, res) { + + if (!req.auth || !req.user) { + return; + } + + try { + + console.log("download request") + + const user = req.user; + const fileID = req.params.id; + + await fileService.downloadFile(user, fileID, res); + + } catch (e) { + + const code = e.code || 500; + const message = e.message || e; + + console.log(message, e); + res.status(code).send(); + } + } + + async getSuggestedList(req, res) { + + if (!req.user) { + return; + } + + try { + + const userID = req.user._id; + let searchQuery = req.query.search || ""; + + const {fileList, folderList} = await fileService.getSuggestedList(userID, searchQuery); + + return res.send({folderList, fileList}) + + + } catch (e) { + + const code = e.code || 500; + + console.log(e); + res.status(code).send() + } + } + + async renameFile(req, res) { + + if (!req.user) { + return; + } + + try { + + const fileID = req.body.id; + const title = req.body.title + const userID = req.user._id; + + await fileService.renameFile(userID, fileID, title) + + res.send(); + + } catch (e) { + + const code = e.code || 500; + + console.log(e); + res.status(code).send() + } + + } + + async moveFile(req, res) { + + console.log("move request"); + + if (!req.user) { + return; + } + + try { + + const fileID = req.body.id; + const userID = req.user._id; + const parentID = req.body.parent; + + console.log(fileID, userID, parentID); + + await fileService.moveFile(userID, fileID, parentID); + + res.send(); + + } catch (e) { + + const code = e.code || 500; + + console.log(e); + res.status(code).send() + } + + } + + async deleteFile(req, res) { + + if (!req.user) { + return; + } + + try { + + const userID = req.user._id; + const fileID = req.body.id; + + await fileService.deleteFile(userID, fileID); + + res.send() + + } catch (e) { + + const code = e.code || 500; + + console.log(e); + res.status(code).send() + } + } +} + +module.exports = FileController; diff --git a/src/controllers/folder.js b/src/controllers/folder.js new file mode 100644 index 0000000..8ee3529 --- /dev/null +++ b/src/controllers/folder.js @@ -0,0 +1,211 @@ +const FolderService = require("../services/FolderService"); +const folderService = new FolderService(); + +class FolderController { + + constructor() { + + } + + async uploadFolder(req, res) { + + if (!req.user) { + + return + } + + try { + + const data = req.body; + + const folder = await folderService.uploadFolder(data); + + res.send(folder); + + } catch (e) { + + const code = e.code || 500 + + console.log(e); + res.status(code).send(e); + } + } + + async deleteFolder(req, res) { + + if (!req.user) { + + return + } + + try { + + const userID = req.user._id; + const folderID = req.body.id; + const parentList = req.body.parentList + + await folderService.deleteFolder(userID, folderID, parentList); + + res.send(); + + } catch (e) { + + const code = e.code || 500 + + console.log(e); + res.status(code).send(e); + } + } + + async deleteAll(req, res) { + + if (!req.user) { + + return + } + + try { + + const userID = req.user._id; + + await folderService.deleteAll(userID); + + res.send(); + + } catch (e) { + + const code = e.code || 500 + + console.log(e); + res.status(code).send(e); + } + } + + async getInfo(req, res) { + + if (!req.user) { + return; + } + + try { + + const userID = req.user._id; + const folderID = req.params.id; + + const folder = await folderService.getFolderInfo(userID, folderID); + + res.send(folder); + + } catch (e) { + + const code = e.code || 500 + + console.log(e); + res.status(code).send(e); + } + } + + async getSubfolderList(req, res) { + + if (!req.user) { + + return + } + + try { + + const userID = req.user._id; + const folderID = req.query.id; + + const {folderIDList, folderNameList} = await folderService.getFolderSublist(userID, folderID); + + res.send({folderIDList, folderNameList}) + + } catch (e) { + + const code = e.code || 500 + + console.log(e); + res.status(code).send(e); + } + } + + async getFolderList(req, res) { + + if (!req.user) { + + return + } + + try { + + const userID = req.user._id; + const query = req.query; + + const folderList = await folderService.getFolderList(userID, query); + + res.send(folderList); + + } catch (e) { + + const code = e.code || 500 + + console.log(e); + res.status(code).send(e); + } + } + + async moveFolder(req, res) { + + if (!req.user) { + return; + } + + try { + + const userID = req.user._id; + const folderID = req.body.id; + const parent = req.body.parent; + + await folderService.moveFolder(userID, folderID, parent); + + res.send(); + + } catch (e) { + + const code = e.code || 500 + + console.log(e); + res.status(code).send(e); + + } + } + + async renameFolder(req, res) { + + if (!req.user) { + return; + } + + try { + + const userID = req.user._id; + const folderID = req.body.id; + const title = req.body.title + + await folderService.renameFolder(userID, folderID, title); + + res.send() + + } catch (e) { + + const code = e.code || 500 + + console.log(e); + res.status(code).send(e); + + } + } +} + +module.exports = FolderController; \ No newline at end of file diff --git a/src/controllers/storage.js b/src/controllers/storage.js new file mode 100644 index 0000000..4205c6c --- /dev/null +++ b/src/controllers/storage.js @@ -0,0 +1,31 @@ +const env = require("../enviroment/env") +const disk = require('diskusage'); + +class StorageController { + + constructor() { + + } + + async getStorageInfo(req, res) { + + if (!req.user) { + + return; + } + + try { + + const info = await disk.check(env.root); + + res.send(info) + + } catch (e) { + + console.log(e); + res.status(500).send(e); + } + } +} + +module.exports = StorageController; \ No newline at end of file diff --git a/src/controllers/user.js b/src/controllers/user.js new file mode 100644 index 0000000..6dd9202 --- /dev/null +++ b/src/controllers/user.js @@ -0,0 +1,148 @@ +const env = require("../enviroment/env"); +const UserService = require("../services/UserService") +const UserProvider = new UserService(); + +class UserController { + + constructor() { + + } + + async getUser(req, res) { + + try { + + const user = req.user; + user.tokens = undefined; + user.tempTokens = undefined; + user.password = undefined; + user.privateKey = undefined; + user.publicKey = undefined; + + res.send(user) + + } catch (e) { + + res.status(500).send(e); + } + } + + async login(req, res) { + + try { + + const body = req.body; + + const {user, token} = await UserProvider.login(body); + + user.tokens = undefined; + user.tempTokens = undefined; + user.password = undefined; + user.privateKey = undefined; + user.publicKey = undefined; + + res.status(200).send({user, token}); + + } catch (e) { + + const code = e.code || 500; + + console.log(e); + res.status(code).send(e); + } + } + + async logout(req, res) { + + if (!req.user) { + + return; + } + + try { + + const user = req.user; + const token = req.encryptedToken; + + await UserProvider.logout(user, token); + + res.send(); + + } catch (e) { + + res.status(500).send(e); + } + } + + async logoutAll(req, res) { + + try { + + const user = req.user; + + await UserProvider.logoutAll(user); + + res.send(); + + } catch (e) { + + res.status(500).send(e); + } + } + + async createUser(req, res) { + + if (env.createAcctBlocked) { + + return await res.status(401).send() + } + + try { + + const {user, token} = await UserProvider.create(req.body); + + user.tokens = undefined; + user.tempTokens = undefined; + user.password = undefined; + user.privateKey = undefined; + user.publicKey = undefined; + + res.status(201).send({user, token}) + + } catch (e) { + + const code = e.code || 500; + + console.log(e); + res.status(code).send(e); + } + } + + async changePassword(req, res) { + + if (!req.user) { + + return; + } + + try { + + const user = req.user; + const oldPassword = req.body.oldPassword; + const newPassword = req.body.newPassword; + + const newToken = await UserProvider.changePassword(user, oldPassword, newPassword); + + res.send(newToken); + + } catch (e) { + + const code = e.code || 500; + + console.log(e); + res.status(code).send(e); + } + } +} + +module.exports = UserController; \ No newline at end of file diff --git a/src/db/mongoose.js b/src/db/mongoose.js new file mode 100644 index 0000000..9e5fb05 --- /dev/null +++ b/src/db/mongoose.js @@ -0,0 +1,10 @@ +const mongoose = require("mongoose"); +const env = require("../enviroment/env"); + +mongoose.connect(env.mongoURL, { + useNewUrlParser: true, + useCreateIndex: true, + useUnifiedTopology: true, +}) + +module.exports = mongoose; \ No newline at end of file diff --git a/src/db/mongooseServerUtils.js b/src/db/mongooseServerUtils.js new file mode 100644 index 0000000..4a4adcf --- /dev/null +++ b/src/db/mongooseServerUtils.js @@ -0,0 +1,12 @@ +const mongoose = require("mongoose"); +const env = require("../enviroment/env"); + +mongoose.connect(env.mongoURL, { + useNewUrlParser: true, + useCreateIndex: true, + useUnifiedTopology: true, + socketTimeoutMS: 30000000, + keepAlive: true, +}) + +module.exports = mongoose; \ No newline at end of file diff --git a/src/db/utils/fileUtils/index.js b/src/db/utils/fileUtils/index.js new file mode 100644 index 0000000..7cb92d5 --- /dev/null +++ b/src/db/utils/fileUtils/index.js @@ -0,0 +1,166 @@ +const mongoose = require("../../mongoose") +const conn = mongoose.connection; +const ObjectID = require('mongodb').ObjectID + +const DbUtil = function() { + + this.getPublicFile = async(fileID) => { + + let file = await conn.db.collection("fs.files") + .findOne({"_id": ObjectID(fileID)}); + + return file; + } + + this.removeOneTimePublicLink = async(fileID) => { + + const file = await conn.db.collection("fs.files") + .findOneAndUpdate({"_id": ObjectID(fileID)}, { + "$unset": {"metadata.linkType": "", "metadata.link": ""}}); + + return file; + + } + + this.removeLink = async(fileID, userID) => { + + const file = await conn.db.collection("fs.files") + .findOneAndUpdate({"_id": ObjectID(fileID), + "metadata.owner": userID}, + {"$unset": {"metadata.linkType": "", "metadata.link": ""}}) + + return file; + } + + this.makePublic = async(fileID, userID, token) => { + + const file = await conn.db.collection("fs.files") + .findOneAndUpdate({"_id": ObjectID(fileID), + "metadata.owner": userID}, + {"$set": {"metadata.linkType": "public", "metadata.link": token}}) + + return file; + } + + this.getPublicInfo = async(fileID, tempToken) => { + + const file = await conn.db.collection("fs.files") + .findOne({"_id": ObjectID(fileID), "metadata.link": tempToken}) + + return file; + } + + this.makeOneTimePublic = async(fileID, userID, token) => { + + const file = await conn.db.collection("fs.files") + .findOneAndUpdate({"_id": ObjectID(fileID), + "metadata.owner": userID}, + {"$set": {"metadata.linkType": "one", "metadata.link": token}}) + + return file; + } + + this.getFileInfo = async(fileID, userID) => { + + const file = await conn.db.collection("fs.files") + .findOne({"metadata.owner": userID, "_id": ObjectID(fileID)}); + + return file; + } + + this.getQuickList = async(userID) => { + + const fileList = await conn.db.collection("fs.files") + .find({"metadata.owner": userID}) + .sort({uploadDate: -1}) + .limit(10) + .toArray(); + + return fileList; + } + + this.getList = async(queryObj, sortBy, limit) => { + + const fileList = await conn.db.collection("fs.files") + .find(queryObj) + .sort(sortBy) + .limit(limit) + .toArray(); + + + return fileList; + } + + this.removeTempToken = async(user, tempToken) => { + + user.tempTokens = user.tempTokens.filter((filterToken) => { + + return filterToken.token !== tempToken; + }); + + return user; + } + + this.removeTranscodeVideo = async(fileID, userID) => { + + const file = await conn.db.collection("fs.files") + .findOneAndUpdate({"_id": ObjectID(fileID), "metadata.owner": userID}, + {"$unset": {"metadata.transcoded": "", "metadata.transcodedIV": "", + "metadata.transcoded_size": "", "metadata.transcodedID": ""}}) + + return file; + } + + this.getFileSearchList = async(userID, searchQuery) => { + + const fileList = await conn.db.collection("fs.files") + .find({"metadata.owner": userID, "filename": searchQuery}) + .limit(10) + .toArray(); + + return fileList; + } + + this.renameFile = async(fileID, userID, title) => { + + const file = await conn.db.collection("fs.files") + .findOneAndUpdate({"_id": ObjectID(fileID), + "metadata.owner": userID}, {"$set": {"filename": title}}) + + return file; + } + + this.moveFile = async(fileID, userID, parent, parentList) => { + + const file = await conn.db.collection("fs.files") + .findOneAndUpdate({"_id": ObjectID(fileID), + "metadata.owner": userID}, {"$set": {"metadata.parent": parent, "metadata.parentList": parentList}}) + + return file; + } + + this.getFileListByParent = async(userID, parentListString) => { + + const fileList = await conn.db.collection("fs.files") + .find({"metadata.owner": userID, + "metadata.parentList": {$regex : `.*${parentListString}.*`}}).toArray(); + + return fileList; + } + + this.getFileListByOwner = async(userID) => { + + const fileList = await conn.db.collection("fs.files") + .find({"metadata.owner": userID}).toArray(); + + return fileList; + } + + this.removeChunksByID = async(fileID) => { + + await conn.db.collection("fs.chunks").deleteMany({files_id: fileID}); + } + +} + +module.exports = DbUtil; \ No newline at end of file diff --git a/src/db/utils/folderUtils/index.js b/src/db/utils/folderUtils/index.js new file mode 100644 index 0000000..53e6883 --- /dev/null +++ b/src/db/utils/folderUtils/index.js @@ -0,0 +1,61 @@ +const Folder = require("../../../models/folder"); +const ObjectID = require('mongodb').ObjectID + +const DbUtil = function() { + + this.getFolderSearchList = async(userID, searchQuery) => { + + const folderList = await Folder.find({"owner": userID, "name": searchQuery}).limit(10); + + return folderList; + } + + this.getFolderInfo = async(folderID, userID) => { + + const folder = await Folder.findOne({"owner": userID, "_id": ObjectID(folderID)}); + + return folder; + } + + this.getFolderListByParent = async(userID, parent, sortBy) => { + + const folderList = await Folder.find({"owner": userID, "parent": parent}) + .sort(sortBy); + + return folderList; + } + + this.getFolderListBySearch = async(userID, searchQuery, sortBy) => { + + const folderList = await Folder.find({"name": searchQuery,"owner": userID}) + .sort(sortBy); + + return folderList; + } + + this.moveFolder = async(folderID, userID, parent, parentList) => { + + const folder = await Folder.findOneAndUpdate({"_id": ObjectID(folderID), + "owner": userID}, {"$set": {"parent": parent, "parentList": parentList}}); + + return folder; + } + + this.renameFolder = async(folderID, userID, title) => { + + const folder = await Folder.findOneAndUpdate({"_id": ObjectID(folderID), + "owner": userID}, {"$set": {"name": title}}); + + return folder; + } + + this.findAllFoldersByParent = async(parentID, userID) => { + + const folderList = await Folder.find({"parentList": parentID, "owner": userID}); + + return folderList; + + } +} + +module.exports = DbUtil; \ No newline at end of file diff --git a/src/enviroment/env.js b/src/enviroment/env.js new file mode 100644 index 0000000..df55f36 --- /dev/null +++ b/src/enviroment/env.js @@ -0,0 +1,9 @@ +module.exports = { + key: process.env.KEY, + newKey: process.env.NEW_KEY, + password: process.env.PASSWORD, + createAcctBlocked: process.env.BLOCK_CREATE_ACCOUNT, + root: process.env.ROOT, + url: process.env.URL, + mongoURL: process.env.MONGODB_URL +} \ No newline at end of file diff --git a/src/enviroment/envFrontEnd.js b/src/enviroment/envFrontEnd.js new file mode 100644 index 0000000..d1b45c0 --- /dev/null +++ b/src/enviroment/envFrontEnd.js @@ -0,0 +1,6 @@ +const env = { + port: process.env.PORT, + url: process.env.URL +} + +export default env; \ No newline at end of file diff --git a/src/express-routers/file.js b/src/express-routers/file.js new file mode 100644 index 0000000..f9f9860 --- /dev/null +++ b/src/express-routers/file.js @@ -0,0 +1,56 @@ +const express = require("express"); +const router = new express.Router; +const auth = require("../middleware/auth"); +const tempAuth = require("../middleware/tempAuth") +const tempAuthVideo = require("../middleware/tempAuthVideo") +const FileController = require("../controllers/file"); + +const fileController = new FileController() + +router.post("/file-service/upload", auth, fileController.uploadFile); + +router.post("/file-service/transcode-video", auth, fileController.transcodeVideo); + +router.get("/file-service/thumbnail/:id", auth, fileController.getThumbnail); + +router.get("/file-service/full-thumbnail/:id", auth, fileController.getFullThumbnail); + +router.get("/file-service/public/download/:id/:tempToken", fileController.getPublicDownload); + +router.get("/file-service/public/info/:id/:tempToken", fileController.getPublicInfo); + +router.get("/file-service/info/:id", auth, fileController.getFileInfo); + +router.get("/file-service/quick-list", auth, fileController.getQuickList); + +router.get("/file-service/list", auth, fileController.getList); + +router.get("/file-service/download/get-token", auth, fileController.getDownloadToken); + +router.get("/file-service/download/get-token-video", auth, fileController.getDownloadTokenVideo); + +router.get("/file-service/stream-video-transcoded/:id/:tempToken/:uuid", tempAuthVideo, fileController.streamTranscodedVideo); + +router.get("/file-service/stream-video/:id/:tempToken/:uuid", tempAuthVideo, fileController.streamVideo); + +router.get("/file-service/download/:id/:tempToken", tempAuth, fileController.downloadFile); + +router.get("/file-service/suggested-list", auth, fileController.getSuggestedList); + +router.patch("/file-service/make-public/:id", auth, fileController.makePublic); + +router.patch("/file-service/make-one/:id", auth, fileController.makeOneTimePublic); + +router.patch("/file-service/rename", auth, fileController.renameFile); + +router.patch("/file-service/move", auth, fileController.moveFile); + +router.delete("/file-service/remove-link/:id", auth, fileController.removeLink); + +router.delete("/file-service/remove/token-video/:tempToken", auth, fileController.removeTempToken); + +router.delete("/file-service/transcode-video/remove", auth, fileController.removeTranscodeVideo); + +router.delete("/file-service/remove", auth, fileController.deleteFile); + +module.exports = router; \ No newline at end of file diff --git a/src/express-routers/folder.js b/src/express-routers/folder.js new file mode 100644 index 0000000..117be38 --- /dev/null +++ b/src/express-routers/folder.js @@ -0,0 +1,23 @@ +const express = require("express"); +const router = new express.Router; +const auth = require("../middleware/auth"); +const FolderController = require("../controllers/folder"); +const folderController = new FolderController(); + +router.post("/folder-service/upload", auth, folderController.uploadFolder); + +router.delete("/folder-service/remove", auth, folderController.deleteFolder); + +router.delete("/folder-service/remove-all", auth, folderController.deleteAll); + +router.get("/folder-service/info/:id", auth, folderController.getInfo); + +router.get("/folder-service/subfolder-list", auth, folderController.getSubfolderList); + +router.get("/folder-service/list", auth, folderController.getFolderList); + +router.patch("/folder-service/rename", auth, folderController.renameFolder); + +router.patch("/folder-service/move", auth, folderController.moveFolder); + +module.exports = router; \ No newline at end of file diff --git a/src/express-routers/storage.js b/src/express-routers/storage.js new file mode 100644 index 0000000..5fa436b --- /dev/null +++ b/src/express-routers/storage.js @@ -0,0 +1,9 @@ +const express = require("express"); +const router = new express.Router; +const auth = require("../middleware/auth"); +const StorageController = require("../controllers/storage"); +const storageController = new StorageController(); + +router.get("/storage-service/info", auth, storageController.getStorageInfo); + +module.exports = router; \ No newline at end of file diff --git a/src/express-routers/user.js b/src/express-routers/user.js new file mode 100644 index 0000000..089a4ff --- /dev/null +++ b/src/express-routers/user.js @@ -0,0 +1,19 @@ +const express = require("express"); +const router = new express.Router; +const auth = require("../middleware/auth"); +const UserController = require("../controllers/user"); +const userController = new UserController(); + +router.get("/user-service/user", auth, userController.getUser); + +router.post("/user-service/login", userController.login); + +router.post("/user-service/logout", auth, userController.logout); + +router.post("/user-service/logout-all", auth, userController.logoutAll); + +router.post("/user-service/create", userController.createUser); + +router.post("/user-service/change-password", auth, userController.changePassword); + +module.exports = router; \ No newline at end of file diff --git a/src/middleware/auth.js b/src/middleware/auth.js new file mode 100644 index 0000000..35085f2 --- /dev/null +++ b/src/middleware/auth.js @@ -0,0 +1,49 @@ +const jwt = require("jsonwebtoken"); +const User = require("../models/user"); +const env = require("../enviroment/env"); + +const auth = async(req, res, next) => { + + try { + + const token = req.header("Authorization").replace("Bearer ", ""); + + const decoded = await jwt.verify(token, env.password); + + const iv = decoded.iv; + + const user = await User.findOne({_id: decoded._id}); + const encrpytionKey = user.getEncryptionKey(); + + const encryptedToken = user.encryptToken(token, encrpytionKey, iv); + + let tokenFound = false; + for (let i = 0; i < user.tokens.length; i++) { + + const currentToken = user.tokens[i].token; + + if (currentToken === encryptedToken) { + tokenFound = true; + break; + } + } + + if (!user || !tokenFound) { + + throw new Error("User not found") + + } else { + + req.token = token; + req.encryptedToken = encryptedToken + req.user = user; + next(); + } + + } catch (e) { + console.log(e); + res.status(401).send({error: "Error Authenticating"}) + } +} + +module.exports = auth; \ No newline at end of file diff --git a/src/middleware/tempAuth.js b/src/middleware/tempAuth.js new file mode 100644 index 0000000..06dec37 --- /dev/null +++ b/src/middleware/tempAuth.js @@ -0,0 +1,57 @@ +const jwt = require("jsonwebtoken"); +const User = require("../models/user"); +const env = require("../enviroment/env"); + +const tempAuth = async(req, res, next) => { + + try { + + const token = req.params.tempToken; + + const decoded = await jwt.verify(token, env.password); + + const iv = decoded.iv; + + const user = await User.findOne({_id: decoded._id}) + const encrpytionKey = user.getEncryptionKey(); + + const encryptedToken = user.encryptToken(token, encrpytionKey, iv); + + let tokenFound = false; + for (let i = 0; i < user.tempTokens.length; i++) { + + const currentToken = user.tempTokens[i].token; + + if (currentToken === encryptedToken) { + tokenFound = true; + break; + } + } + + if (!user || !tokenFound) { + + throw new Error("User Not Found") + + } else { + + user.tempTokens = user.tempTokens.filter((filterToken) => { + + return filterToken.token !== encryptedToken + }) + + await user.save(); + + req.user = user; + req.auth = true; + req.encryptedTempToken = encryptedToken; + + next(); + } + + } catch (e) { + console.log(e); + res.status(401).send(); + } +} + +module.exports = tempAuth; \ No newline at end of file diff --git a/src/middleware/tempAuthVideo.js b/src/middleware/tempAuthVideo.js new file mode 100644 index 0000000..3f62d06 --- /dev/null +++ b/src/middleware/tempAuthVideo.js @@ -0,0 +1,56 @@ +const jwt = require("jsonwebtoken"); +const User = require("../models/user"); +const env = require("../enviroment/env"); + +const tempAuthVideo = async(req, res, next) => { + + try { + + const token = req.params.tempToken; + + const decoded = await jwt.verify(token, env.password); + + const iv = decoded.iv; + + if (req.params.uuid !== decoded.cookie) { + + throw new Error("Cookie mismatch") + } + + const user = await User.findOne({_id: decoded._id}) + const encrpytionKey = user.getEncryptionKey(); + + const encryptedToken = user.encryptToken(token, encrpytionKey, iv); + + let tokenFound = false; + for (let i = 0; i < user.tempTokens.length; i++) { + + const currentToken = user.tempTokens[i].token; + + if (currentToken === encryptedToken) { + tokenFound = true; + break; + } + } + + if (!user || !tokenFound) { + + throw new Error("User not found"); + + } else { + + await user.save(); + + req.user = user; + req.auth = true; + req.encryptedTempToken = encryptedToken; + next(); + } + + } catch (e) { + console.log(e); + res.status(401).send(); + } +} + +module.exports = tempAuthVideo; \ No newline at end of file diff --git a/src/models/folder.js b/src/models/folder.js new file mode 100644 index 0000000..290fe0c --- /dev/null +++ b/src/models/folder.js @@ -0,0 +1,32 @@ +const mongoose = require("mongoose"); + +const folderSchema = new mongoose.Schema({ + + name: { + type: String, + required: true, + }, + + parent: { + type: String, + required: true, + }, + + owner: { + type: String, + required: true + }, + + parentList: { + type: Array, + required:true + } + + +}, { + timestamps: true +}) + +const Folder = mongoose.model("Folder", folderSchema); + +module.exports = Folder; \ No newline at end of file diff --git a/src/models/thumbnail.js b/src/models/thumbnail.js new file mode 100644 index 0000000..fe873c9 --- /dev/null +++ b/src/models/thumbnail.js @@ -0,0 +1,25 @@ +const mongoose = require("mongoose"); + +const thumbnailSchema = new mongoose.Schema({ + + name: { + type: String, + required: true, + }, + owner: { + type: String, + required: true + }, + + data: { + type: Buffer, + required: true + } + +}, { + timestamps: true +}) + +const Thumbnail = mongoose.model("Thumbnail", thumbnailSchema); + +module.exports = Thumbnail; \ No newline at end of file diff --git a/src/models/user.js b/src/models/user.js new file mode 100644 index 0000000..4c90626 --- /dev/null +++ b/src/models/user.js @@ -0,0 +1,275 @@ +const mongoose = require("mongoose"); +const validator = require("validator"); +const crypto = require("crypto"); +const bcrypt = require("bcrypt"); +const jwt = require("jsonwebtoken"); +const env = require("../enviroment/env"); + +const userSchema = mongoose.Schema({ + + name: + { + type:String, + trim: true + }, + email: { + type: String, + required: true, + trim: true, + unique: true, + lowercase: true, + validate(value) { + if (!validator.isEmail(value)) { + throw new Error("Email is invalid"); + } + } + }, + password: { + type: String, + trim: true, + required: true, + validate(value) { + if (value.length < 6) { + throw new Error("Password Length Not Sufficent"); + } + } + }, + tokens:[{ + token: { + type: String, + required: true + } + }], + tempTokens: [{ + token: { + type: String, + required: true + } + }], + privateKey: { + type: String, + }, + publicKey: { + type: String, + } + +}, { + timestamps: true +}) + +// userSchema.virtual("files", { +// ref: "fs.files", +// localField: "_id" +// }) + +userSchema.pre("save", async function(next) { + + const user = this; + + if (user.isModified("password")) { + user.password = await bcrypt.hash(user.password, 8); + } + + next(); +}) + +userSchema.statics.findByCreds = async(email, password) => { + + const user = await User.findOne({email}); + + if (!user) { + + throw new Error("User not found") + } + + const isMatch = await bcrypt.compare(password, user.password); + + if (!isMatch) { + console.log("incorrect password") + throw new Error("Incorrect password"); + } + + return user; +} + +userSchema.methods.toJSON = function() { + + const user = this; + + const userObject = user.toObject(); + + delete userObject.password; + delete userObject.tokens; + delete userObject.tempTokens; + + return userObject; +} + +userSchema.methods.generateAuthToken = async function() { + + const iv = crypto.randomBytes(16); + + const user = this; + let token = jwt.sign({_id:user._id.toString(), iv}, env.password); + const publicKey = user.publicKey; + + const encryptionKey = user.getEncryptionKey(); + + const encryptedToken = user.encryptToken(token, encryptionKey, iv); + + user.tokens = user.tokens.concat({token: encryptedToken}); + + await user.save(); + return token; +} + +userSchema.methods.encryptToken = function(token, key, iv) { + + iv = Buffer.from(iv, "hex") + + const TOKEN_CIPHER_KEY = crypto.createHash('sha256').update(key).digest(); + const cipher = crypto.createCipheriv('aes-256-cbc', TOKEN_CIPHER_KEY, iv); + let encryptedText = cipher.update(token); + encryptedText = Buffer.concat([encryptedText, cipher.final()]).toString("hex"); + + return encryptedText; +} + +userSchema.methods.decryptToken = function(encryptedToken, key, iv) { + + encryptedToken = Buffer.from(encryptedToken, "hex"); + iv = Buffer.from(iv, "hex") + + const TOKEN_CIPHER_KEY = crypto.createHash('sha256').update(key).digest(); + const decipher = crypto.createDecipheriv('aes-256-cbc', TOKEN_CIPHER_KEY, iv) + + let tokenDecrypted = decipher.update(encryptedToken); + tokenDecrypted = Buffer.concat([tokenDecrypted, decipher.final()]).toString(); + + return tokenDecrypted; +} + +userSchema.methods.generateEncryptionKeys = async function() { + + const user = this; + const userPassword = user.password; + const masterPassword = env.key; + + const randomKey = crypto.randomBytes(32); + + const iv = crypto.randomBytes(16); + const USER_CIPHER_KEY = crypto.createHash('sha256').update(userPassword).digest(); + const cipher = crypto.createCipheriv('aes-256-cbc', USER_CIPHER_KEY, iv); + let encryptedText = cipher.update(randomKey); + encryptedText = Buffer.concat([encryptedText, cipher.final()]); + + const MASTER_CIPHER_KEY = crypto.createHash('sha256').update(masterPassword).digest(); + const masterCipher = crypto.createCipheriv('aes-256-cbc', MASTER_CIPHER_KEY, iv); + let masterEncryptedText = masterCipher.update(encryptedText); + masterEncryptedText = Buffer.concat([masterEncryptedText, masterCipher.final()]).toString("hex"); + + user.privateKey = masterEncryptedText; + user.publicKey = iv.toString("hex"); + + await user.save(); +} + +userSchema.methods.getEncryptionKey = function() { + + const user = this; + const userPassword = user.password; + const masterEncryptedText = user.privateKey; + const masterPassword = env.key; + const iv = Buffer.from(user.publicKey, "hex"); + + const USER_CIPHER_KEY = crypto.createHash('sha256').update(userPassword).digest(); + const MASTER_CIPHER_KEY = crypto.createHash('sha256').update(masterPassword).digest(); + + const unhexMasterText = Buffer.from(masterEncryptedText, "hex"); + const masterDecipher = crypto.createDecipheriv('aes-256-cbc', MASTER_CIPHER_KEY, iv) + let masterDecrypted = masterDecipher.update(unhexMasterText); + masterDecrypted = Buffer.concat([masterDecrypted, masterDecipher.final()]) + + let decipher = crypto.createDecipheriv('aes-256-cbc', USER_CIPHER_KEY, iv); + let decrypted = decipher.update(masterDecrypted); + decrypted = Buffer.concat([decrypted, decipher.final()]); + + return decrypted; +} + +userSchema.methods.changeEncryptionKey = async function(randomKey) { + + const user = this; + const userPassword = user.password; + const masterPassword = env.key; + + const iv = crypto.randomBytes(16); + const USER_CIPHER_KEY = crypto.createHash('sha256').update(userPassword).digest(); + const cipher = crypto.createCipheriv('aes-256-cbc', USER_CIPHER_KEY, iv); + let encryptedText = cipher.update(randomKey); + encryptedText = Buffer.concat([encryptedText, cipher.final()]); + + const MASTER_CIPHER_KEY = crypto.createHash('sha256').update(masterPassword).digest(); + const masterCipher = crypto.createCipheriv('aes-256-cbc', MASTER_CIPHER_KEY, iv); + let masterEncryptedText = masterCipher.update(encryptedText); + masterEncryptedText = Buffer.concat([masterEncryptedText, masterCipher.final()]).toString("hex"); + + user.privateKey = masterEncryptedText; + user.publicKey = iv.toString("hex"); + + await user.save(); +} + +userSchema.methods.generateTempAuthToken = async function() { + + + // const user = this; + // let token = jwt.sign({_id:user._id.toString()}, env.password); + // const publicKey = user.publicKey; + + // const encryptionKey = user.getEncryptionKey(); + + // const encryptedToken = user.encryptToken(token, encryptionKey, publicKey); + + // user.tokens = user.tokens.concat({token: encryptedToken}); + + // await user.save(); + // return token; + + const iv = crypto.randomBytes(16); + + const user = this; + const token = jwt.sign({_id:user._id.toString(), iv}, env.password, {expiresIn:2}); + const publicKey = user.publicKey; + + const encryptionKey = user.getEncryptionKey(); + const encryptedToken = user.encryptToken(token, encryptionKey, iv); + + user.tempTokens = user.tempTokens.concat({token: encryptedToken}); + + await user.save(); + return token; +} + +userSchema.methods.generateTempAuthTokenVideo = async function(cookie) { + + const iv = crypto.randomBytes(16); + + const user = this; + const token = jwt.sign({_id:user._id.toString(), cookie, iv}, env.password, {expiresIn:"5h"}); + //const publicKey = user.publicKey; + + const encryptionKey = user.getEncryptionKey(); + const encryptedToken = user.encryptToken(token, encryptionKey, iv); + + //user.tempTokens = user.tempTokens.concat({token}); + user.tempTokens = user.tempTokens.concat({token: encryptedToken}); + + await user.save(); + return token; +} + + +const User = mongoose.model("User", userSchema); + +module.exports = User; \ No newline at end of file diff --git a/src/reducers/addOptions.js b/src/reducers/addOptions.js new file mode 100644 index 0000000..49eef86 --- /dev/null +++ b/src/reducers/addOptions.js @@ -0,0 +1,26 @@ +const defaultState = { + showAddOptions: false, + showAddOption2: false +} + +export default (state = defaultState, action) => { + + switch (action.type) { + + case "SHOW_ADD_OPTIONS": + + return { + ...state, + showAddOptions: action.show + } + + case "SHOW_ADD_OPTIONS2": + + return { + ...state, + showAddOptions2: action.show + } + default: + return state; + } +} \ No newline at end of file diff --git a/src/reducers/auth.js b/src/reducers/auth.js new file mode 100755 index 0000000..f5fa86d --- /dev/null +++ b/src/reducers/auth.js @@ -0,0 +1,13 @@ +export default (state = {}, action) => { + switch (action.type) { + + case "LOGIN": + return { + id: action.id + } + case "LOGOUT": + return {} + default: + return state + } +} \ No newline at end of file diff --git a/src/reducers/files.js b/src/reducers/files.js new file mode 100644 index 0000000..6faeb14 --- /dev/null +++ b/src/reducers/files.js @@ -0,0 +1,60 @@ +export default (state = [], action) => { + + switch (action.type) { + + case "SET_FILES": + return action.files + + case "ADD_FILE": + + return [ + action.file, + ...state + ] + + case "LOAD_MORE_FILES": + + return [ + ...state, + ...action.files + ] + + case "EDIT_FILE": + + return state.map((file) => { + + if (file._id === action.id) { + + return {...file, ...action.file} + + } else { + + return file + } + }) + + case "EDIT_FILE_METADATA": + + return state.map((file) => { + + if (file._id === action.id) { + + return {...file, metadata: {...file.metadata, ...action.metadata}} + + } else { + + return file + } + }) + + case "REMOVE_FILE": + + return state.filter((file) => { + + return file._id !== action.id + }) + + default: + return state; + } +} \ No newline at end of file diff --git a/src/reducers/filter.js b/src/reducers/filter.js new file mode 100644 index 0000000..a7fe7b8 --- /dev/null +++ b/src/reducers/filter.js @@ -0,0 +1,81 @@ +const defaultState = { + sortBy: "date_desc", + limit: 50, + search: "", + listView: false, + currentlySearching: false, +} + +export default (state = defaultState, action) => { + + switch(action.type) { + + case "ENABLE_LIST_VIEW": { + + return { + ...state, + listView: true + } + } + + case "DISABLE_LIST_VIEW": { + + return { + ...state, + listView: false + } + } + + case "SET_SORT_BY": { + + return { + ...state, + sortBy: action.sortBy + } + + } + + case "RESET_Filters": { + return defaultState + } + + case "SET_LIMIT": + + return { + ...state, + limit: action.limit + } + + case "SET_SEARCH": + + return { + ...state, + search: action.search + } + + case "RESET_SEARCH": + + return { + ...state, + search: "" + } + + case "SET_CURRENTLY_SEARCHING": + + return { + ...state, + currentlySearching: true + } + + case "RESET_CURRENTLY_SEARCHING": + + return { + ...state, + currentlySearching: false + } + + default: + return state; + } + +} \ No newline at end of file diff --git a/src/reducers/folders.js b/src/reducers/folders.js new file mode 100644 index 0000000..e3da570 --- /dev/null +++ b/src/reducers/folders.js @@ -0,0 +1,39 @@ +export default (state = [], action) => { + + switch(action.type) { + + case "ADD_FOLDER": + + return [ + action.folder, + ...state + ] + + case "EDIT_FOLDER": + + return state.map((folder) => { + + if (folder._id === action.id) { + + return {...folder, ...action.folder} + + } else { + + return folder + } + }) + + case "SET_FOLDERS": + + return action.folders; + + case "REMOVE_FOLDER": + + return state.filter((folder) => { + return action.id !== folder._id; + }) + + default: + return state; + } +} \ No newline at end of file diff --git a/src/reducers/main.js b/src/reducers/main.js new file mode 100644 index 0000000..f8eec6b --- /dev/null +++ b/src/reducers/main.js @@ -0,0 +1,85 @@ +import moment from "moment" + +const defaultState = { + showSideBar: true, + uploaderShow: true, + resetItems: moment.now(), + loadMoreItems: true, + loading: false, + loginFailed: false, +} + +export default (state = defaultState, action) => { + + switch (action.type) { + + case "SET_LOGIN_FAILED": + + return { + ...state, + loginFailed: action.message + } + + case "SET_LOADING": + + return { + ...state, + loading: action.load + } + + + case "LOAD_MORE_ITEMS": + + return { + + ...state, + loadMoreItems: action.load + } + + case "RESET_ITEMS": + + return { + ...state, + resetItems: moment.now() + } + + case "SHOW_UPLOADER": { + + return { + ...state, + uploaderShow: true + } + } + + case "HIDE_UPLOADER": { + + return { + ...state, + uploaderShow: false + } + } + + case "SHOW_SIDEBAR": + + return { + ...state, + showSideBar: true + } + case "HIDE_SIDEBAR": + + return { + ...state, + showSideBar: false + } + + case "GONE_SIDEBAR": + + return { + ...state, + showSideBar: "gone" + } + + default: + return state; + } +} \ No newline at end of file diff --git a/src/reducers/mover.js b/src/reducers/mover.js new file mode 100644 index 0000000..839010a --- /dev/null +++ b/src/reducers/mover.js @@ -0,0 +1,33 @@ +const defaultState = { + id: "", + parent: "/", + isFile: true, +} + +export default (state = defaultState, action) => { + + switch(action.type) { + + case "SET_MOVER_ID": + + return { + ...state, + id: action.id, + parent: action.parent, + isFile: action.isFile + } + + case "RESET_MOVER_ID": + + return { + ...state, + id: "", + parent: "/", + isFile: action.isFile + } + + default: { + return state; + } + } +} \ No newline at end of file diff --git a/src/reducers/parent.js b/src/reducers/parent.js new file mode 100644 index 0000000..cf39cfd --- /dev/null +++ b/src/reducers/parent.js @@ -0,0 +1,69 @@ +const defaultState = { + parentList: ["/"], + parentNameList: ["Home"], + parent: "/" +} + +export default (state = defaultState, action) => { + + switch (action.type) { + + case "SET_PARENT": + + return { + ...state, + parent: action.parent, + } + case "ADD_PARENT_LIST": + + return { + ...state, + parentList: [...state.parentList, action.parent], + parentNameList: [...state.parentNameList, action.name] + } + + case "ADJUST_PARENT_LIST": + + return { + ...state, + parentList: action.parentList, + parentNameList: action.parentNameList + } + + case "SET_PARENT_LIST": + + return { + ...state, + parentList: action.parentList, + parentNameList: action.parentNameList + } + + case "REMOVE_PARENT_LIST": + + return { + ...state, + parentList: parentList.filter((parent) => { + return parent._id !== action.parent + }) + } + + case "RESET_PARENT_LIST": + + return { + ...state, + parentList: ["/"], + parentNameList: ["Home"] + } + + case "ADD_PARENT_NAME_LIST": + + return { + ...state, + parentNameList: [...state.parentNameList, action.name] + } + + default: + return state; + } + +} \ No newline at end of file diff --git a/src/reducers/photoViewer.js b/src/reducers/photoViewer.js new file mode 100644 index 0000000..9455890 --- /dev/null +++ b/src/reducers/photoViewer.js @@ -0,0 +1,26 @@ +const defaultState = { + id: "" +} + +export default (state = defaultState, action) => { + + switch(action.type) { + + case "SET_PHOTO_ID": + + return { + ...state, + id: action.id + } + + case "RESET_PHOTO_ID": + + return { + ...state, + id: "" + } + + default: + return state; + } +} \ No newline at end of file diff --git a/src/reducers/popupFile.js b/src/reducers/popupFile.js new file mode 100644 index 0000000..a13507d --- /dev/null +++ b/src/reducers/popupFile.js @@ -0,0 +1,31 @@ +const defaultState = { + showPopup: false +} + +export default (state = defaultState, action) => { + + switch(action.type) { + + case "SET_POPUP_FILE": + + return action.file + + case "SHOW_POPUP": + + return { + ...state, + showPopup: true + } + + case "HIDE_POPUP": + + return { + ...state, + showPopup: false + } + + default: + + return state; + } +} \ No newline at end of file diff --git a/src/reducers/quickFiles.js b/src/reducers/quickFiles.js new file mode 100644 index 0000000..fe867b0 --- /dev/null +++ b/src/reducers/quickFiles.js @@ -0,0 +1,40 @@ +const defaultState = []; + + +export default (state = defaultState, action) => { + + switch(action.type) { + + case "SET_QUICK_FILES": + + return action.files + + case "ADD_QUICK_FILE": + + return [action.file, ...state] + + case "EDIT_FILE": + + return state.map((file) => { + + if (file._id === action.id) { + + return {...file, ...action.file} + + } else { + + return file + } + }) + + case "REMOVE_FILE": + + return state.filter((file) => { + + return file._id !== action.id + }) + + default: + return state; + } +} \ No newline at end of file diff --git a/src/reducers/routes.js b/src/reducers/routes.js new file mode 100644 index 0000000..d3eadf7 --- /dev/null +++ b/src/reducers/routes.js @@ -0,0 +1,26 @@ +const defaultState = { + currentRoute: "/home" +} + +export default (state = defaultState, action) => { + + switch (action.type) { + + case "SET_CURRENT_ROUTE": + + return { + ...state, + currentRoute: action.route + } + + case "RESET_CURRENT_ROUTE": + + return { + ...state, + currentRoute: "/home" + } + + default: + return state; + } +} \ No newline at end of file diff --git a/src/reducers/selectedItem.js b/src/reducers/selectedItem.js new file mode 100644 index 0000000..60573f7 --- /dev/null +++ b/src/reducers/selectedItem.js @@ -0,0 +1,83 @@ +const defaultState = { + name: "", + id: "", + selected: "", + rightSelected: "", + shareSelected: "", + selectedItem: "", + lastSelected: 0, + +} + +export default (state = defaultState, action) => { + + switch (action.type) { + + case "SET_SELECTED": + + return { + ...state, + selected: action.selected + } + + case "SET_SELECTED_ITEM": + + return { + ...state, + ...action.selectedItem + } + + case "EDIT_SELECTED_ITEM": + + return { + ...state, + ...action.item + } + + case "RESET_SELECTED_ITEM": + + return defaultState + + case "EDIT_SHARE_SELECTED": + + return { + ...state, + shareSelected: { + ...state.shareSelected, + ...action.selected + } + } + + case "SET_SHARE_SELECTED": + + return { + ...state, + shareSelected: action.selected + } + + case "SET_RIGHT_SELECTED": + + return { + ...state, + rightSelected: action.selected + } + + case "SET_LAST_SELECTED": + + return { + ...state, + lastSelected: action.lastSelected + } + + case "RESET_SELECTED": + + return { + ...state, + selected: "" + } + + + default: + return state; + } +} \ No newline at end of file diff --git a/src/reducers/settings.js b/src/reducers/settings.js new file mode 100644 index 0000000..6760b0c --- /dev/null +++ b/src/reducers/settings.js @@ -0,0 +1,32 @@ +const defaultState = { + + showSettings: false +} + +export default (state = defaultState, action) => { + + switch (action.type) { + + case "SHOW_SETTINGS": + + return { + ...state, + showSettings: true + } + + + case "HIDE_SETTINGS": + + return { + ...state, + showSettings: false + } + + + default: + + return state; + + } + +} \ No newline at end of file diff --git a/src/reducers/storage.js b/src/reducers/storage.js new file mode 100644 index 0000000..9e1d69d --- /dev/null +++ b/src/reducers/storage.js @@ -0,0 +1,25 @@ +const defaultState = { + free: 0, + total: 0, + available: 0 +} + +export default (state = defaultState, action) => { + + switch (action.type) { + + case "SET_STORAGE": + + return { + ...action.info + } + + case "RESET_STORAGE": + + return defaultState + + default: + + return state; + } +} \ No newline at end of file diff --git a/src/reducers/uploads.js b/src/reducers/uploads.js new file mode 100644 index 0000000..7be37b2 --- /dev/null +++ b/src/reducers/uploads.js @@ -0,0 +1,49 @@ +const defaultState = [] + +export default (state = defaultState, action) => { + + switch(action.type) { + + case "ADD_UPLOAD": + + return [action.upload, ...state] + + case "EDIT_UPLOAD": + + return state.map((upload) => { + + //console.log("edit upload", upload.id, action.id) + + if (upload.id === action.id) { + + //console.log("edit match", action.progress) + upload.progress = action.progress + upload.completed = action.completed + } + + return upload + + }) + + case "CANCEL_UPLOAD": + + return state.map((upload) => { + + if (upload.id === action.id) { + + upload.canceled = true; + } + + return upload + + }) + + case "RESET_UPLOADS": + + return [] + + default: + + return state + } +} \ No newline at end of file diff --git a/src/routers/AppRouter.js b/src/routers/AppRouter.js new file mode 100755 index 0000000..7b218bd --- /dev/null +++ b/src/routers/AppRouter.js @@ -0,0 +1,29 @@ +import React from "react"; +import {Router, Route, Switch} from "react-router-dom"; +import LoginPage from "../components/LoginPage" +import createHistory from "history/createBrowserHistory" +import HomePage from "../components/Homepage" +import PrivateRoute from "./PrivateRoute"; +import PublicRoute from "./PublicRoute"; +import DownloadPage from "../components/DownloadPage"; +import uuid from "uuid" + +export const history = createHistory() + +const AppRouter = () => ( + + + + + + + + + + + + + +) + +export default AppRouter; diff --git a/src/routers/PrivateRoute.js b/src/routers/PrivateRoute.js new file mode 100644 index 0000000..6fc490f --- /dev/null +++ b/src/routers/PrivateRoute.js @@ -0,0 +1,18 @@ +import React from "react"; +import {connect} from "react-redux"; +import {Route, Redirect} from "react-router-dom"; + +export const PrivateRoute = ({isAuthenticated, component: Component, ...rest}) => ( + +
+ ( + isAuthenticated ? () : () + )}/> +
+) + +const mapStateToProps = (state) => ({ + isAuthenticated: !!state.auth.id +}) + +export default connect(mapStateToProps)(PrivateRoute) \ No newline at end of file diff --git a/src/routers/PublicRoute.js b/src/routers/PublicRoute.js new file mode 100644 index 0000000..bac70dc --- /dev/null +++ b/src/routers/PublicRoute.js @@ -0,0 +1,15 @@ +import {connect} from "react-redux"; +import React from "react"; +import {Route, Redirect} from "react-router-dom" + +export const PublicRoute = ({isAuthenticated, component: Component}, ...rest) => ( + ( + isAuthenticated ? () : () + )}/> +) + +const connectStateToProps = (state) => ({ + isAuthenticated: !!state.auth.id +}) + +export default connect(connectStateToProps)(PublicRoute) \ No newline at end of file diff --git a/src/services/FileService/index.js b/src/services/FileService/index.js new file mode 100644 index 0000000..305ea6d --- /dev/null +++ b/src/services/FileService/index.js @@ -0,0 +1,896 @@ +const imageChecker = require("../../utils/imageChecker"); +const crypto= require("crypto"); +const videoChecker = require("../../utils/videoChecker"); +const mongoose = require("../../db/mongoose") +const conn = mongoose.connection; +const createThumbnail = require("./utils/createThumbnail"); +const Thumbnail = require("../../models/thumbnail"); +const ObjectID = require('mongodb').ObjectID +const NotAuthorizedError = require("../../utils/NotAuthorizedError"); +const NotFoundError = require("../../utils/NotFoundError"); +const env = require("../../enviroment/env"); +const jwt = require("jsonwebtoken"); +const removeChunks = require("./utils/removeChunks"); + + +const Folder = require("../../models/folder"); +const sortBySwitch = require("../../utils/sortBySwitch") +const createQuery = require("../../utils/createQuery"); +const ffmpeg = require("fluent-ffmpeg"); +const temp = require("temp").track(); +const progress = require("progress-stream"); +const fs = require("fs") +const DbUtilFile = require("../../db/utils/fileUtils"); +const DbUtilFolder = require("../../db/utils/folderUtils"); + +const dbUtilsFile = new DbUtilFile(); +const dbUtilsFolder = new DbUtilFolder(); + +const FileService = function() { + + this.upload = (user, busboy, req) => { + + return new Promise((resolve, reject) => { + + const password = user.getEncryptionKey(); + + let bucketStream; + + const initVect = crypto.randomBytes(16); + + const CIPHER_KEY = crypto.createHash('sha256').update(password).digest() + + const cipher = crypto.createCipheriv('aes256', CIPHER_KEY, initVect); + + cipher.on("error", async(e) => { + await removeChunks(bucketStream); + reject({ + message: "File service upload cipher error", + exception: e, + code: 500 + }) + }) + + const formData = new Map(); + + busboy.on("error", async(e) => { + await removeChunks(bucketStream); + reject({ + message: "File service upload busboy error", + exception: e, + code: 500 + }) + }) + + busboy.on("file", async(fieldname, file, filename) => { + + const parent = formData.get("parent") || "/" + const parentList = formData.get("parentList") || "/"; + const size = formData.get("size") || "" + let hasThumbnail = false; + let thumbnailID = "" + const isVideo = videoChecker(filename) + + const metadata = { + owner: user._id, + parent, + parentList, + hasThumbnail, + thumbnailID, + isVideo, + size, + IV: initVect + } + + + let bucket = new mongoose.mongo.GridFSBucket(conn.db, { + chunkSizeBytes: 1024 * 255 + }); + + + bucketStream = bucket.openUploadStream(filename, {metadata}) + + bucketStream.on("error", async(e) => { + await removeChunks(bucketStream); + reject({ + message: "Cannot upload file to database", + exception: e, + code: 500 + }) + }) + + req.on("aborted", async() => { + + console.log("Upload Request Cancelling..."); + + await removeChunks(bucketStream); + }) + + file.pipe(cipher).pipe(bucketStream); + + bucketStream.on("finish", async(file) => { + + const imageCheck = imageChecker(filename); + + if (file.length < 15728640 && imageCheck) { + + let updatedFile = await createThumbnail(file, filename, user); + + resolve(updatedFile); + + } else { + + resolve(file); + } + + }) + + }).on("field", (field, val) => { + + formData.set(field, val) + + }) + + }) + } + + this.getThumbnail = async(user, id) => { + + const password = user.getEncryptionKey(); + + const thumbnail = await Thumbnail.findById(id); + + if (user._id.toString() !== thumbnail.owner) { + + throw new NotAuthorizedError("Thumbnail Unauthorized Error"); + } + + const iv = thumbnail.data.slice(0, 16); + + const chunk = thumbnail.data.slice(16); + + const CIPHER_KEY = crypto.createHash('sha256').update(password).digest() + + const decipher = crypto.createDecipheriv("aes256", CIPHER_KEY, iv); + + const decryptedThumbnail = Buffer.concat([decipher.update(chunk), decipher.final()]); + + //console.log("decry", decryptedThumbnail); + + return decryptedThumbnail; + } + + this.getFullThumbnail = async(user, fileID, res) => { + + return new Promise((resolve, reject) => { + + const userID = user._id; + + dbUtilsFile.getFileInfo(fileID, userID).then( async(file) => { + + if (!file) { + reject({ + code: 401, + message: "File For Full Thumbnail Not Found", + exception: undefined + }) + } + + const bucket = new mongoose.mongo.GridFSBucket(conn.db, { + chunkSizeBytes: 1024 * 255, + }) + const password = user.getEncryptionKey(); + const IV = file.metadata.IV.buffer + + const readStream = bucket.openDownloadStream(ObjectID(fileID)) + + readStream.on("error", (e) => { + reject({ + code: 500, + message: "File service Full Thumbnail stream error", + exception: e + }) + }) + + const CIPHER_KEY = crypto.createHash('sha256').update(password).digest() + + const decipher = crypto.createDecipheriv('aes256', CIPHER_KEY, IV); + + decipher.on("error", (e) => { + reject({ + code: 500, + message: "File service Full Thumbnail decipher error", + exception: e + }) + }) + + res.set('Content-Type', 'binary/octet-stream'); + res.set('Content-Disposition', 'attachment; filename="' + file.filename + '"'); + res.set('Content-Length', file.metadata.size); + + readStream.pipe(decipher).pipe(res).on("finish", async() => { + console.log("Sent Full Thumbnail"); + resolve(); + }); + }); + }) + } + + this.publicDownload = (ID, tempToken, res) => { + + return new Promise((resolve, reject) => { + + dbUtilsFile.getPublicFile(ID).then((file) => { + + if (!file || !file.metadata.link || file.metadata.link !== tempToken) { + reject({ + code: 401, + message: "File not public/Not found", + exception: undefined + }) + } else { + + const bucket = new mongoose.mongo.GridFSBucket(conn.db, { + chunkSizeBytes: 1024 * 255, + }) + + const password = env.key; + const IV = file.metadata.IV.buffer + + const readStream = bucket.openDownloadStream(ObjectID(ID)) + + readStream.on("error", (e) => { + reject({ + code: 500, + message: "File service public download decipher error", + exception: e + }) + }) + + const CIPHER_KEY = crypto.createHash('sha256').update(password).digest() + + const decipher = crypto.createDecipheriv('aes256', CIPHER_KEY, IV); + + decipher.on("error", (e) => { + reject({ + code: 500, + message: "File service public download decipher error", + exception: e + }) + }) + + res.set('Content-Type', 'binary/octet-stream'); + res.set('Content-Disposition', 'attachment; filename="' + file.filename + '"'); + res.set('Content-Length', file.metadata.size); + + readStream.pipe(decipher).pipe(res).on("finish", async() => { + console.log("removing public link"); + await this.removePublicOneTimeLink(file); + resolve(); + }); + + } + + }) + }) + + } + + this.removePublicOneTimeLink = async(currentFile) => { + + const ID = currentFile._id; + + if (currentFile.metadata.linkType === "one") { + + await dbUtilsFile.removeOneTimePublicLink(ID); + } + } + + this.removeLink = async(userID, fileID) => { + + const file = await dbUtilsFile.removeLink(fileID, userID); + + if (!file.lastErrorObject.updatedExisting) throw new NotFoundError("Remove Link File Not Found Error") + } + + this.makePublic = async(user, fileID) => { + + const userID = user._id; + const token = await jwt.sign({_id: userID.toString()}, env.password); + + const file = await dbUtilsFile.makePublic(fileID, userID, token, "public"); + + if (!file.lastErrorObject.updatedExisting) throw new NotFoundError("Make Public File Not Found Error"); + + return token; + } + + this.getPublicInfo = async(fileID, tempToken) => { + + const file = await dbUtilsFile.getPublicInfo(fileID, tempToken); + + if (!file || !file.metadata.link || file.metadata.link !== tempToken) { + + throw new NotFoundError("Public Info Not Found"); + + } else { + + return file; + } + } + + this.makeOneTimePublic = async(userID, fileID) => { + + const token = await jwt.sign({_id: userID.toString()}, env.password); + + const file = await dbUtilsFile.makeOneTimePublic(fileID, userID, token); + + if (!file.lastErrorObject.updatedExisting) throw new NotFoundError("Make One Time Public Not Found Error"); + + return token; + } + + this.getFileInfo = async(userID, fileID) => { + + let currentFile = await dbUtilsFile.getFileInfo(fileID, userID) + + if (!currentFile) throw new NotFoundError("Get File Info Not Found Error"); + + const parentID = currentFile.metadata.parent + + let parentName = ""; + + if (parentID === "/") { + + parentName = "Home" + + } else { + + const parentFolder = await Folder.findOne({"owner": userID, "_id": parentID}); + + if (parentFolder) { + + parentName = parentFolder.name; + + } else { + + parentName = "Unknown" + } + + } + + return {...currentFile, parentName} + + } + + this.getQuickList = async(userID) => { + + const quickList = await dbUtilsFile.getQuickList(userID); + + if (!quickList) throw new NotFoundError("Quick List Not Found Error"); + + return quickList; + } + + this.getList = async(userID, query) => { + + let searchQuery = query.search || ""; + const parent = query.parent || "/"; + let limit = query.limit || 50; + let sortBy = query.sortby || "DEFAULT" + const startAt = query.startAt || undefined + const startAtDate = query.startAtDate || "0" + const startAtName = query.startAtName || "" + sortBy = sortBySwitch(sortBy) + limit = parseInt(limit) + + const queryObj = createQuery(userID, parent, query.sortby,startAt, startAtDate, searchQuery, startAtName) + + const fileList = await dbUtilsFile.getList(queryObj, sortBy, limit); + + if (!fileList) throw new NotFoundError("File List Not Found"); + + return fileList; + + } + + this.getDownloadToken = async(user) => { + + const tempToken = await user.generateTempAuthToken(); + + if (!tempToken) throw new NotAuthorizedError("Get Download Token Not Authorized Error"); + + return tempToken; + } + + this.getDownloadTokenVideo = async(user, cookie) => { + + if (!cookie) throw new NotAuthorizedError("Get Download Token Video Cookie Not Authorized Error"); + + const tempToken = await user.generateTempAuthTokenVideo(cookie); + + if (!tempToken) throw new NotAuthorizedError("Get Download Token Video Not Authorized Error"); + + return tempToken; + } + + this.removeTempToken = async(user, tempToken) => { + + const key = user.getEncryptionKey(); + + const decoded = await jwt.verify(tempToken, env.password); + + const publicKey = decoded.iv; + + const encryptedToken = user.encryptToken(tempToken, key, publicKey); + + const removedTokenUser = await dbUtilsFile.removeTempToken(user, encryptedToken); + + if (!removedTokenUser) throw new NotFoundError("Remove Temp Token User Not Found Errors"); + + await removedTokenUser.save(); + } + + this.transcodeVideo = (user, body) => { + + return new Promise((resolve, reject) => { + + const id = body.file._id; + const userID = user._id; + + conn.db.collection("fs.files") + .findOne({"_id": ObjectID(id), "metadata.owner": userID}).then((currentFile) => { + + if (!currentFile) { + reject({ + message: "Transcode Video Not Found Error", + exception: undefined, + code: 401 + }) + } else { + + const password = user.getEncryptionKey(); //env.key; + + const IV = currentFile.metadata.IV.buffer + + const bucket = new mongoose.mongo.GridFSBucket(conn.db); + + const readStream = bucket.openDownloadStream(ObjectID(id)); + + readStream.on("error", (e) => { + reject({ + message: "File service transcode video stream error", + exception: e, + code: 500 + }) + }) + + const CIPHER_KEY = crypto.createHash('sha256').update(password).digest() + + const decipher = crypto.createDecipheriv('aes256', CIPHER_KEY, IV); + + decipher.on("error", (e) => { + reject({ + message: "File service transcode video decipher error", + exception: e, + code: 500 + }) + }) + + const tempStream = temp.createWriteStream() + + tempStream.on("error", (e) => { + reject({ + message: "File service transcode video temp error", + exception: e, + code: 500 + }) + }) + + + readStream.pipe(decipher).pipe(tempStream).on("finish", () => { + + const writeBucket = new mongoose.mongo.GridFSBucket(conn.db, { + bucketName: "videos", + }); + + const gfsWrite = writeBucket.openUploadStream(currentFile.filename, { + _id: id, + }) + + gfsWrite.on("error", (e) => { + reject({ + message: "File service transcode video write stream error", + exception: e, + code: 500 + }) + }) + + const initVect = crypto.randomBytes(16); + + const cipher = crypto.createCipheriv('aes256', CIPHER_KEY, initVect); + + cipher.on("error", (e) => { + reject({ + message: "File service transcode video cipher write error", + exception: e, + code: 500 + }) + }) + + const str = progress({time: 100}) + + str.on("progress", () => { + + }); + + str.on("finish", () => { + + }) + + const tempStream2 = temp.createWriteStream() + + tempStream2.on("error", (e) => { + reject({ + message: "File service transcode video temp write error", + exception: e, + code: 500 + }) + }) + + const ffmpegCommand = ffmpeg() + .input(tempStream.path).outputOptions(['-movflags frag_keyframe+empty_moov', '-movflags +faststart']) + .outputFormat('mp4').on("error", (err, stdout, stderr) => { + console.log('An error occurred: ' + err.message, err, stderr); + reject({ + message: "Video Transcode Failed Error", + exception: err.message, + code: 500 + }) + }) + .videoCodec('libx264') + .audioBitrate('128k') + .videoBitrate(8000, true) + .pipe(tempStream2).on("finish", () => { + + fs.createReadStream(tempStream2.path).pipe(cipher).pipe(gfsWrite).on("finish", async(file) => { + + console.log("transcode finished"); + + await conn.db.collection("fs.files") + .findOneAndUpdate({"_id": ObjectID(id)}, {"$set": {"metadata.transcoded": true, "metadata.transcodedIV": initVect, "metadata.transcoded_size": tempStream2.bytesWritten, "metadata.transcodedID": file._id}}) + + resolve(); + + }).on("error", (e) => { + reject({ + message: "File service transcode read stream error", + exception: e, + code: 500 + }) + }) + }) + + ffmpegCommand.on("error", (e) => { + reject({ + message: "File service FFMPEG error", + exception: e, + code: 500 + }) + }) + + }) + + } + + }) + }) + + } + + this.removeTranscodeVideo = async(userID, fileID) => { + + const parentFile = await dbUtilsFile.getFileInfo(fileID, userID); + const transcodedVideoID = parentFile.metadata.transcodedID; + + const bucket = new mongoose.mongo.GridFSBucket(conn.db, { + bucketName: "videos" + }); + + try { + await bucket.delete(ObjectID(transcodedVideoID)); + } catch (e) { + console.log("Could Not Find Transcoded Video"); + } + + const file = await dbUtilsFile.removeTranscodeVideo(fileID, userID); + + if (!file) throw new NotFoundError("Remove Transcode Video Error"); + } + + this.streamTranscodedVideo = (userID, fileID, headers, res) => { + + return new Promise((resolve, reject) => { + + dbUtilsFile.getFileInfo(fileID, userID).then((file) => { + + if (!file) { + reject({ + code: 401, + message: "Stream Transcoded File Not Found", + exception: undefined + }) + } else { + + const fileSize = file.metadata.transcoded_size; + const transcodedVideoID = file.metadata.transcodedID; + + const password = user.getEncryptionKey(); //env.key; + + const range = headers.range + const parts = range.replace(/bytes=/, "").split("-") + const start = parseInt(parts[0], 10) + const end = parts[1] + ? parseInt(parts[1], 10) + : fileSize-1 + const chunksize = (end-start)+1 + const IV = file.metadata.transcodedIV.buffer + + let head = { + 'Content-Range': 'bytes ' + start + '-' + end + '/' + fileSize, + 'Accept-Ranges': 'bytes', + 'Content-Length': chunksize, + 'Content-Type': 'video/mp4' + } + + const bucket = new mongoose.mongo.GridFSBucket(conn.db, { + bucketName: "videos", + chunkSizeBytes: chunksize + }); + const readStream = bucket.openDownloadStream(ObjectID(transcodedVideoID), { + start: start, + end: end + }); + + readStream.on("error", (e) => { + reject({ + code: 500, + message: "File service transcode video stream error", + exception: e + }) + }) + + const CIPHER_KEY = crypto.createHash('sha256').update(password).digest() + + const decipher = crypto.createDecipheriv('aes256', CIPHER_KEY, IV); + decipher.setAutoPadding(false); + + decipher.on("error", (e) => { + reject({ + code: 500, + message: "File service transcode video decipher error", + exception: e + }) + }); + + res.writeHead(206, head); + + readStream.pipe(decipher).pipe(res).on("finish", () => { + + resolve(); + }); + } + + }) + + }) + } + + this.streamVideo = (user, fileID, headers, res) => { + + return new Promise((resolve, reject) => { + + const userID = user._id; + + dbUtilsFile.getFileInfo(fileID, userID).then((currentFile) => { + + if (!currentFile) { + reject({ + code: 401, + message: "Video Steam Not Found Error", + exception: undefined + }) + } else { + + const password = user.getEncryptionKey(); + const fileSize = currentFile.metadata.size; + + const range = headers.range + const parts = range.replace(/bytes=/, "").split("-") + let start = parseInt(parts[0], 10) + let end = parts[1] + ? parseInt(parts[1], 10) + : fileSize-1 + const chunksize = (end-start)+1 + const IV = currentFile.metadata.IV.buffer + + let head = { + 'Content-Range': 'bytes ' + start + '-' + end + '/' + fileSize, + 'Accept-Ranges': 'bytes', + 'Content-Length': chunksize, + 'Content-Type': 'video/mp4'} + + const bucket = new mongoose.mongo.GridFSBucket(conn.db, { + chunkSizeBytes: 1024 + }); + const readStream = bucket.openDownloadStream(ObjectID(fileID), { + start: start, + end: end.length + }); + + readStream.on("error", (e) => { + reject({ + code: 500, + message: "File service stream video stream error", + exception: e + }) + }) + + const CIPHER_KEY = crypto.createHash('sha256').update(password).digest() + + const decipher = crypto.createDecipheriv('aes256', CIPHER_KEY, IV); + + decipher.on("error", (e) => { + reject({ + code: 500, + message: "File service stream video decipher error", + exception: e + }) + }) + + res.writeHead(206, head); + + readStream.pipe(decipher).pipe(res).on("finish", () => { + resolve(); + }); + } + }) + }) + } + + this.downloadFile = (user, fileID, res) => { + + return new Promise((resolve, reject) => { + + const userID = user._id; + + dbUtilsFile.getFileInfo(fileID, userID).then((file) => { + + if (!file) { + reject({ + code: 401, + message: "Download File Not Found Error", + exception: undefined + }) + } else { + + const password = user.getEncryptionKey(); + + const bucket = new mongoose.mongo.GridFSBucket(conn.db); + + const IV = file.metadata.IV.buffer + + const readStream = bucket.openDownloadStream(ObjectID(fileID)) + + readStream.on("error", (e) => { + reject({ + code: 500, + message: "File service download decipher error", + exception: e + }) + }) + + const CIPHER_KEY = crypto.createHash('sha256').update(password).digest() + + const decipher = crypto.createDecipheriv('aes256', CIPHER_KEY, IV); + + decipher.on("error", (e) => { + reject({ + code: 500, + message: "File service download decipher error", + exception: e + }) + }) + + res.set('Content-Type', 'binary/octet-stream'); + res.set('Content-Disposition', 'attachment; filename="' + file.filename + '"'); + res.set('Content-Length', file.metadata.size); + + readStream.pipe(decipher).pipe(res).on("finish", () => { + resolve(); + }); + + } + + }) + + }) + } + + this.getSuggestedList = async(userID, searchQuery) => { + + searchQuery = new RegExp(searchQuery, 'i') + + const fileList = await dbUtilsFile.getFileSearchList(userID, searchQuery); + const folderList = await dbUtilsFolder.getFolderSearchList(userID, searchQuery); + + if (!fileList || !folderList) throw new NotFoundError("Suggested List Not Found Error"); + + return { + fileList, + folderList + } + } + + this.renameFile = async(userID, fileID, title) => { + + const file = await dbUtilsFile.renameFile(fileID, userID, title); + + if (!file.lastErrorObject.updatedExisting) throw new NotFoundError("Rename File Not Found Error"); + + return file; + } + + this.moveFile = async(userID, fileID, parentID) => { + + let parentList = ["/"]; + + if (parentID.length !== 1) { + + const parentFile = await dbUtilsFolder.getFolderInfo(parentID, userID); + if (!parentFile) throw new NotFoundError("Rename Parent File Not Found Error") + const parentList = parentFile.parentList; + parentList.push(parentID); + } + + const file = await dbUtilsFile.moveFile(fileID, userID, parentID, parentList.toString()); + + if (!file.lastErrorObject.updatedExisting) throw new NotFoundError("Rename File Not Found Error"); + + return file; + } + + this.deleteFile = async(userID, fileID) => { + + let bucket = new mongoose.mongo.GridFSBucket(conn.db, { + chunkSizeBytes: 1024 * 255, + }); + + const videoBucket = new mongoose.mongo.GridFSBucket(conn.db, { + bucketName: "videos" + }); + + const file = await dbUtilsFile.getFileInfo(fileID, userID); + + if (!file) throw new NotFoundError("Delete File Not Found Error"); + + if (file.metadata.thumbnailID) { + + await Thumbnail.deleteOne({_id: file.metadata.thumbnailID}); + } + + if (file.metadata.isVideo && file.metadata.transcoded) { + try { + await bucket.delete(ObjectID(file.metadata.transcodedID)); + } catch (e) { + console.log("Could Not Find Transcoded Video"); + } + } + + await bucket.delete(ObjectID(fileID)); + + } +} + +module.exports = FileService; + diff --git a/src/services/FileService/utils/createThumbnail.js b/src/services/FileService/utils/createThumbnail.js new file mode 100644 index 0000000..8a43a3f --- /dev/null +++ b/src/services/FileService/utils/createThumbnail.js @@ -0,0 +1,84 @@ +const mongoose = require("../../../db/mongoose") +const conn = mongoose.connection; +const crypto= require("crypto"); +const env = require("../../../enviroment/env"); +const Thumbnail = require("../../../models/thumbnail"); +const ObjectID = require('mongodb').ObjectID +const sharp = require("sharp"); +const concat = require("concat-stream") + +const createThumbnail = async(file, filename, user) => { + + return new Promise((resolve) => { + + const password = user.getEncryptionKey(); + + let CIPHER_KEY = crypto.createHash('sha256').update(password).digest() + + let bucket = new mongoose.mongo.GridFSBucket(conn.db, { + chunkSizeBytes: 1024 * 255 + }) + + const readStream = bucket.openDownloadStream(ObjectID(file._id)) + + readStream.on("error", (e) => { + console.log("File service upload thumbnail error", e); + resolve(file); + }) + + const decipher = crypto.createDecipheriv('aes256', CIPHER_KEY, file.metadata.IV); + + decipher.on("error", (e) => { + console.log("File service upload thumbnail decipher error", e); + resolve(file) + }) + + try { + + const concatStream = concat(async(bufferData) => { + + const thumbnailIV = crypto.randomBytes(16); + + //CIPHER_KEY = crypto.createHash('sha256').update(process.env.newPassword).digest() + + const thumbnailCipher = crypto.createCipheriv("aes256", CIPHER_KEY, thumbnailIV); + + bufferData = Buffer.concat([thumbnailIV, thumbnailCipher.update(bufferData), thumbnailCipher.final()]); //thumbnailCipher.update(bufferData) + + const thumbnailModel = new Thumbnail({name: filename, owner: user._id, data: bufferData}); + + await thumbnailModel.save(); + + let updatedFile = await conn.db.collection("fs.files") + .findOneAndUpdate({"_id": file._id}, {"$set": {"metadata.hasThumbnail": true, "metadata.thumbnailID": thumbnailModel._id}}) + + updatedFile = updatedFile.value; + + updatedFile = {...updatedFile, metadata: {...updatedFile.metadata, hasThumbnail: true, thumbnailID: thumbnailModel._id}} + + resolve(updatedFile); + + }).on("error", (e) => { + console.log("File service upload concat stream error", e); + resolve(file); + }) + + const imageResize = sharp().resize(300).on("error", (e) => { + + console.log("resize error", e); + resolve(file); + }) + + readStream.pipe(decipher).pipe(imageResize).pipe(concatStream); + + + } catch (e) { + + console.log(e); + resolve(file); + } + + }) +} + +module.exports = createThumbnail; \ No newline at end of file diff --git a/src/services/FileService/utils/removeChunks.js b/src/services/FileService/utils/removeChunks.js new file mode 100644 index 0000000..52bc691 --- /dev/null +++ b/src/services/FileService/utils/removeChunks.js @@ -0,0 +1,26 @@ +const DbUtilsFile = require("../../../db/utils/fileUtils"); +const dbUtilsFile = new DbUtilsFile(); + +const removeChunks = async(bucketStream) => { + + try { + + const uploadID = bucketStream.id; + + if (!uploadID || uploadID.length === 0) { + + console.log("Invalid uploadID for remove chunks"); + return; + } + + await dbUtilsFile.removeChunksByID(uploadID); + console.log("Upload Request Cancelled, Chunks Removed"); + + } catch(e) { + + console.log("Could not remove chunks for canceled upload", uploadID, e); + + } +} + +module.exports = removeChunks; \ No newline at end of file diff --git a/src/services/FolderService/index.js b/src/services/FolderService/index.js new file mode 100644 index 0000000..8353d14 --- /dev/null +++ b/src/services/FolderService/index.js @@ -0,0 +1,287 @@ +const Folder = require("../../models/folder"); +const InternalServerError = require("../../utils/InternalServerError"); +const NotFoundError = require("../../utils/NotFoundError"); +const UtilsFile = require("../../db/utils/fileUtils"); +const ObjectID = require('mongodb').ObjectID +const UtilsFolder = require("../../db/utils/folderUtils"); +const mongoose = require("../../db/mongoose") +const conn = mongoose.connection; +const Thumbnail = require("../../models/thumbnail"); +const sortBySwitch = require("../../utils/sortBySwitchFolder") + +const utilsFile = new UtilsFile(); +const utilsFolder = new UtilsFolder(); + +const FolderService = function() { + + this.uploadFolder = async(data) => { + + const folder = new Folder(data); + + await folder.save(); + + if (!folder) throw new InternalServerError("Upload Folder Error"); + + return folder; + } + + this.deleteFolder = async(userID, folderID, parentList) => { + + let bucket = new mongoose.mongo.GridFSBucket(conn.db, { + chunkSizeBytes: 1024 * 255 + }); + + const videoBucket = new mongoose.mongo.GridFSBucket(conn.db, { + bucketName: "videos" + }); + + const parentListString = parentList.toString() + + await Folder.deleteMany({"owner": userID, "parentList": { $all: parentList}}) + await Folder.deleteMany({"owner": userID, "_id": folderID}); + + const fileList = await utilsFile.getFileListByParent(userID, parentListString); + + if (!fileList) throw new NotFoundError("Delete File List Not Found"); + + for (let i = 0; i < fileList.length; i++) { + + const currentFile = fileList[i]; + + try { + + if (currentFile.metadata.thumbnailID) { + + await Thumbnail.deleteOne({_id: currentFile.metadata.thumbnailID}); + } + + if (currentFile.metadata.isVideo && currentFile.metadata.transcoded) { + + try { + await videoBucket.delete(ObjectID(currentFile.metadata.transcodedID)) + } catch (e) {console.log("Could Not Find Transcoded Video")} + + } + + await bucket.delete(ObjectID(currentFile._id)); + + } catch (e) { + + console.log("Could not delete file", currentFile.filename, currentFile._id); + } + + + } + } + + this.deleteAll = async(userID) => { + + console.log("remove all request") + + let bucket = new mongoose.mongo.GridFSBucket(conn.db, { + chunkSizeBytes: 1024 * 255 + }); + + const videoBucket = new mongoose.mongo.GridFSBucket(conn.db, { + bucketName: "videos" + }); + + await Folder.deleteMany({"owner": userID}); + + const fileList = await utilsFile.getFileListByOwner(userID); + + if (!fileList) throw new NotFoundError("Delete All File List Not Found Error"); + + for (let i = 0; i < fileList.length; i++) { + const currentFile = fileList[i]; + + try { + + if (currentFile.metadata.thumbnailID) { + + await Thumbnail.deleteOne({_id: currentFile.metadata.thumbnailID}) + } + + if (currentFile.metadata.isVideo && currentFile.metadata.transcoded) { + + try { + await videoBucket.delete(ObjectID(currentFile.metadata.transcodedID)) + } catch (e) { + console.log("Cannot Find Transcoded Video"); + } + + } + + await bucket.delete(ObjectID(currentFile._id)); + + } catch (e) { + + console.log("Could Not Remove File", currentFile.filename, currentFile._id); + } + } + + } + + this.getFolderInfo = async(userID, folderID) => { + + let currentFolder = await utilsFolder.getFolderInfo(folderID, userID); + + if (!currentFolder) throw new NotFoundError("Folder Info Not Found Error"); + + const parentID = currentFolder.parent; + + let parentName = ""; + + if (parentID === "/") { + + parentName = "Home" + + } else { + + const parentFolder = await utilsFolder.getFolderInfo(parentID, userID); + + if (parentFolder) { + + parentName = parentFolder.name; + + } else { + + parentName = "Unknown" + } + + } + + const folderName = currentFolder.name + + currentFolder = {...currentFolder._doc, parentName, folderName} + // Must Use ._doc here, or the destucturing/spreading + // Will add a bunch of unneeded variables to the object. + + return currentFolder; + } + + this.getFolderSublist = async(userID, folderID) => { + + const folder = await utilsFolder.getFolderInfo(folderID, userID); + + if (!folder) throw new NotFoundError("Folder Sublist Not Found Error"); + + const subfolderList = folder.parentList; + + let folderIDList = []; + let folderNameList = []; + + for (let i = 0; i < subfolderList.length; i++) { + + const currentSubFolderID = subfolderList[i]; + + if (currentSubFolderID === "/") { + + folderIDList.push("/"); + folderNameList.push("Home") + + } else { + + const currentFolder = await utilsFolder.getFolderInfo(currentSubFolderID, userID); + + folderIDList.push(currentFolder._id); + folderNameList.push(currentFolder.name) + } + } + + folderIDList.push(folderID); + folderNameList.push(folder.name) + + return { + folderIDList, + folderNameList + } + + } + + this.getFolderList = async(userID, query) => { + + let searchQuery = query.search || ""; + const parent = query.parent || "/"; + let sortBy = query.sortby || "DEFAULT" + sortBy = sortBySwitch(sortBy) + + if (searchQuery.length === 0) { + + const folderList = await utilsFolder.getFolderListByParent(userID, parent, sortBy); + + if (!folderList) throw new NotFoundError("Folder List Not Found Error"); + + return folderList; + + } else { + + searchQuery = new RegExp(searchQuery, 'i') + const folderList = await utilsFolder.getFolderListBySearch(userID, searchQuery, sortBy); + + if (!folderList) throw new NotFoundError("Folder List Not Found Error"); + + return folderList; + } + } + + this.renameFolder = async(userID, folderID, title) => { + + const folder = await utilsFolder.renameFolder(folderID, userID, title); + + if (!folder) throw new NotFoundError("Rename Folder Not Found"); + } + + this.moveFolder = async(userID, folderID, parentID) => { + + let parentList = ["/"]; + + if (parentID.length !== 1) { + + const parentFile = await utilsFolder.getFolderInfo(parentID, userID); + parentList = parentFile.parentList; + parentList.push(parentID); + } + + const folder = await utilsFolder.moveFolder(folderID, userID, parentID, parentList); + + if (!folder) throw new NotFoundError("Move Folder Not Found") + + const folderChilden = await utilsFolder.findAllFoldersByParent(folderID.toString(), userID); + + folderChilden.map( async(currentFolderChild) => { + + let currentFolderChildParentList = currentFolderChild.parentList; + + const indexOfFolderID = currentFolderChildParentList.indexOf(folderID.toString()); + + currentFolderChildParentList = currentFolderChildParentList.splice(indexOfFolderID); + + currentFolderChildParentList = [...parentList, ...currentFolderChildParentList]; + + currentFolderChild.parentList = currentFolderChildParentList; + + await currentFolderChild.save() + }) + + const fileChildren = await utilsFile.getFileListByParent(userID, folderID.toString()); + + fileChildren.map( async(currentFileChild) => { + + let currentFileChildParentList = currentFileChild.metadata.parentList; + + currentFileChildParentList = currentFileChildParentList.split(","); + + const indexOfFolderID = currentFileChildParentList.indexOf(folderID.toString()); + + currentFileChildParentList = currentFileChildParentList.splice(indexOfFolderID); + + currentFileChildParentList = [...parentList, ...currentFileChildParentList]; + + await utilsFile.moveFile(currentFileChild._id, userID, currentFileChild.metadata.parent, currentFileChildParentList.toString()) + + }) + } +} + +module.exports = FolderService; \ No newline at end of file diff --git a/src/services/UserService/index.js b/src/services/UserService/index.js new file mode 100644 index 0000000..b18ed44 --- /dev/null +++ b/src/services/UserService/index.js @@ -0,0 +1,79 @@ +const User = require("../../models/user"); +const bcrypt = require("bcrypt"); +const crypto = require("crypto"); +const NotFoundError = require("../../utils/NotFoundError"); +const InternalServerError = require("../../utils/InternalServerError"); +const NotAuthorizedError = require("../../utils/NotAuthorizedError"); + +const UserService = function() { + + this.login = async(userData) => { + + const email = userData.email; + const password = userData.password; + + const user = await User.findByCreds(email, password); + + const token = await user.generateAuthToken(); + + if (!user || !token) throw new NotFoundError("Login User Not Found Error"); + + return {user, token} + } + + this.logout = async(user, userToken) => { + + user.tokens = user.tokens.filter((token) => { + return token.token !== userToken; + }) + + await user.save(); + } + + this.logoutAll = async(user) => { + + user.tokens = [] + user.tempTokens = []; + + await user.save(); + } + + this.create = async(userData) => { + + console.log("Create"); + + const user = new User(userData); + await user.save(); + + await user.generateEncryptionKeys(); + + const token = await user.generateAuthToken(); + + if (!user || !token) throw new InternalServerError("Could Not Create New User Error"); + + return {user, token} + } + + this.changePassword = async(user, oldPassword, newPassword) => { + + const isMatch = await bcrypt.compare(oldPassword, user.password); + + if (!isMatch) throw new NotAuthorizedError("Change Passwords Do Not Match Error"); + + const encryptionKey = user.getEncryptionKey(); + + user.password = newPassword; + + user.tokens = []; + user.tempTokens = []; + + await user.save(); + await user.changeEncryptionKey(encryptionKey); + + const newToken = await user.generateAuthToken(); + + return newToken; + } +} + +module.exports = UserService; \ No newline at end of file diff --git a/src/store/configureStore.js b/src/store/configureStore.js new file mode 100755 index 0000000..d72dd41 --- /dev/null +++ b/src/store/configureStore.js @@ -0,0 +1,49 @@ +import {createStore, combineReducers, applyMiddleware} from "redux" +import thunk from "redux-thunk"; +import authReducer from "../reducers/auth"; +import mainReducer from "../reducers/main"; +import fileReducer from "../reducers/files" +import folderReducer from "../reducers/folders" +import filterReducer from "../reducers/filter"; +import selectedItemReducer from "../reducers/selectedItem"; +import uploadsReducer from "../reducers/uploads"; +import storageReducer from "../reducers/storage"; +import quickFilesReducer from "../reducers/quickFiles"; +import popupFilesReducer from "../reducers/popupFile"; +import settingsReducer from "../reducers/settings"; +import parentReducer from "../reducers/parent"; +import addOptionsReducer from "../reducers/addOptions"; +import photoViewerReducer from "../reducers/photoViewer"; +import routesReducer from "../reducers/routes"; +import moverReducer from "../reducers/mover"; + +//const composeEnchancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose; + +export default () => { + + const store = createStore( + combineReducers({ + auth: authReducer, + main:mainReducer, + files: fileReducer, + folders: folderReducer, + filter: filterReducer, + selectedItem: selectedItemReducer, + uploads: uploadsReducer, + storage: storageReducer, + quickFiles: quickFilesReducer, + popupFile: popupFilesReducer, + settings: settingsReducer, + parent: parentReducer, + addOptions: addOptionsReducer, + photoViewer: photoViewerReducer, + routes: routesReducer, + mover: moverReducer + }), + + applyMiddleware(thunk) + //composeEnchancers(applyMiddleware(thunk)) + ) + + return store; +} \ No newline at end of file diff --git a/src/styles/base/_base.scss b/src/styles/base/_base.scss new file mode 100644 index 0000000..3707c06 --- /dev/null +++ b/src/styles/base/_base.scss @@ -0,0 +1,23 @@ +* { + box-sizing: border-box; +} + +html { + font-size: 62.5% +} + +body { + color: $dark-grey; + font-family: Helvetica, Arial, sans-serif; + font-size: $m-size; + background-color: white; + line-height: 1.6; +} + +button { + cursor: pointer; +} + +button:disabled { + cursor: default; +} diff --git a/src/styles/base/_settings.scss b/src/styles/base/_settings.scss new file mode 100644 index 0000000..8ed2469 --- /dev/null +++ b/src/styles/base/_settings.scss @@ -0,0 +1,17 @@ +// Sizes + +$s-size: 1.2rem; +$m-size: 1.6rem; +$l-size: 3.2rem; +$xl-size: 4.8rem; +$dark-grey: #333333; +$blue: #1c88bf; +$dark-blue: #364051; +$off-white: #f7f7f7; +$grey: #666; +$desktop-breakpoint: 45rem; +$teal: #00bfa5; +$small-border: 2px; + +// font sizees +$font-size-large: 1.8rem; diff --git a/src/styles/components/_ContentMenu.scss b/src/styles/components/_ContentMenu.scss new file mode 100644 index 0000000..d2ce286 --- /dev/null +++ b/src/styles/components/_ContentMenu.scss @@ -0,0 +1,70 @@ +.context-menu { + background: white; + position: absolute; + width: 230px; + + z-index: 1; + box-shadow: 0 1px 2px 0 rgba(60,64,67,0.302), 0 1px 3px 1px rgba(60,64,67,0.149); + border: 1px solid #dadce0; + border-radius: 10px; + overflow: hidden; + height: fit-content; + + @media (max-width: $desktop-breakpoint) { + + position: fixed; + width: 99%; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + } +} + +.context__item { + display: flex; + height: 41px; + + @media (max-width: $desktop-breakpoint) { + + height: 55px; + } +} + +.context__item:hover { + background: lightgrey; + + + @media (max-width: $desktop-breakpoint) { + + background: white; + } + +} + +.context__item:active { + + background: lightgrey; +} + +.context__item__image { + width: 30px; + /* height: 43px; */ + opacity: 0.7; + margin-left: 7px; + + @media (max-width: $desktop-breakpoint) { + + width: 40px; + } +} + +.context__item__title { + color: black; + margin-left: 7px; + font-weight: 300; + font-size: 13px; + + @media (max-width: $desktop-breakpoint) { + + font-size: 15px; + } +} \ No newline at end of file diff --git a/src/styles/components/_Dataform.scss b/src/styles/components/_Dataform.scss new file mode 100644 index 0000000..dd3254c --- /dev/null +++ b/src/styles/components/_Dataform.scss @@ -0,0 +1,16 @@ +.dataform { + display: flex; + flex-wrap: wrap; + flex-direction: row; + justify-content: start; +} + +.dataform__item { + flex-basis: 100px; + flex-grow: 1; +} + +.dataform__no-files { + text-align: center; + font-weight: 300; +} \ No newline at end of file diff --git a/src/styles/components/_DownloadPage.scss b/src/styles/components/_DownloadPage.scss new file mode 100644 index 0000000..ab90849 --- /dev/null +++ b/src/styles/components/_DownloadPage.scss @@ -0,0 +1,49 @@ +.downloadpage { + width: 100vw; + height: 100vh; +} + +.downloadpage__box { + + display: flex; + flex-direction: column; + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + margin: auto; + justify-content: center; + width: 345px; + align-items: center; + height: 289px; + padding: 3.2rem 1.6rem 1.2rem 1.6rem; + border: 0.5px; + border-style: groove; + /* position: relative; */ + border-radius: 7px; +} + +.downloadpage__box__button { + color: red; +} + +.downloadpage__box__title { + color: black; + font-size: 19px; + margin-top: -18px; + font-weight: 300; + max-width: 94%; + overflow: hidden; + text-overflow: ellipsis; + text-align: center; +} + +.downloadpage__box__subtitle { + color: black; + font-weight: 200; + font-size: 12px; + max-width: 94%; + overflow: hidden; + text-overflow: ellipsis; +} \ No newline at end of file diff --git a/src/styles/components/_File.scss b/src/styles/components/_File.scss new file mode 100644 index 0000000..b71aa27 --- /dev/null +++ b/src/styles/components/_File.scss @@ -0,0 +1,234 @@ +.file__item { + flex-grow: 1; + display: flex; + flex-direction: column; + border: 1px solid #dadce0; + align-items: center; + justify-content: initial; + border-radius: 10px; + flex-basis: 23%; + max-width: 23%; + margin: 5px; + cursor: pointer; + height: 171px; + + // overflow: hidden; + position: relative; + + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-tap-highlight-color: transparent; + + @media (max-width: $desktop-breakpoint) { + flex-basis: 28%; + max-width: 30.2%; + position: unset + } +} + +.file__item--selected { + background:#e8f0fe; +} + +.file__title { + color: #373737; + margin-top: 25px; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + width: 90%; + max-width: 23vw; + text-align: center; + font-weight: 300; + // text-transform: capitalize; +} + +.file__title--gone { + + display: none; +} + +.file__title--selected { + color: #1967d2; +} + +.file__image__wrapper { + + width: 100px; + height: 100px; + position: relative; + display: flex; + flex-direction: column; + justify-content: center; + overflow: hidden; +} + +.file__image { + width: 100px; + opacity: 0.7; +} + +.file__item__wrapper { + flex-grow: 1; + display: flex; + flex-direction: column; + align-items: center; + justify-content: initial; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-tap-highlight-color: transparent; + width: 100%; + height: 100%; +} + +.file__item__listview { + + flex-grow: 1; + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; + border-radius: 10px; + flex-basis: 98%; + min-width: 98%; + max-width: 98%; + max-width: 99%; + width: 100%; + margin: 5px; + cursor: pointer; + height: 50px; + position: relative; + + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-tap-highlight-color: transparent; + + @media (max-width: $desktop-breakpoint) { + position: unset + } + +} + +.file__item__listview--smaller-max-width { + max-width: 98%; +} + +.file__image__listview { + width: 31px; + opacity: 0.7; + min-width: 31px; +} + +.file__image__listview--mover { + + @media (max-width: $desktop-breakpoint) { + width: 38px; + min-width: 38px; + } +} + +.file__image__listview--no-opacity { + width: 31px; + opacity: 1; + /* min-width: 30px; */ + /* max-width: 30px; */ + height: 33px; + /* max-height: 30px; */ + border-radius: 5px; +} + +.file__image--no-opacity { + width: 87%; + max-height: 100%; + object-fit: cover; + opacity: 1; + max-width: 100%; + margin-top: 8px; + padding: -1px; + border-radius: 11px; + margin-left: 6.5%; +} + +.file__title__listview { + color: #373737; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + max-width: 18%; + width: 18%; + min-width: 18%; + text-align: center; + font-weight: 300; + margin-right: 15px; + text-align: left; +} + +.file__title__listview--no-margin { + margin-right: none +} + +.file__title__listview--no-max { + max-width: none; + width: unset; + padding-left: 7px; +} + +.file__title__listview--mover { + + @media (max-width: $desktop-breakpoint) { + font-size: 18px; + } +} + +.file__item__listview__title__wrapper { + display: flex; + flex-direction: row; + margin-left: 15px; + max-width: 30%; + min-width: 30%; + width: 30%; + align-items: center; +} + +.file__item__listview__title__wrapper--folder { + display: flex; + flex-direction: row; + margin-left: 15px; + max-width: 50%; + min-width: 30%; + width: 50%; + align-items: center; +} + +.file__item__listview__title__wrapper--mover { + + max-width: 63%; + width: 63%; +} + +.file__item__tag { + + width: 49px; + height: 25px; + background: lightblue; + position: absolute; + top: 60px; + left: 9px; + border-radius: 5px; +} + +.file__item__tag__title { + font-size: 10px; +} diff --git a/src/styles/components/_Filter.scss b/src/styles/components/_Filter.scss new file mode 100644 index 0000000..0939195 --- /dev/null +++ b/src/styles/components/_Filter.scss @@ -0,0 +1,55 @@ +.filter { + display: flex; + justify-content: space-between; + align-items: center; + height: 52px; +} + +.filter__folder-wrapper { + background: white; +} + +.filter__folder-title { + color: #5f6368; + margin-left: 22px; + font-weight: 500; + font-size: 13px; +} +.filter__folder-title-wrapper { + margin-left: 15px; +} + +.filters__wrapper { + margin-right: 6%; + display: flex; + flex-direction: row; +} + +.filter__select-wrapper { + margin-right: 7px; + display: flex; + flex-direction: row; +} + +.filter__select-image { + margin-top: 5px; + width: 18px; + opacity: 0.7; +} + +.filter__select { + background: none; + border: none; + -moz-appearance: none; + -webkit-appearance: none; + color: #5f6368; + font-size: 13px; + outline: none; + font-weight: 500; + padding-left: 3px; + padding-right: 4px; +} + +.filter__select:hover { + background: lightgrey +} \ No newline at end of file diff --git a/src/styles/components/_Folder.scss b/src/styles/components/_Folder.scss new file mode 100644 index 0000000..dc58011 --- /dev/null +++ b/src/styles/components/_Folder.scss @@ -0,0 +1,91 @@ +.folder__image { + width: 30px; + height: 30px; + margin-left: 10px; + opacity: 0.7; + + @media (max-width: $desktop-breakpoint) { + // flex-basis: 29%; + max-width: 31%; + } + +} + +.folder__title { + color: #373737; + margin-right: 2px; + margin-top: 25px; + margin-left: 4px; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + width: 77%; + max-width: 50vw; + font-weight: 300; + text-transform: capitalize; +} + +.folder__title--selected { + color: #1967d2; +} + +.folder__item { + + flex-grow: 1; + display: flex; + flex-direction: row; + /* border: 1px solid #dadce0; */ + align-items: center; + justify-content: initial; + /* border-radius: 10px; */ + /* flex-basis: 23%; */ + /* max-width: 23%; */ + height: 100%; + width: 100%; + /* margin: 5px; */ + /* height: 50px; */ + cursor: pointer; + /* position: relative; */ + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-tap-highlight-color: transparent; + +} + +.folder__item__wrapper { + + flex-grow: 1; + display: flex; + flex-direction: row; + border: 1px solid #dadce0; + align-items: center; + justify-content: initial; + border-radius: 10px; + flex-basis: 23%; + max-width: 23%; + margin: 5px; + height: 50px; + cursor: pointer; + position: relative; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-tap-highlight-color: transparent; + + @media (max-width: $desktop-breakpoint) { + flex-basis: 46%; + max-width: 47%; + position: unset; + } +} + +.folder__item--selected { + background:#e8f0fe; +} \ No newline at end of file diff --git a/src/styles/components/_Header.scss b/src/styles/components/_Header.scss new file mode 100644 index 0000000..7576da9 --- /dev/null +++ b/src/styles/components/_Header.scss @@ -0,0 +1,206 @@ +.header { + text-align: center; + // height: 11vh; + display: flex; + flex-direction: row; + border-bottom: 1px solid #dadce0; + justify-content: space-between; + /* display: none; */ + position: absolute; + /* top: 0; */ + width: 100%; +} + +.header__title { + color: white; + text-decoration: none; + h1 { + margin: 0; + } +} + +.header__image { + width: 100px; + height: 30px; + margin: 20px 0 15px 20px; + cursor: pointer; + user-select: none; + + @media (max-width: $desktop-breakpoint) { + width: 73px; + height: 24px; + margin: 25px 0 15px 14px; + display: none; + } + +} + +.header__form { + width: 55%; + margin-left: -179px; + position: relative; + + @media (max-width: $desktop-breakpoint) { + width: 67%; + margin-top: 5px; + margin-left: 8px; + position: unset; + } +} + + +.header__content { + display: flex; + justify-content: space-between; + align-items: center; + padding: $s-size 0; +} + +.header__setting { + width: 30px; + height: 30px; + /* position: fixed; */ + /* right: 15px; */ + /* top: 0px; */ + margin: 20px 20px 20px 0; + cursor: pointer; + + @media (max-width: $desktop-breakpoint) { + margin: 25px 20px 20px 10px; + } + + +} + +.header__input { + border: 1px solid #f1f3f4; + height: 50px; + font-size: 1.8rem; + font-weight: 300; + padding: 1.2rem; + margin: 10px 0 10px 0; + /* margin-left: 130px; */ + width: 100%; + border-radius: 3px; + background: #f1f3f4; + + @media (max-width: $desktop-breakpoint) { + + width: 121%; + } +} +.header__input:focus { + + background: white; + outline: none; + border-style: groove; +} + +.header__input__suggested { + width: 100%; + max-height: 43vh; + overflow: scroll; + background: white; + /* color: black; */ + margin-top: -10px; + position: absolute; + z-index: 3; + box-shadow: 0 2px 8px 0 rgba(0,0,0,0.2); + border-radius: 0 0 6px 6px; + border: groove 1px #f1f3f4; + + scrollbar-width: none; /* Firefox */ + -ms-overflow-style: none; /* IE 10+ */ + &::-webkit-scrollbar { + width: 0px; + background: transparent; /* Chrome/Safari/Webkit */ + } + + @media (max-width: $desktop-breakpoint) { + + width: 100vw; + // margin-left: -23vw; + left: 0; + max-height: 50vh; + overflow: scroll; + background: white; + margin-top: 1px; + position: absolute; + z-index: 3; + box-shadow: 0 2px 8px 0 rgba(0,0,0,0.2); + border-radius: 0 0 6px 6px; + border: groove 1px #f1f3f4; + } + +} + + +.header__input__suggested--gone { + display: none; +} + +.header__input__suggested__item { + display: flex; + flex-direction: row; + justify-content: space-between; +} + +.header__input__suggested__item:hover { + + background: lightgrey; + border-radius: 6px; +} + +.header__input__suggested__item__title__wrapper { + + height: inherit; + color: red; + /* width: 400px; */ + display: flex; + flex-direction: row; +} + +.header__input__suggested__item__title { + color: #373737;; + font-weight: 300; + font-size: 18px; + padding-left: 9px; + font-size: small; + text-overflow: ellipsis; + max-width: 41vw; + overflow: hidden; + white-space: nowrap; + + @media (max-width: $desktop-breakpoint) { + color: #373737; + font-weight: 300; + font-size: 18px; + padding-left: 9px; + font-size: medium; + text-overflow: ellipsis; + max-width: 41vw; + overflow: hidden; + white-space: nowrap; + } + +} + +.header__input__suggested__item__subtitle { + color: #373737;; + font-weight: 100; + font-size: small; + margin-right: 10px; +} + +.header__input__suggested__item__image { + width: 25px; + margin-left: 10px; + opacity: 0.7; + + @media (max-width: $desktop-breakpoint) { + width: 42px; + margin-left: 10px; + opacity: 0.7; + } + +} \ No newline at end of file diff --git a/src/styles/components/_HomePage.scss b/src/styles/components/_HomePage.scss new file mode 100644 index 0000000..549d692 --- /dev/null +++ b/src/styles/components/_HomePage.scss @@ -0,0 +1,47 @@ +.section { + float: left; + height: 100%; + width: 100%; + overflow-x: hidden; + overflow-y: scroll; + + + scrollbar-width: none; /* Firefox */ + -ms-overflow-style: none; /* IE 10+ */ + &::-webkit-scrollbar { + width: 0px; + background: transparent; /* Chrome/Safari/Webkit */ + } + +} +.main-container { + display: flex; + flex-direction: column; + width: 80vw; + width: fill-available; + // overflow-y: scroll; + overflow-x: hidden; + + @media (max-width: $desktop-breakpoint) { + width: 100vw; + } + +} + +.sub-container { + width: inherit; + // height: 83vh; + height: -webkit-fill-available; + display: inherit; + overflow: hidden; +} + +.main-page { + background: white; + height: 100vh; + width: 100vw; + display: inline-flex; + padding-top: 71px; +} + + diff --git a/src/styles/components/_LeftSection.scss b/src/styles/components/_LeftSection.scss new file mode 100644 index 0000000..d431f41 --- /dev/null +++ b/src/styles/components/_LeftSection.scss @@ -0,0 +1,203 @@ +.section--left { + margin: 0 3px 0 0; + width: 20vw; + min-width: 20%; + display: flex; + flex-direction: column; + justify-content: space-between; + // background: green; + @media (max-width: $desktop-breakpoint) { + display: none + } +} + +.add-button { + display: inline-flex; + flex-direction: row; + margin-top: 13px; + margin-left: 12px; + height: 50px; + width: 132px; + align-items: center; + box-shadow: 0 1px 2px 0 rgba(60,64,67,0.302), 0 1px 3px 1px rgba(60,64,67,0.149); + border: 1px solid transparent; + border-radius: 24px; + overflow: hidden; + cursor: pointer; + user-select: none; + + @media (max-width: $desktop-breakpoint) { + height: 40px; + width: 104px; + margin-left: 6px; + margin-top: 6px; + min-height: 40px; + } +} + +.add-button__img { + width: 30px; + height: 30px; + margin-left: 13px; + margin-bottom: 3px; + + @media (max-width: $desktop-breakpoint) { + height: unset; + width: 21%; + margin-bottom: 1px; + } +} + +.add-button__title { + font-weight: 500; + color: #373737; + padding-left: 2px; + -moz-appearance: none; + -webkit-appearance: none; + background: none; + border: none; + font-size: 20px; + margin-left: 10px; + width: 50%; + + @media (max-width: $desktop-breakpoint) { + padding-left: 0px; + font-size: 17px; + margin-left: 8px; + } +} + +.add-button__title:focus { + outline: none; +} + +.add-button__option-wrapper { + position: absolute; + background: white; + border: none; + height: 200px; + width: 300px; + max-height: 0px; + overflow: hidden; + margin-left: -3px; + z-index: 1; + transition: margin 0.3s, max-height 0.3s; + cursor: pointer; +} + +.add-button__option-wrapper2 { + position: absolute; + background: white; + border: none; + height: 200px; + width: 300px; + max-height: 0px; + overflow: hidden; + margin-left: 6px; + z-index: 1; + transition: margin 0.3s, max-height 0.3s; + cursor: pointer; +} + + +.add-button__option-wrapper--show { + + max-height: 185px; + border: 1px solid #dadce0; + border-radius: 10px; + // padding: 0 140px 132px 36px; + margin-top: 52px; + box-shadow: 0 1px 2px 0 rgba(60,64,67,0.302),0 1px 3px 1px rgba(60,64,67,0.149); +} + +.add_button__option__add-folder-wrapper { + border-bottom: 1px solid #dadce0; + display: flex; + flex-direction: row; + align-items: center; + cursor: pointer; +} +.add_button__option__add-folder-wrapper:hover { + background: lightgrey +} + +.add_button__option__add-folder-wrapper--no-border { + border: none; +} + +.add_button__option__add-folder-image { + width: 14%; + height: 10%; + margin-left: 14px; +} + +.add_button__option__add-folder-title { + color: #373737; + padding-top: 4px; + padding-left: 10px; +} +.add_button__option__add-file-input { + opacity: 0.0; + + /* IE 8 */ + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + + /* IE 5-7 */ + filter: alpha(opacity=0); + + /* Netscape or and older firefox browsers */ + -moz-opacity: 0.0; + + /* older Safari browsers */ + -khtml-opacity: 0.0; + + cursor: pointer; + + position: absolute; + top: 63px; + left: 0; + bottom: 0; + background: red; + height: 32%; +} + +.storage__wrapper { + width: inherit; + height: 86px; +} + +.storage__title { + color: black; + font-size: 13px; + font-weight: 400; + margin-bottom: 3px; + margin-left: 16px; +} + +.storage__subtitle { + font-size: 11px; + margin-left: 16px; + color: black; + font-weight: 300; + white-space: nowrap; + width: 85%; + overflow: hidden; + text-overflow: ellipsis; + margin-top: 4px; +} + +.storage__progress__wrapper { + + width: 75%; + height: 6px; + margin-left: 16px; + background: #e0e0e0; +} + +.storage__progress { + + // width: 50%; + // height: inherit; + // /* color: red; */ + // background: #3f85f0; +} \ No newline at end of file diff --git a/src/styles/components/_LoginPage.scss b/src/styles/components/_LoginPage.scss new file mode 100644 index 0000000..587a47e --- /dev/null +++ b/src/styles/components/_LoginPage.scss @@ -0,0 +1,8 @@ +.login { + position: absolute; + margin: auto; + top: 0; + right: 0; + bottom: 0; + left: 0; +} \ No newline at end of file diff --git a/src/styles/components/_MoverMenu.scss b/src/styles/components/_MoverMenu.scss new file mode 100644 index 0000000..97110e3 --- /dev/null +++ b/src/styles/components/_MoverMenu.scss @@ -0,0 +1,158 @@ +.movermenu { + width: 400px; + height: 500px; + background: white; + position: fixed; + top: 0; + bottom: 0; + left: 0; + right: 0; + margin: auto; + -webkit-box-shadow: 0 11px 8px 0 rgba(0,0,0,0.2); + box-shadow: 0 11px 8px 0 rgba(0,0,0,0.2); + border: 2px solid #dadce0; + + @media (max-width: $desktop-breakpoint) { + width: 100%; + height: 100%; + } +} + +.movermenu__close-button { + width: 32px; + opacity: 0.8; + cursor: pointer; +} + +.movermenu__form { + + @media (max-width: $desktop-breakpoint) { + width: 100%; + display: flex; + justify-content: center + } +} + +.movermenu__nav_wrapper { + width: 100%; + height: 32px; + /* background: green; */ + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; +} + +.movermenu__main_wrapper { + width: 100%; + height: 341px; + overflow: scroll; + + @media (max-width: $desktop-breakpoint) { + width: 100%; + height: calc(100% - 155px); + } +} + +.movermenu__search_wrapper { + width: 100%; + height: 48px; + display: flex; + flex-direction: row; + align-items: center; + justify-content: center; +} + +.movermenu__input { + border: 1px solid #cacccd; + border-radius: 2px; + height: 32px; + font-size: 1.8rem; + font-weight: 300; + padding: 1.2rem; + margin: 0 0 1.2rem 0; + width: 381px; + margin-top: 11px; + background: #f1f3f4; + + @media (max-width: $desktop-breakpoint) { + height: 41px; + font-size: 1.9rem; + width: 98%; + } +} + + +.movermenu__input:focus { + + background: white; + outline: none; + border-style: groove; +} + +.movermenu__home-button { + width: 32px; + margin-right: 10px; + cursor: pointer; + + @media (max-width: $desktop-breakpoint) { + width: 35px; + } +} + +.movermenu__home-button--disabled { + + cursor: default; + opacity: 0.4; +} + +.movermenu__back-button { + width: 32px; + margin-left: 3px; + cursor: pointer; + + @media (max-width: $desktop-breakpoint) { + width: 35px; + } + +} + +.movermenu__back-button--disabled { + opacity: 0.4; + cursor: default; +} + +.movermenu__title { + color: black; + font-size: 20px; + font-weight: 200; + margin-left: -6px; + max-width: 55%; + overflow: hidden; + text-overflow: ellipsis; +} + +.movermenu__button { + margin-right: 10px; + color: white; + background: #3c85ed; + font-size: 12px; + border: none; + display: inline-block; + text-decoration: none; + line-height: 1; + border-radius: 2px; + padding: 9px; +} + +.movermenu__button_wrapper { + width: 100%; + /* background: blue; */ + height: 36px; + display: flex; + flex-direction: row; + align-items: center; + justify-content: flex-end; + + +} \ No newline at end of file diff --git a/src/styles/components/_Photoviewer.scss b/src/styles/components/_Photoviewer.scss new file mode 100644 index 0000000..a8f1837 --- /dev/null +++ b/src/styles/components/_Photoviewer.scss @@ -0,0 +1,41 @@ +.photoviewer { + background: rgba(0, 0, 0, 0.95); + width: 100%; + position: fixed; + height: 100%; + top: 0; + left: 0; + right: 0; + bottom: 0; + display: flex; + flex-direction: column; + z-index: 5; +} + +.photoviewer__close-button { + width: 22px; + margin-left: 10px; + margin-top: 10px; + opacity: 0.6; + cursor: pointer; +} + +.photoviewer__image { + + width: 95%; + height: 90%; + margin-left: 2.5%; + // background: blue; + object-fit: contain; +} + +.photoviewer__loader { + width: 98%; + height: 88%; + display: flex; + align-items: center; + + @media (max-width: $desktop-breakpoint) { + width: 90%; + } +} \ No newline at end of file diff --git a/src/styles/components/_Popup-window.scss b/src/styles/components/_Popup-window.scss new file mode 100644 index 0000000..ebd79c5 --- /dev/null +++ b/src/styles/components/_Popup-window.scss @@ -0,0 +1,127 @@ +.popup-window { + width: 61%; + height: 70%; + background: white; + position: fixed; + margin: 0 auto; + left: 50%; + top: 50%; + transform: translate(-50%, -50%); + -ms-transform: translate(-50%, -50%); + -webkit-transform: translate(-50%, -50%); + z-index: 1; + -webkit-box-shadow: 0 11px 8px 0 rgba(0,0,0,0.2); + box-shadow: 0 11px 8px 0 rgba(0,0,0,0.2); + border: 2px solid #dadce0; + border-radius: 6px; + display: flex; + flex-direction: column; + justify-content: space-between; + align-items: center; + + @media (max-width: $desktop-breakpoint) { + width: 100%; + height: 100%; + } + +} + +.popup-window--gone { + + display: none; +} + +.popup-window__title { + color: black; + font-weight: 300; + margin-top: 10px; + /* width: 100px; */ + max-width: 72%; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; +} + +.popup-window__subtitle { + color: black; + font-weight: 300; + font-size: 11px; + margin-top: -11px; +} + +.popup-window__image__wrapper__subwrapper { + background: red; +} + +.popup-window__image { + width: 120px; + opacity: 0.8; +} + +.popup-window__image--loaded { + + width: 100%; + max-height: 100%; + object-fit: cover; + opacity: 1; + max-width: 100%; + border-radius: 6px; + cursor: pointer; + +} + +.popup-window__button { + width: unset; + margin-bottom: 12px; +} + +.popup-window__image__wrapper { + // width: inherit; + flex-direction: column-reverse; + align-items: center; + display: flex; + margin-bottom: 50px; + height: 50%; + width: 80%; + max-width: 80%; + overflow: hidden; + position: relative; + justify-content: center; + max-height: 50%; + + @media (max-width: $desktop-breakpoint) { + flex-direction: column-reverse; + align-items: center; + display: flex; + margin-bottom: 50px; + height: 65%; + width: 99%; + max-width: 99%; + overflow: hidden; + position: relative; + justify-content: center; + max-height: 50%; + } + +} + +.popup-window__spinner__wrapper { + margin-left: -25px; +} + +.popup-window__close-button { + width: 29px; + position: absolute; + left: 8px; + top: 10px; + opacity: 0.7; + cursor: pointer; +} + +.popup-window__video { + max-height: 70%; + max-width: 95%; + border-radius: 3px; + + +} \ No newline at end of file diff --git a/src/styles/components/_QuickAccess.scss b/src/styles/components/_QuickAccess.scss new file mode 100644 index 0000000..0925d44 --- /dev/null +++ b/src/styles/components/_QuickAccess.scss @@ -0,0 +1,96 @@ +.quickaccess { + width: inherit; + height: 170px; + // background: red; + display: flex; + /* flex-direction: row; */ + flex-flow: row wrap; + align-items: center; + /* overflow-y: hidden; */ + overflow: hidden; + +} + +.quickaccess__item { + min-width: 186px; + min-height: 160px; + height: 160px; + width: 186px; + margin: 5px; + // background: blue; + display: flex; + flex-direction: column; + align-items: center; + border: 1px solid #dadce0; + border-radius: 10px; + + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-tap-highlight-color: transparent; + position: relative; + + @media (max-width: $desktop-breakpoint) { + + position: unset; + } + +} + +.quickaccess__item__image__wrapper { + width: 100px; + height: 100px; +} + +.quickaccess__item__image { + width: 100px; + height: 100px; + opacity: 0.7; +} + +.quickaccess__item__image--no-opacity { + opacity: 1; + border-radius: 10px; + margin-top: 5px; + max-height: 99px; + max-width: 99px; + object-fit: cover; + +} + +.quickaccess__item__title { + // color: black; + font-size: 13px; + font-weight: 350; + margin-top: 8px; + text-overflow: ellipsis; + white-space: nowrap; + /* max-width: 100px; */ + width: 90%; + /* height: 54px; */ + /* overflow: hidden; */ + overflow-x: hidden; + overflow-y: visible; + margin-left: 5px; +} + +.quickaccess__item__subtitle { + + // color: black; + margin-top: -12px; + font-weight: 100; + font-size: 11px; + overflow-x: hidden; + overflow-y: visible; + text-overflow: ellipsis; + white-space: nowrap; + width: 90%; + margin-left: 5px; +} + +.quickaccess__item__title__wrapper { + width: 100%; +} \ No newline at end of file diff --git a/src/styles/components/_RightSection.scss b/src/styles/components/_RightSection.scss new file mode 100644 index 0000000..d44e1cf --- /dev/null +++ b/src/styles/components/_RightSection.scss @@ -0,0 +1,141 @@ +.section--right { + margin: 0 0 0 3px; + width: 37vw; + transition: width 0.5s; + overflow: hidden; + display: flex; + flex-direction: column; + // height: 83vh; + scrollbar-width: none; /* Firefox */ + -ms-overflow-style: none; /* IE 10+ */ + &::-webkit-scrollbar { + width: 0px; + background: transparent; /* Chrome/Safari/Webkit */ + } + + @media (max-width: $desktop-breakpoint) { + display: none + } +} + +.section--minimized { + width: 0%; + margin: 0; +} + +.section--no-animation { + + transition: none; +} + +.section__title-wrapper { + width: 25vw; + height: 30%; + display: flex; + align-items: center; + justify-content: space-between; +} + +.section__title-text { + + color: black; + word-wrap: break-word; + overflow: scroll; + line-height: 24px; + font-weight: 300; + margin-left: 10px; + text-overflow: ellipsis; + max-height: 100%; + padding: 6px; + width: 77%; + + scrollbar-width: none; /* Firefox */ + -ms-overflow-style: none; /* IE 10+ */ + &::-webkit-scrollbar { + width: 0px; + background: transparent; /* Chrome/Safari/Webkit */ + } + +} + +.section__image { + + width: 17vw; + margin-left: 36px; + opacity: 0.3; +} + +.section__title { + color: black; + font-weight: 300; + line-height: 24px; + min-width: 25vw; + max-width: 25vw; +} + +.section-detail-wrapper { + width: inherit; + height: inherit; +} + +.section__none--wrapper { + width: inherit; + display: flex; + flex-direction: column; + justify-content: center; +} + +.section__title-text--gone { + visibility: hidden; +} + +.section__title-image { + + width: 30px; + margin-right: 10px; + cursor: pointer; +} + +.section__title-image--gone { + visibility: hidden; +} + +.section-detail__block { + width: 34vw; + height: 70%; + /* background: green; */ + overflow: scroll; + margin-top: 10px; +} + +.section-detail__wrapper { + display: flex; + flex-direction: row; + justify-content: space-between; +} + +.section-detail__title { + color: black; + margin-left: 15px; + font-weight: 300; +} + +.section-detail__title--margin { + margin-top: -15px; +} + +.section-detail__body { + color: black; + font-weight: 500; + margin-right: 35%; + word-wrap: break-word; + overflow: hidden; + width: 43%; + line-height: 22px; + margin-left: 10px; +} + +.section-detail__body--margin { + margin-top: -15px; +} + diff --git a/src/styles/components/_SettingsMenu.scss b/src/styles/components/_SettingsMenu.scss new file mode 100644 index 0000000..69a1c27 --- /dev/null +++ b/src/styles/components/_SettingsMenu.scss @@ -0,0 +1,255 @@ +.settingsmenu { + width: 918px; + height: 487px; + background: white; + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + margin: auto; + -webkit-box-shadow: 0 11px 8px 0 rgba(0,0,0,0.2); + box-shadow: 0 11px 8px 0 rgba(0,0,0,0.2); + border: 2px solid #dadce0; + z-index: 1; + border-radius: 6px; + + @media (max-width: $desktop-breakpoint) { + width: 100%; + height: 100%; + } +} + +.settingsmenu--gone { + + display: none; +} + +.settingsmenu__header { + height: 45px; + background: #fff; + width: 100%; + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; + +} + + +.settingsmenu__header__image { + height: 27px; + opacity: 0.8; + margin-top: 17px; +} + +.settingsmenu__header__title { + color: black; + font-weight: 300; + margin-left: 6px; + font-size: 13px; + margin-top: 21px +} + +.settingsmenu__header__button { + + margin-right: 10px; + height: 28px; + margin-top: -6px; + cursor: pointer; +} + +.settingsmenu__header__box { + + height: inherit; + width: 30%; + display: flex; + flex-direction: row; + margin-left: 10px; + margin-top: -18px; +} + +.settingsmenu_body { + + max-height: 441px; + overflow-y: scroll; + overflow-x: hidden; + + @media (max-width: $desktop-breakpoint) { + max-height: 93vh; + } +} + +.settingsmenu__option { + display: flex; + flex-direction: row; + justify-content: space-around; + border-bottom: 1px solid #eee; + height: 77px; + max-height: 77px; + /* align-items: center; */ + position: relative; + /* align-content: center; */ + align-items: center; + + @media (max-width: $desktop-breakpoint) { + justify-content: space-between; + } +} + +.settingsmenu__option--no-border { + + border: unset +} + +.settingsmenu__option__title { + + width: 250px; + margin-left: 8%; + font-weight: 500; + /* position: absolute; */ + + @media (max-width: $desktop-breakpoint) { + margin-left: 10px; + } +} + +.settingsmenu__option__title--offset { + margin-left: 59.5px; + + @media (max-width: $desktop-breakpoint) { + margin-left: 10px; + } +} + +.settingsmenu__suboption { + width: 230px; + height: 76px; + display: flex; + align-items: center; + + @media (max-width: $desktop-breakpoint) { + + justify-content: center; + flex-direction: column; + margin-right: 10px; + width: 135px; + align-items: flex-end; + } +} + +.settingsmenu__suboption--offset { + margin-left: -42px; + + @media (max-width: $desktop-breakpoint) { + + margin-left: unset; + } +} + +.settingsmenu__select { + + background: none; + border: none; + -moz-appearance: none; + -webkit-appearance: none; + color: #5f6368; + font-size: 15px; + outline: none; + font-weight: 500; + padding-left: 3px; + padding-right: 4px; +} + +.settingsmenu__select:hover { + background: lightgrey +} + +.settingsmenu__button { + + color: white; + background: #3c85ed; + font-size: 12px; + /* padding: 1.2rem; */ + border: none; + display: inline-block; + text-decoration: none; + line-height: 1; + border-radius: 2px; + padding: 9px; + + &:hover { + background: darken(#3c85ed, 10); + color: darken(white, 10) + } +} + +.settingsmenu__button--red { + background: red; + margin-left: 3.5px; + + &:hover { + background: darken(red, 10); + color: darken(white, 10) + } + +} + +.settingsmenu__button--offset-logout { + margin-left: -3px; +} + +.settingsmenu__button--offset-logout-all { + margin-left: 4px; +} + +.settingsmenu__option__title__wrapper { + display: flex; + justify-content: center; + /* width: 100%; */ + margin-left: 47px; + + @media (max-width: $desktop-breakpoint) { + + margin-left: unset; + } +} + +.settingsmenu__option__info { + width: 18px; + position: absolute; + margin-left: -21px; + opacity: 0.7; + top: 12px; + cursor: pointer; + + @media (max-width: $desktop-breakpoint) { + margin-left: -41px; + } +} + +.settingsmenu__option__info__style { + width: 18px; + position: absolute; + margin-left: 28px; + opacity: 0.7; + top: 12px; + cursor: pointer; + + @media (max-width: $desktop-breakpoint) { + margin-left: 10px; + } +} + +.settingsmenu__option__info__size { + width: 18px; + position: absolute; + margin-left: 25px; + opacity: 0.7; + top: 12px; + cursor: pointer; + + @media (max-width: $desktop-breakpoint) { + margin-left: 2px; + } +} \ No newline at end of file diff --git a/src/styles/components/_Sharemenu.scss b/src/styles/components/_Sharemenu.scss new file mode 100644 index 0000000..499998b --- /dev/null +++ b/src/styles/components/_Sharemenu.scss @@ -0,0 +1,134 @@ +.sharemenu { + + width: 425px; + height: 230px; + position: fixed; + background: white; + left: calc(70% - 425px); + box-shadow: 0 1px 2px 0 rgba(60,64,67,0.302), 0 1px 3px 1px rgba(60,64,67,0.149); + border: 1px solid transparent; + border-radius: 6px; + z-index: 1; + left: 0; + right: 0; + margin: 0 auto; + display: flex; + flex-direction: column; + text-align: center; + justify-content: center; + align-items: center; + + @media (max-width: $desktop-breakpoint) { + width: 100%; + height: 100%; + top: 0; + } +} + +.sharemenu--gone { + display: none; +} + +.sharemenu--block { + width: 100% +} + +.sharemenu__title { + color: black; + max-width: 88%; + overflow: hidden; + text-overflow: ellipsis; + /* margin-left: 5px; */ + margin-right: 5px; + font-size: 13.5px; + font-weight: 200; + white-space: nowrap; +} + +.sharemenu__subtitle { + color: black; +} + +.sharemenu__button__public { + + color: white; + background: #3c85ed; + border: none; + display: inline-block; + text-decoration: none; + line-height: 1; + border-radius: 2px; + width: 29%; + height: 37px; + padding: 3px; + + &:hover { + background: darken(#3c85ed, 10); + color: darken(white, 10) + } + + @media (max-width: $desktop-breakpoint) { + width: 36%; + height: 47px; + } + +} + +.sharemenu__close-button { + width: 25px; + position: absolute; + top: 1px; + left: 1px; + opacity: 0.8; + + @media (max-width: $desktop-breakpoint) { + width: 42px; + } +} + +.sharemenu__button__one { + color: white; + background: #3c85ed; + font-size: $font-size-large; + padding: $s-size; + border: none; + display: inline-block; + text-decoration: none; + line-height: 1; + border-radius: $small-border; + + &:hover { + background: darken(#3c85ed, 10); + color: darken(white, 10) + } +} + +.sharemenu__button__done { + color: white; + background: #3c85ed; + font-size: $font-size-large; + padding: $s-size; + border: none; + display: inline-block; + text-decoration: none; + line-height: 1; + border-radius: $small-border; + + &:hover { + background: darken(#3c85ed, 10); + color: darken(white, 10) + } +} + +.sharemenu__link__wrapper { + width: 100%; + display: flex; + flex-direction: row; + justify-content: center; +} + +.sharemenu__image { + width: 27px; + margin-left: 10px; + margin-right: 5px; +} \ No newline at end of file diff --git a/src/styles/components/_Spacer.scss b/src/styles/components/_Spacer.scss new file mode 100644 index 0000000..7b32b87 --- /dev/null +++ b/src/styles/components/_Spacer.scss @@ -0,0 +1,12 @@ +.spacer { + display: flex; + height: 37px; +} + +.spacer__title { + color: #5f6368; + margin-left: 22px; + font-weight: 500; + font-size: 13px; + margin-left: 38px; +} \ No newline at end of file diff --git a/src/styles/components/_Spinner.scss b/src/styles/components/_Spinner.scss new file mode 100644 index 0000000..c522891 --- /dev/null +++ b/src/styles/components/_Spinner.scss @@ -0,0 +1,21 @@ +.spinner { + border: 3px solid #f3f3f3; + border-top: 3px solid #3498db; + border-radius: 50%; + width: 40px; + height: 40px; + margin-left: 50%; + text-align: center; + animation: spin 2s linear infinite; + + + } + + @keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } + } + + .spinner--small-margin { + margin-left: 4px; + } \ No newline at end of file diff --git a/src/styles/components/_Subbar.scss b/src/styles/components/_Subbar.scss new file mode 100644 index 0000000..9e00ba1 --- /dev/null +++ b/src/styles/components/_Subbar.scss @@ -0,0 +1,98 @@ +.info-button { + width: 30px; + position: absolute; + right: 15px; + cursor: pointer; + + @media (max-width: $desktop-breakpoint) { + display: none; + } +} + +.info-button:hover { + -webkit-filter: drop-shadow(1px 1px 3px #222222); +} + +.drive-dropdown { + + width: 100px; + padding-left: 15px; +} + +.grid-button { + width: 30px; + position: absolute; + right: 60px; + cursor: pointer; + + @media (max-width: $desktop-breakpoint) { + right: 9px; + } +} + +.subbar { + // background: purple; + width: 80vw; + display: flex; + flex-direction: row; + align-items: center; + height: 7vh; + min-height: 50px; + user-select: none; + // overflow-x: scroll; + +} + +.path__block { + height: inherit; + /* min-height: 7vh; */ + /* width: 50px; */ + display: flex; + flex-direction: row; + align-items: center; + cursor: pointer; +} + +.path__wrapper { + // background: blue; + width: 50vw; + margin-left: 12px; + display: flex; + flex-direction: row; + overflow-x: scroll; + overflow-y: hidden; + height: 52px; + /* max-height: inherit; */ + min-height: inherit; + /* min-height: 7vh; */ + // margin-top: 4px; + scrollbar-width: none; + -ms-overflow-style: none; + + &::-webkit-scrollbar { + width: 0px; + //background: transparent; /* Chrome/Safari/Webkit */ + } + + @media (max-width: $desktop-breakpoint) { + margin-top: 4px; + } + +} + +.path__title { + color: black; + font-size: 17px; + line-height: 0; + font-weight: 300; + white-space: nowrap; + /* height: fit-content; */ + padding: 0px 0 2px 0; + margin-top: 19px; +} + +.path__image { + height: fit-content; + /* width: 30px; */ + // margin-top: 7px; +} \ No newline at end of file diff --git a/src/styles/components/_Swal.scss b/src/styles/components/_Swal.scss new file mode 100644 index 0000000..ad606cb --- /dev/null +++ b/src/styles/components/_Swal.scss @@ -0,0 +1,10 @@ + +.swal2-popup { + + font-size: 10px !important; + + @media (max-width: $desktop-breakpoint) { + + font-size: 13px !important; + } +} \ No newline at end of file diff --git a/src/styles/components/_Uploader.scss b/src/styles/components/_Uploader.scss new file mode 100644 index 0000000..f166de7 --- /dev/null +++ b/src/styles/components/_Uploader.scss @@ -0,0 +1,145 @@ +.uploader__wrapper { + width: 330px; + /* max-height: 255px; */ + /* overflow: scroll; */ + background: white; + display: flex; + flex-direction: column; + position: absolute; + right: 25px; + bottom: 25px; + border-radius: 5px; + overflow: hidden; + -webkit-box-shadow: 0 2px 8px 0 rgba(0,0,0,0.2); + box-shadow: 0 2px 8px 0 rgba(0,0,0,0.2); + + @media (max-width: $desktop-breakpoint) { + position:absolute; + left:0;right:0;bottom:0; + margin:0 auto; + } + +} + +.uploader__wrapper--gone { + display: none; +} + +.uploader__header__wrapper { + width: inherit; + height: 51px; + display: flex; + flex-direction: row; + background: #323232; + justify-content: space-between; + align-items: center; +} + +.uploader__header__title { + max-width: 50%; + text-overflow: ellipsis; + overflow: hidden; + font-weight: 300; + margin-left: 15px; + color: white; +} + +.uploader__header__button_wrapper { + display: flex; + flex-direction: row; + margin-right: 15px; + height: inherit; + align-items: center; + +} + +.uploader__header__button { + + margin-left: 33px; + /* height: 34px; */ + width: 27px; + opacity: 0.7; + padding: 4px; + cursor: pointer; +} + +.upload__item__wrapper { + width: inherit; + height: 50px; + /* background: green; */ + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; + border-bottom: 1px solid #dadce0; + position: relative; + +} + +.CircularProgressbar { + + height: 30px; + width: 30px; +} + +.upload__item__block { + width: inherit; + max-height: 255px; + overflow-x: hidden; + overflow-y: scroll; + display: flex; + // flex-direction: column-reverse; + flex-direction: column; + transition: height 0.5s; + scrollbar-width: none; /* Firefox */ + -ms-overflow-style: none; /* IE 10+ */ + &::-webkit-scrollbar { + width: 0px; + background: transparent; /* Chrome/Safari/Webkit */ + } +} + +.upload__item__block--hide { + + height: 0px; +} + +.upload__item__item { + margin-right: 15px; + max-width: 72%; + text-overflow: ellipsis; + overflow: hidden; + font-weight: 300; + margin-left: 15px; + color: black; + white-space: nowrap; +} + +.upload__item__progress { + cursor: pointer; +} + +.upload__item__image { + width: 30px; + height: 30px; + position: absolute; + /* top: 1px; */ + /* margin-right: 15px; */ + opacity: 0; + transition: opacity 0.5s; + right: 15px; +} + +.upload__item__item__wrapper { + cursor: pointer; + margin-right: 15px; + margin-left: 15px; + z-index: 3; + width: 30px; + max-width: 30px; + // background: purple; +} + +.upload__item__item__wrapper--hidden { + visibility: hidden; +} \ No newline at end of file diff --git a/src/styles/components/_box-layout.scss b/src/styles/components/_box-layout.scss new file mode 100644 index 0000000..a446637 --- /dev/null +++ b/src/styles/components/_box-layout.scss @@ -0,0 +1,87 @@ +.box-layout { + background: white; + height: 100vh; + width: 100vw; + background-size: cover; + display: flex; + justify-content: center; + align-items: center; +} + +.box-layout__box { + background: fade-out(white, .15); + border-radius: 3px; + text-align: center; + width: 35rem; + padding: 3.2rem 1.6rem 1.2rem 1.6rem; + border: 0.5px; + border-style: groove; + display: flex; + flex-direction: column; + + @media (max-width: $desktop-breakpoint) { + border: none; + width: -webkit-fill-available; + } +} + +.box-layout__title { + margin: 0 0 3rem 0; + line-height: 1; + font-family: Arial, Helvetica, sans-serif; + font-weight: 500; + color: $grey; +} + +.box-layout__input { + border: 1px solid #cacccd; + border-radius: $small-border; + height: 43px; + font-size: $font-size-large; + font-weight: 300; + padding: $s-size; + margin: 0 0 $s-size 0; + width: -webkit-fill-available; +} + +.box-layout--button { + width: -webkit-fill-available; +} + +.box-layout__icon { + position: absolute; + width: 130px; + left: 25px; + top: 25px; + + @media (max-width: $desktop-breakpoint) { + left: 0; + top: 0; + padding: 15px; + } +} + +.box-layout__text { + color: $grey; +} + +.login__image__wrapper { + width: inherit; + display: flex; + flex-direction: row; + align-items: center; + justify-content: center; + height: 20px; +} + +.login__image { + + width: 25px; + height: 25px; + margin-right: 4px; +} + +.login__title { + + color: black; +} \ No newline at end of file diff --git a/src/styles/components/_button.scss b/src/styles/components/_button.scss new file mode 100644 index 0000000..f0a567d --- /dev/null +++ b/src/styles/components/_button.scss @@ -0,0 +1,50 @@ +.button { + color: white; + background: #3c85ed; + font-size: $font-size-large; + padding: $s-size; + border: none; + display: inline-block; + text-decoration: none; + line-height: 1; + border-radius: $small-border; + + &:hover { + background: darken(#3c85ed, 10); + color: darken(white, 10) + } +} + +.button--small { + color: white; + background: #3c85ed; + font-size: 11px; + padding: 12px; + border: none; + display: inline-block; + text-decoration: none; + line-height: 1; + border-radius: 2px; + width: 35%; + white-space: nowrap; + height: 100%; + margin-left: 10%; + + &:hover { + background: darken(#3c85ed, 10); + color: darken(white, 10) + } +} + +.button--small--disabled { + + opacity: 0.5; +} + +.button--link { + background: none; +} + +.button--secondary { + background: #888888 +} \ No newline at end of file diff --git a/src/styles/components/_content-container.scss b/src/styles/components/_content-container.scss new file mode 100644 index 0000000..2f0166e --- /dev/null +++ b/src/styles/components/_content-container.scss @@ -0,0 +1,6 @@ +.content-container { + margin: 0 auto; + max-width: 80rem; + padding: 0 $m-size; + background: black; +} \ No newline at end of file diff --git a/src/styles/components/_loader.scss b/src/styles/components/_loader.scss new file mode 100644 index 0000000..f7ec77b --- /dev/null +++ b/src/styles/components/_loader.scss @@ -0,0 +1,3 @@ +.loader { + +} \ No newline at end of file diff --git a/src/styles/styles.scss b/src/styles/styles.scss new file mode 100644 index 0000000..d8c9198 --- /dev/null +++ b/src/styles/styles.scss @@ -0,0 +1,28 @@ +@import "./base/settings"; +@import "./base/base"; +@import "./components/content-container"; +@import "./components/LoginPage"; +@import "./components/box-layout"; +@import "./components/button"; +@import "./components/Header"; +@import "./components/HomePage"; +@import "./components/Dataform"; +@import "./components/Folder"; +@import "./components/File"; +@import "./components/Filter"; +@import "./components/LeftSection"; +@import "./components/Subbar"; +@import "./components/RightSection"; +@import "./components/Uploader"; +@import "./components/loader"; +@import "./components/Spinner"; +@import "./components/QuickAccess"; +@import "./components/Spacer"; +@import "./components/Popup-window"; +@import "./components/ContentMenu"; +@import "./components/Sharemenu"; +@import "./components/DownloadPage"; +@import "./components/SettingsMenu"; +@import "./components/Swal"; +@import "./components/Photoviewer"; +@import "./components/MoverMenu"; diff --git a/src/utils/InternalServerError.js b/src/utils/InternalServerError.js new file mode 100644 index 0000000..5556ea5 --- /dev/null +++ b/src/utils/InternalServerError.js @@ -0,0 +1,10 @@ +class InternalServerError extends Error { + + constructor(args) { + super(args); + + this.code = 500; + } +} + +module.exports = InternalServerError; \ No newline at end of file diff --git a/src/utils/NotAuthorizedError.js b/src/utils/NotAuthorizedError.js new file mode 100644 index 0000000..d28fd6e --- /dev/null +++ b/src/utils/NotAuthorizedError.js @@ -0,0 +1,10 @@ +class NotAuthorizedError extends Error { + + constructor(args) { + super(args); + + this.code = 401; + } +} + +module.exports = NotAuthorizedError; \ No newline at end of file diff --git a/src/utils/NotFoundError.js b/src/utils/NotFoundError.js new file mode 100644 index 0000000..128205f --- /dev/null +++ b/src/utils/NotFoundError.js @@ -0,0 +1,10 @@ +class NotFoundError extends Error { + + constructor(args) { + super(args); + + this.code = 404; + } +} + +module.exports = NotFoundError; \ No newline at end of file diff --git a/src/utils/capitalize.js b/src/utils/capitalize.js new file mode 100644 index 0000000..26ea026 --- /dev/null +++ b/src/utils/capitalize.js @@ -0,0 +1,12 @@ +export default (name) => { + + if (name.length <= 1) { + + return name.toUpperCase(); + + } else { + + return name.substring(0,1).toUpperCase() + name.substring(1); + } + +} \ No newline at end of file diff --git a/src/utils/createError.js b/src/utils/createError.js new file mode 100644 index 0000000..6e9efc1 --- /dev/null +++ b/src/utils/createError.js @@ -0,0 +1,12 @@ +const createError = (message, code, exception) => { + + let error = new Error(message); + error.message = message + error.code = code + error.exception = exception + + throw error; + +} + +module.exports = createError; \ No newline at end of file diff --git a/src/utils/createQuery.js b/src/utils/createQuery.js new file mode 100644 index 0000000..c4f6751 --- /dev/null +++ b/src/utils/createQuery.js @@ -0,0 +1,41 @@ +const createQuery = (owner, parent,sortBy, startAt, startAtDate,searchQuery, startAtName) => { + + let query = {"metadata.owner": owner} + + if (searchQuery !== "") { + + searchQuery = new RegExp(searchQuery, 'i') + + query = {...query, filename: searchQuery} + + } else { + + query = {...query, "metadata.parent": parent} + } + + if (startAt) { + + if (sortBy === "date_desc" || sortBy === "DEFAULT") { + + query = {...query, "uploadDate": {$lt: new Date(startAtDate)}} + + } else if (sortBy === "date_asc") { + + query = {...query, "uploadDate": {$gt: new Date(startAtDate)}} + + } else if (sortBy === "alp_desc") { + + query = {...query, "filename": {$lt: startAtName}} + + } else { + + query = {...query, "filename": {$gt: startAtName}} + } + } + + + return query; + +} + +module.exports = createQuery \ No newline at end of file diff --git a/src/utils/imageChecker.js b/src/utils/imageChecker.js new file mode 100644 index 0000000..2df835e --- /dev/null +++ b/src/utils/imageChecker.js @@ -0,0 +1,31 @@ +const videoExtList = [ + "jpeg", + "jpg", + "png", + "gif", + "svg", + "tiff", + "bmp" +] + +const videoChecker = (filename) => { + + if (filename.length < 1 || !filename.includes(".")) { + + return false; + } + + const extSplit = filename.split("."); + + if (extSplit < 1) { + + return false; + } + + const ext = extSplit[extSplit.length - 1]; + + return videoExtList.includes(ext.toLowerCase()); + +} + +module.exports = videoChecker; \ No newline at end of file diff --git a/src/utils/mobileCheck.js b/src/utils/mobileCheck.js new file mode 100644 index 0000000..67876d7 --- /dev/null +++ b/src/utils/mobileCheck.js @@ -0,0 +1,6 @@ +const mobilecheck = () => { + var check = false; + (function(a){if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4))) check = true;})(navigator.userAgent||navigator.vendor||window.opera); + return check; + }; +export default mobilecheck; diff --git a/src/utils/sortBySwitch.js b/src/utils/sortBySwitch.js new file mode 100644 index 0000000..d0c43c3 --- /dev/null +++ b/src/utils/sortBySwitch.js @@ -0,0 +1,15 @@ +const sortBySwitch = (sortBy) => { + switch(sortBy) { + + case "alp_asc": + return {filename: 1} + case "alp_desc": + return {filename: -1} + case "date_asc": + return {uploadDate: 1} + default: + return {uploadDate: -1} + } +} + +module.exports = sortBySwitch; \ No newline at end of file diff --git a/src/utils/sortBySwitchFolder.js b/src/utils/sortBySwitchFolder.js new file mode 100644 index 0000000..314397e --- /dev/null +++ b/src/utils/sortBySwitchFolder.js @@ -0,0 +1,15 @@ +const sortBySwitch = (sortBy) => { + switch(sortBy) { + + case "alp_asc": + return {name: 1} + case "alp_desc": + return {name: -1} + case "date_asc": + return {createdAt: 1} + default: + return {createdAt: -1} + } +} + +module.exports = sortBySwitch; \ No newline at end of file diff --git a/src/utils/videoChecker.js b/src/utils/videoChecker.js new file mode 100644 index 0000000..e3c31f6 --- /dev/null +++ b/src/utils/videoChecker.js @@ -0,0 +1,57 @@ +const videoExtList = [ + "3g2", + "3gp", + "aaf", + "asf", + "avchd", + "avi", + "drc", + "flv", + "m2v", + "m4p", + "m4v", + "mkv", + "mng", + "mov", + "mp2", + "mp4", + "mpe", + "mpeg", + "mpg", + "mpv", + "mxf", + "nsv", + "ogg", + "ogv", + "qt", + "rm", + "rmvb", + "roq", + "svi", + "vob", + "webm", + "wmv", + "yuv" +] + +const videoChecker = (filename) => { + + if (filename.length < 1 || !filename.includes(".")) { + + return false; + } + + const extSplit = filename.split("."); + + if (extSplit < 1) { + + return false; + } + + const ext = extSplit[extSplit.length - 1]; + + return videoExtList.includes(ext.toLowerCase()); + +} + +module.exports = videoChecker; \ No newline at end of file diff --git a/tests/.DS_Store b/tests/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..875920184847896d573134fcaec366611dc675b7 GIT binary patch literal 6148 zcmeHK%}T>S5Z-O8ZYp9ALOtfEN*+Vs$T#qH zoY~zLOY2DxEHg0s&CcxXGT(;XEMtt@W52~%jWH%b5laR%D+J@HOH$GvL@wv>S(gPY zWf>^Re_#Ojt_r&~gnbLxxBc@b>ClT358@x*FbdPG+5F_Ca%E$4ONgqd?o{ubK{9bN zHyfw6JG#N%rJD^rZFiF-n%k~-6$X=DZSO3JGdGNbkxUN#0EXONhq0eb>|`AKshr1A z0U-=w^lJ4yZ#5fcyLB{enEA;G*oW=o>C_PQgVyOq|KaI5f0@3%DZ)8?i&Azq&fp!4 zm9;)Pqc}?9dx+0+XE}t#05L!etRn;ZtP|VoSRBKm zi17*{3fTCTKr}U48ViLG0pThYP^EJH#Na9&{H7jfX)F|~bjIb%FpplD>lX@_tApQ^ z!x^^}QcDaF1B(olRkw!s|M}1F|HUNg5d*})S~0*Y9j9YMN&0SGDh}^j6SNPCg5wH> m^As@TRSaYCD&7Z`0)7(>Kucqx5Ii9CBOqy@h8Xx$2EG7#S5v$I literal 0 HcmV?d00001 diff --git a/tests/db/utils/fileUtils/index.test.js b/tests/db/utils/fileUtils/index.test.js new file mode 100644 index 0000000..ae684f8 --- /dev/null +++ b/tests/db/utils/fileUtils/index.test.js @@ -0,0 +1,1125 @@ +const User = require("../../../../src/models/user"); +const mongoose = require("../../../../src/db/mongoose"); +const conn = mongoose.connection; +const createUser = require("../../../fixtures/createUser"); +const path = require("path"); +const createFile = require("../../../fixtures/createFile"); +const UtilsFile = require("../../../../src/db/utils/fileUtils"); +const ObjectID = require('mongodb').ObjectID +const jwt = require("jsonwebtoken"); +const utilsFile = new UtilsFile(); + +let user; +let file; + +process.env.KEY = "1234"; + +beforeEach(async(done) => { + + if (conn.readyState === 0) { + + conn.once("open", async() => { + + //user = await createUser(); + const {user: gotUser} = await createUser(); + user = gotUser; + + const filename = "bunny.mp4"; + const filepath = path.join(__dirname, "../../../fixtures/media/check.svg") + const metadata = { + owner: user._id, + parent: "/", + parentList: "/" + } + + file = await createFile(filename, filepath, metadata, user); + + done(); + }) + } else { + // user = await createUser(); + const {user: gotUser} = await createUser(); + user = gotUser; + + const filename = "bunny.mp4"; + const filepath = path.join(__dirname, "../../../fixtures/media/check.svg") + const metadata = { + owner: user._id, + parent: "/", + parentList: "/" + } + + file = await createFile(filename, filepath, metadata, user); + + done(); + } +}) + +afterEach( async(done) => { + + let bucket = new mongoose.mongo.GridFSBucket(conn.db); + + await User.deleteMany({}); + + const allFiles = await conn.db.collection("fs.files").find({}).toArray(); + + for (let i = 0; i < allFiles.length; i++) { + + const currentFileID = allFiles[i]._id; + await bucket.delete(ObjectID(currentFileID)); + } + + done(); + +}) + + +test("When giving fileID, should return public file", async() => { + + const fileID = file._id; + const tempToken = file.metadata.link; + + const recievedFile = await utilsFile.getPublicInfo(fileID, tempToken); + + expect(recievedFile._id).toEqual(fileID); + +}) + +test("When giving wrong fileID, should not return public file", async() => { + + const wrongFileID = "123456789012"; + + const recievedFile = await utilsFile.getFileInfo(wrongFileID); + + expect(recievedFile).toBe(null); +}) + +test("When giving the wrong tempToken, should not return public file", async() => { + + const fileID = file._id; + const wrongTempToken = "1234" + + const recievedFile = await utilsFile.getPublicInfo(fileID, wrongTempToken); + + expect(recievedFile).toBe(null); +}) + +test("When giving fileID and userID, should remove public file link", async() => { + + const token = jwt.sign({_id: user._id}, process.env.PASSWORD) + const fileID = file._id; + const userID = user._id; + await conn.db.collection("fs.files") + .findOneAndUpdate({"_id": ObjectID(fileID), + "metadata.owner": userID}, + {"$set": {"metadata.linkType": "public", "metadata.link": token}}) + + + + await utilsFile.removeLink(fileID, userID); + const updatedFile = await conn.db.collection("fs.files") + .findOne({_id: fileID}); + + + + expect(updatedFile.metadata.linkType).toBe(undefined); +}) + +test("When giving the wrong fileID, should not remove public link", async() => { + + const token = jwt.sign({_id: user._id}, process.env.PASSWORD) + const fileID = file._id; + const userID = user._id; + const wrongFileID = "123456789012"; + await conn.db.collection("fs.files") + .findOneAndUpdate({"_id": ObjectID(fileID), + "metadata.owner": userID}, + {"$set": {"metadata.linkType": "public", "metadata.link": token}}) + + + + await utilsFile.removeLink(wrongFileID, userID); + const updatedFile = await conn.db.collection("fs.files") + .findOne({_id: fileID}); + + + + expect(updatedFile.metadata.linkType).toEqual("public") +}) + +test("When giving the wrong userID, should not remove public link", async() => { + + const token = jwt.sign({_id: user._id}, process.env.PASSWORD) + const fileID = file._id; + const userID = user._id; + const wrongUserID = "123456789012"; + await conn.db.collection("fs.files") + .findOneAndUpdate({"_id": ObjectID(fileID), + "metadata.owner": userID}, + {"$set": {"metadata.linkType": "public", "metadata.link": token}}) + + + + await utilsFile.removeLink(fileID, wrongUserID); + const updatedFile = await conn.db.collection("fs.files") + .findOne({_id: fileID}); + + + + expect(updatedFile.metadata.linkType).toEqual("public") +}) + +test("When giving fileID, should remove one time public link", async() => { + + const token = jwt.sign({_id: user._id}, process.env.PASSWORD) + const fileID = file._id; + const userID = user._id; + await conn.db.collection("fs.files") + .findOneAndUpdate({"_id": ObjectID(fileID), + "metadata.owner": userID}, + {"$set": {"metadata.linkType": "one", "metadata.link": token}}) + + + + await utilsFile.removeOneTimePublicLink(fileID); + const updatedFile = await conn.db.collection("fs.files") + .findOne({_id: fileID}); + + + + expect(updatedFile.metadata.linkType).toBe(undefined); +}) + +test("When giving the wrong fileID, should not remove one time public link", async() => { + + const token = jwt.sign({_id: user._id}, process.env.PASSWORD) + const fileID = file._id; + const userID = user._id; + const wrongFileID = "123456789012"; + await conn.db.collection("fs.files") + .findOneAndUpdate({"_id": ObjectID(fileID), + "metadata.owner": userID}, + {"$set": {"metadata.linkType": "one", "metadata.link": token}}) + + await utilsFile.removeOneTimePublicLink(wrongFileID); + const updatedFile = await conn.db.collection("fs.files") + .findOne({_id: fileID}); + + + + expect(updatedFile.metadata.linkType).toBe("one"); +}) + +test("When giving fileID, userID, and token, should make file public", async() => { + + const token = jwt.sign({_id: user._id}, process.env.PASSWORD) + const fileID = file._id; + const userID = user._id; + + + await utilsFile.makePublic(fileID, userID, token); + const updatedFile = await conn.db.collection("fs.files") + .findOne({_id: fileID}); + + + expect(updatedFile.metadata.linkType).toBe("public") +}) + +test("When giving wrong fileID, should not make file public", async() => { + + const token = jwt.sign({_id: user._id}, process.env.PASSWORD) + const fileID = file._id; + const userID = user._id; + const wrongFileID = "123456789012"; + + + await utilsFile.makePublic(wrongFileID, userID, token); + const updatedFile = await conn.db.collection("fs.files") + .findOne({_id: fileID}); + + + expect(updatedFile.metadata.linkType).toBe(undefined) +}) + +test("When giving wrong userID, should not make file public", async() => { + + const token = jwt.sign({_id: user._id}, process.env.PASSWORD) + const fileID = file._id; + const wrongUserID = "123456789012"; + + + await utilsFile.makePublic(fileID, wrongUserID, token); + const updatedFile = await conn.db.collection("fs.files") + .findOne({_id: fileID}); + + + expect(updatedFile.metadata.linkType).toBe(undefined) +}) + +test("When giving fileID, userID, and token, should make one time public link", async() => { + + const token = jwt.sign({_id: user._id}, process.env.PASSWORD) + const fileID = file._id; + const userID = user._id; + + + await utilsFile.makeOneTimePublic(fileID, userID, token); + const updatedFile = await conn.db.collection("fs.files") + .findOne({_id: fileID}); + + + expect(updatedFile.metadata.linkType).toBe("one") +}) + +test("When giving wrong fileID, should not make one time public link", async() => { + + const token = jwt.sign({_id: user._id}, process.env.PASSWORD) + const fileID = file._id; + const userID = user._id; + const wrongFileID = "123456789012"; + + + await utilsFile.makeOneTimePublic(wrongFileID, userID, token); + const updatedFile = await conn.db.collection("fs.files") + .findOne({_id: fileID}); + + + expect(updatedFile.metadata.linkType).toBe(undefined) +}) + +test("When giving wrong userID, should not make one time public link", async() => { + + const token = jwt.sign({_id: user._id}, process.env.PASSWORD) + const fileID = file._id; + const wrongUserID = "123456789012"; + + + await utilsFile.makeOneTimePublic(fileID, wrongUserID, token); + const updatedFile = await conn.db.collection("fs.files") + .findOne({_id: fileID}); + + + expect(updatedFile.metadata.linkType).toBe(undefined) +}) + +test("When giving fileID and userID, should return file", async() => { + + const fileID = file._id; + const userID = user._id; + + const recievedFile = await utilsFile.getFileInfo(fileID, userID); + + + expect(recievedFile._id).toEqual(fileID); +}) + +test("When giving wrong fileID, should not return file", async() => { + + const userID = user._id; + const wrongFileID = "123456789012"; + + const recievedFile = await utilsFile.getFileInfo(wrongFileID, userID); + + expect(recievedFile).toEqual(null); +}) + +test("When giving wrong userID, should not return file", async() => { + + const fileID = file._id; + const wrongUserID = "123456789012"; + + const recievedFile = await utilsFile.getFileInfo(fileID, wrongUserID); + + expect(recievedFile).toEqual(null); +}) + +test("When giving userID, should return quicklist", async() => { + + const userID = user._id; + + const recievedList = await utilsFile.getQuickList(userID); + + expect(recievedList.length).toBe(1); +}) + +test("When giving wrong userID, should not return quicklist", async() => { + + const wrongUserID = "123456789012"; + + const recievedList = await utilsFile.getQuickList(wrongUserID); + + expect(recievedList.length).toBe(0); +}) + +test("When giving default query object, should return a filtered file list", async() => { + + const userID = user._id; + const filepath = path.join(__dirname, "../../../fixtures/media/check.svg") + const metadata = { + owner: userID, + parent: "/", + parentList: "/" + } + + const metadataDifferentParent = { + owner: userID, + parent: "1234", + parentList:"/,1234" + } + + const metadataDifferentOwner = { + owner: "1234", + parent: "/", + parentList:"/,1234" + } + + const fileTwo = await createFile("apple.mp4", filepath, metadata, user); + const fileThree = await createFile("coconut.mp4", filepath, metadata, user); + const fileFour = await createFile("dinnerbone.mp4", filepath, metadataDifferentParent, user); + const fileFive = await createFile("elephant.mp4", filepath, metadataDifferentOwner, user); + + const queryObj = { + "metadata.owner": userID, + "metadata.parent": "/", + } + + const defaultSortBy = {uploadDate: -1} + + + + const recievedList = await utilsFile.getList(queryObj, defaultSortBy, 50); + + + + expect(recievedList.length).toBe(3); + expect(recievedList[0]._id).toEqual(fileThree._id); + expect(recievedList[1]._id).toEqual(fileTwo._id); + expect(recievedList[2]._id).toEqual(file._id); + expect(recievedList.includes(fileFour)).toBe(false); + expect(recievedList.includes(fileFive)).toBe(false); +}) + +test("When giving owner, should return filtered list", async() => { + + const userID = user._id; + const filepath = path.join(__dirname, "../../../fixtures/media/check.svg") + const metadata = { + owner: userID, + parent: "/", + parentList: "/" + } + + const metadataDifferentParent = { + owner: userID, + parent: "1234", + parentList:"/,1234" + } + + const metadataDifferentOwner = { + owner: "1234", + parent: "/", + parentList:"/,1234" + } + + await createFile("apple.mp4", filepath, metadata, user); + await createFile("coconut.mp4", filepath, metadata, user); + await createFile("dinnerbone.mp4", filepath, metadataDifferentParent, user); + const fileFive = await createFile("elephant.mp4", filepath, metadataDifferentOwner, user); + + const queryObj = { + "metadata.owner": "1234", + "metadata.parent": "/", + } + + const defaultSortBy = {uploadDate: -1} + + + + const recievedList = await utilsFile.getList(queryObj, defaultSortBy, 50); + + + expect(recievedList.length).toBe(1); + expect(recievedList[0]._id).toEqual(fileFive._id); +}) + +test("When giving parent, should return a filtered file list", async() => { + + const userID = user._id; + const filepath = path.join(__dirname, "../../../fixtures/media/check.svg") + const metadata = { + owner: userID, + parent: "/", + parentList: "/" + } + + const metadataDifferentParent = { + owner: userID, + parent: "1234", + parentList:"/,1234" + } + + const metadataDifferentOwner = { + owner: "1234", + parent: "/", + parentList:"/,1234" + } + + await createFile("apple.mp4", filepath, metadata, user); + await createFile("coconut.mp4", filepath, metadata, user); + const fileFour = await createFile("dinnerbone.mp4", filepath, metadataDifferentParent, user); + await createFile("elephant.mp4", filepath, metadataDifferentOwner, user); + + const queryObj = { + "metadata.owner": userID, + "metadata.parent": "1234", + } + + const defaultSortBy = {uploadDate: -1} + + + + const recievedList = await utilsFile.getList(queryObj, defaultSortBy, 50); + + + + expect(recievedList.length).toBe(1); + expect(recievedList[0]._id).toEqual(fileFour._id); +}) + +test("When giving limit, should return filitered list", async() => { + + const userID = user._id; + const filepath = path.join(__dirname, "../../../fixtures/media/check.svg") + const metadata = { + owner: userID, + parent: "/", + parentList: "/" + } + + const metadataDifferentParent = { + owner: userID, + parent: "1234", + parentList:"/,1234" + } + + const metadataDifferentOwner = { + owner: "1234", + parent: "/", + parentList:"/,1234" + } + + await createFile("apple.mp4", filepath, metadata, user); + const fileThree = await createFile("coconut.mp4", filepath, metadata, user); + await createFile("dinnerbone.mp4", filepath, metadataDifferentParent, user); + await createFile("elephant.mp4", filepath, metadataDifferentOwner, user); + + const queryObj = { + "metadata.owner": userID, + "metadata.parent": "/", + } + + const defaultSortBy = {uploadDate: -1} + + + + const recievedList = await utilsFile.getList(queryObj, defaultSortBy, 1); + + + + expect(recievedList.length).toBe(1); + expect(recievedList[0]._id).toEqual(fileThree._id); +}) + +test("When giving ascending upload date, should return filtered list", async() => { + + const userID = user._id; + const filepath = path.join(__dirname, "../../../fixtures/media/check.svg") + const metadata = { + owner: userID, + parent: "/", + parentList: "/" + } + + const metadataDifferentParent = { + owner: userID, + parent: "1234", + parentList:"/,1234" + } + + const metadataDifferentOwner = { + owner: "1234", + parent: "/", + parentList:"/,1234" + } + + const fileTwo = await createFile("apple.mp4", filepath, metadata, user); + const fileThree = await createFile("coconut.mp4", filepath, metadata, user); + await createFile("dinnerbone.mp4", filepath, metadataDifferentParent, user); + await createFile("elephant.mp4", filepath, metadataDifferentOwner, user); + + const queryObj = { + "metadata.owner": userID, + "metadata.parent": "/", + } + + const defaultSortBy = {uploadDate: 1} + + + + const recievedList = await utilsFile.getList(queryObj, defaultSortBy, 50); + + + + expect(recievedList.length).toBe(3); + expect(recievedList[0]._id).toEqual(file._id); + expect(recievedList[1]._id).toEqual(fileTwo._id); + expect(recievedList[2]._id).toEqual(fileThree._id); +}) + +test("When giving decending filename, should return filtered list", async() => { + + const userID = user._id; + const filepath = path.join(__dirname, "../../../fixtures/media/check.svg") + const metadata = { + owner: userID, + parent: "/", + parentList: "/" + } + + const metadataDifferentParent = { + owner: userID, + parent: "1234", + parentList:"/,1234" + } + + const metadataDifferentOwner = { + owner: "1234", + parent: "/", + parentList:"/,1234" + } + + const fileTwo = await createFile("apple.mp4", filepath, metadata, user); + const fileThree = await createFile("coconut.mp4", filepath, metadata, user); + await createFile("dinnerbone.mp4", filepath, metadataDifferentParent, user); + await createFile("elephant.mp4", filepath, metadataDifferentOwner, user); + + const queryObj = { + "metadata.owner": userID, + "metadata.parent": "/", + } + + + const defaultSortBy = {filename: -1} + + + + const recievedList = await utilsFile.getList(queryObj, defaultSortBy, 50); + + + + expect(recievedList.length).toBe(3); + expect(recievedList[0]._id).toEqual(fileThree._id); + expect(recievedList[1]._id).toEqual(file._id); + expect(recievedList[2]._id).toEqual(fileTwo._id); +}) + +test("When giving ascending filename, should return filtered list", async() => { + + const userID = user._id; + const filepath = path.join(__dirname, "../../../fixtures/media/check.svg") + const metadata = { + owner: userID, + parent: "/", + parentList: "/" + } + + const metadataDifferentParent = { + owner: userID, + parent: "1234", + parentList:"/,1234" + } + + const metadataDifferentOwner = { + owner: "1234", + parent: "/", + parentList:"/,1234" + } + + const fileTwo = await createFile("apple.mp4", filepath, metadata, user); + const fileThree = await createFile("coconut.mp4", filepath, metadata, user); + await createFile("dinnerbone.mp4", filepath, metadataDifferentParent, user); + await createFile("elephant.mp4", filepath, metadataDifferentOwner, user); + + const queryObj = { + "metadata.owner": userID, + "metadata.parent": "/", + } + + + const defaultSortBy = {filename: 1} + + + + const recievedList = await utilsFile.getList(queryObj, defaultSortBy, 50); + + + + expect(recievedList.length).toBe(3); + expect(recievedList[0]._id).toEqual(fileTwo._id); + expect(recievedList[1]._id).toEqual(file._id); + expect(recievedList[2]._id).toEqual(fileThree._id); +}) + +test("When giving start at with default values, should return filtered list", async() => { + + const userID = user._id; + const filepath = path.join(__dirname, "../../../fixtures/media/check.svg") + const metadata = { + owner: userID, + parent: "/", + parentList: "/" + } + + const metadataDifferentParent = { + owner: userID, + parent: "1234", + parentList:"/,1234" + } + + const metadataDifferentOwner = { + owner: "1234", + parent: "/", + parentList:"/,1234" + } + + const fileTwo = await createFile("apple.mp4", filepath, metadata, user); + const fileThree = await createFile("coconut.mp4", filepath, metadata, user); + await createFile("dinnerbone.mp4", filepath, metadataDifferentParent, user); + await createFile("elephant.mp4", filepath, metadataDifferentOwner, user); + + const queryObj = { + "metadata.owner": userID, + "metadata.parent": "/", + "uploadDate": {$lt: new Date(fileThree.uploadDate)} + } + + const defaultSortBy = {uploadDate: -1} + + + + const recievedList = await utilsFile.getList(queryObj, defaultSortBy, 50); + + + + expect(recievedList.length).toBe(2); + expect(recievedList[0]._id).toEqual(fileTwo._id); + expect(recievedList[1]._id).toEqual(file._id); +}) + +test("When giving start at with ascending data, should return filtered list", async() => { + + const userID = user._id; + const filepath = path.join(__dirname, "../../../fixtures/media/check.svg") + const metadata = { + owner: userID, + parent: "/", + parentList: "/" + } + + const metadataDifferentParent = { + owner: userID, + parent: "1234", + parentList:"/,1234" + } + + const metadataDifferentOwner = { + owner: "1234", + parent: "/", + parentList:"/,1234" + } + + const fileTwo = await createFile("apple.mp4", filepath, metadata, user); + const fileThree = await createFile("coconut.mp4", filepath, metadata, user); + await createFile("dinnerbone.mp4", filepath, metadataDifferentParent, user); + await createFile("elephant.mp4", filepath, metadataDifferentOwner, user); + + const queryObj = { + "metadata.owner": userID, + "metadata.parent": "/", + "uploadDate": {$gt: new Date(fileTwo.uploadDate)} + } + + const defaultSortBy = {uploadDate: 1} + + + + const recievedList = await utilsFile.getList(queryObj, defaultSortBy, 50); + + + + expect(recievedList.length).toBe(1); + expect(recievedList[0]._id).toEqual(fileThree._id); +}) + +test("When giving user and temp token, should remove temp token", async() => { + + const token = jwt.sign({_id: user._id}, process.env.PASSWORD, {expiresIn: 2}); + user.tempTokens = user.tempTokens.concat({token}) + await user.save(); + + + const recievedUser = await utilsFile.removeTempToken(user, token); + await recievedUser.save(); + const updatedUser = await User.findById(user._id); + + + expect(updatedUser.tempTokens.length).toBe(0); +}) + +test("When giving the wrong temp token, should not remove temp token", async() => { + + const token = jwt.sign({_id: user._id}, process.env.PASSWORD, {expiresIn: 2}); + user.tempTokens = user.tempTokens.concat({token}) + await user.save(); + + + const recievedUser = await utilsFile.removeTempToken(user, "1234"); + await recievedUser.save(); + const updatedUser = await User.findById(user._id); + + + expect(updatedUser.tempTokens.length).toBe(1); + expect(updatedUser.tempTokens[0].token._id).toBe(token._id) +}) + +test("When giving fileID and userID, should remove transcoded video", async() => { + + const fileID = file._id; + const userID = user._id; + await await conn.db.collection("fs.files") + .findOneAndUpdate({"_id": ObjectID(fileID), "metadata.owner": userID}, + {"$set": {"metadata.transcoded": true}}) + + await utilsFile.removeTranscodeVideo(fileID, userID); + const updatedFile = await conn.db.collection("fs.files") + .findOne({_id: fileID}); + + + expect(updatedFile.metadata.transcoded).toBe(undefined); +}) + +test("When giving wrong fileID, should not remove transcoded video", async() => { + + const fileID = file._id; + const userID = user._id; + const wrongFileID = "123456789012"; + await await conn.db.collection("fs.files") + .findOneAndUpdate({"_id": ObjectID(fileID), "metadata.owner": userID}, + {"$set": {"metadata.transcoded": true}}) + + await utilsFile.removeTranscodeVideo(wrongFileID, userID); + const updatedFile = await conn.db.collection("fs.files") + .findOne({_id: fileID}); + + + expect(updatedFile.metadata.transcoded).toBe(true); +}) + +test("When giving the wrong userID, should not remove transcoded video", async() => { + + const fileID = file._id; + const userID = user._id; + const wrongUserID = "123456789012"; + await await conn.db.collection("fs.files") + .findOneAndUpdate({"_id": ObjectID(fileID), "metadata.owner": userID}, + {"$set": {"metadata.transcoded": true}}) + + await utilsFile.removeTranscodeVideo(fileID, wrongUserID); + const updatedFile = await conn.db.collection("fs.files") + .findOne({_id: fileID}); + + + expect(updatedFile.metadata.transcoded).toBe(true); +}) + +test("When giving userID and search query, should return file list", async() => { + + const userID = user._id; + let search = "apple"; + search = new RegExp(search, 'i') + const filepath = path.join(__dirname, "../../../fixtures/media/check.svg") + const metadata = { + owner: userID, + parent: "/", + parentList: "/" + } + + const metadataDifferentParent = { + owner: userID, + parent: "1234", + parentList:"/,1234" + } + + const metadataDifferentOwner = { + owner: "1234", + parent: "/", + parentList:"/,1234" + } + + const fileTwo = await createFile("apple.mp4", filepath, metadata, user); + await createFile("coconut.mp4", filepath, metadata, user); + await createFile("dinnerbone.mp4", filepath, metadataDifferentParent, user); + await createFile("elephant.mp4", filepath, metadataDifferentOwner, user); + const recievedList = await utilsFile.getFileSearchList(userID, fileTwo.filename); + + + expect(recievedList.length).toBe(1); + expect(recievedList[0]._id).toEqual(fileTwo._id); +}) + +test("When giving wrong userID, should not return search list", async() => { + + const userID = user._id; + const wrongUserID = "123456789012" + let search = "apple"; + search = new RegExp(search, 'i') + const filepath = path.join(__dirname, "../../../fixtures/media/check.svg") + const metadata = { + owner: userID, + parent: "/", + parentList: "/" + } + + const metadataDifferentParent = { + owner: userID, + parent: "1234", + parentList:"/,1234" + } + + const metadataDifferentOwner = { + owner: "1234", + parent: "/", + parentList:"/,1234" + } + + const fileTwo = await createFile("apple.mp4", filepath, metadata, user); + await createFile("coconut.mp4", filepath, metadata, user); + await createFile("dinnerbone.mp4", filepath, metadataDifferentParent, user); + await createFile("elephant.mp4", filepath, metadataDifferentOwner, user); + const recievedList = await utilsFile.getFileSearchList(wrongUserID, fileTwo.filename); + + + expect(recievedList.length).toBe(0); +}) + +test("When giving fileID, userID, and title, should rename file", async() => { + + const userID = user._id; + const fileID = file._id; + const newName = "fin.mp4"; + + await utilsFile.renameFile(fileID, userID, newName); + const updatedFile = await conn.db.collection("fs.files") + .findOne({_id: fileID}); + + + expect(updatedFile.filename).toBe(newName); +}) + +test("When giving wrong fileID, should not rename file", async() => { + + const userID = user._id; + const fileID = file._id; + const wrongFileID = "123456789012" + const newName = "fin.mp4"; + + await utilsFile.renameFile(wrongFileID, userID, newName); + const updatedFile = await conn.db.collection("fs.files") + .findOne({_id: fileID}); + + + expect(updatedFile.filename).toBe(file.filename); +}) + +test("When giving the wrong userID, should not rename file", async() => { + + const fileID = file._id; + const wrongUserID = "123456789012" + const newName = "fin.mp4"; + + await utilsFile.renameFile(fileID, wrongUserID, newName); + const updatedFile = await conn.db.collection("fs.files") + .findOne({_id: fileID}); + + + expect(updatedFile.filename).toBe(file.filename); +}) + +test("When giving userID and parent string, should return file list by parent", async() => { + + const userID = user._id; + + const filepath = path.join(__dirname, "../../../fixtures/media/check.svg") + const metadata = { + owner: userID, + parent: "/", + parentList: "/" + } + + const metadataDifferentParent = { + owner: userID, + parent: "1234", + parentList:"/,1234" + } + + const metadataDifferentOwner = { + owner: "1234", + parent: "/", + parentList:"/,1234" + } + + await createFile("apple.mp4", filepath, metadata, user); + await createFile("coconut.mp4", filepath, metadata, user); + const fileFour = await createFile("dinnerbone.mp4", filepath, metadataDifferentParent, user); + await createFile("elephant.mp4", filepath, metadataDifferentOwner, user); + const recievedList = await utilsFile.getFileListByParent(userID, fileFour.metadata.parentList) + + + expect(recievedList.length).toBe(1); + expect(recievedList[0]._id).toEqual(fileFour._id); +}) + +test("When giving the wrong userID, should not return file list by parent", async() => { + + const userID = user._id; + const wrongUserID = "123456789012" + + const filepath = path.join(__dirname, "../../../fixtures/media/check.svg") + const metadata = { + owner: userID, + parent: "/", + parentList: "/" + } + + const metadataDifferentParent = { + owner: userID, + parent: "1234", + parentList:"/,1234" + } + + const metadataDifferentOwner = { + owner: "1234", + parent: "/", + parentList:"/,1234" + } + + await createFile("apple.mp4", filepath, metadata, user); + await createFile("coconut.mp4", filepath, metadata, user); + const fileFour = await createFile("dinnerbone.mp4", filepath, metadataDifferentParent, user); + await createFile("elephant.mp4", filepath, metadataDifferentOwner, user); + const recievedList = await utilsFile.getFileListByParent(wrongUserID, fileFour.metadata.parentList) + + + expect(recievedList.length).toBe(0); +}) + +test("When giving the userID, should return file list by owner", async() => { + + const userID = user._id; + + const filepath = path.join(__dirname, "../../../fixtures/media/check.svg") + const metadata = { + owner: userID, + parent: "/", + parentList: "/" + } + + const metadataDifferentParent = { + owner: userID, + parent: "1234", + parentList:"/,1234" + } + + const metadataDifferentOwner = { + owner: "1234", + parent: "/", + parentList:"/,1234" + } + + await createFile("apple.mp4", filepath, metadata, user); + await createFile("coconut.mp4", filepath, metadata, user); + await createFile("dinnerbone.mp4", filepath, metadataDifferentParent, user); + const fileFive = await createFile("elephant.mp4", filepath, metadataDifferentOwner, user); + const recievedList = await utilsFile.getFileListByOwner(fileFive.metadata.owner); + + + expect(recievedList.length).toBe(1); + expect(recievedList[0]._id).toEqual(fileFive._id); +}) + +test("When giving the wrong userID, should not return file list by owner", async() => { + + const userID = user._id; + const wrongUserID = "123456789012" + + const filepath = path.join(__dirname, "../../../fixtures/media/check.svg") + const metadata = { + owner: userID, + parent: "/", + parentList: "/" + } + + const metadataDifferentParent = { + owner: userID, + parent: "1234", + parentList:"/,1234" + } + + const metadataDifferentOwner = { + owner: "1234", + parent: "/", + parentList:"/,1234" + } + + await createFile("apple.mp4", filepath, metadata, user); + await createFile("coconut.mp4", filepath, metadata, user); + await createFile("dinnerbone.mp4", filepath, metadataDifferentParent, user); + await createFile("elephant.mp4", filepath, metadataDifferentOwner, user); + const recievedList = await utilsFile.getFileListByOwner(wrongUserID); + + + expect(recievedList.length).toBe(0); +}) + +test("When giving fileID, userID, parent, and parentList, should move file", async() => { + + const fileID = file._id; + const userID = user._id; + const parent = "1234"; + const parentList = ["/", "1234"].toString(); + + + await utilsFile.moveFile(fileID, userID, parent, parentList); + const updatedFile = await conn.db.collection("fs.files") + .findOne({_id: fileID}); + + + expect(updatedFile.metadata.parent).toBe(parent); + expect(updatedFile.metadata.parentList).toBe(parentList); +}) + +test("When giving wrong userID for move file, should not remove file", async() => { + + const fileID = file._id; + const wrongUserID = "123456789012"; + const parent = "1234"; + const parentList = ["/", "1234"].toString(); + + await utilsFile.moveFile(fileID, wrongUserID, parent, parentList); + const updatedFile = await conn.db.collection("fs.files") + .findOne({_id: fileID}); + + expect(updatedFile.metadata.parent).toBe(file.metadata.parent); + expect(updatedFile.metadata.parentList).toBe(file.metadata.parentList); +}) + diff --git a/tests/db/utils/folderUtils/index.test.js b/tests/db/utils/folderUtils/index.test.js new file mode 100644 index 0000000..d53663b --- /dev/null +++ b/tests/db/utils/folderUtils/index.test.js @@ -0,0 +1,421 @@ +const User = require("../../../../src/models/user"); +const mongoose = require("../../../../src/db/mongoose"); +const conn = mongoose.connection; +const createUser = require("../../../fixtures/createUser"); +const UtilsFolder = require("../../../../src/db/utils/folderUtils"); +const utilsFolder = new UtilsFolder(); +const Folder = require("../../../../src/models/folder"); + +let user; +let folder; + +process.env.KEY = "1234"; + +beforeEach(async(done) => { + + if (conn.readyState === 0) { + + conn.once("open", async() => { + + //user = await createUser(); + const {user: gotUser} = await createUser(); + user = gotUser; + + const folderData = { + name: "bunny", + owner: user._id, + parent: "/", + parentList: ["/"] + } + + + folder = new Folder(folderData); + await folder.save(); + + done(); + + + }) + + } else { + + //user = await createUser(); + const {user: gotUser} = await createUser(); + user = gotUser; + + const folderData = { + name: "bunny", + owner: user._id, + parent: "/", + parentList: ["/"] + } + + + folder = new Folder(folderData); + await folder.save(); + + done(); + } + +}) + +afterEach( async(done) => { + + await User.deleteMany({}); + await Folder.deleteMany({}); + + done(); + +}) + +test("When giving userID, and search query, should return a searched filtered folder list", async() => { + + const userID = user._id; + let search = "coco"; + search = new RegExp(search, 'i') + + const folderTwo = await new Folder({ + name: "coconut", + owner: userID, + parent: "/", + parentList: ["/"] + }) + + const folderThree = await new Folder({ + name: "dinnerbone", + owner: userID, + parent: "1234", + parentList: ["/", "1234"] + }) + + const folderFour = await new Folder({ + name: "cocoelephant", + owner: "1234", + parent: "/", + parentList: ["/"] + }) + + await folderTwo.save(); + await folderThree.save(); + await folderFour.save(); + + + + const recievedFolderList = await utilsFolder.getFolderSearchList(userID, search); + + + expect(recievedFolderList.length).toBe(1); + expect(recievedFolderList[0]._id).toEqual(folderTwo._id) +}) + +test("When giving the wrong userID, should not return search query", async() => { + + const userID = user._id; + const wrongUserID = "123456789012" + let search = "coco"; + search = new RegExp(search, 'i') + + const folderTwo = await new Folder({ + name: "coconut", + owner: userID, + parent: "/", + parentList: ["/"] + }) + + const folderThree = await new Folder({ + name: "dinnerbone", + owner: userID, + parent: "1234", + parentList: ["/", "1234"] + }) + + const folderFour = await new Folder({ + name: "cocoelephant", + owner: "1234", + parent: "/", + parentList: ["/"] + }) + + await folderTwo.save(); + await folderThree.save(); + await folderFour.save(); + + + + const recievedFolderList = await utilsFolder.getFolderSearchList(wrongUserID, search); + + + expect(recievedFolderList.length).toBe(0); +}) + +test("When giving folderID and userID, should return folder info", async() => { + + const folderID = folder._id; + const userID = user._id; + + + const recievedFolder = await utilsFolder.getFolderInfo(folderID, userID); + + + expect(recievedFolder._id).toEqual(folderID); +}) + +test("When giving the wrong folderID, should not return folder info", async() => { + + const wrongFolderID = "123456789012"; + const userID = user._id; + + + const recievedFolder = await utilsFolder.getFolderInfo(wrongFolderID, userID); + + + expect(recievedFolder).toBe(null); +}) + + +test("When giving the wrong userID, should not return folder info", async() => { + + const folderID = folder._id; + const wrongUserID = "123456789012" + + + const recievedFolder = await utilsFolder.getFolderInfo(folderID, wrongUserID); + + + expect(recievedFolder).toBe(null); +}) + +test("When giving userID, parent, and sortby, should return filtered folder list by parent", async() => { + + const userID = user._id; + const parent = "1234"; + const sortBy = {createdAt: -1} + + const folderTwo = await new Folder({ + name: "coconut", + owner: userID, + parent: "/", + parentList: ["/"] + }) + + const folderThree = await new Folder({ + name: "dinnerbone", + owner: userID, + parent: "1234", + parentList: ["/", "1234"] + }) + + const folderFour = await new Folder({ + name: "cocoelephant", + owner: "1234", + parent: "/", + parentList: ["/"] + }) + + await folderTwo.save(); + await folderThree.save(); + await folderFour.save(); + + + + const recievedFolderList = await utilsFolder.getFolderListByParent(userID, parent, sortBy); + + + expect(recievedFolderList.length).toBe(1); + expect(recievedFolderList[0]._id).toEqual(folderThree._id); +}) + +test("When giving the wrong userID, should not return folder list filtered by parent", async() => { + + const userID = user._id; + const parent = "1234"; + const sortBy = {createdAt: -1} + const wrongUserID = "123456789012" + + + const folderTwo = await new Folder({ + name: "coconut", + owner: userID, + parent: "/", + parentList: ["/"] + }) + + const folderThree = await new Folder({ + name: "dinnerbone", + owner: userID, + parent: "1234", + parentList: ["/", "1234"] + }) + + const folderFour = await new Folder({ + name: "cocoelephant", + owner: "1234", + parent: "/", + parentList: ["/"] + }) + + await folderTwo.save(); + await folderThree.save(); + await folderFour.save(); + + + + const recievedFolderList = await utilsFolder.getFolderListByParent(wrongUserID, parent, sortBy); + + + expect(recievedFolderList.length).toBe(0) +}) + +test("When giving userID, search query, and sort by, should return folder list by search (no limit)" , async() => { + + const userID = user._id; + let search = "coco"; + search = new RegExp(search, 'i') + + const folderTwo = await new Folder({ + name: "coconut", + owner: userID, + parent: "/", + parentList: ["/"] + }) + + const folderThree = await new Folder({ + name: "dinnerbone", + owner: userID, + parent: "1234", + parentList: ["/", "1234"] + }) + + const folderFour = await new Folder({ + name: "cocoelephant", + owner: "1234", + parent: "/", + parentList: ["/"] + }) + + await folderTwo.save(); + await folderThree.save(); + await folderFour.save(); + + + + const recievedFolderList = await utilsFolder.getFolderListBySearch(userID, search); + + + expect(recievedFolderList.length).toBe(1); + expect(recievedFolderList[0]._id).toEqual(folderTwo._id) + +}) + +test("When giving wrong userID, should not return folder list by search (no limit)", async() => { + + const userID = user._id; + let search = "coco"; + search = new RegExp(search, 'i') + const wrongUserID = "123456789012" + + const folderTwo = await new Folder({ + name: "coconut", + owner: userID, + parent: "/", + parentList: ["/"] + }) + + const folderThree = await new Folder({ + name: "dinnerbone", + owner: userID, + parent: "1234", + parentList: ["/", "1234"] + }) + + const folderFour = await new Folder({ + name: "cocoelephant", + owner: "1234", + parent: "/", + parentList: ["/"] + }) + + await folderTwo.save(); + await folderThree.save(); + await folderFour.save(); + + + + const recievedFolderList = await utilsFolder.getFolderListBySearch(wrongUserID, search); + + + expect(recievedFolderList.length).toBe(0); +}) + +test("When giving folderID, userID, and title, should rename folder", async() => { + + const folderID = folder._id; + const userID = user._id; + const newName = "almonds"; + + + await utilsFolder.renameFolder(folderID, userID, newName); + const updatedFolder = await Folder.findById(folderID); + + + expect(updatedFolder.name).toBe(newName); +}) + +test("When giving wrong folderID, should not rename folder", async() => { + + const folderID = folder._id; + const userID = user._id; + const newName = "almonds"; + const wrongFolderID = "123456789012" + + + await utilsFolder.renameFolder(wrongFolderID, userID, newName); + const updatedFolder = await Folder.findById(folderID); + + + expect(updatedFolder.name).toBe(folder.name); +}) + +test("When giving the wrong userID, should not rename folder", async() => { + + const folderID = folder._id; + const wrongUserID = "123456789012"; + const newName = "almonds"; + + + await utilsFolder.renameFolder(folderID, wrongUserID, newName); + const updatedFolder = await Folder.findById(folderID); + + + expect(updatedFolder.name).toBe(folder.name); +}) + +test("When giving folderID, userID, parent, and parentList, should move folder", async() => { + + const folderID = folder._id; + const userID = user._id; + const parent = "1234"; + const parentList = ["/", "1234"]; + + + await utilsFolder.moveFolder(folderID, userID, parent, parentList); + const updatedFolder = await Folder.findById(folderID); + + expect(updatedFolder.parentList.length).toBe(2); + expect(updatedFolder.parent).toBe(parent); +}) + +test("When giving the wrong userID for folder move, should not move folder", async() => { + + const folderID = folder._id; + const wrongUserID = "123456789012"; + const parent = "1234"; + const parentList = ["/", "1234"]; + + await utilsFolder.moveFolder(folderID, wrongUserID, parent, parentList); + const updatedFolder = await Folder.findById(folderID); + + expect(updatedFolder.parentList.length).toBe(1); + expect(updatedFolder.parent).toBe(folder.parent); +}) + diff --git a/tests/express-routers/file.test.js b/tests/express-routers/file.test.js new file mode 100644 index 0000000..cf3f6af --- /dev/null +++ b/tests/express-routers/file.test.js @@ -0,0 +1,569 @@ +const User = require("../../src/models/user"); +const mongoose = require("../../src/db/mongoose"); +const conn = mongoose.connection; +const createUser = require("../fixtures/createUser"); +const createUser2 = require("../fixtures/createUser2"); +const createFile = require("../fixtures/createFile"); +const crypto = require("crypto"); +const path = require("path"); +const env = require("../../src/enviroment/env"); +const createThumbnail = require("../../src/services/FileService/utils/createThumbnail"); +const request = require("supertest"); +const jwt = require("jsonwebtoken"); +const ObjectID = require('mongodb').ObjectID +const app = require("../../server/server"); +const Folder = require("../../src/models/folder"); +const temp = require("temp").track(); +const binaryPhraser = require("superagent-binary-parser"); + +let user; +let userToken; +let user2; +let userToken2; +let file; + +process.env.KEY = "1234"; +env.key = "1234"; + + +beforeEach(async(done) => { + + if (conn.readyState === 0) { + + conn.once("open", async() => { + + + const initVect = crypto.randomBytes(16); + + // user = await createUser(); + // userToken = user.tokens[0].token; + const {user: gotUser, token: gotToken} = await createUser(); + user = gotUser; + userToken = gotToken; + + // user2 = await createUser2(); + // userToken2 = user2.tokens[0].token; + const {user: gotUser2, token: gotToken2} = await createUser2(); + user2 = gotUser2; + userToken2 = gotToken2; + + const filename = "bunny.png"; + const filepath = path.join(__dirname, "../fixtures/media/check.svg") + const metadata = { + owner: user._id, + parent: "/", + parentList: "/", + "IV": initVect + } + + file = await createFile(filename, filepath, metadata, user); + + done(); + + }) + + } else { + + const initVect = crypto.randomBytes(16); + + // user = await createUser(); + // userToken = user.tokens[0].token; + const {user: gotUser, token: gotToken} = await createUser(); + user = gotUser; + userToken = gotToken; + + // user2 = await createUser2(); + // userToken2 = user2.tokens[0].token; + const {user: gotUser2, token: gotToken2} = await createUser2(); + user2 = gotUser2; + userToken2 = gotToken2; + + // user = await createUser(); + // userToken = user.tokens[0].token; + + // user2 = await createUser2(); + // userToken2 = user2.tokens[0].token; + + const filename = "bunny.png"; + const filepath = path.join(__dirname, "../fixtures/media/check.svg") + const metadata = { + owner: user._id, + parent: "/", + parentList: "/", + "IV": initVect + } + + file = await createFile(filename, filepath, metadata, user); + + done(); + } + +}) + +afterEach(async(done) => { + + console.log("After each") + + //const gfs = Grid(conn.db, mongoose.mongo); + let bucket = new mongoose.mongo.GridFSBucket(conn.db); + + await User.deleteMany({}); + + const allFiles = await conn.db.collection("fs.files").find({}).toArray(); + + for (let i = 0; i < allFiles.length; i++) { + + const currentFileID = allFiles[i]._id; + await bucket.delete(ObjectID(currentFileID)); + } + + done(); +}) + +// To-do maybe + +// test("When giving user, should send transcoded video response", async() => { + +// const response = await request(app) +// .post(`/file-service/transcode-video`) +// .set("Authorization", `Bearer ${userToken}`) +// .send({file}) +// .expect(200); + +// console.log("response", response.body); +// }) + +// test("When giving wrong user for transcode video, should return 401 error", async() => { + +// const user2 = await createUser2(); +// const userToken2 = user2.tokens[0].token; + +// await request(app) +// .get(`/file-service/transcode-video`) +// .set("Authorization", `Bearer ${userToken2}`) +// .send(user) +// .expect(401); +// }) + +test("When giving ID, should send thumbnail data", async() => { + + const thumbnailFile = await createThumbnail(file, file.filename, user); + const thumbnailID = thumbnailFile.metadata.thumbnailID; + + const response = await request(app) + .get(`/file-service/thumbnail/${thumbnailID}`) + .set("Authorization", `Bearer ${userToken}`) + .send() + .expect(200); + + expect(response.body.length).not.toBe(0); +}) + +test("When giving no authorization for thumbnail data, should return error", async() => { + + const thumbnailFile = await createThumbnail(file, file.filename, user); + const thumbnailID = thumbnailFile.metadata.thumbnailID; + + const response = await request(app) + .get(`/file-service/thumbnail/${thumbnailID}`) + .send() + .expect(401); + + expect(response.body).toEqual({ + "error": "Error Authenticating", + }); +}) + +test("When giving wrong auth data for thumbnail, should return 401 error", async() => { + + + const thumbnailFile = await createThumbnail(file, file.filename, user); + const thumbnailID = thumbnailFile.metadata.thumbnailID; + + + const response = await request(app) + .get(`/file-service/thumbnail/${thumbnailID}`) + .set("Authorization", `Bearer ${userToken2}`) + .send() + .expect(401); + + expect(response.body).toEqual({}); +}) + + +// Needs Work, cannot phrase binary data? + +// test("When giving public ID, should return public file download", async() => { + +// const userID = user._id; +// const fileID = file._id.toString(); +// const token = jwt.sign({_id: userID.toString()}, env.password); +// await conn.db.collection("fs.files") +// .findOneAndUpdate({"_id": ObjectID(fileID), +// "metadata.owner": userID}, +// {"$set": {"metadata.linkType": "public", "metadata.link": token}}) + +// const response = await request(app) +// .get(`/file-service/public/download/${fileID}`) +// .parse(binaryPhraser) +// .buffer() +// .end(); + + +// //expect(response.body._id).toEqual(fileID); + +// // console.log("public", token.token); + +// // const url = "/file-service/public/download/" + fileID; +// // console.log("url", url); +// // const response = await request(app).get(url) +// // .set("Authorization", `Bearer ${userToken}`) +// // .set('content-type', 'application/octet-stream') +// // .send() +// // .expect(203) + +// // const writeStream = temp.createWriteStream(); + +// //response.pipe(writeStream); +// }) + +test("When giving public id, should return public info", async() => { + + const userID = user._id; + const fileID = file._id.toString(); + const token = jwt.sign({_id: userID.toString()}, env.password).toString(); + await conn.db.collection("fs.files") + .findOneAndUpdate({"_id": ObjectID(fileID), + "metadata.owner": userID}, + {"$set": {"metadata.linkType": "public", "metadata.link": token}}) + + const response = await request(app) + .get(`/file-service/public/info/${fileID}/${token}`) + .set("Authorization", `Bearer ${userToken}`) + .send() + .expect(200); + + expect(response.body._id).toEqual(fileID); +}) + +test("When giving ID for non public file, should return 404 error", async() => { + + const userID = user._id; + const fileID = file._id.toString(); + const token = jwt.sign({_id: userID.toString()}, env.password).toString(); + const response = await request(app) + .get(`/file-service/public/info/${fileID}/${token}`) + .set("Authorization", `Bearer ${userToken}`) + .send() + .expect(404); + + expect(response.data).toBe(undefined); +}) + +test("When giving fileID, should return file info", async() => { + + const fileID = file._id; + + const response = await request(app) + .get(`/file-service/info/${fileID}`) + .set("Authorization", `Bearer ${userToken}`) + .send() + .expect(200); + + expect(response.body._id).toEqual(fileID.toString()); +}) + +test("When not authorized for file info, should return 401 error", async() => { + + const fileID = file._id; + + const response = await request(app) + .get(`/file-service/info/${fileID}`) + .send() + .expect(401); + + expect(response.body).toEqual({ + "error": "Error Authenticating", + }); +}) + +test("When giving wrong auth token for file info, should return 404 error", async() => { + + const fileID = file._id; + + const response = await request(app) + .get(`/file-service/info/${fileID}`) + .set("Authorization", `Bearer ${userToken2}`) + .send() + .expect(404); + + expect(response.body).toEqual({}); +}) + +test("When giving the wrong tempToken for public file info, should return 404 error", async() => { + + const userID = user._id; + const fileID = file._id.toString(); + const token = jwt.sign({_id: userID.toString()}, env.password).toString(); + const wrongToken = "12345" + await conn.db.collection("fs.files") + .findOneAndUpdate({"_id": ObjectID(fileID), + "metadata.owner": userID}, + {"$set": {"metadata.linkType": "public", "metadata.link": token}}) + + const response = await request(app) + .get(`/file-service/public/info/${fileID}/${wrongToken}`) + .set("Authorization", `Bearer ${userToken}`) + .send() + .expect(404); + + expect(response.body).toEqual({}); +}) + +test("When giving authorization, should get user quicklist", async() => { + + const response = await request(app) + .get(`/file-service/quick-list`) + .set("Authorization", `Bearer ${userToken}`) + .send() + .expect(200); + + expect(response.body.length).toBe(1); +}) + +test("When giving no authoization for quicklist, should return 401 error", async() => { + + const response = await request(app) + .get(`/file-service/quick-list`) + .send() + .expect(401); + + expect(response.body).toEqual({ + "error": "Error Authenticating", + }); +}) + +test("When giving default query, should return file list", async() => { + + const response = await request(app) + .get(`/file-service/list`) + .set("Authorization", `Bearer ${userToken}`) + .send({}) + .expect(200); + + expect(response.body.length).toBe(1); +}) + +test("When giving no authoization for file list, should return 401 error", async() => { + + const response = await request(app) + .get(`/file-service/list`) + .send({}) + .expect(401); + + expect(response.body).toEqual({ + "error": "Error Authenticating", + }); +}) + +test("When giving wrong auth for list, should return empty list", async() => { + + const response = await request(app) + .get(`/file-service/list`) + .set("Authorization", `Bearer ${userToken2}`) + .send({}) + .expect(200); + + expect(response.body.length).toBe(0); +}) + +test("When autheniticated should generate download token", async() => { + + await request(app) + .get(`/file-service/download/get-token`) + .set("Authorization", `Bearer ${userToken}`) + .send() + .expect(200); +}) + +test("When not authenticated, should not generate download token", async() => { + + await request(app) + .get(`/file-service/download/get-token`) + .send() + .expect(401); +}) + +test("When authenticated and cookie should generate video token", async() => { + + await request(app) + .get(`/file-service/download/get-token-video`) + .set("Authorization", `Bearer ${userToken}`) + .set("uuid", 1234) + .send() + .expect(200); +}) + +test("When not authenticated, should not generate video token", async() => { + + await request(app) + .get(`/file-service/download/get-token-video`) + .set("uuid", 1234) + .send() + .expect(401); +}) + +test("When not giving a Cookie, should not generate video token", async() => { + + await request(app) + .get(`/file-service/download/get-token-video`) + .set("Authorization", `Bearer ${userToken}`) + .send() + .expect(401); +}) + +test("When giving tempToken, should remove temp token", async() => { + + const token = await request(app) + .get(`/file-service/download/get-token-video`) + .set("Authorization", `Bearer ${userToken}`) + .set("uuid", 1234) + .send() + .expect(200); + + await request(app) + .delete(`/file-service/remove/token-video/${token}`) + .set("Authorization", `Bearer ${userToken}`) + .send() + .expect(200); + +}) + +test("When not authorized, should not remove temp token", async() => { + + const token = await request(app) + .get(`/file-service/download/get-token-video`) + .set("Authorization", `Bearer ${userToken}`) + .set("uuid", 1234) + .send() + .expect(200); + + await request(app) + .delete(`/file-service/remove/token-video/${token}`) + .send() + .expect(401); +}) + +test("When authorized should return suggested list", async() => { + + await request(app) + .get(`/file-service/suggested-list`) + .set("Authorization", `Bearer ${userToken}`) + .send() + .expect(200); +}) + +test("When not authorized should not return suggested list", async() => { + + const response =await request(app) + .get(`/file-service/suggested-list`) + .send() + .expect(401); + + expect(response.body).toEqual({ + "error": "Error Authenticating", + }); +}) + +test("When giving fileID and title, should rename file", async() => { + + const fileID = file._id; + + await request(app) + .patch(`/file-service/rename`) + .set("Authorization", `Bearer ${userToken}`) + .send({ + id: fileID, + title: "new name" + }) + .expect(200); +}) + +test("When not authoized for rename file, should return 401 error", async() => { + + const fileID = file._id; + + await request(app) + .patch(`/file-service/rename`) + .send({ + id: fileID, + title: "new name" + }) + .expect(401); +}) + +test("When giving fileID and parent, should move file", async() => { + + const fileID = file._id; + const userID = user._id; + + const folder = new Folder({ + owner: userID, + name: "folder", + parent: "/", + parentList: ["/"] + }) + + await folder.save(); + + const folderID = folder._id; + + await request(app) + .patch(`/file-service/move`) + .set("Authorization", `Bearer ${userToken}`) + .send({ + id: fileID, + parent: folderID + }) + .expect(200); +}) + +test("When giving a parentID that does not exist, should return 500 error", async() => { + + const fileID = file._id; + + await request(app) + .patch(`/file-service/move`) + .set("Authorization", `Bearer ${userToken}`) + .send({ + id: fileID, + parent: "123456789012" + }) + .expect(404); +}) + +test("When giving fileID should remove file", async() => { + + const fileID = file._id; + + await request(app) + .delete(`/file-service/remove`) + .set("Authorization", `Bearer ${userToken}`) + .send({ + id: fileID, + }) + .expect(200); +}) + +test("When giving fileID that does not exist for remove file, should return 404 error", async() => { + + const fileID = "123456789012"; + + await request(app) + .delete(`/file-service/remove`) + .set("Authorization", `Bearer ${userToken}`) + .send({ + id: fileID, + }) + .expect(404); +}) \ No newline at end of file diff --git a/tests/express-routers/folder.test.js b/tests/express-routers/folder.test.js new file mode 100644 index 0000000..c6ddb87 --- /dev/null +++ b/tests/express-routers/folder.test.js @@ -0,0 +1,317 @@ +const User = require("../../src/models/user"); +const mongoose = require("../../src/db/mongoose"); +const conn = mongoose.connection; +const createUser = require("../fixtures/createUser"); +const createUser2 = require("../fixtures/createUser2"); +const createFile = require("../fixtures/createFile"); +const crypto = require("crypto"); +const path = require("path"); +const env = require("../../src/enviroment/env"); +const createThumbnail = require("../../src/services/FileService/utils/createThumbnail"); +const request = require("supertest"); +const jwt = require("jsonwebtoken"); +const ObjectID = require('mongodb').ObjectID +const app = require("../../server/server"); +const Folder = require("../../src/models/folder"); +const temp = require("temp").track(); +const binaryPhraser = require("superagent-binary-parser"); + +let user; +let userToken; +let user2; +let userToken2; +let file; +let folder; + +process.env.KEY = "1234"; +env.key = "1234"; + + +beforeEach(async(done) => { + + if (conn.readyState === 0) { + + conn.on("open", async() => { + + // user = await createUser(); + // userToken = user.tokens[0].token; + + // user2 = await createUser2(); + // userToken2 = user2.tokens[0].token; + + const {user: gotUser, token: gotToken} = await createUser(); + user = gotUser; + userToken = gotToken; + + const {user: gotUser2, token: gotToken2} = await createUser2(); + user2 = gotUser2; + userToken2 = gotToken2; + + const folderData = { + name: "bunny", + parent: "/", + owner: user._id, + parentList: ["/"] + } + + folder = new Folder(folderData); + await folder.save(); + + done(); + + }) + + } else { + + // user = await createUser(); + // userToken = user.tokens[0].token; + + // user2 = await createUser2(); + // userToken2 = user2.tokens[0].token; + const {user: gotUser, token: gotToken} = await createUser(); + user = gotUser; + userToken = gotToken; + + const {user: gotUser2, token: gotToken2} = await createUser2(); + user2 = gotUser2; + userToken2 = gotToken2; + + + const folderData = { + name: "bunny", + parent: "/", + owner: user._id, + parentList: ["/"] + } + + folder = new Folder(folderData); + await folder.save(); + + done(); + + + } +}) + +afterEach(async(done) => { + + let bucket = new mongoose.mongo.GridFSBucket(conn.db); + + await User.deleteMany({}); + await Folder.deleteMany({}); + + const allFiles = await conn.db.collection("fs.files").find({}).toArray(); + + for (let i = 0; i < allFiles.length; i++) { + + const currentFileID = allFiles[i]._id; + await bucket.delete(ObjectID(currentFileID)); + } + + done(); +}) + +test("When giving folderID, should return folder info", async() => { + + const folderID = folder._id; + + await request(app) + .get(`/folder-service/info/${folderID}`) + .set("Authorization", `Bearer ${userToken}`) + .send() + .expect(200); +}) + +test("When not authorized for folder info, should return 401 error", async() => { + + const folderID = folder._id; + + await request(app) + .get(`/folder-service/info/${folderID}`) + .send() + .expect(401); +}) + +test("When giving wrong authorization for folder info, should return 404 error", async() => { + + const folderID = folder._id; + + await request(app) + .get(`/folder-service/info/${folderID}`) + .set("Authorization", `Bearer ${userToken2}`) + .send() + .expect(404); +}) + +test("When giving folderID, should return subfolder list", async() => { + + const folderID = folder._id; + + await request(app) + .get(`/folder-service/subfolder-list?id=${folderID}`) + .set("Authorization", `Bearer ${userToken}`) + .send() + .expect(200); +}) + +test("When giving no folderID for subfolder list, should return 404 error", async() => { + + await request(app) + .get(`/folder-service/subfolder-list`) + .set("Authorization", `Bearer ${userToken}`) + .send() + .expect(404); +}) + +test("When giving no authorization for subfolder list, should return 401 error", async() => { + + const folderID = folder._id; + + await request(app) + .get(`/folder-service/subfolder-list?id=${folderID}`) + .send() + .expect(401); +}) + +test("When giving wrong authorization for subfolder list, should return 404 error", async() => { + + + const folderID = folder._id; + + await request(app) + .get(`/folder-service/subfolder-list?id=${folderID}`) + .set("Authorization", `Bearer ${userToken2}`) + .send() + .expect(404); + +}) + +test("When giving default query, should return folder list", async() => { + + const query = {} + + await request(app) + .get(`/folder-service/list?query=${query}`) + .set("Authorization", `Bearer ${userToken}`) + .send() + .expect(200); +}) + +test("When giving no authorization for folder list, should return 401 error", async() => { + + const query = {} + + await request(app) + .get(`/folder-service/list?query=${query}`) + .send() + .expect(401); +}) + +test("When giving ID and parent, should move folder", async() => { + + const folderData = { + name: "bunny", + parent: "/", + owner: user._id, + parentList: ["/"] + } + + const folder2 = new Folder(folderData); + await folder2.save(); + const parentID = folder2._id; + + const folderID = folder._id; + + await request(app) + .patch(`/folder-service/move`) + .set("Authorization", `Bearer ${userToken}`) + .send({ + id: folderID, + parent: parentID + }) + .expect(200); +}) + +test("When giving a folder id that does not exist for move folder, should return 500 error", async() => { + + const folderData = { + name: "bunny", + parent: "/", + owner: user._id, + parentList: ["/"] + } + + const folder2 = new Folder(folderData); + await folder2.save(); + const parentID = folder2._id; + + await request(app) + .patch(`/folder-service/move`) + .set("Authorization", `Bearer ${userToken}`) + .send({ + id: "1234", + parent: parentID + }) + .expect(500); + +}) + +test("When giving parent id that does not exist for move folder, should return 500 error", async() => { + + const folderID = folder._id; + + await request(app) + .patch(`/folder-service/move`) + .set("Authorization", `Bearer ${userToken}`) + .send({ + id: folderID, + parent: "1234" + }) + .expect(500); +}) + +test("When giving folder id and title, should rename folder", async() => { + + const folderID = folder._id; + const title = "new name"; + + await request(app) + .patch(`/folder-service/rename`) + .set("Authorization", `Bearer ${userToken}`) + .send({ + id: folderID, + title + }) + .expect(200); +}) + +test("When giving not authorization for rename folder, should return 401 error", async() => { + + const folderID = folder._id; + const title = "new name"; + + await request(app) + .patch(`/folder-service/rename`) + .send({ + id: folderID, + title + }) + .expect(401); +}) + +test("When giving id for folder that does not exist for rename, should return 404 error", async() => { + + + const wrongFolderID = "123456789012"; + const title = "new name"; + + await request(app) + .patch(`/folder-service/rename`) + .set("Authorization", `Bearer ${userToken}`) + .send({ + id: wrongFolderID, + title + }) + .expect(404); + +}) \ No newline at end of file diff --git a/tests/express-routers/user.test.js b/tests/express-routers/user.test.js new file mode 100644 index 0000000..58a240e --- /dev/null +++ b/tests/express-routers/user.test.js @@ -0,0 +1,222 @@ +const User = require("../../src/models/user"); +const mongoose = require("../../src/db/mongoose"); +const conn = mongoose.connection; +const createUser = require("../fixtures/createUser"); +const app = require("../../server/server"); +const request = require("supertest"); +const env = require("../../src/enviroment/env") + +let user; +let userToken; + +beforeEach(async(done) => { + + if (conn.readyState === 0) { + + // user = await createUser(); + // userToken = user.tokens[0].token; + const {user: gotUser, token: gotToken} = await createUser(); + user = gotUser; + userToken = gotToken; + + done() + + } else { + + // user = await createUser(); + // userToken = user.tokens[0].token; + const {user: gotUser, token: gotToken} = await createUser(); + user = gotUser; + userToken = gotToken; + + done(); + } +}) + +afterEach(async(done) => { + + await User.deleteMany({}); + done(); +}) + +test("When authorized, should return user, with no sensitive data", async() => { + + const response = await request(app) + .get(`/user-service/user`) + .set("Authorization", `Bearer ${userToken}`) + .send() + .expect(200); + + expect(response.body.password).toEqual(undefined); + expect(response.body.privateKey).toEqual(undefined); + expect(response.body.publicKey).toEqual(undefined); + expect(response.body.tokens).toEqual(undefined); + expect(response.body.tempTokens).toEqual(undefined); + expect(response.body.email).not.toEqual(undefined); +}) + +test("When not authorized should return 401 for user", async() => { + + const response = await request(app) + .get(`/user-service/user`) + .send() + .expect(401); + + expect(response.body).toEqual({ + "error": "Error Authenticating", + }); +}) + +test("When giving credentials, should login user, and not return sensitive info", async() => { + + const response = await request(app) + .post(`/user-service/login`) + .set("Authorization", `Bearer ${userToken}`) + .send({ + email: user.email, + password: "12345678" + }) + .expect(200); + + expect(response.body.password).toEqual(undefined); + expect(response.body.privateKey).toEqual(undefined); + expect(response.body.publicKey).toEqual(undefined); + expect(response.body.tokens).toEqual(undefined); + expect(response.body.tempTokens).toEqual(undefined); +}) + +test("When giving wrong creditentials, should return 500 error", async() => { + + const response = await request(app) + .post(`/user-service/login`) + .set("Authorization", `Bearer ${userToken}`) + .send({ + email: user.email, + password: "1454524" + }) + .expect(500); + + expect(response.body).toEqual({}); +}) + +test("When authorized should logout user", async() => { + + await request(app) + .post(`/user-service/logout`) + .set("Authorization", `Bearer ${userToken}`) + .send() + .expect(200); +}) + +test("When not authorized for logout, should return 401 error", async() => { + + const response = await request(app) + .post(`/user-service/logout`) + .send() + .expect(401); + + expect(response.body).toEqual({ + "error": "Error Authenticating", + }); +}) + +test("When authoized should logout all sessions of a user", async() => { + + await request(app) + .post(`/user-service/logout-all`) + .set("Authorization", `Bearer ${userToken}`) + .send() + .expect(200); +}) + +test("When not authorized for logout all, should return 401 error", async() => { + + const response = await request(app) + .post(`/user-service/logout-all`) + .send() + .expect(401); + + expect(response.body).toEqual({ + "error": "Error Authenticating", + }); +}) + +test("When giving user data, should create account without returning sensitive data", async() => { + + const response = await request(app) + .post(`/user-service/create`) + .send({ + email: "test55@gmail.com", + password: "12345678" + }) + .expect(201); + + expect(response.body.password).toEqual(undefined); + expect(response.body.privateKey).toEqual(undefined); + expect(response.body.publicKey).toEqual(undefined); + expect(response.body.tokens).toEqual(undefined); + expect(response.body.tempTokens).toEqual(undefined); +}) + +test("When env variable is set to block accounts, should return 401 error", async() => { + + env.createAcctBlocked = true; + + await request(app) + .post(`/user-service/create`) + .send({ + email: "test55@gmail.com", + password: "12345678" + }) + .expect(401); + + env.createAcctBlocked = false; +}) + +test("When giving old password, and new password, should change password", async() => { + + const oldPassword = "12345678"; + const newPassword = "987654321"; + + await request(app) + .post(`/user-service/change-password`) + .set("Authorization", `Bearer ${userToken}`) + .send({ + oldPassword, + newPassword + }) + .expect(200); +}) + +test("When giving wrong old password for change password, should return 500 error", async() => { + + const wrongOldPassword = "12342345"; + const newPassword = "987654321"; + + await request(app) + .post(`/user-service/change-password`) + .set("Authorization", `Bearer ${userToken}`) + .send({ + wrongOldPassword, + newPassword + }) + .expect(500); +}) + +test("When not authorized for change password, should return 401 error", async() => { + + const oldPassword = "12345678"; + const newPassword = "987654321"; + + const response = await request(app) + .post(`/user-service/change-password`) + .send({ + oldPassword, + newPassword + }) + .expect(401); + + expect(response.body).toEqual({ + "error": "Error Authenticating", + }); +}) \ No newline at end of file diff --git a/tests/fixtures/createFile.js b/tests/fixtures/createFile.js new file mode 100644 index 0000000..3dc7d49 --- /dev/null +++ b/tests/fixtures/createFile.js @@ -0,0 +1,32 @@ +const mongoose = require("../../src/db/mongoose"); +const conn = mongoose.connection; +const crypto = require("crypto"); +const fs = require("fs"); + +const createFile = (filename, filepath, metadata, user) => { + return new Promise((resolve, reject) => { + + const password = user.getEncryptionKey(); //process.env.KEY; + + const initVect = metadata.IV || crypto.randomBytes(16); + + const CIPHER_KEY = crypto.createHash('sha256').update(password).digest() + + const cipher = crypto.createCipheriv('aes256', CIPHER_KEY, initVect); + + const fileReadStream = fs.createReadStream(filepath); + + let bucket = new mongoose.mongo.GridFSBucket(conn.db, { + chunkSizeBytes: 1024 * 255 + }); + + const uploadStream = bucket.openUploadStream(filename, {metadata}); + + fileReadStream.pipe(cipher).pipe(uploadStream).on("finish", (file) => { + + resolve(file); + }); + }) +} + +module.exports = createFile; \ No newline at end of file diff --git a/tests/fixtures/createUser.js b/tests/fixtures/createUser.js new file mode 100644 index 0000000..6397017 --- /dev/null +++ b/tests/fixtures/createUser.js @@ -0,0 +1,31 @@ +const jwt = require("jsonwebtoken"); +const mongoose = require("../../src/db/mongoose"); +const User = require("../../src/models/user"); +const env = require("../../src/enviroment/env"); + +const createUser = async() => { + + env.key = "1234"; + env.password = "1234"; + process.env.KEY = "1234"; + process.env.PASSWORD = "1234"; + + const userID = new mongoose.Types.ObjectId(); + const userData = { + _id: userID, + name: "Test User", + email: "test2@test.com", + password: "12345678", + } + + let user = new User(userData); + await user.save(); + + await user.generateEncryptionKeys(); + + const token = await user.generateAuthToken(); + + return {user, token}; +} + +module.exports = createUser; \ No newline at end of file diff --git a/tests/fixtures/createUser2.js b/tests/fixtures/createUser2.js new file mode 100644 index 0000000..03e75a9 --- /dev/null +++ b/tests/fixtures/createUser2.js @@ -0,0 +1,31 @@ +const jwt = require("jsonwebtoken"); +const mongoose = require("../../src/db/mongoose"); +const User = require("../../src/models/user"); +const env = require("../../src/enviroment/env"); + +const createUser2 = async() => { + + env.key = "1234"; + env.password = "1234"; + process.env.KEY = "1234"; + process.env.PASSWORD = "1234"; + + const userID = new mongoose.Types.ObjectId(); + const userData = { + _id: userID, + name: "Test User", + email: "test3@test.com", + password: "12345678", + } + + let user = new User(userData); + await user.save(); + + await user.generateEncryptionKeys(); + + const token = await user.generateAuthToken(); + + return {user, token}; +} + +module.exports = createUser2; \ No newline at end of file diff --git a/tests/fixtures/media/big_buck_bunny.mp4 b/tests/fixtures/media/big_buck_bunny.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..81d11df5f2c8ed6e33a1350d98e800d943bac7e9 GIT binary patch literal 5510872 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�KgN-CC8l8W8)q~aSJ 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ℑ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%0DlAI3E&YLS3ku~mu!K3uo2ULWdrfP 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