diff --git a/WebService/pom.xml b/WebService/pom.xml index 472a887..23c71db 100644 --- a/WebService/pom.xml +++ b/WebService/pom.xml @@ -1,50 +1,50 @@ - 4.0.0 - - org.springframework.boot - spring-boot-starter-parent - 3.2.2 - - - com.example - WebService - 0.0.1-SNAPSHOT - tp2 - Demo project for Spring Boot - - 17 - - - - org.springframework.boot - spring-boot-starter - - - org.springframework.boot - spring-boot-starter-test - test - - - org.springframework.boot - spring-boot-starter-hateoas - - - org.springframework.boot - spring-boot-starter-web - - - jakarta.persistence - jakarta.persistence-api - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 3.2.2 + + + com.example + WebService + 0.0.1-SNAPSHOT + tp2 + Demo project for Spring Boot + + 17 + + + + org.springframework.boot + spring-boot-starter + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.boot + spring-boot-starter-hateoas + + + org.springframework.boot + spring-boot-starter-web + + + jakarta.persistence + jakarta.persistence-api + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + \ No newline at end of file diff --git a/WebService/src/main/java/SAE/ApiREST/WebService/controller/ArticleControler.java b/WebService/src/main/java/SAE/ApiREST/WebService/controller/ArticleControler.java index 4449e34..7c86921 100644 --- a/WebService/src/main/java/SAE/ApiREST/WebService/controller/ArticleControler.java +++ b/WebService/src/main/java/SAE/ApiREST/WebService/controller/ArticleControler.java @@ -1,16 +1,21 @@ package SAE.ApiREST.WebService.controller; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.hateoas.CollectionModel; +import org.springframework.hateoas.EntityModel; import org.springframework.http.MediaType; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; +import SAE.ApiREST.WebService.Response; import SAE.ApiREST.WebService.exception.ArticleException; import SAE.ApiREST.WebService.model.Article; import SAE.ApiREST.WebService.service.IArticleService; import java.util.ArrayList; -import java.util.List; + +import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo; +import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.methodOn; @Controller @RequestMapping("/ArticleWebService") @@ -19,147 +24,561 @@ public class ArticleControler { IArticleService articleService; // region POST - + @PostMapping( + value = "/addArticle", + consumes = MediaType.APPLICATION_JSON_VALUE, + produces = MediaType.APPLICATION_JSON_VALUE + ) + public @ResponseBody EntityModel addArticle( + @RequestBody Article article + ) { + Response results = articleService.addArticle(article); + + return EntityModel.of( + results, + linkTo(methodOn(ArticleControler.class).addArticle(article)).withSelfRel(), + linkTo(methodOn(ArticleControler.class).getAllArticles()).withRel("allArticles"), + linkTo(methodOn(ArticleControler.class).getArticleById(article.getId())).withRel("getArticleById"), + linkTo(methodOn(ArticleControler.class).deleteArticleFromId(article.getId())).withRel("deleteArticle") + ); + } // endregion // region PUT - + @PutMapping( + value = "/updateTitle/{title}", + consumes = MediaType.APPLICATION_JSON_VALUE, + produces = MediaType.APPLICATION_JSON_VALUE + ) + public @ResponseBody EntityModel
updateTitle( + @PathVariable("title") String title, + @RequestBody Article article + ) { + Article results = articleService.updateTitle(article, title); + + return EntityModel.of( + results, + linkTo(methodOn(ArticleControler.class).updateTitle(title, article)).withSelfRel(), + linkTo(methodOn(ArticleControler.class).getAllArticles()).withRel("allArticles"), + linkTo(methodOn(ArticleControler.class).getArticleById(article.getId())).withRel("getArticleById"), + linkTo(methodOn(ArticleControler.class).getArticlesByTitle(article.getTitle())).withRel("getArticlesByTitle"), + linkTo(methodOn(ArticleControler.class).deleteArticleFromId(article.getId())).withRel("deleteArticle") + ); + } + + @PutMapping( + value = "/updateUrl/{url}", + consumes = MediaType.APPLICATION_JSON_VALUE, + produces = MediaType.APPLICATION_JSON_VALUE + ) + public @ResponseBody EntityModel
updateUrl( + @PathVariable("url") String url, + @RequestBody Article article + ) { + Article results = articleService.updateUrl(article, url); + + return EntityModel.of( + results, + linkTo(methodOn(ArticleControler.class).updateUrl(url, article)).withSelfRel(), + linkTo(methodOn(ArticleControler.class).getAllArticles()).withRel("allArticles"), + linkTo(methodOn(ArticleControler.class).getArticleById(article.getId())).withRel("getArticleById"), + linkTo(methodOn(ArticleControler.class).getArticlesByUrl(article.getUrl())).withRel("getArticlesByUrl"), + linkTo(methodOn(ArticleControler.class).deleteArticleFromId(article.getId())).withRel("deleteArticle") + ); + } + + @PutMapping( + value = "/updateDatePublished/{datePublished}", + consumes = MediaType.APPLICATION_JSON_VALUE, + produces = MediaType.APPLICATION_JSON_VALUE + ) + public @ResponseBody EntityModel
updateDatePublished( + @PathVariable("datePublished") String datePublished, + @RequestBody Article article + ) { + Article results = articleService.updateDatePublished(article, datePublished); + + return EntityModel.of( + results, + linkTo(methodOn(ArticleControler.class).updateDatePublished(datePublished, article)).withSelfRel(), + linkTo(methodOn(ArticleControler.class).getAllArticles()).withRel("allArticles"), + linkTo(methodOn(ArticleControler.class).getArticleById(article.getId())).withRel("getArticleById"), + linkTo(methodOn(ArticleControler.class).getArticlesPublishedBefore(article.getDatePublished().toString())).withRel("getArticlesPublishedBefore"), + linkTo(methodOn(ArticleControler.class).getArticlesPublishedAfter(article.getDatePublished().toString())).withRel("getArticlesPublishedAfter"), + linkTo(methodOn(ArticleControler.class).deleteArticleFromId(article.getId())).withRel("deleteArticle") + ); + } + + @PutMapping( + value = "/updateDateAdded/{dateAdded}", + consumes = MediaType.APPLICATION_JSON_VALUE, + produces = MediaType.APPLICATION_JSON_VALUE + ) + public @ResponseBody EntityModel
updateDateAdded( + @PathVariable("dateAdded") String dateAdded, + @RequestBody Article article + ) { + Article results = articleService.updateDateAdded(article, dateAdded); + + return EntityModel.of( + results, + linkTo(methodOn(ArticleControler.class).updateDateAdded(dateAdded, article)).withSelfRel(), + linkTo(methodOn(ArticleControler.class).getAllArticles()).withRel("allArticles"), + linkTo(methodOn(ArticleControler.class).getArticleById(article.getId())).withRel("getArticleById"), + linkTo(methodOn(ArticleControler.class).getArticlesAddedBefore(article.getDateAdded().toString())).withRel("getArticlesAddedBefore"), + linkTo(methodOn(ArticleControler.class).getArticlesAddedAfter(article.getDateAdded().toString())).withRel("getArticlesAddedAfter"), + linkTo(methodOn(ArticleControler.class).deleteArticleFromId(article.getId())).withRel("deleteArticle") + ); + } + + @PutMapping( + value = "/changeVisibility", + consumes = MediaType.APPLICATION_JSON_VALUE, + produces = MediaType.APPLICATION_JSON_VALUE + ) + public @ResponseBody EntityModel
changeVisibility( + @RequestBody Article article + ) { + Article results = articleService.changeVisibility(article); + + return EntityModel.of( + results, + linkTo(methodOn(ArticleControler.class).changeVisibility(article)).withSelfRel(), + linkTo(methodOn(ArticleControler.class).getAllArticles()).withRel("allArticles"), + linkTo(methodOn(ArticleControler.class).getArticleById(article.getId())).withRel("getArticleById"), + linkTo(methodOn(ArticleControler.class).getVisibleArticles()).withRel("getVisibleArticle"), + linkTo(methodOn(ArticleControler.class).getInvisibleArticles()).withRel("getInvisibleArticle"), + linkTo(methodOn(ArticleControler.class).deleteArticleFromId(article.getId())).withRel("deleteArticle") + ); + } + + @PutMapping( + value = "/updateType/{type}", + consumes = MediaType.APPLICATION_JSON_VALUE, + produces = MediaType.APPLICATION_JSON_VALUE + ) + public @ResponseBody EntityModel
updateType( + @PathVariable("type") Integer type, + @RequestBody Article article + ) { + Article results = articleService.updateType(article, type); + + return EntityModel.of( + results, + linkTo(methodOn(ArticleControler.class).updateType(type, article)).withSelfRel(), + linkTo(methodOn(ArticleControler.class).getAllArticles()).withRel("allArticles"), + linkTo(methodOn(ArticleControler.class).getArticleById(article.getId())).withRel("getArticleById"), + linkTo(methodOn(ArticleControler.class).getArticlesByType(article.getType())).withRel("getArticlesByType"), + linkTo(methodOn(ArticleControler.class).deleteArticleFromId(article.getId())).withRel("deleteArticle") + ); + } // endregion // region GET - - @GetMapping(value = "/getAllArticle", produces = MediaType.APPLICATION_JSON_VALUE) - public @ResponseBody List
getAllArticles() { + @GetMapping( + value = "/getAllArticle", + produces = MediaType.APPLICATION_JSON_VALUE + ) + public @ResponseBody CollectionModel
getAllArticles() { ArrayList
results = (ArrayList
) articleService.getAllArticles(); if(results.isEmpty()) { throw new ArticleException("No articles available"); } - return results; + return CollectionModel.of( + results, + linkTo(methodOn(ArticleControler.class).getAllArticles()).withSelfRel() + ); } - @GetMapping(value = "/getArticleById/{id}", produces = MediaType.APPLICATION_JSON_VALUE) - public @ResponseBody Article getArticlesById(@PathVariable(value = "id") Integer id) { + @GetMapping( + value = "/getArticleById/{id}", + produces = MediaType.APPLICATION_JSON_VALUE + ) + public @ResponseBody EntityModel
getArticleById(@PathVariable(value = "id") Integer id) { Article results = articleService.getArticlesById(id); if(results == null) { throw new ArticleException("Undefined id"); } - return results; + return EntityModel.of( + results, + linkTo(methodOn(ArticleControler.class).getArticleById(id)).withSelfRel(), + linkTo(methodOn(ArticleControler.class).deleteArticleFromId(id)).withRel("deleteArticleFromUrl") + ); } - @GetMapping(value = "/getArticlesByTitle/{title}", produces = MediaType.APPLICATION_JSON_VALUE) - public @ResponseBody List
getArticlesByTitle(@PathVariable(value = "title") String title) { + @GetMapping( + value = "/getArticlesByTitle/{title}", + produces = MediaType.APPLICATION_JSON_VALUE + ) + public @ResponseBody CollectionModel
getArticlesByTitle(@PathVariable(value = "title") String title) { ArrayList
results = (ArrayList
) articleService.getArticlesByTitle(title); if(results.isEmpty()) { throw new ArticleException("Undefined title"); } - return results; + return CollectionModel.of( + results, + linkTo(methodOn(ArticleControler.class).getArticlesByTitle(title)).withSelfRel(), + linkTo(methodOn(ArticleControler.class).deleteArticleFromTitle(title)).withRel("deleteArticleFromTitle") + ); + } + + @GetMapping( + value = "/getArticlesByUrl/{url}", + produces = MediaType.APPLICATION_JSON_VALUE + ) + public @ResponseBody CollectionModel
getArticlesByUrl(@PathVariable(value = "url") String url) { + ArrayList
results = (ArrayList
) articleService.getArticlesByUrl(url); + + if(results.isEmpty()) { + throw new ArticleException("Undefined title"); + } + + return CollectionModel.of( + results, + linkTo(methodOn(ArticleControler.class).getArticlesByUrl(url)).withSelfRel(), + linkTo(methodOn(ArticleControler.class).deleteArticleFromUrl(url)).withRel("deleteArticleFromId") + ); } - @GetMapping(value = "/getArticlesByType/{type}", produces = MediaType.APPLICATION_JSON_VALUE) - public @ResponseBody List
getArticlesByType(@PathVariable(value = "type") Integer type) { + @GetMapping( + value = "/getArticlesByType/{type}", + produces = MediaType.APPLICATION_JSON_VALUE + ) + public @ResponseBody CollectionModel
getArticlesByType(@PathVariable(value = "type") Integer type) { ArrayList
results = (ArrayList
) articleService.getArticlesByType(type); if (results.isEmpty()) { throw new ArticleException(String.format("No content of type %d", type)); } - - return results; + + return CollectionModel.of( + results, + linkTo(methodOn(ArticleControler.class).getArticlesByType(type)).withSelfRel(), + linkTo(methodOn(ArticleControler.class).deleteArticleFromType(type)).withRel("deleteArticleFromType") + ); } - @GetMapping(value = "/getVisibleArticles", produces = MediaType.APPLICATION_JSON_VALUE) - public @ResponseBody List
getVisibleArticles() { + @GetMapping( + value = "/getVisibleArticles", + produces = MediaType.APPLICATION_JSON_VALUE + ) + public @ResponseBody CollectionModel
getVisibleArticles() { ArrayList
results = (ArrayList
) articleService.getVisibleArticles(); if (results.isEmpty()) { throw new ArticleException("No visible article"); } - - return results; + + return CollectionModel.of( + results, + linkTo(methodOn(ArticleControler.class).getVisibleArticles()).withSelfRel() + ); } - @GetMapping(value = "/getInvisibleArticles", produces = MediaType.APPLICATION_JSON_VALUE) - public @ResponseBody List
getInvisibleArticles() { + @GetMapping( + value = "/getInvisibleArticles", + produces = MediaType.APPLICATION_JSON_VALUE + ) + public @ResponseBody CollectionModel
getInvisibleArticles() { ArrayList
results = (ArrayList
) articleService.getInvisibleArticles(); if (results.isEmpty()) { throw new ArticleException("No invisible article"); } - - return results; + + return CollectionModel.of( + results, + linkTo(methodOn(ArticleControler.class).getInvisibleArticles()).withSelfRel() + ); } - @GetMapping(value = "/getArticlesAddedBefore/{dateAdded}", produces = MediaType.APPLICATION_JSON_VALUE) - public @ResponseBody List
getArticlesAddedBefore(@PathVariable(value = "dateAdded") String dateAdded) { + @GetMapping( + value = "/getArticlesAddedBefore/{dateAdded}", + produces = MediaType.APPLICATION_JSON_VALUE + ) + public @ResponseBody CollectionModel
getArticlesAddedBefore(@PathVariable(value = "dateAdded") String dateAdded) { ArrayList
results = (ArrayList
) articleService.getArticlesAddedBefore(dateAdded); if (results.isEmpty()) { throw new ArticleException(String.format("No article added before %t", dateAdded)); } - return results; + + return CollectionModel.of( + results, + linkTo(methodOn(ArticleControler.class).getArticlesAddedBefore(dateAdded)).withSelfRel(), + linkTo(methodOn(ArticleControler.class).deleteArticleAddedBefore(dateAdded)).withRel("deleteArticleAddedBefore") + ); } - @GetMapping(value = "/getArticlesAddedAfter/{dateAdded}", produces = MediaType.APPLICATION_JSON_VALUE) - public @ResponseBody List
getArticlesAddedAfter(@PathVariable(value = "dateAdded") String dateAdded) { + @GetMapping( + value = "/getArticlesAddedAfter/{dateAdded}", + produces = MediaType.APPLICATION_JSON_VALUE + ) + public @ResponseBody CollectionModel
getArticlesAddedAfter(@PathVariable(value = "dateAdded") String dateAdded) { ArrayList
results = (ArrayList
) articleService.getArticlesAddedAfter(dateAdded); if (results.isEmpty()) { throw new ArticleException(String.format("No article added after %t", dateAdded)); } - return results; + + return CollectionModel.of( + results, + linkTo(methodOn(ArticleControler.class).getArticlesAddedAfter(dateAdded)).withSelfRel(), + linkTo(methodOn(ArticleControler.class).deleteArticleAddedAfter(dateAdded)).withRel("deleteArticleAddedAfter") + ); } - @GetMapping(value = "/getArticlesAddedBetween/{beginning}/{end}", produces = MediaType.APPLICATION_JSON_VALUE) - public @ResponseBody List
getArticlesAddedAfter(@PathVariable(value = "beginning") String beginning, @PathVariable(value = "end") String end) { + @GetMapping( + value = "/getArticlesAddedBetween/{beginning}/{end}", + produces = MediaType.APPLICATION_JSON_VALUE + ) + public @ResponseBody CollectionModel
getArticlesAddedBetween(@PathVariable(value = "beginning") String beginning, @PathVariable(value = "end") String end) { ArrayList
results = (ArrayList
) articleService.getArticlesAddedBetween(beginning, end); if (results.isEmpty()) { throw new ArticleException(String.format("No article added between %t and %t", beginning, end)); } - return results; + + return CollectionModel.of( + results, + linkTo(methodOn(ArticleControler.class).getArticlesAddedBetween(beginning, end)).withSelfRel(), + linkTo(methodOn(ArticleControler.class).deleteArticleAddedBetween(beginning, end)).withRel("deleteArticleAddedBetween") + ); } - @GetMapping(value = "/getArticlesPublishedBefore/{datePublished}", produces = MediaType.APPLICATION_JSON_VALUE) - public @ResponseBody List
getArticlesPublishedBefore(@PathVariable(value = "datePublished") String datePublished) { + @GetMapping( + value = "/getArticlesPublishedBefore/{datePublished}", + produces = MediaType.APPLICATION_JSON_VALUE + ) + public @ResponseBody CollectionModel
getArticlesPublishedBefore(@PathVariable(value = "datePublished") String datePublished) { ArrayList
results = (ArrayList
) articleService.getArticlesPublishedBefore(datePublished); if (results.isEmpty()) { throw new ArticleException(String.format("No article published before %t", datePublished)); } - - return results; + + return CollectionModel.of( + results, + linkTo(methodOn(ArticleControler.class).getArticlesPublishedBefore(datePublished)).withSelfRel(), + linkTo(methodOn(ArticleControler.class).deleteArticlePublishedBefore(datePublished)).withRel("deleteArticlePublishedBefore") + ); } - @GetMapping(value = "/getArticlesPublishedAfter/{datePublished}", produces = MediaType.APPLICATION_JSON_VALUE) - public @ResponseBody List
getArticlesPublishedAfter(@PathVariable(value = "datePublished") String datePublished) { + @GetMapping( + value = "/getArticlesPublishedAfter/{datePublished}", + produces = MediaType.APPLICATION_JSON_VALUE + ) + public @ResponseBody CollectionModel
getArticlesPublishedAfter(@PathVariable(value = "datePublished") String datePublished) { ArrayList
results = (ArrayList
) articleService.getArticlesPublishedAfter(datePublished); if (results.isEmpty()) { throw new ArticleException(String.format("No article published after %t", datePublished)); } - - return results; + + return CollectionModel.of( + results, + linkTo(methodOn(ArticleControler.class).getArticlesPublishedAfter(datePublished)).withSelfRel(), + linkTo(methodOn(ArticleControler.class).deleteArticlePublishedAfter(datePublished)).withRel("deleteArticlePublishedAfter") + ); } - @GetMapping(value = "/getArticlesPublishedBetween/{beginning}/{end}", produces = MediaType.APPLICATION_JSON_VALUE) - public @ResponseBody List
getArticlesPublishedAfter(@PathVariable(value = "beginning") String beginning, @PathVariable(value = "end") String end) { + @GetMapping( + value = "/getArticlesPublishedBetween/{beginning}/{end}", + produces = MediaType.APPLICATION_JSON_VALUE + ) + public @ResponseBody CollectionModel
getArticlesPublishedBetween(@PathVariable(value = "beginning") String beginning, @PathVariable(value = "end") String end) { ArrayList
results = (ArrayList
) articleService.getArticlesPublishedBetween(beginning, end); if (results.isEmpty()) { throw new ArticleException(String.format("No article published between %t and %t", beginning, end)); } - - return results; + + return CollectionModel.of( + results, + linkTo(methodOn(ArticleControler.class).getArticlesPublishedBetween(beginning, end)).withSelfRel(), + linkTo(methodOn(ArticleControler.class).deleteArticlePublishedBetween(beginning, end)).withRel("getArticlesPublishedBetween") + ); } // endregion // region DELETE + @DeleteMapping( + value = "/deleteArticleFromId/{id}", + produces = MediaType.APPLICATION_JSON_VALUE + ) + public @ResponseBody EntityModel deleteArticleFromId( + @PathVariable("id") Integer id + ) { + Response results = articleService.deleteArticleFromId(id); + + return EntityModel.of( + results, + linkTo(methodOn(ArticleControler.class).deleteArticleFromId(id)).withSelfRel(), + linkTo(methodOn(ArticleControler.class).getAllArticles()).withRel("getAllArticles"), + linkTo(methodOn(ArticleControler.class).getArticleById(id)).withRel("getArticleById") + ); + } + + @DeleteMapping( + value = "/deleteArticleFromTitle/{title}", + produces = MediaType.APPLICATION_JSON_VALUE + ) + public @ResponseBody EntityModel deleteArticleFromTitle( + @PathVariable("title") String title + ) { + Response results = articleService.deleteArticleFromTitle(title); + + return EntityModel.of( + results, + linkTo(methodOn(ArticleControler.class).deleteArticleFromTitle(title)).withSelfRel(), + linkTo(methodOn(ArticleControler.class).getAllArticles()).withRel("getAllArticles"), + linkTo(methodOn(ArticleControler.class).getArticlesByTitle(title)).withRel("getArticleByTitle") + ); + } + + @DeleteMapping( + value = "/deleteArticleFromUrl/{url}", + produces = MediaType.APPLICATION_JSON_VALUE + ) + public @ResponseBody EntityModel deleteArticleFromUrl( + @PathVariable("url") String url + ) { + Response results = articleService.deleteArticleFromTitle(url); + + return EntityModel.of( + results, + linkTo(methodOn(ArticleControler.class).deleteArticleFromUrl(url)).withSelfRel(), + linkTo(methodOn(ArticleControler.class).getAllArticles()).withRel("getAllArticles"), + linkTo(methodOn(ArticleControler.class).getArticlesByUrl(url)).withRel("getArticlesByUrl") + ); + } + + @DeleteMapping( + value = "/deleteArticleFromType/{type}", + produces = MediaType.APPLICATION_JSON_VALUE + ) + public @ResponseBody EntityModel deleteArticleFromType( + @PathVariable("type") Integer type + ) { + Response results = articleService.deleteArticleFromType(type); + + return EntityModel.of( + results, + linkTo(methodOn(ArticleControler.class).deleteArticleFromType(type)).withSelfRel(), + linkTo(methodOn(ArticleControler.class).getAllArticles()).withRel("getAllArticles"), + linkTo(methodOn(ArticleControler.class).getArticlesByType(type)).withRel("getArticlesByType") + ); + } + + @DeleteMapping( + value = "/deleteArticleAddedBefore/{date}", + produces = MediaType.APPLICATION_JSON_VALUE + ) + public @ResponseBody EntityModel deleteArticleAddedBefore( + @PathVariable("date") String date + ) { + Response results = articleService.deleteArticleAddedBefore(date); + + return EntityModel.of( + results, + linkTo(methodOn(ArticleControler.class).deleteArticleAddedBefore(date)).withSelfRel(), + linkTo(methodOn(ArticleControler.class).getAllArticles()).withRel("getAllArticles"), + linkTo(methodOn(ArticleControler.class).getArticlesAddedBefore(date)).withRel("getArticlesAddedBefore") + ); + } + + @DeleteMapping( + value = "/deleteArticleAddedAfter/{date}", + produces = MediaType.APPLICATION_JSON_VALUE + ) + public @ResponseBody EntityModel deleteArticleAddedAfter( + @PathVariable("date") String date + ) { + Response results = articleService.deleteArticleAddedAfter(date); + + return EntityModel.of( + results, + linkTo(methodOn(ArticleControler.class).deleteArticleAddedAfter(date)).withSelfRel(), + linkTo(methodOn(ArticleControler.class).getAllArticles()).withRel("getAllArticles"), + linkTo(methodOn(ArticleControler.class).getArticlesAddedAfter(date)).withRel("getArticlesAddedAfter") + ); + } + + @DeleteMapping( + value = "/deleteArticleAddedBetween/{beginning}/{end}", + produces = MediaType.APPLICATION_JSON_VALUE + ) + public @ResponseBody EntityModel deleteArticleAddedBetween( + @PathVariable("beginning") String beginning, + @PathVariable("end") String end + ) { + Response results = articleService.deleteArticleAddedBetween(beginning, end); + + return EntityModel.of( + results, + linkTo(methodOn(ArticleControler.class).deleteArticleAddedBetween(beginning, end)).withSelfRel(), + linkTo(methodOn(ArticleControler.class).getAllArticles()).withRel("getAllArticles"), + linkTo(methodOn(ArticleControler.class).getArticlesAddedBetween(beginning, end)).withRel("getArticlesAddedBetween") + ); + } + + @DeleteMapping( + value = "/deleteArticlePublishedBefore/{date}", + produces = MediaType.APPLICATION_JSON_VALUE + ) + public @ResponseBody EntityModel deleteArticlePublishedBefore( + @PathVariable("date") String date + ) { + Response results = articleService.deleteArticlePublishedBefore(date); + + return EntityModel.of( + results, + linkTo(methodOn(ArticleControler.class).deleteArticlePublishedBefore(date)).withSelfRel(), + linkTo(methodOn(ArticleControler.class).getAllArticles()).withRel("getAllArticles"), + linkTo(methodOn(ArticleControler.class).getArticlesPublishedBefore(date)).withRel("getArticlesPublishedBefore") + ); + } + @DeleteMapping( + value = "/deleteArticlePublishedAfter/{date}", + produces = MediaType.APPLICATION_JSON_VALUE + ) + public @ResponseBody EntityModel deleteArticlePublishedAfter( + @PathVariable("date") String date + ) { + Response results = articleService.deleteArticlePublishedBefore(date); + + return EntityModel.of( + results, + linkTo(methodOn(ArticleControler.class).deleteArticlePublishedAfter(date)).withSelfRel(), + linkTo(methodOn(ArticleControler.class).getAllArticles()).withRel("getAllArticles"), + linkTo(methodOn(ArticleControler.class).getArticlesPublishedAfter(date)).withRel("getArticlesPublishedAfter") + ); + } + + @DeleteMapping( + value = "/deleteArticlePublishedBetween/{beginning}/{end}", + produces = MediaType.APPLICATION_JSON_VALUE + ) + public @ResponseBody EntityModel deleteArticlePublishedBetween( + @PathVariable("beginning") String beginning, + @PathVariable("end") String end + ) { + Response results = articleService.deleteArticlePublishedBetween(beginning, end); + + return EntityModel.of( + results, + linkTo(methodOn(ArticleControler.class).deleteArticlePublishedBetween(beginning, end)).withSelfRel(), + linkTo(methodOn(ArticleControler.class).getAllArticles()).withRel("getAllArticles"), + linkTo(methodOn(ArticleControler.class).getArticlesPublishedBetween(beginning, end)).withRel("getArticlesPublishedBetween") + ); + } // endregion } diff --git a/WebService/src/main/java/SAE/ApiREST/WebService/controller/CollectController.java b/WebService/src/main/java/SAE/ApiREST/WebService/controller/CollectController.java index 18d41df..5e8cfc6 100644 --- a/WebService/src/main/java/SAE/ApiREST/WebService/controller/CollectController.java +++ b/WebService/src/main/java/SAE/ApiREST/WebService/controller/CollectController.java @@ -201,8 +201,8 @@ public class CollectController { return EntityModel.of(art, linkTo(methodOn(CollectController.class).getCollectionById(results.getId())).withSelfRel(), - //linkTo(methodOn(TeacherController.class).getTeachById(results.getTeacher().getId())).withSelfRel(), - //linkTo(methodOn(ArticleControler.class).getArticleById(art.getId())).withSelfRel(), + linkTo(methodOn(TeacherController.class).getTeachById(results.getTeacher().getId())).withSelfRel(), + linkTo(methodOn(ArticleControler.class).getArticleById(art.getId())).withSelfRel(), linkTo(methodOn(CollectController.class).getAllArticlesById(results.getId()) ).withRel("getAllArticlesById"), linkTo(methodOn(CollectController.class).deleteColletionById(results.getId()) diff --git a/WebService/src/main/java/SAE/ApiREST/WebService/controller/TeacherController.java b/WebService/src/main/java/SAE/ApiREST/WebService/controller/TeacherController.java index 95ac917..68673ee 100644 --- a/WebService/src/main/java/SAE/ApiREST/WebService/controller/TeacherController.java +++ b/WebService/src/main/java/SAE/ApiREST/WebService/controller/TeacherController.java @@ -1,8 +1,11 @@ package SAE.ApiREST.WebService.controller; +import SAE.ApiREST.WebService.exception.TeacherException; import SAE.ApiREST.WebService.model.Teacher; import SAE.ApiREST.WebService.service.ITeacherService; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.hateoas.CollectionModel; +import org.springframework.hateoas.EntityModel; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.stereotype.Controller; @@ -12,6 +15,9 @@ import javax.print.attribute.standard.Media; import java.awt.*; import java.util.List; +import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo; +import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.methodOn; + @Controller @RequestMapping("/ProfWebService") public class TeacherController { @@ -19,21 +25,77 @@ public class TeacherController { private ITeacherService iTeacherServ; - public TeacherController() { + public TeacherController(ITeacherService iserv) { + this.iTeacherServ = iserv; } @GetMapping(value = "/all", produces = MediaType.APPLICATION_JSON_VALUE) @ResponseStatus(HttpStatus.OK) - public @ResponseBody List getAllTeacher(){ - return iTeacherServ.getAllTeacher(); + public @ResponseBody CollectionModel getAllTeacher(){ + return CollectionModel.of( + iTeacherServ.getAllTeacher(), + linkTo(methodOn(TeacherController.class).getAllTeacher()).withSelfRel()); } - - @PostMapping(produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) + @PostMapping(value = "addTeacher",produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) @ResponseStatus(HttpStatus.CREATED) - public @ResponseBody Teacher createTeacher( @RequestBody Teacher teach){ - return teach; - } + public @ResponseBody EntityModel createTeacher( @RequestBody Teacher teach){ - //@GetMapping(value = "/{id}") - //public + return EntityModel.of(teach, + linkTo(methodOn(TeacherController.class).createTeacher(teach)).withSelfRel(), + linkTo(methodOn(TeacherController.class).getAllTeacher()).withRel("all")); + } + @GetMapping(value = "/getid/{id}") + public @ResponseBody EntityModel getTeachById(@PathVariable("id") Integer id){ + Teacher tt = iTeacherServ.getTeacherById(id); + if( tt == null ){ + throw new TeacherException("No teacher found for this id !"); + } + return EntityModel.of(tt, + linkTo(methodOn(TeacherController.class).getTeachById(id)).withSelfRel(), + linkTo(methodOn(TeacherController.class).getAllTeacher()).withRel("all")); + } + @GetMapping(value = "/getusername/{username}") + public @ResponseBody EntityModel getTeachByUsername(@PathVariable("username") String username) { + Teacher tt = iTeacherServ.getTeacherByUsername(username); + if (tt == null) { + throw new TeacherException("No teacher found for this username"); + } + return EntityModel.of(tt, + linkTo(methodOn(TeacherController.class).getTeachByUsername(username)).withSelfRel(), + linkTo(methodOn(TeacherController.class).getAllTeacher()).withRel("all")); + } + @GetMapping( value = "/getmail/{mail}" ) + public @ResponseBody EntityModel getTeachByMail(@PathVariable("mail") String mail) { + Teacher tt = iTeacherServ.getTeacherByMail(mail); + if( tt == null ) { + throw new TeacherException("No teacher found for this mail"); + } + return EntityModel.of(tt, + linkTo(methodOn(TeacherController.class).getTeachByMail(mail)).withSelfRel(), + linkTo(methodOn(TeacherController.class).getAllTeacher()).withRel("all")); + } + @GetMapping( value = "/getdate/{date}" ) + public @ResponseBody Teacher getTeachByDate(@PathVariable("date") String date) { + Teacher tt = iTeacherServ.getTeacherByMail(date); + if( tt == null ) { + throw new TeacherException("No teacher found for this mail"); + } + return tt; + } + @PutMapping( value = "/modify/{username}" ) + public @ResponseBody EntityModel modifyTeachUsername(@PathVariable("username") String username, Teacher tt){ + if( username == "" ){ + throw new TeacherException("Username provided for modification is empty"); + } + iTeacherServ.modifyUsername(tt,username); + return EntityModel.of(tt, + linkTo(methodOn(TeacherController.class).modifyTeachUsername(username,tt)).withSelfRel(), + linkTo(methodOn(TeacherController.class).getAllTeacher()).withRel("all")); + } + @DeleteMapping( value = "delete") + public @ResponseBody EntityModel> deleteTeacher(Integer id){ + return EntityModel.of(iTeacherServ.deleteTeacher(id), + linkTo(methodOn(TeacherController.class).deleteTeacher(id)).withSelfRel(), + linkTo(methodOn(TeacherController.class).getAllTeacher()).withRel("all")); + } } diff --git a/WebService/src/main/java/SAE/ApiREST/WebService/exception/TeacherAdvice.java b/WebService/src/main/java/SAE/ApiREST/WebService/exception/TeacherAdvice.java new file mode 100644 index 0000000..e781d8f --- /dev/null +++ b/WebService/src/main/java/SAE/ApiREST/WebService/exception/TeacherAdvice.java @@ -0,0 +1,17 @@ +package SAE.ApiREST.WebService.exception; + +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; + +@ControllerAdvice +public class TeacherAdvice { + @ResponseBody + @ExceptionHandler(TeacherException.class) + @ResponseStatus(HttpStatus.NOT_FOUND) + public String teacherNFHandler( TeacherException e) { + return e.getMessage(); + } +} diff --git a/WebService/src/main/java/SAE/ApiREST/WebService/exception/TeacherException.java b/WebService/src/main/java/SAE/ApiREST/WebService/exception/TeacherException.java new file mode 100644 index 0000000..ee61655 --- /dev/null +++ b/WebService/src/main/java/SAE/ApiREST/WebService/exception/TeacherException.java @@ -0,0 +1,7 @@ +package SAE.ApiREST.WebService.exception; + +public class TeacherException extends RuntimeException { + public TeacherException(String exception) { + super(exception); + } +} diff --git a/WebService/src/main/java/SAE/ApiREST/WebService/model/Article.java b/WebService/src/main/java/SAE/ApiREST/WebService/model/Article.java index 550d3b0..425a60c 100644 --- a/WebService/src/main/java/SAE/ApiREST/WebService/model/Article.java +++ b/WebService/src/main/java/SAE/ApiREST/WebService/model/Article.java @@ -2,6 +2,7 @@ package SAE.ApiREST.WebService.model; import java.time.LocalDate; +import java.time.format.DateTimeFormatter; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; @@ -12,32 +13,41 @@ import jakarta.persistence.Id; public class Article { @Id @GeneratedValue(strategy = GenerationType.AUTO) - String id; + Integer id; String title; - String URL; + String url; LocalDate dateAdded; LocalDate datePublished; - Boolean isVisible; + Boolean visible; Integer type; // ArrayList keywords = new ArrayList<>(); public Article() {} - public Article(String title, String URL, LocalDate dateAdded, LocalDate datePublished, Boolean visibility, Integer type) { - this.id = "1"; + public Article(String title, String url, LocalDate dateAdded, LocalDate datePublished, Boolean visibility, Integer type) { + this.id = 1; this.title = title; - this.URL = URL; + this.url = url; this.dateAdded = dateAdded; this.datePublished = datePublished; - this.isVisible = visibility; + this.visible = visibility; this.type = type; } - public String getId() { + public Article(String title, String url, String dateAdded, String datePublished, Boolean visibility, Integer type) { + this.id = 1; + this.title = title; + this.url = url; + this.dateAdded = LocalDate.parse(dateAdded, DateTimeFormatter.ofPattern("dd-MM-yyyy")); + this.datePublished = LocalDate.parse(datePublished, DateTimeFormatter.ofPattern("dd-MM-yyyy")); + this.visible = visibility; + this.type = type; + } + public Integer getId() { return this.id; } - public void setId(String id) { + public void setId(Integer id) { this.id = id; } @@ -49,36 +59,36 @@ public class Article { this.title = title; } - public String getURL() { - return this.URL; + public String getUrl() { + return this.url; } - public void setURL(String URL) { - this.URL = URL; + public void setUrl(String url) { + this.url = url; } public LocalDate getDateAdded() { return this.dateAdded; } - public void setDateAdded(LocalDate dateAdded) { - this.dateAdded = dateAdded; + public void setDateAdded(String dateAdded) { + this.dateAdded = LocalDate.parse(dateAdded, DateTimeFormatter.ofPattern("dd-MM-yyyy")); } public LocalDate getDatePublished() { return this.datePublished; } - public void setDatePublished(LocalDate datePublished) { - this.datePublished = datePublished; + public void setDatePublished(String datePublished) { + this.datePublished = LocalDate.parse(datePublished, DateTimeFormatter.ofPattern("dd-MM-yyyy")); } - public Boolean isVisible() { - return this.isVisible; + public Boolean getVisible() { + return this.visible; } - public void setVisibility(Boolean isVisible) { - this.isVisible = isVisible; + public void setVisibility(Boolean visible) { + this.visible = visible; } public Integer getType() { diff --git a/WebService/src/main/java/SAE/ApiREST/WebService/model/Teacher.java b/WebService/src/main/java/SAE/ApiREST/WebService/model/Teacher.java index ce4cd66..dfe9bfb 100644 --- a/WebService/src/main/java/SAE/ApiREST/WebService/model/Teacher.java +++ b/WebService/src/main/java/SAE/ApiREST/WebService/model/Teacher.java @@ -4,7 +4,6 @@ import jakarta.persistence.Id; import java.time.LocalDate; import java.time.format.DateTimeFormatter; -import java.util.Date; @Entity @@ -38,8 +37,8 @@ public class Teacher { return date; } - public void setDate(LocalDate date) { - this.date = date; + public void setDate(String date) { + this.date = LocalDate.parse(date, DateTimeFormatter.ofPattern("dd-MM-yyyy")); } public String getMail() { diff --git a/WebService/src/main/java/SAE/ApiREST/WebService/service/IArticleService.java b/WebService/src/main/java/SAE/ApiREST/WebService/service/IArticleService.java index 427d987..38d0f82 100644 --- a/WebService/src/main/java/SAE/ApiREST/WebService/service/IArticleService.java +++ b/WebService/src/main/java/SAE/ApiREST/WebService/service/IArticleService.java @@ -2,14 +2,29 @@ package SAE.ApiREST.WebService.service; import java.util.List; +import SAE.ApiREST.WebService.Response; import SAE.ApiREST.WebService.model.Article; public interface IArticleService { + // region POST + public Response addArticle(Article article); + // endregion + + // region PUT + public Article updateTitle(Article article, String title); + public Article updateUrl(Article article, String url); + public Article updateDatePublished(Article article, String datePublished); + public Article updateDateAdded(Article article, String dateAdded); + public Article changeVisibility(Article article); + public Article updateType(Article article, Integer type); + // endregion + // region GET public List
getAllArticles(); Article getArticlesById(Integer id); public List
getArticlesByTitle(String title); + public List
getArticlesByUrl(String url); public List
getArticlesByType(Integer type); public List
getVisibleArticles(); public List
getInvisibleArticles(); @@ -21,4 +36,16 @@ public interface IArticleService { public List
getArticlesPublishedBetween(String beginning, String end); // endregion + // region DELETE + public Response deleteArticleFromId(Integer id); + public Response deleteArticleFromTitle(String title); + public Response deleteArticleFromUrl(String url); + public Response deleteArticleFromType(Integer type); + public Response deleteArticleAddedBefore(String date); + public Response deleteArticleAddedAfter(String date); + public Response deleteArticleAddedBetween(String beginning, String end); + public Response deleteArticlePublishedBefore(String date); + public Response deleteArticlePublishedAfter(String date); + public Response deleteArticlePublishedBetween(String beginning, String end); + // endregion } diff --git a/WebService/src/main/java/SAE/ApiREST/WebService/service/ITeacherService.java b/WebService/src/main/java/SAE/ApiREST/WebService/service/ITeacherService.java index 329a2de..ed7b4b6 100644 --- a/WebService/src/main/java/SAE/ApiREST/WebService/service/ITeacherService.java +++ b/WebService/src/main/java/SAE/ApiREST/WebService/service/ITeacherService.java @@ -1,21 +1,17 @@ package SAE.ApiREST.WebService.service; +import SAE.ApiREST.WebService.Response; import SAE.ApiREST.WebService.model.Teacher; -import java.time.LocalDate; import java.util.List; public interface ITeacherService { - - //Todo() by id, by mail, by username, allProf, by date (order), suppression, ajout, FAIRE DES REGIONS! public List getAllTeacher(); - - Teacher getTeacherById(Integer id); - + public Teacher getTeacherById(Integer id); public Teacher getTeacherByUsername(String username); public Teacher getTeacherByMail(String mail); public Teacher getTeacherByDate(String date); public List addTeacher(Teacher t); - public List deleteTeacher(Integer id); + public Response modifyUsername(Teacher t, String newUsername); } diff --git a/WebService/src/main/java/SAE/ApiREST/WebService/service/StubArticleService.java b/WebService/src/main/java/SAE/ApiREST/WebService/service/StubArticleService.java index 2ea238a..9c17905 100644 --- a/WebService/src/main/java/SAE/ApiREST/WebService/service/StubArticleService.java +++ b/WebService/src/main/java/SAE/ApiREST/WebService/service/StubArticleService.java @@ -7,11 +7,66 @@ import java.util.List; import org.springframework.stereotype.Service; +import SAE.ApiREST.WebService.Response; import SAE.ApiREST.WebService.model.Article; @Service public class StubArticleService implements IArticleService { + // region POST + @Override + public Response addArticle(Article article) { + return new Response( + article.getId(), + "Article successfully created" + ); + } + // endregion + + // region PUT + @Override + public Article updateTitle(Article article, String title) { + Article newArticle = article; + newArticle.setTitle(title); + return newArticle; + } + + @Override + public Article updateUrl(Article article, String url) { + Article newArticle = article; + newArticle.setUrl(url); + return newArticle; + } + + @Override + public Article updateDatePublished(Article article, String datePublished) { + Article newArticle = article; + newArticle.setDatePublished(datePublished); + return newArticle; + } + + @Override + public Article updateDateAdded(Article article, String dateAdded) { + Article newArticle = article; + newArticle.setDateAdded(dateAdded); + return newArticle; + } + + @Override + public Article changeVisibility(Article article) { + Article newArticle = article; + newArticle.setVisibility(!article.getVisible()); + return newArticle; + } + + @Override + public Article updateType(Article article, Integer type) { + Article newArticle = article; + newArticle.setType(type); + return newArticle; + } + // endregion + // region GET @Override public List
getAllArticles() { @@ -80,6 +135,22 @@ public class StubArticleService implements IArticleService { return articles; } + @Override + public List
getArticlesByUrl(String url) { + List
articles = new ArrayList<>(); + + articles.add(new Article( + "title", + url, + LocalDate.now().minusMonths(1), + LocalDate.now().minusMonths(2), + true, + 1) + ); + + return articles; + } + @Override public List
getArticlesByType(Integer type) { List
articles = new ArrayList<>(); @@ -224,4 +295,86 @@ public class StubArticleService implements IArticleService { return articles; } // endregion -} + + // region DELETE + @Override + public Response deleteArticleFromId(Integer id) { + return new Response( + id, + "Article successfully deleted" + ); + } + + @Override + public Response deleteArticleFromUrl(String url) { + return new Response( + 1, + "Article successfully deleted" + ); + } + + @Override + public Response deleteArticleFromType(Integer type) { + return new Response( + 1, + "Article successfully deleted" + ); + } + + @Override + public Response deleteArticleFromTitle(String title) { + return new Response( + 1, + "Article successfully deleted" + ); + } + + @Override + public Response deleteArticleAddedBefore(String url) { + return new Response( + 1, + "Article successfully deleted" + ); + } + + @Override + public Response deleteArticleAddedAfter(String url) { + return new Response( + 1, + "Article successfully deleted" + ); + } + + @Override + public Response deleteArticleAddedBetween(String beginning, String end) { + return new Response( + 1, + "Article successfully deleted" + ); + } + + @Override + public Response deleteArticlePublishedBefore(String url) { + return new Response( + 1, + "Article successfully deleted" + ); + } + + @Override + public Response deleteArticlePublishedAfter(String url) { + return new Response( + 1, + "Article successfully deleted" + ); + } + + @Override + public Response deleteArticlePublishedBetween(String beginning, String end) { + return new Response( + 1, + "Article successfully deleted" + ); + } + // endregion +} \ No newline at end of file diff --git a/WebService/src/main/java/SAE/ApiREST/WebService/service/TeacherServiceStub.java b/WebService/src/main/java/SAE/ApiREST/WebService/service/TeacherServiceStub.java index 0b494f8..cd9dc01 100644 --- a/WebService/src/main/java/SAE/ApiREST/WebService/service/TeacherServiceStub.java +++ b/WebService/src/main/java/SAE/ApiREST/WebService/service/TeacherServiceStub.java @@ -1,18 +1,16 @@ package SAE.ApiREST.WebService.service; +import SAE.ApiREST.WebService.Response; +import SAE.ApiREST.WebService.exception.TeacherException; import SAE.ApiREST.WebService.model.Teacher; import org.springframework.stereotype.Service; -import java.time.LocalDate; -import java.time.format.DateTimeFormatter; - import java.util.ArrayList; import java.util.List; @Service public class TeacherServiceStub implements ITeacherService { - //todo() recevoir collections, ajouter collections, supprimer collections @Override public List getAllTeacher() { List allTeacher = new ArrayList(); @@ -31,9 +29,7 @@ public class TeacherServiceStub implements ITeacherService { } @Override - public Teacher getTeacherByUsername(String username) { - return new Teacher(12, "30-08-2020", "dadadou@gmail.com", username); - } + public Teacher getTeacherByUsername(String username) { return new Teacher(12, "30-08-2020", "dadadou@gmail.com", username); } @Override public Teacher getTeacherByMail(String mail) { @@ -59,7 +55,15 @@ public class TeacherServiceStub implements ITeacherService { allTeacher.add(new Teacher(1,"12-01-2023", "aline.alipres@gmail.com", "MsGarconManque")); allTeacher.add(new Teacher(2, "20-08-2023", "Viviane.Delvecchio@gmail.com", "MmeMath")); - allTeacher.remove(getTeacherById(id)); - return allTeacher; + if(allTeacher.remove(getTeacherById(id))){ + return allTeacher; + } else { + throw new TeacherException(String.format("Teacher {id} isn't removed", id)); + } + } + + public Response modifyUsername(Teacher t, String newUsername){ + t.setUsername(newUsername); + return new Response(t.getId(),String.format("This user %s has changed username", t.getMail())); } }