1
0
forked from PGL/Clyde

Merge pull request 'master' (#173) from Maxime/Clyde:master into master

Reviewed-on: PGL/Clyde#173
This commit is contained in:
2024-04-22 00:06:59 +02:00
41 changed files with 2870 additions and 112 deletions

View File

@ -0,0 +1,178 @@
package ovh.herisson.Clyde.Services.ScientificPublications;
/******************************************************
* @file ResearchesService.java
* @author Bartha Maxime
* @scope Publications Scientifiques
*
* Service for managing researcher and researches
******************************************************/
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import ovh.herisson.Clyde.Repositories.ScientificPublications.ResearchRepository;
import ovh.herisson.Clyde.Repositories.ScientificPublications.ResearcherRepository;
import ovh.herisson.Clyde.Tables.Role;
import ovh.herisson.Clyde.Tables.ScientificPublications.*;
import ovh.herisson.Clyde.Tables.User;
import java.util.*;
@Service
@AllArgsConstructor
@SuppressWarnings("unchecked")
public class ResearchesService {
private final ResearcherRepository researcherRepo;
private final ResearchRepository articleRepo;
// researches Part
public Research getResearchById(long id) {
return articleRepo.findById(id);
}
public Research getResearchByUrl(String url) {
return articleRepo.findByPdfLocation(url);
}
public Iterable<Research> getResearchesByAuthor(long authorId){
Researcher researcher = researcherRepo.findById(authorId);
if (researcher == null) return null;
return researcherRepo.findAllByAuthorId(researcher);
}
public Research saveResearch(Research research) {
return articleRepo.save(research);
}
public void modifyResearchData(Research research, Map<String, Object> updates) {
for (Map.Entry<String, Object> entry : updates.entrySet()){
switch (entry.getKey()){
case "title":
research.setTitle((String) entry.getValue());
break;
case "paperType":
research.setPaperType((PaperType) entry.getValue());
break;
case "language":
research.setLanguage((String) entry.getValue());
break;
case "domain":
research.setDomain((String) entry.getValue());
break;
case "summary":
research.setSummary((String) entry.getValue());
break;
case "access":
research.setAccess(Access.valueOf((String) entry.getValue()));
break;
case "coAuthors":
Set<Researcher> set = new HashSet<>();
for (int id : (List<Integer>) entry.getValue()) {
Researcher r = researcherRepo.findById(id);
if (r != null){
set.add(r);
}
}
research.setCoAuthors(set);
break;
}
}
articleRepo.save(research);
}
public void deleteResearch(Research research) {
articleRepo.delete(research);
}
// Researchers Part
public Researcher getResearcherByUser(User user){
return researcherRepo.findByUser(user);
}
public Iterable<Research> getAllResearches() {
return articleRepo.findAll();
}
public Researcher saveResearcher(Researcher researcher) {
if (researcherRepo.findByUser(researcher.getUser()) != null) return null;
return researcherRepo.save(researcher);
}
public Iterable<Researcher> getAllResearchers() {
return researcherRepo.findAll();
}
public Researcher getResearcherById(long id) {
return researcherRepo.findById(id);
}
public void deleteResearcher(Researcher researcher) {
articleRepo.findAll();
for (Research r: articleRepo.findAll())
{
if (r.getCoAuthors().contains(researcher)){
r.getCoAuthors().remove(researcher);
articleRepo.save(r);
}
}
researcherRepo.delete(researcher);
}
public void modifyResearcherData(Researcher researcher, Map<String, Object> updates) {
for (Map.Entry<String, Object> entry : updates.entrySet()){
switch (entry.getKey()){
case "orcidId":
if (entry.getValue() != null)
researcher.setOrcidId((String) entry.getValue());
break;
case "domain":
if (entry.getValue() != null)
researcher.setDomain((String) entry.getValue());
break;
case "site":
if (entry.getValue() != null)
researcher.setSite((String) entry.getValue());
break;
}
}
researcherRepo.save(researcher);
}
// Other stuff
public Research addView(Research research) {
research.setViews(research.getViews()+1);
return articleRepo.save(research);
}
public boolean hasNoAccessTo(Research research, User user){
if (research.getAccess() == Access.OpenSource) return false; // if the access is open source even non-users can see it
if (user == null) return true; // else you need at least to be a user
if (user.getRole() == Role.Admin) return false;
Researcher researcher = getResearcherByUser(user);
if (researcher !=null ){
if (research.getAuthor().getId() == researcher.getId())
return false;
for (Researcher coAuthor: research.getCoAuthors()){
if (coAuthor.getId() == researcher.getId())
return false;
}
}
return research.getAccess() != Access.Restricted || (user.getRole() != Role.Secretary &&
user.getRole() != Role.Teacher && user.getRole() != Role.InscriptionService);
// if the access is restricted only the staff member (above) can access the research
}
}

View File

@ -0,0 +1,50 @@
package ovh.herisson.Clyde.Services.ScientificPublications;
/******************************************************
* @file StatisticsService
* @author Bartha Maxime
* @scope Publications Scientifiques
*
* Service for managing statistics
******************************************************/
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import ovh.herisson.Clyde.Repositories.ScientificPublications.ResearchRepository;
import ovh.herisson.Clyde.Repositories.ScientificPublications.StatsRepository;
import ovh.herisson.Clyde.Tables.ScientificPublications.Research;
import ovh.herisson.Clyde.Tables.ScientificPublications.Researcher;
import java.util.*;
@Service
@AllArgsConstructor
public class StatisticsService {
private ResearchRepository articleRepo;
private StatsRepository statsRepo;
public Iterable<Iterable<Map<String, Integer>>> generateStats(Researcher researcher){
Iterable<Research> researches = articleRepo.findByAuthor(researcher);
if (researches == null) return null;
ArrayList<Iterable<Map<String,Integer>>> toReturn = new ArrayList<>();
toReturn.add(statsRepo.viewsByYears());
toReturn.add(statsRepo.viewsByMonths());
toReturn.add(statsRepo.viewsByTopics());
toReturn.add(statsRepo.researchesByYears());
toReturn.add(statsRepo.researchesByMonth());
toReturn.add(statsRepo.researchesByTopics());
toReturn.add(statsRepo.languageByYears());
toReturn.add(statsRepo.languageByMonths());
toReturn.add(statsRepo.languageByTopics());
return toReturn;
}
}

View File

@ -45,61 +45,55 @@ public class UserService {
* @param targetId the id of the user to update
* @return if the changes were done or not
*/
public boolean modifyData(long targetId, Map<String ,Object> updates, User poster){
public User modifyData(long targetId, Map<String ,Object> updates, User poster){
User target = userRepo.findById(targetId);
if (target == null)
return false;
return null;
if (poster.getRegNo().equals(target.getRegNo())){
for (Map.Entry<String, Object> entry : updates.entrySet()){
if (!target.getRegNo().equals(poster.getRegNo()) && !(poster.getRole() == Role.Secretary) &&
!(poster.getRole() == Role.Admin))
return null;
switch (entry.getKey()){
case "firstName":
target.setFirstName((String) entry.getValue());
break;
case "lastName":
target.setLastName((String) entry.getValue());
break;
case "email":
target.setEmail((String) entry.getValue());
break;
case "address":
target.setAddress((String) entry.getValue());
break;
case "country":
target.setCountry((String) entry.getValue());
break;
case "birthDate":
target.setBirthDate((Date) entry.getValue());
break;
case "profilePictureUrl":
target.setProfilePictureUrl((String) entry.getValue());
break;
case "password":
target.setPassword((String) entry.getValue());
break;
}
}
userRepo.save(target);
return true;
}
// the secretary can change roles (for example if a student becomes a teacher)
else if (poster.getRole() == Role.Secretary)
{
for (Map.Entry<String, Object> entry : updates.entrySet()){
if ( entry.getKey().equals("role")) {
if (entry.getValue() == Role.Admin) {return false;}
target.setRole((Role) entry.getValue());
userRepo.save(target);
return true;
}
for (Map.Entry<String, Object> entry : updates.entrySet()){
System.out.println(entry.getValue());
switch (entry.getKey()){
case "firstName":
target.setFirstName((String) entry.getValue());
break;
case "lastName":
target.setLastName((String) entry.getValue());
break;
case "email":
target.setEmail((String) entry.getValue());
break;
case "address":
target.setAddress((String) entry.getValue());
break;
case "country":
target.setCountry((String) entry.getValue());
break;
case "birthDate":
target.setBirthDate((Date) entry.getValue());
break;
case "profilePictureUrl":
target.setProfilePictureUrl((String) entry.getValue());
break;
case "password":
target.setPassword((String) entry.getValue());
break;
case "role":
//a user can't change his own role
if (poster.getRole()==Role.Secretary || poster.getRole() == Role.Admin){
Role wanted = Role.valueOf((String) entry.getValue());
if (wanted == Role.Admin && poster.getRole() != Role.Admin)
return null;
target.setRole(wanted);
}
}
}
return false;
userRepo.save(target);
return target;
}