package com.allfree.allfreespringbackend.user; import com.allfree.allfreespringbackend.auth.model.Role; import com.allfree.allfreespringbackend.model.Article; import com.allfree.allfreespringbackend.model.EStatus; import com.allfree.allfreespringbackend.user.dto.NewUserDTO; import com.fasterxml.jackson.annotation.JsonIgnore; import lombok.*; import javax.persistence.*; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.stream.Collectors; @Entity @Builder @Setter @Getter @NoArgsConstructor @AllArgsConstructor @Table(name = "users") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "first_name") private String firstName; @Column(name = "last_name") private String lastName; @Column(name = "email") private String email; @Getter @Setter private String username; @Column(name = "password") @JsonIgnore private String password; @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL) @JoinTable(name = "user_roles", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id")) private Set<Role> roles = new HashSet<>(); @OneToMany(targetEntity = Article.class, cascade = CascadeType.ALL, orphanRemoval = true) @JoinColumn(name = "ua_fk", referencedColumnName = "id") private List<Article> articles = new ArrayList<>(); @ManyToMany() private @Getter @Setter List<Article> favArticles = new ArrayList<>(); public static User loadFromUserDTO(NewUserDTO newUser) { return User.builder() .firstName(newUser.getFirsName()) .lastName(newUser.getLastName()) .email(newUser.getEmail()) .username(newUser.getUsername()) .password(newUser.getPassword()) .roles(newUser.getRoles()) .build(); } public void addArticle(Article article) { articles.add(article); } public void setUserDetails(String firstName, String lastName, String email,String username, String password, Set<Role> roles) { setFirstName(firstName); setLastName(lastName); setEmail(email); setUsername(username); setPassword(password); setRoles(roles); } public List<Article> getArticlesByStatus(String status){ return this.articles.stream().filter(article -> article.getStatus().equals(EStatus.valueOf(status))).collect(Collectors.toList()); } }