Implements methods deleting user and team in services, repositories

This commit is contained in:
szsa
2022-03-17 22:35:46 +01:00
parent 6852f7a0fd
commit 12b971685b
10 changed files with 95 additions and 16 deletions

View File

@@ -49,6 +49,8 @@ public class TeamService {
var teamToInsert = createTeamDto.toTeam();
// at first team is inserted into db and all its member are updated with the new teamId
return teamRepository
.save(teamToInsert)
.flatMap(insertedTeam -> {
@@ -58,6 +60,8 @@ public class TeamService {
.map(createUserDto -> createUserDto.toUser().withTeamId(TeamUtils.toId.apply(insertedTeam)))
.toList();
// then all members with correct teamId are saved into db, flux is converted to list which is used to update team's members. At the end updated team is saved in db.
return userRepository
.saveAll(membersToInsert)
.collectList()
@@ -68,7 +72,28 @@ public class TeamService {
.map(Team::toGetTeamDto);
});
});
}
public Mono<GetTeamDto> deleteTeam(String teamId) {
return teamRepository
.findById(teamId)
.flatMap(team -> {
// at first, I'm changing teamId of all team members to null and save it in db
var membersToUpdate = TeamUtils.toMembers.apply(team)
.stream()
.map(member -> member.withTeamId(null))
.toList();
userRepository.saveAll(membersToUpdate);
// then I'm deleting team and returning mono of DTO
teamRepository.delete(TeamUtils.toId.apply(team));
return Mono.just(team.toGetTeamDto());
})
.switchIfEmpty(Mono.error(new TeamServiceException("cannot find team to delete")));
}
}

View File

@@ -0,0 +1,26 @@
package net.szymonsawicki.reactivetimesheetapp.application.service;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import net.szymonsawicki.reactivetimesheetapp.domain.time_entry.dto.CreateTimeEntryDto;
import net.szymonsawicki.reactivetimesheetapp.domain.time_entry.dto.GetTimeEntryDto;
import net.szymonsawicki.reactivetimesheetapp.domain.time_entry.repository.TimeEntryRepository;
import net.szymonsawicki.reactivetimesheetapp.domain.user.repository.UserRepository;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Mono;
@Service
@Slf4j
@RequiredArgsConstructor
public class TimeEntryService {
private final TimeEntryRepository timeEntryRepository;
private final UserRepository userRepository;
public Mono<GetTimeEntryDto> createTimeEntry(Mono<CreateTimeEntryDto> createTimeEntryDtoMono) {
return createTimeEntryDtoMono
.flatMap(createTimeEntryDto -> userRepository
.findById(createTimeEntryDto.user()))
}
}

View File

@@ -2,7 +2,6 @@ package net.szymonsawicki.reactivetimesheetapp.application.service;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import net.szymonsawicki.reactivetimesheetapp.application.service.exception.TeamServiceException;
import net.szymonsawicki.reactivetimesheetapp.application.service.exception.UserServiceException;
import net.szymonsawicki.reactivetimesheetapp.domain.team.TeamUtils;
import net.szymonsawicki.reactivetimesheetapp.domain.team.repository.TeamRepository;
@@ -31,7 +30,7 @@ public class UserService {
public Mono<GetUserDto> findByUsername(String username) {
return userRepository.findByUsername(username)
.map(User::toGetUserDto)
.switchIfEmpty(Mono.error(new UserServiceException("username doen't exist")));
.switchIfEmpty(Mono.error(new UserServiceException("username doesn't exist")));
}
public Mono<GetUserDto> addUser(Mono<CreateUserDto> createUserDtoMono) {
@@ -48,5 +47,22 @@ public class UserService {
)));
}
public Mono<GetUserDto> deleteUser(String userId) {
return userRepository
.findById(userId)
.flatMap(user -> {
String teamId = UserUtils.toTeamId.apply(user);
if (teamId != null) {
teamRepository
.findById(teamId)
.flatMap(team -> {
TeamUtils.toMembers.apply(team).remove(user);
return teamRepository.save(team);
});
}
userRepository.delete(userId);
return Mono.just(user.toGetUserDto());
})
.switchIfEmpty(Mono.error(new UserServiceException("cannot find user to delete")));
}
}

View File

@@ -2,7 +2,6 @@ package net.szymonsawicki.reactivetimesheetapp.domain.team.repository;
import net.szymonsawicki.reactivetimesheetapp.domain.configs.CrudRepository;
import net.szymonsawicki.reactivetimesheetapp.domain.team.Team;
import org.springframework.data.repository.reactive.ReactiveCrudRepository;
import reactor.core.publisher.Mono;
public interface TeamRepository extends CrudRepository<Team, String> {

View File

@@ -3,18 +3,19 @@ package net.szymonsawicki.reactivetimesheetapp.domain.time_entry.dto;
import net.szymonsawicki.reactivetimesheetapp.domain.time_entry.TimeEntry;
import net.szymonsawicki.reactivetimesheetapp.domain.time_entry.type.Category;
import net.szymonsawicki.reactivetimesheetapp.domain.user.User;
import net.szymonsawicki.reactivetimesheetapp.domain.user.dto.GetUserDto;
import java.time.LocalDate;
import java.time.LocalTime;
public record GetTimeEntryDto(String id, LocalDate date, LocalTime timeFrom, LocalTime timeTo, User user, Category category, String description) {
public record GetTimeEntryDto(String id, LocalDate date, LocalTime timeFrom, LocalTime timeTo, GetUserDto user, Category category, String description) {
TimeEntry toTimeEntry() {
return TimeEntry.builder()
.id(id)
.date(date)
.timeFrom(timeFrom)
.timeTo(timeTo)
.user(user)
.user(user.toUser())
.category(category)
.description(description)
.build();

View File

@@ -4,7 +4,6 @@ import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import net.szymonsawicki.reactivetimesheetapp.domain.team.Team;
import net.szymonsawicki.reactivetimesheetapp.domain.user.dto.GetUserDto;
import net.szymonsawicki.reactivetimesheetapp.domain.user.type.Role;
import net.szymonsawicki.reactivetimesheetapp.infrastructure.persistence.entity.UserEntity;

View File

@@ -3,5 +3,8 @@ package net.szymonsawicki.reactivetimesheetapp.domain.user;
import java.util.function.Function;
public interface UserUtils {
Function<User, String> toId = user -> user.id;
Function<User, String> toUsername = user -> user.username;
Function<User, String> toTeamId = team -> team.teamId;
}

View File

@@ -1,6 +1,7 @@
package net.szymonsawicki.reactivetimesheetapp.domain.user.repository;
import net.szymonsawicki.reactivetimesheetapp.domain.configs.CrudRepository;
import net.szymonsawicki.reactivetimesheetapp.domain.team.Team;
import net.szymonsawicki.reactivetimesheetapp.domain.user.User;
import net.szymonsawicki.reactivetimesheetapp.infrastructure.persistence.entity.UserEntity;
import org.springframework.data.repository.reactive.ReactiveCrudRepository;
@@ -11,8 +12,9 @@ import java.util.List;
public interface UserRepository extends CrudRepository<User, String> {
Flux<User> findByTeamId(String teamId);
Mono<User> findByUsername(String username);
Flux<User> saveAll(List<User> users);
Mono<Void> deleteAll(List<User> users);
}

View File

@@ -3,6 +3,7 @@ package net.szymonsawicki.reactivetimesheetapp.infrastructure.persistence.reposi
import lombok.RequiredArgsConstructor;
import net.szymonsawicki.reactivetimesheetapp.domain.team.Team;
import net.szymonsawicki.reactivetimesheetapp.domain.team.repository.TeamRepository;
import net.szymonsawicki.reactivetimesheetapp.domain.user.User;
import net.szymonsawicki.reactivetimesheetapp.infrastructure.persistence.dao.TeamDao;
import net.szymonsawicki.reactivetimesheetapp.infrastructure.persistence.exception.PersistenceException;
import org.springframework.stereotype.Repository;

View File

@@ -41,14 +41,6 @@ public class UserRepositoryImpl implements UserRepository {
.flatMap(userEntity -> Mono.just(userEntity.toUser()));
}
@Override
public Mono<User> delete(String id) {
return userDao.findById(id)
.flatMap(userEntity -> userDao.delete(userEntity)
.then(Mono.just(userEntity.toUser())))
.switchIfEmpty(Mono.error(new PersistenceException("cannot find user to delete")));
}
public Flux<User> findByTeamId(String teamId) {
return userDao.findByTeamId(teamId)
@@ -67,4 +59,19 @@ public class UserRepositoryImpl implements UserRepository {
.saveAll(users.stream().map(User::toEntity).toList())
.flatMap(userEntity -> Mono.just(userEntity.toUser()));
}
@Override
public Mono<User> delete(String id) {
return userDao.findById(id)
.flatMap(userEntity -> userDao.delete(userEntity)
.then(Mono.just(userEntity.toUser())))
.switchIfEmpty(Mono.error(new PersistenceException("cannot find user to delete")));
}
@Override
public Mono<Void> deleteAll(List<User> users) {
return userDao
.deleteAll(users.stream().map(User::toEntity).toList());
}
}