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 5e1f29f2dabf018d90cf473b0f3a642cdace09ab..83fb34e59f98934bde8df90d82bcd2f9699152d9 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 0000000000000000000000000000000000000000..687f1f2912abab41e35f7f5ec5e7a3fb32e45448 --- /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 0000000000000000000000000000000000000000..a9698b22e631d954bc2b8512bf871216fb7a06f3 --- /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 fb70a22149f3f93cc40c4984cc450c8e1ba4f833..a04c39561bd8472c1fc0dc0af5f401618ba2d497 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 0000000000000000000000000000000000000000..aa389d502de1187f8e26f03997520ba5a492106c --- /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 80877360a9c7434bf46760c387195e992b4623fe..79aa716ab297b1116bfb4d217b3ce6df720a2fbf 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 0000000000000000000000000000000000000000..41d1875db674e1d79bcddb359d9fa09bb63ff94e --- /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 679a9af2d29ce571ad334edd4aa433f6d863697e..23ee57f5c00fe09caddde305109ef386c9a98bf2 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 b6217e186e7f519122bc622bf8ea36c0dd6bd7ca..bb8fb91e57be9eea8fda6d1a99beb5b73eabf874 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 06522c0122f79383f0f0f6a6c173c4580f9f331a..648056c87096c7475cd38b467d047a6f4d5320d2 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 f9cf7ef89592d5f409d69f2e82d123f841cafc3c..70053a4f299cdd15e9b46a18b1651f544dcf7c9d 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 af70d7c871819229dea44a16e028b4fc78b3a1c6..4b5ecc435167317fc086976de7a76b193bbe8912 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 0000000000000000000000000000000000000000..3c7d20d1f6bdb93de6154e06aa64b2dc8d9374fb --- /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 0000000000000000000000000000000000000000..ace9e77b5f58719144341314e420615051286201 --- /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 8d05d00a46e4bd0265ab52ccbcfdbf7ea75c7077..b5002f6aa51a95c9fefc7251e16e7283c766d0b8 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;