From 6aba03e3101e1fbcdfcc2bd66155775a4d2c602f Mon Sep 17 00:00:00 2001 From: SrGooglo Date: Wed, 6 Mar 2024 19:43:09 +0000 Subject: [PATCH] merge from local --- packages/server/boot | 9 +- packages/server/classes/AuthToken/index.js | 2 +- .../server/classes/SecureSyncEntry/index.js | 2 +- .../DbModels => db_models}/NFCTags/index.js | 0 packages/server/db_models/aprSession/index.js | 17 + .../authorizedServerTokens/index.js | 0 .../DbModels => db_models}/badge/index.js | 0 .../DbModels => db_models}/comment/index.js | 0 .../DbModels => db_models}/config/index.js | 0 .../featuredEvent/index.js | 0 .../featuredPlaylist/index.js | 0 .../featuredWallpaper/index.js | 0 .../{classes/DbModels => db_models}/index.js | 0 .../server/db_models/mfaSessions/index.js | 13 + .../server/db_models/operationLog/index.js | 13 + .../DbModels => db_models}/playlist/index.js | 0 .../DbModels => db_models}/post/index.js | 0 .../DbModels => db_models}/postLike/index.js | 0 .../regenerationToken/index.js | 0 .../DbModels => db_models}/release/index.js | 0 .../DbModels => db_models}/role/index.js | 0 .../DbModels => db_models}/savedPost/index.js | 0 .../serverLimit/index.js | 0 .../DbModels => db_models}/session/index.js | 0 .../streamingCategory/index.js | 0 .../streamingProfile/index.js | 0 .../DbModels => db_models}/syncEntry/index.js | 0 .../DbModels => db_models}/track/index.js | 0 .../track_like/index.js | 0 .../DbModels => db_models}/user/index.js | 0 packages/server/db_models/userConfig/index.js | 8 + .../userFollow/index.js | 0 .../DbModels => db_models}/widget/index.js | 0 packages/server/index.js | 57 +- .../middlewares/withAuthentication/index.js | 8 +- packages/server/package.json | 1 - .../services/auth/classes/account/index.js | 7 + .../classes/account/methods/changePassword.js | 39 + .../auth/classes/account/methods/create.js | 53 ++ .../classes/account/methods/loginStrategy.js | 28 + .../account/methods/passwordMeetPolicy.js | 11 + .../account/methods/usernameMeetPolicy.js | 26 + .../services/auth/routes/auth/delete.js | 2 +- .../services/auth/routes/auth/password/put.js | 23 + .../server/services/auth/routes/auth/post.js | 95 ++- .../services/auth/routes/availability/get.js | 2 +- .../auth/routes/forgot/[apr_code]/post.js | 45 ++ .../services/auth/routes/forgot/post.js | 49 ++ .../services/auth/routes/register/post.js | 71 +- packages/server/services/ems/ems.service.js | 19 + .../server/services/ems/ipcEvents/aprSend.js | 26 + .../server/services/ems/ipcEvents/mfaSend.js | 27 + .../server/services/ems/ipcEvents/newLogin.js | 24 + .../services/ems/ipcEvents/passwordChanged.js | 24 + packages/server/services/ems/package.json | 5 + .../services/ems/routes/dispatch/post.js | 1 + .../ems/routes/preview/email/[email]/get.js | 21 + .../services/ems/routes/test/deep/xd/get.js | 5 - .../server/services/ems/routes/test/get.js | 5 - .../server/services/ems/templates/index.js | 11 + .../ems/templates/mfa_code/index.handlebars | 673 ++++++++++++++++++ .../ems/templates/new_login/index.handlebars | 444 ++++++++++++ .../password_changed/index.handlebars | 36 + .../password_recovery/index.handlebars | 457 ++++++++++++ .../services/feed/FeedController/index.js | 140 ++++ .../services/getGlobalReleases.js | 25 + .../services/getPlaylistsFromFollowing.js | 42 ++ .../feed/FeedController/services/getPosts.js | 39 + .../services/getReleasesFromFollowing.js | 40 ++ packages/server/services/feed/feed.service.js | 25 + packages/server/services/feed/package.json | 6 + .../server/services/files/file.service.js | 192 +---- .../files/middlewares/withAuth/index.js | 25 - .../middlewares/withOptionalAuth/index.js | 23 - .../services/files/middlewares/withWsAuth.js | 55 -- packages/server/services/files/package.json | 2 +- .../services/files/routes/stream/[$]/get.js | 25 + .../files/routes/upload/chunk/post.js | 104 +++ .../files/useMiddlewares/useCors/index.js | 8 - .../files/useMiddlewares/useLogger/index.js | 19 - .../utils/createRoutesFromDirectory/index.js | 45 -- .../files/utils/getMiddlewares/index.js | 46 -- .../replaceImportsWithRemoteURL/index.js | 18 - .../endpoints/accounts_statistics.js | 2 +- .../endpoints/delete_featured_wallpaper.js | 2 +- .../endpoints/featured_wallpaper.js | 2 +- .../endpoints/resetPassword.js | 2 +- .../endpoints/update_user_data.js | 2 +- .../endpoints/dataValidation.js | 37 - .../AuthController/endpoints/otpSend.js | 7 - .../AuthController/endpoints/userLogin.js | 39 - .../AuthController/endpoints/userLogout.js | 33 - .../AuthController/endpoints/userRegister.js | 28 - .../main/controllers/AuthController/index.js | 9 - .../AuthController/methods/createUser.js | 56 -- .../BadgesController/endpoints/deleteBadge.js | 2 +- .../BadgesController/endpoints/getBadges.js | 2 +- .../endpoints/getUserBadges.js | 2 +- .../BadgesController/endpoints/giveToUser.js | 2 +- .../BadgesController/endpoints/putBadge.js | 2 +- .../endpoints/removeToUser.js | 2 +- .../services/deleteComment.js | 2 +- .../services/getComments.js | 2 +- .../CommentsController/services/newComment.js | 2 +- .../FeaturedEventsController/index.js | 2 +- .../services/createFeaturedEvent.js | 2 +- .../services/getGlobalReleases.js | 2 +- .../services/getPlaylistsFromFollowing.js | 2 +- .../FeedController/services/getPosts.js | 2 +- .../services/getReleasesFromFollowing.js | 2 +- .../endpoints/getFollowStatus.js | 2 +- .../endpoints/getUserFollowers.js | 2 +- .../endpoints/toggleFollow.js | 2 +- .../FollowController/services/followUser.js | 2 +- .../FollowController/services/unfollowUser.js | 2 +- .../endpoints/modifyPostLikes.js | 2 +- .../NFCController/endpoints/getTagById.js | 2 +- .../NFCController/endpoints/getTagBySerial.js | 2 +- .../NFCController/endpoints/getTags.js | 2 +- .../NFCController/endpoints/registerTag.js | 2 +- .../endpoints/getPostReplies.js | 2 +- .../PostsController/services/createPost.js | 2 +- .../PostsController/services/deletePost.js | 2 +- .../services/flagNsfwByAttachments.js | 2 +- .../PostsController/services/getPostData.js | 2 +- .../services/modifyPostData.js | 2 +- .../PostsController/services/toggleLike.js | 2 +- .../services/togglePostSave.js | 2 +- .../endpoints/featuredWallpapers.js | 2 +- .../endpoints/globalServerLimits.js | 2 +- .../main/controllers/RolesController/index.js | 2 +- .../SearchController/endpoints/getSearch.js | 2 +- .../endpoints/deleteCurrentSession.js | 2 +- .../endpoints/getSessions.js | 2 +- .../services/getConnectedUsersFollowing.js | 2 +- .../endpoints/deleteStreamingProfile.js | 2 +- .../endpoints/getProfileFromStreamKey.js | 2 +- .../endpoints/getProfilesVisibility.js | 2 +- .../endpoints/getStreamingCategories.js | 2 +- .../endpoints/getStreamingProfiles.js | 2 +- .../endpoints/handleStreamPublish.js | 2 +- .../endpoints/handleStreamUnpublish.js | 2 +- .../endpoints/postStreamingProfile.js | 2 +- .../endpoints/regenerateStreamingKey.js | 2 +- .../endpoints/checkEmailAvailable.js | 2 +- .../endpoints/checkUsernameAvailable.js | 2 +- .../UserController/endpoints/getUserData.js | 2 +- .../UserController/endpoints/getUsersData.js | 2 +- .../endpoints/resolveUserIdFromUsername.js | 2 +- .../endpoints/selfUpdateData.js | 2 +- .../endpoints/selfUpdatePassword.js | 2 +- .../UserController/services/createUser.js | 2 +- .../services/getConnectedUsersFollowing.js | 2 +- .../UserController/services/updateUserData.js | 2 +- .../services/updateUserPassword.js | 2 +- .../services/main/events/user_connected.js | 2 +- .../services/main/events/user_created.js | 2 +- .../services/main/events/user_disconnected.js | 2 +- .../main/fixments/additions_to_attachments.js | 2 +- .../main/fixments/migrate_posts_likes.js | 2 +- .../main/fixments/move_playlist_to_release.js | 2 +- .../services/main/lib/checkUserAdmin/index.js | 2 +- .../server/services/main/lib/token/index.js | 2 +- packages/server/services/main/main.service.js | 12 +- .../main/middlewares/permissions/index.js | 2 +- .../middlewares/withAuthentication/index.js | 2 +- packages/server/services/main/package.json | 3 +- .../main/services/fetchRemoteStreams/index.js | 2 +- .../main/services/getMutuals/index.js | 2 +- .../services/newStreamingProfile/index.js | 2 +- .../setup/authorizeSelfServerToken/index.js | 2 +- .../services/main/setup/dbAdmin/index.js | 2 +- .../main/utils/fullfillPostsData/index.js | 2 +- .../widgets/routes/get/:widgetId/debug.jsx | 2 +- .../widgets/routes/get/:widgetId/manifest.js | 2 +- .../controllers/widgets/routes/get/index.js | 2 +- .../widgets/routes/get/user/:user_id.js | 2 +- .../widgets/routes/post/publish.js | 2 +- .../marketplace/utils/getWidgetCode/index.js | 2 +- .../featured/routes/get/playlists.js | 2 +- .../lyrics/routes/get/:track_id.js | 2 +- .../playlists/routes/delete/:playlist_id.js | 2 +- .../playlists/routes/get/:playlist_id/data.js | 2 +- .../playlists/routes/get/search.js | 2 +- .../controllers/playlists/routes/get/self.js | 2 +- .../controllers/playlists/routes/post/new.js | 2 +- .../playlists/services/getTrackById.js | 2 +- .../releases/routes/delete/:release_id.js | 2 +- .../releases/routes/get/:release_id/data.js | 2 +- .../controllers/releases/routes/get/self.js | 2 +- .../releases/routes/get/user/:user_id.js | 2 +- .../releases/routes/put/release.js | 2 +- .../music/controllers/search/index.js | 2 +- .../tracks/routes/delete/:track_id/like.js | 2 +- .../tracks/routes/get/:track_id/data.js | 2 +- .../tracks/routes/get/:track_id/stream.js | 2 +- .../controllers/tracks/routes/get/liked.js | 2 +- .../controllers/tracks/routes/get/many.js | 2 +- .../tracks/routes/post/:track_id/like.js | 2 +- .../routes/post/:track_id/refresh-cache.js | 2 +- .../services/getEnhancedLyricsFromTrack.js | 2 +- .../services/music/services/removeTracks.js | 2 +- .../posts/classes/posts/methods/create.js | 2 +- .../posts/classes/posts/methods/data.js | 2 +- .../posts/classes/posts/methods/fullfill.js | 3 +- 205 files changed, 2817 insertions(+), 872 deletions(-) rename packages/server/{classes/DbModels => db_models}/NFCTags/index.js (100%) create mode 100644 packages/server/db_models/aprSession/index.js rename packages/server/{classes/DbModels => db_models}/authorizedServerTokens/index.js (100%) rename packages/server/{classes/DbModels => db_models}/badge/index.js (100%) rename packages/server/{classes/DbModels => db_models}/comment/index.js (100%) rename packages/server/{classes/DbModels => db_models}/config/index.js (100%) rename packages/server/{classes/DbModels => db_models}/featuredEvent/index.js (100%) rename packages/server/{classes/DbModels => db_models}/featuredPlaylist/index.js (100%) rename packages/server/{classes/DbModels => db_models}/featuredWallpaper/index.js (100%) rename packages/server/{classes/DbModels => db_models}/index.js (100%) create mode 100644 packages/server/db_models/mfaSessions/index.js create mode 100644 packages/server/db_models/operationLog/index.js rename packages/server/{classes/DbModels => db_models}/playlist/index.js (100%) rename packages/server/{classes/DbModels => db_models}/post/index.js (100%) rename packages/server/{classes/DbModels => db_models}/postLike/index.js (100%) rename packages/server/{classes/DbModels => db_models}/regenerationToken/index.js (100%) rename packages/server/{classes/DbModels => db_models}/release/index.js (100%) rename packages/server/{classes/DbModels => db_models}/role/index.js (100%) rename packages/server/{classes/DbModels => db_models}/savedPost/index.js (100%) rename packages/server/{classes/DbModels => db_models}/serverLimit/index.js (100%) rename packages/server/{classes/DbModels => db_models}/session/index.js (100%) rename packages/server/{classes/DbModels => db_models}/streamingCategory/index.js (100%) rename packages/server/{classes/DbModels => db_models}/streamingProfile/index.js (100%) rename packages/server/{classes/DbModels => db_models}/syncEntry/index.js (100%) rename packages/server/{classes/DbModels => db_models}/track/index.js (100%) rename packages/server/{classes/DbModels => db_models}/track_like/index.js (100%) rename packages/server/{classes/DbModels => db_models}/user/index.js (100%) create mode 100644 packages/server/db_models/userConfig/index.js rename packages/server/{classes/DbModels => db_models}/userFollow/index.js (100%) rename packages/server/{classes/DbModels => db_models}/widget/index.js (100%) create mode 100644 packages/server/services/auth/classes/account/index.js create mode 100644 packages/server/services/auth/classes/account/methods/changePassword.js create mode 100644 packages/server/services/auth/classes/account/methods/create.js create mode 100644 packages/server/services/auth/classes/account/methods/loginStrategy.js create mode 100644 packages/server/services/auth/classes/account/methods/passwordMeetPolicy.js create mode 100644 packages/server/services/auth/classes/account/methods/usernameMeetPolicy.js create mode 100644 packages/server/services/auth/routes/auth/password/put.js create mode 100644 packages/server/services/auth/routes/forgot/[apr_code]/post.js create mode 100644 packages/server/services/auth/routes/forgot/post.js create mode 100644 packages/server/services/ems/ipcEvents/aprSend.js create mode 100644 packages/server/services/ems/ipcEvents/mfaSend.js create mode 100644 packages/server/services/ems/ipcEvents/newLogin.js create mode 100644 packages/server/services/ems/ipcEvents/passwordChanged.js create mode 100644 packages/server/services/ems/routes/preview/email/[email]/get.js delete mode 100644 packages/server/services/ems/routes/test/deep/xd/get.js delete mode 100644 packages/server/services/ems/routes/test/get.js create mode 100644 packages/server/services/ems/templates/index.js create mode 100644 packages/server/services/ems/templates/mfa_code/index.handlebars create mode 100644 packages/server/services/ems/templates/new_login/index.handlebars create mode 100644 packages/server/services/ems/templates/password_changed/index.handlebars create mode 100644 packages/server/services/ems/templates/password_recovery/index.handlebars create mode 100755 packages/server/services/feed/FeedController/index.js create mode 100755 packages/server/services/feed/FeedController/services/getGlobalReleases.js create mode 100755 packages/server/services/feed/FeedController/services/getPlaylistsFromFollowing.js create mode 100755 packages/server/services/feed/FeedController/services/getPosts.js create mode 100755 packages/server/services/feed/FeedController/services/getReleasesFromFollowing.js create mode 100644 packages/server/services/feed/feed.service.js create mode 100644 packages/server/services/feed/package.json delete mode 100755 packages/server/services/files/middlewares/withAuth/index.js delete mode 100755 packages/server/services/files/middlewares/withOptionalAuth/index.js delete mode 100755 packages/server/services/files/middlewares/withWsAuth.js create mode 100644 packages/server/services/files/routes/stream/[$]/get.js create mode 100644 packages/server/services/files/routes/upload/chunk/post.js delete mode 100755 packages/server/services/files/useMiddlewares/useCors/index.js delete mode 100755 packages/server/services/files/useMiddlewares/useLogger/index.js delete mode 100755 packages/server/services/files/utils/createRoutesFromDirectory/index.js delete mode 100755 packages/server/services/files/utils/getMiddlewares/index.js delete mode 100755 packages/server/services/files/utils/replaceImportsWithRemoteURL/index.js delete mode 100755 packages/server/services/main/controllers/AuthController/endpoints/dataValidation.js delete mode 100644 packages/server/services/main/controllers/AuthController/endpoints/otpSend.js delete mode 100755 packages/server/services/main/controllers/AuthController/endpoints/userLogin.js delete mode 100755 packages/server/services/main/controllers/AuthController/endpoints/userLogout.js delete mode 100755 packages/server/services/main/controllers/AuthController/endpoints/userRegister.js delete mode 100755 packages/server/services/main/controllers/AuthController/index.js delete mode 100755 packages/server/services/main/controllers/AuthController/methods/createUser.js diff --git a/packages/server/boot b/packages/server/boot index 126e0eee..50330407 100755 --- a/packages/server/boot +++ b/packages/server/boot @@ -26,6 +26,7 @@ global["aliases"] = { "src": global["__src"], // expose shared resources + "@db_models": path.resolve(__dirname, "db_models"), "@shared-utils": path.resolve(__dirname, "utils"), "@shared-classes": path.resolve(__dirname, "classes"), "@shared-lib": path.resolve(__dirname, "lib"), @@ -103,7 +104,7 @@ function registerAliases() { async function injectEnvFromInfisical() { const envMode = global.FORCE_ENV ?? global.isProduction ? "prod" : "dev" - console.log(`🔑 Injecting env variables from INFISICAL in [${envMode}] mode...`) + console.log(`[BOOT] 🔑 Injecting env variables from INFISICAL in [${envMode}] mode...`) const client = new InfisicalClient({ accessToken: process.env.INFISICAL_TOKEN, @@ -130,7 +131,7 @@ async function Boot(main) { } if (process.env.INFISICAL_TOKEN) { - console.log(`INFISICAL_TOKEN found, injecting env variables from INFISICAL...`) + console.log(`[BOOT] INFISICAL_TOKEN found, injecting env variables from INFISICAL...`) await injectEnvFromInfisical() } @@ -138,7 +139,7 @@ async function Boot(main) { await instance.initialize() - if (process.send) { + if (process.env.lb_service && process.send) { process.send({ status: "ready" }) @@ -147,7 +148,7 @@ async function Boot(main) { return instance } -console.log(`Booting in [${global.isProduction ? "production" : "development"}] mode...`) +console.log(`[BOOT] Booting in [${global.isProduction ? "production" : "development"}] mode...`) // Apply patches registerPatches() diff --git a/packages/server/classes/AuthToken/index.js b/packages/server/classes/AuthToken/index.js index 505e560d..52baa40a 100644 --- a/packages/server/classes/AuthToken/index.js +++ b/packages/server/classes/AuthToken/index.js @@ -1,5 +1,5 @@ import jwt from "jsonwebtoken" -import { Session, RegenerationToken, User } from "../../classes/DbModels" +import { Session, RegenerationToken, User } from "../../db_models" export default class Token { static get strategy() { diff --git a/packages/server/classes/SecureSyncEntry/index.js b/packages/server/classes/SecureSyncEntry/index.js index d0ec7734..3bd86c48 100755 --- a/packages/server/classes/SecureSyncEntry/index.js +++ b/packages/server/classes/SecureSyncEntry/index.js @@ -1,4 +1,4 @@ -import { SyncEntry } from "@shared-classes/DbModels" +import { SyncEntry } from "../../db_models" import crypto from "crypto" diff --git a/packages/server/classes/DbModels/NFCTags/index.js b/packages/server/db_models/NFCTags/index.js similarity index 100% rename from packages/server/classes/DbModels/NFCTags/index.js rename to packages/server/db_models/NFCTags/index.js diff --git a/packages/server/db_models/aprSession/index.js b/packages/server/db_models/aprSession/index.js new file mode 100644 index 00000000..de7d8720 --- /dev/null +++ b/packages/server/db_models/aprSession/index.js @@ -0,0 +1,17 @@ +export default { + name: "APRSession", + collection: "apr_sessions", + schema: { + user_id: { type: String, required: true }, + + created_at: { type: Date, required: true }, + expires_at: { type: Date, required: true }, + + code: { type: String, required: true }, + + ip_address: { type: String, required: true }, + client: { type: String, required: true }, + + status: { type: String, required: true }, + } +} \ No newline at end of file diff --git a/packages/server/classes/DbModels/authorizedServerTokens/index.js b/packages/server/db_models/authorizedServerTokens/index.js similarity index 100% rename from packages/server/classes/DbModels/authorizedServerTokens/index.js rename to packages/server/db_models/authorizedServerTokens/index.js diff --git a/packages/server/classes/DbModels/badge/index.js b/packages/server/db_models/badge/index.js similarity index 100% rename from packages/server/classes/DbModels/badge/index.js rename to packages/server/db_models/badge/index.js diff --git a/packages/server/classes/DbModels/comment/index.js b/packages/server/db_models/comment/index.js similarity index 100% rename from packages/server/classes/DbModels/comment/index.js rename to packages/server/db_models/comment/index.js diff --git a/packages/server/classes/DbModels/config/index.js b/packages/server/db_models/config/index.js similarity index 100% rename from packages/server/classes/DbModels/config/index.js rename to packages/server/db_models/config/index.js diff --git a/packages/server/classes/DbModels/featuredEvent/index.js b/packages/server/db_models/featuredEvent/index.js similarity index 100% rename from packages/server/classes/DbModels/featuredEvent/index.js rename to packages/server/db_models/featuredEvent/index.js diff --git a/packages/server/classes/DbModels/featuredPlaylist/index.js b/packages/server/db_models/featuredPlaylist/index.js similarity index 100% rename from packages/server/classes/DbModels/featuredPlaylist/index.js rename to packages/server/db_models/featuredPlaylist/index.js diff --git a/packages/server/classes/DbModels/featuredWallpaper/index.js b/packages/server/db_models/featuredWallpaper/index.js similarity index 100% rename from packages/server/classes/DbModels/featuredWallpaper/index.js rename to packages/server/db_models/featuredWallpaper/index.js diff --git a/packages/server/classes/DbModels/index.js b/packages/server/db_models/index.js similarity index 100% rename from packages/server/classes/DbModels/index.js rename to packages/server/db_models/index.js diff --git a/packages/server/db_models/mfaSessions/index.js b/packages/server/db_models/mfaSessions/index.js new file mode 100644 index 00000000..0a9e4a39 --- /dev/null +++ b/packages/server/db_models/mfaSessions/index.js @@ -0,0 +1,13 @@ +export default { + name: "MFASession", + collection: "mfa_sessions", + schema: { + type: { type: String, required: true }, + user_id: { type: String, required: true }, + + code: { type: String, required: true }, + + created_at: { type: Date, required: true }, + expires_at: { type: Date, required: true }, + } +} \ No newline at end of file diff --git a/packages/server/db_models/operationLog/index.js b/packages/server/db_models/operationLog/index.js new file mode 100644 index 00000000..f8e09d85 --- /dev/null +++ b/packages/server/db_models/operationLog/index.js @@ -0,0 +1,13 @@ +export default { + name: "OperationLog", + collection: "operation_logs", + schema: { + type: { type: String, required: true }, + user_id: { type: String }, + comments: { type: Array, default: [] }, + + date: { type: Date, required: true }, + ip_address: { type: String }, + client: { type: String }, + } +} \ No newline at end of file diff --git a/packages/server/classes/DbModels/playlist/index.js b/packages/server/db_models/playlist/index.js similarity index 100% rename from packages/server/classes/DbModels/playlist/index.js rename to packages/server/db_models/playlist/index.js diff --git a/packages/server/classes/DbModels/post/index.js b/packages/server/db_models/post/index.js similarity index 100% rename from packages/server/classes/DbModels/post/index.js rename to packages/server/db_models/post/index.js diff --git a/packages/server/classes/DbModels/postLike/index.js b/packages/server/db_models/postLike/index.js similarity index 100% rename from packages/server/classes/DbModels/postLike/index.js rename to packages/server/db_models/postLike/index.js diff --git a/packages/server/classes/DbModels/regenerationToken/index.js b/packages/server/db_models/regenerationToken/index.js similarity index 100% rename from packages/server/classes/DbModels/regenerationToken/index.js rename to packages/server/db_models/regenerationToken/index.js diff --git a/packages/server/classes/DbModels/release/index.js b/packages/server/db_models/release/index.js similarity index 100% rename from packages/server/classes/DbModels/release/index.js rename to packages/server/db_models/release/index.js diff --git a/packages/server/classes/DbModels/role/index.js b/packages/server/db_models/role/index.js similarity index 100% rename from packages/server/classes/DbModels/role/index.js rename to packages/server/db_models/role/index.js diff --git a/packages/server/classes/DbModels/savedPost/index.js b/packages/server/db_models/savedPost/index.js similarity index 100% rename from packages/server/classes/DbModels/savedPost/index.js rename to packages/server/db_models/savedPost/index.js diff --git a/packages/server/classes/DbModels/serverLimit/index.js b/packages/server/db_models/serverLimit/index.js similarity index 100% rename from packages/server/classes/DbModels/serverLimit/index.js rename to packages/server/db_models/serverLimit/index.js diff --git a/packages/server/classes/DbModels/session/index.js b/packages/server/db_models/session/index.js similarity index 100% rename from packages/server/classes/DbModels/session/index.js rename to packages/server/db_models/session/index.js diff --git a/packages/server/classes/DbModels/streamingCategory/index.js b/packages/server/db_models/streamingCategory/index.js similarity index 100% rename from packages/server/classes/DbModels/streamingCategory/index.js rename to packages/server/db_models/streamingCategory/index.js diff --git a/packages/server/classes/DbModels/streamingProfile/index.js b/packages/server/db_models/streamingProfile/index.js similarity index 100% rename from packages/server/classes/DbModels/streamingProfile/index.js rename to packages/server/db_models/streamingProfile/index.js diff --git a/packages/server/classes/DbModels/syncEntry/index.js b/packages/server/db_models/syncEntry/index.js similarity index 100% rename from packages/server/classes/DbModels/syncEntry/index.js rename to packages/server/db_models/syncEntry/index.js diff --git a/packages/server/classes/DbModels/track/index.js b/packages/server/db_models/track/index.js similarity index 100% rename from packages/server/classes/DbModels/track/index.js rename to packages/server/db_models/track/index.js diff --git a/packages/server/classes/DbModels/track_like/index.js b/packages/server/db_models/track_like/index.js similarity index 100% rename from packages/server/classes/DbModels/track_like/index.js rename to packages/server/db_models/track_like/index.js diff --git a/packages/server/classes/DbModels/user/index.js b/packages/server/db_models/user/index.js similarity index 100% rename from packages/server/classes/DbModels/user/index.js rename to packages/server/db_models/user/index.js diff --git a/packages/server/db_models/userConfig/index.js b/packages/server/db_models/userConfig/index.js new file mode 100644 index 00000000..b0fe2e71 --- /dev/null +++ b/packages/server/db_models/userConfig/index.js @@ -0,0 +1,8 @@ +export default { + name: "UserConfig", + collection: "user_config", + schema: { + user_id: { type: String, required: true }, + values: { type: Object, default: {} }, + } +} \ No newline at end of file diff --git a/packages/server/classes/DbModels/userFollow/index.js b/packages/server/db_models/userFollow/index.js similarity index 100% rename from packages/server/classes/DbModels/userFollow/index.js rename to packages/server/db_models/userFollow/index.js diff --git a/packages/server/classes/DbModels/widget/index.js b/packages/server/db_models/widget/index.js similarity index 100% rename from packages/server/classes/DbModels/widget/index.js rename to packages/server/db_models/widget/index.js diff --git a/packages/server/index.js b/packages/server/index.js index d2d5d005..e224c655 100755 --- a/packages/server/index.js +++ b/packages/server/index.js @@ -11,6 +11,8 @@ import Spinnies from "spinnies" import chokidar from "chokidar" import { dots as DefaultSpinner } from "spinnies/spinners.json" + +import IPCRouter from "linebridge/src/server/classes/IPCRouter" import getInternalIp from "./lib/getInternalIp" import comtyAscii from "./ascii" import pkg from "./package.json" @@ -50,11 +52,12 @@ let services = null const spinnies = new Spinnies() -const instancePool = [] +const ipcRouter = global.ipcRouter = new IPCRouter() +const instancePool = global.instancePool = [] const serviceFileReference = {} -const serviceWatcher = Observable.from({}) +const serviceRegistry = global.serviceRegistry = Observable.from({}) -Observable.observe(serviceWatcher, (changes) => { +Observable.observe(serviceRegistry, (changes) => { const { type, path, value } = changes[0] switch (type) { @@ -62,7 +65,7 @@ Observable.observe(serviceWatcher, (changes) => { //console.log(`Updated service | ${path} > ${value}`) //check if all services all ready - if (Object.values(serviceWatcher).every((service) => service.ready)) { + if (Object.values(serviceRegistry).every((service) => service.ready)) { handleAllReady() } @@ -97,9 +100,9 @@ const relp_commands = [ aliases: ["s", "sel"], fn: (cb, service) => { if (!isNaN(parseInt(service))) { - service = serviceWatcher[Object.keys(serviceWatcher)[service]] + service = serviceRegistry[Object.keys(serviceRegistry)[service]] } else { - service = serviceWatcher[service] + service = serviceRegistry[service] } if (!service) { @@ -166,7 +169,7 @@ async function handleAllReady() { // SERVICE WATCHER FUNCTIONS async function handleNewServiceStarting(id) { - if (serviceWatcher[id].ready === false) { + if (serviceRegistry[id].ready === false) { spinnies.add(id, { text: `📦 [${id}] Loading service...`, spinner: DefaultSpinner @@ -175,25 +178,25 @@ async function handleNewServiceStarting(id) { } async function handleServiceStarted(id) { - if (serviceWatcher[id].ready === false) { + if (serviceRegistry[id].ready === false) { if (spinnies.pick(id)) { - spinnies.succeed(id, { text: `[${id}][${serviceWatcher[id].index}] Ready` }) + spinnies.succeed(id, { text: `[${id}][${serviceRegistry[id].index}] Ready` }) } } - serviceWatcher[id].ready = true + serviceRegistry[id].ready = true } async function handleServiceExit(id, code, err) { //console.log(`🛑 Service ${id} exited with code ${code}`, err) - if (serviceWatcher[id].ready === false) { + if (serviceRegistry[id].ready === false) { if (spinnies.pick(id)) { - spinnies.fail(id, { text: `[${id}][${serviceWatcher[id].index}] Failed with code ${code}` }) + spinnies.fail(id, { text: `[${id}][${serviceRegistry[id].index}] Failed with code ${code}` }) } } - serviceWatcher[id].ready = false + serviceRegistry[id].ready = false } // PROCESS HANDLERS @@ -225,16 +228,24 @@ async function handleIPCData(id, data) { function spawnService({ id, service, cwd }) { handleNewServiceStarting(id) + const instanceEnv = { + ...process.env, + lb_service: { + id: service.id, + index: service.index, + }, + } + let instance = ChildProcess.fork(bootloaderBin, [service], { detached: false, silent: true, cwd: cwd, - env: { - ...process.env - } + env: instanceEnv, }) instance.reload = () => { + ipcRouter.unregister({ id, instance }) + instance.kill() instance = spawnService({ id, service, cwd }) @@ -278,6 +289,8 @@ function spawnService({ id, service, cwd }) { return handleServiceExit(id, code, err) }) + ipcRouter.register({ id, instance }) + return instance } @@ -314,7 +327,7 @@ async function main() { serviceFileReference[instanceFile] = id - serviceWatcher[id] = { + serviceRegistry[id] = { index: services.indexOf(service), id: id, version: version, @@ -328,16 +341,18 @@ async function main() { // create a new process of node for each service for await (let service of services) { - const { id, version, cwd } = serviceWatcher[serviceFileReference[path.basename(service)]] + const { id, version, cwd } = serviceRegistry[serviceFileReference[path.basename(service)]] const instance = spawnService({ id, service, cwd }) - // push to pool - instancePool.push({ + const serviceInstance = { id, version, instance - }) + } + + // push to pool + instancePool.push(serviceInstance) // if is NODE_ENV to development, start a file watcher for hot-reload if (process.env.NODE_ENV === "development") { diff --git a/packages/server/middlewares/withAuthentication/index.js b/packages/server/middlewares/withAuthentication/index.js index b8997202..80e1fb30 100755 --- a/packages/server/middlewares/withAuthentication/index.js +++ b/packages/server/middlewares/withAuthentication/index.js @@ -1,8 +1,8 @@ -import { authorizedServerTokens } from "../../classes/DbModels" +import { authorizedServerTokens } from "../../db_models" import SecureEntry from "../../classes/SecureEntry" import AuthToken from "../../classes/AuthToken" -export default async (req, res, next) => { +export default async (req, res) => { function reject(description) { return res.status(401).json({ error: `${description ?? "Invalid session"}` }) } @@ -35,7 +35,7 @@ export default async (req, res, next) => { user: validation.user } - return next() + return } case "Server": { const [client_id, token] = tokenAuthHeader[1].split(":") @@ -65,7 +65,7 @@ export default async (req, res, next) => { roles: ["server"], } - return next() + return } default: { return reject("Invalid token type") diff --git a/packages/server/package.json b/packages/server/package.json index d681e165..5cffaebf 100755 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -22,7 +22,6 @@ "clui": "^0.3.6", "dotenv": "^16.4.4", "http-proxy-middleware": "^2.0.6", - "hyper-express": "^6.14.12", "jsonwebtoken": "^9.0.2", "linebridge": "^0.16.0", "module-alias": "^2.2.3", diff --git a/packages/server/services/auth/classes/account/index.js b/packages/server/services/auth/classes/account/index.js new file mode 100644 index 00000000..be8c1a17 --- /dev/null +++ b/packages/server/services/auth/classes/account/index.js @@ -0,0 +1,7 @@ +export default class Account { + static usernameMeetPolicy = require("./methods/usernameMeetPolicy").default + static passwordMeetPolicy = require("./methods/passwordMeetPolicy").default + static loginStrategy = require("./methods/loginStrategy").default + static changePassword = require("./methods/changePassword").default + static create = require("./methods/create").default +} \ No newline at end of file diff --git a/packages/server/services/auth/classes/account/methods/changePassword.js b/packages/server/services/auth/classes/account/methods/changePassword.js new file mode 100644 index 00000000..482ee6a2 --- /dev/null +++ b/packages/server/services/auth/classes/account/methods/changePassword.js @@ -0,0 +1,39 @@ +import bcrypt from "bcrypt" +import { User, OperationLog } from "@db_models" +import Account from "@classes/account" + +export default async ({ user_id, old_hash, old_password, new_password, log_comment }, req) => { + let user = await User.findById(user_id).select("+password") + + user = await Account.loginStrategy({ password: old_password, hash: old_hash }, user) + + await Account.passwordMeetPolicy(new_password) + + user.password = bcrypt.hashSync(new_password, parseInt(process.env.BCRYPT_ROUNDS ?? 3)) + + await user.save() + + const operation = { + type: "password:changed", + user_id: user._id.toString(), + date: Date.now(), + comments: [] + } + + if (log_comment) { + operation.comments.push(log_comment) + } + + if (typeof req === "object") { + operation.ip_address = req.headers["x-forwarded-for"]?.split(",")[0] ?? req.socket?.remoteAddress ?? req.ip + operation.client = req.headers["user-agent"] + } + + const log = new OperationLog(operation) + + await log.save() + + ipc.invoke("ems", "password:changed", operation) + + return user +} \ No newline at end of file diff --git a/packages/server/services/auth/classes/account/methods/create.js b/packages/server/services/auth/classes/account/methods/create.js new file mode 100644 index 00000000..c9d6f0f0 --- /dev/null +++ b/packages/server/services/auth/classes/account/methods/create.js @@ -0,0 +1,53 @@ +import bcrypt from "bcrypt" +import { User } from "@db_models" +import requiredFields from "@shared-utils/requiredFields" +import Account from "@classes/account" + +export default async (payload) => { + requiredFields(["username", "password", "email"], payload) + + let { username, password, email, fullName, roles, avatar, acceptTos } = payload + + if (ToBoolean(acceptTos) !== true) { + throw new OperationError(400, "You must accept the terms of service in order to create an account.") + } + + await Account.usernameMeetPolicy(username) + + // check if username is already taken + const existentUser = await User.findOne({ username: username }) + + if (existentUser) { + throw new OperationError(400, "User already exists") + } + + // check if the email is already in use + const existentEmail = await User.findOne({ email: email }) + + if (existentEmail) { + throw new OperationError(400, "Email already in use") + } + + await Account.passwordMeetPolicy(password) + + // hash the password + const hash = bcrypt.hashSync(password, parseInt(process.env.BCRYPT_ROUNDS ?? 3)) + + let user = new User({ + username: username, + password: hash, + email: email, + fullName: fullName, + avatar: avatar ?? `https://api.dicebear.com/7.x/thumbs/svg?seed=${username}`, + roles: roles, + createdAt: new Date().getTime(), + acceptTos: acceptTos, + }) + + await user.save() + + // TODO: dispatch event bus + //global.eventBus.emit("user.create", user) + + return user +} \ No newline at end of file diff --git a/packages/server/services/auth/classes/account/methods/loginStrategy.js b/packages/server/services/auth/classes/account/methods/loginStrategy.js new file mode 100644 index 00000000..6dc87e06 --- /dev/null +++ b/packages/server/services/auth/classes/account/methods/loginStrategy.js @@ -0,0 +1,28 @@ +import bcrypt from "bcrypt" +import { User } from "@db_models" + +export default async ({ username, password, hash }, user) => { + if (typeof user === "undefined") { + let isEmail = username.match(/^[^\s@]+@[^\s@]+\.[^\s@]+$/) + + let query = isEmail ? { email: username } : { username: username } + + user = await User.findOne(query).select("+password") + } + + if (!user) { + throw new OperationError(401, "User not found") + } + + if (typeof hash !== "undefined") { + if (user.password !== hash) { + throw new OperationError(401, "Invalid credentials") + } + } else { + if (!bcrypt.compareSync(password, user.password)) { + throw new OperationError(401, "Invalid credentials") + } + } + + return user +} \ No newline at end of file diff --git a/packages/server/services/auth/classes/account/methods/passwordMeetPolicy.js b/packages/server/services/auth/classes/account/methods/passwordMeetPolicy.js new file mode 100644 index 00000000..71393465 --- /dev/null +++ b/packages/server/services/auth/classes/account/methods/passwordMeetPolicy.js @@ -0,0 +1,11 @@ +export default async (password) => { + if (password.length < 8) { + throw new OperationError(400, "Password must be at least 8 characters") + } + + if (password.length > 64) { + throw new OperationError(400, "Password cannot be longer than 64 characters") + } + + return true +} \ No newline at end of file diff --git a/packages/server/services/auth/classes/account/methods/usernameMeetPolicy.js b/packages/server/services/auth/classes/account/methods/usernameMeetPolicy.js new file mode 100644 index 00000000..708aaf3a --- /dev/null +++ b/packages/server/services/auth/classes/account/methods/usernameMeetPolicy.js @@ -0,0 +1,26 @@ +export default async (username) => { + if (username.length < 3) { + throw new OperationError(400, "Username must be at least 3 characters") + } + + if (username.length > 64) { + throw new OperationError(400, "Username cannot be longer than 64 characters") + } + + // if username has capital letters, throw error + if (username !== username.toLowerCase()) { + throw new OperationError(400, "Username must be lowercase") + } + + // make sure the username has no spaces + if (username.includes(" ")) { + throw new OperationError(400, "Username cannot contain spaces") + } + + // make sure the username has no valid characters. Only letters, numbers, and underscores + if (!/^[a-z0-9_]+$/.test(username)) { + throw new OperationError(400, "Username can only contain letters, numbers, and underscores") + } + + return true +} diff --git a/packages/server/services/auth/routes/auth/delete.js b/packages/server/services/auth/routes/auth/delete.js index a9da4127..fc40c5c6 100644 --- a/packages/server/services/auth/routes/auth/delete.js +++ b/packages/server/services/auth/routes/auth/delete.js @@ -1,4 +1,4 @@ -import { Session } from "@shared-classes/DbModels" +import { Session } from "@db_models" export default { middlewares: ["withAuthentication"], diff --git a/packages/server/services/auth/routes/auth/password/put.js b/packages/server/services/auth/routes/auth/password/put.js new file mode 100644 index 00000000..8dba178e --- /dev/null +++ b/packages/server/services/auth/routes/auth/password/put.js @@ -0,0 +1,23 @@ +import Account from "@classes/account" +import requiredFields from "@shared-utils/requiredFields" + +export default { + middlewares: ["withAuthentication"], + fn: async (req) => { + requiredFields(["old_password", "new_password"], req.body) + + await Account.changePassword( + { + user_id: req.auth.session.user_id, + old_password: req.body.old_password, + new_password: req.body.new_password, + log_comment: "Changed from password change request" + }, + req + ) + + return { + message: "Password changed" + } + } +} \ No newline at end of file diff --git a/packages/server/services/auth/routes/auth/post.js b/packages/server/services/auth/routes/auth/post.js index 0d5232c3..8eb9b558 100644 --- a/packages/server/services/auth/routes/auth/post.js +++ b/packages/server/services/auth/routes/auth/post.js @@ -1,36 +1,97 @@ import AuthToken from "@shared-classes/AuthToken" -import { User } from "@shared-classes/DbModels" +import { UserConfig, MFASession } from "@db_models" import requiredFields from "@shared-utils/requiredFields" -import bcrypt from "bcrypt" + +import Account from "@classes/account" export default async (req, res) => { requiredFields(["username", "password"], req.body) - const { username, password } = req.body + const user = await Account.loginStrategy({ + username: req.body.username, + password: req.body.password, + }) - let isEmail = username.match(/^[^\s@]+@[^\s@]+\.[^\s@]+$/) + const userConfig = await UserConfig.findOne({ user_id: user._id.toString() }).catch(() => { + return {} + }) - let query = isEmail ? { email: username } : { username: username } + if (userConfig && userConfig.values) { + if (userConfig.values.mfa_enabled) { + let codeVerified = false - const user = await User.findOne(query).select("+password") + // search if is already a mfa session + let mfaSession = await MFASession.findOne({ user_id: user._id }) - if (!user) { - throw new OperationError(401, "User not found") + if (mfaSession) { + if (!req.body.mfa_code) { + await mfaSession.delete() + } else { + if (mfaSession.expires_at < new Date().getTime()) { + await mfaSession.delete() + + throw new OperationError(401, "MFA code expired, login again...") + } + + if (mfaSession.code == req.body.mfa_code) { + codeVerified = true + await mfaSession.delete() + } else { + throw new OperationError(401, "Invalid MFA code, try again...") + } + } + } + + if (!codeVerified) { + const mfa = { + type: "email", + user_id: user._id, + + code: Math.floor(Math.random() * 9000) + 1000, + + created_at: new Date().getTime(), + // expires in 1 hour + expires_at: new Date().getTime() + 60 * 60 * 1000, + + ip_address: req.headers["x-forwarded-for"]?.split(",")[0] ?? req.socket?.remoteAddress ?? req.ip, + client: req.headers["user-agent"], + } + + // create a new mfa session + mfaSession = new MFASession(mfa) + + await mfaSession.save() + + ipc.invoke("ems", "mfa:send", mfa) + + return { + message: `MFA required, using [${mfa.type}] method.`, + mfa_required: true, + } + } + } } - if (!bcrypt.compareSync(password, user.password)) { - return res.status(401).json({ - message: "Invalid credentials", - }) - } - - const token = await AuthToken.createAuth({ + const authData = { + date: new Date().getTime(), username: user.username, user_id: user._id.toString(), ip_address: req.headers["x-forwarded-for"]?.split(",")[0] ?? req.socket?.remoteAddress ?? req.ip, client: req.headers["user-agent"], - //signLocation: global.signLocation, - }) + } + + const token = await AuthToken.createAuth(authData) + + // emit to ems to notify user for the new login, in the background + try { + global.ipc.call("ems", "new:login", authData).catch((error) => { + // whoipsi dupsi + console.error(error) + }) + } catch (error) { + // whoipsi dupsi + console.error(error) + } return { token: token } } \ No newline at end of file diff --git a/packages/server/services/auth/routes/availability/get.js b/packages/server/services/auth/routes/availability/get.js index f9453a52..89f58b0f 100644 --- a/packages/server/services/auth/routes/availability/get.js +++ b/packages/server/services/auth/routes/availability/get.js @@ -1,4 +1,4 @@ -import { User } from "@shared-classes/DbModels" +import { User } from "@db_models" export default async (req) => { const { username, email } = req.query diff --git a/packages/server/services/auth/routes/forgot/[apr_code]/post.js b/packages/server/services/auth/routes/forgot/[apr_code]/post.js new file mode 100644 index 00000000..bda8a25b --- /dev/null +++ b/packages/server/services/auth/routes/forgot/[apr_code]/post.js @@ -0,0 +1,45 @@ +import { User, APRSession } from "@db_models" +import requiredFields from "@shared-utils/requiredFields" + +import Account from "@classes/account" + +export default async (req) => { + requiredFields(["new_password"], req.body) + + const { apr_code } = req.params + + const apr = await APRSession.findOne({ code: apr_code }) + + if (!apr) { + throw new OperationError(400, "Request not found") + } + + if (apr.expires_at < new Date().getTime()) { + throw new OperationError(400, "Request expired") + } + + if (apr.status !== "sended") { + throw new OperationError(400, "Request already completed") + } + + const user = await User.findById(apr.user_id).select("+password") + + await Account.changePassword( + { + user_id: apr.user_id, + old_hash: user.password, + new_password: req.body.new_password, + log_comment: "Changed from APR request" + }, + req, + ) + + apr.status = "completed" + apr.completed_at = Date.now() + + await apr.save() + + return { + message: "Password changed", + } +} \ No newline at end of file diff --git a/packages/server/services/auth/routes/forgot/post.js b/packages/server/services/auth/routes/forgot/post.js new file mode 100644 index 00000000..654fe71a --- /dev/null +++ b/packages/server/services/auth/routes/forgot/post.js @@ -0,0 +1,49 @@ +import { User, APRSession } from "@db_models" +import requiredFields from "@shared-utils/requiredFields" + +export default async (req) => { + requiredFields(["email"], req.body) + + const { email } = req.body + + const user = await User.findOne({ email }) + + if (!user) { + throw new OperationError(400, "User not found") + } + + const apr = new APRSession({ + user_id: user._id.toString(), + + created_at: new Date().getTime(), + expires_at: new Date().getTime() + 60 * 60 * 1000, + + code: nanoid(), + + ip_address: req.headers["x-forwarded-for"]?.split(",")[0] ?? req.socket?.remoteAddress ?? req.ip, + client: req.headers["user-agent"], + + status: "sended", + }) + + await apr.save() + + await ipc.call("ems", "apr:send", { + user_id: user._id.toString(), + username: user.username, + email: user.email, + code: apr.code, + apr_link: `https://comty.app/forgot/apr/${apr.code}`, + + created_at: apr.created_at, + expires_at: apr.expires_at, + + client: apr.client, + ip_address: apr.ip_address, + }) + + return { + message: `Email sent to ${email}`, + sent: true, + } +} \ No newline at end of file diff --git a/packages/server/services/auth/routes/register/post.js b/packages/server/services/auth/routes/register/post.js index b136c859..36cad636 100644 --- a/packages/server/services/auth/routes/register/post.js +++ b/packages/server/services/auth/routes/register/post.js @@ -1,72 +1,7 @@ -import { User } from "@shared-classes/DbModels" -import bcrypt from "bcrypt" - -import requiredFields from "@shared-utils/requiredFields" +import Account from "@classes/account" export default async (req) => { - requiredFields(["username", "password", "email"], req.body) + const result = await Account.create(req.body) - let { username, password, email, fullName, roles, avatar, acceptTos } = req.body - - if (ToBoolean(acceptTos) !== true) { - throw new OperationError(400, "You must accept the terms of service in order to create an account.") - } - - if (username.length < 3) { - throw new OperationError(400, "Username must be at least 3 characters") - } - - if (username.length > 64) { - throw new OperationError(400, "Username cannot be longer than 64 characters") - } - - // if username has capital letters, throw error - if (username !== username.toLowerCase()) { - throw new OperationError(400, "Username must be lowercase") - } - - // make sure the username has no spaces - if (username.includes(" ")) { - throw new OperationError(400, "Username cannot contain spaces") - } - - // make sure the username has no valid characters. Only letters, numbers, and underscores - if (!/^[a-z0-9_]+$/.test(username)) { - throw new OperationError(400, "Username can only contain letters, numbers, and underscores") - } - - // check if username is already taken - const existentUser = await User.findOne({ username: username }) - - if (existentUser) { - throw new OperationError(400, "User already exists") - } - - // check if the email is already in use - const existentEmail = await User.findOne({ email: email }) - - if (existentEmail) { - throw new OperationError(400, "Email already in use") - } - - // hash the password - const hash = bcrypt.hashSync(password, parseInt(process.env.BCRYPT_ROUNDS ?? 3)) - - let user = new User({ - username: username, - password: hash, - email: email, - fullName: fullName, - avatar: avatar ?? `https://api.dicebear.com/7.x/thumbs/svg?seed=${username}`, - roles: roles, - createdAt: new Date().getTime(), - acceptTos: acceptTos, - }) - - await user.save() - - // TODO: dispatch event bus - //global.eventBus.emit("user.create", user) - - return user + return result } \ No newline at end of file diff --git a/packages/server/services/ems/ems.service.js b/packages/server/services/ems/ems.service.js index 2a0c49a4..4516ad92 100644 --- a/packages/server/services/ems/ems.service.js +++ b/packages/server/services/ems/ems.service.js @@ -1,5 +1,8 @@ import { Server } from "linebridge/src/server" import nodemailer from "nodemailer" +import DbManager from "@shared-classes/DbManager" + +import SharedMiddlewares from "@shared-middlewares" export default class API extends Server { static refName = "ems" @@ -7,7 +10,12 @@ export default class API extends Server { static routesPath = `${__dirname}/routes` static listen_port = process.env.HTTP_LISTEN_PORT ?? 3007 + middlewares = { + ...SharedMiddlewares + } + contexts = { + db: new DbManager(), mailTransporter: nodemailer.createTransport({ host: process.env.SMTP_HOSTNAME, port: process.env.SMTP_PORT ?? 587, @@ -18,6 +26,17 @@ export default class API extends Server { }, }), } + + ipcEvents = { + "new:login": require("./ipcEvents/newLogin").default, + "mfa:send": require("./ipcEvents/mfaSend").default, + "apr:send": require("./ipcEvents/aprSend").default, + "password:changed": require("./ipcEvents/passwordChanged").default, + } + + async onInitialize() { + await this.contexts.db.initialize() + } } Boot(API) \ No newline at end of file diff --git a/packages/server/services/ems/ipcEvents/aprSend.js b/packages/server/services/ems/ipcEvents/aprSend.js new file mode 100644 index 00000000..f8adb269 --- /dev/null +++ b/packages/server/services/ems/ipcEvents/aprSend.js @@ -0,0 +1,26 @@ +import templates from "../templates" + +export default async (ctx, data) => { + const { user_id, username, email, apr_link, created_at, expires_at, ip_address, client } = data + + if (!user_id || !username || !email || !apr_link || !created_at || !expires_at || !ip_address || !client) { + throw new OperationError(400, "Bad request") + } + + const result = await ctx.mailTransporter.sendMail({ + from: process.env.SMTP_USERNAME, + to: email, + subject: "Password reset", + html: templates.password_recovery({ + username: username, + + apr_link: apr_link, + + date: new Date(created_at), + ip: ip_address, + client: client, + }), + }) + + return result +} diff --git a/packages/server/services/ems/ipcEvents/mfaSend.js b/packages/server/services/ems/ipcEvents/mfaSend.js new file mode 100644 index 00000000..86b1cc88 --- /dev/null +++ b/packages/server/services/ems/ipcEvents/mfaSend.js @@ -0,0 +1,27 @@ +// TODO: Support SMS 2fa +import { User } from "@db_models" +import templates from "../templates" + +export default async (ctx, data) => { + const user = await User.findById(data.user_id) + + if (!user) { + throw new OperationError(404, "User not found") + } + + const result = await ctx.mailTransporter.sendMail({ + from: process.env.SMTP_USERNAME, + to: user.email, + subject: "Verification code", + html: templates.mfa_code({ + mfa_code: data.code, + username: user.username, + date: new Date(data.created_at), + expires_at: new Date(data.expires_at), + ip: data.ip_address, + client: data.client, + }), + }) + + return result +} diff --git a/packages/server/services/ems/ipcEvents/newLogin.js b/packages/server/services/ems/ipcEvents/newLogin.js new file mode 100644 index 00000000..6fe05d9f --- /dev/null +++ b/packages/server/services/ems/ipcEvents/newLogin.js @@ -0,0 +1,24 @@ +import { User } from "@db_models" +import templates from "../templates" + +export default async (ctx, data) => { + const user = await User.findById(data.user_id) + + if (!user) { + throw new OperationError(404, "User not found") + } + + const result = await ctx.mailTransporter.sendMail({ + from: process.env.SMTP_USERNAME, + to: user.email, + subject: "New login", + html: templates.new_login({ + date: new Date(data.date), + ip: data.ip_address, + client: data.client, + username: user.username + }), + }) + + return result +} diff --git a/packages/server/services/ems/ipcEvents/passwordChanged.js b/packages/server/services/ems/ipcEvents/passwordChanged.js new file mode 100644 index 00000000..2bf1b8d5 --- /dev/null +++ b/packages/server/services/ems/ipcEvents/passwordChanged.js @@ -0,0 +1,24 @@ +import { User } from "@db_models" +import templates from "../templates" + +export default async (ctx, data) => { + const user = await User.findById(data.user_id) + + if (!user) { + throw new OperationError(404, "User not found") + } + + const result = await ctx.mailTransporter.sendMail({ + from: process.env.SMTP_USERNAME, + to: user.email, + subject: "Your password has been changed", + html: templates.password_changed({ + username: user.username, + date: new Date(data.date), + ip: data.ip_address, + client: data.client, + }), + }) + + return result +} diff --git a/packages/server/services/ems/package.json b/packages/server/services/ems/package.json index 7835ffcb..c1beaa73 100644 --- a/packages/server/services/ems/package.json +++ b/packages/server/services/ems/package.json @@ -4,7 +4,12 @@ "version": "0.1.0", "main": "index.js", "license": "MIT", + "proxy": { + "path": "/ems", + "port": 3007 + }, "dependencies": { + "handlebars": "^4.7.8", "nodemailer": "^6.9.11", "web-push": "^3.6.7" } diff --git a/packages/server/services/ems/routes/dispatch/post.js b/packages/server/services/ems/routes/dispatch/post.js index 92fa9023..c5f01470 100644 --- a/packages/server/services/ems/routes/dispatch/post.js +++ b/packages/server/services/ems/routes/dispatch/post.js @@ -1,5 +1,6 @@ export default { useContext: ["mailTransporter"], + middlewares: ["withAuthentication"], fn: async (req, res) => { req.body = await req.urlencoded() diff --git a/packages/server/services/ems/routes/preview/email/[email]/get.js b/packages/server/services/ems/routes/preview/email/[email]/get.js new file mode 100644 index 00000000..d5362690 --- /dev/null +++ b/packages/server/services/ems/routes/preview/email/[email]/get.js @@ -0,0 +1,21 @@ +import templates from "../../../../templates" + +const testData = { + email: "test@example", + ip: "127.0.0.1", + client: "Firefox", + username: "test", + date: new Date(), + apr_link: "https://comty.app", + mfa_code: "000-000-000", +} + +export default (req, res) => { + const { email } = req.params + + if (!templates[email]) { + throw new OperationError(404, "Template not found") + } + + return res.html(templates[email](testData)) +} \ No newline at end of file diff --git a/packages/server/services/ems/routes/test/deep/xd/get.js b/packages/server/services/ems/routes/test/deep/xd/get.js deleted file mode 100644 index 420692ef..00000000 --- a/packages/server/services/ems/routes/test/deep/xd/get.js +++ /dev/null @@ -1,5 +0,0 @@ -export default (req, res) => { - return res.json({ - message: "Hi! from the deeps." - }) -} \ No newline at end of file diff --git a/packages/server/services/ems/routes/test/get.js b/packages/server/services/ems/routes/test/get.js deleted file mode 100644 index 3c5e2c2a..00000000 --- a/packages/server/services/ems/routes/test/get.js +++ /dev/null @@ -1,5 +0,0 @@ -export default async (req, res) => { - return res.json({ - msg: "HI!!" - }) -} \ No newline at end of file diff --git a/packages/server/services/ems/templates/index.js b/packages/server/services/ems/templates/index.js new file mode 100644 index 00000000..5d5404ec --- /dev/null +++ b/packages/server/services/ems/templates/index.js @@ -0,0 +1,11 @@ +import fs from "node:fs" +import path from "node:path" + +import Handlebars from "handlebars" + +export default { + new_login: Handlebars.compile(fs.readFileSync(path.resolve(__dirname, "new_login/index.handlebars"), "utf-8")), + mfa_code: Handlebars.compile(fs.readFileSync(path.resolve(__dirname, "mfa_code/index.handlebars"), "utf-8")), + password_recovery: Handlebars.compile(fs.readFileSync(path.resolve(__dirname, "password_recovery/index.handlebars"), "utf-8")), + password_changed: Handlebars.compile(fs.readFileSync(path.resolve(__dirname, "password_changed/index.handlebars"), "utf-8")), +} \ No newline at end of file diff --git a/packages/server/services/ems/templates/mfa_code/index.handlebars b/packages/server/services/ems/templates/mfa_code/index.handlebars new file mode 100644 index 00000000..0914eeff --- /dev/null +++ b/packages/server/services/ems/templates/mfa_code/index.handlebars @@ -0,0 +1,673 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ +
+ + + + + + +
+ + + + + + +
+
+
+
+ +
+
+ +
+ + + + + + +
+ +
+ + + + + + +
+
+

+ Hi + @{{username}}

+
+
+
+ +
+
+ +
+ + + + + + +
+ +
+ + + + + + +
+
+

+ Here + is the verification code you need to log in.

+
+
+
+ +
+
+ +
+ + + + + + +
+ +
+ + + + + + +
+

+

+ +
+
+ +
+
+ +
+ + + + + + +
+ +
+ + + + + + +
+
+

+ {{mfa_code}} +

+
+
+
+ +
+
+ +
+ + + + + + +
+ +
+ + + + + + +
+

+

+ +
+
+ +
+
+ +
+ + + + + + +
+ +
+ + + + + + +
+
+

+ Wasn't + it you? So it looks like someone new is trying to log into + your account.

+

+   +

+

+ ¡In + this case, we recommend change your password as soon as + possible!

+

+   +

+

+ Here's + more information about this login attempt.

+
+
+
+ +
+
+ +
+ + + + + + +
+ +
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+

+ Date +

+
+
​ + + + + + +
+

+ {{date}} +

+
+
+ + + + +
+

+ Client +

+
+
​ + + + + + +
+

+ {{client}} +

+
+
+ + + + +
+

+ IP +

+
+
​ + + + + + +
+

+ {{ip}} +

+
+
+
+
+ +
+
+ +
+ + + + + + +
+ +
+ + + + + + +
+

+

+ +
+
+ +
+
+ +
+ + + \ No newline at end of file diff --git a/packages/server/services/ems/templates/new_login/index.handlebars b/packages/server/services/ems/templates/new_login/index.handlebars new file mode 100644 index 00000000..86e3e7cf --- /dev/null +++ b/packages/server/services/ems/templates/new_login/index.handlebars @@ -0,0 +1,444 @@ + + + + + Comty + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ +
+ + + + + + +
+ + + + + + +
+
+
+
+ +
+
+ +
+ + + + + + +
+ +
+ + + + + + +
+
+

+ Hi + @{{username}} +

+
+
+
+ +
+
+ +
+ + + + + + +
+ +
+ + + + + + +
+
+

+ A + new device has been logged into your account. +

+
+
+
+ +
+
+ +
+ + + + + + +
+ +
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+

+ Date +

+
+
​ + + + + + +
+

+ {{date}} +

+
+
+ + + + +
+

+ Client +

+
+
​ + + + + + +
+

+ {{client}} +

+
+
+ + + + +
+

+ IP +

+
+
​ + + + + + +
+

+ {{ip}} +

+
+
+
+
+ +
+
+ +
+ + + \ No newline at end of file diff --git a/packages/server/services/ems/templates/password_changed/index.handlebars b/packages/server/services/ems/templates/password_changed/index.handlebars new file mode 100644 index 00000000..932f31eb --- /dev/null +++ b/packages/server/services/ems/templates/password_changed/index.handlebars @@ -0,0 +1,36 @@ + + + +

Hi @{{username}}

+

Your password has been changed successfully.

+ + + Wasn't it you? Please contact us inmediately to recover your account. + + + or contact via email + support@ragestudio.net + + + Request information: + + + + + + + + + + + + + + + +
Date:{{date}}
Client:{{client}}
IP{{ip}}
+ + + \ No newline at end of file diff --git a/packages/server/services/ems/templates/password_recovery/index.handlebars b/packages/server/services/ems/templates/password_recovery/index.handlebars new file mode 100644 index 00000000..e61aa06c --- /dev/null +++ b/packages/server/services/ems/templates/password_recovery/index.handlebars @@ -0,0 +1,457 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ +
+ + + + + + +
+ + + + + + +
+
+
+
+ +
+
+ +
+ + + + + + +
+ +
+ + + + + + +
+
+

+ Hi + @{{username}}

+
+
+
+ +
+
+ +
+ + + + + + +
+ +
+ + + + + + +
+
+

+ It + sounds like you need some help recovering your + account.

+

+   +

+

+ Don't + worry, here is a link to change your password.

+
+
+
+ +
+
+ +
+ + + + + + +
+ +
+ + + + + + +
+

+

+ +
+
+ +
+
+ +
+ + + + + + +
+ +
+ + + + + + +
+
+

+ {{apr_link}} +

+
+
+
+ +
+
+ +
+ + + + + + +
+ +
+ + + + + + +
+

+

+ +
+
+ +
+
+ +
+ + + + + + +
+ +
+ + + + + + +
+
+

+ This + link will only be available for 1 hour

+
+
+
+ +
+
+ +
+ + + \ No newline at end of file diff --git a/packages/server/services/feed/FeedController/index.js b/packages/server/services/feed/FeedController/index.js new file mode 100755 index 00000000..6260e6e4 --- /dev/null +++ b/packages/server/services/feed/FeedController/index.js @@ -0,0 +1,140 @@ +import { Controller } from "linebridge/dist/server" + +import pmap from "p-map" + +import getPosts from "./services/getPosts" + +import getGlobalReleases from "./services/getGlobalReleases" +import getReleasesFromFollowing from "./services/getReleasesFromFollowing" +import getPlaylistsFromFollowing from "./services/getPlaylistsFromFollowing" + +export default class FeedController extends Controller { + static refName = "FeedController" + static useRoute = "/feed" + + httpEndpoints = { + get: { + "/timeline": { + middlewares: ["withAuthentication"], + fn: async (req, res) => { + const for_user_id = req.user?._id.toString() + + if (!for_user_id) { + return res.status(400).json({ + error: "Invalid user id" + }) + } + + // fetch posts + let posts = await getPosts({ + for_user_id, + limit: req.query?.limit, + skip: req.query?.trim, + }) + + // add type to posts and playlists + posts = posts.map((data) => { + data.type = "post" + + return data + }) + + let feed = [ + ...posts, + ] + + // sort feed + feed.sort((a, b) => { + return new Date(b.created_at) - new Date(a.created_at) + }) + + return res.json(feed) + } + }, + "/music/global": { + middlewares: ["withAuthentication"], + fn: async (req, res) => { + const for_user_id = req.user?._id.toString() + + if (!for_user_id) { + return res.status(400).json({ + error: "Invalid user id" + }) + } + + // fetch playlists from global + const result = await getGlobalReleases({ + for_user_id, + limit: req.query?.limit, + skip: req.query?.trim, + }) + + return res.json(result) + } + }, + "/music": { + middlewares: ["withAuthentication"], + fn: async (req, res) => { + const for_user_id = req.user?._id.toString() + + if (!for_user_id) { + return res.status(400).json({ + error: "Invalid user id" + }) + } + + const searchers = [ + getGlobalReleases, + //getReleasesFromFollowing, + //getPlaylistsFromFollowing, + ] + + let result = await pmap( + searchers, + async (fn, index) => { + const data = await fn({ + for_user_id, + limit: req.query?.limit, + skip: req.query?.trim, + }) + + return data + }, { + concurrency: 3, + },) + + result = result.reduce((acc, cur) => { + return [...acc, ...cur] + }, []) + + return res.json(result) + } + }, + "/posts": { + middlewares: ["withAuthentication"], + fn: async (req, res) => { + const for_user_id = req.user?._id.toString() + + if (!for_user_id) { + return res.status(400).json({ + error: "Invalid user id" + }) + } + + let feed = [] + + // fetch posts + const posts = await getPosts({ + for_user_id, + limit: req.query?.limit, + skip: req.query?.trim, + }) + + feed = feed.concat(posts) + + return res.json(feed) + } + }, + } + } +} \ No newline at end of file diff --git a/packages/server/services/feed/FeedController/services/getGlobalReleases.js b/packages/server/services/feed/FeedController/services/getGlobalReleases.js new file mode 100755 index 00000000..d0c88316 --- /dev/null +++ b/packages/server/services/feed/FeedController/services/getGlobalReleases.js @@ -0,0 +1,25 @@ +import { Release } from "@db_models" + +export default async (payload) => { + const { + limit = 20, + skip = 0, + } = payload + + let releases = await Release.find({ + $or: [ + { public: true }, + ] + }) + .sort({ created_at: -1 }) + .limit(limit) + .skip(skip) + + releases = Promise.all(releases.map(async (release) => { + release = release.toObject() + + return release + })) + + return releases +} \ No newline at end of file diff --git a/packages/server/services/feed/FeedController/services/getPlaylistsFromFollowing.js b/packages/server/services/feed/FeedController/services/getPlaylistsFromFollowing.js new file mode 100755 index 00000000..9faac13d --- /dev/null +++ b/packages/server/services/feed/FeedController/services/getPlaylistsFromFollowing.js @@ -0,0 +1,42 @@ +import { Playlist, User, UserFollow } from "@db_models" + +export default async (payload) => { + const { + for_user_id, + limit = 20, + skip = 0, + } = payload + + // get post from users that the user follows + const followingUsers = await UserFollow.find({ + user_id: for_user_id + }) + + const followingUserIds = followingUsers.map((followingUser) => followingUser.to) + + const fetchFromUserIds = [ + for_user_id, + ...followingUserIds, + ] + + // firter out the playlists that are not public + let playlists = await Playlist.find({ + user_id: { $in: fetchFromUserIds }, + $or: [ + { public: true }, + ] + }) + .sort({ created_at: -1 }) + .limit(limit) + .skip(skip) + + playlists = Promise.all(playlists.map(async (playlist) => { + playlist = playlist.toObject() + + playlist.type = "playlist" + + return playlist + })) + + return playlists +} \ No newline at end of file diff --git a/packages/server/services/feed/FeedController/services/getPosts.js b/packages/server/services/feed/FeedController/services/getPosts.js new file mode 100755 index 00000000..4d68c706 --- /dev/null +++ b/packages/server/services/feed/FeedController/services/getPosts.js @@ -0,0 +1,39 @@ +import { Post, UserFollow } from "@db_models" + +import fullfillPostsData from "@utils/fullfillPostsData" + +export default async (payload) => { + const { + for_user_id, + limit = 20, + skip = 0, + } = payload + + // get post from users that the user follows + const followingUsers = await UserFollow.find({ + user_id: for_user_id + }) + + const followingUserIds = followingUsers.map((followingUser) => followingUser.to) + + const fetchPostsFromIds = [ + for_user_id, + ...followingUserIds, + ] + + let posts = await Post.find({ + user_id: { $in: fetchPostsFromIds } + }) + .sort({ created_at: -1 }) + .limit(limit) + .skip(skip) + + // fullfill data + posts = await fullfillPostsData({ + posts, + for_user_id, + skip, + }) + + return posts +} \ No newline at end of file diff --git a/packages/server/services/feed/FeedController/services/getReleasesFromFollowing.js b/packages/server/services/feed/FeedController/services/getReleasesFromFollowing.js new file mode 100755 index 00000000..bd35e20f --- /dev/null +++ b/packages/server/services/feed/FeedController/services/getReleasesFromFollowing.js @@ -0,0 +1,40 @@ +import { Release, UserFollow } from "@db_models" + +export default async (payload) => { + const { + for_user_id, + limit = 20, + skip = 0, + } = payload + + // get post from users that the user follows + const followingUsers = await UserFollow.find({ + user_id: for_user_id + }) + + const followingUserIds = followingUsers.map((followingUser) => followingUser.to) + + const fetchFromUserIds = [ + for_user_id, + ...followingUserIds, + ] + + // firter out the releases that are not public + let releases = await Release.find({ + user_id: { $in: fetchFromUserIds }, + $or: [ + { public: true }, + ] + }) + .sort({ created_at: -1 }) + .limit(limit) + .skip(skip) + + releases = Promise.all(releases.map(async (release) => { + release = release.toObject() + + return release + })) + + return releases +} \ No newline at end of file diff --git a/packages/server/services/feed/feed.service.js b/packages/server/services/feed/feed.service.js new file mode 100644 index 00000000..6e41e198 --- /dev/null +++ b/packages/server/services/feed/feed.service.js @@ -0,0 +1,25 @@ +import { Server } from "linebridge/src/server" +import DbManager from "@shared-classes/DbManager" + +import SharedMiddlewares from "@shared-middlewares" + +export default class API extends Server { + static refName = "feed" + static useEngine = "hyper-express" + static routesPath = `${__dirname}/routes` + static listen_port = process.env.HTTP_LISTEN_PORT ?? 3007 + + middlewares = { + ...SharedMiddlewares + } + + contexts = { + db: new DbManager(), + } + + async onInitialize() { + await this.contexts.db.initialize() + } +} + +Boot(API) \ No newline at end of file diff --git a/packages/server/services/feed/package.json b/packages/server/services/feed/package.json new file mode 100644 index 00000000..941c7b1e --- /dev/null +++ b/packages/server/services/feed/package.json @@ -0,0 +1,6 @@ +{ + "name": "feed", + "version": "1.0.0", + "main": "index.js", + "license": "MIT" +} diff --git a/packages/server/services/files/file.service.js b/packages/server/services/files/file.service.js index 8ee64d08..55eabd2e 100755 --- a/packages/server/services/files/file.service.js +++ b/packages/server/services/files/file.service.js @@ -1,188 +1,40 @@ -import fs from "fs" -import path from "path" -import cors from "cors" -import express from "express" +import { Server } from "linebridge/src/server" import B2 from "backblaze-b2" import RedisClient from "@shared-classes/RedisClient" import StorageClient from "@shared-classes/StorageClient" import CacheService from "@shared-classes/CacheService" -import ComtyClient from "@shared-classes/ComtyClient" -import pkg from "./package.json" +import SharedMiddlewares from "@shared-middlewares" -global.DEFAULT_HEADERS = { - "Access-Control-Allow-Headers": "Origin, X-Requested-With, Content-Type, Accept, Authorization, provider-type, Provider-Type", - "Access-Control-Allow-Origin": "*", - "Access-Control-Allow-Methods": "GET, POST, OPTIONS, PUT, PATCH, DELETE, DEL", - "Access-Control-Allow-Credentials": "true", -} +class API extends Server { + static refName = "files" + static useEngine = "hyper-express" + static routesPath = `${__dirname}/routes` + static listen_port = process.env.HTTP_LISTEN_PORT ?? 3008 -global.DEFAULT_MIDDLEWARES = [ - cors({ - "origin": "*", - "methods": DEFAULT_HEADERS["Access-Control-Allow-Methods"], - "preflightContinue": true, - "optionsSuccessStatus": 204, - }), -] - -export default class FileServerAPI { - // max body length is 1GB in bytes static maxBodyLength = 1000 * 1000 * 1000 - internalRouter = express.Router() - - server = global.server = express() - - listenIp = process.env.HTTP_LISTEN_IP ?? "0.0.0.0" - listenPort = process.env.HTTP_LISTEN_PORT ?? 3002 - - redis = global.redis = RedisClient() - - storage = global.storage = StorageClient() - - b2Storage = global.b2Storage = new B2({ - applicationKeyId: process.env.B2_KEY_ID, - applicationKey: process.env.B2_APP_KEY, - }) - - cache = global.cache = new CacheService() - - comty = global.comty = ComtyClient({ - useWs: false, - }) - - async __loadControllers() { - let controllersPath = fs.readdirSync(path.resolve(__dirname, "controllers")) - - for await (const controllerPath of controllersPath) { - const controller = require(path.resolve(__dirname, "controllers", controllerPath)).default - - if (!controller) { - this.server.InternalConsole.error(`Controller ${controllerPath} not found.`) - - continue - } - - const handler = await controller(express.Router()) - - if (!handler) { - this.server.InternalConsole.error(`Controller ${controllerPath} returning not valid handler.`) - - continue - } - - this.internalRouter.use(handler.path ?? "/", handler.router) - - continue - } + middlewares = { + ...SharedMiddlewares } - async __loadMiddlewares() { - let middlewaresPath = fs.readdirSync(path.resolve(__dirname, "useMiddlewares")) - - if (this.constructor.useMiddlewaresOrder) { - middlewaresPath = middlewaresPath.sort((a, b) => { - const aIndex = this.constructor.useMiddlewaresOrder.indexOf(a.replace(".js", "")) - const bIndex = this.constructor.useMiddlewaresOrder.indexOf(b.replace(".js", "")) - - if (aIndex === -1) { - return 1 - } - - if (bIndex === -1) { - return -1 - } - - return aIndex - bIndex - }) - } - - for await (const middlewarePath of middlewaresPath) { - const middleware = require(path.resolve(__dirname, "useMiddlewares", middlewarePath)).default - - if (!middleware) { - this.server.InternalConsole.error(`Middleware ${middlewarePath} not found.`) - - continue - } - - this.server.use(middleware) - } + contexts = { + cache: new CacheService(), + redis: RedisClient(), + storage: StorageClient(), + b2Storage: new B2({ + applicationKeyId: process.env.B2_KEY_ID, + applicationKey: process.env.B2_APP_KEY, + }), } - __getRegisteredRoutes() { - return this.internalRouter.routes.map((route) => { - return { - method: route.method, - path: route.pattern, - } - }) - } - - __registerInternalRoutes() { - this.internalRouter.get("/", (req, res) => { - return res.status(200).json({ - name: pkg.name, - version: pkg.version, - }) - }) - - // this.internalRouter.get("/routes", (req, res) => { - // return res.status(200).json(this.__getRegisteredRoutes()) - // }) - - this.internalRouter.get("*", (req, res) => { - return res.status(404).json({ - error: "Not found", - }) - }) - } - - async initialize() { - const startHrTime = process.hrtime() - - // initialize clients - await this.redis.initialize() - await this.storage.initialize() - await this.b2Storage.authorize() - - this.server.use((req, res, next) => { - Object.keys(global.DEFAULT_HEADERS).forEach((key) => { - res.setHeader(key, global.DEFAULT_HEADERS[key]) - res.header[key] = global.DEFAULT_HEADERS[key] - }) - - next() - }) - - global.DEFAULT_MIDDLEWARES.forEach((middleware) => { - this.server.use(middleware) - }) - - this.server.use(express.json({ extended: false })) - this.server.use(express.urlencoded({ extended: true })) - - // register controllers & middlewares - await this.__loadControllers() - await this.__loadMiddlewares() - await this.__registerInternalRoutes() - - // use internal router - this.server.use(this.internalRouter) - - // start server - await this.server.listen(this.listenPort, this.listenIp) - - // calculate elapsed time - const elapsedHrTime = process.hrtime(startHrTime) - const elapsedTimeInMs = elapsedHrTime[0] * 1000 + elapsedHrTime[1] / 1e6 - - // log server started - console.log(`🚀 Server started ready on \n\t - http://${this.listenIp}:${this.listenPort} \n\t - Tooks ${elapsedTimeInMs}ms`) + async onInitialize() { + await this.contexts.redis.initialize() + await this.contexts.storage.initialize() + await this.contexts.b2Storage.authorize() } } -Boot(FileServerAPI) \ No newline at end of file +Boot(API) \ No newline at end of file diff --git a/packages/server/services/files/middlewares/withAuth/index.js b/packages/server/services/files/middlewares/withAuth/index.js deleted file mode 100755 index 52a30f4a..00000000 --- a/packages/server/services/files/middlewares/withAuth/index.js +++ /dev/null @@ -1,25 +0,0 @@ -export default async function (req, res, next) { - // extract authentification header - let auth = req.headers.authorization - - if (!auth) { - return res.status(401).json({ error: "Unauthorized, missing token" }) - } - - auth = auth.replace("Bearer ", "") - - // check if authentification is valid - const validation = await comty.rest.session.validateToken(auth).catch((error) => { - return { - valid: false, - } - }) - - if (!validation.valid) { - return res.status(401).json({ error: "Unauthorized" }) - } - - req.session = validation.data - - return next() -} \ No newline at end of file diff --git a/packages/server/services/files/middlewares/withOptionalAuth/index.js b/packages/server/services/files/middlewares/withOptionalAuth/index.js deleted file mode 100755 index 962d15d0..00000000 --- a/packages/server/services/files/middlewares/withOptionalAuth/index.js +++ /dev/null @@ -1,23 +0,0 @@ -export default function (req, res, next) { - // extract authentification header - let auth = req.headers.authorization - - if (!auth) { - return next() - } - - auth = req.sessionToken = auth.replace("Bearer ", "") - - // check if authentification is valid - comty.rest.session.validateToken(auth) - .catch((error) => { - return { - valid: false, - } - }) - .then((validation) => { - req.session = validation.data - - next() - }) -} \ No newline at end of file diff --git a/packages/server/services/files/middlewares/withWsAuth.js b/packages/server/services/files/middlewares/withWsAuth.js deleted file mode 100755 index 31fed9d9..00000000 --- a/packages/server/services/files/middlewares/withWsAuth.js +++ /dev/null @@ -1,55 +0,0 @@ -export default async (socket, next) => { - try { - const token = socket.handshake.auth.token - - if (!token) { - return next(new Error(`auth:token_missing`)) - } - - const validation = await global.comty.rest.session.validateToken(token).catch((err) => { - console.error(`[${socket.id}] failed to validate session caused by server error`, err) - - return { - valid: false, - error: err, - } - }) - - if (!validation.valid) { - if (validation.error) { - return next(new Error(`auth:server_error`)) - } - - return next(new Error(`auth:token_invalid`)) - } - - const session = validation.data - - const userData = await global.comty.rest.user.data({ - user_id: session.user_id, - }).catch((err) => { - console.error(`[${socket.id}] failed to get user data caused by server error`, err) - - return null - }) - - if (!userData) { - return next(new Error(`auth:user_failed`)) - } - - try { - socket.userData = userData - socket.token = token - socket.session = session - } - catch (err) { - return next(new Error(`auth:decode_failed`)) - } - - next() - } catch (error) { - console.error(`[${socket.id}] failed to connect caused by server error`, error) - - next(new Error(`auth:authentification_failed`)) - } -} \ No newline at end of file diff --git a/packages/server/services/files/package.json b/packages/server/services/files/package.json index 5748e152..21fad390 100755 --- a/packages/server/services/files/package.json +++ b/packages/server/services/files/package.json @@ -20,7 +20,7 @@ "luxon": "^3.0.4", "merge-files": "^0.1.2", "mime-types": "^2.1.35", - "sharp": "^0.33.2", + "sharp": "0.32.6", "minio": "^7.0.32", "moment": "^2.29.4", "moment-timezone": "^0.5.40", diff --git a/packages/server/services/files/routes/stream/[$]/get.js b/packages/server/services/files/routes/stream/[$]/get.js new file mode 100644 index 00000000..8ecf5ffc --- /dev/null +++ b/packages/server/services/files/routes/stream/[$]/get.js @@ -0,0 +1,25 @@ +import mimetypes from "mime-types" + +export default { + useContext: ["storage"], + fn: async (req, res) => { + const streamPath = req.path.replace(req.route.pattern.replace("*", ""), "/") + + this.default.contexts.storage.getObject(process.env.S3_BUCKET, streamPath, (err, dataStream) => { + if (err) { + return res.status(404).end() + } + + const extname = mimetypes.lookup(streamPath) + + // send chunked response + res.status(200) + + // set headers + res.setHeader("Content-Type", extname) + res.setHeader("Accept-Ranges", "bytes") + + return dataStream.pipe(res) + }) + } +} \ No newline at end of file diff --git a/packages/server/services/files/routes/upload/chunk/post.js b/packages/server/services/files/routes/upload/chunk/post.js new file mode 100644 index 00000000..0fd030c8 --- /dev/null +++ b/packages/server/services/files/routes/upload/chunk/post.js @@ -0,0 +1,104 @@ +import path from "path" +import fs from "fs" + +import FileUpload from "@shared-classes/FileUpload" +import PostProcess from "@services/post-process" + +export default { + useContext: ["cache", "storage", "b2Storage"], + middlewares: [ + "withAuthentication", + ], + fn: async (req, res) => { + const { cache, storage, b2Storage } = this.default.contexts + + const providerType = req.headers["provider-type"] + + const userPath = path.join(cache.constructor.cachePath, req.session.user_id) + + // 10 GB in bytes + const maxFileSize = 10 * 1000 * 1000 * 1000 + + // 10MB in bytes + const maxChunkSize = 10 * 1000 * 1000 + + let build = await FileUpload(req, userPath, maxFileSize, maxChunkSize) + .catch((err) => { + console.log("err", err) + + throw new OperationError(500, err.message) + }) + + if (build === false) { + return false + } else { + if (typeof build === "function") { + try { + build = await build() + + if (!req.headers["no-compression"]) { + build = await PostProcess(build) + } + + // compose remote path + const remotePath = `${req.session.user_id}/${path.basename(build.filepath)}` + + let url = null + + switch (providerType) { + case "premium-cdn": { + // use backblaze b2 + await b2Storage.authorize() + + const uploadUrl = await b2Storage.getUploadUrl({ + bucketId: process.env.B2_BUCKET_ID, + }) + + const data = await fs.promises.readFile(build.filepath) + + await b2Storage.uploadFile({ + uploadUrl: uploadUrl.data.uploadUrl, + uploadAuthToken: uploadUrl.data.authorizationToken, + fileName: remotePath, + data: data, + info: build.metadata + }) + + url = `https://${process.env.B2_CDN_ENDPOINT}/${process.env.B2_BUCKET}/${remotePath}` + + break + } + default: { + // upload to storage + await storage.fPutObject(process.env.S3_BUCKET, remotePath, build.filepath, build.metadata ?? { + "Content-Type": build.mimetype, + }) + + // compose url + url = storage.composeRemoteURL(remotePath) + + break + } + } + + // remove from cache + fs.promises.rm(build.cachePath, { recursive: true, force: true }) + + return res.json({ + name: build.filename, + id: remotePath, + url: url, + }) + } catch (error) { + console.log(error) + + throw new OperationError(500, error.message) + } + } + + return res.json({ + success: true, + }) + } + } +} \ No newline at end of file diff --git a/packages/server/services/files/useMiddlewares/useCors/index.js b/packages/server/services/files/useMiddlewares/useCors/index.js deleted file mode 100755 index 7ebac0fc..00000000 --- a/packages/server/services/files/useMiddlewares/useCors/index.js +++ /dev/null @@ -1,8 +0,0 @@ -import cors from "cors" - -export default cors({ - origin: "*", - methods: ["GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS", "HEAD", "CONNECT", "TRACE"], - preflightContinue: false, - optionsSuccessStatus: 204, -}) \ No newline at end of file diff --git a/packages/server/services/files/useMiddlewares/useLogger/index.js b/packages/server/services/files/useMiddlewares/useLogger/index.js deleted file mode 100755 index 1d398fc1..00000000 --- a/packages/server/services/files/useMiddlewares/useLogger/index.js +++ /dev/null @@ -1,19 +0,0 @@ -export default (req, res, next) => { - const startHrTime = process.hrtime() - - res.on("finish", () => { - const elapsedHrTime = process.hrtime(startHrTime) - const elapsedTimeInMs = elapsedHrTime[0] * 1000 + elapsedHrTime[1] / 1e6 - - res._responseTimeMs = elapsedTimeInMs - - // cut req.url if is too long - if (req.url.length > 100) { - req.url = req.url.substring(0, 100) + "..." - } - - console.log(`${req.method} ${res._status_code ?? res.statusCode ?? 200} ${req.url} ${elapsedTimeInMs}ms`) - }) - - next() -} \ No newline at end of file diff --git a/packages/server/services/files/utils/createRoutesFromDirectory/index.js b/packages/server/services/files/utils/createRoutesFromDirectory/index.js deleted file mode 100755 index f27647a0..00000000 --- a/packages/server/services/files/utils/createRoutesFromDirectory/index.js +++ /dev/null @@ -1,45 +0,0 @@ -import fs from "fs" - -function createRoutesFromDirectory(startFrom, directoryPath, router) { - const files = fs.readdirSync(directoryPath) - - files.forEach((file) => { - const filePath = `${directoryPath}/${file}` - - const stat = fs.statSync(filePath) - - if (stat.isDirectory()) { - createRoutesFromDirectory(startFrom, filePath, router) - } else if (file.endsWith(".js") || file.endsWith(".jsx") || file.endsWith(".ts") || file.endsWith(".tsx")) { - let splitedFilePath = filePath.split("/") - - // slice the startFrom path - splitedFilePath = splitedFilePath.slice(splitedFilePath.indexOf(startFrom) + 1) - - const method = splitedFilePath[0] - - let route = splitedFilePath.slice(1, splitedFilePath.length).join("/") - - route = route.replace(".jsx", "") - route = route.replace(".js", "") - route = route.replace(".ts", "") - route = route.replace(".tsx", "") - - if (route === "index") { - route = "/" - } else { - route = `/${route}` - } - - let handler = require(filePath) - - handler = handler.default || handler - - router[method](route, handler) - } - }) - - return router -} - -export default createRoutesFromDirectory \ No newline at end of file diff --git a/packages/server/services/files/utils/getMiddlewares/index.js b/packages/server/services/files/utils/getMiddlewares/index.js deleted file mode 100755 index 78a65ea0..00000000 --- a/packages/server/services/files/utils/getMiddlewares/index.js +++ /dev/null @@ -1,46 +0,0 @@ -import fs from "node:fs" -import path from "node:path" - -export default async (middlewares, middlewaresPath) => { - if (typeof middlewaresPath === "undefined") { - middlewaresPath = path.resolve(globalThis["__src"], "middlewares") - } - - if (!fs.existsSync(middlewaresPath)) { - return undefined - } - - if (typeof middlewares === "string") { - middlewares = [middlewares] - } - - let fns = [] - - for await (const middlewareName of middlewares) { - const middlewarePath = path.resolve(middlewaresPath, middlewareName) - - if (!fs.existsSync(middlewarePath)) { - console.error(`Middleware ${middlewareName} not found.`) - - continue - } - - const middleware = require(middlewarePath).default - - if (!middleware) { - console.error(`Middleware ${middlewareName} not valid export.`) - - continue - } - - if (typeof middleware !== "function") { - console.error(`Middleware ${middlewareName} not valid function.`) - - continue - } - - fns.push(middleware) - } - - return fns -} \ No newline at end of file diff --git a/packages/server/services/files/utils/replaceImportsWithRemoteURL/index.js b/packages/server/services/files/utils/replaceImportsWithRemoteURL/index.js deleted file mode 100755 index bc08db37..00000000 --- a/packages/server/services/files/utils/replaceImportsWithRemoteURL/index.js +++ /dev/null @@ -1,18 +0,0 @@ -import resolveUrl from "@utils/resolveUrl" - -export default (code, rootURL) => { - const importRegex = /import\s+(?:(?:([\w*\s{},]*)\s+from\s+)?["']([^"']*)["']|["']([^"']*)["'])/g - - // replaces all imports with absolute paths - const absoluteImportCode = code.replace(importRegex, (match, p1, p2) => { - let resolved = resolveUrl(rootURL, p2) - - if (!p1) { - return `import "${resolved}"` - } - - return `import ${p1} from "${resolved}"` - }) - - return absoluteImportCode -} \ No newline at end of file diff --git a/packages/server/services/main/controllers/AdminController/endpoints/accounts_statistics.js b/packages/server/services/main/controllers/AdminController/endpoints/accounts_statistics.js index a2bf9566..3e910a66 100755 --- a/packages/server/services/main/controllers/AdminController/endpoints/accounts_statistics.js +++ b/packages/server/services/main/controllers/AdminController/endpoints/accounts_statistics.js @@ -1,4 +1,4 @@ -import { User, Session, Post } from "@shared-classes/DbModels" +import { User, Session, Post } from "@db_models" export default { method: "GET", diff --git a/packages/server/services/main/controllers/AdminController/endpoints/delete_featured_wallpaper.js b/packages/server/services/main/controllers/AdminController/endpoints/delete_featured_wallpaper.js index 529638d1..15dfea3b 100755 --- a/packages/server/services/main/controllers/AdminController/endpoints/delete_featured_wallpaper.js +++ b/packages/server/services/main/controllers/AdminController/endpoints/delete_featured_wallpaper.js @@ -1,4 +1,4 @@ -import { FeaturedWallpaper } from "@shared-classes/DbModels" +import { FeaturedWallpaper } from "@db_models" export default { method: "DELETE", diff --git a/packages/server/services/main/controllers/AdminController/endpoints/featured_wallpaper.js b/packages/server/services/main/controllers/AdminController/endpoints/featured_wallpaper.js index 35fa8cd2..37658319 100755 --- a/packages/server/services/main/controllers/AdminController/endpoints/featured_wallpaper.js +++ b/packages/server/services/main/controllers/AdminController/endpoints/featured_wallpaper.js @@ -1,4 +1,4 @@ -import { FeaturedWallpaper } from "@shared-classes/DbModels" +import { FeaturedWallpaper } from "@db_models" import momentTimezone from "moment-timezone" export default { diff --git a/packages/server/services/main/controllers/AdminController/endpoints/resetPassword.js b/packages/server/services/main/controllers/AdminController/endpoints/resetPassword.js index 28fbbce9..7973baab 100755 --- a/packages/server/services/main/controllers/AdminController/endpoints/resetPassword.js +++ b/packages/server/services/main/controllers/AdminController/endpoints/resetPassword.js @@ -1,4 +1,4 @@ -import { User } from "@shared-classes/DbModels" +import { User } from "@db_models" import bcrypt from "bcrypt" diff --git a/packages/server/services/main/controllers/AdminController/endpoints/update_user_data.js b/packages/server/services/main/controllers/AdminController/endpoints/update_user_data.js index 732875b5..b08f5986 100755 --- a/packages/server/services/main/controllers/AdminController/endpoints/update_user_data.js +++ b/packages/server/services/main/controllers/AdminController/endpoints/update_user_data.js @@ -1,4 +1,4 @@ -import { User } from "@shared-classes/DbModels" +import { User } from "@db_models" export default { method: "POST", diff --git a/packages/server/services/main/controllers/AuthController/endpoints/dataValidation.js b/packages/server/services/main/controllers/AuthController/endpoints/dataValidation.js deleted file mode 100755 index 1a99ec5f..00000000 --- a/packages/server/services/main/controllers/AuthController/endpoints/dataValidation.js +++ /dev/null @@ -1,37 +0,0 @@ -import { User } from "@shared-classes/DbModels" - -export default { - method: "GET", - route: "/login/validation", - fn: async function (req, res) { - // just check if the provided user or/and email exists, if is return false, otherwise return true - const { username, email } = req.query - - if (!username && !email) { - return res.status(400).json({ - message: "Missing username or email", - }) - } - - const user = await User.findOne({ - $or: [ - { username: username }, - { email: email }, - ] - }).catch((error) => { - return false - }) - - if (user) { - return res.json({ - message: "User already exists", - exists: true, - }) - } else { - return res.json({ - message: "User doesn't exists", - exists: false, - }) - } - } -} \ No newline at end of file diff --git a/packages/server/services/main/controllers/AuthController/endpoints/otpSend.js b/packages/server/services/main/controllers/AuthController/endpoints/otpSend.js deleted file mode 100644 index c7bbefec..00000000 --- a/packages/server/services/main/controllers/AuthController/endpoints/otpSend.js +++ /dev/null @@ -1,7 +0,0 @@ -export default { - method: "GET", - route: "/otp/verify", - fn: async function (req, res) { - - } -} \ No newline at end of file diff --git a/packages/server/services/main/controllers/AuthController/endpoints/userLogin.js b/packages/server/services/main/controllers/AuthController/endpoints/userLogin.js deleted file mode 100755 index de153128..00000000 --- a/packages/server/services/main/controllers/AuthController/endpoints/userLogin.js +++ /dev/null @@ -1,39 +0,0 @@ -import Token from "@lib/token" -import { User } from "@shared-classes/DbModels" -import bcrypt from "bcrypt" - -export default { - method: "POST", - route: "/login", - fn: async (req, res) => { - const { username, password } = req.body - - let isEmail = username.match(/^[^\s@]+@[^\s@]+\.[^\s@]+$/) - - let query = isEmail ? { email: username } : { username: username } - - const user = await User.findOne(query).select("+password") - - if (!user) { - return res.status(401).json({ - message: "Invalid credentials, user not found", - }) - } - - if (!bcrypt.compareSync(password, user.password)) { - return res.status(401).json({ - message: "Invalid credentials", - }) - } - - const token = await Token.createAuth({ - username: user.username, - user_id: user._id.toString(), - ip_address: req.headers["x-forwarded-for"]?.split(",")[0] ?? req.socket.remoteAddress, - client: req.headers["user-agent"], - signLocation: global.signLocation, - }) - - return res.json({ token: token }) - } -} \ No newline at end of file diff --git a/packages/server/services/main/controllers/AuthController/endpoints/userLogout.js b/packages/server/services/main/controllers/AuthController/endpoints/userLogout.js deleted file mode 100755 index 877b21bd..00000000 --- a/packages/server/services/main/controllers/AuthController/endpoints/userLogout.js +++ /dev/null @@ -1,33 +0,0 @@ -import { Session } from "@shared-classes/DbModels" - -export default { - method: "POST", - route: "/logout", - middlewares: ["withAuthentication"], - fn: async (req, res) => { - const { token, user_id } = req.body - - if (typeof user_id === "undefined") { - return res.status(400).json({ - message: "No user_id provided", - }) - } - if (typeof token === "undefined") { - return res.status(400).json({ - message: "No token provided", - }) - } - - const session = await Session.findOneAndDelete({ user_id, token }) - - if (session) { - return res.json({ - message: "Session deleted", - }) - } - - return res.status(404).json({ - message: "Session not found", - }) - }, -} \ No newline at end of file diff --git a/packages/server/services/main/controllers/AuthController/endpoints/userRegister.js b/packages/server/services/main/controllers/AuthController/endpoints/userRegister.js deleted file mode 100755 index 2d9344bb..00000000 --- a/packages/server/services/main/controllers/AuthController/endpoints/userRegister.js +++ /dev/null @@ -1,28 +0,0 @@ -import { Schematized } from "@lib" - -import createUser from "../methods/createUser" - -export default { - method: "POST", - route: "/register", - fn: Schematized({ - required: ["username", "email", "password"], - select: ["username", "email", "password", "fullName"], - }, async (req, res) => { - const result = await createUser(req.selection).catch((err) => { - console.error(err) - - res.status(500).json({ - message: `Error creating user > ${err.message}`, - }) - - return false - }) - - if (!result) { - return false - } - - return res.json(result) - }) -} \ No newline at end of file diff --git a/packages/server/services/main/controllers/AuthController/index.js b/packages/server/services/main/controllers/AuthController/index.js deleted file mode 100755 index 87c2d19e..00000000 --- a/packages/server/services/main/controllers/AuthController/index.js +++ /dev/null @@ -1,9 +0,0 @@ -import { Controller } from "linebridge/dist/server" -import generateEndpointsFromDir from "linebridge/dist/server/lib/generateEndpointsFromDir" - -export default class AuthController extends Controller { - static refName = "AuthController" - static useRoute = "/auth" - - httpEndpoints = generateEndpointsFromDir(__dirname + "/endpoints") -} \ No newline at end of file diff --git a/packages/server/services/main/controllers/AuthController/methods/createUser.js b/packages/server/services/main/controllers/AuthController/methods/createUser.js deleted file mode 100755 index 3a43c0af..00000000 --- a/packages/server/services/main/controllers/AuthController/methods/createUser.js +++ /dev/null @@ -1,56 +0,0 @@ -import { User } from "@shared-classes/DbModels" -import bcrypt from "bcrypt" - -export default async function (payload) { - let { username, password, email, fullName, roles, avatar } = payload - - // if username has capital letters, throw error - if (username !== username.toLowerCase()) { - throw new Error("Username must be lowercase") - } - - // make sure the username has no spaces - if (username.includes(" ")) { - throw new Error("Username cannot contain spaces") - } - - // make sure the username has no valid characters. Only letters, numbers, and underscores - if (!/^[a-z0-9_]+$/.test(username)) { - throw new Error("Username can only contain letters, numbers, and underscores") - } - - // check if username is already taken - const existentUser = await User.findOne({ username: username }) - - if (existentUser) { - throw new Error("User already exists") - } - - // check if the email is already in use - const existentEmail = await User.findOne({ email: email }) - - if (existentEmail) { - throw new Error("Email already in use") - } - - // hash the password - const hash = bcrypt.hashSync(password, parseInt(process.env.BCRYPT_ROUNDS ?? 3)) - - // create the doc - let user = new User({ - username: username, - password: hash, - email: email, - fullName: fullName, - avatar: avatar ?? `https://api.dicebear.com/7.x/thumbs/svg?seed=${username}`, - roles: roles, - createdAt: new Date().getTime(), - }) - - await user.save() - - // dispatch event bus - global.eventBus.emit("user.create", user) - - return user -} \ No newline at end of file diff --git a/packages/server/services/main/controllers/BadgesController/endpoints/deleteBadge.js b/packages/server/services/main/controllers/BadgesController/endpoints/deleteBadge.js index b12ddf94..ca061bfe 100755 --- a/packages/server/services/main/controllers/BadgesController/endpoints/deleteBadge.js +++ b/packages/server/services/main/controllers/BadgesController/endpoints/deleteBadge.js @@ -1,4 +1,4 @@ -import { Badge } from "@shared-classes/DbModels" +import { Badge } from "@db_models" export default { method: "DELETE", diff --git a/packages/server/services/main/controllers/BadgesController/endpoints/getBadges.js b/packages/server/services/main/controllers/BadgesController/endpoints/getBadges.js index 21a6fab5..e5cdeda2 100755 --- a/packages/server/services/main/controllers/BadgesController/endpoints/getBadges.js +++ b/packages/server/services/main/controllers/BadgesController/endpoints/getBadges.js @@ -1,5 +1,5 @@ import { Schematized } from "@lib" -import { Badge } from "@shared-classes/DbModels" +import { Badge } from "@db_models" export default { method: "GET", diff --git a/packages/server/services/main/controllers/BadgesController/endpoints/getUserBadges.js b/packages/server/services/main/controllers/BadgesController/endpoints/getUserBadges.js index 3c385fb4..7b777572 100755 --- a/packages/server/services/main/controllers/BadgesController/endpoints/getUserBadges.js +++ b/packages/server/services/main/controllers/BadgesController/endpoints/getUserBadges.js @@ -1,4 +1,4 @@ -import { User, Badge } from "@shared-classes/DbModels" +import { User, Badge } from "@db_models" export default { method: "GET", diff --git a/packages/server/services/main/controllers/BadgesController/endpoints/giveToUser.js b/packages/server/services/main/controllers/BadgesController/endpoints/giveToUser.js index 9b858321..0db01a2b 100755 --- a/packages/server/services/main/controllers/BadgesController/endpoints/giveToUser.js +++ b/packages/server/services/main/controllers/BadgesController/endpoints/giveToUser.js @@ -1,4 +1,4 @@ -import { Badge, User } from "@shared-classes/DbModels" +import { Badge, User } from "@db_models" import { Schematized } from "@lib" export default { diff --git a/packages/server/services/main/controllers/BadgesController/endpoints/putBadge.js b/packages/server/services/main/controllers/BadgesController/endpoints/putBadge.js index f813acfd..62e38896 100755 --- a/packages/server/services/main/controllers/BadgesController/endpoints/putBadge.js +++ b/packages/server/services/main/controllers/BadgesController/endpoints/putBadge.js @@ -1,4 +1,4 @@ -import { Badge } from "@shared-classes/DbModels" +import { Badge } from "@db_models" import { Schematized } from "@lib" export default { diff --git a/packages/server/services/main/controllers/BadgesController/endpoints/removeToUser.js b/packages/server/services/main/controllers/BadgesController/endpoints/removeToUser.js index 7865219d..fd9ce0cc 100755 --- a/packages/server/services/main/controllers/BadgesController/endpoints/removeToUser.js +++ b/packages/server/services/main/controllers/BadgesController/endpoints/removeToUser.js @@ -1,5 +1,5 @@ import { Schematized } from "@lib" -import { Badge, User } from "@shared-classes/DbModels" +import { Badge, User } from "@db_models" export default { method: "DELETE", diff --git a/packages/server/services/main/controllers/CommentsController/services/deleteComment.js b/packages/server/services/main/controllers/CommentsController/services/deleteComment.js index 95c90aa9..63ef98b2 100755 --- a/packages/server/services/main/controllers/CommentsController/services/deleteComment.js +++ b/packages/server/services/main/controllers/CommentsController/services/deleteComment.js @@ -1,4 +1,4 @@ -import { Comment } from "@shared-classes/DbModels" +import { Comment } from "@db_models" import CheckUserAdmin from "../../../lib/checkUserAdmin" export default async (payload) => { diff --git a/packages/server/services/main/controllers/CommentsController/services/getComments.js b/packages/server/services/main/controllers/CommentsController/services/getComments.js index 4ef805f2..b27bac87 100755 --- a/packages/server/services/main/controllers/CommentsController/services/getComments.js +++ b/packages/server/services/main/controllers/CommentsController/services/getComments.js @@ -1,4 +1,4 @@ -import { User, Comment } from "@shared-classes/DbModels" +import { User, Comment } from "@db_models" export default async (payload = {}) => { const { parent_id } = payload diff --git a/packages/server/services/main/controllers/CommentsController/services/newComment.js b/packages/server/services/main/controllers/CommentsController/services/newComment.js index 7a0c6f4d..f6d9cac6 100755 --- a/packages/server/services/main/controllers/CommentsController/services/newComment.js +++ b/packages/server/services/main/controllers/CommentsController/services/newComment.js @@ -1,4 +1,4 @@ -import { User, Comment } from "@shared-classes/DbModels" +import { User, Comment } from "@db_models" export default async (payload) => { const { parent_id, message, user_id } = payload diff --git a/packages/server/services/main/controllers/FeaturedEventsController/index.js b/packages/server/services/main/controllers/FeaturedEventsController/index.js index d001b18a..a1d91325 100755 --- a/packages/server/services/main/controllers/FeaturedEventsController/index.js +++ b/packages/server/services/main/controllers/FeaturedEventsController/index.js @@ -1,6 +1,6 @@ import { Controller } from "linebridge/dist/server" -import { FeaturedEvent } from "@shared-classes/DbModels" +import { FeaturedEvent } from "@db_models" import createFeaturedEvent from "./services/createFeaturedEvent" // TODO: Migrate to new linebridge 0.15 endpoint classes instead of this diff --git a/packages/server/services/main/controllers/FeaturedEventsController/services/createFeaturedEvent.js b/packages/server/services/main/controllers/FeaturedEventsController/services/createFeaturedEvent.js index a6da743b..97c25de7 100755 --- a/packages/server/services/main/controllers/FeaturedEventsController/services/createFeaturedEvent.js +++ b/packages/server/services/main/controllers/FeaturedEventsController/services/createFeaturedEvent.js @@ -1,4 +1,4 @@ -import { FeaturedEvent } from "@shared-classes/DbModels" +import { FeaturedEvent } from "@db_models" export default async (payload) => { const { diff --git a/packages/server/services/main/controllers/FeedController/services/getGlobalReleases.js b/packages/server/services/main/controllers/FeedController/services/getGlobalReleases.js index 71a99b36..d0c88316 100755 --- a/packages/server/services/main/controllers/FeedController/services/getGlobalReleases.js +++ b/packages/server/services/main/controllers/FeedController/services/getGlobalReleases.js @@ -1,4 +1,4 @@ -import { Release } from "@shared-classes/DbModels" +import { Release } from "@db_models" export default async (payload) => { const { diff --git a/packages/server/services/main/controllers/FeedController/services/getPlaylistsFromFollowing.js b/packages/server/services/main/controllers/FeedController/services/getPlaylistsFromFollowing.js index ef7bbd6f..9faac13d 100755 --- a/packages/server/services/main/controllers/FeedController/services/getPlaylistsFromFollowing.js +++ b/packages/server/services/main/controllers/FeedController/services/getPlaylistsFromFollowing.js @@ -1,4 +1,4 @@ -import { Playlist, User, UserFollow } from "@shared-classes/DbModels" +import { Playlist, User, UserFollow } from "@db_models" export default async (payload) => { const { diff --git a/packages/server/services/main/controllers/FeedController/services/getPosts.js b/packages/server/services/main/controllers/FeedController/services/getPosts.js index c5cbf1db..4d68c706 100755 --- a/packages/server/services/main/controllers/FeedController/services/getPosts.js +++ b/packages/server/services/main/controllers/FeedController/services/getPosts.js @@ -1,4 +1,4 @@ -import { Post, UserFollow } from "@shared-classes/DbModels" +import { Post, UserFollow } from "@db_models" import fullfillPostsData from "@utils/fullfillPostsData" diff --git a/packages/server/services/main/controllers/FeedController/services/getReleasesFromFollowing.js b/packages/server/services/main/controllers/FeedController/services/getReleasesFromFollowing.js index 97488b6b..bd35e20f 100755 --- a/packages/server/services/main/controllers/FeedController/services/getReleasesFromFollowing.js +++ b/packages/server/services/main/controllers/FeedController/services/getReleasesFromFollowing.js @@ -1,4 +1,4 @@ -import { Release, UserFollow } from "@shared-classes/DbModels" +import { Release, UserFollow } from "@db_models" export default async (payload) => { const { diff --git a/packages/server/services/main/controllers/FollowController/endpoints/getFollowStatus.js b/packages/server/services/main/controllers/FollowController/endpoints/getFollowStatus.js index c9934750..1622636d 100755 --- a/packages/server/services/main/controllers/FollowController/endpoints/getFollowStatus.js +++ b/packages/server/services/main/controllers/FollowController/endpoints/getFollowStatus.js @@ -1,4 +1,4 @@ -import { UserFollow } from "@shared-classes/DbModels" +import { UserFollow } from "@db_models" export default { method: "GET", diff --git a/packages/server/services/main/controllers/FollowController/endpoints/getUserFollowers.js b/packages/server/services/main/controllers/FollowController/endpoints/getUserFollowers.js index ca1b7eb1..b4a144e9 100755 --- a/packages/server/services/main/controllers/FollowController/endpoints/getUserFollowers.js +++ b/packages/server/services/main/controllers/FollowController/endpoints/getUserFollowers.js @@ -1,4 +1,4 @@ -import { User, UserFollow } from "@shared-classes/DbModels" +import { User, UserFollow } from "@db_models" export default { method: "GET", diff --git a/packages/server/services/main/controllers/FollowController/endpoints/toggleFollow.js b/packages/server/services/main/controllers/FollowController/endpoints/toggleFollow.js index 58d89bbe..3043512c 100755 --- a/packages/server/services/main/controllers/FollowController/endpoints/toggleFollow.js +++ b/packages/server/services/main/controllers/FollowController/endpoints/toggleFollow.js @@ -1,5 +1,5 @@ import { Schematized } from "@lib" -import { User, UserFollow } from "@shared-classes/DbModels" +import { User, UserFollow } from "@db_models" import followUser from "../services/followUser" import unfollowUser from "../services/unfollowUser" diff --git a/packages/server/services/main/controllers/FollowController/services/followUser.js b/packages/server/services/main/controllers/FollowController/services/followUser.js index f6044842..9232b576 100755 --- a/packages/server/services/main/controllers/FollowController/services/followUser.js +++ b/packages/server/services/main/controllers/FollowController/services/followUser.js @@ -1,4 +1,4 @@ -import { User, UserFollow } from "@shared-classes/DbModels" +import { User, UserFollow } from "@db_models" export default async (payload) => { if (typeof payload.user_id === "undefined") { diff --git a/packages/server/services/main/controllers/FollowController/services/unfollowUser.js b/packages/server/services/main/controllers/FollowController/services/unfollowUser.js index d7218c77..dfd37328 100755 --- a/packages/server/services/main/controllers/FollowController/services/unfollowUser.js +++ b/packages/server/services/main/controllers/FollowController/services/unfollowUser.js @@ -1,4 +1,4 @@ -import { User, UserFollow } from "@shared-classes/DbModels" +import { User, UserFollow } from "@db_models" export default async (payload) => { if (typeof payload.user_id === "undefined") { diff --git a/packages/server/services/main/controllers/ModerationController/endpoints/modifyPostLikes.js b/packages/server/services/main/controllers/ModerationController/endpoints/modifyPostLikes.js index dc5ed26e..36bc80bc 100755 --- a/packages/server/services/main/controllers/ModerationController/endpoints/modifyPostLikes.js +++ b/packages/server/services/main/controllers/ModerationController/endpoints/modifyPostLikes.js @@ -1,4 +1,4 @@ -import { Post, } from "@shared-classes/DbModels" +import { Post, } from "@db_models" import toggleLike from "../../PostsController/services/toggleLike" export default { diff --git a/packages/server/services/main/controllers/NFCController/endpoints/getTagById.js b/packages/server/services/main/controllers/NFCController/endpoints/getTagById.js index 6b7201d5..9eb9b56c 100755 --- a/packages/server/services/main/controllers/NFCController/endpoints/getTagById.js +++ b/packages/server/services/main/controllers/NFCController/endpoints/getTagById.js @@ -1,4 +1,4 @@ -import { User, NFCTag } from "@shared-classes/DbModels" +import { User, NFCTag } from "@db_models" export default { method: "GET", diff --git a/packages/server/services/main/controllers/NFCController/endpoints/getTagBySerial.js b/packages/server/services/main/controllers/NFCController/endpoints/getTagBySerial.js index 489c2189..3d40408d 100755 --- a/packages/server/services/main/controllers/NFCController/endpoints/getTagBySerial.js +++ b/packages/server/services/main/controllers/NFCController/endpoints/getTagBySerial.js @@ -1,4 +1,4 @@ -import { User, NFCTag } from "@shared-classes/DbModels" +import { User, NFCTag } from "@db_models" export default { method: "GET", diff --git a/packages/server/services/main/controllers/NFCController/endpoints/getTags.js b/packages/server/services/main/controllers/NFCController/endpoints/getTags.js index 7fd960ad..3758add0 100755 --- a/packages/server/services/main/controllers/NFCController/endpoints/getTags.js +++ b/packages/server/services/main/controllers/NFCController/endpoints/getTags.js @@ -1,4 +1,4 @@ -import { NFCTag } from "@shared-classes/DbModels" +import { NFCTag } from "@db_models" export default { method: "GET", diff --git a/packages/server/services/main/controllers/NFCController/endpoints/registerTag.js b/packages/server/services/main/controllers/NFCController/endpoints/registerTag.js index 9ec4da71..e9c9e903 100755 --- a/packages/server/services/main/controllers/NFCController/endpoints/registerTag.js +++ b/packages/server/services/main/controllers/NFCController/endpoints/registerTag.js @@ -1,4 +1,4 @@ -import { NFCTag } from "@shared-classes/DbModels" +import { NFCTag } from "@db_models" const allowedUpdateFields = [ "user_id", diff --git a/packages/server/services/main/controllers/PostsController/endpoints/getPostReplies.js b/packages/server/services/main/controllers/PostsController/endpoints/getPostReplies.js index 05fa5cca..bd3571ea 100755 --- a/packages/server/services/main/controllers/PostsController/endpoints/getPostReplies.js +++ b/packages/server/services/main/controllers/PostsController/endpoints/getPostReplies.js @@ -1,4 +1,4 @@ -import { Post } from "@shared-classes/DbModels" +import { Post } from "@db_models" import fullfillPostsData from "@utils/fullfillPostsData" export default { diff --git a/packages/server/services/main/controllers/PostsController/services/createPost.js b/packages/server/services/main/controllers/PostsController/services/createPost.js index c806c225..058b11db 100755 --- a/packages/server/services/main/controllers/PostsController/services/createPost.js +++ b/packages/server/services/main/controllers/PostsController/services/createPost.js @@ -1,5 +1,5 @@ import momentTimezone from "moment-timezone" -import { Post } from "@shared-classes/DbModels" +import { Post } from "@db_models" import getPostData from "./getPostData" import flagNsfwByAttachments from "./flagNsfwByAttachments" diff --git a/packages/server/services/main/controllers/PostsController/services/deletePost.js b/packages/server/services/main/controllers/PostsController/services/deletePost.js index fbed29f3..1d630def 100755 --- a/packages/server/services/main/controllers/PostsController/services/deletePost.js +++ b/packages/server/services/main/controllers/PostsController/services/deletePost.js @@ -1,4 +1,4 @@ -import { Post, User } from "@shared-classes/DbModels" +import { Post, User } from "@db_models" export default async (payload) => { const { post_id, by_user_id } = payload diff --git a/packages/server/services/main/controllers/PostsController/services/flagNsfwByAttachments.js b/packages/server/services/main/controllers/PostsController/services/flagNsfwByAttachments.js index a0e8eac5..27b3d8ec 100755 --- a/packages/server/services/main/controllers/PostsController/services/flagNsfwByAttachments.js +++ b/packages/server/services/main/controllers/PostsController/services/flagNsfwByAttachments.js @@ -1,4 +1,4 @@ -import { Post } from "@shared-classes/DbModels" +import { Post } from "@db_models" import indecentPrediction from "../../../utils/indecent-prediction" import isNSFW from "../../../utils/is-nsfw" diff --git a/packages/server/services/main/controllers/PostsController/services/getPostData.js b/packages/server/services/main/controllers/PostsController/services/getPostData.js index 116442a4..b1cb52cd 100755 --- a/packages/server/services/main/controllers/PostsController/services/getPostData.js +++ b/packages/server/services/main/controllers/PostsController/services/getPostData.js @@ -1,4 +1,4 @@ -import { Post, SavedPost } from "@shared-classes/DbModels" +import { Post, SavedPost } from "@db_models" import fullfillPostsData from "@utils/fullfillPostsData" export default async (payload) => { diff --git a/packages/server/services/main/controllers/PostsController/services/modifyPostData.js b/packages/server/services/main/controllers/PostsController/services/modifyPostData.js index 34aec69f..ac8ee7bb 100755 --- a/packages/server/services/main/controllers/PostsController/services/modifyPostData.js +++ b/packages/server/services/main/controllers/PostsController/services/modifyPostData.js @@ -1,4 +1,4 @@ -import { Post } from "@shared-classes/DbModels" +import { Post } from "@db_models" import getPostData from "./getPostData" export default async (post_id, modification) => { diff --git a/packages/server/services/main/controllers/PostsController/services/toggleLike.js b/packages/server/services/main/controllers/PostsController/services/toggleLike.js index cd49c5ba..3d43da85 100755 --- a/packages/server/services/main/controllers/PostsController/services/toggleLike.js +++ b/packages/server/services/main/controllers/PostsController/services/toggleLike.js @@ -1,4 +1,4 @@ -import { PostLike } from "@shared-classes/DbModels" +import { PostLike } from "@db_models" export default async (payload) => { let { post_id, user_id, to } = payload diff --git a/packages/server/services/main/controllers/PostsController/services/togglePostSave.js b/packages/server/services/main/controllers/PostsController/services/togglePostSave.js index f8959629..fafc6aaa 100755 --- a/packages/server/services/main/controllers/PostsController/services/togglePostSave.js +++ b/packages/server/services/main/controllers/PostsController/services/togglePostSave.js @@ -1,4 +1,4 @@ -import { SavedPost } from "@shared-classes/DbModels" +import { SavedPost } from "@db_models" export default async (payload) => { let { post_id, user_id } = payload diff --git a/packages/server/services/main/controllers/PublicController/endpoints/featuredWallpapers.js b/packages/server/services/main/controllers/PublicController/endpoints/featuredWallpapers.js index 74082ff9..2b92f6f9 100755 --- a/packages/server/services/main/controllers/PublicController/endpoints/featuredWallpapers.js +++ b/packages/server/services/main/controllers/PublicController/endpoints/featuredWallpapers.js @@ -1,4 +1,4 @@ -import { FeaturedWallpaper } from "@shared-classes/DbModels" +import { FeaturedWallpaper } from "@db_models" export default { method: "GET", diff --git a/packages/server/services/main/controllers/PublicController/endpoints/globalServerLimits.js b/packages/server/services/main/controllers/PublicController/endpoints/globalServerLimits.js index 2da1661c..f0701535 100755 --- a/packages/server/services/main/controllers/PublicController/endpoints/globalServerLimits.js +++ b/packages/server/services/main/controllers/PublicController/endpoints/globalServerLimits.js @@ -1,4 +1,4 @@ -import { ServerLimit } from "@shared-classes/DbModels" +import { ServerLimit } from "@db_models" export default { method: "GET", diff --git a/packages/server/services/main/controllers/RolesController/index.js b/packages/server/services/main/controllers/RolesController/index.js index 6785e1a2..ce55cfdf 100755 --- a/packages/server/services/main/controllers/RolesController/index.js +++ b/packages/server/services/main/controllers/RolesController/index.js @@ -1,5 +1,5 @@ import { Controller } from "linebridge/dist/server" -import { Role, User } from "@shared-classes/DbModels" +import { Role, User } from "@db_models" import { Schematized } from "@lib" export default class RolesController extends Controller { diff --git a/packages/server/services/main/controllers/SearchController/endpoints/getSearch.js b/packages/server/services/main/controllers/SearchController/endpoints/getSearch.js index df766564..933e54d8 100755 --- a/packages/server/services/main/controllers/SearchController/endpoints/getSearch.js +++ b/packages/server/services/main/controllers/SearchController/endpoints/getSearch.js @@ -1,4 +1,4 @@ -import { User, Playlist, Track } from "@shared-classes/DbModels" +import { User, Playlist, Track } from "@db_models" import pmap from "p-map" export default { diff --git a/packages/server/services/main/controllers/SessionController/endpoints/deleteCurrentSession.js b/packages/server/services/main/controllers/SessionController/endpoints/deleteCurrentSession.js index dec3c53b..50539469 100755 --- a/packages/server/services/main/controllers/SessionController/endpoints/deleteCurrentSession.js +++ b/packages/server/services/main/controllers/SessionController/endpoints/deleteCurrentSession.js @@ -1,4 +1,4 @@ -import { Session } from "@shared-classes/DbModels" +import { Session } from "@db_models" export default { method: "DELETE", diff --git a/packages/server/services/main/controllers/SessionController/endpoints/getSessions.js b/packages/server/services/main/controllers/SessionController/endpoints/getSessions.js index 9ffa0d3b..ba452c32 100755 --- a/packages/server/services/main/controllers/SessionController/endpoints/getSessions.js +++ b/packages/server/services/main/controllers/SessionController/endpoints/getSessions.js @@ -1,4 +1,4 @@ -import { Session } from "@shared-classes/DbModels" +import { Session } from "@db_models" export default { method: "GET", diff --git a/packages/server/services/main/controllers/StatusController/services/getConnectedUsersFollowing.js b/packages/server/services/main/controllers/StatusController/services/getConnectedUsersFollowing.js index ba49b8d1..b78d51ae 100755 --- a/packages/server/services/main/controllers/StatusController/services/getConnectedUsersFollowing.js +++ b/packages/server/services/main/controllers/StatusController/services/getConnectedUsersFollowing.js @@ -1,4 +1,4 @@ -import { UserFollow } from "@shared-classes/DbModels" +import { UserFollow } from "@db_models" export default async (payload = {}) => { const { from_user_id, limit = 10, offset = 0 } = payload diff --git a/packages/server/services/main/controllers/StreamingController/endpoints/deleteStreamingProfile.js b/packages/server/services/main/controllers/StreamingController/endpoints/deleteStreamingProfile.js index fd04f377..19deaa4c 100755 --- a/packages/server/services/main/controllers/StreamingController/endpoints/deleteStreamingProfile.js +++ b/packages/server/services/main/controllers/StreamingController/endpoints/deleteStreamingProfile.js @@ -1,4 +1,4 @@ -import { StreamingProfile } from "@shared-classes/DbModels" +import { StreamingProfile } from "@db_models" export default { method: "DELETE", diff --git a/packages/server/services/main/controllers/StreamingController/endpoints/getProfileFromStreamKey.js b/packages/server/services/main/controllers/StreamingController/endpoints/getProfileFromStreamKey.js index 32269671..8de0f6f2 100755 --- a/packages/server/services/main/controllers/StreamingController/endpoints/getProfileFromStreamKey.js +++ b/packages/server/services/main/controllers/StreamingController/endpoints/getProfileFromStreamKey.js @@ -1,4 +1,4 @@ -import { StreamingProfile } from "@shared-classes/DbModels" +import { StreamingProfile } from "@db_models" export default { method: "GET", diff --git a/packages/server/services/main/controllers/StreamingController/endpoints/getProfilesVisibility.js b/packages/server/services/main/controllers/StreamingController/endpoints/getProfilesVisibility.js index 5d968b39..d83ad2b7 100755 --- a/packages/server/services/main/controllers/StreamingController/endpoints/getProfilesVisibility.js +++ b/packages/server/services/main/controllers/StreamingController/endpoints/getProfilesVisibility.js @@ -1,4 +1,4 @@ -import { StreamingProfile } from "@shared-classes/DbModels" +import { StreamingProfile } from "@db_models" export default { method: "GET", diff --git a/packages/server/services/main/controllers/StreamingController/endpoints/getStreamingCategories.js b/packages/server/services/main/controllers/StreamingController/endpoints/getStreamingCategories.js index 86e7f474..53db7e0e 100755 --- a/packages/server/services/main/controllers/StreamingController/endpoints/getStreamingCategories.js +++ b/packages/server/services/main/controllers/StreamingController/endpoints/getStreamingCategories.js @@ -1,4 +1,4 @@ -import { StreamingCategory } from "@shared-classes/DbModels" +import { StreamingCategory } from "@db_models" export default { method: "GET", diff --git a/packages/server/services/main/controllers/StreamingController/endpoints/getStreamingProfiles.js b/packages/server/services/main/controllers/StreamingController/endpoints/getStreamingProfiles.js index f92b53b1..1507dd2d 100755 --- a/packages/server/services/main/controllers/StreamingController/endpoints/getStreamingProfiles.js +++ b/packages/server/services/main/controllers/StreamingController/endpoints/getStreamingProfiles.js @@ -1,4 +1,4 @@ -import { StreamingProfile } from "@shared-classes/DbModels" +import { StreamingProfile } from "@db_models" import NewStreamingProfile from "@services/newStreamingProfile" import composeStreamingSources from "@utils/compose-streaming-sources" diff --git a/packages/server/services/main/controllers/StreamingController/endpoints/handleStreamPublish.js b/packages/server/services/main/controllers/StreamingController/endpoints/handleStreamPublish.js index 27810578..39c0086c 100755 --- a/packages/server/services/main/controllers/StreamingController/endpoints/handleStreamPublish.js +++ b/packages/server/services/main/controllers/StreamingController/endpoints/handleStreamPublish.js @@ -1,4 +1,4 @@ -import { StreamingProfile, User } from "@shared-classes/DbModels" +import { StreamingProfile, User } from "@db_models" export default { method: "POST", diff --git a/packages/server/services/main/controllers/StreamingController/endpoints/handleStreamUnpublish.js b/packages/server/services/main/controllers/StreamingController/endpoints/handleStreamUnpublish.js index 062bb157..a5545532 100755 --- a/packages/server/services/main/controllers/StreamingController/endpoints/handleStreamUnpublish.js +++ b/packages/server/services/main/controllers/StreamingController/endpoints/handleStreamUnpublish.js @@ -1,4 +1,4 @@ -import { StreamingProfile } from "@shared-classes/DbModels" +import { StreamingProfile } from "@db_models" export default { method: "POST", diff --git a/packages/server/services/main/controllers/StreamingController/endpoints/postStreamingProfile.js b/packages/server/services/main/controllers/StreamingController/endpoints/postStreamingProfile.js index 3bedabce..d76948f8 100755 --- a/packages/server/services/main/controllers/StreamingController/endpoints/postStreamingProfile.js +++ b/packages/server/services/main/controllers/StreamingController/endpoints/postStreamingProfile.js @@ -1,4 +1,4 @@ -import { StreamingProfile } from "@shared-classes/DbModels" +import { StreamingProfile } from "@db_models" import NewStreamingProfile from "@services/newStreamingProfile" const AllowedChangesFields = ["profile_name", "info", "options"] diff --git a/packages/server/services/main/controllers/StreamingController/endpoints/regenerateStreamingKey.js b/packages/server/services/main/controllers/StreamingController/endpoints/regenerateStreamingKey.js index 6a2bf2db..33de6b5c 100755 --- a/packages/server/services/main/controllers/StreamingController/endpoints/regenerateStreamingKey.js +++ b/packages/server/services/main/controllers/StreamingController/endpoints/regenerateStreamingKey.js @@ -1,4 +1,4 @@ -import { StreamingProfile } from "@shared-classes/DbModels" +import { StreamingProfile } from "@db_models" export default { method: "POST", diff --git a/packages/server/services/main/controllers/UserController/endpoints/checkEmailAvailable.js b/packages/server/services/main/controllers/UserController/endpoints/checkEmailAvailable.js index f22e01b1..629153c7 100755 --- a/packages/server/services/main/controllers/UserController/endpoints/checkEmailAvailable.js +++ b/packages/server/services/main/controllers/UserController/endpoints/checkEmailAvailable.js @@ -1,4 +1,4 @@ -import { User } from "@shared-classes/DbModels" +import { User } from "@db_models" export default { method: "GET", diff --git a/packages/server/services/main/controllers/UserController/endpoints/checkUsernameAvailable.js b/packages/server/services/main/controllers/UserController/endpoints/checkUsernameAvailable.js index 62e53738..64d2066a 100755 --- a/packages/server/services/main/controllers/UserController/endpoints/checkUsernameAvailable.js +++ b/packages/server/services/main/controllers/UserController/endpoints/checkUsernameAvailable.js @@ -1,4 +1,4 @@ -import { User } from "@shared-classes/DbModels" +import { User } from "@db_models" export default { method: "GET", diff --git a/packages/server/services/main/controllers/UserController/endpoints/getUserData.js b/packages/server/services/main/controllers/UserController/endpoints/getUserData.js index b0901c0a..328fc93a 100755 --- a/packages/server/services/main/controllers/UserController/endpoints/getUserData.js +++ b/packages/server/services/main/controllers/UserController/endpoints/getUserData.js @@ -1,5 +1,5 @@ import lodash from "lodash" -import { User } from "@shared-classes/DbModels" +import { User } from "@db_models" const publicGetters = [ "_id", diff --git a/packages/server/services/main/controllers/UserController/endpoints/getUsersData.js b/packages/server/services/main/controllers/UserController/endpoints/getUsersData.js index 34cd1771..047af1a7 100755 --- a/packages/server/services/main/controllers/UserController/endpoints/getUsersData.js +++ b/packages/server/services/main/controllers/UserController/endpoints/getUsersData.js @@ -1,5 +1,5 @@ import { Schematized } from "@lib" -import { User } from "@shared-classes/DbModels" +import { User } from "@db_models" export default { method: "GET", diff --git a/packages/server/services/main/controllers/UserController/endpoints/resolveUserIdFromUsername.js b/packages/server/services/main/controllers/UserController/endpoints/resolveUserIdFromUsername.js index 5003e843..bb97b4ae 100755 --- a/packages/server/services/main/controllers/UserController/endpoints/resolveUserIdFromUsername.js +++ b/packages/server/services/main/controllers/UserController/endpoints/resolveUserIdFromUsername.js @@ -1,4 +1,4 @@ -import { User } from "@shared-classes/DbModels" +import { User } from "@db_models" export default { method: "GET", diff --git a/packages/server/services/main/controllers/UserController/endpoints/selfUpdateData.js b/packages/server/services/main/controllers/UserController/endpoints/selfUpdateData.js index 876f9f45..24092de5 100755 --- a/packages/server/services/main/controllers/UserController/endpoints/selfUpdateData.js +++ b/packages/server/services/main/controllers/UserController/endpoints/selfUpdateData.js @@ -1,5 +1,5 @@ import { Schematized } from "@lib" -import { User } from "@shared-classes/DbModels" +import { User } from "@db_models" import UpdateUserData from "../services/updateUserData" const AllowedPublicUpdateFields = [ diff --git a/packages/server/services/main/controllers/UserController/endpoints/selfUpdatePassword.js b/packages/server/services/main/controllers/UserController/endpoints/selfUpdatePassword.js index 2b28fa71..81726277 100755 --- a/packages/server/services/main/controllers/UserController/endpoints/selfUpdatePassword.js +++ b/packages/server/services/main/controllers/UserController/endpoints/selfUpdatePassword.js @@ -1,5 +1,5 @@ import { Schematized } from "@lib" -import { User } from "@shared-classes/DbModels" +import { User } from "@db_models" import updateUserPassword from "../services/updateUserPassword" import bcrypt from "bcrypt" diff --git a/packages/server/services/main/controllers/UserController/services/createUser.js b/packages/server/services/main/controllers/UserController/services/createUser.js index bbefe56e..d7683558 100755 --- a/packages/server/services/main/controllers/UserController/services/createUser.js +++ b/packages/server/services/main/controllers/UserController/services/createUser.js @@ -1,4 +1,4 @@ -import { User } from "@shared-classes/DbModels" +import { User } from "@db_models" import Avatars from "dicebar_lib" import bcrypt from "bcrypt" diff --git a/packages/server/services/main/controllers/UserController/services/getConnectedUsersFollowing.js b/packages/server/services/main/controllers/UserController/services/getConnectedUsersFollowing.js index 3ade4cc3..4cdfa5c1 100755 --- a/packages/server/services/main/controllers/UserController/services/getConnectedUsersFollowing.js +++ b/packages/server/services/main/controllers/UserController/services/getConnectedUsersFollowing.js @@ -1,4 +1,4 @@ -import { UserFollow } from "@shared-classes/DbModels" +import { UserFollow } from "@db_models" export default async (payload = {}) => { const { from_user_id } = payload diff --git a/packages/server/services/main/controllers/UserController/services/updateUserData.js b/packages/server/services/main/controllers/UserController/services/updateUserData.js index 2933c519..abc1cdcf 100755 --- a/packages/server/services/main/controllers/UserController/services/updateUserData.js +++ b/packages/server/services/main/controllers/UserController/services/updateUserData.js @@ -1,4 +1,4 @@ -import { User } from "@shared-classes/DbModels" +import { User } from "@db_models" export default async (payload) => { if (typeof payload.user_id === "undefined") { diff --git a/packages/server/services/main/controllers/UserController/services/updateUserPassword.js b/packages/server/services/main/controllers/UserController/services/updateUserPassword.js index b7b85706..9a4f18da 100755 --- a/packages/server/services/main/controllers/UserController/services/updateUserPassword.js +++ b/packages/server/services/main/controllers/UserController/services/updateUserPassword.js @@ -1,4 +1,4 @@ -import { User } from "@shared-classes/DbModels" +import { User } from "@db_models" import bcrypt from "bcrypt" export default async function (payload) { diff --git a/packages/server/services/main/events/user_connected.js b/packages/server/services/main/events/user_connected.js index b1236f9e..eaaba81d 100755 --- a/packages/server/services/main/events/user_connected.js +++ b/packages/server/services/main/events/user_connected.js @@ -1,4 +1,4 @@ -import { UserFollow } from "@shared-classes/DbModels" +import { UserFollow } from "@db_models" export default async (user_id) => { // get followers of the user diff --git a/packages/server/services/main/events/user_created.js b/packages/server/services/main/events/user_created.js index a2af95d5..0084fe02 100755 --- a/packages/server/services/main/events/user_created.js +++ b/packages/server/services/main/events/user_created.js @@ -1,4 +1,4 @@ -import { User, UserFollow } from "@shared-classes/DbModels" +import { User, UserFollow } from "@db_models" export default async function (userData) { // diff --git a/packages/server/services/main/events/user_disconnected.js b/packages/server/services/main/events/user_disconnected.js index f4898adf..affca7d0 100755 --- a/packages/server/services/main/events/user_disconnected.js +++ b/packages/server/services/main/events/user_disconnected.js @@ -1,4 +1,4 @@ -import { UserFollow } from "@shared-classes/DbModels" +import { UserFollow } from "@db_models" export default async (user_id) => { // get followers of the user diff --git a/packages/server/services/main/fixments/additions_to_attachments.js b/packages/server/services/main/fixments/additions_to_attachments.js index 25dc8131..58634d7b 100755 --- a/packages/server/services/main/fixments/additions_to_attachments.js +++ b/packages/server/services/main/fixments/additions_to_attachments.js @@ -1,4 +1,4 @@ -import { Post } from "@shared-classes/DbModels" +import { Post } from "@db_models" import DBManager from "../classes/DbManager" async function main() { diff --git a/packages/server/services/main/fixments/migrate_posts_likes.js b/packages/server/services/main/fixments/migrate_posts_likes.js index cc1ba694..81d3b0bf 100755 --- a/packages/server/services/main/fixments/migrate_posts_likes.js +++ b/packages/server/services/main/fixments/migrate_posts_likes.js @@ -3,7 +3,7 @@ require("dotenv").config() import fs from "fs" import path from "path" -import { Post, PostLike } from "@shared-classes/DbModels" +import { Post, PostLike } from "@db_models" import { performance } from "perf_hooks" import DBManager from "../classes/DbManager" diff --git a/packages/server/services/main/fixments/move_playlist_to_release.js b/packages/server/services/main/fixments/move_playlist_to_release.js index b6373df8..db0a7cae 100755 --- a/packages/server/services/main/fixments/move_playlist_to_release.js +++ b/packages/server/services/main/fixments/move_playlist_to_release.js @@ -1,4 +1,4 @@ -import { Release, Playlist } from "@shared-classes/DbModels" +import { Release, Playlist } from "@db_models" import DBManager from "@shared-classes/DbManager" async function main() { diff --git a/packages/server/services/main/lib/checkUserAdmin/index.js b/packages/server/services/main/lib/checkUserAdmin/index.js index 64e40724..3c999e4e 100755 --- a/packages/server/services/main/lib/checkUserAdmin/index.js +++ b/packages/server/services/main/lib/checkUserAdmin/index.js @@ -1,4 +1,4 @@ -import { User } from "@shared-classes/DbModels" +import { User } from "@db_models" export default async (user_id) => { if (!user_id) { diff --git a/packages/server/services/main/lib/token/index.js b/packages/server/services/main/lib/token/index.js index 90178cf6..0cfe9b51 100755 --- a/packages/server/services/main/lib/token/index.js +++ b/packages/server/services/main/lib/token/index.js @@ -1,5 +1,5 @@ import jwt from "jsonwebtoken" -import { Session, RegenerationToken } from "@shared-classes/DbModels" +import { Session, RegenerationToken } from "@db_models" export default class Token { static async createNewAuthToken(payload, options = {}) { diff --git a/packages/server/services/main/main.service.js b/packages/server/services/main/main.service.js index bbce8741..0b2c4f98 100755 --- a/packages/server/services/main/main.service.js +++ b/packages/server/services/main/main.service.js @@ -1,13 +1,14 @@ import { Server } from "linebridge/src/server" -import { Config, User } from "@shared-classes/DbModels" +import { Config, User } from "@db_models" import DbManager from "@shared-classes/DbManager" import StorageClient from "@shared-classes/StorageClient" import Token from "@lib/token" export default class API extends Server { - static refName = "MAIN-API" + static refName = "main" + static useEngine = "hyper-express" static listen_port = process.env.HTTP_LISTEN_PORT || 3000 static requireWSAuth = true @@ -19,13 +20,6 @@ export default class API extends Server { maximumFileSize: 80 * 1024 * 1024, maximunFilesPerRequest: 20, } - - global.jwtStrategy = { - secretOrKey: process.env.JWT_SECRET, - expiresIn: "1h", - algorithm: "HS256", - enforceRegenerationTokenExpiration: false, - } } middlewares = require("@middlewares") diff --git a/packages/server/services/main/middlewares/permissions/index.js b/packages/server/services/main/middlewares/permissions/index.js index 4c4f1dae..161c1b6e 100755 --- a/packages/server/services/main/middlewares/permissions/index.js +++ b/packages/server/services/main/middlewares/permissions/index.js @@ -1,4 +1,4 @@ -import { Config } from "@shared-classes/DbModels" +import { Config } from "@db_models" export default (req, res, next) => { const requestedPath = `${req.method.toLowerCase()}${req.path.toLowerCase()}` diff --git a/packages/server/services/main/middlewares/withAuthentication/index.js b/packages/server/services/main/middlewares/withAuthentication/index.js index 9df7da86..73b852b8 100755 --- a/packages/server/services/main/middlewares/withAuthentication/index.js +++ b/packages/server/services/main/middlewares/withAuthentication/index.js @@ -1,4 +1,4 @@ -import { Session, User, authorizedServerTokens } from "@shared-classes/DbModels" +import { Session, User, authorizedServerTokens } from "@db_models" import createTokenRegeneration from "@utils/createTokenRegeneration" diff --git a/packages/server/services/main/package.json b/packages/server/services/main/package.json index 3175c278..27c06dc5 100755 --- a/packages/server/services/main/package.json +++ b/packages/server/services/main/package.json @@ -27,7 +27,6 @@ "normalize-url": "^8.0.0", "nsfwjs": "^3.0.0", "p-map": "^4.0.0", - "p-queue": "^7.3.4", - "sharp": "^0.33.2" + "p-queue": "^7.3.4" } } diff --git a/packages/server/services/main/services/fetchRemoteStreams/index.js b/packages/server/services/main/services/fetchRemoteStreams/index.js index 564ced96..d2ee5e77 100755 --- a/packages/server/services/main/services/fetchRemoteStreams/index.js +++ b/packages/server/services/main/services/fetchRemoteStreams/index.js @@ -1,6 +1,6 @@ import axios from "axios" -import { StreamingCategory, StreamingProfile, User } from "@shared-classes/DbModels" +import { StreamingCategory, StreamingProfile, User } from "@db_models" import composeStreamingSources from "@utils/compose-streaming-sources" import lodash from "lodash" diff --git a/packages/server/services/main/services/getMutuals/index.js b/packages/server/services/main/services/getMutuals/index.js index c9b7629d..36eaabd9 100755 --- a/packages/server/services/main/services/getMutuals/index.js +++ b/packages/server/services/main/services/getMutuals/index.js @@ -1,4 +1,4 @@ -import { User, UserFollow } from "@shared-classes/DbModels" +import { User, UserFollow } from "@db_models" // TODO: Sort follows by last activity export default async (payload = {}) => { diff --git a/packages/server/services/main/services/newStreamingProfile/index.js b/packages/server/services/main/services/newStreamingProfile/index.js index 904faaba..d22ff253 100755 --- a/packages/server/services/main/services/newStreamingProfile/index.js +++ b/packages/server/services/main/services/newStreamingProfile/index.js @@ -1,4 +1,4 @@ -import { StreamingProfile } from "@shared-classes/DbModels" +import { StreamingProfile } from "@db_models" export default async (profile = {}) => { if (!profile.user_id) { diff --git a/packages/server/services/main/setup/authorizeSelfServerToken/index.js b/packages/server/services/main/setup/authorizeSelfServerToken/index.js index d79f3ba3..84087e0b 100755 --- a/packages/server/services/main/setup/authorizeSelfServerToken/index.js +++ b/packages/server/services/main/setup/authorizeSelfServerToken/index.js @@ -1,5 +1,5 @@ import SecureEntry from "@lib/secureEntry" -import { authorizedServerTokens } from "@shared-classes/DbModels" +import { authorizedServerTokens } from "@db_models" const rootClientID = "00000000-0000-0000-000000000000" diff --git a/packages/server/services/main/setup/dbAdmin/index.js b/packages/server/services/main/setup/dbAdmin/index.js index 3b959597..de513af3 100755 --- a/packages/server/services/main/setup/dbAdmin/index.js +++ b/packages/server/services/main/setup/dbAdmin/index.js @@ -1,4 +1,4 @@ -import { User } from "@shared-classes/DbModels" +import { User } from "@db_models" import createUser from "@controllers/UserController/services/createUser" export default async () => { diff --git a/packages/server/services/main/utils/fullfillPostsData/index.js b/packages/server/services/main/utils/fullfillPostsData/index.js index 5a3d625f..33abd8fc 100755 --- a/packages/server/services/main/utils/fullfillPostsData/index.js +++ b/packages/server/services/main/utils/fullfillPostsData/index.js @@ -1,4 +1,4 @@ -import { User, Comment, PostLike, SavedPost } from "@shared-classes/DbModels" +import { User, Comment, PostLike, SavedPost } from "@db_models" export default async (payload) => { let { diff --git a/packages/server/services/marketplace/controllers/widgets/routes/get/:widgetId/debug.jsx b/packages/server/services/marketplace/controllers/widgets/routes/get/:widgetId/debug.jsx index 65740230..e40411cd 100755 --- a/packages/server/services/marketplace/controllers/widgets/routes/get/:widgetId/debug.jsx +++ b/packages/server/services/marketplace/controllers/widgets/routes/get/:widgetId/debug.jsx @@ -1,4 +1,4 @@ -import { Widget } from "@shared-classes/DbModels" +import { Widget } from "@db_models" import getWidgetCode from "@utils/getWidgetCode" export default async (req, res) => { diff --git a/packages/server/services/marketplace/controllers/widgets/routes/get/:widgetId/manifest.js b/packages/server/services/marketplace/controllers/widgets/routes/get/:widgetId/manifest.js index 49db7f14..be6714c6 100755 --- a/packages/server/services/marketplace/controllers/widgets/routes/get/:widgetId/manifest.js +++ b/packages/server/services/marketplace/controllers/widgets/routes/get/:widgetId/manifest.js @@ -1,4 +1,4 @@ -import { Widget } from "@shared-classes/DbModels" +import { Widget } from "@db_models" export default async (req, res) => { const widget_id = req.params.widgetId diff --git a/packages/server/services/marketplace/controllers/widgets/routes/get/index.js b/packages/server/services/marketplace/controllers/widgets/routes/get/index.js index 4db090ed..29483cb8 100755 --- a/packages/server/services/marketplace/controllers/widgets/routes/get/index.js +++ b/packages/server/services/marketplace/controllers/widgets/routes/get/index.js @@ -1,4 +1,4 @@ -import { Widget } from "@shared-classes/DbModels" +import { Widget } from "@db_models" export default async (req, res) => { let { limit = 20, offset = 0, keywords } = req.query diff --git a/packages/server/services/marketplace/controllers/widgets/routes/get/user/:user_id.js b/packages/server/services/marketplace/controllers/widgets/routes/get/user/:user_id.js index f1ef6a75..c31b52b9 100755 --- a/packages/server/services/marketplace/controllers/widgets/routes/get/user/:user_id.js +++ b/packages/server/services/marketplace/controllers/widgets/routes/get/user/:user_id.js @@ -1,4 +1,4 @@ -import { Widget } from "@shared-classes/DbModels" +import { Widget } from "@db_models" export default async (req, res) => { const { user_id } = req.params diff --git a/packages/server/services/marketplace/controllers/widgets/routes/post/publish.js b/packages/server/services/marketplace/controllers/widgets/routes/post/publish.js index ea298905..036e7ceb 100755 --- a/packages/server/services/marketplace/controllers/widgets/routes/post/publish.js +++ b/packages/server/services/marketplace/controllers/widgets/routes/post/publish.js @@ -5,7 +5,7 @@ import path from "path" import syncFolder from "@utils/syncDirToRemote" -import { Widget } from "@shared-classes/DbModels" +import { Widget } from "@db_models" const tmpPath = path.join(process.cwd(), ".tmp") diff --git a/packages/server/services/marketplace/utils/getWidgetCode/index.js b/packages/server/services/marketplace/utils/getWidgetCode/index.js index 207ba0a7..49544c8e 100755 --- a/packages/server/services/marketplace/utils/getWidgetCode/index.js +++ b/packages/server/services/marketplace/utils/getWidgetCode/index.js @@ -1,4 +1,4 @@ -import { Widget } from "@shared-classes/DbModels" +import { Widget } from "@db_models" import compileWidgetCode from "@utils/compileWidgetCode" import path from "path" diff --git a/packages/server/services/music/controllers/featured/routes/get/playlists.js b/packages/server/services/music/controllers/featured/routes/get/playlists.js index 206f633a..354ffa54 100755 --- a/packages/server/services/music/controllers/featured/routes/get/playlists.js +++ b/packages/server/services/music/controllers/featured/routes/get/playlists.js @@ -1,4 +1,4 @@ -import { FeaturedPlaylist } from "@shared-classes/DbModels" +import { FeaturedPlaylist } from "@db_models" export default async (req, res) => { const includeDisabled = req.query["include-disabled"] === "true" diff --git a/packages/server/services/music/controllers/lyrics/routes/get/:track_id.js b/packages/server/services/music/controllers/lyrics/routes/get/:track_id.js index 6e6df77d..09ff199a 100755 --- a/packages/server/services/music/controllers/lyrics/routes/get/:track_id.js +++ b/packages/server/services/music/controllers/lyrics/routes/get/:track_id.js @@ -1,4 +1,4 @@ -import { Track } from "@shared-classes/DbModels" +import { Track } from "@db_models" import getEnhancedLyricsFromTrack from "@services/getEnhancedLyricsFromTrack" export default async (req, res) => { diff --git a/packages/server/services/music/controllers/playlists/routes/delete/:playlist_id.js b/packages/server/services/music/controllers/playlists/routes/delete/:playlist_id.js index 89326824..ea61bbd9 100755 --- a/packages/server/services/music/controllers/playlists/routes/delete/:playlist_id.js +++ b/packages/server/services/music/controllers/playlists/routes/delete/:playlist_id.js @@ -1,4 +1,4 @@ -import { Playlist, Track } from "@shared-classes/DbModels" +import { Playlist, Track } from "@db_models" import { AuthorizationError, PermissionError, NotFoundError } from "@shared-classes/Errors" import RemoveTracks from "@services/removeTracks" diff --git a/packages/server/services/music/controllers/playlists/routes/get/:playlist_id/data.js b/packages/server/services/music/controllers/playlists/routes/get/:playlist_id/data.js index b289dc35..9e205a5c 100755 --- a/packages/server/services/music/controllers/playlists/routes/get/:playlist_id/data.js +++ b/packages/server/services/music/controllers/playlists/routes/get/:playlist_id/data.js @@ -1,4 +1,4 @@ -import { Playlist, Release, TrackLike, Track } from "@shared-classes/DbModels" +import { Playlist, Release, TrackLike, Track } from "@db_models" import { NotFoundError } from "@shared-classes/Errors" export default async (req, res) => { diff --git a/packages/server/services/music/controllers/playlists/routes/get/search.js b/packages/server/services/music/controllers/playlists/routes/get/search.js index 0be2540d..b8621aea 100755 --- a/packages/server/services/music/controllers/playlists/routes/get/search.js +++ b/packages/server/services/music/controllers/playlists/routes/get/search.js @@ -1,4 +1,4 @@ -import { Playlist, Track } from "@shared-classes/DbModels" +import { Playlist, Track } from "@db_models" export default async (req, res) => { const { keywords, limit = 5, offset = 0 } = req.query diff --git a/packages/server/services/music/controllers/playlists/routes/get/self.js b/packages/server/services/music/controllers/playlists/routes/get/self.js index 4d478f82..5d35ea66 100755 --- a/packages/server/services/music/controllers/playlists/routes/get/self.js +++ b/packages/server/services/music/controllers/playlists/routes/get/self.js @@ -1,4 +1,4 @@ -import { Playlist, Release, Track } from "@shared-classes/DbModels" +import { Playlist, Release, Track } from "@db_models" import { AuthorizationError, NotFoundError } from "@shared-classes/Errors" export default async (req, res) => { diff --git a/packages/server/services/music/controllers/playlists/routes/post/new.js b/packages/server/services/music/controllers/playlists/routes/post/new.js index 4073a451..f94da757 100755 --- a/packages/server/services/music/controllers/playlists/routes/post/new.js +++ b/packages/server/services/music/controllers/playlists/routes/post/new.js @@ -1,4 +1,4 @@ -import { Playlist } from "@shared-classes/DbModels" +import { Playlist } from "@db_models" import { AuthorizationError } from "@shared-classes/Errors" export default async (req, res) => { diff --git a/packages/server/services/music/controllers/playlists/services/getTrackById.js b/packages/server/services/music/controllers/playlists/services/getTrackById.js index 2324cfbc..4962ac8f 100755 --- a/packages/server/services/music/controllers/playlists/services/getTrackById.js +++ b/packages/server/services/music/controllers/playlists/services/getTrackById.js @@ -1,4 +1,4 @@ -import { Track } from "@shared-classes/DbModels" +import { Track } from "@db_models" export default async (_id) => { if (!_id) { diff --git a/packages/server/services/music/controllers/releases/routes/delete/:release_id.js b/packages/server/services/music/controllers/releases/routes/delete/:release_id.js index 1fffcdce..dc90cfd7 100755 --- a/packages/server/services/music/controllers/releases/routes/delete/:release_id.js +++ b/packages/server/services/music/controllers/releases/routes/delete/:release_id.js @@ -1,4 +1,4 @@ -import { Release } from "@shared-classes/DbModels" +import { Release } from "@db_models" import { AuthorizationError, PermissionError, NotFoundError } from "@shared-classes/Errors" import RemoveTracks from "@services/removeTracks" diff --git a/packages/server/services/music/controllers/releases/routes/get/:release_id/data.js b/packages/server/services/music/controllers/releases/routes/get/:release_id/data.js index 0f387104..3d942bcb 100755 --- a/packages/server/services/music/controllers/releases/routes/get/:release_id/data.js +++ b/packages/server/services/music/controllers/releases/routes/get/:release_id/data.js @@ -1,4 +1,4 @@ -import { Release, TrackLike, Track } from "@shared-classes/DbModels" +import { Release, TrackLike, Track } from "@db_models" import { NotFoundError } from "@shared-classes/Errors" export default async (req, res) => { diff --git a/packages/server/services/music/controllers/releases/routes/get/self.js b/packages/server/services/music/controllers/releases/routes/get/self.js index 4d2e04ac..6586db33 100755 --- a/packages/server/services/music/controllers/releases/routes/get/self.js +++ b/packages/server/services/music/controllers/releases/routes/get/self.js @@ -1,4 +1,4 @@ -import { Release, Track } from "@shared-classes/DbModels" +import { Release, Track } from "@db_models" import { AuthorizationError, NotFoundError } from "@shared-classes/Errors" export default async (req, res) => { diff --git a/packages/server/services/music/controllers/releases/routes/get/user/:user_id.js b/packages/server/services/music/controllers/releases/routes/get/user/:user_id.js index 681c59b3..a00507e1 100755 --- a/packages/server/services/music/controllers/releases/routes/get/user/:user_id.js +++ b/packages/server/services/music/controllers/releases/routes/get/user/:user_id.js @@ -1,4 +1,4 @@ -import { Release } from "@shared-classes/DbModels" +import { Release } from "@db_models" export default async (req, res) => { if (!req.session) { diff --git a/packages/server/services/music/controllers/releases/routes/put/release.js b/packages/server/services/music/controllers/releases/routes/put/release.js index 46cce3a7..61647fd1 100755 --- a/packages/server/services/music/controllers/releases/routes/put/release.js +++ b/packages/server/services/music/controllers/releases/routes/put/release.js @@ -1,4 +1,4 @@ -import { Release, Track } from "@shared-classes/DbModels" +import { Release, Track } from "@db_models" import { AuthorizationError, NotFoundError, PermissionError, BadRequestError } from "@shared-classes/Errors" import axios from "axios" diff --git a/packages/server/services/music/controllers/search/index.js b/packages/server/services/music/controllers/search/index.js index 2a6e4206..78f97c69 100755 --- a/packages/server/services/music/controllers/search/index.js +++ b/packages/server/services/music/controllers/search/index.js @@ -1,4 +1,4 @@ -import { Release, Playlist, Track } from "@shared-classes/DbModels" +import { Release, Playlist, Track } from "@db_models" import TidalAPI from "@shared-classes/TidalAPI" async function searchRoute(req, res) { diff --git a/packages/server/services/music/controllers/tracks/routes/delete/:track_id/like.js b/packages/server/services/music/controllers/tracks/routes/delete/:track_id/like.js index f62088af..8d8e6dc6 100755 --- a/packages/server/services/music/controllers/tracks/routes/delete/:track_id/like.js +++ b/packages/server/services/music/controllers/tracks/routes/delete/:track_id/like.js @@ -1,4 +1,4 @@ -import { TrackLike, Track } from "@shared-classes/DbModels" +import { TrackLike, Track } from "@db_models" import { AuthorizationError, NotFoundError } from "@shared-classes/Errors" export default async (req, res) => { diff --git a/packages/server/services/music/controllers/tracks/routes/get/:track_id/data.js b/packages/server/services/music/controllers/tracks/routes/get/:track_id/data.js index cd255421..2351fe5a 100755 --- a/packages/server/services/music/controllers/tracks/routes/get/:track_id/data.js +++ b/packages/server/services/music/controllers/tracks/routes/get/:track_id/data.js @@ -1,4 +1,4 @@ -import { Track } from "@shared-classes/DbModels" +import { Track } from "@db_models" import { NotFoundError } from "@shared-classes/Errors" export default async (req, res) => { diff --git a/packages/server/services/music/controllers/tracks/routes/get/:track_id/stream.js b/packages/server/services/music/controllers/tracks/routes/get/:track_id/stream.js index 57a3156b..2a1eaa7c 100755 --- a/packages/server/services/music/controllers/tracks/routes/get/:track_id/stream.js +++ b/packages/server/services/music/controllers/tracks/routes/get/:track_id/stream.js @@ -1,4 +1,4 @@ -import { Track } from "@shared-classes/DbModels" +import { Track } from "@db_models" import { NotFoundError, InternalServerError } from "@shared-classes/Errors" import mimetypes from "mime-types" diff --git a/packages/server/services/music/controllers/tracks/routes/get/liked.js b/packages/server/services/music/controllers/tracks/routes/get/liked.js index 4eda7bac..8a2b661b 100755 --- a/packages/server/services/music/controllers/tracks/routes/get/liked.js +++ b/packages/server/services/music/controllers/tracks/routes/get/liked.js @@ -1,4 +1,4 @@ -import { Track, TrackLike } from "@shared-classes/DbModels" +import { Track, TrackLike } from "@db_models" import { AuthorizationError } from "@shared-classes/Errors" // TODO: Fetch from external linked services (like tidal, spotify, ...) diff --git a/packages/server/services/music/controllers/tracks/routes/get/many.js b/packages/server/services/music/controllers/tracks/routes/get/many.js index 92f4ad7e..677af431 100755 --- a/packages/server/services/music/controllers/tracks/routes/get/many.js +++ b/packages/server/services/music/controllers/tracks/routes/get/many.js @@ -1,4 +1,4 @@ -import { Track } from "@shared-classes/DbModels" +import { Track } from "@db_models" export default async (req, res) => { const { ids, limit = 20, offset = 0 } = req.query diff --git a/packages/server/services/music/controllers/tracks/routes/post/:track_id/like.js b/packages/server/services/music/controllers/tracks/routes/post/:track_id/like.js index 1f1d6560..89266099 100755 --- a/packages/server/services/music/controllers/tracks/routes/post/:track_id/like.js +++ b/packages/server/services/music/controllers/tracks/routes/post/:track_id/like.js @@ -1,4 +1,4 @@ -import { TrackLike, Track } from "@shared-classes/DbModels" +import { TrackLike, Track } from "@db_models" import { AuthorizationError, NotFoundError } from "@shared-classes/Errors" export default async (req, res) => { diff --git a/packages/server/services/music/controllers/tracks/routes/post/:track_id/refresh-cache.js b/packages/server/services/music/controllers/tracks/routes/post/:track_id/refresh-cache.js index 6488e0ec..43bf4c4c 100755 --- a/packages/server/services/music/controllers/tracks/routes/post/:track_id/refresh-cache.js +++ b/packages/server/services/music/controllers/tracks/routes/post/:track_id/refresh-cache.js @@ -1,4 +1,4 @@ -import { Track } from "@shared-classes/DbModels" +import { Track } from "@db_models" import { NotFoundError, AuthorizationError } from "@shared-classes/Errors" import getEnhancedLyricsFromTrack from "@services/getEnhancedLyricsFromTrack" diff --git a/packages/server/services/music/services/getEnhancedLyricsFromTrack.js b/packages/server/services/music/services/getEnhancedLyricsFromTrack.js index 99b90813..722e7bbc 100755 --- a/packages/server/services/music/services/getEnhancedLyricsFromTrack.js +++ b/packages/server/services/music/services/getEnhancedLyricsFromTrack.js @@ -1,5 +1,5 @@ import findSpotifyId from "@services/findSpotifyId" -import { Track } from "@shared-classes/DbModels" +import { Track } from "@db_models" import axios from "axios" const syncLyricsProvider = process.env.LYRICS_SYNC_PROVIDER || `https://spotify-lyric-api.herokuapp.com` diff --git a/packages/server/services/music/services/removeTracks.js b/packages/server/services/music/services/removeTracks.js index 33eea611..eb79f4dd 100755 --- a/packages/server/services/music/services/removeTracks.js +++ b/packages/server/services/music/services/removeTracks.js @@ -1,4 +1,4 @@ -import { Track } from "@shared-classes/DbModels" +import { Track } from "@db_models" const urlRegex = new RegExp(`^https://(.*?)/(.*)$`) diff --git a/packages/server/services/posts/classes/posts/methods/create.js b/packages/server/services/posts/classes/posts/methods/create.js index 31c45da8..7237ad00 100644 --- a/packages/server/services/posts/classes/posts/methods/create.js +++ b/packages/server/services/posts/classes/posts/methods/create.js @@ -1,7 +1,7 @@ import momentTimezone from "moment-timezone" import requiredFields from "@shared-utils/requiredFields" -import { Post } from "@shared-classes/DbModels" +import { Post } from "@db_models" export default async (payload) => { if (!payload) { diff --git a/packages/server/services/posts/classes/posts/methods/data.js b/packages/server/services/posts/classes/posts/methods/data.js index a24c9312..e2a18ead 100644 --- a/packages/server/services/posts/classes/posts/methods/data.js +++ b/packages/server/services/posts/classes/posts/methods/data.js @@ -1,4 +1,4 @@ -import { Post, SavedPost } from "@shared-classes/DbModels" +import { Post, SavedPost } from "@db_models" import fullfillPostsData from "./fullfill" export default async (payload) => { diff --git a/packages/server/services/posts/classes/posts/methods/fullfill.js b/packages/server/services/posts/classes/posts/methods/fullfill.js index ffa6589c..d9a10abc 100644 --- a/packages/server/services/posts/classes/posts/methods/fullfill.js +++ b/packages/server/services/posts/classes/posts/methods/fullfill.js @@ -1,4 +1,4 @@ -import { User, Comment, PostLike, SavedPost } from "@shared-classes/DbModels" +import { User, Comment, PostLike, SavedPost } from "@db_models" export default async (payload) => { let { @@ -70,6 +70,7 @@ export default async (payload) => { if (!user) { user = { + _deleted: true, username: "Deleted user", } }