Researches EndPoints
This commit is contained in:
		@ -0,0 +1,95 @@
 | 
				
			|||||||
 | 
					package ovh.herisson.Clyde.EndPoints.ScientificPublications;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import lombok.AllArgsConstructor;
 | 
				
			||||||
 | 
					import org.springframework.http.HttpStatus;
 | 
				
			||||||
 | 
					import org.springframework.http.ResponseEntity;
 | 
				
			||||||
 | 
					import org.springframework.web.bind.annotation.*;
 | 
				
			||||||
 | 
					import ovh.herisson.Clyde.Responses.UnauthorizedResponse;
 | 
				
			||||||
 | 
					import ovh.herisson.Clyde.Services.AuthenticatorService;
 | 
				
			||||||
 | 
					import ovh.herisson.Clyde.Services.ScientificPublications.ResearchesService;
 | 
				
			||||||
 | 
					import ovh.herisson.Clyde.Tables.Role;
 | 
				
			||||||
 | 
					import ovh.herisson.Clyde.Tables.ScientificPublications.Research;
 | 
				
			||||||
 | 
					import ovh.herisson.Clyde.Tables.ScientificPublications.Researcher;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.util.Map;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@RestController
 | 
				
			||||||
 | 
					@CrossOrigin(originPatterns = "*", allowCredentials = "true")
 | 
				
			||||||
 | 
					@AllArgsConstructor
 | 
				
			||||||
 | 
					public class ResearchController {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   private final ResearchesService researchesServ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   private final AuthenticatorService authServ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** Is accessible by anyone
 | 
				
			||||||
 | 
					     * but if the user doesn't have the permission to download the research
 | 
				
			||||||
 | 
					     * the return Research Download URL will be null
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @GetMapping("/research/{id}")
 | 
				
			||||||
 | 
					    public ResponseEntity<Research> getResearch(@RequestHeader("Authorization") String token, @PathVariable long id){
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Research research = researchesServ.getResearchById(id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (research == null)
 | 
				
			||||||
 | 
					            return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (researchesServ.hasNoAccessTo(research,authServ.getUserFromToken(token))){
 | 
				
			||||||
 | 
					           research.setPdfLocation(null);
 | 
				
			||||||
 | 
					        }// If the user doesn't have access to the document he can't download the pdf
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return new ResponseEntity<>(research, HttpStatus.OK);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @PostMapping("/research")
 | 
				
			||||||
 | 
					    public ResponseEntity<Research> postResearch(@RequestHeader("Authorization") String token, @RequestBody Research research){
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (authServ.isNotIn(new Role[]{Role.Admin},token) &&
 | 
				
			||||||
 | 
					                researchesServ.getResearcherByUser(authServ.getUserFromToken(token)) == null){
 | 
				
			||||||
 | 
					            return new UnauthorizedResponse<>(null);
 | 
				
			||||||
 | 
					        } // if the poster isn't a researcher
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return new ResponseEntity<>(researchesServ.saveResearch(research), HttpStatus.OK);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @PatchMapping("/research/{id}")
 | 
				
			||||||
 | 
					    public ResponseEntity<String> patchResearch(@RequestHeader("Authorization") String token,
 | 
				
			||||||
 | 
					                                          @RequestBody Map<String,Object> updates,
 | 
				
			||||||
 | 
					                                          @PathVariable long id
 | 
				
			||||||
 | 
					                                          )
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        Research research = researchesServ.getResearchById(id);
 | 
				
			||||||
 | 
					        Researcher researcher = researchesServ.getResearcherByUser(authServ.getUserFromToken(token));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (research == null)
 | 
				
			||||||
 | 
					            return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (authServ.isNotIn(new Role[]{Role.Admin,Role.Secretary},token) &&
 | 
				
			||||||
 | 
					                researcher != research.getAuthor()) {
 | 
				
			||||||
 | 
					            return new UnauthorizedResponse<>(null);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      researchesServ.modifyResearchData(research, updates);
 | 
				
			||||||
 | 
					      return new ResponseEntity<>(HttpStatus.OK);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @DeleteMapping("/research/{id}")
 | 
				
			||||||
 | 
					    public ResponseEntity<String> deleteResearch(@RequestHeader("Authorization") String token, @PathVariable long id){
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Research research = researchesServ.getResearchById(id);
 | 
				
			||||||
 | 
					        Researcher researcher = researchesServ.getResearcherByUser(authServ.getUserFromToken(token));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (research == null)
 | 
				
			||||||
 | 
					            return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (authServ.isNotIn(new Role[]{Role.Admin, Role.Secretary},token) &&
 | 
				
			||||||
 | 
					                researcher != research.getAuthor()){
 | 
				
			||||||
 | 
					            return new UnauthorizedResponse<>(null);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        researchesServ.delete(research);
 | 
				
			||||||
 | 
					        return new ResponseEntity<>(HttpStatus.OK);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -96,7 +96,7 @@ public class UserController {
 | 
				
			|||||||
        if (poster == null) {return new UnauthorizedResponse<>("bad token");}
 | 
					        if (poster == null) {return new UnauthorizedResponse<>("bad token");}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (!userService.modifyData(id, updates, poster))
 | 
					        if (!userService.modifyData(id, updates, poster))
 | 
				
			||||||
            return new UnauthorizedResponse<>("there was an issue with the updates requested");
 | 
					            return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return new ResponseEntity<>(null, HttpStatus.OK);
 | 
					        return new ResponseEntity<>(null, HttpStatus.OK);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
@ -0,0 +1,14 @@
 | 
				
			|||||||
 | 
					package ovh.herisson.Clyde.Repositories.ScientificPublications;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import org.springframework.data.jpa.repository.Query;
 | 
				
			||||||
 | 
					import org.springframework.data.repository.CrudRepository;
 | 
				
			||||||
 | 
					import ovh.herisson.Clyde.Tables.Course;
 | 
				
			||||||
 | 
					import ovh.herisson.Clyde.Tables.Curriculum;
 | 
				
			||||||
 | 
					import ovh.herisson.Clyde.Tables.ScientificPublications.Research;
 | 
				
			||||||
 | 
					import ovh.herisson.Clyde.Tables.ScientificPublications.ResearchCoAuthors;
 | 
				
			||||||
 | 
					import ovh.herisson.Clyde.Tables.ScientificPublications.Researcher;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public interface ResearchCoAuthorsRepository extends CrudRepository<ResearchCoAuthors,Long> {
 | 
				
			||||||
 | 
					   @Query("select distinct rca.coAuthor from ResearchCoAuthors rca where rca.research = ?1")
 | 
				
			||||||
 | 
					   public Iterable<Researcher> findResearchCoAuthors(Research research);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					package ovh.herisson.Clyde.Repositories.ScientificPublications;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import org.springframework.data.repository.CrudRepository;
 | 
				
			||||||
 | 
					import ovh.herisson.Clyde.Tables.ScientificPublications.Research;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public interface ResearchRepository extends CrudRepository<Research,Long> {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public Research findById(long id);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					package ovh.herisson.Clyde.Repositories.ScientificPublications;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import org.springframework.data.repository.CrudRepository;
 | 
				
			||||||
 | 
					import ovh.herisson.Clyde.Tables.ScientificPublications.Researcher;
 | 
				
			||||||
 | 
					import ovh.herisson.Clyde.Tables.User;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public interface ResearcherRepository extends CrudRepository<Researcher,Long> {
 | 
				
			||||||
 | 
					    public Researcher findByUser(User user);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -0,0 +1,106 @@
 | 
				
			|||||||
 | 
					package ovh.herisson.Clyde.Services.ScientificPublications;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import lombok.AllArgsConstructor;
 | 
				
			||||||
 | 
					import org.springframework.stereotype.Service;
 | 
				
			||||||
 | 
					import ovh.herisson.Clyde.Repositories.ScientificPublications.ResearchCoAuthorsRepository;
 | 
				
			||||||
 | 
					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.Access;
 | 
				
			||||||
 | 
					import ovh.herisson.Clyde.Tables.ScientificPublications.PaperType;
 | 
				
			||||||
 | 
					import ovh.herisson.Clyde.Tables.ScientificPublications.Research;
 | 
				
			||||||
 | 
					import ovh.herisson.Clyde.Tables.ScientificPublications.Researcher;
 | 
				
			||||||
 | 
					import ovh.herisson.Clyde.Tables.User;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.util.Date;
 | 
				
			||||||
 | 
					import java.util.Map;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@Service
 | 
				
			||||||
 | 
					@AllArgsConstructor
 | 
				
			||||||
 | 
					public class ResearchesService {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private final ResearcherRepository researcherRepo;
 | 
				
			||||||
 | 
					    private final ResearchCoAuthorsRepository researchCoAuthorsRepo;
 | 
				
			||||||
 | 
					    private final ResearchRepository articleRepo;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Researchers Part
 | 
				
			||||||
 | 
					    public Researcher getResearcherByUser(User user){
 | 
				
			||||||
 | 
					        return researcherRepo.findByUser(user);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public boolean isCoAuthor(Research research, Researcher researcher){
 | 
				
			||||||
 | 
					        Iterable<Researcher> coAuthors = researchCoAuthorsRepo.findResearchCoAuthors(research);
 | 
				
			||||||
 | 
					        for (Researcher coAuthor : coAuthors){
 | 
				
			||||||
 | 
					            if (researcher == coAuthor){
 | 
				
			||||||
 | 
					                return true;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // researches Part
 | 
				
			||||||
 | 
					    public Research getResearchById(long id) {
 | 
				
			||||||
 | 
					        return articleRepo.findById(id);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    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 (research.getAccess() == Access.Restricted &&
 | 
				
			||||||
 | 
					                user.getRole() == Role.Admin || user.getRole() == Role.Secretary ||
 | 
				
			||||||
 | 
					                user.getRole() == Role.Teacher || user.getRole() == Role.InscriptionService)
 | 
				
			||||||
 | 
					            return false; // if the access is restricted only the staff member (above) can access the research
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Researcher researcher = getResearcherByUser(user);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (researcher==null)
 | 
				
			||||||
 | 
					            return true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return (research.getAccess() != Access.Private || research.getAuthor() != researcher) &&
 | 
				
			||||||
 | 
					                (research.getAccess() != Access.Private || !isCoAuthor(research, researcher));
 | 
				
			||||||
 | 
					        // if the researcher is the author or one of the co-authors of the research will return false
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    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 "date":
 | 
				
			||||||
 | 
					                    research.setReleaseDate((Date) entry.getValue());
 | 
				
			||||||
 | 
					                    break;
 | 
				
			||||||
 | 
					                case "paperType":
 | 
				
			||||||
 | 
					                    research.setPaperType((PaperType) entry.getValue());
 | 
				
			||||||
 | 
					                    break;
 | 
				
			||||||
 | 
					                case "PdfLocation":
 | 
				
			||||||
 | 
					                    research.setPdfLocation((String) entry.getValue());
 | 
				
			||||||
 | 
					                    break;
 | 
				
			||||||
 | 
					                case "bibtexLocation":
 | 
				
			||||||
 | 
					                    research.setBibTexLocation((String) 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;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        articleRepo.save(research);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public void delete(Research research) {
 | 
				
			||||||
 | 
					        articleRepo.delete(research);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -9,7 +9,6 @@ package ovh.herisson.Clyde.Tables.ScientificPublications;
 | 
				
			|||||||
 *
 | 
					 *
 | 
				
			||||||
 ******************************************************/
 | 
					 ******************************************************/
 | 
				
			||||||
import jakarta.persistence.*;
 | 
					import jakarta.persistence.*;
 | 
				
			||||||
import lombok.AllArgsConstructor;
 | 
					 | 
				
			||||||
import lombok.Getter;
 | 
					import lombok.Getter;
 | 
				
			||||||
import lombok.NoArgsConstructor;
 | 
					import lombok.NoArgsConstructor;
 | 
				
			||||||
import lombok.Setter;
 | 
					import lombok.Setter;
 | 
				
			||||||
@ -20,7 +19,6 @@ import java.util.Date;
 | 
				
			|||||||
@Getter
 | 
					@Getter
 | 
				
			||||||
@Setter
 | 
					@Setter
 | 
				
			||||||
@NoArgsConstructor
 | 
					@NoArgsConstructor
 | 
				
			||||||
@AllArgsConstructor
 | 
					 | 
				
			||||||
@Entity
 | 
					@Entity
 | 
				
			||||||
public class Research {
 | 
					public class Research {
 | 
				
			||||||
    @Id
 | 
					    @Id
 | 
				
			||||||
@ -53,5 +51,19 @@ public class Research {
 | 
				
			|||||||
    private String summary;
 | 
					    private String summary;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private int views;
 | 
					    private int views;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public Research(String title, Researcher author, Date releaseDate, PaperType paperType,
 | 
				
			||||||
 | 
					                    String pdfLocation, String bibTexLocation, String language, Access access, String domain, String summary){
 | 
				
			||||||
 | 
					        this.author = author;
 | 
				
			||||||
 | 
					        this.title = title;
 | 
				
			||||||
 | 
					        this.releaseDate = releaseDate;
 | 
				
			||||||
 | 
					        this.paperType = paperType;
 | 
				
			||||||
 | 
					        this.pdfLocation = pdfLocation;
 | 
				
			||||||
 | 
					        this.bibTexLocation = bibTexLocation;
 | 
				
			||||||
 | 
					        this.language = language;
 | 
				
			||||||
 | 
					        this.access = access;
 | 
				
			||||||
 | 
					        this.domain = domain;
 | 
				
			||||||
 | 
					        this.summary = summary;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -8,6 +8,7 @@ package ovh.herisson.Clyde.Tables.ScientificPublications;
 | 
				
			|||||||
 * Co-Authors List entity (will be accessed by Articles)
 | 
					 * Co-Authors List entity (will be accessed by Articles)
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 ******************************************************/
 | 
					 ******************************************************/
 | 
				
			||||||
 | 
					import jakarta.persistence.Entity;
 | 
				
			||||||
import jakarta.persistence.FetchType;
 | 
					import jakarta.persistence.FetchType;
 | 
				
			||||||
import jakarta.persistence.JoinColumn;
 | 
					import jakarta.persistence.JoinColumn;
 | 
				
			||||||
import jakarta.persistence.ManyToOne;
 | 
					import jakarta.persistence.ManyToOne;
 | 
				
			||||||
@ -22,6 +23,7 @@ import org.hibernate.annotations.OnDeleteAction;
 | 
				
			|||||||
@Setter
 | 
					@Setter
 | 
				
			||||||
@NoArgsConstructor
 | 
					@NoArgsConstructor
 | 
				
			||||||
@AllArgsConstructor
 | 
					@AllArgsConstructor
 | 
				
			||||||
 | 
					@Entity
 | 
				
			||||||
public class ResearchCoAuthors {
 | 
					public class ResearchCoAuthors {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @ManyToOne(fetch = FetchType.EAGER)
 | 
					    @ManyToOne(fetch = FetchType.EAGER)
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user