From 695e279a7f9ce70bdbc6db8a5b1b43006d350992 Mon Sep 17 00:00:00 2001 From: Aprameya Kannan Date: Sat, 17 Jan 2026 03:21:16 -0500 Subject: [PATCH] simplified ui with minimum features --- backend/package-lock.json | 196 +++++++++--------- backend/package.json | 5 + backend/src/database/connection.ts | 2 +- backend/src/index.ts | 16 +- backend/src/routes/music.ts | 4 +- backend/src/routes/notifications.ts | 2 +- backend/src/routes/rankings.ts | 12 +- backend/src/routes/ratings.ts | 4 +- backend/src/routes/social.ts | 2 +- backend/src/routes/webhooks.ts | 31 ++- etl/package-lock.json | 6 +- etl/package.json | 3 + .../AccentColor.colorset/Contents.json | 11 + .../AppIcon.appiconset/AppIcon-1024.png | Bin 0 -> 530388 bytes .../AppIcon.appiconset/Contents.json | 38 ++++ .../MusicApp/Assets.xcassets/Contents.json | 6 + frontend/MusicApp/ContentView.swift | 107 ++++++++++ frontend/MusicApp/Info.plist | 80 +++++++ frontend/MusicApp/Info.plist.backup | 17 ++ frontend/MusicApp/Models/APIResponse.swift | 30 +++ frontend/MusicApp/Models/AuthToken.swift | 36 ++++ frontend/MusicApp/Models/Friend.swift | 73 +++++++ frontend/MusicApp/Models/MusicItem.swift | 114 ++++++++++ frontend/MusicApp/Models/Notification.swift | 87 ++++++++ frontend/MusicApp/Models/Pagination.swift | 14 ++ frontend/MusicApp/Models/Rating.swift | 60 ++++++ frontend/MusicApp/Models/User.swift | 94 +++++++++ frontend/MusicApp/MusicAppApp.swift | 51 +++++ frontend/MusicApp/Services/APIService.swift | 92 ++++++++ frontend/MusicApp/Services/AuthService.swift | 95 +++++++++ frontend/MusicApp/Services/MusicService.swift | 50 +++++ .../Services/NotificationService.swift | 36 ++++ frontend/MusicApp/Services/OAuthService.swift | 81 ++++++++ .../MusicApp/Services/ProfileService.swift | 45 ++++ .../MusicApp/Services/RankingService.swift | 20 ++ .../MusicApp/Services/RatingService.swift | 45 ++++ .../MusicApp/Services/SocialService.swift | 63 ++++++ frontend/MusicApp/Theme/AppColors.swift | 51 +++++ frontend/MusicApp/Theme/AppGradients.swift | 24 +++ frontend/MusicApp/Theme/AppStyles.swift | 84 ++++++++ .../MusicApp/Utilities/AnimationHelpers.swift | 63 ++++++ frontend/MusicApp/Utilities/Extensions.swift | 33 +++ frontend/MusicApp/Utilities/ImageLoader.swift | 39 ++++ .../MusicApp/Utilities/KeychainHelper.swift | 61 ++++++ .../MusicApp/Utilities/NetworkError.swift | 39 ++++ frontend/MusicApp/ViewModels/AppState.swift | 89 ++++++++ .../MusicApp/ViewModels/AuthViewModel.swift | 184 ++++++++++++++++ .../ViewModels/HomeFeedViewModel.swift | 79 +++++++ .../ViewModels/NotificationViewModel.swift | 83 ++++++++ .../ViewModels/RankingViewModel.swift | 64 ++++++ .../MusicApp/ViewModels/RatingViewModel.swift | 61 ++++++ .../MusicApp/ViewModels/SocialViewModel.swift | 44 ++++ .../ViewModels/TasteProfileViewModel.swift | 78 +++++++ .../Views/Auth/AppleSignInButton.swift | 28 +++ .../Views/Auth/GoogleSignInButton.swift | 59 ++++++ frontend/MusicApp/Views/Auth/LoginView.swift | 100 +++++++++ .../Views/Auth/OAuthCallbackHandler.swift | 80 +++++++ frontend/MusicApp/Views/Auth/SignupView.swift | 151 ++++++++++++++ .../Views/Auth/SpotifySignInButton.swift | 41 ++++ frontend/MusicApp/Views/FeedCardView.swift | 131 ++++++++++++ frontend/MusicApp/Views/HomeFeedView.swift | 114 ++++++++++ frontend/MusicApp/Views/MainAppView.swift | 18 ++ frontend/MusicApp/Views/OnboardingView.swift | 185 +++++++++++++++++ frontend/MusicApp/Views/ProfileView.swift | 106 ++++++++++ frontend/MusicApp/Views/RatingModalView.swift | 196 ++++++++++++++++++ .../MusicApp/Views/SplashScreenView.swift | 127 ++++++++++++ frontend/MusicAppTests/MusicAppTests.swift | 17 ++ .../MusicAppUITests/MusicAppUITests.swift | 41 ++++ .../MusicAppUITestsLaunchTests.swift | 33 +++ webapp/app/auth/page.tsx | 11 +- webapp/app/page.tsx | 2 +- webapp/lib/api.ts | 80 ++++++- 72 files changed, 4093 insertions(+), 131 deletions(-) create mode 100644 frontend/MusicApp/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 frontend/MusicApp/Assets.xcassets/AppIcon.appiconset/AppIcon-1024.png create mode 100644 frontend/MusicApp/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 frontend/MusicApp/Assets.xcassets/Contents.json create mode 100644 frontend/MusicApp/ContentView.swift create mode 100644 frontend/MusicApp/Info.plist create mode 100644 frontend/MusicApp/Info.plist.backup create mode 100644 frontend/MusicApp/Models/APIResponse.swift create mode 100644 frontend/MusicApp/Models/AuthToken.swift create mode 100644 frontend/MusicApp/Models/Friend.swift create mode 100644 frontend/MusicApp/Models/MusicItem.swift create mode 100644 frontend/MusicApp/Models/Notification.swift create mode 100644 frontend/MusicApp/Models/Pagination.swift create mode 100644 frontend/MusicApp/Models/Rating.swift create mode 100644 frontend/MusicApp/Models/User.swift create mode 100644 frontend/MusicApp/MusicAppApp.swift create mode 100644 frontend/MusicApp/Services/APIService.swift create mode 100644 frontend/MusicApp/Services/AuthService.swift create mode 100644 frontend/MusicApp/Services/MusicService.swift create mode 100644 frontend/MusicApp/Services/NotificationService.swift create mode 100644 frontend/MusicApp/Services/OAuthService.swift create mode 100644 frontend/MusicApp/Services/ProfileService.swift create mode 100644 frontend/MusicApp/Services/RankingService.swift create mode 100644 frontend/MusicApp/Services/RatingService.swift create mode 100644 frontend/MusicApp/Services/SocialService.swift create mode 100644 frontend/MusicApp/Theme/AppColors.swift create mode 100644 frontend/MusicApp/Theme/AppGradients.swift create mode 100644 frontend/MusicApp/Theme/AppStyles.swift create mode 100644 frontend/MusicApp/Utilities/AnimationHelpers.swift create mode 100644 frontend/MusicApp/Utilities/Extensions.swift create mode 100644 frontend/MusicApp/Utilities/ImageLoader.swift create mode 100644 frontend/MusicApp/Utilities/KeychainHelper.swift create mode 100644 frontend/MusicApp/Utilities/NetworkError.swift create mode 100644 frontend/MusicApp/ViewModels/AppState.swift create mode 100644 frontend/MusicApp/ViewModels/AuthViewModel.swift create mode 100644 frontend/MusicApp/ViewModels/HomeFeedViewModel.swift create mode 100644 frontend/MusicApp/ViewModels/NotificationViewModel.swift create mode 100644 frontend/MusicApp/ViewModels/RankingViewModel.swift create mode 100644 frontend/MusicApp/ViewModels/RatingViewModel.swift create mode 100644 frontend/MusicApp/ViewModels/SocialViewModel.swift create mode 100644 frontend/MusicApp/ViewModels/TasteProfileViewModel.swift create mode 100644 frontend/MusicApp/Views/Auth/AppleSignInButton.swift create mode 100644 frontend/MusicApp/Views/Auth/GoogleSignInButton.swift create mode 100644 frontend/MusicApp/Views/Auth/LoginView.swift create mode 100644 frontend/MusicApp/Views/Auth/OAuthCallbackHandler.swift create mode 100644 frontend/MusicApp/Views/Auth/SignupView.swift create mode 100644 frontend/MusicApp/Views/Auth/SpotifySignInButton.swift create mode 100644 frontend/MusicApp/Views/FeedCardView.swift create mode 100644 frontend/MusicApp/Views/HomeFeedView.swift create mode 100644 frontend/MusicApp/Views/MainAppView.swift create mode 100644 frontend/MusicApp/Views/OnboardingView.swift create mode 100644 frontend/MusicApp/Views/ProfileView.swift create mode 100644 frontend/MusicApp/Views/RatingModalView.swift create mode 100644 frontend/MusicApp/Views/SplashScreenView.swift create mode 100644 frontend/MusicAppTests/MusicAppTests.swift create mode 100644 frontend/MusicAppUITests/MusicAppUITests.swift create mode 100644 frontend/MusicAppUITests/MusicAppUITestsLaunchTests.swift diff --git a/backend/package-lock.json b/backend/package-lock.json index 457f536..17b70d3 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -53,6 +53,7 @@ "@types/passport": "^1.0.16", "@types/passport-apple": "^2.0.0", "@types/passport-google-oauth20": "^2.0.12", + "@types/pg": "^8.16.0", "@types/uuid": "^9.0.7", "@typescript-eslint/eslint-plugin": "^6.17.0", "@typescript-eslint/parser": "^6.17.0", @@ -508,6 +509,18 @@ "dev": true, "license": "BSD-3-Clause" }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", @@ -906,6 +919,18 @@ "@types/passport": "*" } }, + "node_modules/@types/pg": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.16.0.tgz", + "integrity": "sha512-RmhMd/wD+CF8Dfo+cVIy3RR5cl8CyfXQ0tGgW6XBL8L4LM/UTEbNXYRbLwU6w+CgrKBNbrQWt4FUtTfaU5jSYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "pg-protocol": "*", + "pg-types": "^2.2.0" + } + }, "node_modules/@types/qs": { "version": "6.14.0", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", @@ -1657,12 +1682,12 @@ } }, "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "license": "ISC", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "license": "BlueOak-1.0.0", "engines": { - "node": ">=10" + "node": ">=18" } }, "node_modules/cluster-key-slot": { @@ -2004,9 +2029,9 @@ } }, "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.3.tgz", + "integrity": "sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==", "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" @@ -2737,30 +2762,6 @@ "node": ">= 0.6" } }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -3868,37 +3869,24 @@ } }, "node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "license": "ISC", "engines": { - "node": ">=8" + "node": ">=16 || 14 >=14.17" } }, "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", "license": "MIT", "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" + "minipass": "^7.1.2" }, "engines": { - "node": ">= 8" - } - }, - "node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" + "node": ">= 18" } }, "node_modules/mkdirp": { @@ -4400,7 +4388,7 @@ "integrity": "sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==", "license": "MIT" }, - "node_modules/pg/node_modules/pg-types": { + "node_modules/pg-types": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", @@ -4416,7 +4404,37 @@ "node": ">=4" } }, - "node_modules/pg/node_modules/postgres-array": { + "node_modules/pgpass": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", + "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", + "license": "MIT", + "dependencies": { + "split2": "^4.1.0" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postgres-array": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", @@ -4425,7 +4443,7 @@ "node": ">=4" } }, - "node_modules/pg/node_modules/postgres-bytea": { + "node_modules/postgres-bytea": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.1.tgz", "integrity": "sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==", @@ -4434,7 +4452,7 @@ "node": ">=0.10.0" } }, - "node_modules/pg/node_modules/postgres-date": { + "node_modules/postgres-date": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", @@ -4443,7 +4461,7 @@ "node": ">=0.10.0" } }, - "node_modules/pg/node_modules/postgres-interval": { + "node_modules/postgres-interval": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", @@ -4455,36 +4473,6 @@ "node": ">=0.10.0" } }, - "node_modules/pgpass": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", - "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", - "license": "MIT", - "dependencies": { - "split2": "^4.1.0" - } - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/possible-typed-array-names": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", - "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -5154,20 +5142,28 @@ } }, "node_modules/tar": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", - "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", - "license": "ISC", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.3.tgz", + "integrity": "sha512-ENg5JUHUm2rDD7IvKNFGzyElLXNjachNLp6RaGf4+JOgxXHkqA+gq81ZAMCUmtMtqBsoU62lcp6S27g1LCYGGQ==", + "license": "BlueOak-1.0.0", "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" }, "engines": { - "node": ">=10" + "node": ">=18" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" } }, "node_modules/tarn": { diff --git a/backend/package.json b/backend/package.json index 0d297af..3e424d5 100644 --- a/backend/package.json +++ b/backend/package.json @@ -65,10 +65,15 @@ "@types/passport": "^1.0.16", "@types/passport-apple": "^2.0.0", "@types/passport-google-oauth20": "^2.0.12", + "@types/pg": "^8.16.0", "@types/uuid": "^9.0.7", "@typescript-eslint/eslint-plugin": "^6.17.0", "@typescript-eslint/parser": "^6.17.0", "eslint": "^8.56.0", "prettier": "^3.1.1" + }, + "overrides": { + "tar": "^7.5.3", + "diff": "^8.0.3" } } diff --git a/backend/src/database/connection.ts b/backend/src/database/connection.ts index a5a2eb1..ea3654c 100644 --- a/backend/src/database/connection.ts +++ b/backend/src/database/connection.ts @@ -42,7 +42,7 @@ export const getDatabasePool = (): Pool => { } }); - pool.on('connect', (_client) => { + pool.on('connect', (_client: any) => { logger.debug('Database connection established', { totalCount: pool?.totalCount, idleCount: pool?.idleCount, diff --git a/backend/src/index.ts b/backend/src/index.ts index a7d38f4..255b9db 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -17,8 +17,22 @@ app.set('trust proxy', 1); app.use(helmet()); app.use(securityMiddleware); +const getAllowedOrigins = (): string[] | boolean => { + const corsOrigin = process.env.CORS_ORIGIN; + + if (!corsOrigin || corsOrigin === '*') { + if (process.env.NODE_ENV === 'production') { + logger.warn('CORS_ORIGIN is not set or set to * in production. This is insecure.'); + return false; + } + return true; + } + + return corsOrigin.split(',').map(origin => origin.trim()).filter(Boolean); +}; + const corsOptions = { - origin: process.env.CORS_ORIGIN === '*' ? true : (process.env.CORS_ORIGIN || '*'), + origin: getAllowedOrigins(), credentials: true, methods: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS'], allowedHeaders: ['Content-Type', 'Authorization', 'X-Device-ID', 'X-Signature-Ed25519', 'X-Signature-Timestamp'] diff --git a/backend/src/routes/music.ts b/backend/src/routes/music.ts index 72309a1..a9463ad 100644 --- a/backend/src/routes/music.ts +++ b/backend/src/routes/music.ts @@ -48,7 +48,7 @@ router.get( const result = await pool.query(query, queryParams); - const items = await Promise.all(result.rows.map(async (row) => { + const items = await Promise.all(result.rows.map(async (row: any) => { let trendingChange: number | null = null; if (parseInt(row.recent_ratings) > 10) { const previousPeriodResult = await pool.query( @@ -175,7 +175,7 @@ router.get( [`%${query}%`] ); - const items = result.rows.map(row => ({ + const items = result.rows.map((row: any) => ({ id: row.id, type: row.type, title: row.title, diff --git a/backend/src/routes/notifications.ts b/backend/src/routes/notifications.ts index e04c5eb..3184141 100644 --- a/backend/src/routes/notifications.ts +++ b/backend/src/routes/notifications.ts @@ -27,7 +27,7 @@ router.get( [req.userId, limit, offset] ); - const notifications = result.rows.map(row => ({ + const notifications = result.rows.map((row: any) => ({ id: row.id, userId: row.user_id, type: row.type, diff --git a/backend/src/routes/rankings.ts b/backend/src/routes/rankings.ts index f4a942a..f70196e 100644 --- a/backend/src/routes/rankings.ts +++ b/backend/src/routes/rankings.ts @@ -70,9 +70,9 @@ router.get( ); const newItemIds = new Set(newItemsResult.rows.map((r: any) => r.id)); - const rankings = result.rows.map((row, index) => { + const rankings = result.rows.map((row: any, index: number) => { const currentRank = index + 1; - const previousRank = previousRankMap.get(row.id); + const previousRank: number | undefined = previousRankMap.get(row.id); const change = previousRank ? previousRank - currentRank : 0; const isNew = newItemIds.has(row.id); @@ -164,9 +164,9 @@ router.get( ); const newItemIds = new Set(newItemsResult.rows.map((r: any) => r.id)); - const rankings = result.rows.map((row, index) => { + const rankings = result.rows.map((row: any, index: number) => { const currentRank = index + 1; - const previousRank = previousRankMap.get(row.id); + const previousRank: number | undefined = previousRankMap.get(row.id); const change = previousRank ? previousRank - currentRank : 0; const isNew = newItemIds.has(row.id); @@ -258,9 +258,9 @@ router.get( ); const newItemIds = new Set(newItemsResult.rows.map((r: any) => r.id)); - const rankings = result.rows.map((row, index) => { + const rankings = result.rows.map((row: any, index: number) => { const currentRank = index + 1; - const previousRank = previousRankMap.get(row.id); + const previousRank: number | undefined = previousRankMap.get(row.id); const change = previousRank ? previousRank - currentRank : 0; const isNew = newItemIds.has(row.id); diff --git a/backend/src/routes/ratings.ts b/backend/src/routes/ratings.ts index a732349..8923375 100644 --- a/backend/src/routes/ratings.ts +++ b/backend/src/routes/ratings.ts @@ -113,7 +113,7 @@ router.get( [musicItemId, limit, offset] ); - const ratings = result.rows.map(row => ({ + const ratings = result.rows.map((row: any) => ({ id: row.id, userId: row.user_id, musicItemId: row.music_item_id, @@ -162,7 +162,7 @@ router.get( [userId, limit, offset] ); - const ratings = result.rows.map(row => ({ + const ratings = result.rows.map((row: any) => ({ id: row.id, userId: row.user_id, musicItemId: row.music_item_id, diff --git a/backend/src/routes/social.ts b/backend/src/routes/social.ts index 8fe51e3..85181be 100644 --- a/backend/src/routes/social.ts +++ b/backend/src/routes/social.ts @@ -31,7 +31,7 @@ router.get( [req.userId] ); - const friends = await Promise.all(result.rows.map(async (row) => { + const friends = await Promise.all(result.rows.map(async (row: any) => { const compatibilityResult = await pool.query( `SELECT COUNT(*) as shared_ratings, diff --git a/backend/src/routes/webhooks.ts b/backend/src/routes/webhooks.ts index adb6bb6..532c55d 100644 --- a/backend/src/routes/webhooks.ts +++ b/backend/src/routes/webhooks.ts @@ -37,14 +37,35 @@ const RESPONSE_TYPE = { DEFERRED_CHANNEL_MESSAGE_WITH_SOURCE: 5 }; +const isValidDiscordId = (id: string): boolean => { + return /^\d{17,19}$/.test(id); +}; + +const isValidDiscordToken = (token: string): boolean => { + return /^[a-zA-Z0-9._-]+$/.test(token) && token.length >= 50 && token.length <= 200; +}; + const sendDiscordFollowup = async (applicationId: string, interactionToken: string, content: string) => { + if (!isValidDiscordId(applicationId) || !isValidDiscordToken(interactionToken)) { + logger.error('Invalid Discord application ID or interaction token', { + applicationId: applicationId?.substring(0, 10), + tokenLength: interactionToken?.length + }); + throw new Error('Invalid Discord credentials'); + } + try { await axios.post( `https://discord.com/api/v10/webhooks/${applicationId}/${interactionToken}`, - { content } + { content }, + { + timeout: 5000, + validateStatus: (status) => status < 500 + } ); } catch (error) { logger.error('Failed to send Discord follow-up', { error }); + throw error; } }; @@ -72,6 +93,14 @@ const handleDiscordInteraction = async (req: DiscordRequest, res: Response) => { return res.status(400).json({ error: 'Missing interaction metadata' }); } + if (!isValidDiscordId(applicationId) || !isValidDiscordToken(interactionToken)) { + logger.warn('Invalid Discord interaction credentials', { + applicationId: applicationId?.substring(0, 10), + tokenLength: interactionToken?.length + }); + return res.status(400).json({ error: 'Invalid interaction metadata' }); + } + console.log('Step 1: Sending Deferral to Discord...'); res.status(200).json({ type: RESPONSE_TYPE.DEFERRED_CHANNEL_MESSAGE_WITH_SOURCE }); diff --git a/etl/package-lock.json b/etl/package-lock.json index b70829e..6e778c4 100644 --- a/etl/package-lock.json +++ b/etl/package-lock.json @@ -909,9 +909,9 @@ } }, "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.3.tgz", + "integrity": "sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==", "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" diff --git a/etl/package.json b/etl/package.json index 7c3972d..123b0e1 100644 --- a/etl/package.json +++ b/etl/package.json @@ -36,6 +36,9 @@ "@typescript-eslint/parser": "^6.17.0", "eslint": "^8.56.0", "prettier": "^3.1.1" + }, + "overrides": { + "diff": "^8.0.3" } } diff --git a/frontend/MusicApp/Assets.xcassets/AccentColor.colorset/Contents.json b/frontend/MusicApp/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..eb87897 --- /dev/null +++ b/frontend/MusicApp/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/frontend/MusicApp/Assets.xcassets/AppIcon.appiconset/AppIcon-1024.png b/frontend/MusicApp/Assets.xcassets/AppIcon.appiconset/AppIcon-1024.png new file mode 100644 index 0000000000000000000000000000000000000000..e92cda4ccf953b403422f5d7bd566d7dcb5e2c5f GIT binary patch literal 530388 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