-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathSponsorService.java
More file actions
107 lines (96 loc) · 5.1 KB
/
SponsorService.java
File metadata and controls
107 lines (96 loc) · 5.1 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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
package com.provedcode.sponsor.service;
import com.provedcode.config.PageProperties;
import com.provedcode.kudos.model.entity.Kudos;
import com.provedcode.kudos.repository.KudosRepository;
import com.provedcode.sponsor.model.dto.SponsorDTO;
import com.provedcode.sponsor.model.dto.SponsorEditDTO;
import com.provedcode.sponsor.model.entity.Sponsor;
import com.provedcode.sponsor.repository.SponsorRepository;
import com.provedcode.user.model.entity.UserInfo;
import com.provedcode.user.repo.UserInfoRepository;
import lombok.AllArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.security.core.Authentication;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.server.ResponseStatusException;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import static org.springframework.http.HttpStatus.*;
@Service
@AllArgsConstructor
@Transactional
public class SponsorService {
PageProperties pageProperties;
SponsorRepository sponsorRepository;
UserInfoRepository userInfoRepository;
private final KudosRepository kudosRepository;
@Transactional(readOnly = true)
public Page<Sponsor> getAllSponsors(Optional<Integer> page, Optional<Integer> size) {
if (page.orElse(pageProperties.defaultPageNum()) < 0) {
throw new ResponseStatusException(BAD_REQUEST, "'page' query parameter must be greater than or equal to 0");
}
if (size.orElse(pageProperties.defaultPageSize()) <= 0) {
throw new ResponseStatusException(BAD_REQUEST, "'size' query parameter must be greater than or equal to 1");
}
return sponsorRepository.findAll(PageRequest.of(page.orElse(pageProperties.defaultPageNum()),
size.orElse(pageProperties.defaultPageSize())));
}
@Transactional(readOnly = true)
public Sponsor getSponsorById(long id, Authentication authentication) {
Sponsor sponsor = sponsorRepository.findById(id).orElseThrow(
() -> new ResponseStatusException(NOT_FOUND, String.format("sponsor with id = %d not found", id)));
UserInfo user = userInfoRepository.findByLogin(authentication.getName())
.orElseThrow(() -> new ResponseStatusException(NOT_IMPLEMENTED, "login is not valid"));
if (!sponsor.getId().equals(user.getSponsor().getId()))
throw new ResponseStatusException(FORBIDDEN, "The user cannot view someone else's profile");
return sponsor;
}
public Sponsor editSponsorById(long id, SponsorEditDTO sponsorEditDTO, Authentication authentication) {
Sponsor sponsor = sponsorRepository.findById(id)
.orElseThrow(() -> new ResponseStatusException(NOT_FOUND, "sponsor with id = %s not found".formatted(id)));
UserInfo user = userInfoRepository.findByLogin(authentication.getName())
.orElseThrow(() -> new ResponseStatusException(NOT_IMPLEMENTED, "login is not valid"));
if (!sponsor.getId().equals(user.getSponsor().getId())) {
throw new ResponseStatusException(FORBIDDEN, "The user cannot edit someone else's profile");
}
if (sponsorEditDTO.firstName() != null) {
sponsor.setFirstName(sponsorEditDTO.firstName());
}
if (sponsorEditDTO.lastName() != null) {
sponsor.setLastName(sponsorEditDTO.lastName());
}
if (sponsorEditDTO.image() != null) {
sponsor.setImage(sponsorEditDTO.image());
}
if (sponsorEditDTO.countOfKudos() != null) {
if (sponsorEditDTO.countOfKudos() > 0) {
List<Kudos> kudosList = IntStream.iterate(0, i -> i < sponsorEditDTO.countOfKudos(), i -> i + 1).boxed()
.map(i -> Kudos.builder()
.sponsor(sponsor)
.build())
.toList();
kudosRepository.saveAll(kudosList);
sponsor.getKudoses().addAll(kudosList);
} else {
throw new ResponseStatusException(BAD_REQUEST, "count of kudos must be greater than 0");
}
}
return sponsorRepository.save(sponsor);
}
public void deleteSponsor(long id, Authentication authentication) {
Sponsor sponsor = sponsorRepository.findById(id)
.orElseThrow(() -> new ResponseStatusException(NOT_FOUND, "sponsor with id = %s not found".formatted(id)));
UserInfo user = userInfoRepository.findByLogin(authentication.getName())
.orElseThrow(() -> new ResponseStatusException(NOT_IMPLEMENTED, "login is not valid"));
if (!sponsor.getId().equals(user.getSponsor().getId())) {
throw new ResponseStatusException(FORBIDDEN, "The user cannot edit someone else's profile");
}
List<Kudos> kudosList = sponsor.getKudoses().stream().map(i -> {i.setSponsor(null); return i;}).toList();
sponsor.setKudoses(kudosList);
userInfoRepository.delete(user);
}
}