Skip to content
Snippets Groups Projects
Commit a082c729 authored by Birk Øvstetun Narvhus's avatar Birk Øvstetun Narvhus
Browse files

added assosiation database between user and group

parent 3cb5e8da
No related branches found
No related tags found
No related merge requests found
Showing
with 318 additions and 25 deletions
......@@ -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"),
......
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;
}
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());
}
}
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;
}
}
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> {
}
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;
......
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);
}
}
......@@ -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;
......
......@@ -131,4 +131,3 @@ CREATE TABLE achievement_person(
FOREIGN KEY (username) REFERENCES users(username),
FOREIGN KEY (achievement_name) REFERENCES achievement(achievement_name)
);
......@@ -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;
......
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 {
}
}
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
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
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
......@@ -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;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment