1 package usecase.section;
2
3 import media.MediaRepository;
4 import media.ReadLimitExceededException;
5 import media.validation.Image;
6 import model.entity.Section;
7 import model.entity.User;
8 import model.repository.GenericRepository;
9 import model.repository.SectionRepository;
10 import model.validation.SectionExists;
11 import model.validation.UniqueSection;
12 import usecase.auth.AdminsOnly;
13 import usecase.auth.CurrentUser;
14
15 import javax.enterprise.context.ApplicationScoped;
16 import javax.enterprise.context.RequestScoped;
17 import javax.enterprise.inject.Produces;
18 import javax.inject.Inject;
19 import javax.inject.Named;
20 import javax.transaction.Transactional;
21 import javax.validation.constraints.NotBlank;
22 import javax.validation.constraints.NotNull;
23 import javax.validation.constraints.Size;
24 import java.io.BufferedInputStream;
25 import java.io.IOException;
26 import java.time.Instant;
27 import java.time.temporal.ChronoUnit;
28 import java.util.List;
29 import java.util.Map;
30 import java.util.stream.Collectors;
31
32
33
34
35 @ApplicationScoped
36 @Transactional
37 public class SectionService {
38 private SectionRepository sectionRepo;
39 private GenericRepository genericRepository;
40 private MediaRepository bcRepo;
41 private CurrentUser currentUser;
42
43 protected SectionService(){}
44
45 @Inject
46 protected SectionService(GenericRepository genericRepository, SectionRepository sectionRepository,
47 MediaRepository bcRepo, CurrentUser currentUser){
48 this.genericRepository = genericRepository;
49 this.sectionRepo = sectionRepository;
50 this.bcRepo = bcRepo;
51 this.currentUser = currentUser;
52 }
53
54
55
56
57
58
59 private SectionPage map(Section section){
60 User user = null;
61 if(currentUser.isLoggedIn()){
62 user = genericRepository.findById(User.class,currentUser.getId());
63 }
64 return SectionPage.builder().id(section.getId())
65 .name(section.getName())
66 .picture(section.getPicture())
67 .description(section.getDescription())
68 .banner(section.getBanner())
69 .nFollowers(section.getFollowCount())
70 .isFollowed(user != null && section.getFollow(user) != null).build();
71 }
72
73
74
75
76
77 @AdminsOnly
78 public void delete(@SectionExists int id){
79 genericRepository.remove(genericRepository.findById(Section.class, id));
80 }
81
82
83
84
85
86
87
88
89
90 @AdminsOnly
91 public int newSection(@NotBlank @Size(max=50) @UniqueSection String name,
92 @Size(max=255) String description,
93 @Image BufferedInputStream picture,
94 @Image BufferedInputStream banner) {
95 Section s = new Section();
96 s.setName(name);
97 s.setDescription(description);
98 try {
99 if (picture != null)
100 s.setPicture(bcRepo.insert(picture));
101 if (banner != null)
102 s.setBanner(bcRepo.insert(banner));
103 } catch (ReadLimitExceededException e) {
104 throw new IllegalArgumentException("Il file non deve superare i 5MB");
105 } catch (IOException e) {
106 throw new RuntimeException(e);
107 }
108 return genericRepository.insert(s).getId();
109 }
110
111
112
113
114
115 public List<SectionPage> showSections(){
116 return genericRepository.findAll(Section.class).stream().map(this::map).collect(Collectors.toList());
117 }
118
119
120
121
122
123 @Named("sections")
124 @RequestScoped
125 @Produces
126 public Map<Integer,SectionPage> getSectionsMap(){
127 return genericRepository.findAll(Section.class).stream().map(this::map)
128 .collect(Collectors.toMap(SectionPage::getId, section -> section));
129 }
130
131
132
133
134
135
136 public SectionPage showSection(@SectionExists int id){
137 Section s = genericRepository.findById(Section.class, id);
138 return map(s);
139 }
140
141
142
143
144
145
146 public SectionPage getSection(@NotNull @SectionExists String sectionName){
147 Section s = genericRepository.findByNaturalId(Section.class,sectionName);
148 return map(s);
149 }
150
151
152
153
154
155 @Produces
156 @RequestScoped
157 @Named("topSections")
158 public List<SectionPage> getTopSections(){
159 return sectionRepo.getMostFollowedSections().stream().map(this::map).collect(Collectors.toList());
160 }
161
162
163
164
165
166 @Produces
167 @RequestScoped
168 @Named("trendingSections")
169 public List<SectionPage> getTrendingSections(){
170 return sectionRepo.getMostFollowedSections(Instant.now().minus(7, ChronoUnit.DAYS))
171 .stream().map(this::map).collect(Collectors.toList());
172 }
173 }