From a082c72949b1d18a149d7c12e754eab7ae6010bb Mon Sep 17 00:00:00 2001 From: birkon <birkon@stud.ntnu.no> Date: Tue, 25 Apr 2023 10:53:39 +0200 Subject: [PATCH] added assosiation database between user and group --- .../v233/SmartMat/entity/group/Group.java | 18 ++-- .../SmartMat/entity/group/UserGroupAsso.java | 41 ++++++++++ .../SmartMat/entity/group/UserGroupId.java | 39 +++++++++ .../v233/SmartMat/entity/user/User.java | 36 +++++--- .../group/UserGroupAssoRepository.java | 8 ++ .../repository/{ => user}/UserRepository.java | 2 +- .../service/group/UserGroupAssoService.java | 34 ++++++++ .../SmartMat/service/user/UserService.java | 2 +- src/main/resources/db/sql/dbschema.sql | 1 - .../controller/user/UserControllerTest.java | 2 +- .../repository/UserRepositoryTest.java | 5 ++ .../repository/group/GroupRepositoryTest.java | 8 +- .../group/UserGroupAssoRepositoryTest.java | 82 +++++++++++++++++++ .../group/UserGroupAssoServiceTest.java | 63 ++++++++++++++ .../service/user/UserServiceTest.java | 2 +- 15 files changed, 318 insertions(+), 25 deletions(-) create mode 100644 src/main/java/ntnu/idatt2016/v233/SmartMat/entity/group/UserGroupAsso.java create mode 100644 src/main/java/ntnu/idatt2016/v233/SmartMat/entity/group/UserGroupId.java create mode 100644 src/main/java/ntnu/idatt2016/v233/SmartMat/repository/group/UserGroupAssoRepository.java rename src/main/java/ntnu/idatt2016/v233/SmartMat/repository/{ => user}/UserRepository.java (92%) create mode 100644 src/main/java/ntnu/idatt2016/v233/SmartMat/service/group/UserGroupAssoService.java create mode 100644 src/test/java/ntnu/idatt2016/v233/SmartMat/repository/group/UserGroupAssoRepositoryTest.java create mode 100644 src/test/java/ntnu/idatt2016/v233/SmartMat/service/group/UserGroupAssoServiceTest.java diff --git a/src/main/java/ntnu/idatt2016/v233/SmartMat/entity/group/Group.java b/src/main/java/ntnu/idatt2016/v233/SmartMat/entity/group/Group.java index 5e1f29f2..83fb34e5 100644 --- a/src/main/java/ntnu/idatt2016/v233/SmartMat/entity/group/Group.java +++ b/src/main/java/ntnu/idatt2016/v233/SmartMat/entity/group/Group.java @@ -8,9 +8,8 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import ntnu.idatt2016.v233.SmartMat.entity.user.User; -import org.hibernate.annotations.OnDelete; -import org.hibernate.annotations.OnDeleteAction; +import java.util.ArrayList; import java.util.List; /** @@ -42,11 +41,20 @@ public class Group { @Column(name = "group_name") String groupName; - @ManyToMany(mappedBy = "groups") - @JsonIgnoreProperties("groups") - private List<User> users; + @OneToMany + @JoinColumn(name = "group_id") + @JsonIgnoreProperties("group") + private List<UserGroupAsso> user = new ArrayList<>(); + public void addUser(UserGroupAsso userGroupTable){ + if (this.user == null) { + this.user = new ArrayList<>(); + } + + this.user.add(userGroupTable); + } + @ManyToMany @JoinTable(name = "group_achievement", joinColumns = @JoinColumn(name = "group_id"), diff --git a/src/main/java/ntnu/idatt2016/v233/SmartMat/entity/group/UserGroupAsso.java b/src/main/java/ntnu/idatt2016/v233/SmartMat/entity/group/UserGroupAsso.java new file mode 100644 index 00000000..687f1f29 --- /dev/null +++ b/src/main/java/ntnu/idatt2016/v233/SmartMat/entity/group/UserGroupAsso.java @@ -0,0 +1,41 @@ +package ntnu.idatt2016.v233.SmartMat.entity.group; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import ntnu.idatt2016.v233.SmartMat.entity.user.User; + +/** + * UserGroupTable is a class representing the user_group table in the database. + * It is used to represent the many-to-many relationship between users and groups. + * @Author Birk + * @Version 1.0 + * @Since 25.04 + */ +@Entity +@AllArgsConstructor +@NoArgsConstructor +@Data +@Table(name = "user_group") +public class UserGroupAsso { + + @EmbeddedId + private UserGroupId id; + + @ManyToOne + @MapsId("username") + @JoinColumn(name = "username") + @JsonIgnoreProperties("group") + private User user; + + @ManyToOne + @MapsId("group_id") + @JoinColumn(name = "group_id") + @JsonIgnoreProperties("user") + private Group group; + + @Column(name = "primary_group") + private Boolean primaryGroup; +} diff --git a/src/main/java/ntnu/idatt2016/v233/SmartMat/entity/group/UserGroupId.java b/src/main/java/ntnu/idatt2016/v233/SmartMat/entity/group/UserGroupId.java new file mode 100644 index 00000000..a9698b22 --- /dev/null +++ b/src/main/java/ntnu/idatt2016/v233/SmartMat/entity/group/UserGroupId.java @@ -0,0 +1,39 @@ +package ntnu.idatt2016.v233.SmartMat.entity.group; + +import jakarta.persistence.Column; +import jakarta.persistence.Embeddable; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.Objects; + +@AllArgsConstructor +@NoArgsConstructor +@Data +@Embeddable +@Builder +public class UserGroupId implements Serializable { + @Column(name = "username") + private String username; + @Column(name = "group_id") + private long groupId; + + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof UserGroupId)) return false; + UserGroupId that = (UserGroupId) o; + return Objects.equals(getUsername(), that.getUsername()) && + Objects.equals(getGroupId(), that.getGroupId()); + } + + @Override + public int hashCode() { + return Objects.hash(getUsername(), getGroupId()); + } + +} diff --git a/src/main/java/ntnu/idatt2016/v233/SmartMat/entity/user/User.java b/src/main/java/ntnu/idatt2016/v233/SmartMat/entity/user/User.java index fb70a221..a04c3956 100644 --- a/src/main/java/ntnu/idatt2016/v233/SmartMat/entity/user/User.java +++ b/src/main/java/ntnu/idatt2016/v233/SmartMat/entity/user/User.java @@ -1,6 +1,7 @@ package ntnu.idatt2016.v233.SmartMat.entity.user; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import jakarta.persistence.*; import lombok.AllArgsConstructor; @@ -8,23 +9,22 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import ntnu.idatt2016.v233.SmartMat.dto.enums.Authority; -import ntnu.idatt2016.v233.SmartMat.entity.group.Group; +import ntnu.idatt2016.v233.SmartMat.entity.group.UserGroupAsso; import ntnu.idatt2016.v233.SmartMat.entity.product.Allergy; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.userdetails.UserDetails; import java.sql.Date; -import java.util.Collection; -import java.util.List; +import java.util.*; /** * User is a class representing a user in the system. * It implements the UserDetails interface. * * @author Anders and Birk - * @version 2.0.1 - * @since 20.04.2023 + * @version 2.0.2 + * @since 25.04.2023 * */ @@ -38,6 +38,7 @@ public class User implements UserDetails { @Column(name = "username") private String username; @Column(name = "password") + @JsonIgnore private String password; @Column(name = "enabled") private boolean enabled; @@ -58,23 +59,31 @@ public class User implements UserDetails { private Authority authority; - @ManyToMany - @JoinTable( - name = "user_group", - joinColumns = @JoinColumn(name = "username"), - inverseJoinColumns = @JoinColumn(name = "group_id")) - @JsonIgnoreProperties("users") - private List<Group> groups; + @OneToMany + @JoinColumn(name = "username") + @JsonIgnoreProperties("user") + private List<UserGroupAsso> group; + @ManyToMany @JoinTable( name = "user_allergy", joinColumns = @JoinColumn(name = "username"), inverseJoinColumns = @JoinColumn(name = "allergy_name")) - @JsonIgnoreProperties("users") + @JsonIgnoreProperties({"users", "products"}) private List<Allergy> allergies; + /** + * adds a group to the user + * @param userGroupTable the userGroupTable to add to the user + */ + public void addGroup(UserGroupAsso userGroupTable){ + if (this.group == null) { + this.group = new ArrayList<>(); + } + this.group.add(userGroupTable); + } /** * used when created jwts and validating user authority @@ -138,4 +147,5 @@ public class User implements UserDetails { public boolean isEnabled() { return this.enabled; } + } diff --git a/src/main/java/ntnu/idatt2016/v233/SmartMat/repository/group/UserGroupAssoRepository.java b/src/main/java/ntnu/idatt2016/v233/SmartMat/repository/group/UserGroupAssoRepository.java new file mode 100644 index 00000000..aa389d50 --- /dev/null +++ b/src/main/java/ntnu/idatt2016/v233/SmartMat/repository/group/UserGroupAssoRepository.java @@ -0,0 +1,8 @@ +package ntnu.idatt2016.v233.SmartMat.repository.group; + +import ntnu.idatt2016.v233.SmartMat.entity.group.UserGroupId; +import ntnu.idatt2016.v233.SmartMat.entity.group.UserGroupAsso; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface UserGroupAssoRepository extends JpaRepository<UserGroupAsso, UserGroupId> { +} diff --git a/src/main/java/ntnu/idatt2016/v233/SmartMat/repository/UserRepository.java b/src/main/java/ntnu/idatt2016/v233/SmartMat/repository/user/UserRepository.java similarity index 92% rename from src/main/java/ntnu/idatt2016/v233/SmartMat/repository/UserRepository.java rename to src/main/java/ntnu/idatt2016/v233/SmartMat/repository/user/UserRepository.java index 80877360..79aa716a 100644 --- a/src/main/java/ntnu/idatt2016/v233/SmartMat/repository/UserRepository.java +++ b/src/main/java/ntnu/idatt2016/v233/SmartMat/repository/user/UserRepository.java @@ -1,4 +1,4 @@ -package ntnu.idatt2016.v233.SmartMat.repository; +package ntnu.idatt2016.v233.SmartMat.repository.user; import ntnu.idatt2016.v233.SmartMat.entity.user.User; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/src/main/java/ntnu/idatt2016/v233/SmartMat/service/group/UserGroupAssoService.java b/src/main/java/ntnu/idatt2016/v233/SmartMat/service/group/UserGroupAssoService.java new file mode 100644 index 00000000..41d1875d --- /dev/null +++ b/src/main/java/ntnu/idatt2016/v233/SmartMat/service/group/UserGroupAssoService.java @@ -0,0 +1,34 @@ +package ntnu.idatt2016.v233.SmartMat.service.group; + + +import lombok.AllArgsConstructor; +import ntnu.idatt2016.v233.SmartMat.entity.group.Group; +import ntnu.idatt2016.v233.SmartMat.entity.group.UserGroupId; +import ntnu.idatt2016.v233.SmartMat.entity.group.UserGroupAsso; +import ntnu.idatt2016.v233.SmartMat.entity.user.User; +import ntnu.idatt2016.v233.SmartMat.repository.group.UserGroupAssoRepository; +import org.springframework.stereotype.Service; + +@Service +@AllArgsConstructor +public class UserGroupAssoService { + + private UserGroupAssoRepository userGroupAssoRepository; + + public void save(User user, Group group, boolean primaryGroup) { + UserGroupAsso userGroupTable1 = new UserGroupAsso(); + userGroupTable1.setGroup(group); + userGroupTable1.setUser(user); + userGroupTable1.setPrimaryGroup(primaryGroup); + userGroupTable1.setId(UserGroupId.builder() + .groupId(group.getGroupId()) + .username(user.getUsername()) + .build()); + + userGroupAssoRepository.save(userGroupTable1); + + user.addGroup(userGroupTable1); + group.addUser(userGroupTable1); + + } +} diff --git a/src/main/java/ntnu/idatt2016/v233/SmartMat/service/user/UserService.java b/src/main/java/ntnu/idatt2016/v233/SmartMat/service/user/UserService.java index 679a9af2..23ee57f5 100644 --- a/src/main/java/ntnu/idatt2016/v233/SmartMat/service/user/UserService.java +++ b/src/main/java/ntnu/idatt2016/v233/SmartMat/service/user/UserService.java @@ -2,7 +2,7 @@ package ntnu.idatt2016.v233.SmartMat.service.user; import lombok.AllArgsConstructor; import ntnu.idatt2016.v233.SmartMat.entity.user.User; -import ntnu.idatt2016.v233.SmartMat.repository.UserRepository; +import ntnu.idatt2016.v233.SmartMat.repository.user.UserRepository; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; diff --git a/src/main/resources/db/sql/dbschema.sql b/src/main/resources/db/sql/dbschema.sql index b6217e18..bb8fb91e 100644 --- a/src/main/resources/db/sql/dbschema.sql +++ b/src/main/resources/db/sql/dbschema.sql @@ -131,4 +131,3 @@ CREATE TABLE achievement_person( FOREIGN KEY (username) REFERENCES users(username), FOREIGN KEY (achievement_name) REFERENCES achievement(achievement_name) ); - diff --git a/src/test/java/ntnu/idatt2016/v233/SmartMat/controller/user/UserControllerTest.java b/src/test/java/ntnu/idatt2016/v233/SmartMat/controller/user/UserControllerTest.java index 06522c01..648056c8 100644 --- a/src/test/java/ntnu/idatt2016/v233/SmartMat/controller/user/UserControllerTest.java +++ b/src/test/java/ntnu/idatt2016/v233/SmartMat/controller/user/UserControllerTest.java @@ -2,7 +2,7 @@ package ntnu.idatt2016.v233.SmartMat.controller.user; import ntnu.idatt2016.v233.SmartMat.dto.request.RegisterUserRequest; import ntnu.idatt2016.v233.SmartMat.entity.user.User; -import ntnu.idatt2016.v233.SmartMat.repository.UserRepository; +import ntnu.idatt2016.v233.SmartMat.repository.user.UserRepository; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; diff --git a/src/test/java/ntnu/idatt2016/v233/SmartMat/repository/UserRepositoryTest.java b/src/test/java/ntnu/idatt2016/v233/SmartMat/repository/UserRepositoryTest.java index f9cf7ef8..70053a4f 100644 --- a/src/test/java/ntnu/idatt2016/v233/SmartMat/repository/UserRepositoryTest.java +++ b/src/test/java/ntnu/idatt2016/v233/SmartMat/repository/UserRepositoryTest.java @@ -1,8 +1,10 @@ package ntnu.idatt2016.v233.SmartMat.repository; import ntnu.idatt2016.v233.SmartMat.dto.enums.Authority; +import ntnu.idatt2016.v233.SmartMat.entity.group.Group; import ntnu.idatt2016.v233.SmartMat.entity.product.Allergy; import ntnu.idatt2016.v233.SmartMat.entity.user.User; +import ntnu.idatt2016.v233.SmartMat.repository.user.UserRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -10,6 +12,7 @@ import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager; import java.sql.Date; +import java.util.HashSet; import java.util.List; import java.util.Optional; @@ -171,6 +174,7 @@ public class UserRepositoryTest { Optional<User> tempuser2 = userRepository.findByUsername("test2user"); + assertTrue(tempuser2.isPresent()); @@ -187,4 +191,5 @@ public class UserRepositoryTest { } + } diff --git a/src/test/java/ntnu/idatt2016/v233/SmartMat/repository/group/GroupRepositoryTest.java b/src/test/java/ntnu/idatt2016/v233/SmartMat/repository/group/GroupRepositoryTest.java index af70d7c8..4b5ecc43 100644 --- a/src/test/java/ntnu/idatt2016/v233/SmartMat/repository/group/GroupRepositoryTest.java +++ b/src/test/java/ntnu/idatt2016/v233/SmartMat/repository/group/GroupRepositoryTest.java @@ -1,8 +1,7 @@ package ntnu.idatt2016.v233.SmartMat.repository.group; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.*; import java.util.ArrayList; import java.util.Collections; @@ -10,6 +9,7 @@ import java.util.List; import java.util.Optional; import ntnu.idatt2016.v233.SmartMat.repository.user.AchievementRepository; +import ntnu.idatt2016.v233.SmartMat.repository.user.UserRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -32,6 +32,9 @@ public class GroupRepositoryTest { @Autowired AchievementRepository achievementRepository; + @Autowired + private UserRepository userRepository; + private Group group; @@ -145,4 +148,5 @@ public class GroupRepositoryTest { } + } \ No newline at end of file diff --git a/src/test/java/ntnu/idatt2016/v233/SmartMat/repository/group/UserGroupAssoRepositoryTest.java b/src/test/java/ntnu/idatt2016/v233/SmartMat/repository/group/UserGroupAssoRepositoryTest.java new file mode 100644 index 00000000..3c7d20d1 --- /dev/null +++ b/src/test/java/ntnu/idatt2016/v233/SmartMat/repository/group/UserGroupAssoRepositoryTest.java @@ -0,0 +1,82 @@ +package ntnu.idatt2016.v233.SmartMat.repository.group; + +import ntnu.idatt2016.v233.SmartMat.entity.group.Group; +import ntnu.idatt2016.v233.SmartMat.entity.group.UserGroupId; +import ntnu.idatt2016.v233.SmartMat.entity.group.UserGroupAsso; +import ntnu.idatt2016.v233.SmartMat.entity.user.User; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager; + +import java.util.Optional; + +import static org.junit.jupiter.api.Assertions.*; + +@DataJpaTest +class UserGroupAssoRepositoryTest { + + @Autowired + TestEntityManager entityManager; + + @Autowired + UserGroupAssoRepository userGroupAssoRepository; + + @BeforeEach + void setUp() { + UserGroupAsso tempAsso = new UserGroupAsso(); + + User user = new User(); + user.setFirstName("test"); + user.setLastName("test"); + user.setUsername("test"); + + entityManager.persist(user); + + Group tempgroup = new Group(); + tempgroup.setGroupName("test"); + + entityManager.persist(tempgroup); + + tempAsso.setId(UserGroupId.builder().username("test").groupId(1L).build()); + tempAsso.setGroup(tempgroup); + tempAsso.setUser(user); + tempAsso.setPrimaryGroup(true); + + tempgroup.addUser(tempAsso); + user.addGroup(tempAsso); + + + entityManager.persist(tempAsso); + + } + + @Test + void shouldFindByGroupGroupId() { + Optional<UserGroupAsso> foundasso = userGroupAssoRepository.findById(UserGroupId.builder() + .groupId(1L).username("test").build()); + + assertTrue(foundasso.isPresent()); + + assertEquals(foundasso.get().getGroup().getGroupId(), 1L); + + assertNotNull(foundasso.get().getUser()); + + } + + @Test + void shouldBeConnectionBetweenUserAndGroup(){ + assertNotNull(entityManager.find(User.class, "test").getGroup()); + + entityManager.find(User.class, "test").getGroup().forEach(asso -> { + assertEquals(asso.getGroup().getGroupId(), 1L); + }); + + entityManager.find(Group.class, 1L).getUser().forEach(asso -> { + assertEquals(asso.getUser().getUsername(), "test"); + }); + } + + +} \ No newline at end of file diff --git a/src/test/java/ntnu/idatt2016/v233/SmartMat/service/group/UserGroupAssoServiceTest.java b/src/test/java/ntnu/idatt2016/v233/SmartMat/service/group/UserGroupAssoServiceTest.java new file mode 100644 index 00000000..ace9e77b --- /dev/null +++ b/src/test/java/ntnu/idatt2016/v233/SmartMat/service/group/UserGroupAssoServiceTest.java @@ -0,0 +1,63 @@ +package ntnu.idatt2016.v233.SmartMat.service.group; + +import ntnu.idatt2016.v233.SmartMat.entity.group.Group; +import ntnu.idatt2016.v233.SmartMat.entity.group.UserGroupId; +import ntnu.idatt2016.v233.SmartMat.entity.group.UserGroupAsso; +import ntnu.idatt2016.v233.SmartMat.entity.user.User; +import ntnu.idatt2016.v233.SmartMat.repository.group.UserGroupAssoRepository; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +class UserGroupAssoServiceTest { + + @Mock + UserGroupAssoRepository userGroupAssoRepository; + + @InjectMocks + UserGroupAssoService userGroupAssoService; + + @Test + void save() { + + UserGroupAsso tempAsso = new UserGroupAsso(); + + User user = new User(); + user.setFirstName("test"); + user.setLastName("test"); + user.setUsername("test"); + + Group tempgroup = new Group(); + tempgroup.setGroupName("test"); + + tempAsso.setId(UserGroupId.builder().username(user.getUsername()) + .groupId(tempgroup.getGroupId()).build()); + tempAsso.setGroup(tempgroup); + tempAsso.setUser(user); + tempAsso.setPrimaryGroup(true); + + tempgroup.addUser(tempAsso); + user.addGroup(tempAsso); + + + when(userGroupAssoRepository.save(tempAsso)) + .thenReturn(tempAsso); + + + userGroupAssoService.save(user, tempgroup, true); + + //make sure the correct assisiation is saved + verify(userGroupAssoRepository, times(1)).save(tempAsso); + + + assertEquals(user.getGroup().get(0), tempgroup.getUser().get(0)); + + + } +} \ No newline at end of file diff --git a/src/test/java/ntnu/idatt2016/v233/SmartMat/service/user/UserServiceTest.java b/src/test/java/ntnu/idatt2016/v233/SmartMat/service/user/UserServiceTest.java index 8d05d00a..b5002f6a 100644 --- a/src/test/java/ntnu/idatt2016/v233/SmartMat/service/user/UserServiceTest.java +++ b/src/test/java/ntnu/idatt2016/v233/SmartMat/service/user/UserServiceTest.java @@ -3,7 +3,7 @@ package ntnu.idatt2016.v233.SmartMat.service.user; import ntnu.idatt2016.v233.SmartMat.dto.enums.Authority; import ntnu.idatt2016.v233.SmartMat.entity.user.User; -import ntnu.idatt2016.v233.SmartMat.repository.UserRepository; +import ntnu.idatt2016.v233.SmartMat.repository.user.UserRepository; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; -- GitLab