浏览代码

Many to Many (user-role), add boat view translations, profile role update, user service role update

mateuszsudra 2 年之前
父节点
当前提交
baa566e9e0

+ 4 - 2
boat-reservation-logic/src/main/java/pl/sudra/controller/UserController.java

@@ -12,6 +12,7 @@ import pl.sudra.domain.User;
 import pl.sudra.repository.UserRepository;
 import pl.sudra.service.UserService;
 
+import java.util.Arrays;
 import java.util.List;
 
 import static pl.sudra.securityController.JwtTokenUtil.validateToken;
@@ -47,8 +48,9 @@ public class UserController {
             value = "/updateUser",
             method = RequestMethod.GET,
             produces = MediaType.APPLICATION_JSON_VALUE)
-    public void updateUser(@Param("id") Long id, @Param("role") String role) {
-        this.userService.updateUserRole(id, role);
+    public void updateUser(@Param("id") Long id, @Param("roles") String[] roles) {
+        System.out.println(Arrays.toString(roles));
+        this.userService.updateUserRole(id, roles);
     }
     @RequestMapping(
             value = "/deleteUser",

+ 28 - 19
boat-reservation-logic/src/main/java/pl/sudra/domain/User.java

@@ -34,29 +34,19 @@ public class User {
     @Email(regexp = "^[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+$", message = "Invalid email address")
     private String email;
     //    @NotNull
-//    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
-    private String role;
+    @ManyToMany(fetch = FetchType.EAGER)
+    private Set<Role> role = new HashSet<Role>(0);
     @NotNull
     private boolean enabled = false;
 
-    public void setRole(String role) {
-        this.role = role;
-    }
+//    public void setRole(String role) {
+//        this.role = role;
+//    }
 
     public boolean isEnabled() {
         return enabled;
     }
 
-    public void setEnabled(boolean enabled) {
-        this.enabled = enabled;
-    }
-    //    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "user")
-//    private List<Reservation> reservations;
-
-//    public void setReservations(Collection<Reservation> reservations) {
-//        this.reservations = (List<Reservation>) reservations;
-//    }
-
     @Override
     public String toString() {
         return "User{" +
@@ -65,17 +55,36 @@ public class User {
                 ", password='" + password + '\'' +
                 ", email='" + email + '\'' +
                 ", role=" + role +
-//                ", reservations=" + reservations +
+                ", enabled=" + enabled +
                 '}';
     }
 
-    public String getRolesForToken() {
-        return role;
+    public void setEnabled(boolean enabled) {
+        this.enabled = enabled;
+    }
+    //    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "user")
+//    private List<Reservation> reservations;
+
+//    public void setReservations(Collection<Reservation> reservations) {
+//        this.reservations = (List<Reservation>) reservations;
+//    }
+
+    public String[] getRolesForToken() {
+        Set<Role> appUserRoles = getRole(); // Assuming you have a method to retrieve the Set<AppUserRole>
+
+        String[] rolesArray = appUserRoles.stream()
+                .map(Role::getRole)
+                .toArray(String[]::new);
+
+        return rolesArray;
     }
 
     public User() {
     }
 
+    public void setRole(Set<Role> role) {
+        this.role = role;
+    }
 //    public User(Long id, String username, String password, String email, String role) {
 //        this.id = id;
 //        this.username = username;
@@ -108,7 +117,7 @@ public class User {
         this.email = email;
     }
 
-    public String getRole() {
+    public Set<Role> getRole() {
         return role;
     }
 

+ 6 - 4
boat-reservation-logic/src/main/java/pl/sudra/securityController/SecurityController.java

@@ -49,6 +49,7 @@ public class SecurityController {
     public ResponseEntity<?> Register(@Valid @RequestBody User user, BindingResult bindingResult, HttpServletRequest request) {
         // validation check
         System.out.println("register - validation check");
+        System.out.println("user: " + user.toString());
         if (bindingResult.hasErrors() || !reCaptchaService.verify(request.getHeader("recaptcha"))) {
             List<String> errors = bindingResult.getAllErrors()
                     .stream()
@@ -86,9 +87,10 @@ public class SecurityController {
         user.setPassword(hashedPassword);
 
         System.out.println("register - setting client role");
-        Role client_role = roleService.getRole(0L);
-        System.out.println("CLIENT ROLE" + client_role.toString());
-        String roles = client_role.getRole();
+        Set<Role> roles = new HashSet<>();
+        roles.add(roleService.getRole(0L));
+//        System.out.println("CLIENT ROLE" + client_role.toString());
+//        String roles = client_role.getRole();
 //        roles.add(client_role);
 
         user.setRole(roles);
@@ -129,7 +131,7 @@ public class SecurityController {
                 String jwtToken = JwtTokenUtil.generateToken(
                         user.get().getUsername(),
                         user.get().getId(),
-                        user.get().getRolesForToken()
+                        Arrays.toString(user.get().getRolesForToken())
                 );
                 System.out.println(jwtToken);
 

+ 2 - 1
boat-reservation-logic/src/main/java/pl/sudra/service/EmailServiceImpl.java

@@ -19,6 +19,7 @@ import pl.sudra.domain.User;
 
 import java.io.ByteArrayOutputStream;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Objects;
 
@@ -78,7 +79,7 @@ public class EmailServiceImpl implements EmailService {
             userInfoTable.addCell(cell);
         }
         // Add user info
-        for (String text : List.of(user.getId().toString(), user.getUsername(), user.getEmail(), user.getRole())) {
+        for (String text : List.of(user.getId().toString(), user.getUsername(), user.getEmail(), Arrays.toString(user.getRolesForToken()))) {
             PdfPCell cell = new PdfPCell(new Paragraph(text));
             cell.setHorizontalAlignment(Element.ALIGN_CENTER);
             userInfoTable.addCell(cell);

+ 1 - 1
boat-reservation-logic/src/main/java/pl/sudra/service/UserService.java

@@ -16,7 +16,7 @@ public interface UserService {
 
     List<User> getAll();
 
-    void updateUserRole(Long id, String roles);
+    void updateUserRole(Long id, String[] roles);
 
     void deleteUser(Long id);
 }

+ 17 - 6
boat-reservation-logic/src/main/java/pl/sudra/service/UserServiceImpl.java

@@ -2,19 +2,26 @@ package pl.sudra.service;
 
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import pl.sudra.domain.Role;
 import pl.sudra.domain.User;
+import pl.sudra.repository.RoleRepository;
 import pl.sudra.repository.UserRepository;
 
+import java.util.HashSet;
 import java.util.List;
 import java.util.Optional;
+import java.util.Set;
 
 @Service("userService")
 @Transactional
 public class UserServiceImpl implements UserService {
     private final UserRepository userRepository;
+    private final RoleRepository roleRepository;
 
-    public UserServiceImpl(UserRepository userRepository) {
+
+    public UserServiceImpl(UserRepository userRepository, RoleRepository roleRepository) {
         this.userRepository = userRepository;
+        this.roleRepository = roleRepository;
     }
 
     @Override
@@ -43,13 +50,17 @@ public class UserServiceImpl implements UserService {
     }
 
     @Override
-    public void updateUserRole(Long id, String role) {
+    public void updateUserRole(Long id, String[] roles) {
         User user = this.userRepository.findById(id).get();
-        if (user.getRole().contains(role)) {
-            user.setRole(user.getRole().replace(";" + role, ""));
-        } else {
-            user.setRole(user.getRole() + ";" + role);
+        System.out.println(user.getRole());
+        Set<Role> rs = new HashSet<>();
+        for(String r: roles){
+            System.out.println(r);
+            rs.add(roleRepository.findByRole(r).get());
         }
+
+        user.setRole(rs);
+        System.out.println(user.getRole());
         this.userRepository.save(user);
     }
 

+ 4 - 4
boat-reservation-view/src/app/add-boat-component/add-boat.component.html

@@ -1,18 +1,18 @@
 <div style="text-align: center;">
-  <h2>REGISTER NEW BOAT</h2>
+  <h2 translate="register_boat.title"></h2>
 </div>
 <form (submit)="addBoat()" #myForm="ngForm" style="font-family: Courier New, monospace;">
-  <label for="name">Name:</label>
+  <label for="name" translate="register_boat.name"></label>
   <input type="text"
          id="name"
          name="name" [(ngModel)]="formData.name" required>
 
-  <label for="capacity">Capacity:</label>
+  <label for="capacity" translate="register_boat.capacity"></label>
   <input type="number"
          id="capacity"
          name="capacity" [(ngModel)]="formData.capacity" required>
 
-  <label for="cost">Cost:</label>
+  <label for="cost" translate="register_boat.cost"></label>
   <input type="number"
          id="cost"
          name="cost" [(ngModel)]="formData.cost" required>

+ 16 - 4
boat-reservation-view/src/app/admin-panel/admin-panel.component.ts

@@ -21,8 +21,8 @@ export class AdminPanelComponent {
               user.id,
               user.username,
               user.email,
-              user.role.includes("ADMIN"),
-              user.role.includes("MANAGER"),
+              user.role.some(r => r.role! === "ADMIN"),
+              user.role.some(r => r.role! === "MANAGER"),
               user.enabled))
         })
         this.users.sort((a, b) => a.id - b.id)
@@ -33,12 +33,24 @@ export class AdminPanelComponent {
 
   updateAdminRole(id: number) {
     this.users.find(u => u.id == id)?.switchAdmin()
-    this.userService.updateUserRole(id, "ADMIN")
+    this.updateRole(id)
   }
 
   updateManagerRole(id: number) {
     this.users.find(u => u.id == id)?.switchManager()
-    this.userService.updateUserRole(id, "MANAGER")
+    this.updateRole(id)
+  }
+
+  updateRole(id: number){
+    let roles = ['CLIENT']
+    if(this.users.find(u => u.id == id)?.isAdmin){
+      roles.push('ADMIN')
+    }
+    if(this.users.find(u => u.id == id)?.isManager){
+      roles.push('MANAGER')
+    }
+    console.log(roles)
+    this.userService.updateUserRole(id, roles)
   }
 
   deleteUser(id: number) {

+ 1 - 1
boat-reservation-view/src/app/app.module.ts

@@ -38,7 +38,7 @@ export function setRoutes() {
     {path: 'login', component: LoginViewComponent},
     {path: 'register', component: RegisterViewComponent}
   ];
-  const roles = sessionStorage.getItem("role")?.split(";");
+  const roles: string | null = sessionStorage.getItem("role");
   if (roles) {
     if (roles.includes("CLIENT")) {
       routes.push(

+ 4 - 0
boat-reservation-view/src/app/domain/role.ts

@@ -0,0 +1,4 @@
+export class Role {
+  id = 0
+  role = ''
+}

+ 3 - 1
boat-reservation-view/src/app/domain/user.ts

@@ -1,10 +1,12 @@
+import {Role} from "./role";
+
 export class User {
   id = 0
   username = ''
   email = ''
   isAdmin = false
   isManager = false
-  role: string = '';
+  role: Role[] = [];
   enabled = false;
 
   constructor(id: number, username: string, email: string, isAdmin: boolean, isManager: boolean, enabled: boolean) {

+ 1 - 1
boat-reservation-view/src/app/profile-page/profile-page.component.html

@@ -5,7 +5,7 @@
       <th>ID</th>
       <th translate="admin.username"></th>
       <th>Email</th>
-      <th translate="admin.actions"></th>
+      <th translate="admin.roles"></th>
       <th translate="admin.actions"></th>
     </tr>
     <tr>

+ 1 - 0
boat-reservation-view/src/app/profile-page/profile-page.component.ts

@@ -32,6 +32,7 @@ export class ProfilePageComponent {
     this.userService.getUser(sessionStorage.getItem("username")!).subscribe(
       user => {
         this.user_info = user
+        this.user_info.roles = sessionStorage.getItem("role")
         this.reservationService.findReservationsByUserId(user.id!).subscribe(
           reservations => {
             this.reservations_info = reservations.map(r => {

+ 3 - 2
boat-reservation-view/src/app/services/user.service.ts

@@ -21,8 +21,9 @@ export class UserService {
     return this.http.get<User[]>(url, {headers})
   }
 
-  updateUserRole(id: number, role: string): void {
-    const url = 'http://localhost:2137/updateUser?id=' + id + '&role=' + role;
+  updateUserRole(id: number, role: string[]): void {
+    let roles = role.join(',')
+    const url = 'http://localhost:2137/updateUser?id=' + id + '&roles=' + roles;
 
     const headers = new HttpHeaders()
       .set('Content-Type', 'application/json')

+ 6 - 0
boat-reservation-view/src/assets/i18n/en.json

@@ -95,6 +95,12 @@
     "email_format": "Niewłaściwy format email'u!",
     "errors": "Napraw powyższe błędy aby kontynuować"
   },
+  "register_boat": {
+    "title": "REGISTER NEW BOAT:",
+    "name": "Boat name:",
+    "capacity": "Capacity:",
+    "cost": "Cost per hour:"
+  },
   "not_found": {
     "title": "404 Given page was not found :("
   }

+ 6 - 0
boat-reservation-view/src/assets/i18n/pl.json

@@ -95,6 +95,12 @@
     "email_format": "Niewłaściwy format email'u!",
     "errors": "Napraw powyższe błędy aby kontynuować"
   },
+  "register_boat": {
+    "title": "REJESTRACJA NOWEJ ŁODZI:",
+    "name": "Nazwa łodzi:",
+    "capacity": "Ładowność:",
+    "cost": "Koszt na godzinę:"
+  },
   "not_found": {
     "title": "404 Nie znaleziono danej strony :("
   }