Currently data is only loaded when pages are initially rendered. When editing album/user data, data should be re-fetched on form submission to prevent no longer valid data from being showed. Could be added by adding an additional function parameter to the LoadData callback that triggers a new fetch and integrating it with the form submission functions.
There is currently no limit to how many subsequent requests can be made. This opens up to brute force attacks against the login endpoint and makes it generally easier to ddos the express server. To fix this a rate limiter should be implemented.
The backend should be able to differentiate between actual errors and invalid requests/responses. Can be done by adding a new error type and checking the error type in a custom error handler.
Implement a backend to handle file uploads (images) that can handle uploading, renaming and storing these. Also implement hooks for mongoose that deletes image files when the corresponding entries from the db is removed.
Currently css grid is used for image layout. This works well if all images are more or less the same aspect ratios, but falls apart when high and low aspect ratios are mixed and leaves a lot of whitespace. It may be possible to automatically consume with whitespace with css grid and pack the images together. See this article for reference.
Currently image uploading is done fully asyncronously which means the order in which images are uploaded is not preserved. This should be changed so that images are uploaded syncronously such that the order can be preserved.
Currently suspense is used to lazy load modules that a majority of users will never use. Even if it's extremely unlikely that loading these specifically will fail, it's still good practise to add an error boundary above it to prevent the entire app from crashing.
Implement a pagination for the gallery view. The get albums endpoint already supports a "page" query param; but it's possible this will require another endpoint that gets the total # of albums in order to render a "google"-esque pagination.
The page still doesn't reliably scroll to top when changing between pages using the pagination in the gallery view. Could probably be fixed by setting up promises for image load and then waiting on Promise.all() before scrolling.