This Money Manager app allows you to keep track of your financial transactions and match them with records for an account at a financial institution.
- Keep track of deposits and withdrawals from an account at a financial institution (bank records).
- Keep track of payments, donations, income, etc. (financial transactions).
- Connect bank records with financial transactions.
- Attach files to a bank record or financial transaction.
- Keep track of the amount of money in an account at a particular date.
- /: home page, can go to login or register page (visible to everyone)
- /login: login page, can go to register, home, or accounts page (only visible to non-authenticated users)
- /register: register page, can go to login or home page (only visible to non-authenticated users)
- /accounts: accounts page, can go to account or profile page (only visible to authenticated users)
- /profile: profile page, can go to home, accounts, or edit profile page (only visible to authenticated users)
- /profile/edit: profile edit page, can go to profile page (only visible to authenticated users)
- /profile/delete: profile delete page, can go to profile or home page (only visible to authenticated users)
- /accounts/{account id}: account page, can go to accounts, records, or transactions page (only visible to authenticated users)
- /accounts/{account id}/records: records page, can go to record or create record page (only visible to authenticated users)
- /accounts/{account id}/transactions: transactions page, can go to transaction or create transaction page (only visible to authenticated users)
- /accounts/{account id}/create-record: create record page, can go to record page (only visible to authenticated users)
- /accounts/{account id}/create-transaction: create transaction page, can go to transaction page (only visible to authenticated users)
- /accounts/{account id}/records/{record id}: record page, can go to attach transactions, edit record, or delete record page (only visible to authenticated users)
- /accounts/{account id}/records/{record id}/transactions: attach transactions page, can go to record page (only visible to authenticated users)
- /accounts/{account id}/records/{record id}/edit: edit record page, can go to record page (only visible to authenticated users)
- /accounts/{account id}/records/{record id}/delete: delete record page, can go to record page (only visible to authenticated users)
- /accounts/{account id}/transactions/{transaction id}: transaction page, can go to attach records, edit transaction, or delete transaction page (only visible to authenticated users)
- /accounts/{account id}/transactions/{transaction id}/records: attach records page, can go to transaction page (only visible to authenticated users)
- /accounts/{account id}/transactions/{transaction id}/edit: edit transaction page, can go to transaction page (only visible to authenticated users)
- /accounts/{account id}/transactions/{transaction id}/delete: delete transaction page, can go to transaction page (only visible to authenticated users)
- Thanks to Chinthaka Dinadasa for describing how to connect MySQL to Spring Boot and how to set up a REST API in Spring Boot.
- Also thanks to Samson Alfred's dream-shops repository for Spring Boot details.
- Thanks to baledung for describing how to use the @RequestParam annotation.
- Thanks to Attila Fejér for describing how to use the @ManyToMany annotation
- Thanks to Teddy Smith for showing how to use Spring
- Thanks to Vinayak Shedgeri's answer for noting the Refresh button for Maven.
- Thanks to uvsmtid for identifying a Java version discrepancy as the reason for an error
- Thanks to Lokesh Gupta for a bit about how to upload images to a REST API.
- Thanks to Spring for some assistance with uploading images, but not directly.
- Thanks to bezdoker for describing how to upload images to a REST API. This is the one that is closest to my implementation, as well as Simpson Alfred's.
- Thanks to Abhishek Sah's second workaround to fix the Lombok issue in IntelliJ. For some reason, applying it seemed to fix the Lombok compilation issue, yet undoing the fix has not caused it to come up again.
- I looked at these Stack overflow pages to identify that the issue was a CORS issue and would not be trivial to fix:
- Why does my JavaScript code receive a "No 'Access-Control-Allow-Origin' header is present on the requested resource" error, while Postman does not?
- No 'Access-Control-Allow-Origin' header is present on the requested resource—when trying to get data from a REST API
- These resources describe the basics of CORS:
- CORS in 100 Seconds
- Learn CORS In 6 Minutes
- Thanks to Sébastien Deleuze for the solution.
- Thanks to Allow CORS with Spring Security 6.1.1 with authenticated requests for helping with CORS setup in Spring Boot with Spring Security
- Also thanks to How to configure CORS in a Spring Boot + Spring Security application? as well for helping with CORS setup in Spring Boot with Spring Security, primarily Soroosh Khodami's response
- Thanks to Spring documentation for showing how to set up CORS with Spring Security for a Reactive or a Servlet application
- These resources also talk about CORS in general, but did not address Spring Security specifically:
- XMLHttpRequest blocked by CORS Policy
- Response to preflight request doesn't pass access control check - No 'Access-Control-Allow-Origin' header
- Cross-Origin Resource Sharing (CORS)
- Thanks to Andrey B. Panfilov for addressing a Stack Overflow exception.
- Thanks to Grzegorz Oledzki and damian for handling a Many-to-Many relationship.
- Thanks to Failed to load driver class com.mysql.jdbc.Driver and Failed to load driver class org.h2.Driver from HikariConfig class classloader jdk.internal.loader.ClassLoaders$AppClassLoader for suggesting that missing the MySQL dependency caused the error
- Thanks to Executing an update/delete query; nested exception is javax.persistence.TransactionRequiredException: Executing an update/delete query for noting the @Transactional annotation
- Thanks to Brenda Gallo for the font Happy Monkey, licensed under SIL Open Font License, version 1.1.
- Thanks to Pablo Impallari for the font Libre Baskerville, licensed under SIL Open Font License, version 1.1.
- Thanks to Dalton Maag for the font Ubuntu, licensed under UBUNTU Font License Version 1.0.
- Thanks to HTTP response status codes for describing the meaning of HTTP status codes.
- Thanks to how to upload a file to my server using html for setting up a file upload form
- Thanks to API4AI for describing how to use axios to upload a file.
- Thanks to vladimirvaca's dockerize-vue-3 repository for providing an example of how to use Vue with Docker.
- Thanks to Deploy Spring Boot and MySQL using Docker compose for detailing how to use Docker Compose with Spring Boot and MySQL
- Also see Communications link failure , Spring Boot + MySql +Docker + Hibernate for more information. I don't know if
docker-compose down --rmi allwas necessary. - There are other webpages I looked at when configuring Docker, but these three are probably the most helpful ones.
- Also thanks to [Zeitounator] (https://stackoverflow.com/questions/59838692/mysql-root-password-is-set-but-getting-access-denied-for-user-rootlocalhost) for noting that the volume needs to be deleted to fix a database issue and describing how to do so.
- According to super, to reach another container, you can use the container name as the hostname. However, thanks to David Maze for "Unknown host" error calling containerized backend from frontend, which describes in detail the issue with this in the browser and how to use an HTTP reverse proxy to fix it, and for docker-frontend-hostnames, which provides sample code.
- Thanks to Geeks for Geeks for explaining Spring Security
- Thanks to FreeCodeCamp for demonstrating how to use Spring Boot, but primarily for Spring Security
- Thanks to DaoAuthenticationException for fixing the DaoAuthenticationProvider deprecation issue
- Thanks to JWT Decoder for viewing JWT contents
- Thanks to StackOverflow for fixing the Java version issue
- Thanks to Abderrahim Azhrioun for noting that the H2 issue could be due to a reserved word. According to H2 Documentation, these keywords are YEAR, MONTH, and DAY.
- Thanks to W3Schools for explaining how to use Java sorting
- Thanks to Ali Bouali for explaining Spring testing
- Thanks to Mikalai Parakhnevich for noting that my getter and state variable having the same name would cause an issue
- Thanks to the following resources for describing how to download files from a REST API:
- Code Sense
- How to download a file through an API in React?
- handling file download from api call
- trying to download file directly from response of an api
- Thanks to HTML Web Storage API and Window localStorage for describing how to use local storage.
- Thanks to Peheje's answer for parsing JWT tokens.
- According to Subset sum problem, trying to figure out whether a subset of some numbers equals a number is NP-complete.
- Thanks to Bro Code for explaining how to install MySQL.
- Thanks to W3Schools for explaining HTML and CSS.
- Random.org was used to generate the root password for the MySQL Database and the JWT secret
The following images are used to test the file UI.
- receipt-6404855_1280: Image by Mudassar Iqbal from Pixabay
- receipts-4542292_1280: Image by Ioannis Karathanasis from Pixabay