mirror of
https://github.com/st-tu-dresden-praktikum/swt23w23
synced 2024-07-19 21:04:36 +02:00
Add profile prototype
This commit is contained in:
parent
eec4066dd0
commit
16f5ff20e3
102
src/main/java/catering/users/User.java
Normal file
102
src/main/java/catering/users/User.java
Normal file
|
@ -0,0 +1,102 @@
|
|||
package catering.users;
|
||||
|
||||
import jakarta.persistence.Embeddable;
|
||||
import jakarta.persistence.EmbeddedId;
|
||||
import jakarta.persistence.Entity;
|
||||
import jakarta.persistence.OneToOne;
|
||||
|
||||
import org.salespointframework.useraccount.UserAccount;
|
||||
import org.salespointframework.core.AbstractAggregateRoot;
|
||||
|
||||
import catering.users.User.UserIdentifier;
|
||||
import java.io.Serializable;
|
||||
import java.util.UUID;
|
||||
import org.jmolecules.ddd.types.Identifier;
|
||||
|
||||
@Entity
|
||||
public class User extends AbstractAggregateRoot<UserIdentifier> {
|
||||
|
||||
private @EmbeddedId UserIdentifier id = new UserIdentifier();
|
||||
private String address;
|
||||
|
||||
@OneToOne
|
||||
private UserAccount userAccount;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
private User() {}
|
||||
|
||||
public User(UserAccount userAccount,String address){
|
||||
this.address = address;
|
||||
this.userAccount = userAccount;
|
||||
};
|
||||
|
||||
public String getAddress(){
|
||||
return address;
|
||||
}
|
||||
|
||||
public boolean setAddress(String address){
|
||||
this.address = address;
|
||||
return true;
|
||||
// NOTE: the return type is boolean,
|
||||
// because in the future we may want to check if the input is a real address
|
||||
};
|
||||
|
||||
public String getUsername() {
|
||||
return userAccount.getUsername();
|
||||
};
|
||||
|
||||
public boolean setUsername(String name){
|
||||
userAccount.setUsername(name);
|
||||
return true;
|
||||
}
|
||||
|
||||
public UserAccount getUserAccount(){
|
||||
return this.userAccount;
|
||||
}
|
||||
|
||||
@Override
|
||||
public UserIdentifier getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
@Embeddable
|
||||
public static final class UserIdentifier implements Identifier, Serializable {
|
||||
|
||||
private static final long serialVersionUID = 7740660930809051850L;
|
||||
private final @SuppressWarnings("unused") UUID identifier;
|
||||
|
||||
UserIdentifier() {
|
||||
this(UUID.randomUUID());
|
||||
}
|
||||
|
||||
UserIdentifier(UUID identifier) {
|
||||
this.identifier = identifier;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
|
||||
final int prime = 31;
|
||||
int result = 1;
|
||||
|
||||
result = prime * result + (identifier == null ? 0 : identifier.hashCode());
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
|
||||
if (obj == this) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!(obj instanceof UserIdentifier that)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return this.identifier.equals(that.identifier);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
54
src/main/java/catering/users/UserController.java
Normal file
54
src/main/java/catering/users/UserController.java
Normal file
|
@ -0,0 +1,54 @@
|
|||
package catering.users;
|
||||
|
||||
import org.springframework.ui.Model;
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
|
||||
@Controller
|
||||
public class UserController {
|
||||
|
||||
private final UserManagement userManagement;
|
||||
|
||||
UserController(UserManagement userManagerment){
|
||||
this.userManagement = userManagerment;
|
||||
};
|
||||
|
||||
@GetMapping("/profile")
|
||||
public String index(Model model) {
|
||||
|
||||
model.addAttribute("user", userManagement.getUsers().findAll().toList().get(0));
|
||||
|
||||
return "profile";
|
||||
}
|
||||
|
||||
@PostMapping("/profile")
|
||||
public String editProfile(@RequestParam String password, @RequestParam String address, @RequestParam String username) {
|
||||
|
||||
User userAccount = userManagement.getUsers().findAll().toList().get(0);
|
||||
|
||||
if (!username.isBlank()){
|
||||
userAccount.setUsername(username);
|
||||
}
|
||||
|
||||
if (!address.isBlank()){
|
||||
userAccount.setAddress(address);
|
||||
}
|
||||
|
||||
if (!password.isBlank()){
|
||||
userManagement.setPassword(password, userAccount.getUserAccount());
|
||||
}
|
||||
|
||||
userManagement.save(userAccount);
|
||||
|
||||
return "redirect:/profile";
|
||||
}
|
||||
|
||||
@GetMapping("/profile/delete")
|
||||
public String deleteUser() {
|
||||
User userAccount = userManagement.getUsers().findAll().toList().get(0);
|
||||
userManagement.deleteUser(userAccount);
|
||||
return "redirect:/";
|
||||
}
|
||||
}
|
37
src/main/java/catering/users/UserDataInitializer.java
Normal file
37
src/main/java/catering/users/UserDataInitializer.java
Normal file
|
@ -0,0 +1,37 @@
|
|||
package catering.users;
|
||||
|
||||
import org.salespointframework.core.DataInitializer;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.core.annotation.Order;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.util.Assert;
|
||||
import org.salespointframework.useraccount.AuthenticationManagement;
|
||||
import org.springframework.web.bind.annotation.SessionAttributes;
|
||||
|
||||
@Component
|
||||
@Order(10)
|
||||
@SessionAttributes("profile")
|
||||
class UserDataInitializer implements DataInitializer {
|
||||
|
||||
private static final Logger LOG = LoggerFactory.getLogger(UserDataInitializer.class);
|
||||
|
||||
private final UserManagement userManagement;
|
||||
|
||||
UserDataInitializer(UserManagement userManagement, AuthenticationManagement auth) {
|
||||
|
||||
Assert.notNull(userManagement, "UserRepository must not be null!");
|
||||
|
||||
this.userManagement = userManagement;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void initialize() {
|
||||
|
||||
LOG.info("Creating default user.");
|
||||
|
||||
userManagement.createUser("Hans","123","Baum Weg");
|
||||
|
||||
}
|
||||
|
||||
}
|
50
src/main/java/catering/users/UserManagement.java
Normal file
50
src/main/java/catering/users/UserManagement.java
Normal file
|
@ -0,0 +1,50 @@
|
|||
package catering.users;
|
||||
|
||||
import org.springframework.web.bind.annotation.SessionAttributes;
|
||||
import org.salespointframework.useraccount.UserAccount;
|
||||
|
||||
import org.salespointframework.useraccount.Password.UnencryptedPassword;
|
||||
import org.salespointframework.useraccount.Role;
|
||||
import org.salespointframework.useraccount.UserAccountManagement;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
@Service
|
||||
@Transactional
|
||||
@SessionAttributes("profile")
|
||||
public class UserManagement {
|
||||
|
||||
private final UserRepository users;
|
||||
private final UserAccountManagement userAccounts;
|
||||
|
||||
UserManagement(UserRepository users, UserAccountManagement userAccounts) {
|
||||
|
||||
this.users = users;
|
||||
this.userAccounts = userAccounts;
|
||||
}
|
||||
|
||||
public User createUser(String name, String Password, String address) {
|
||||
|
||||
var password = UnencryptedPassword.of(Password);
|
||||
var userAccount = userAccounts.create(name, password, Role.of("CUSTOMER"));
|
||||
|
||||
return users.save(new User(userAccount, address));
|
||||
}
|
||||
|
||||
public User save(User user){
|
||||
return users.save(user);
|
||||
}
|
||||
|
||||
public boolean setPassword(String password, UserAccount userAccount) {
|
||||
userAccounts.changePassword(userAccount, UnencryptedPassword.of(password));
|
||||
return true;
|
||||
};
|
||||
|
||||
public UserRepository getUsers(){
|
||||
return users;
|
||||
}
|
||||
|
||||
public void deleteUser(User user){
|
||||
users.deleteById(user.getId());
|
||||
}
|
||||
}
|
11
src/main/java/catering/users/UserRepository.java
Normal file
11
src/main/java/catering/users/UserRepository.java
Normal file
|
@ -0,0 +1,11 @@
|
|||
package catering.users;
|
||||
|
||||
import catering.users.User.UserIdentifier;
|
||||
import org.springframework.data.repository.CrudRepository;
|
||||
import org.springframework.data.util.Streamable;
|
||||
|
||||
interface UserRepository extends CrudRepository<User, UserIdentifier> {
|
||||
|
||||
@Override
|
||||
Streamable<User> findAll();
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
# ATTENTION:
|
||||
# ATTENTION:
|
||||
# Spring Boot expects this file to be UTF-8 encoded 👍 However, some IDEs will open it in
|
||||
# the wrong mode. For example, IntelliJ users must go to Preferences > Editor > File Encodings
|
||||
# and set "Default encoding for properties files" to "UTF-8".
|
||||
|
@ -9,3 +9,13 @@
|
|||
|
||||
welcome.title = Welcome back!
|
||||
welcome.text = If umlauts such as äöü are not displayed correctly, something is broken
|
||||
|
||||
profile.title = Dein Profil
|
||||
profile.danger_zone = Danger Zone
|
||||
profile.edit = Bearbeiten
|
||||
profile.delete = Account löschen
|
||||
profile.username = Nutzername
|
||||
profile.password = Passwort
|
||||
profile.address = Adresse
|
||||
profile.authentification = Authentifikation
|
||||
profile.userinformation = Nutzerinformationen
|
||||
|
|
57
src/main/resources/static/resources/css/profile/style.css
Normal file
57
src/main/resources/static/resources/css/profile/style.css
Normal file
|
@ -0,0 +1,57 @@
|
|||
/* CSS RESET */
|
||||
|
||||
* {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
body {
|
||||
margin: 0 auto;
|
||||
width: 940px;
|
||||
font: 13px/22px Helvetica, Arial, sans-serif;
|
||||
background: #f0f0f0;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: 3em;
|
||||
line-height: 3.2em;
|
||||
text-align:center;
|
||||
}
|
||||
|
||||
table {
|
||||
border-collapse: separate;
|
||||
border-spacing: 5 2em;
|
||||
padding: 20px;
|
||||
padding-left: 50px;
|
||||
font-size: 20px;
|
||||
}
|
||||
|
||||
h2 {
|
||||
margin: 10px;
|
||||
}
|
||||
|
||||
th, td {
|
||||
padding: 15px;
|
||||
}
|
||||
|
||||
.horizontal_center {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
div.danger_zone {
|
||||
margin-bottom: 50px;
|
||||
}
|
||||
|
||||
button.danger_zone {
|
||||
padding-top: 15px;
|
||||
padding-bottom: 15px;
|
||||
padding-right: 25px;
|
||||
padding-left: 25px;
|
||||
margin-left: 40px;
|
||||
margin-right: 40px;
|
||||
color: red;
|
||||
border: 2px solid red;
|
||||
border-radius: 4px;
|
||||
}
|
40
src/main/resources/templates/profile.html
Normal file
40
src/main/resources/templates/profile.html
Normal file
|
@ -0,0 +1,40 @@
|
|||
<!DOCTYPE html>
|
||||
<html xmlns:th="http://www.thymeleaf.org">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<link rel="stylesheet" th:href="@{/resources/css/profile/style.css}" />
|
||||
<title th:text="#{profile.title}" />
|
||||
</head>
|
||||
<body>
|
||||
<form th:action="@{/profile}" method="post" >
|
||||
<h1 th:text="#{profile.title}"></h1>
|
||||
<h2 class="settings" th:text="#{profile.authentification}"></h2>
|
||||
<table>
|
||||
<tr>
|
||||
<td th:text="#{profile.username}"></td>
|
||||
<td><input name="username" th:value="${user.username}" type="text"/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td th:text="#{profile.password}"></td>
|
||||
<td><input name="password" type="password"/></td>
|
||||
</tr>
|
||||
</table>
|
||||
<h2 class="settings" th:text="#{profile.userinformation}"></h2>
|
||||
<table>
|
||||
<tr>
|
||||
<td th:text="#{profile.address}"></td>
|
||||
<td><input name="address" th:value="${user.address}" type="text"/></td>
|
||||
</tr>
|
||||
</table>
|
||||
<div class="danger_zone">
|
||||
<h1 class="danger_zone" th:text="#{profile.danger_zone}"></h1>
|
||||
<div class="horizontal_center">
|
||||
<button class="danger_zone" th:text="#{profile.edit}" type="submit"></button>
|
||||
<a th:href="@{/profile/delete}">
|
||||
<button class="danger_zone" th:text="#{profile.delete}" type="button"></button>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</body>
|
||||
</html>
|
Loading…
Reference in a new issue