diff --git a/frontend/src/components/LoginPage.vue b/frontend/src/components/LoginPage.vue
index d7d2f228c49cc75188e7c322d4b934bdda8488db..73815fed63280d197aa655028195a7b78cefe757 100644
--- a/frontend/src/components/LoginPage.vue
+++ b/frontend/src/components/LoginPage.vue
@@ -2,6 +2,11 @@
export default {
name: "LoginPage",
+ created() {
+ if(localStorage.getItem('isLoggedIn') === 'true' && localStorage.getItem('userId') !== null){
+ this.$router.push({ name: 'main', params: {id: localStorage.getItem('userId')}})
+ }
+ },
data(){
return {
user: {
@@ -15,11 +20,9 @@ export default {
},
computed: {
checkEmptyFieldsSignup(){
- console.log("here: " + this.user.userName)
return this.user.userName === '' || this.user.password === '' || this.repeatedPassword === '' || this.user.password !== this.repeatedPassword;
},
checkEmptyFieldsSignin(){
- console.log("here: " + this.user.userName)
return this.user.userName === '' || this.user.password === ''
}
},
@@ -32,6 +35,7 @@ export default {
headers: {
"Content-Type": "application/json"
},
+ credentials: 'include',
body: JSON.stringify({
"userName": this.user.userName,
"password": this.user.password
@@ -52,6 +56,7 @@ export default {
headers: {
"Content-Type": "application/json"
},
+ credentials: 'include',
body: JSON.stringify({
"userName": this.user.userName,
"password": this.user.password
@@ -61,23 +66,20 @@ export default {
const responseData = await response.json();
if(response.status === 200){
+ localStorage.setItem('userId', responseData.userId)
+ localStorage.setItem('isLoggedIn', 'true')
this.$bvToast.show('signin-success')
await this.$router.push({ name: 'main', params: {id: responseData.userId}});
} else {
this.$bvToast.show('invalid-user-password')
}
},
- async signOut(){
- await this.$router.push({ name: 'login'});
- }
}
}
</script>
<template>
-
- <b-container fluid id="main-container">
-
+ <b-container class="h-100" fluid id="main-container">
<b-row class="justify-content-center align-items-center">
<b-col></b-col>
<b-col>
@@ -105,7 +107,6 @@ export default {
</b-card-body>
<b-card-footer>
© Jan Schnaidt & Abdullah Kiran, 2024
- <b-button @click="signOut">Test Logout</b-button>
</b-card-footer>
</b-card>
</b-col>
diff --git a/frontend/src/components/MainPage.vue b/frontend/src/components/MainPage.vue
index fc7c196bc92dce8c23118cadebc99c7d28c4256c..1a89d0f13020ac3cc1d71783c264444e6a56d5e9 100644
--- a/frontend/src/components/MainPage.vue
+++ b/frontend/src/components/MainPage.vue
@@ -2,9 +2,14 @@
export default {
name: "MainPage",
created(){
- console.log('main page: ' + this.$route.params.id)
+ if(localStorage.getItem('isLoggedIn') === null && localStorage.getItem('userId') !== 'true'){
+ this.$router.push({ name: 'login' })
+ }
+
+ this.userId = localStorage.getItem('userId')
+ this.getAllTodos()
},
- data: function () {
+ data() {
return {
items: [],
newItem: "",
@@ -12,10 +17,9 @@ export default {
showDetailsModal: false,
selectedItem: "",
user: {
- userId: this.$route.params.id,
+ userId: '',
userName: '',
- password: '',
- todoList: []
+ password: ''
},
todo: {
todoId: '',
@@ -25,9 +29,6 @@ export default {
completed: false
}
}
- },
- computed: {
-
},
methods: {
asdItem() {
@@ -40,7 +41,16 @@ export default {
this.selectedItem = item;
this.showDetailsModal = true;
},
+ async getAllTodos(){
+ let url = `http://localhost:9876/user/getAllTodos?userId=${localStorage.getItem('userId')}`
+
+ const response = await fetch(url, {
+ method: 'GET',
+ credentials: 'include',
+ })
+ this.items = await response.json()
+ },
async addTodo(){
let url = "http://localhost:9876/user/addTodo"
@@ -49,15 +59,36 @@ export default {
headers: {
"Content-Type": "application/json"
},
+ credentials: 'include', // Ensure credentials are included
body: JSON.stringify({
"title": this.todo.title,
"description": this.todo.description,
"userId": this.$route.params.id,
"completed": false
})
+ });
+
+ this.items = await response.json()
+ },
+ async signout(){
+ let url = "http://localhost:9876/user/signout"
+
+ const response = await fetch(url, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json'
+ },
+ credentials: 'include',
+ body: JSON.stringify({
+ 'userId': localStorage.getItem('userId')
+ })
})
- console.log(response)
+ if(response.status === 200){
+ localStorage.removeItem('isLoggedIn')
+ localStorage.removeItem('userId')
+ await this.$router.push({ name: 'login'})
+ }
}
}
}
@@ -66,7 +97,7 @@ export default {
<template>
<div>
<b-container fluid id="main-container">
-
+ <b-button @click="signout">Log out</b-button>
<b-row class="justify-content-center align-items-center">
<b-col>
<b-card class="shadow-lg" border-variant="secondary" title="ToDo-App">
@@ -84,7 +115,8 @@ export default {
</b-modal>
<ul class="list-group mt-3">
<li v-for="(item, index) in items" :key="index" class="list-group-item" @click="showDetails(item)">
- {{ item }}
+ <h5> {{ item.title }} </h5>
+ <p> {{ item.description }}</p>
</li>
</ul>
<b-modal v-model="showDetailsModal" title="Details" hide-header id="showDetailsModal">
@@ -97,26 +129,21 @@ export default {
</b-card>
</b-col>
</b-row>
- <!--
- ----- toasts & alerts -----
-
- <b-toast no-close-button auto-hide-delay="5000" variant="success" id="account-created-toast" title="success">
- account for {{ this.user.userName }} has been created
- </b-toast>
- <b-toast no-close-button auto-hide-delay="5000" variant="danger" id="account-not-created-toast" title="error">
- user {{ this.user.userName }} already exists
- </b-toast>
- <b-toast signin-success auto-hide-delay="5000" variant="success" id="signin-success" title="success">
- Signin Success
- </b-toast>
- <b-toast invalid-user-password auto-hide-delay="10000" variant="danger" id="invalid-user-password" title="error">
- User {{ this.user.userName }} or Password invalid
- </b-toast>
- -->
</b-container>
</div>
</template>
<style scoped>
+.list-group-item {
+ padding: 5px;
+ margin-bottom: 10px;
+ border-radius: 5px;
+ background-color: #f8f9fa;
+ border: 1px darkgray solid;
+}
+
+.list-group-item:hover {
+ background-color: #e9ecef;
+}
</style>
\ No newline at end of file
diff --git a/src/main/java/com/cloudcomputing/todo/controller/UserController.java b/src/main/java/com/cloudcomputing/todo/controller/UserController.java
index 6fddd92687348fa1c535775616a3c129379c52fd..e05a8d7e26610d8cf55271f424730c3c5862a779 100644
--- a/src/main/java/com/cloudcomputing/todo/controller/UserController.java
+++ b/src/main/java/com/cloudcomputing/todo/controller/UserController.java
@@ -3,6 +3,7 @@ package com.cloudcomputing.todo.controller;
import com.cloudcomputing.todo.dto.TodoDTO;
import com.cloudcomputing.todo.dto.UserDTO;
import com.cloudcomputing.todo.service.UserService;
+import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
@@ -13,7 +14,7 @@ import java.util.List;
@RestController
@RequestMapping("/user")
-@CrossOrigin(origins = "*")
+@CrossOrigin(origins = "http://localhost:8080", allowCredentials = "true")
public class UserController {
@Autowired
private UserService userService;
@@ -30,8 +31,8 @@ public class UserController {
}
@PostMapping("/signin")
- public ResponseEntity<UserDTO> login(HttpSession session, @RequestBody UserDTO user) {
- boolean loginSuccessful = userService.login(session, user);
+ public ResponseEntity<UserDTO> login(HttpServletRequest request, @RequestBody UserDTO user) {
+ boolean loginSuccessful = userService.login(request, user);
if(loginSuccessful){
return new ResponseEntity<>(userService.getUser(user), HttpStatus.OK);
}
@@ -39,10 +40,33 @@ public class UserController {
return new ResponseEntity<>(null, HttpStatus.UNAUTHORIZED);
}
+ @PostMapping("/signout")
+ public ResponseEntity<String> logout(HttpServletRequest request, @RequestBody String userId) {
+ boolean logoutSuccessful = userService.logout(request, userId);
+ if(logoutSuccessful){
+ return new ResponseEntity<>(HttpStatus.OK);
+ }
+
+ return new ResponseEntity<>(null, HttpStatus.UNAUTHORIZED);
+ }
+
@PostMapping("/addTodo")
- public ResponseEntity<List<TodoDTO>> addTodo(HttpSession session, @RequestBody TodoDTO todoDTO) {
- session.getAttribute("currentUser");
- List<TodoDTO> todos = userService.addTodo(todoDTO);
- return new ResponseEntity<>(todos, HttpStatus.CREATED);
+ public ResponseEntity<List<TodoDTO>> addTodo(HttpServletRequest request, @RequestBody TodoDTO todoDTO) {
+ if(userService.validateSession(request)){
+ List<TodoDTO> todos = userService.addTodo(todoDTO);
+ return new ResponseEntity<>(todos, HttpStatus.CREATED);
+ }
+
+ return new ResponseEntity<>(null, HttpStatus.UNAUTHORIZED);
+ }
+
+ @GetMapping("/getAllTodos")
+ public ResponseEntity<List<TodoDTO>> getAllTodos(HttpServletRequest request, @RequestParam String userId) {
+ if(userService.validateSession(request)){
+ List<TodoDTO> todos = userService.getAllTodos(userId);
+ return new ResponseEntity<>(todos, HttpStatus.OK);
+ }
+
+ return new ResponseEntity<>(null, HttpStatus.UNAUTHORIZED);
}
}
diff --git a/src/main/java/com/cloudcomputing/todo/service/UserService.java b/src/main/java/com/cloudcomputing/todo/service/UserService.java
index f5e73dd7317dec9197923de2df3e364cab9530c8..72def1a6b3d90e369300f827569a495ab6c711bd 100644
--- a/src/main/java/com/cloudcomputing/todo/service/UserService.java
+++ b/src/main/java/com/cloudcomputing/todo/service/UserService.java
@@ -9,6 +9,7 @@ import com.cloudcomputing.todo.mapper.UserMapper;
import com.cloudcomputing.todo.repository.TodoRepository;
import com.cloudcomputing.todo.repository.UserRepository;
import com.cloudcomputing.todo.util.CustomAuthenticator;
+import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -27,8 +28,10 @@ public class UserService {
@Autowired
private CustomAuthenticator customAuthenticator;
+
@Autowired
private TodoMapper todoMapper;
+
@Autowired
private TodoRepository todoRepository;
@@ -47,15 +50,37 @@ public class UserService {
return userMapper.entityToDto(userRepository.findByUserName(userDTO.getUserName()));
}
- public boolean login(HttpSession session, UserDTO userDTO) {
+ public boolean login(HttpServletRequest request, UserDTO userDTO) {
if(customAuthenticator.authenticate(userDTO)){
- session.setAttribute("currentUser", userDTO);
+ String userId = userRepository.findByUserName(userDTO.getUserName()).getUserId();
+ HttpSession session = request.getSession();
+ session.setAttribute("userId", userId);
return true;
}
return false;
}
+ public boolean logout(HttpServletRequest request, String userId) {
+ HttpSession session = request.getSession();
+
+ if(session != null){
+ session.invalidate();
+ }
+
+ return true;
+ }
+
+ public List<TodoDTO> getAllTodos(String userId) {
+ List <Todo> todoList = todoRepository.findAllByUserId(userId);
+ List<TodoDTO> todoDTOList = new ArrayList<>();
+
+ todoList.forEach((todoItem) -> {
+ todoDTOList.add(todoMapper.entityToDto(todoItem));
+ });
+ return todoDTOList;
+ }
+
public List<TodoDTO> addTodo(TodoDTO todoDTO){
Todo todo = todoMapper.dtoToEntity(todoDTO);
todoRepository.save(todo);
@@ -67,4 +92,10 @@ public class UserService {
});
return todoDTOList;
}
+
+ public boolean validateSession(HttpServletRequest request) {
+ HttpSession session = request.getSession(false);
+ System.out.println("Session ID: " + (session != null ? session.getId() : "null"));
+ return session != null && session.getAttribute("userId") != null;
+ }
}