From 6ca8b861e49bbe3476768bb94d14dc2c47c07842 Mon Sep 17 00:00:00 2001 From: Daniel Date: Thu, 19 Oct 2023 23:02:09 +0300 Subject: [PATCH 01/17] Connected two graphs to backend, WIP --- pom.xml | 5 + .../expensetrackerfaf/config/CorsConfig.java | 14 +++ .../expensetrackerfaf/config/CorsFilter.java | 40 ++++++++ .../controller/IncomeController.java | 2 + .../expensetrackerfaf/web/package-lock.json | 91 +++++++++++++++++++ .../faf223/expensetrackerfaf/web/package.json | 1 + .../dashboard/board/graphs/Graph1.svelte | 62 ++++++++----- .../dashboard/board/graphs/Graph3.svelte | 91 +++++++++---------- 8 files changed, 236 insertions(+), 70 deletions(-) create mode 100644 src/main/java/com/faf223/expensetrackerfaf/config/CorsConfig.java create mode 100644 src/main/java/com/faf223/expensetrackerfaf/config/CorsFilter.java diff --git a/pom.xml b/pom.xml index 49ac77e..4a4217c 100644 --- a/pom.xml +++ b/pom.xml @@ -22,6 +22,11 @@ spring-boot-starter-web 3.1.4 + + org.apache.httpcomponents + httpclient + test + org.springframework.boot spring-boot-starter-data-jpa diff --git a/src/main/java/com/faf223/expensetrackerfaf/config/CorsConfig.java b/src/main/java/com/faf223/expensetrackerfaf/config/CorsConfig.java new file mode 100644 index 0000000..458f2ff --- /dev/null +++ b/src/main/java/com/faf223/expensetrackerfaf/config/CorsConfig.java @@ -0,0 +1,14 @@ +package com.faf223.expensetrackerfaf.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class CorsConfig implements WebMvcConfigurer { + + @Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/**").allowedMethods("*"); + } +} diff --git a/src/main/java/com/faf223/expensetrackerfaf/config/CorsFilter.java b/src/main/java/com/faf223/expensetrackerfaf/config/CorsFilter.java new file mode 100644 index 0000000..8c61939 --- /dev/null +++ b/src/main/java/com/faf223/expensetrackerfaf/config/CorsFilter.java @@ -0,0 +1,40 @@ +package com.faf223.expensetrackerfaf.config; + +import jakarta.servlet.*; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +import java.io.IOException; + +@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +public class CorsFilter implements Filter { + + @Override + public void destroy() { + } + + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) + throws IOException, ServletException { + HttpServletResponse response = (HttpServletResponse) res; + HttpServletRequest request = (HttpServletRequest) req; + + response.setHeader("Access-Control-Allow-Origin", "http://localhost:5173"); + response.setHeader("Access-Control-Allow-Methods", "POST, PUT, GET, OPTIONS, DELETE"); + response.setHeader("Access-Control-Max-Age", "3600"); + response.setHeader("Access-Control-Allow-Headers", "X-Requested-With, X-Auth-Token"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + + if (!"OPTIONS".equalsIgnoreCase(request.getMethod())) { + chain.doFilter(req, res); + } + } + + @Override + public void init(FilterConfig config) { + } +} diff --git a/src/main/java/com/faf223/expensetrackerfaf/controller/IncomeController.java b/src/main/java/com/faf223/expensetrackerfaf/controller/IncomeController.java index 6811d10..eb42b55 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/controller/IncomeController.java +++ b/src/main/java/com/faf223/expensetrackerfaf/controller/IncomeController.java @@ -14,6 +14,7 @@ import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.stream.Collectors; +@CrossOrigin @RestController @RequestMapping("/incomes") @RequiredArgsConstructor @@ -54,6 +55,7 @@ public class IncomeController { } } + @CrossOrigin @GetMapping("/{userUuid}") public ResponseEntity> getIncomesByUser(@PathVariable String userUuid) { List incomes = incomeService.getIncomesByUserId(userUuid).stream().map(incomeMapper::toDto).collect(Collectors.toList()); diff --git a/src/main/java/com/faf223/expensetrackerfaf/web/package-lock.json b/src/main/java/com/faf223/expensetrackerfaf/web/package-lock.json index 58c9edf..720921d 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/web/package-lock.json +++ b/src/main/java/com/faf223/expensetrackerfaf/web/package-lock.json @@ -10,6 +10,7 @@ "dependencies": { "@fortawesome/free-brands-svg-icons": "^6.4.2", "@fortawesome/free-solid-svg-icons": "^6.4.2", + "axios": "^1.5.1", "chart.js": "^4.4.0", "email-validator": "^2.0.4", "svelte-fa": "^3.0.4" @@ -810,6 +811,21 @@ "dequal": "^2.0.3" } }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/axios": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.1.tgz", + "integrity": "sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, "node_modules/axobject-query": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", @@ -902,6 +918,17 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -988,6 +1015,14 @@ "node": ">=0.10.0" } }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", @@ -1349,6 +1384,38 @@ "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", "dev": true }, + "node_modules/follow-redirects": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -1693,6 +1760,25 @@ "node": ">=10.0.0" } }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -2011,6 +2097,11 @@ "svelte": "^3.2.0 || ^4.0.0-next.0" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, "node_modules/punycode": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", diff --git a/src/main/java/com/faf223/expensetrackerfaf/web/package.json b/src/main/java/com/faf223/expensetrackerfaf/web/package.json index 556c627..6e015a3 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/web/package.json +++ b/src/main/java/com/faf223/expensetrackerfaf/web/package.json @@ -26,6 +26,7 @@ "dependencies": { "@fortawesome/free-brands-svg-icons": "^6.4.2", "@fortawesome/free-solid-svg-icons": "^6.4.2", + "axios": "^1.5.1", "chart.js": "^4.4.0", "email-validator": "^2.0.4", "svelte-fa": "^3.0.4" diff --git a/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/graphs/Graph1.svelte b/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/graphs/Graph1.svelte index b96ee01..44f850e 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/graphs/Graph1.svelte +++ b/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/graphs/Graph1.svelte @@ -1,30 +1,44 @@ @@ -34,15 +48,15 @@ \ No newline at end of file + #chart:hover { + box-shadow: 0 14px 28px rgba(0,0,0,0.25), 0 10px 10px rgba(0,0,0,0.22); + } + diff --git a/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/graphs/Graph3.svelte b/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/graphs/Graph3.svelte index dd737a6..0390f12 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/graphs/Graph3.svelte +++ b/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/graphs/Graph3.svelte @@ -1,45 +1,44 @@ @@ -49,15 +48,15 @@ \ No newline at end of file + #chart:hover { + box-shadow: 0 14px 28px rgba(0,0,0,0.25), 0 10px 10px rgba(0,0,0,0.22); + } + From 0698eb2478ea067f82876d05fd93156277e0ce52 Mon Sep 17 00:00:00 2001 From: mirrerror Date: Mon, 23 Oct 2023 16:09:54 +0300 Subject: [PATCH 02/17] make income and expense implement interface --- src/main/java/com/faf223/expensetrackerfaf/model/Expense.java | 3 ++- src/main/java/com/faf223/expensetrackerfaf/model/Income.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/faf223/expensetrackerfaf/model/Expense.java b/src/main/java/com/faf223/expensetrackerfaf/model/Expense.java index 6bdccb1..1194c75 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/model/Expense.java +++ b/src/main/java/com/faf223/expensetrackerfaf/model/Expense.java @@ -1,4 +1,5 @@ package com.faf223.expensetrackerfaf.model; +import com.faf223.expensetrackerfaf.util.IMoneyTransaction; import com.fasterxml.jackson.annotation.JsonIgnore; import jakarta.persistence.*; import lombok.AllArgsConstructor; @@ -13,7 +14,7 @@ import java.time.LocalDate; @AllArgsConstructor @NoArgsConstructor @Entity(name = "expenses") -public class Expense { +public class Expense implements IMoneyTransaction { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long expenseId; diff --git a/src/main/java/com/faf223/expensetrackerfaf/model/Income.java b/src/main/java/com/faf223/expensetrackerfaf/model/Income.java index a4c88f1..b08338d 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/model/Income.java +++ b/src/main/java/com/faf223/expensetrackerfaf/model/Income.java @@ -1,5 +1,6 @@ package com.faf223.expensetrackerfaf.model; +import com.faf223.expensetrackerfaf.util.IMoneyTransaction; import com.fasterxml.jackson.annotation.JsonIgnore; import jakarta.persistence.*; import lombok.AllArgsConstructor; @@ -13,7 +14,7 @@ import java.time.LocalDate; @AllArgsConstructor @NoArgsConstructor @Entity(name = "incomes") -public class Income { +public class Income implements IMoneyTransaction { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long incomeId; From e47f2f8df6650e6e0b8210c36df7fba724cb4cdd Mon Sep 17 00:00:00 2001 From: mirrerror Date: Mon, 23 Oct 2023 16:13:25 +0300 Subject: [PATCH 03/17] move money transaction interface --- src/main/java/com/faf223/expensetrackerfaf/model/Expense.java | 1 - .../expensetrackerfaf/{util => model}/IMoneyTransaction.java | 2 +- src/main/java/com/faf223/expensetrackerfaf/model/Income.java | 1 - 3 files changed, 1 insertion(+), 3 deletions(-) rename src/main/java/com/faf223/expensetrackerfaf/{util => model}/IMoneyTransaction.java (78%) diff --git a/src/main/java/com/faf223/expensetrackerfaf/model/Expense.java b/src/main/java/com/faf223/expensetrackerfaf/model/Expense.java index 1194c75..34b8a0c 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/model/Expense.java +++ b/src/main/java/com/faf223/expensetrackerfaf/model/Expense.java @@ -1,5 +1,4 @@ package com.faf223.expensetrackerfaf.model; -import com.faf223.expensetrackerfaf.util.IMoneyTransaction; import com.fasterxml.jackson.annotation.JsonIgnore; import jakarta.persistence.*; import lombok.AllArgsConstructor; diff --git a/src/main/java/com/faf223/expensetrackerfaf/util/IMoneyTransaction.java b/src/main/java/com/faf223/expensetrackerfaf/model/IMoneyTransaction.java similarity index 78% rename from src/main/java/com/faf223/expensetrackerfaf/util/IMoneyTransaction.java rename to src/main/java/com/faf223/expensetrackerfaf/model/IMoneyTransaction.java index 8817420..312b809 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/util/IMoneyTransaction.java +++ b/src/main/java/com/faf223/expensetrackerfaf/model/IMoneyTransaction.java @@ -1,4 +1,4 @@ -package com.faf223.expensetrackerfaf.util; +package com.faf223.expensetrackerfaf.model; import com.faf223.expensetrackerfaf.model.User; diff --git a/src/main/java/com/faf223/expensetrackerfaf/model/Income.java b/src/main/java/com/faf223/expensetrackerfaf/model/Income.java index b08338d..fc4282b 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/model/Income.java +++ b/src/main/java/com/faf223/expensetrackerfaf/model/Income.java @@ -1,6 +1,5 @@ package com.faf223.expensetrackerfaf.model; -import com.faf223.expensetrackerfaf.util.IMoneyTransaction; import com.fasterxml.jackson.annotation.JsonIgnore; import jakarta.persistence.*; import lombok.AllArgsConstructor; From 0afa1b2b7c193b85f6dd5e4cf0dae4eba95da67a Mon Sep 17 00:00:00 2001 From: mirrerror Date: Mon, 23 Oct 2023 16:38:09 +0300 Subject: [PATCH 04/17] optimize code, add interfaces --- .../dto/mappers/ExpenseMapper.java | 2 +- .../dto/mappers/IncomeMapper.java | 3 +- .../expensetrackerfaf/model/Credential.java | 52 +++++++++---------- .../expensetrackerfaf/model/Expense.java | 12 +++-- .../model/ExpenseCategory.java | 17 +++++- .../model/IMoneyTransaction.java | 9 ++-- .../model/IMoneyTransactionCategory.java | 6 +++ .../expensetrackerfaf/model/Income.java | 12 +++-- .../model/IncomeCategory.java | 16 +++++- .../faf223/expensetrackerfaf/model/Role.java | 1 - .../faf223/expensetrackerfaf/model/User.java | 1 - .../service/ExpenseService.java | 1 - .../service/IncomeService.java | 1 - 13 files changed, 87 insertions(+), 46 deletions(-) create mode 100644 src/main/java/com/faf223/expensetrackerfaf/model/IMoneyTransactionCategory.java diff --git a/src/main/java/com/faf223/expensetrackerfaf/dto/mappers/ExpenseMapper.java b/src/main/java/com/faf223/expensetrackerfaf/dto/mappers/ExpenseMapper.java index 74eeff7..466144f 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/dto/mappers/ExpenseMapper.java +++ b/src/main/java/com/faf223/expensetrackerfaf/dto/mappers/ExpenseMapper.java @@ -20,7 +20,7 @@ public class ExpenseMapper { } public ExpenseDTO toDto(Expense expense) { - return new ExpenseDTO(expense.getExpenseId(), userMapper.toDto(expense.getUser()), + return new ExpenseDTO(expense.getId(), userMapper.toDto(expense.getUser()), expense.getCategory(), expense.getDate(), expense.getAmount()); } diff --git a/src/main/java/com/faf223/expensetrackerfaf/dto/mappers/IncomeMapper.java b/src/main/java/com/faf223/expensetrackerfaf/dto/mappers/IncomeMapper.java index 32ca33e..5bdd805 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/dto/mappers/IncomeMapper.java +++ b/src/main/java/com/faf223/expensetrackerfaf/dto/mappers/IncomeMapper.java @@ -2,7 +2,6 @@ package com.faf223.expensetrackerfaf.dto.mappers; import com.faf223.expensetrackerfaf.dto.IncomeCreationDTO; import com.faf223.expensetrackerfaf.dto.IncomeDTO; -import com.faf223.expensetrackerfaf.model.Expense; import com.faf223.expensetrackerfaf.model.Income; import com.faf223.expensetrackerfaf.service.IncomeService; import org.springframework.beans.factory.annotation.Autowired; @@ -21,7 +20,7 @@ public class IncomeMapper { } public IncomeDTO toDto(Income income) { - return new IncomeDTO(income.getIncomeId(), userMapper.toDto(income.getUser()), + return new IncomeDTO(income.getId(), userMapper.toDto(income.getUser()), income.getCategory(), income.getDate(), income.getAmount()); } diff --git a/src/main/java/com/faf223/expensetrackerfaf/model/Credential.java b/src/main/java/com/faf223/expensetrackerfaf/model/Credential.java index f993e9f..ae93f5f 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/model/Credential.java +++ b/src/main/java/com/faf223/expensetrackerfaf/model/Credential.java @@ -1,35 +1,35 @@ - package com.faf223.expensetrackerfaf.model; +package com.faf223.expensetrackerfaf.model; - import jakarta.persistence.*; - import lombok.AllArgsConstructor; - import lombok.Data; - import lombok.NoArgsConstructor; +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; - @Data - @Entity(name = "credentials") - @NoArgsConstructor - @AllArgsConstructor - public class Credential { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long credentialId; +@Data +@Entity(name = "credentials") +@NoArgsConstructor +@AllArgsConstructor +public class Credential { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long credentialId; - @ManyToOne - @JoinColumn(name = "user_uuid") - private User user; + @ManyToOne + @JoinColumn(name = "user_uuid") + private User user; - private String email; - private String password; + private String email; + private String password; - @Enumerated(EnumType.STRING) - private Role role; + @Enumerated(EnumType.STRING) + private Role role; - public Credential(User user, String email, String password) { - this.user = user; - this.email = email; - this.password = password; + public Credential(User user, String email, String password) { + this.user = user; + this.email = email; + this.password = password; - this.role = Role.ROLE_USER; - } + this.role = Role.ROLE_USER; } +} diff --git a/src/main/java/com/faf223/expensetrackerfaf/model/Expense.java b/src/main/java/com/faf223/expensetrackerfaf/model/Expense.java index 34b8a0c..f9830d3 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/model/Expense.java +++ b/src/main/java/com/faf223/expensetrackerfaf/model/Expense.java @@ -1,10 +1,7 @@ package com.faf223.expensetrackerfaf.model; import com.fasterxml.jackson.annotation.JsonIgnore; import jakarta.persistence.*; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.ToString; -import lombok.NoArgsConstructor; +import lombok.*; import java.math.BigDecimal; import java.time.LocalDate; @@ -16,6 +13,7 @@ import java.time.LocalDate; public class Expense implements IMoneyTransaction { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Getter(AccessLevel.NONE) private Long expenseId; @ManyToOne() @@ -30,5 +28,11 @@ public class Expense implements IMoneyTransaction { private LocalDate date; private BigDecimal amount; + + @Override + public Long getId() { + return expenseId; + } + } diff --git a/src/main/java/com/faf223/expensetrackerfaf/model/ExpenseCategory.java b/src/main/java/com/faf223/expensetrackerfaf/model/ExpenseCategory.java index 7662ce6..ac8326b 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/model/ExpenseCategory.java +++ b/src/main/java/com/faf223/expensetrackerfaf/model/ExpenseCategory.java @@ -4,14 +4,29 @@ import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; +import lombok.AccessLevel; import lombok.Data; +import lombok.Getter; @Data @Entity(name = "expense_categories") -public class ExpenseCategory { +public class ExpenseCategory implements IMoneyTransactionCategory { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Getter(AccessLevel.NONE) private Long categoryId; + @Getter(AccessLevel.NONE) private String categoryName; + + @Override + public Long getId() { + return categoryId; + } + + @Override + public String getName() { + return categoryName; + } + } diff --git a/src/main/java/com/faf223/expensetrackerfaf/model/IMoneyTransaction.java b/src/main/java/com/faf223/expensetrackerfaf/model/IMoneyTransaction.java index 312b809..f565db3 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/model/IMoneyTransaction.java +++ b/src/main/java/com/faf223/expensetrackerfaf/model/IMoneyTransaction.java @@ -1,11 +1,14 @@ package com.faf223.expensetrackerfaf.model; -import com.faf223.expensetrackerfaf.model.User; +import java.math.BigDecimal; +import java.time.LocalDate; public interface IMoneyTransaction { + Long getId(); + LocalDate getDate(); User getUser(); - int getAmount(); - String getCategory(); + BigDecimal getAmount(); + IMoneyTransactionCategory getCategory(); } diff --git a/src/main/java/com/faf223/expensetrackerfaf/model/IMoneyTransactionCategory.java b/src/main/java/com/faf223/expensetrackerfaf/model/IMoneyTransactionCategory.java new file mode 100644 index 0000000..f326a9b --- /dev/null +++ b/src/main/java/com/faf223/expensetrackerfaf/model/IMoneyTransactionCategory.java @@ -0,0 +1,6 @@ +package com.faf223.expensetrackerfaf.model; + +public interface IMoneyTransactionCategory { + Long getId(); + String getName(); +} diff --git a/src/main/java/com/faf223/expensetrackerfaf/model/Income.java b/src/main/java/com/faf223/expensetrackerfaf/model/Income.java index fc4282b..c7476ed 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/model/Income.java +++ b/src/main/java/com/faf223/expensetrackerfaf/model/Income.java @@ -2,10 +2,8 @@ package com.faf223.expensetrackerfaf.model; import com.fasterxml.jackson.annotation.JsonIgnore; import jakarta.persistence.*; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.ToString; -import lombok.NoArgsConstructor; +import lombok.*; + import java.math.BigDecimal; import java.time.LocalDate; @@ -16,6 +14,7 @@ import java.time.LocalDate; public class Income implements IMoneyTransaction { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Getter(AccessLevel.NONE) private Long incomeId; @ManyToOne @@ -30,4 +29,9 @@ public class Income implements IMoneyTransaction { private LocalDate date; private BigDecimal amount; + + @Override + public Long getId() { + return incomeId; + } } diff --git a/src/main/java/com/faf223/expensetrackerfaf/model/IncomeCategory.java b/src/main/java/com/faf223/expensetrackerfaf/model/IncomeCategory.java index 8bb54f0..08b41f2 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/model/IncomeCategory.java +++ b/src/main/java/com/faf223/expensetrackerfaf/model/IncomeCategory.java @@ -4,15 +4,29 @@ import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; +import lombok.AccessLevel; import lombok.Data; +import lombok.Getter; @Data @Entity(name = "income_categories") -public class IncomeCategory { +public class IncomeCategory implements IMoneyTransactionCategory { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Getter(AccessLevel.NONE) private Long categoryId; + @Getter(AccessLevel.NONE) private String categoryName; + + @Override + public Long getId() { + return categoryId; + } + + @Override + public String getName() { + return categoryName; + } } diff --git a/src/main/java/com/faf223/expensetrackerfaf/model/Role.java b/src/main/java/com/faf223/expensetrackerfaf/model/Role.java index ea04328..6169bd2 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/model/Role.java +++ b/src/main/java/com/faf223/expensetrackerfaf/model/Role.java @@ -1,4 +1,3 @@ - package com.faf223.expensetrackerfaf.model; public enum Role { diff --git a/src/main/java/com/faf223/expensetrackerfaf/model/User.java b/src/main/java/com/faf223/expensetrackerfaf/model/User.java index 339416f..9588570 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/model/User.java +++ b/src/main/java/com/faf223/expensetrackerfaf/model/User.java @@ -1,4 +1,3 @@ - package com.faf223.expensetrackerfaf.model; import jakarta.persistence.*; diff --git a/src/main/java/com/faf223/expensetrackerfaf/service/ExpenseService.java b/src/main/java/com/faf223/expensetrackerfaf/service/ExpenseService.java index 0683998..a72ae8d 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/service/ExpenseService.java +++ b/src/main/java/com/faf223/expensetrackerfaf/service/ExpenseService.java @@ -5,7 +5,6 @@ import com.faf223.expensetrackerfaf.model.User; import com.faf223.expensetrackerfaf.repository.ExpenseRepository; import com.faf223.expensetrackerfaf.repository.UserRepository; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.ArrayList; diff --git a/src/main/java/com/faf223/expensetrackerfaf/service/IncomeService.java b/src/main/java/com/faf223/expensetrackerfaf/service/IncomeService.java index 63e1bab..a7711d6 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/service/IncomeService.java +++ b/src/main/java/com/faf223/expensetrackerfaf/service/IncomeService.java @@ -5,7 +5,6 @@ import com.faf223.expensetrackerfaf.model.User; import com.faf223.expensetrackerfaf.repository.IncomeRepository; import com.faf223.expensetrackerfaf.repository.UserRepository; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.ArrayList; From c07e3ca876813d242485f8d51a79e54786aaff75 Mon Sep 17 00:00:00 2001 From: mirrerror Date: Mon, 23 Oct 2023 16:48:10 +0300 Subject: [PATCH 05/17] optimize code --- .../expensetrackerfaf/model/Expense.java | 10 ++----- .../model/ExpenseCategory.java | 26 ++++--------------- .../expensetrackerfaf/model/Income.java | 9 ++----- .../model/IncomeCategory.java | 25 ++++-------------- 4 files changed, 14 insertions(+), 56 deletions(-) diff --git a/src/main/java/com/faf223/expensetrackerfaf/model/Expense.java b/src/main/java/com/faf223/expensetrackerfaf/model/Expense.java index f9830d3..32fe40d 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/model/Expense.java +++ b/src/main/java/com/faf223/expensetrackerfaf/model/Expense.java @@ -13,8 +13,8 @@ import java.time.LocalDate; public class Expense implements IMoneyTransaction { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - @Getter(AccessLevel.NONE) - private Long expenseId; + @Column(name = "expense_id") + private Long id; @ManyToOne() @JoinColumn(name = "user_uuid") @@ -28,11 +28,5 @@ public class Expense implements IMoneyTransaction { private LocalDate date; private BigDecimal amount; - - @Override - public Long getId() { - return expenseId; - } - } diff --git a/src/main/java/com/faf223/expensetrackerfaf/model/ExpenseCategory.java b/src/main/java/com/faf223/expensetrackerfaf/model/ExpenseCategory.java index ac8326b..c5989ea 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/model/ExpenseCategory.java +++ b/src/main/java/com/faf223/expensetrackerfaf/model/ExpenseCategory.java @@ -1,32 +1,16 @@ package com.faf223.expensetrackerfaf.model; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import lombok.AccessLevel; +import jakarta.persistence.*; import lombok.Data; -import lombok.Getter; @Data @Entity(name = "expense_categories") public class ExpenseCategory implements IMoneyTransactionCategory { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - @Getter(AccessLevel.NONE) - private Long categoryId; - - @Getter(AccessLevel.NONE) - private String categoryName; - - @Override - public Long getId() { - return categoryId; - } - - @Override - public String getName() { - return categoryName; - } + @Column(name = "category_id") + private Long id; + @Column(name = "category_name") + private String name; } diff --git a/src/main/java/com/faf223/expensetrackerfaf/model/Income.java b/src/main/java/com/faf223/expensetrackerfaf/model/Income.java index c7476ed..967fa3b 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/model/Income.java +++ b/src/main/java/com/faf223/expensetrackerfaf/model/Income.java @@ -14,8 +14,8 @@ import java.time.LocalDate; public class Income implements IMoneyTransaction { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - @Getter(AccessLevel.NONE) - private Long incomeId; + @Column(name = "income_id") + private Long id; @ManyToOne @JoinColumn(name = "user_uuid") @@ -29,9 +29,4 @@ public class Income implements IMoneyTransaction { private LocalDate date; private BigDecimal amount; - - @Override - public Long getId() { - return incomeId; - } } diff --git a/src/main/java/com/faf223/expensetrackerfaf/model/IncomeCategory.java b/src/main/java/com/faf223/expensetrackerfaf/model/IncomeCategory.java index 08b41f2..237c41f 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/model/IncomeCategory.java +++ b/src/main/java/com/faf223/expensetrackerfaf/model/IncomeCategory.java @@ -1,32 +1,17 @@ package com.faf223.expensetrackerfaf.model; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import lombok.AccessLevel; +import jakarta.persistence.*; import lombok.Data; -import lombok.Getter; @Data @Entity(name = "income_categories") public class IncomeCategory implements IMoneyTransactionCategory { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - @Getter(AccessLevel.NONE) - private Long categoryId; + @Column(name = "category_id") + private Long id; - @Getter(AccessLevel.NONE) - private String categoryName; - - @Override - public Long getId() { - return categoryId; - } - - @Override - public String getName() { - return categoryName; - } + @Column(name = "category_name") + private String name; } From 4fed3dba9e73542707a95f9cdddce3c1fa8708db Mon Sep 17 00:00:00 2001 From: Dmitrii Cravcenco Date: Mon, 23 Oct 2023 18:52:38 +0300 Subject: [PATCH 06/17] Change getting expenses/incomes logic --- .../controller/ExpenseController.java | 24 +++++++++++++++---- .../controller/IncomeController.java | 24 +++++++++++++++---- .../service/ExpenseService.java | 15 ++++++------ .../service/IncomeService.java | 15 ++++++------ 4 files changed, 52 insertions(+), 26 deletions(-) diff --git a/src/main/java/com/faf223/expensetrackerfaf/controller/ExpenseController.java b/src/main/java/com/faf223/expensetrackerfaf/controller/ExpenseController.java index e7f000f..e652add 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/controller/ExpenseController.java +++ b/src/main/java/com/faf223/expensetrackerfaf/controller/ExpenseController.java @@ -8,6 +8,9 @@ import com.faf223.expensetrackerfaf.service.ExpenseService; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.userdetails.UserDetails; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; @@ -54,11 +57,22 @@ public class ExpenseController { } } - @GetMapping("/{userUuid}") - public ResponseEntity> getExpensesByUser(@PathVariable String userUuid) { - List expenses = expenseService.getExpensesByUserId(userUuid).stream().map(expenseMapper::toDto).collect(Collectors.toList()); - if (!expenses.isEmpty()) return ResponseEntity.ok(expenses); - else return ResponseEntity.notFound().build(); + @GetMapping("/personal-expenses") + public ResponseEntity> getExpensesByUser() { + + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + + if (authentication != null && authentication.getPrincipal() instanceof UserDetails userDetails) { + + String email = userDetails.getUsername(); + List expenses = expenseService.getExpensesByEmail(email).stream().map(expenseMapper::toDto).collect(Collectors.toList()); + + if (!expenses.isEmpty()) { + return ResponseEntity.ok(expenses); + } + } + + 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 6811d10..f076b79 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/controller/IncomeController.java +++ b/src/main/java/com/faf223/expensetrackerfaf/controller/IncomeController.java @@ -8,6 +8,9 @@ import com.faf223.expensetrackerfaf.service.IncomeService; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.userdetails.UserDetails; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; @@ -54,11 +57,22 @@ public class IncomeController { } } - @GetMapping("/{userUuid}") - public ResponseEntity> getIncomesByUser(@PathVariable String userUuid) { - List incomes = incomeService.getIncomesByUserId(userUuid).stream().map(incomeMapper::toDto).collect(Collectors.toList()); - if (!incomes.isEmpty()) return ResponseEntity.ok(incomes); - else return ResponseEntity.notFound().build(); + @GetMapping("/personal-incomes") + public ResponseEntity> getIncomesByUser() { + + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + + if (authentication != null && authentication.getPrincipal() instanceof UserDetails userDetails) { + + String email = userDetails.getUsername(); + List expenses = incomeService.getIncomesByEmail(email).stream().map(incomeMapper::toDto).collect(Collectors.toList()); + + if (!expenses.isEmpty()) { + return ResponseEntity.ok(expenses); + } + } + + return ResponseEntity.notFound().build(); } } diff --git a/src/main/java/com/faf223/expensetrackerfaf/service/ExpenseService.java b/src/main/java/com/faf223/expensetrackerfaf/service/ExpenseService.java index 0683998..1bea04a 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/service/ExpenseService.java +++ b/src/main/java/com/faf223/expensetrackerfaf/service/ExpenseService.java @@ -1,11 +1,10 @@ package com.faf223.expensetrackerfaf.service; +import com.faf223.expensetrackerfaf.model.Credential; import com.faf223.expensetrackerfaf.model.Expense; -import com.faf223.expensetrackerfaf.model.User; +import com.faf223.expensetrackerfaf.repository.CredentialRepository; import com.faf223.expensetrackerfaf.repository.ExpenseRepository; -import com.faf223.expensetrackerfaf.repository.UserRepository; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.ArrayList; @@ -17,17 +16,17 @@ import java.util.Optional; public class ExpenseService { private final ExpenseRepository expenseRepository; - private final UserRepository userRepository; + private final CredentialRepository credentialRepository; public void createOrUpdateExpense(Expense expense) { expenseRepository.save(expense); } - public List getExpensesByUserId(String userUuid) { + public List getExpensesByEmail(String email) { - Optional user = userRepository.getUserByUserUuid(userUuid); - if (user.isPresent()) { - return expenseRepository.findByUser(user.get()); + Optional credential = credentialRepository.findByEmail(email); + if (credential.isPresent()) { + return expenseRepository.findByUser(credential.get().getUser()); } return new ArrayList<>(); diff --git a/src/main/java/com/faf223/expensetrackerfaf/service/IncomeService.java b/src/main/java/com/faf223/expensetrackerfaf/service/IncomeService.java index 63e1bab..16946a9 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/service/IncomeService.java +++ b/src/main/java/com/faf223/expensetrackerfaf/service/IncomeService.java @@ -1,11 +1,10 @@ package com.faf223.expensetrackerfaf.service; +import com.faf223.expensetrackerfaf.model.Credential; import com.faf223.expensetrackerfaf.model.Income; -import com.faf223.expensetrackerfaf.model.User; +import com.faf223.expensetrackerfaf.repository.CredentialRepository; import com.faf223.expensetrackerfaf.repository.IncomeRepository; -import com.faf223.expensetrackerfaf.repository.UserRepository; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.ArrayList; @@ -17,7 +16,7 @@ import java.util.Optional; public class IncomeService { private final IncomeRepository incomeRepository; - private final UserRepository userRepository; + private final CredentialRepository credentialRepository; public void createOrUpdateIncome(Income income) { incomeRepository.save(income); @@ -27,11 +26,11 @@ public class IncomeService { return incomeRepository.findAll(); } - public List getIncomesByUserId(String userUuid) { + public List getIncomesByEmail(String email) { - Optional user = userRepository.getUserByUserUuid(userUuid); - if (user.isPresent()) { - return incomeRepository.findByUser(user.get()); + Optional credential = credentialRepository.findByEmail(email); + if (credential.isPresent()) { + return incomeRepository.findByUser(credential.get().getUser()); } return new ArrayList<>(); From 84b48afb215f3f0ec28a796b37d625bdba7e19e0 Mon Sep 17 00:00:00 2001 From: Dmitrii Cravcenco Date: Tue, 24 Oct 2023 18:30:37 +0300 Subject: [PATCH 07/17] Fix expense/income creation --- .../config/SecurityConfiguration.java | 27 ------------------- .../expensetrackerfaf/model/Expense.java | 21 ++++++++++----- 2 files changed, 14 insertions(+), 34 deletions(-) diff --git a/src/main/java/com/faf223/expensetrackerfaf/config/SecurityConfiguration.java b/src/main/java/com/faf223/expensetrackerfaf/config/SecurityConfiguration.java index c95f0f8..7343ab9 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/config/SecurityConfiguration.java +++ b/src/main/java/com/faf223/expensetrackerfaf/config/SecurityConfiguration.java @@ -43,34 +43,7 @@ public class SecurityConfiguration { .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) .authenticationProvider(authenticationProvider) .addFilterBefore(jwtAuthFilter, UsernamePasswordAuthenticationFilter.class); // will be executed before UsernamePasswordAuthenticationFilter -// .oauth2Login(Customizer.withDefaults()); - return http.build(); } - @Bean - public ClientRegistrationRepository clientRegistrationRepository( - @Value("${spring.security.oauth2.client.registration.google.client-id}") String clientId, - @Value("${spring.security.oauth2.client.registration.google.client-secret}") String clientSecret) { - - ClientRegistration registration = ClientRegistration.withRegistrationId("google") - .clientId(clientId) - .clientSecret(clientSecret) - .clientName("Google") - .authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE) - .redirectUri("http://localhost:8081/login/oauth2/code/{registrationId}") - .scope("openid", "profile", "email") - .authorizationUri("https://accounts.google.com/o/oauth2/auth") - .tokenUri("https://accounts.google.com/o/oauth2/token") - .userInfoUri("https://www.googleapis.com/oauth2/v3/userinfo") - .userNameAttributeName(IdTokenClaimNames.SUB) - .build(); - - return new InMemoryClientRegistrationRepository(registration); - } - - @Bean - public OAuth2UserService oAuth2UserService() { - return new DefaultOAuth2UserService(); - } } diff --git a/src/main/java/com/faf223/expensetrackerfaf/model/Expense.java b/src/main/java/com/faf223/expensetrackerfaf/model/Expense.java index 6bdccb1..5b09733 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/model/Expense.java +++ b/src/main/java/com/faf223/expensetrackerfaf/model/Expense.java @@ -1,10 +1,8 @@ package com.faf223.expensetrackerfaf.model; +import com.faf223.expensetrackerfaf.util.IMoneyTransaction; import com.fasterxml.jackson.annotation.JsonIgnore; import jakarta.persistence.*; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.ToString; -import lombok.NoArgsConstructor; +import lombok.*; import java.math.BigDecimal; import java.time.LocalDate; @@ -13,10 +11,11 @@ import java.time.LocalDate; @AllArgsConstructor @NoArgsConstructor @Entity(name = "expenses") -public class Expense { +public class Expense implements IMoneyTransaction { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long expenseId; + @Column(name = "expense_id") + private Long id; @ManyToOne() @JoinColumn(name = "user_uuid") @@ -30,5 +29,13 @@ public class Expense { private LocalDate date; private BigDecimal amount; -} + public Expense(LocalDate date, BigDecimal amount) { + } + + public Expense(ExpenseCategory expenseCategory, LocalDate date, BigDecimal amount) { + this.category = expenseCategory; + this.date = date; + this.amount = amount; + } +} \ No newline at end of file From d402514ecbe32f6e72ea473d3405cd1773697657 Mon Sep 17 00:00:00 2001 From: Dmitrii Cravcenco Date: Tue, 24 Oct 2023 18:34:51 +0300 Subject: [PATCH 08/17] Fix expense/income creation --- .../controller/ExpenseController.java | 28 +++++++++++++---- .../controller/IncomeController.java | 31 +++++++++++++------ .../dto/ExpenseCreationDTO.java | 7 ++--- .../expensetrackerfaf/dto/ExpenseDTO.java | 4 ++- .../dto/IncomeCreationDTO.java | 7 ++--- .../expensetrackerfaf/dto/IncomeDTO.java | 6 ++-- .../dto/mappers/ExpenseMapper.java | 15 +++++---- .../dto/mappers/IncomeMapper.java | 16 ++++++---- .../expensetrackerfaf/model/Expense.java | 1 - .../expensetrackerfaf/model/Income.java | 6 ++++ .../service/ExpenseCategoryService.java | 18 +++++++++++ .../service/IncomeCategoryService.java | 17 ++++++++++ .../service/UserService.java | 12 +++++++ 13 files changed, 127 insertions(+), 41 deletions(-) create mode 100644 src/main/java/com/faf223/expensetrackerfaf/service/ExpenseCategoryService.java create mode 100644 src/main/java/com/faf223/expensetrackerfaf/service/IncomeCategoryService.java diff --git a/src/main/java/com/faf223/expensetrackerfaf/controller/ExpenseController.java b/src/main/java/com/faf223/expensetrackerfaf/controller/ExpenseController.java index e652add..f8cbb19 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/controller/ExpenseController.java +++ b/src/main/java/com/faf223/expensetrackerfaf/controller/ExpenseController.java @@ -4,8 +4,13 @@ import com.faf223.expensetrackerfaf.dto.ExpenseCreationDTO; import com.faf223.expensetrackerfaf.dto.ExpenseDTO; import com.faf223.expensetrackerfaf.dto.mappers.ExpenseMapper; import com.faf223.expensetrackerfaf.model.Expense; +import com.faf223.expensetrackerfaf.model.ExpenseCategory; +import com.faf223.expensetrackerfaf.model.User; +import com.faf223.expensetrackerfaf.service.ExpenseCategoryService; import com.faf223.expensetrackerfaf.service.ExpenseService; +import com.faf223.expensetrackerfaf.service.UserService; import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.core.Authentication; @@ -23,7 +28,9 @@ import java.util.stream.Collectors; public class ExpenseController { private final ExpenseService expenseService; + private final UserService userService; private final ExpenseMapper expenseMapper; + private final ExpenseCategoryService expenseCategoryService; @GetMapping() @PreAuthorize("hasRole('ADMIN')") @@ -37,14 +44,24 @@ public class ExpenseController { public ResponseEntity createNewExpense(@RequestBody ExpenseCreationDTO expenseDTO, BindingResult bindingResult) { Expense expense = expenseMapper.toExpense(expenseDTO); - if (!bindingResult.hasErrors()) { + + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + + if (authentication != null && authentication.getPrincipal() instanceof UserDetails userDetails) { + + String email = userDetails.getUsername(); + User user = userService.getUserByEmail(email); + expense.setUser(user); + expenseService.createOrUpdateExpense(expense); - return ResponseEntity.ok(expenseMapper.toDto(expense)); - } else { - return ResponseEntity.notFound().build(); + ExpenseDTO createdExpenseDTO = expenseMapper.toDto(expense); + return ResponseEntity.status(HttpStatus.CREATED).body(createdExpenseDTO); } + + return ResponseEntity.notFound().build(); } + // TODO: has to be checked on auto extracting Uuid @PatchMapping() public ResponseEntity updateExpense(@RequestBody ExpenseCreationDTO expenseDTO, BindingResult bindingResult) { @@ -74,5 +91,4 @@ public class ExpenseController { return ResponseEntity.notFound().build(); } -} - +} \ 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 f076b79..85526b0 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/controller/IncomeController.java +++ b/src/main/java/com/faf223/expensetrackerfaf/controller/IncomeController.java @@ -1,11 +1,15 @@ package com.faf223.expensetrackerfaf.controller; +import com.faf223.expensetrackerfaf.dto.ExpenseDTO; 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.User; import com.faf223.expensetrackerfaf.service.IncomeService; +import com.faf223.expensetrackerfaf.service.UserService; import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.core.Authentication; @@ -23,6 +27,7 @@ import java.util.stream.Collectors; public class IncomeController { private final IncomeService incomeService; + private final UserService userService; private final IncomeMapper incomeMapper; @GetMapping() @@ -37,12 +42,21 @@ public class IncomeController { public ResponseEntity createNewIncome(@RequestBody IncomeCreationDTO incomeDTO, BindingResult bindingResult) { Income income = incomeMapper.toIncome(incomeDTO); - if (!bindingResult.hasErrors()) { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + + if (authentication != null && authentication.getPrincipal() instanceof UserDetails userDetails) { + + String email = userDetails.getUsername(); + User user = userService.getUserByEmail(email); + income.setUser(user); + + System.out.println(income); incomeService.createOrUpdateIncome(income); - return ResponseEntity.ok(incomeMapper.toDto(income)); - } else { - return ResponseEntity.notFound().build(); + IncomeDTO createdIncomeDTO = incomeMapper.toDto(income); + return ResponseEntity.status(HttpStatus.CREATED).body(createdIncomeDTO); } + + return ResponseEntity.notFound().build(); } @PatchMapping() @@ -65,14 +79,13 @@ public class IncomeController { if (authentication != null && authentication.getPrincipal() instanceof UserDetails userDetails) { String email = userDetails.getUsername(); - List expenses = incomeService.getIncomesByEmail(email).stream().map(incomeMapper::toDto).collect(Collectors.toList()); + List incomes = incomeService.getIncomesByEmail(email).stream().map(incomeMapper::toDto).collect(Collectors.toList()); - if (!expenses.isEmpty()) { - return ResponseEntity.ok(expenses); + if (!incomes.isEmpty()) { + return ResponseEntity.ok(incomes); } } return ResponseEntity.notFound().build(); } -} - +} \ No newline at end of file diff --git a/src/main/java/com/faf223/expensetrackerfaf/dto/ExpenseCreationDTO.java b/src/main/java/com/faf223/expensetrackerfaf/dto/ExpenseCreationDTO.java index eb3eea5..5434b68 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/dto/ExpenseCreationDTO.java +++ b/src/main/java/com/faf223/expensetrackerfaf/dto/ExpenseCreationDTO.java @@ -11,9 +11,6 @@ import java.time.LocalDate; @Data @AllArgsConstructor public class ExpenseCreationDTO { - private long expenseId; - private User user; - private ExpenseCategory expenseCategory; - private LocalDate date; + private int expenseCategory; private BigDecimal amount; -} +} \ No newline at end of file diff --git a/src/main/java/com/faf223/expensetrackerfaf/dto/ExpenseDTO.java b/src/main/java/com/faf223/expensetrackerfaf/dto/ExpenseDTO.java index b18643a..e956e14 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/dto/ExpenseDTO.java +++ b/src/main/java/com/faf223/expensetrackerfaf/dto/ExpenseDTO.java @@ -1,6 +1,7 @@ package com.faf223.expensetrackerfaf.dto; import com.faf223.expensetrackerfaf.model.ExpenseCategory; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import lombok.AllArgsConstructor; import lombok.Data; @@ -9,10 +10,11 @@ import java.time.LocalDate; @Data @AllArgsConstructor +@JsonIgnoreProperties({"expenseCategory"}) public class ExpenseDTO { private long expenseId; private UserDTO userDTO; private ExpenseCategory expenseCategory; private LocalDate date; private BigDecimal amount; -} +} \ No newline at end of file diff --git a/src/main/java/com/faf223/expensetrackerfaf/dto/IncomeCreationDTO.java b/src/main/java/com/faf223/expensetrackerfaf/dto/IncomeCreationDTO.java index 2671bb1..620071e 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/dto/IncomeCreationDTO.java +++ b/src/main/java/com/faf223/expensetrackerfaf/dto/IncomeCreationDTO.java @@ -11,9 +11,6 @@ import java.time.LocalDate; @Data @AllArgsConstructor public class IncomeCreationDTO { - private long incomeId; - private User user; - private IncomeCategory category; - private LocalDate date; + private int incomeCategory; private BigDecimal amount; -} +} \ No newline at end of file diff --git a/src/main/java/com/faf223/expensetrackerfaf/dto/IncomeDTO.java b/src/main/java/com/faf223/expensetrackerfaf/dto/IncomeDTO.java index 3ee4998..b494bfb 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/dto/IncomeDTO.java +++ b/src/main/java/com/faf223/expensetrackerfaf/dto/IncomeDTO.java @@ -1,6 +1,7 @@ package com.faf223.expensetrackerfaf.dto; import com.faf223.expensetrackerfaf.model.IncomeCategory; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import lombok.AllArgsConstructor; import lombok.Data; @@ -9,10 +10,11 @@ import java.time.LocalDate; @Data @AllArgsConstructor +@JsonIgnoreProperties({"incomeCategory"}) public class IncomeDTO { private long incomeId; private UserDTO userDTO; - private IncomeCategory category; + private IncomeCategory incomeCategory; private LocalDate date; private BigDecimal amount; -} +} \ No newline at end of file diff --git a/src/main/java/com/faf223/expensetrackerfaf/dto/mappers/ExpenseMapper.java b/src/main/java/com/faf223/expensetrackerfaf/dto/mappers/ExpenseMapper.java index 466144f..fc5bcd1 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/dto/mappers/ExpenseMapper.java +++ b/src/main/java/com/faf223/expensetrackerfaf/dto/mappers/ExpenseMapper.java @@ -3,19 +3,24 @@ package com.faf223.expensetrackerfaf.dto.mappers; import com.faf223.expensetrackerfaf.dto.ExpenseCreationDTO; import com.faf223.expensetrackerfaf.dto.ExpenseDTO; import com.faf223.expensetrackerfaf.model.Expense; +import com.faf223.expensetrackerfaf.service.ExpenseCategoryService; import com.faf223.expensetrackerfaf.service.ExpenseService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import java.time.LocalDate; + @Component public class ExpenseMapper { private final ExpenseService expenseService; + private final ExpenseCategoryService expenseCategoryService; private final UserMapper userMapper; @Autowired - public ExpenseMapper(ExpenseService expenseService, UserMapper userMapper) { + public ExpenseMapper(ExpenseService expenseService, ExpenseCategoryService expenseCategoryService, UserMapper userMapper) { this.expenseService = expenseService; + this.expenseCategoryService = expenseCategoryService; this.userMapper = userMapper; } @@ -25,10 +30,8 @@ public class ExpenseMapper { } public Expense toExpense(ExpenseCreationDTO expenseDTO) { - Expense expense = expenseService.getExpenseById(expenseDTO.getExpenseId()); - if(expense == null) return new Expense(expenseDTO.getExpenseId(), expenseDTO.getUser(), - expenseDTO.getExpenseCategory(), expenseDTO.getDate(), expenseDTO.getAmount()); - return expense; + + return new Expense(expenseCategoryService.getExpenseCategory(expenseDTO.getExpenseCategory()), LocalDate.now(), expenseDTO.getAmount()); } -} +} \ No newline at end of file diff --git a/src/main/java/com/faf223/expensetrackerfaf/dto/mappers/IncomeMapper.java b/src/main/java/com/faf223/expensetrackerfaf/dto/mappers/IncomeMapper.java index 5bdd805..0224ac5 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/dto/mappers/IncomeMapper.java +++ b/src/main/java/com/faf223/expensetrackerfaf/dto/mappers/IncomeMapper.java @@ -2,20 +2,26 @@ package com.faf223.expensetrackerfaf.dto.mappers; import com.faf223.expensetrackerfaf.dto.IncomeCreationDTO; import com.faf223.expensetrackerfaf.dto.IncomeDTO; +import com.faf223.expensetrackerfaf.model.Expense; import com.faf223.expensetrackerfaf.model.Income; +import com.faf223.expensetrackerfaf.service.IncomeCategoryService; import com.faf223.expensetrackerfaf.service.IncomeService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import java.time.LocalDate; + @Component public class IncomeMapper { private final IncomeService incomeService; + private final IncomeCategoryService incomeCategoryService; private final UserMapper userMapper; @Autowired - public IncomeMapper(IncomeService incomeService, UserMapper userMapper) { + public IncomeMapper(IncomeService incomeService, IncomeCategoryService incomeCategoryService, UserMapper userMapper) { this.incomeService = incomeService; + this.incomeCategoryService = incomeCategoryService; this.userMapper = userMapper; } @@ -25,10 +31,8 @@ public class IncomeMapper { } public Income toIncome(IncomeCreationDTO incomeDTO) { - Income income = incomeService.getIncomeById(incomeDTO.getIncomeId()); - if(income == null) return new Income(incomeDTO.getIncomeId(), incomeDTO.getUser(), - incomeDTO.getCategory(), incomeDTO.getDate(), incomeDTO.getAmount()); - return income; + + return new Income(incomeCategoryService.getExpenseCategory(incomeDTO.getIncomeCategory()), LocalDate.now(), incomeDTO.getAmount()); } -} +} \ No newline at end of file diff --git a/src/main/java/com/faf223/expensetrackerfaf/model/Expense.java b/src/main/java/com/faf223/expensetrackerfaf/model/Expense.java index 5b09733..322bb52 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/model/Expense.java +++ b/src/main/java/com/faf223/expensetrackerfaf/model/Expense.java @@ -1,5 +1,4 @@ package com.faf223.expensetrackerfaf.model; -import com.faf223.expensetrackerfaf.util.IMoneyTransaction; import com.fasterxml.jackson.annotation.JsonIgnore; import jakarta.persistence.*; import lombok.*; diff --git a/src/main/java/com/faf223/expensetrackerfaf/model/Income.java b/src/main/java/com/faf223/expensetrackerfaf/model/Income.java index 967fa3b..cba3dac 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/model/Income.java +++ b/src/main/java/com/faf223/expensetrackerfaf/model/Income.java @@ -29,4 +29,10 @@ public class Income implements IMoneyTransaction { private LocalDate date; private BigDecimal amount; + + public Income(IncomeCategory incomeCategory, LocalDate date, BigDecimal amount) { + this.category = incomeCategory; + this.date = date; + this.amount = amount; + } } diff --git a/src/main/java/com/faf223/expensetrackerfaf/service/ExpenseCategoryService.java b/src/main/java/com/faf223/expensetrackerfaf/service/ExpenseCategoryService.java new file mode 100644 index 0000000..088f791 --- /dev/null +++ b/src/main/java/com/faf223/expensetrackerfaf/service/ExpenseCategoryService.java @@ -0,0 +1,18 @@ +package com.faf223.expensetrackerfaf.service; + +import com.faf223.expensetrackerfaf.model.ExpenseCategory; +import com.faf223.expensetrackerfaf.repository.ExpenseCategoryRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class ExpenseCategoryService { + + private final ExpenseCategoryRepository expenseCategoryRepository; + + public ExpenseCategory getExpenseCategory(long category) { + return expenseCategoryRepository.getReferenceById(category); + } + +} \ No newline at end of file diff --git a/src/main/java/com/faf223/expensetrackerfaf/service/IncomeCategoryService.java b/src/main/java/com/faf223/expensetrackerfaf/service/IncomeCategoryService.java new file mode 100644 index 0000000..2a143b1 --- /dev/null +++ b/src/main/java/com/faf223/expensetrackerfaf/service/IncomeCategoryService.java @@ -0,0 +1,17 @@ +package com.faf223.expensetrackerfaf.service; + +import com.faf223.expensetrackerfaf.model.IncomeCategory; +import com.faf223.expensetrackerfaf.repository.IncomeCategoryRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class IncomeCategoryService { + + private final IncomeCategoryRepository incomeCategoryRepository; + + public IncomeCategory getExpenseCategory(long category) { + return incomeCategoryRepository.getReferenceById(category); + } +} \ No newline at end of file diff --git a/src/main/java/com/faf223/expensetrackerfaf/service/UserService.java b/src/main/java/com/faf223/expensetrackerfaf/service/UserService.java index 75d3243..20dbc96 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/service/UserService.java +++ b/src/main/java/com/faf223/expensetrackerfaf/service/UserService.java @@ -1,17 +1,21 @@ package com.faf223.expensetrackerfaf.service; +import com.faf223.expensetrackerfaf.model.Credential; import com.faf223.expensetrackerfaf.model.User; +import com.faf223.expensetrackerfaf.repository.CredentialRepository; import com.faf223.expensetrackerfaf.repository.UserRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.util.List; +import java.util.Optional; @Service @RequiredArgsConstructor public class UserService { private final UserRepository userRepository; + private final CredentialRepository credentialRepository; public void updateUser(User user) { userRepository.save(user); @@ -24,4 +28,12 @@ public class UserService { public User getUserById(String userUuid) { return userRepository.findById(userUuid).orElse(null); } + public User getUserByEmail(String email) { + Optional credential = credentialRepository.findByEmail(email); + if (credential.isPresent()) { + Optional user = userRepository.findById(credential.get().getUser().getUserUuid()); + return user.orElse(null); + } + return null; + } } \ No newline at end of file From 65c5c3f2df2ad71fb6a7263a0ee03b1bb7b17a1c Mon Sep 17 00:00:00 2001 From: mirrerror Date: Tue, 24 Oct 2023 19:59:23 +0300 Subject: [PATCH 09/17] refactor code, add interfaces for services --- .../controller/ExpenseController.java | 15 +++++++++++---- .../controller/IncomeController.java | 19 ++++++++++++++----- .../dto/mappers/ExpenseMapper.java | 2 +- .../dto/mappers/IncomeMapper.java | 3 +-- .../service/ExpenseCategoryService.java | 14 +++++++++++--- .../service/ExpenseService.java | 13 +++++++------ .../service/ICategoryService.java | 12 ++++++++++++ .../service/ITransactionService.java | 14 ++++++++++++++ .../service/IncomeCategoryService.java | 14 +++++++++++--- .../service/IncomeService.java | 13 +++++++------ 10 files changed, 89 insertions(+), 30 deletions(-) create mode 100644 src/main/java/com/faf223/expensetrackerfaf/service/ICategoryService.java create mode 100644 src/main/java/com/faf223/expensetrackerfaf/service/ITransactionService.java diff --git a/src/main/java/com/faf223/expensetrackerfaf/controller/ExpenseController.java b/src/main/java/com/faf223/expensetrackerfaf/controller/ExpenseController.java index f8cbb19..532d01c 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/controller/ExpenseController.java +++ b/src/main/java/com/faf223/expensetrackerfaf/controller/ExpenseController.java @@ -35,7 +35,7 @@ public class ExpenseController { @GetMapping() @PreAuthorize("hasRole('ADMIN')") public ResponseEntity> getAllExpenses() { - List expenses = expenseService.getExpenses().stream().map(expenseMapper::toDto).collect(Collectors.toList()); + List expenses = expenseService.getTransactions().stream().map(expenseMapper::toDto).collect(Collectors.toList()); if (!expenses.isEmpty()) return ResponseEntity.ok(expenses); else return ResponseEntity.notFound().build(); } @@ -53,7 +53,7 @@ public class ExpenseController { User user = userService.getUserByEmail(email); expense.setUser(user); - expenseService.createOrUpdateExpense(expense); + expenseService.createOrUpdate(expense); ExpenseDTO createdExpenseDTO = expenseMapper.toDto(expense); return ResponseEntity.status(HttpStatus.CREATED).body(createdExpenseDTO); } @@ -67,7 +67,7 @@ public class ExpenseController { BindingResult bindingResult) { Expense expense = expenseMapper.toExpense(expenseDTO); if (!bindingResult.hasErrors()) { - expenseService.createOrUpdateExpense(expense); + expenseService.createOrUpdate(expense); return ResponseEntity.ok(expenseMapper.toDto(expense)); } else { return ResponseEntity.notFound().build(); @@ -82,7 +82,7 @@ public class ExpenseController { if (authentication != null && authentication.getPrincipal() instanceof UserDetails userDetails) { String email = userDetails.getUsername(); - List expenses = expenseService.getExpensesByEmail(email).stream().map(expenseMapper::toDto).collect(Collectors.toList()); + List expenses = expenseService.getTransactionsByEmail(email).stream().map(expenseMapper::toDto).collect(Collectors.toList()); if (!expenses.isEmpty()) { return ResponseEntity.ok(expenses); @@ -91,4 +91,11 @@ public class ExpenseController { return ResponseEntity.notFound().build(); } + + @GetMapping("/categories") + public ResponseEntity> getAllCategories() { + List categories = expenseCategoryService.getAllCategories(); + if (!categories.isEmpty()) return ResponseEntity.ok(categories); + else return ResponseEntity.notFound().build(); + } } \ 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 85526b0..aecab85 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/controller/IncomeController.java +++ b/src/main/java/com/faf223/expensetrackerfaf/controller/IncomeController.java @@ -1,11 +1,12 @@ package com.faf223.expensetrackerfaf.controller; -import com.faf223.expensetrackerfaf.dto.ExpenseDTO; 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.service.IncomeCategoryService; import com.faf223.expensetrackerfaf.service.IncomeService; import com.faf223.expensetrackerfaf.service.UserService; import lombok.RequiredArgsConstructor; @@ -29,11 +30,12 @@ public class IncomeController { private final IncomeService incomeService; private final UserService userService; private final IncomeMapper incomeMapper; + private final IncomeCategoryService incomeCategoryService; @GetMapping() @PreAuthorize("hasRole('ADMIN')") public ResponseEntity> getAllIncomes() { - List incomes = incomeService.getIncomes().stream().map(incomeMapper::toDto).collect(Collectors.toList()); + List incomes = incomeService.getTransactions().stream().map(incomeMapper::toDto).collect(Collectors.toList()); if (!incomes.isEmpty()) return ResponseEntity.ok(incomes); else return ResponseEntity.notFound().build(); } @@ -51,7 +53,7 @@ public class IncomeController { income.setUser(user); System.out.println(income); - incomeService.createOrUpdateIncome(income); + incomeService.createOrUpdate(income); IncomeDTO createdIncomeDTO = incomeMapper.toDto(income); return ResponseEntity.status(HttpStatus.CREATED).body(createdIncomeDTO); } @@ -64,7 +66,7 @@ public class IncomeController { BindingResult bindingResult) { Income income = incomeMapper.toIncome(incomeDTO); if (!bindingResult.hasErrors()) { - incomeService.createOrUpdateIncome(income); + incomeService.createOrUpdate(income); return ResponseEntity.ok(incomeMapper.toDto(income)); } else { return ResponseEntity.notFound().build(); @@ -79,7 +81,7 @@ public class IncomeController { if (authentication != null && authentication.getPrincipal() instanceof UserDetails userDetails) { String email = userDetails.getUsername(); - List incomes = incomeService.getIncomesByEmail(email).stream().map(incomeMapper::toDto).collect(Collectors.toList()); + List incomes = incomeService.getTransactionsByEmail(email).stream().map(incomeMapper::toDto).collect(Collectors.toList()); if (!incomes.isEmpty()) { return ResponseEntity.ok(incomes); @@ -88,4 +90,11 @@ public class IncomeController { return ResponseEntity.notFound().build(); } + + @GetMapping("/categories") + public ResponseEntity> getAllCategories() { + List categories = incomeCategoryService.getAllCategories(); + if (!categories.isEmpty()) return ResponseEntity.ok(categories); + else return ResponseEntity.notFound().build(); + } } \ No newline at end of file diff --git a/src/main/java/com/faf223/expensetrackerfaf/dto/mappers/ExpenseMapper.java b/src/main/java/com/faf223/expensetrackerfaf/dto/mappers/ExpenseMapper.java index fc5bcd1..9bc257f 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/dto/mappers/ExpenseMapper.java +++ b/src/main/java/com/faf223/expensetrackerfaf/dto/mappers/ExpenseMapper.java @@ -31,7 +31,7 @@ public class ExpenseMapper { public Expense toExpense(ExpenseCreationDTO expenseDTO) { - return new Expense(expenseCategoryService.getExpenseCategory(expenseDTO.getExpenseCategory()), LocalDate.now(), expenseDTO.getAmount()); + return new Expense(expenseCategoryService.getCategoryById(expenseDTO.getExpenseCategory()), LocalDate.now(), expenseDTO.getAmount()); } } \ No newline at end of file diff --git a/src/main/java/com/faf223/expensetrackerfaf/dto/mappers/IncomeMapper.java b/src/main/java/com/faf223/expensetrackerfaf/dto/mappers/IncomeMapper.java index 0224ac5..a59a2dd 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/dto/mappers/IncomeMapper.java +++ b/src/main/java/com/faf223/expensetrackerfaf/dto/mappers/IncomeMapper.java @@ -31,8 +31,7 @@ public class IncomeMapper { } public Income toIncome(IncomeCreationDTO incomeDTO) { - - return new Income(incomeCategoryService.getExpenseCategory(incomeDTO.getIncomeCategory()), LocalDate.now(), incomeDTO.getAmount()); + return new Income(incomeCategoryService.getCategoryById(incomeDTO.getIncomeCategory()), LocalDate.now(), incomeDTO.getAmount()); } } \ No newline at end of file diff --git a/src/main/java/com/faf223/expensetrackerfaf/service/ExpenseCategoryService.java b/src/main/java/com/faf223/expensetrackerfaf/service/ExpenseCategoryService.java index 088f791..2d90b6a 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/service/ExpenseCategoryService.java +++ b/src/main/java/com/faf223/expensetrackerfaf/service/ExpenseCategoryService.java @@ -5,14 +5,22 @@ import com.faf223.expensetrackerfaf.repository.ExpenseCategoryRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import java.util.List; + @Service @RequiredArgsConstructor -public class ExpenseCategoryService { +public class ExpenseCategoryService implements ICategoryService { private final ExpenseCategoryRepository expenseCategoryRepository; - public ExpenseCategory getExpenseCategory(long category) { - return expenseCategoryRepository.getReferenceById(category); + @Override + public List getAllCategories() { + return expenseCategoryRepository.findAll(); + } + + @Override + public ExpenseCategory getCategoryById(long id) { + return expenseCategoryRepository.getReferenceById(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 1bea04a..4209fd6 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/service/ExpenseService.java +++ b/src/main/java/com/faf223/expensetrackerfaf/service/ExpenseService.java @@ -2,6 +2,7 @@ package com.faf223.expensetrackerfaf.service; import com.faf223.expensetrackerfaf.model.Credential; import com.faf223.expensetrackerfaf.model.Expense; +import com.faf223.expensetrackerfaf.model.IMoneyTransaction; import com.faf223.expensetrackerfaf.repository.CredentialRepository; import com.faf223.expensetrackerfaf.repository.ExpenseRepository; import lombok.RequiredArgsConstructor; @@ -13,16 +14,16 @@ import java.util.Optional; @Service @RequiredArgsConstructor -public class ExpenseService { +public class ExpenseService implements ITransactionService { private final ExpenseRepository expenseRepository; private final CredentialRepository credentialRepository; - public void createOrUpdateExpense(Expense expense) { - expenseRepository.save(expense); + public void createOrUpdate(IMoneyTransaction expense) { + expenseRepository.save((Expense) expense); } - public List getExpensesByEmail(String email) { + public List getTransactionsByEmail(String email) { Optional credential = credentialRepository.findByEmail(email); if (credential.isPresent()) { @@ -32,11 +33,11 @@ public class ExpenseService { return new ArrayList<>(); } - public List getExpenses() { + public List getTransactions() { return expenseRepository.findAll(); } - public Expense getExpenseById(long id) { + public Expense getTransactionById(long id) { return expenseRepository.findById(id).orElse(null); } } \ No newline at end of file diff --git a/src/main/java/com/faf223/expensetrackerfaf/service/ICategoryService.java b/src/main/java/com/faf223/expensetrackerfaf/service/ICategoryService.java new file mode 100644 index 0000000..d48d8f7 --- /dev/null +++ b/src/main/java/com/faf223/expensetrackerfaf/service/ICategoryService.java @@ -0,0 +1,12 @@ +package com.faf223.expensetrackerfaf.service; + +import com.faf223.expensetrackerfaf.model.IMoneyTransactionCategory; + +import java.util.List; + +public interface ICategoryService { + + List getAllCategories(); + IMoneyTransactionCategory getCategoryById(long id); + +} diff --git a/src/main/java/com/faf223/expensetrackerfaf/service/ITransactionService.java b/src/main/java/com/faf223/expensetrackerfaf/service/ITransactionService.java new file mode 100644 index 0000000..6219bef --- /dev/null +++ b/src/main/java/com/faf223/expensetrackerfaf/service/ITransactionService.java @@ -0,0 +1,14 @@ +package com.faf223.expensetrackerfaf.service; + +import com.faf223.expensetrackerfaf.model.IMoneyTransaction; + +import java.util.List; + +public interface ITransactionService { + + void createOrUpdate(IMoneyTransaction transaction); + List getTransactions(); + List getTransactionsByEmail(String email); + IMoneyTransaction getTransactionById(long id); + +} diff --git a/src/main/java/com/faf223/expensetrackerfaf/service/IncomeCategoryService.java b/src/main/java/com/faf223/expensetrackerfaf/service/IncomeCategoryService.java index 2a143b1..b7ce745 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/service/IncomeCategoryService.java +++ b/src/main/java/com/faf223/expensetrackerfaf/service/IncomeCategoryService.java @@ -5,13 +5,21 @@ import com.faf223.expensetrackerfaf.repository.IncomeCategoryRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import java.util.List; + @Service @RequiredArgsConstructor -public class IncomeCategoryService { +public class IncomeCategoryService implements ICategoryService { private final IncomeCategoryRepository incomeCategoryRepository; - public IncomeCategory getExpenseCategory(long category) { - return incomeCategoryRepository.getReferenceById(category); + @Override + public List getAllCategories() { + return incomeCategoryRepository.findAll(); + } + + @Override + public IncomeCategory getCategoryById(long id) { + return incomeCategoryRepository.getReferenceById(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 16946a9..8287d01 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/service/IncomeService.java +++ b/src/main/java/com/faf223/expensetrackerfaf/service/IncomeService.java @@ -1,6 +1,7 @@ package com.faf223.expensetrackerfaf.service; import com.faf223.expensetrackerfaf.model.Credential; +import com.faf223.expensetrackerfaf.model.IMoneyTransaction; import com.faf223.expensetrackerfaf.model.Income; import com.faf223.expensetrackerfaf.repository.CredentialRepository; import com.faf223.expensetrackerfaf.repository.IncomeRepository; @@ -13,20 +14,20 @@ import java.util.Optional; @Service @RequiredArgsConstructor -public class IncomeService { +public class IncomeService implements ITransactionService { private final IncomeRepository incomeRepository; private final CredentialRepository credentialRepository; - public void createOrUpdateIncome(Income income) { - incomeRepository.save(income); + public void createOrUpdate(IMoneyTransaction income) { + incomeRepository.save((Income) income); } - public List getIncomes() { + public List getTransactions() { return incomeRepository.findAll(); } - public List getIncomesByEmail(String email) { + public List getTransactionsByEmail(String email) { Optional credential = credentialRepository.findByEmail(email); if (credential.isPresent()) { @@ -36,7 +37,7 @@ public class IncomeService { return new ArrayList<>(); } - public Income getIncomeById(long id) { + public Income getTransactionById(long id) { return incomeRepository.findById(id).orElse(null); } } From d990d224ab3d2459acfa4756647cb8211e0953c8 Mon Sep 17 00:00:00 2001 From: Daniel Date: Tue, 24 Oct 2023 23:36:47 +0300 Subject: [PATCH 10/17] Connecting front to back --- .../expensetrackerfaf/web/package-lock.json | 37 +++++++++++- .../faf223/expensetrackerfaf/web/package.json | 5 +- .../src/routes/auth/login/LoginForm.svelte | 60 ++++++++++++++----- .../routes/auth/register/RegisterForm.svelte | 2 +- .../dashboard/board/graphs/Graph1.svelte | 7 ++- 5 files changed, 90 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/faf223/expensetrackerfaf/web/package-lock.json b/src/main/java/com/faf223/expensetrackerfaf/web/package-lock.json index 720921d..d332004 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/web/package-lock.json +++ b/src/main/java/com/faf223/expensetrackerfaf/web/package-lock.json @@ -13,7 +13,10 @@ "axios": "^1.5.1", "chart.js": "^4.4.0", "email-validator": "^2.0.4", - "svelte-fa": "^3.0.4" + "js-cookie": "^3.0.5", + "svelte-cookie": "^1.0.1", + "svelte-fa": "^3.0.4", + "svelte-spa-router": "^3.3.0" }, "devDependencies": { "@fontsource/fira-mono": "^4.5.10", @@ -1615,6 +1618,14 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, + "node_modules/js-cookie": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz", + "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==", + "engines": { + "node": ">=14" + } + }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -2131,6 +2142,14 @@ } ] }, + "node_modules/regexparam": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexparam/-/regexparam-2.0.1.tgz", + "integrity": "sha512-zRgSaYemnNYxUv+/5SeoHI0eJIgTL/A2pUtXUPLHQxUldagouJ9p+K6IbIZ/JiQuCEv2E2B1O11SjVQy3aMCkw==", + "engines": { + "node": ">=8" + } + }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -2341,6 +2360,11 @@ "node": ">=16" } }, + "node_modules/svelte-cookie": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/svelte-cookie/-/svelte-cookie-1.0.1.tgz", + "integrity": "sha512-c4cXLMeG7vlAk3Q5axjxlppMJgeLLWd/6cCvo1wEL6ZwEueVHAP71SBRi9r5XmLYnCYr7eAqlK6NrYT/29KuKQ==" + }, "node_modules/svelte-eslint-parser": { "version": "0.33.1", "resolved": "https://registry.npmjs.org/svelte-eslint-parser/-/svelte-eslint-parser-0.33.1.tgz", @@ -2385,6 +2409,17 @@ "svelte": "^3.19.0 || ^4.0.0" } }, + "node_modules/svelte-spa-router": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/svelte-spa-router/-/svelte-spa-router-3.3.0.tgz", + "integrity": "sha512-cwRNe7cxD43sCvSfEeaKiNZg3FCizGxeMcf7CPiWRP3jKXjEma3vxyyuDtPOam6nWbVxl9TNM3hlE/i87ZlqcQ==", + "dependencies": { + "regexparam": "2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ItalyPaleAle" + } + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", diff --git a/src/main/java/com/faf223/expensetrackerfaf/web/package.json b/src/main/java/com/faf223/expensetrackerfaf/web/package.json index 6e015a3..ee464f0 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/web/package.json +++ b/src/main/java/com/faf223/expensetrackerfaf/web/package.json @@ -29,6 +29,9 @@ "axios": "^1.5.1", "chart.js": "^4.4.0", "email-validator": "^2.0.4", - "svelte-fa": "^3.0.4" + "js-cookie": "^3.0.5", + "svelte-cookie": "^1.0.1", + "svelte-fa": "^3.0.4", + "svelte-spa-router": "^3.3.0" } } diff --git a/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/auth/login/LoginForm.svelte b/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/auth/login/LoginForm.svelte index a0284fa..5d11866 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/auth/login/LoginForm.svelte +++ b/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/auth/login/LoginForm.svelte @@ -1,29 +1,57 @@ @@ -39,7 +67,7 @@ event => {username = event.target.value} }> {password = event.target.password} + event => {password = event.target.value} }> Forgot your password? diff --git a/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/auth/register/RegisterForm.svelte b/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/auth/register/RegisterForm.svelte index 002540f..076d8a7 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/auth/register/RegisterForm.svelte +++ b/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/auth/register/RegisterForm.svelte @@ -8,7 +8,7 @@ function submitForm(event) { event.preventDefault(); console.log("Tried to submit!"); - console.log("Valid? ", (validateEmail() && validateUsername() && va && validatePassword() ? "Yes" : "No")); + console.log("Valid? ", (validateEmail() && validateUsername() && validatePassword() ? "Yes" : "No")); } function validateEmail() { diff --git a/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/graphs/Graph1.svelte b/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/graphs/Graph1.svelte index 44f850e..5c3db43 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/graphs/Graph1.svelte +++ b/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/graphs/Graph1.svelte @@ -2,20 +2,23 @@ import Chart from 'chart.js/auto'; import { onMount } from 'svelte'; import axios from 'axios'; + import {getCookie} from "svelte-cookie"; let ctx; let chartCanvas; onMount(async () => { + + const token = getCookie('access_token'); const config = { headers: { - 'Authorization': `Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkYW4uYmFsYW5AZ21haWwuY29tIiwiaWF0IjoxNjk3NzQ0MjY3LCJleHAiOjE2OTc4MzA2Njd9.hzbEDDuOVCY_EQAA8xGlJskQ2FQjw8o0CtFKB1dKYOU` + 'Authorization': `Bearer ${token}` } }; try { const response = await axios.get('http://localhost:8081/incomes/00112233-4455-6677-8899-aabbccddeeaa', config); - const incomeData = response.data; // Assuming the response is an array of income data + const incomeData = response.data; const chartLabels = incomeData.map(item => item.category.categoryName); const chartValues = incomeData.map(item => item.amount); From 0baac602e44867564cd4cb2123415b43130b1179 Mon Sep 17 00:00:00 2001 From: Daniel Date: Wed, 25 Oct 2023 01:24:28 +0300 Subject: [PATCH 11/17] Fixed couple of endpoints, implemented more of the frontend --- pom.xml | 6 +- .../controller/UserController.java | 18 ++- .../expensetrackerfaf/dto/ExpenseDTO.java | 2 - .../expensetrackerfaf/dto/IncomeDTO.java | 2 - .../src/routes/auth/login/LoginForm.svelte | 1 + .../web/src/routes/dashboard/+page.svelte | 1 + .../routes/dashboard/board/Dashboard.svelte | 11 +- .../routes/dashboard/board/DataMenu.svelte | 15 +-- .../routes/dashboard/board/Expenses.svelte | 71 ++++++++++ .../src/routes/dashboard/board/Incomes.svelte | 71 ++++++++++ .../dashboard/board/NotificationBoard.svelte | 15 --- .../dashboard/board/QuickInfobar.svelte | 5 +- .../dashboard/board/graphs/Graph1.svelte | 12 +- .../dashboard/board/graphs/Graph2.svelte | 122 +++++++++++------- .../dashboard/board/graphs/Graph3.svelte | 29 +++-- .../dashboard/board/graphs/Graph4.svelte | 48 ------- .../dashboard/board/graphs/Graph5.svelte | 48 ------- .../src/routes/dashboard/menu/SideMenu.svelte | 27 +++- 18 files changed, 300 insertions(+), 204 deletions(-) create mode 100644 src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/Expenses.svelte create mode 100644 src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/Incomes.svelte delete mode 100644 src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/NotificationBoard.svelte delete mode 100644 src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/graphs/Graph4.svelte delete mode 100644 src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/graphs/Graph5.svelte diff --git a/pom.xml b/pom.xml index 5a0cfdd..5744dc1 100644 --- a/pom.xml +++ b/pom.xml @@ -22,11 +22,7 @@ spring-boot-starter-web 3.1.4 - - org.apache.httpcomponents - httpclient - test - + org.springframework.boot spring-boot-starter-data-jpa diff --git a/src/main/java/com/faf223/expensetrackerfaf/controller/UserController.java b/src/main/java/com/faf223/expensetrackerfaf/controller/UserController.java index 093190f..407f99c 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/controller/UserController.java +++ b/src/main/java/com/faf223/expensetrackerfaf/controller/UserController.java @@ -8,6 +8,9 @@ import com.faf223.expensetrackerfaf.service.UserService; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.userdetails.UserDetails; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; @@ -33,11 +36,16 @@ public class UserController { } } - @GetMapping("/{userUuid}") - public ResponseEntity getUser(@PathVariable String userUuid) { - User user = userService.getUserById(userUuid); - if (user != null) return ResponseEntity.ok(userMapper.toDto(user)); - else return ResponseEntity.notFound().build(); + @GetMapping("/getUserData") + public ResponseEntity getUser() { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + + if (authentication != null && authentication.getPrincipal() instanceof UserDetails userDetails) { + User user = userService.getUserByEmail(userDetails.getUsername()); + if (user != null) return ResponseEntity.ok(userMapper.toDto(user)); + else return ResponseEntity.notFound().build(); + } + return ResponseEntity.notFound().build(); } @GetMapping() diff --git a/src/main/java/com/faf223/expensetrackerfaf/dto/ExpenseDTO.java b/src/main/java/com/faf223/expensetrackerfaf/dto/ExpenseDTO.java index e956e14..0804ff6 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/dto/ExpenseDTO.java +++ b/src/main/java/com/faf223/expensetrackerfaf/dto/ExpenseDTO.java @@ -1,7 +1,6 @@ package com.faf223.expensetrackerfaf.dto; import com.faf223.expensetrackerfaf.model.ExpenseCategory; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import lombok.AllArgsConstructor; import lombok.Data; @@ -10,7 +9,6 @@ import java.time.LocalDate; @Data @AllArgsConstructor -@JsonIgnoreProperties({"expenseCategory"}) public class ExpenseDTO { private long expenseId; private UserDTO userDTO; diff --git a/src/main/java/com/faf223/expensetrackerfaf/dto/IncomeDTO.java b/src/main/java/com/faf223/expensetrackerfaf/dto/IncomeDTO.java index b494bfb..ce2d912 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/dto/IncomeDTO.java +++ b/src/main/java/com/faf223/expensetrackerfaf/dto/IncomeDTO.java @@ -1,7 +1,6 @@ package com.faf223.expensetrackerfaf.dto; import com.faf223.expensetrackerfaf.model.IncomeCategory; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import lombok.AllArgsConstructor; import lombok.Data; @@ -10,7 +9,6 @@ import java.time.LocalDate; @Data @AllArgsConstructor -@JsonIgnoreProperties({"incomeCategory"}) public class IncomeDTO { private long incomeId; private UserDTO userDTO; diff --git a/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/auth/login/LoginForm.svelte b/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/auth/login/LoginForm.svelte index 5d11866..ed00879 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/auth/login/LoginForm.svelte +++ b/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/auth/login/LoginForm.svelte @@ -34,6 +34,7 @@ setCookie('access_token', access_token); setCookie('refresh_token', refresh_token); console.log(access_token, refresh_token); + window.location.href = '/dashboard' } catch (error) { console.error('Login failed:', error); } diff --git a/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/+page.svelte b/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/+page.svelte index 456cfb0..3be4a70 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/+page.svelte +++ b/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/+page.svelte @@ -16,5 +16,6 @@ display: flex; align-items: stretch; min-height: 100vh; + max-height: 100%; } \ No newline at end of file diff --git a/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/Dashboard.svelte b/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/Dashboard.svelte index e2d518b..cd19337 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/Dashboard.svelte +++ b/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/Dashboard.svelte @@ -2,7 +2,14 @@ import DashHeader from "./DashHeader.svelte"; import DataMenu from "./DataMenu.svelte"; import QuickInfobar from "./QuickInfobar.svelte"; - import NotificationBoard from "./NotificationBoard.svelte"; + import { getCookie } from "svelte-cookie"; + import {onMount} from "svelte"; + + onMount(() => { + if (getCookie('access_token') === null ) { + window.location.href = '/auth/login'; + } + })
@@ -17,7 +24,7 @@ background-color: rgb(245,242,243); border-radius: 20px; margin: 20px; - min-width: 100px; + min-width: 100px; display: flex; flex:1 1 auto; flex-direction: column; diff --git a/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/DataMenu.svelte b/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/DataMenu.svelte index 1271f15..e09ea12 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/DataMenu.svelte +++ b/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/DataMenu.svelte @@ -2,8 +2,8 @@ import Graph1 from './graphs/Graph1.svelte'; import Graph2 from './graphs/Graph2.svelte'; import Graph3 from './graphs/Graph3.svelte'; - import Graph4 from './graphs/Graph4.svelte'; - import Graph5 from './graphs/Graph5.svelte'; + import Expenses from "./Expenses.svelte"; + import Incomes from "./Incomes.svelte";
@@ -14,9 +14,9 @@
-
- - +
+ +
@@ -34,7 +34,6 @@ } - #twoVertical { display: flex; flex-direction: column; @@ -53,9 +52,9 @@ min-height:0; } - #twoHorizontal { + #dataPanel { display: flex; - flex-direction: column; + flex-direction: row; align-self: stretch; flex-grow: 1; min-width: 0; diff --git a/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/Expenses.svelte b/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/Expenses.svelte new file mode 100644 index 0000000..3a2390f --- /dev/null +++ b/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/Expenses.svelte @@ -0,0 +1,71 @@ + + +
+

Expenses

+
    + {#each data as item} +
  • + {item.incomeCategory ? `${item.incomeCategory.name}: ` : `${item.expenseCategory.name}: `} + {item.incomeCategory ? `+${item.amount}$` : `-${item.amount}$`} + {`${item.date}`} +
  • + {/each} +
+
+ + \ No newline at end of file diff --git a/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/Incomes.svelte b/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/Incomes.svelte new file mode 100644 index 0000000..018a098 --- /dev/null +++ b/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/Incomes.svelte @@ -0,0 +1,71 @@ + + +
+

Incomes

+
    + {#each data as item} +
  • + {item.incomeCategory ? `${item.incomeCategory.name}: ` : `${item.expenseCategory.name}: `} + {item.incomeCategory ? `+${item.amount}$` : `-${item.amount}$`} + {`${item.date}`} +
  • + {/each} +
+
+ + \ No newline at end of file diff --git a/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/NotificationBoard.svelte b/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/NotificationBoard.svelte deleted file mode 100644 index a037f02..0000000 --- a/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/NotificationBoard.svelte +++ /dev/null @@ -1,15 +0,0 @@ - - -
- -
- - \ No newline at end of file diff --git a/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/QuickInfobar.svelte b/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/QuickInfobar.svelte index 8db424a..4ce18dc 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/QuickInfobar.svelte +++ b/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/QuickInfobar.svelte @@ -23,15 +23,12 @@ height: 100px; padding: 10px; border-radius: 10px; - background-color: #ffdde2; + background-color: #d3d3d3; box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24); transition: all 0.3s cubic-bezier(.25,.8,.25,1); - /* border: 1px solid black; */ } .infobarElement:hover { - /* color:white; */ - /* background-color: black; */ box-shadow: 0 14px 28px rgba(0,0,0,0.25), 0 10px 10px rgba(0,0,0,0.22); } \ No newline at end of file diff --git a/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/graphs/Graph1.svelte b/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/graphs/Graph1.svelte index 5c3db43..a981296 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/graphs/Graph1.svelte +++ b/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/graphs/Graph1.svelte @@ -10,6 +10,7 @@ onMount(async () => { const token = getCookie('access_token'); + const config = { headers: { 'Authorization': `Bearer ${token}` @@ -17,21 +18,22 @@ }; try { - const response = await axios.get('http://localhost:8081/incomes/00112233-4455-6677-8899-aabbccddeeaa', config); + const response = await axios.get('http://localhost:8081/incomes/personal-incomes', config); + console.log(response.data); const incomeData = response.data; - const chartLabels = incomeData.map(item => item.category.categoryName); + const chartLabels = incomeData.map(item => item.incomeCategory.name); const chartValues = incomeData.map(item => item.amount); ctx = chartCanvas.getContext('2d'); new Chart(ctx, { - type: 'bar', // Set chart type to 'bar' for a bar graph + type: 'bar', data: { labels: chartLabels, datasets: [{ label: 'Revenue', backgroundColor: 'rgb(255, 99, 132)', - data: chartValues // Changed from 'data' to 'chartValues' + data: chartValues }] }, options: { @@ -56,7 +58,7 @@ flex: 1; border-radius: 10px; margin: 10px; - background-color: #ffdde2; + background-color: #d3d3d3; } #chart:hover { diff --git a/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/graphs/Graph2.svelte b/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/graphs/Graph2.svelte index 492ab87..98a362c 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/graphs/Graph2.svelte +++ b/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/graphs/Graph2.svelte @@ -1,48 +1,70 @@ @@ -52,15 +74,15 @@ \ No newline at end of file + #chart:hover { + box-shadow: 0 14px 28px rgba(0,0,0,0.25), 0 10px 10px rgba(0,0,0,0.22); + } + diff --git a/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/graphs/Graph3.svelte b/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/graphs/Graph3.svelte index 0390f12..9d5057a 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/graphs/Graph3.svelte +++ b/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/graphs/Graph3.svelte @@ -2,33 +2,44 @@ import chartjs from 'chart.js/auto'; import { onMount } from 'svelte'; import axios from 'axios'; + import { getCookie } from "svelte-cookie"; let ctx; let chartCanvas; onMount(async () => { + const token = getCookie('access_token'); + const config = { headers: { - 'Authorization': `Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkYW4uYmFsYW5AZ21haWwuY29tIiwiaWF0IjoxNjk3NzQ0MjY3LCJleHAiOjE2OTc4MzA2Njd9.hzbEDDuOVCY_EQAA8xGlJskQ2FQjw8o0CtFKB1dKYOU` + 'Authorization': `Bearer ${token}` } }; try { - const response = await axios.get('http://localhost:8081/incomes/00112233-4455-6677-8899-aabbccddeeaa', config); - const incomeData = response.data; // Assuming the response is an array of income data + const [incomesResponse, expensesResponse] = await Promise.all([ + axios.get('http://localhost:8081/incomes/personal-incomes', config), + axios.get('http://localhost:8081/expenses/personal-expenses', config) + ]); - // Extract income categories and their values - const chartLabels = incomeData.map(item => item.category.categoryName); - const chartValues = incomeData.map(item => item.amount); + const incomesData = incomesResponse.data; + const expensesData = expensesResponse.data; + + const totalIncomes = incomesData.reduce((total, item) => total + item.amount, 0); + + const totalExpenses = expensesData.reduce((total, item) => total + item.amount, 0); + + const chartLabels = ['Incomes', 'Expenses']; + const chartValues = [totalIncomes, totalExpenses]; ctx = chartCanvas.getContext('2d'); new chartjs(ctx, { - type: 'pie', // Set chart type to 'pie' for a pie chart + type: 'pie', data: { labels: chartLabels, datasets: [{ data: chartValues, - backgroundColor: ['red', 'orange', 'yellow', 'green', 'blue'], // Customize colors as needed + backgroundColor: ['green', 'red'], }] }, options: { @@ -53,7 +64,7 @@ flex: 1; border-radius: 10px; margin: 10px; - background-color: #ffdde2; + background-color: #d3d3d3; } #chart:hover { diff --git a/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/graphs/Graph4.svelte b/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/graphs/Graph4.svelte deleted file mode 100644 index 0825a16..0000000 --- a/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/graphs/Graph4.svelte +++ /dev/null @@ -1,48 +0,0 @@ - - -
- -
- - \ No newline at end of file diff --git a/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/graphs/Graph5.svelte b/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/graphs/Graph5.svelte deleted file mode 100644 index 0825a16..0000000 --- a/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/graphs/Graph5.svelte +++ /dev/null @@ -1,48 +0,0 @@ - - -
- -
- - \ No newline at end of file diff --git a/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/menu/SideMenu.svelte b/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/menu/SideMenu.svelte index 57bf783..4f7a164 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/menu/SideMenu.svelte +++ b/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/menu/SideMenu.svelte @@ -1,4 +1,29 @@ @@ -37,7 +62,7 @@
-
Profile Info
+
Hello, {username}
From 20dd0f34bfea79fabe7248c821703e77bf784da0 Mon Sep 17 00:00:00 2001 From: Daniel Date: Wed, 25 Oct 2023 01:31:12 +0300 Subject: [PATCH 12/17] Added logout button --- .../web/src/routes/dashboard/menu/SideMenu.svelte | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/menu/SideMenu.svelte b/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/menu/SideMenu.svelte index 4f7a164..c3fb4a6 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/menu/SideMenu.svelte +++ b/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/menu/SideMenu.svelte @@ -1,7 +1,7 @@
-
Income for this month 50$
-
Expense for this month 40$
-
Income for this month 50$
-
Expense for this month 40$
+
+
+
+
\ No newline at end of file + diff --git a/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/Incomes.svelte b/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/Incomes.svelte index 018a098..9f1d7f6 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/Incomes.svelte +++ b/src/main/java/com/faf223/expensetrackerfaf/web/src/routes/dashboard/board/Incomes.svelte @@ -30,19 +30,26 @@
-

Incomes

-
    - {#each data as item} -
  • - {item.incomeCategory ? `${item.incomeCategory.name}: ` : `${item.expenseCategory.name}: `} - {item.incomeCategory ? `+${item.amount}$` : `-${item.amount}$`} - {`${item.date}`} -
  • - {/each} -
+

Incomes

+
+
    + {#each data as item} +
  • + {item.incomeCategory ? `${item.incomeCategory.name}: ` : `${item.expenseCategory.name}: `} + {item.incomeCategory ? `+${item.amount}$` : `-${item.amount}$`} + {`${item.date}`} +
  • + {/each} +
+
\ No newline at end of file + +