From 525729a725ae97384279feb94947f8884b462880 Mon Sep 17 00:00:00 2001 From: Daniel Date: Fri, 27 Oct 2023 01:09:12 +0300 Subject: [PATCH 1/8] Fixed forms trying to input strings instead of ints --- src/main/java/com/faf223/expensetrackerfaf/web/package.json | 1 - .../dashboard/board/infolists/contents/ContentExpense.svelte | 4 +--- .../dashboard/board/infolists/contents/ContentIncome.svelte | 2 +- 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/faf223/expensetrackerfaf/web/package.json b/src/main/java/com/faf223/expensetrackerfaf/web/package.json index 4dcd8b3..c0e2abb 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/web/package.json +++ b/src/main/java/com/faf223/expensetrackerfaf/web/package.json @@ -2,7 +2,6 @@ "name": "expensetracker", "version": "0.0.1", "scripts": { - "g": "vite dev -- --open", "dev": "vite dev", "build": "vite build", "preview": "vite preview", diff --git a/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/infolists/contents/ContentExpense.svelte b/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/infolists/contents/ContentExpense.svelte index 75abede..bb57ce9 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/infolists/contents/ContentExpense.svelte +++ b/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/infolists/contents/ContentExpense.svelte @@ -15,8 +15,6 @@ const today = new Date().toISOString().split('T')[0]; const expenseCategory = $expenseTypes.find(incomeType => incomeType.id === id); - console.log(amount); - if (expenseCategory) { const newIncome = { incomeId: 0, @@ -27,7 +25,7 @@ }, expenseCategory: expenseCategory, date: today, - amount: amount + amount: parseInt(amount) }; newData = $expenseData; diff --git a/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/infolists/contents/ContentIncome.svelte b/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/infolists/contents/ContentIncome.svelte index f23e81e..b8bf180 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/infolists/contents/ContentIncome.svelte +++ b/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/infolists/contents/ContentIncome.svelte @@ -42,7 +42,7 @@ const selectedIncome = $incomeTypes.find(income => income.id === $selectedIncomeId); const data = { incomeCategory: selectedIncome.id, - amount: amount, + amount: parseInt(amount), }; addNewIncome(selectedIncome.id, amount); From 7befb0dac796af17325ffe669816e2a17bf2b213 Mon Sep 17 00:00:00 2001 From: Daniel <59575049+lumijiez@users.noreply.github.com> Date: Fri, 27 Oct 2023 01:24:43 +0300 Subject: [PATCH 2/8] Update README.md --- README.md | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 62 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 7a78351..c0770a5 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,63 @@ -# ExpenseTrackerFAF +# Expense Tracker App + +## Description + +Expense Tracker is a web application that helps you keep track of your expenses and incomes. It provides a user-friendly interface to enter and visualize your financial data, making it easier to manage your finances. + +## Features + +- Single-page application for a smooth and responsive user experience. +- Reactive graph updates to visualize your financial data. +- Ability to add incomes and expenses to your account. +- Full-fledged authorization system to secure your data. +- Hosted database for seamless data storage and retrieval. + +## Tech Stack + +### Frontend + +- Svelte +- Chart.js +- Axios + +### Backend + +- Spring +- Spring Boot +- Spring Security + +### Database + +- MySQL +- phpMyAdmin + +## Installation Instructions + +To run the Expense Tracker application, follow these steps: + +1. Clone the project repository to your local machine. + +2. Install the required Maven dependencies for the backend. In the project directory, run: + +3. Run the backend Spring application to start the server. + +4. For the frontend, navigate to the `frontend` directory and run: + +```npm install``` +```npm run dev``` + +This will start the frontend development server and open the application in your web browser. + +Now you can access the Expense Tracker application at http://localhost:3000 and start tracking your expenses and incomes visually. + +Please note that you need to configure the database connection details and other environment-specific settings in the application properties before running the backend. + +### Configuration + +Make sure to update the configuration files with your specific database settings, security configurations, and other environment variables as needed. You can find these configuration files in the backend project. + +Feel free to customize the application further and adapt it to your specific use case. + +Happy expense tracking! + -Expense tracker project made in Spring by a group of senior full-stack Nobel winner students. From 4fdd67fa2144c20ff089b945ca01aa13dd529a42 Mon Sep 17 00:00:00 2001 From: Daniel <59575049+lumijiez@users.noreply.github.com> Date: Fri, 27 Oct 2023 01:25:52 +0300 Subject: [PATCH 3/8] Update README.md --- README.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index c0770a5..4cdc350 100644 --- a/README.md +++ b/README.md @@ -41,14 +41,15 @@ To run the Expense Tracker application, follow these steps: 3. Run the backend Spring application to start the server. -4. For the frontend, navigate to the `frontend` directory and run: +4. For the frontend, navigate to the `web` directory and run: -```npm install``` -```npm run dev``` +```bash +npm install +npm run dev``` This will start the frontend development server and open the application in your web browser. -Now you can access the Expense Tracker application at http://localhost:3000 and start tracking your expenses and incomes visually. +Now you can access the Expense Tracker application at http://localhost:5173/auth/login and start tracking your expenses and incomes visually. Please note that you need to configure the database connection details and other environment-specific settings in the application properties before running the backend. From 4403d60dc6c4e05a2d787c5e73fdf7928d773bb9 Mon Sep 17 00:00:00 2001 From: Daniel <59575049+lumijiez@users.noreply.github.com> Date: Fri, 27 Oct 2023 01:27:07 +0300 Subject: [PATCH 4/8] Update README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 4cdc350..4d50ba3 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,8 @@ To run the Expense Tracker application, follow these steps: ```bash npm install -npm run dev``` +npm run dev +``` This will start the frontend development server and open the application in your web browser. From 94ef63253e1c3231a74cbe26f10b2d0762d216da Mon Sep 17 00:00:00 2001 From: Daniel <59575049+lumijiez@users.noreply.github.com> Date: Fri, 27 Oct 2023 01:27:32 +0300 Subject: [PATCH 5/8] Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 4d50ba3..2fa38ed 100644 --- a/README.md +++ b/README.md @@ -45,6 +45,9 @@ To run the Expense Tracker application, follow these steps: ```bash npm install +``` + +```bash npm run dev ``` From 1ea883ae5f335703d01554f271e647547a990b6b Mon Sep 17 00:00:00 2001 From: Dmitrii Cravcenco Date: Fri, 27 Oct 2023 16:25:44 +0300 Subject: [PATCH 6/8] Add expense/income deletion --- .../expensetrackerfaf/controller/ExpenseController.java | 5 +++++ .../expensetrackerfaf/controller/IncomeController.java | 5 +++++ .../com/faf223/expensetrackerfaf/service/ExpenseService.java | 4 ++++ .../com/faf223/expensetrackerfaf/service/IncomeService.java | 4 ++++ 4 files changed, 18 insertions(+) diff --git a/src/main/java/com/faf223/expensetrackerfaf/controller/ExpenseController.java b/src/main/java/com/faf223/expensetrackerfaf/controller/ExpenseController.java index 0c6b710..6d5268c 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/controller/ExpenseController.java +++ b/src/main/java/com/faf223/expensetrackerfaf/controller/ExpenseController.java @@ -98,4 +98,9 @@ public class ExpenseController { if (!categories.isEmpty()) return ResponseEntity.ok(categories); else return ResponseEntity.notFound().build(); } + + @DeleteMapping("/expenses/{id}") + public void deleteCategory(@PathVariable long id) { + expenseService.deleteExpenseById(id); + } } \ No newline at end of file diff --git a/src/main/java/com/faf223/expensetrackerfaf/controller/IncomeController.java b/src/main/java/com/faf223/expensetrackerfaf/controller/IncomeController.java index e43b5ba..5bb6e20 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/controller/IncomeController.java +++ b/src/main/java/com/faf223/expensetrackerfaf/controller/IncomeController.java @@ -96,4 +96,9 @@ public class IncomeController { if (!categories.isEmpty()) return ResponseEntity.ok(categories); else return ResponseEntity.notFound().build(); } + + @DeleteMapping("/incomes/{id}") + public void deleteIncome(@PathVariable long id) { + incomeService.deleteIncomeById(id); + } } \ No newline at end of file diff --git a/src/main/java/com/faf223/expensetrackerfaf/service/ExpenseService.java b/src/main/java/com/faf223/expensetrackerfaf/service/ExpenseService.java index 4209fd6..7976a33 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/service/ExpenseService.java +++ b/src/main/java/com/faf223/expensetrackerfaf/service/ExpenseService.java @@ -40,4 +40,8 @@ public class ExpenseService implements ITransactionService { public Expense getTransactionById(long id) { return expenseRepository.findById(id).orElse(null); } + + public void deleteExpenseById(long id) { + expenseRepository.deleteById(id); + } } \ No newline at end of file diff --git a/src/main/java/com/faf223/expensetrackerfaf/service/IncomeService.java b/src/main/java/com/faf223/expensetrackerfaf/service/IncomeService.java index 8287d01..dcfb2e9 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/service/IncomeService.java +++ b/src/main/java/com/faf223/expensetrackerfaf/service/IncomeService.java @@ -40,4 +40,8 @@ public class IncomeService implements ITransactionService { public Income getTransactionById(long id) { return incomeRepository.findById(id).orElse(null); } + + public void deleteIncomeById(long id) { + incomeRepository.deleteById(id); + } } From 55dc6125ad6ba2c95aa19b9e7e89e7907cc7ca84 Mon Sep 17 00:00:00 2001 From: Dmitrii Cravcenco Date: Fri, 27 Oct 2023 16:25:44 +0300 Subject: [PATCH 7/8] Add expense/income deletion --- .../expensetrackerfaf/controller/ExpenseController.java | 5 +++++ .../expensetrackerfaf/controller/IncomeController.java | 5 +++++ .../com/faf223/expensetrackerfaf/service/ExpenseService.java | 4 ++++ .../com/faf223/expensetrackerfaf/service/IncomeService.java | 4 ++++ 4 files changed, 18 insertions(+) diff --git a/src/main/java/com/faf223/expensetrackerfaf/controller/ExpenseController.java b/src/main/java/com/faf223/expensetrackerfaf/controller/ExpenseController.java index 0c6b710..501035f 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/controller/ExpenseController.java +++ b/src/main/java/com/faf223/expensetrackerfaf/controller/ExpenseController.java @@ -98,4 +98,9 @@ public class ExpenseController { if (!categories.isEmpty()) return ResponseEntity.ok(categories); else return ResponseEntity.notFound().build(); } + + @DeleteMapping("/delete/{id}") + public void deleteCategory(@PathVariable long id) { + expenseService.deleteExpenseById(id); + } } \ No newline at end of file diff --git a/src/main/java/com/faf223/expensetrackerfaf/controller/IncomeController.java b/src/main/java/com/faf223/expensetrackerfaf/controller/IncomeController.java index e43b5ba..164ec9e 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/controller/IncomeController.java +++ b/src/main/java/com/faf223/expensetrackerfaf/controller/IncomeController.java @@ -96,4 +96,9 @@ public class IncomeController { if (!categories.isEmpty()) return ResponseEntity.ok(categories); else return ResponseEntity.notFound().build(); } + + @DeleteMapping("/delete/{id}") + public void deleteIncome(@PathVariable long id) { + incomeService.deleteIncomeById(id); + } } \ No newline at end of file diff --git a/src/main/java/com/faf223/expensetrackerfaf/service/ExpenseService.java b/src/main/java/com/faf223/expensetrackerfaf/service/ExpenseService.java index 4209fd6..7976a33 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/service/ExpenseService.java +++ b/src/main/java/com/faf223/expensetrackerfaf/service/ExpenseService.java @@ -40,4 +40,8 @@ public class ExpenseService implements ITransactionService { public Expense getTransactionById(long id) { return expenseRepository.findById(id).orElse(null); } + + public void deleteExpenseById(long id) { + expenseRepository.deleteById(id); + } } \ No newline at end of file diff --git a/src/main/java/com/faf223/expensetrackerfaf/service/IncomeService.java b/src/main/java/com/faf223/expensetrackerfaf/service/IncomeService.java index 8287d01..dcfb2e9 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/service/IncomeService.java +++ b/src/main/java/com/faf223/expensetrackerfaf/service/IncomeService.java @@ -40,4 +40,8 @@ public class IncomeService implements ITransactionService { public Income getTransactionById(long id) { return incomeRepository.findById(id).orElse(null); } + + public void deleteIncomeById(long id) { + incomeRepository.deleteById(id); + } } From eb2d0e53dc15ef27d89178ad3c75bd35e4f2bd64 Mon Sep 17 00:00:00 2001 From: Dmitrii Cravcenco Date: Fri, 27 Oct 2023 17:53:00 +0300 Subject: [PATCH 8/8] Add expense/income update --- .../controller/ExpenseController.java | 14 +++++++++----- .../controller/IncomeController.java | 19 +++++++++++-------- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/faf223/expensetrackerfaf/controller/ExpenseController.java b/src/main/java/com/faf223/expensetrackerfaf/controller/ExpenseController.java index 501035f..b6b8964 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/controller/ExpenseController.java +++ b/src/main/java/com/faf223/expensetrackerfaf/controller/ExpenseController.java @@ -61,14 +61,18 @@ public class ExpenseController { } - // TODO: has to be checked on auto extracting Uuid - @PatchMapping() - public ResponseEntity updateExpense(@RequestBody ExpenseCreationDTO expenseDTO, + // TODO: check if the expense belongs to the user + @PatchMapping("/update/{id}") + public ResponseEntity updateExpense(@PathVariable long id, @RequestBody ExpenseCreationDTO expenseDTO, BindingResult bindingResult) { - Expense expense = expenseMapper.toExpense(expenseDTO); + Expense expense = expenseService.getTransactionById(id); + ExpenseCategory category = expenseCategoryService.getCategoryById(expenseDTO.getExpenseCategory()); + expense.setCategory(category); + expense.setAmount(expenseDTO.getAmount()); + if (!bindingResult.hasErrors()) { expenseService.createOrUpdate(expense); - return ResponseEntity.ok(expenseMapper.toDto(expense)); + return ResponseEntity.status(HttpStatus.CREATED).build(); } else { return ResponseEntity.notFound().build(); } diff --git a/src/main/java/com/faf223/expensetrackerfaf/controller/IncomeController.java b/src/main/java/com/faf223/expensetrackerfaf/controller/IncomeController.java index 164ec9e..cbe59c2 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/controller/IncomeController.java +++ b/src/main/java/com/faf223/expensetrackerfaf/controller/IncomeController.java @@ -3,9 +3,7 @@ package com.faf223.expensetrackerfaf.controller; import com.faf223.expensetrackerfaf.dto.IncomeCreationDTO; import com.faf223.expensetrackerfaf.dto.IncomeDTO; import com.faf223.expensetrackerfaf.dto.mappers.IncomeMapper; -import com.faf223.expensetrackerfaf.model.Income; -import com.faf223.expensetrackerfaf.model.IncomeCategory; -import com.faf223.expensetrackerfaf.model.User; +import com.faf223.expensetrackerfaf.model.*; import com.faf223.expensetrackerfaf.service.IncomeCategoryService; import com.faf223.expensetrackerfaf.service.IncomeService; import com.faf223.expensetrackerfaf.service.UserService; @@ -60,13 +58,18 @@ public class IncomeController { return ResponseEntity.notFound().build(); } - @PatchMapping() - public ResponseEntity updateIncome(@RequestBody IncomeCreationDTO incomeDTO, - BindingResult bindingResult) { - Income income = incomeMapper.toIncome(incomeDTO); + // TODO: check if the income belongs to the user, extract logic into service + @PatchMapping("/update/{id}") + public ResponseEntity updateIncome(@PathVariable long id, @RequestBody IncomeCreationDTO incomeDTO, + BindingResult bindingResult) { + Income income = incomeService.getTransactionById(id); + IncomeCategory category = incomeCategoryService.getCategoryById(incomeDTO.getIncomeCategory()); + income.setCategory(category); + income.setAmount(incomeDTO.getAmount()); + if (!bindingResult.hasErrors()) { incomeService.createOrUpdate(income); - return ResponseEntity.ok(incomeMapper.toDto(income)); + return ResponseEntity.status(HttpStatus.CREATED).build(); } else { return ResponseEntity.notFound().build(); }