-
Notifications
You must be signed in to change notification settings - Fork 29
Expand file tree
/
Copy pathMissionService.java
More file actions
88 lines (72 loc) · 3.08 KB
/
Copy pathMissionService.java
File metadata and controls
88 lines (72 loc) · 3.08 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package wooteco.prolog.session.application;
import static java.util.stream.Collectors.toList;
import static wooteco.prolog.common.exception.BadRequestCode.DUPLICATE_MISSION;
import static wooteco.prolog.common.exception.BadRequestCode.MISSION_NOT_FOUND;
import java.util.Collection;
import java.util.List;
import java.util.Optional;
import java.util.stream.Stream;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import wooteco.prolog.common.exception.BadRequestException;
import wooteco.prolog.login.ui.LoginMember;
import wooteco.prolog.session.application.dto.MissionRequest;
import wooteco.prolog.session.application.dto.MissionResponse;
import wooteco.prolog.session.domain.Mission;
import wooteco.prolog.session.domain.Session;
import wooteco.prolog.session.domain.repository.MissionRepository;
@Service
@AllArgsConstructor
@Transactional(readOnly = true)
public class MissionService {
private final SessionService sessionService;
private final MissionRepository missionRepository;
@Transactional
public MissionResponse create(MissionRequest missionRequest) {
validateName(missionRequest.getName());
Session session = sessionService.findById(missionRequest.getSessionId());
return MissionResponse.of(
missionRepository.save(new Mission(missionRequest.getName(), session)));
}
private void validateName(String name) {
if (missionRepository.findByName(name).isPresent()) {
throw new BadRequestException(DUPLICATE_MISSION);
}
}
public List<MissionResponse> findAll() {
return MissionResponse.listOf(missionRepository.findAll());
}
public List<MissionResponse> findAllBySessionId(final long sessionId) {
return MissionResponse.listOf(missionRepository.findBySessionId(sessionId));
}
public Mission findById(Long id) {
return missionRepository.findById(id)
.orElseThrow(() -> new BadRequestException(MISSION_NOT_FOUND));
}
public Optional<Mission> findMissionById(Long id) {
if (id == null) {
return Optional.empty();
}
return missionRepository.findById(id);
}
public List<Mission> findByIds(List<Long> missionIds) {
return missionRepository.findAllById(missionIds);
}
public List<MissionResponse> findMyMissions(LoginMember loginMember) {
List<Long> mySessionIds = sessionService.findMySessionIds(loginMember);
List<Mission> missions = missionRepository.findBySessionIdIn(mySessionIds);
return MissionResponse.listOf(missions);
}
public List<MissionResponse> findAllWithMyMissionFirst(LoginMember loginMember) {
if (loginMember.isAnonymous()) {
return findAll();
}
List<MissionResponse> myMissions = findMyMissions(loginMember);
List<MissionResponse> allMissions = findAll();
allMissions.removeAll(myMissions);
return Stream.of(myMissions, allMissions)
.flatMap(Collection::stream)
.collect(toList());
}
}