{"payload":{"feedbackUrl":"https://github.com/orgs/community/discussions/53140","repo":{"id":741142581,"defaultBranch":"main","name":"myProjects","ownerLogin":"jamesocoder","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2024-01-09T19:33:40.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/44654277?v=4","public":true,"private":false,"isOrgOwned":false},"refInfo":{"name":"","listCacheKey":"v0:1721602667.0","currentOid":""},"activityList":{"items":[{"before":null,"after":"3caa6a08df9b5c4d0b6f7563fd0645892928dd2a","ref":"refs/heads/dataAlgos001","pushedAt":"2024-07-21T22:57:47.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"jamesocoder","name":null,"path":"/jamesocoder","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/44654277?s=80&v=4"},"commit":{"message":"Added Doubly Linked List capable of accepting any type of data","shortMessageHtmlLink":"Added Doubly Linked List capable of accepting any type of data"}},{"before":"93db496e03cc47da792cc3aa555d78c0a0bfdfbd","after":"c02f5796eeaf820e32290d23a79c3c741eba05f7","ref":"refs/heads/spotifyApi007","pushedAt":"2024-07-03T19:38:39.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"jamesocoder","name":null,"path":"/jamesocoder","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/44654277?s=80&v=4"},"commit":{"message":"Quick explanatory comment","shortMessageHtmlLink":"Quick explanatory comment"}},{"before":null,"after":"93db496e03cc47da792cc3aa555d78c0a0bfdfbd","ref":"refs/heads/spotifyApi007","pushedAt":"2024-07-01T17:08:18.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"jamesocoder","name":null,"path":"/jamesocoder","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/44654277?s=80&v=4"},"commit":{"message":"Quick README linting","shortMessageHtmlLink":"Quick README linting"}},{"before":"7da8f39ff7ec5098fb533a1424d9ddccc9e5e5e0","after":null,"ref":"refs/heads/spotifyApi006","pushedAt":"2024-07-01T17:03:13.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"jamesocoder","name":null,"path":"/jamesocoder","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/44654277?s=80&v=4"}},{"before":"20640cb548ccc9ea35ed66b0abf400031f2cada3","after":"c2bc892f98647026beb1f2450e16081ceb3174ec","ref":"refs/heads/main","pushedAt":"2024-07-01T17:02:41.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"jamesocoder","name":null,"path":"/jamesocoder","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/44654277?s=80&v=4"},"commit":{"message":"Got Vite.js working on the backend for HMR (#7)\n\n- Removed dotenv dependency and its related files. It has been replaced with Vite's env API\r\n- Created a helper function in /back/src/utils.ts for obtaining the server's address. It's currently unused.\r\n- Added repository information to both back and front's package.json's\r\n- Customized the directory that the \"vite build\" command will output to by adding an entry to vite.config.ts\r\n- Updated READMEs to reflect changes","shortMessageHtmlLink":"Got Vite.js working on the backend for HMR (#7)"}},{"before":null,"after":"7da8f39ff7ec5098fb533a1424d9ddccc9e5e5e0","ref":"refs/heads/spotifyApi006","pushedAt":"2024-07-01T17:02:00.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"jamesocoder","name":null,"path":"/jamesocoder","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/44654277?s=80&v=4"},"commit":{"message":"Got Vite.js working on the backend for HMR\n\n- Removed dotenv dependency and its related files. It has been replaced with Vite's env API\n- Created a helper function in /back/src/utils.ts for obtaining the server's address. It's currently unused.\n- Added repository information to both back and front's package.json's\n- Customized the directory that the \"vite build\" command will output to by adding an entry to vite.config.ts\n- Updated READMEs to reflect changes","shortMessageHtmlLink":"Got Vite.js working on the backend for HMR"}},{"before":"a845af1fe09825651919f79b58bb57c9f726df67","after":"20640cb548ccc9ea35ed66b0abf400031f2cada3","ref":"refs/heads/main","pushedAt":"2024-07-01T03:18:40.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"jamesocoder","name":null,"path":"/jamesocoder","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/44654277?s=80&v=4"},"commit":{"message":"Startup steps correction","shortMessageHtmlLink":"Startup steps correction"}},{"before":"759bef18b5952604000cdd8d94206e4f9b1496d5","after":null,"ref":"refs/heads/spotifyApi005","pushedAt":"2024-07-01T03:12:51.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"jamesocoder","name":null,"path":"/jamesocoder","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/44654277?s=80&v=4"}},{"before":"7d223ce38dab37613c51a8a0bd6c7e337dd612e9","after":"a845af1fe09825651919f79b58bb57c9f726df67","ref":"refs/heads/main","pushedAt":"2024-07-01T03:12:44.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"jamesocoder","name":null,"path":"/jamesocoder","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/44654277?s=80&v=4"},"commit":{"message":"Working Spotify Authorization and API Use (#6)\n\nThe authorization codebase has seen a major overhaul in order to use the Spotify Web API TypeScript SDK.\r\n\r\nI've started to get into the groove of using React's hooks and JSX again.\r\n\r\nI've also learned how to create index files that centralize the exports of a directory so that the top-level file's imports aren't importing from dozens of different individual files.\r\n\r\nWith the app starting to take shape, and before things get too complicated, this would be a good point to review all that I've done. I want to ensure I have taken good notes on the lessons I've learned so that I can easily recall them later. Updates to the codebase will slow down while I do this.\r\n\r\n* Ditched old attempt at separating process steps between front and backend, which created a 3-party request path that Spotify refused. Authorization now happens entirely on the frontend.\r\n - Utilized Spotify's Web API SDK to greatly simplify code\r\n - Backend accepts the token that the frontend generates through authorization\r\n\r\n* Added ability to logout\r\n\r\n* Added ability to log back in after logging out\r\n\r\n* Replaced child page's (Top 5 Artists) reliance on non-persistent state with the persistent localStorage","shortMessageHtmlLink":"Working Spotify Authorization and API Use (#6)"}},{"before":"4191dc720b8b3a44175bf049f7d3fcad9acfbd80","after":"759bef18b5952604000cdd8d94206e4f9b1496d5","ref":"refs/heads/spotifyApi005","pushedAt":"2024-07-01T03:01:42.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"jamesocoder","name":null,"path":"/jamesocoder","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/44654277?s=80&v=4"},"commit":{"message":"Minor formatting","shortMessageHtmlLink":"Minor formatting"}},{"before":"0ac574d6a8b23d34fc94bef454118e9d5b8f96d2","after":"4191dc720b8b3a44175bf049f7d3fcad9acfbd80","ref":"refs/heads/spotifyApi005","pushedAt":"2024-07-01T02:52:53.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"jamesocoder","name":null,"path":"/jamesocoder","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/44654277?s=80&v=4"},"commit":{"message":"README updates","shortMessageHtmlLink":"README updates"}},{"before":"2ad66720b1336198c06f36f10a899174f161f289","after":"0ac574d6a8b23d34fc94bef454118e9d5b8f96d2","ref":"refs/heads/spotifyApi005","pushedAt":"2024-07-01T02:26:01.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"jamesocoder","name":null,"path":"/jamesocoder","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/44654277?s=80&v=4"},"commit":{"message":"Accounted for possibility of expired token","shortMessageHtmlLink":"Accounted for possibility of expired token"}},{"before":"d6860f9fa6ac9d7e9f480fe2fb56b84fb93d1e92","after":"2ad66720b1336198c06f36f10a899174f161f289","ref":"refs/heads/spotifyApi005","pushedAt":"2024-07-01T02:09:19.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"jamesocoder","name":null,"path":"/jamesocoder","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/44654277?s=80&v=4"},"commit":{"message":"Replaced child page's reliance on non-persistent state with localStorage","shortMessageHtmlLink":"Replaced child page's reliance on non-persistent state with localStorage"}},{"before":"9b2402db1f723d282d3d85c6199582082ee3bef7","after":"d6860f9fa6ac9d7e9f480fe2fb56b84fb93d1e92","ref":"refs/heads/spotifyApi005","pushedAt":"2024-07-01T01:40:30.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"jamesocoder","name":null,"path":"/jamesocoder","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/44654277?s=80&v=4"},"commit":{"message":"Successfully interacting with Spotify API using both frontend and backend","shortMessageHtmlLink":"Successfully interacting with Spotify API using both frontend and bac…"}},{"before":"da6109f903e2cd458ef58ce64e5f98ea674f811a","after":"9b2402db1f723d282d3d85c6199582082ee3bef7","ref":"refs/heads/spotifyApi005","pushedAt":"2024-06-30T23:36:52.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"jamesocoder","name":null,"path":"/jamesocoder","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/44654277?s=80&v=4"},"commit":{"message":"Backend api is ready for testing with the new spotify sdk","shortMessageHtmlLink":"Backend api is ready for testing with the new spotify sdk"}},{"before":"534fac8fa969207a036b4edc5fd8242c15771797","after":"da6109f903e2cd458ef58ce64e5f98ea674f811a","ref":"refs/heads/spotifyApi005","pushedAt":"2024-06-30T22:28:21.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"jamesocoder","name":null,"path":"/jamesocoder","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/44654277?s=80&v=4"},"commit":{"message":"Added ability to log back in after logging out","shortMessageHtmlLink":"Added ability to log back in after logging out"}},{"before":"7ce45e8e6cb4754d6a56c4d2fd359d60033f9e27","after":"534fac8fa969207a036b4edc5fd8242c15771797","ref":"refs/heads/spotifyApi005","pushedAt":"2024-06-30T22:23:37.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"jamesocoder","name":null,"path":"/jamesocoder","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/44654277?s=80&v=4"},"commit":{"message":"Added ability to logout","shortMessageHtmlLink":"Added ability to logout"}},{"before":"0c6ab8cc935f4225a8879fe16cd398e9d72c5422","after":"7ce45e8e6cb4754d6a56c4d2fd359d60033f9e27","ref":"refs/heads/spotifyApi005","pushedAt":"2024-06-30T21:37:17.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"jamesocoder","name":null,"path":"/jamesocoder","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/44654277?s=80&v=4"},"commit":{"message":"Saved frontend server address to global state","shortMessageHtmlLink":"Saved frontend server address to global state"}},{"before":"6a31f9589438242c27ffe90b83f54dedcea23742","after":"0c6ab8cc935f4225a8879fe16cd398e9d72c5422","ref":"refs/heads/spotifyApi005","pushedAt":"2024-06-28T01:16:48.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"jamesocoder","name":null,"path":"/jamesocoder","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/44654277?s=80&v=4"},"commit":{"message":"Quick comment clarifications","shortMessageHtmlLink":"Quick comment clarifications"}},{"before":"f701dd1a953243368a4dd2fec723ce9ca1eeada2","after":"6a31f9589438242c27ffe90b83f54dedcea23742","ref":"refs/heads/spotifyApi005","pushedAt":"2024-06-26T22:05:27.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"jamesocoder","name":null,"path":"/jamesocoder","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/44654277?s=80&v=4"},"commit":{"message":"Rewrite failed. Spotify/authorize does not allow cors requests","shortMessageHtmlLink":"Rewrite failed. Spotify/authorize does not allow cors requests"}},{"before":"a574ff658ce4a2f2a6fd208c70062fea03841e9f","after":"f701dd1a953243368a4dd2fec723ce9ca1eeada2","ref":"refs/heads/spotifyApi005","pushedAt":"2024-06-26T20:11:28.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"jamesocoder","name":null,"path":"/jamesocoder","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/44654277?s=80&v=4"},"commit":{"message":"Prettier error message","shortMessageHtmlLink":"Prettier error message"}},{"before":"5ebf3eb1ef846c81e9b5d74fc777a8561632712b","after":"a574ff658ce4a2f2a6fd208c70062fea03841e9f","ref":"refs/heads/spotifyApi005","pushedAt":"2024-06-26T20:02:15.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"jamesocoder","name":null,"path":"/jamesocoder","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/44654277?s=80&v=4"},"commit":{"message":"Combined backend initial authorization endpoints into one","shortMessageHtmlLink":"Combined backend initial authorization endpoints into one"}},{"before":null,"after":"5ebf3eb1ef846c81e9b5d74fc777a8561632712b","ref":"refs/heads/spotifyApi005","pushedAt":"2024-06-26T16:58:07.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"jamesocoder","name":null,"path":"/jamesocoder","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/44654277?s=80&v=4"},"commit":{"message":"Saved authToken to localStorage","shortMessageHtmlLink":"Saved authToken to localStorage"}},{"before":"7e76a36f061318b663342b058d4bd1511b3843d7","after":null,"ref":"refs/heads/spotifyApi002","pushedAt":"2024-06-26T00:17:41.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"jamesocoder","name":null,"path":"/jamesocoder","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/44654277?s=80&v=4"}},{"before":"dfda51ce34e4131fcac758ed1e915c1e0d195772","after":"7d223ce38dab37613c51a8a0bd6c7e337dd612e9","ref":"refs/heads/main","pushedAt":"2024-06-26T00:17:30.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"jamesocoder","name":null,"path":"/jamesocoder","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/44654277?s=80&v=4"},"commit":{"message":"Spotify Authorization Working and Merged Into Main (#5)\n\nUp to this point, I have learned a ton. I taught myself how to use TypeScript, Vite, react-router-dom v6.24.0, Redux. This is in addition to reacquainting myself in-depth with Express.js, dotenv, cors, and React. It's kind of frustrating how many tools and APIs you need to familiarize yourself with in modern web development, but I am proud of how far this project has taken me.","shortMessageHtmlLink":"Spotify Authorization Working and Merged Into Main (#5)"}},{"before":"55d71124e64323368435a47ed5478c10b0e576ba","after":null,"ref":"refs/heads/spotifyApi004","pushedAt":"2024-06-26T00:10:21.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"jamesocoder","name":null,"path":"/jamesocoder","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/44654277?s=80&v=4"}},{"before":"021633977cba32f84e4528717bcdd3d33a37e93f","after":"7e76a36f061318b663342b058d4bd1511b3843d7","ref":"refs/heads/spotifyApi002","pushedAt":"2024-06-26T00:10:08.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"jamesocoder","name":null,"path":"/jamesocoder","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/44654277?s=80&v=4"},"commit":{"message":"Fully working Authorization on both front and back ends (#4)\n\n* Vite + React project init\r\n\r\n* Learned about package.json devDependencies\r\n- Separating these from \"dependencies\" is a way to make the final production build leaner\r\n\r\n* Added Redux to the project and demonstrated its use\r\n\r\n* frontend communicates with backend successfully\r\n\r\nFRONT\r\n* App.tsx major update\r\n - Added browser routing from react-router-dom\r\n - Navigating to the app's root url will automatically redirect to Spotify Authorization. The app will not work without an authorization. Currently, it always does this regardless of prior authorization. This is inconvenient, and will be improved upon once the refresh token information is saved to localStorage; in the future, if it's present and still valid, the app will use it to obtain a new access token from the prior authorization instead of asking the user to reauthorize.\r\n - Once past Spotify's authorization, the user will be sent to the AUTH_ENDPOINT, which will either display authToken information or GetAuth depending upon if the user accepted the authorization.\r\n\r\n* Had to remove Vite+React app template's default wrapper. It was causing a second fetch request to be sent to the spotify token api with the same authcode, which was made invalid after the first request. This resulted in the fetch result being blank.\r\n\r\n* Modified vite.config.ts, vite-env.d.ts, and added .env.development\r\n - This was in order to have an easier time adding Browser Routing\r\n - Environment variables now control where Vite hosts the server and can be read by the App at runtime\r\n - .env.production can be created to do the same when the app is deployed\r\n\r\n* renamed appState dir to state\r\n - hooks.ts is unchanged\r\n - ./state/slices/counter.ts and references to other Redux tutorial files removed\r\n - store.ts now only uses the new authorize slice\r\n - ./state/slices/authorization.ts added. Only the access_token will be stored in Redux's state. The other authToken components will be saved to localStorage later.\r\n\r\n* Added ./components/authorization.tsx\r\n - GetAuth is a placeholder component that is only briefly shown when first navigating to the site or when the user refuses the authorization.\r\n - SaveToken is responsible for saving a fully authorized token. It currently only saves the access token and needs more work.\r\n\r\n* Removed axios dependency\r\n - This wasn't used at all.\r\n - It may be used in the future once we start storing data in the backend.\r\n\r\nBACK\r\n* Enabled cors\r\n - Added CLIENT_HOST environment var for whitelisting the frontend\r\n\r\n* apitAuthorization.ts\r\n - Changed ___AuthHandler query fields to 'redirect'. Spotify's API docs require that these two values are the exact same, so this is meant to hint at that.\r\n - Made /token-get a proper async function. We must wait for Spotify's token API to finish processing our request.\r\n\r\n* Updated READMEs","shortMessageHtmlLink":"Fully working Authorization on both front and back ends (#4)"}},{"before":"9e62d498f13eed74728120fdb0c0875786ce67f7","after":"55d71124e64323368435a47ed5478c10b0e576ba","ref":"refs/heads/spotifyApi004","pushedAt":"2024-06-25T23:55:03.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"jamesocoder","name":null,"path":"/jamesocoder","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/44654277?s=80&v=4"},"commit":{"message":"Updated READMEs","shortMessageHtmlLink":"Updated READMEs"}},{"before":"74bd15178d08996554a87acac90f29d8469a1a1e","after":"9e62d498f13eed74728120fdb0c0875786ce67f7","ref":"refs/heads/spotifyApi004","pushedAt":"2024-06-24T19:07:51.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"jamesocoder","name":null,"path":"/jamesocoder","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/44654277?s=80&v=4"},"commit":{"message":"Redux file reorganization","shortMessageHtmlLink":"Redux file reorganization"}},{"before":"ab11fd8bb067a169425b26d79f3b9dca177216c8","after":"74bd15178d08996554a87acac90f29d8469a1a1e","ref":"refs/heads/spotifyApi004","pushedAt":"2024-06-24T19:01:16.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"jamesocoder","name":null,"path":"/jamesocoder","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/44654277?s=80&v=4"},"commit":{"message":"Exclude features/dogs from tsc compile list","shortMessageHtmlLink":"Exclude features/dogs from tsc compile list"}}],"hasNextPage":true,"hasPreviousPage":false,"activityType":"all","actor":null,"timePeriod":"all","sort":"DESC","perPage":30,"cursor":"Y3Vyc29yOnYyOpK7MjAyNC0wNy0yMVQyMjo1Nzo0Ny4wMDAwMDBazwAAAASFPDzP","startCursor":"Y3Vyc29yOnYyOpK7MjAyNC0wNy0yMVQyMjo1Nzo0Ny4wMDAwMDBazwAAAASFPDzP","endCursor":"Y3Vyc29yOnYyOpK7MjAyNC0wNi0yNFQxOTowMToxNi4wMDAwMDBazwAAAARt2vMo"}},"title":"Activity · jamesocoder/myProjects"}