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}