Skip to content

Commit

Permalink
Refactor User and related entities.
Browse files Browse the repository at this point in the history
Signed-off-by: Mykhailo Marchuk <[email protected]>
  • Loading branch information
marchuk-engineer committed Jun 5, 2024
1 parent 4f8b37e commit 13674fd
Show file tree
Hide file tree
Showing 12 changed files with 165 additions and 140 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.booking.app.dto;

import com.booking.app.enums.EnumRole;
import com.booking.app.entity.Role;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Builder;
Expand All @@ -9,11 +9,11 @@
@Data
@AllArgsConstructor
@Builder
public class RoleDTO {
public class RoleDto {

private final int id;
@NotNull

private final EnumRole enumRole;
@NotNull
private final Role.RoleType type;

}
4 changes: 2 additions & 2 deletions src/main/java/com/booking/app/dto/UserDTO.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.booking.app.dto;

import jakarta.validation.Valid;
import jakarta.validation.constraints.*;
import jakarta.validation.constraints.Pattern;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
Expand All @@ -15,6 +15,6 @@ public class UserDTO {
private final String phoneNumber;

@Valid
private final RoleDTO role;
private final RoleDto role;

}
37 changes: 31 additions & 6 deletions src/main/java/com/booking/app/entity/Role.java
Original file line number Diff line number Diff line change
@@ -1,27 +1,52 @@
package com.booking.app.entity;

import com.booking.app.enums.EnumRole;
import jakarta.persistence.*;
import lombok.*;
import org.springframework.security.core.authority.SimpleGrantedAuthority;

import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;

@Entity
@Table(name = "role")
@Table(name = "roles")
@AllArgsConstructor
@NoArgsConstructor
@Setter
@Getter
@Builder
public class Role{
public class Role {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private Short id;

@Enumerated(EnumType.STRING)
private EnumRole enumRole;
private RoleType type;

@OneToMany(mappedBy = "role", cascade = CascadeType.ALL)
@ManyToMany(mappedBy = "roles")
private Set<User> users;

public static Set<Role> createRoles(Role... roles) {
return new HashSet<>(Arrays.asList(roles));
}

public Set<SimpleGrantedAuthority> getGrantedAuthorities() {
return Collections.singleton(new SimpleGrantedAuthority("ROLE_" + type.getType()));
}

@Getter
public enum RoleType {
ADMIN("ADMIN"),
USER("USER");

private final String type;

RoleType(String type) {
this.type = type;
}

}

}
6 changes: 3 additions & 3 deletions src/main/java/com/booking/app/entity/SearchHistory.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.booking.app.entity;

import com.booking.app.enums.TypeTransportEnum;
import com.booking.app.enums.TransportType;
import jakarta.persistence.*;
import lombok.*;

Expand Down Expand Up @@ -34,11 +34,11 @@ public class SearchHistory {
@Builder.Default
private LocalDateTime addingTime = LocalDateTime.now();

@ElementCollection(targetClass = TypeTransportEnum.class, fetch = FetchType.EAGER)
@ElementCollection(targetClass = TransportType.class, fetch = FetchType.EAGER)
@CollectionTable(name = "type_transport")
@Enumerated(EnumType.STRING)
@Column(name = "type")
private Set<TypeTransportEnum> typeTransport = new HashSet<>();
private Set<TransportType> typeTransport = new HashSet<>();

@ManyToOne
@JoinColumn(name = "user_id")
Expand Down
67 changes: 51 additions & 16 deletions src/main/java/com/booking/app/entity/User.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,12 @@
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.time.LocalDate;
import java.util.Collection;
import java.util.List;
import java.util.UUID;
import java.util.*;
import java.util.stream.Collectors;

@Entity
@Table(name = "users",
Expand Down Expand Up @@ -66,36 +68,67 @@ public class User implements UserDetails {

private boolean enabled;

@ManyToOne
@JoinColumn(referencedColumnName = "id", name = "role_id")
private Role role;

@JoinColumn(referencedColumnName = "id", name = "token_id")
@OneToOne(cascade = CascadeType.ALL)
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(
joinColumns = @JoinColumn(name = "users_id"),
inverseJoinColumns = @JoinColumn(name = "roles_id")
)
private Set<Role> roles = new HashSet<>();

@OneToOne(fetch = FetchType.LAZY,
cascade = CascadeType.ALL
)
@JoinColumn(referencedColumnName = "id",
name = "code_id"
)
private ConfirmationCode confirmationCode;

@OneToMany(mappedBy = "user", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
private List<SearchHistory> history;
@OneToMany(mappedBy = "user",
fetch = FetchType.EAGER,
cascade = CascadeType.ALL
)
private List<SearchHistory> history = new ArrayList<>();

@OneToOne(mappedBy = "user")
@OneToOne(mappedBy = "user",
cascade = CascadeType.ALL
)
private Review review;

public static User createBasicUser(Role role, ConfirmationCode confirmationCode, Boolean notification) {
public static User createBasicAdmin(Role role, ConfirmationCode confirmationCode, String email, String password, String username, Boolean notification) throws IOException {
Set<Role> setRoles = Role.createRoles(role);
File fi = new File("image/admin_avatar.png");
byte[] fileContent = Files.readAllBytes(fi.toPath());
return User.builder()
.email(email)
.username(username)
.password(password)
.roles(setRoles)
.confirmationCode(confirmationCode)
.notification(notification)
.defaultAvatar(fileContent).build();
}

public static User createBasicUser(Role role, ConfirmationCode confirmationCode, String email, String password, String username, Boolean notification) {
Set<Role> setRoles = Role.createRoles(role);
byte[] avatarAsBytes = AvatarGenerator.createRandomAvatarAsBytes();
return User.builder()
.role(role)
.email(email)
.username(username)
.password(password)
.roles(setRoles)
.confirmationCode(confirmationCode)
.notification(notification)
.defaultAvatar(avatarAsBytes).build();
}

public static User createGoogleUser(Role role, String username, String email, String urlPicture) {
Set<Role> setRoles = Role.createRoles(role);
return User.builder()
.provider(SocialProvider.GOOGLE)
.username(username)
.email(email)
.socialMediaAvatar(urlPicture)
.role(role)
.roles(setRoles)
.enabled(true)
.accountNonExpired(true)
.credentialsNonExpired(true)
Expand All @@ -105,7 +138,9 @@ public static User createGoogleUser(Role role, String username, String email, St

@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return getRole().getEnumRole().getSimpleGrantedAuthorities();
return roles.stream()
.flatMap(r -> r.getGrantedAuthorities().stream())
.collect(Collectors.toSet());
}

}
23 changes: 0 additions & 23 deletions src/main/java/com/booking/app/enums/EnumRole.java

This file was deleted.

21 changes: 21 additions & 0 deletions src/main/java/com/booking/app/enums/TransportType.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.booking.app.enums;

import java.util.HashSet;
import java.util.Set;

public enum TransportType {
BUS,
TRAIN,
AIRPLANE,
FERRY;

public static Set<TransportType> getTypes(boolean bus, boolean train, boolean airplane, boolean ferry) {
Set<TransportType> types = new HashSet<>();
if (bus) types.add(TransportType.BUS);
if (train) types.add(TransportType.TRAIN);
if (airplane) types.add(TransportType.AIRPLANE);
if (ferry) types.add(TransportType.FERRY);
return types;
}

}
28 changes: 0 additions & 28 deletions src/main/java/com/booking/app/enums/TypeTransportEnum.java

This file was deleted.

12 changes: 6 additions & 6 deletions src/main/java/com/booking/app/mapper/HistoryMapper.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,25 +2,25 @@

import com.booking.app.dto.HistoryDto;
import com.booking.app.entity.SearchHistory;
import com.booking.app.enums.TypeTransportEnum;
import com.booking.app.enums.TransportType;
import com.booking.app.mapper.model.ArrivalCity;
import com.booking.app.mapper.model.DepartureCity;
import org.mapstruct.*;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

@Mapper(unmappedTargetPolicy = ReportingPolicy.IGNORE, componentModel = MappingConstants.ComponentModel.SPRING, imports = {TypeTransportEnum.class})
@Mapper(unmappedTargetPolicy = ReportingPolicy.IGNORE, componentModel = MappingConstants.ComponentModel.SPRING, imports = {TransportType.class})
public interface HistoryMapper {

@Mapping(source = "departureDate", target = "departureDate")
@Mapping(source = "addingTime", target = "addingTime", qualifiedByName = "timeToString")
@Mapping(source = "departureCityId", target = "departureCity", qualifiedByName = "getDepartureCity")
@Mapping(source = "arrivalCityId", target = "arrivalCity", qualifiedByName = "getArrivalCity")
@Mapping(target = "bus", expression = "java(searchHistory.getTypeTransport().contains(TypeTransportEnum.BUS))")
@Mapping(target = "train", expression = "java(searchHistory.getTypeTransport().contains(TypeTransportEnum.TRAIN))")
@Mapping(target = "airplane", expression = "java(searchHistory.getTypeTransport().contains(TypeTransportEnum.AIRPLANE))")
@Mapping(target = "ferry", expression = "java(searchHistory.getTypeTransport().contains(TypeTransportEnum.FERRY))")
@Mapping(target = "bus", expression = "java(searchHistory.getTypeTransport().contains(TransportType.BUS))")
@Mapping(target = "train", expression = "java(searchHistory.getTypeTransport().contains(TransportType.TRAIN))")
@Mapping(target = "airplane", expression = "java(searchHistory.getTypeTransport().contains(TransportType.AIRPLANE))")
@Mapping(target = "ferry", expression = "java(searchHistory.getTypeTransport().contains(TransportType.FERRY))")
HistoryDto historyToDto(SearchHistory searchHistory, @Context DepartureCity departureCity, @Context ArrivalCity arrivalCity);

@Named("timeToString")
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,11 @@
package com.booking.app.repositories;

import com.booking.app.entity.Role;

import com.booking.app.enums.EnumRole;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface RoleRepository extends JpaRepository<Role, Integer> {
Role findRoleByEnumRole(EnumRole enumRole);
Role findByType(Role.RoleType roleType);

}
25 changes: 11 additions & 14 deletions src/main/java/com/booking/app/services/impl/UserServiceImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,8 @@
import com.booking.app.entity.Role;
import com.booking.app.entity.SearchHistory;
import com.booking.app.entity.User;
import com.booking.app.enums.EnumRole;
import com.booking.app.enums.SocialProvider;
import com.booking.app.enums.TypeTransportEnum;
import com.booking.app.enums.TransportType;
import com.booking.app.exception.exception.InvalidConfirmationCodeException;
import com.booking.app.exception.exception.UserIsDisabledException;
import com.booking.app.exception.exception.UserNotFoundException;
Expand Down Expand Up @@ -104,18 +103,16 @@ public void enableUser(User user) {

@Override
public User saveUser(RegistrationDTO dto) {
User user = userMapper.toUser(dto);
user.setProvider(SocialProvider.LOCAL);
user.setPassword(passwordEncoder.encode(dto.getPassword()));

Role role = roleRepository.findRoleByEnumRole(EnumRole.USER);

Role role = roleRepository.findByType(Role.RoleType.USER);
ConfirmationCode confirmationCode = ConfirmationCode.createCode();

User newUser = User.createBasicUser(role, confirmationCode, dto.getNotification());

save(newUser);
return newUser;
User user = User.createBasicUser(
role,
confirmationCode, dto.getEmail(),
passwordEncoder.encode(dto.getPassword()),
dto.getUsername(), dto.getNotification()
);
user.setProvider(SocialProvider.LOCAL);
return save(user);
}

@Override
Expand All @@ -139,7 +136,7 @@ public void delete(User user) {
@Override
public void addHistory(RequestTicketsDto dto, String language, @Nullable User user) {
Optional.ofNullable(user).ifPresent(u -> {
Set<TypeTransportEnum> types = TypeTransportEnum.getTypes(dto.getBus(), dto.getTrain(), dto.getAirplane(), dto.getFerry());
Set<TransportType> types = TransportType.getTypes(dto.getBus(), dto.getTrain(), dto.getAirplane(), dto.getFerry());
historyRepository.save(SearchHistory.builder()
.user(u)
.departureCityId(typeAheadService.getCityId(dto.getDepartureCity(), language))
Expand Down
Loading

0 comments on commit 13674fd

Please sign in to comment.