Implements methods deleting user and team in services, repositories
This commit is contained in:
@@ -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")));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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()))
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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")));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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> {
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user