diff --git a/src/main/java/com/example/apispringgradleb2boost/controller/PartnerController.java b/src/main/java/com/example/apispringgradleb2boost/controller/PartnerController.java index 68f42d0..3857803 100644 --- a/src/main/java/com/example/apispringgradleb2boost/controller/PartnerController.java +++ b/src/main/java/com/example/apispringgradleb2boost/controller/PartnerController.java @@ -5,59 +5,144 @@ import com.example.apispringgradleb2boost.model.Partner; import com.example.apispringgradleb2boost.service.PartnerService; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.PageRequest; import org.springframework.data.repository.query.Param; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import com.google.gson.Gson; import javax.servlet.http.HttpServletResponse; -import javax.validation.constraints.Min; import java.io.IOException; import java.io.PrintWriter; import java.util.Optional; @RestController -@Validated public class PartnerController { @Autowired PartnerService partnerService; + /** + * Read - Get all partners + * + * @return - An Iterable object of Partner + */ @GetMapping("/partners") - public Iterable getPartners(@Param("from") @Min(0) final Integer from, @Param("size") @Min(1) final Integer size) { + public Iterable getPartners(@Param("from") final Integer from, @Param("size") final Integer size) { if (from != null && size != null) { return partnerService.getPartners(from, size); } return partnerService.getPartners(); } + /** + * Read - Get one partner + * + * @param Id The id of the partner + * @param response + * @return A Partner object + */ @GetMapping("/partner/{id}") - public Partner getPartnerById(@PathVariable("id") @Min(1) final Long Id, HttpServletResponse response) throws IOException { + public Partner getPartnerById(@PathVariable("id") final Long Id, HttpServletResponse response) throws IOException { Optional partner = partnerService.getPartnerById(Id); if (partner.isPresent()) { return partner.get(); } else { // Error handling when !partner.isPresent() - response.setStatus(HttpStatus.NOT_FOUND.value()); - response.setContentType(String.valueOf(MediaType.APPLICATION_JSON)); - response.setCharacterEncoding("UTF-8"); - - PrintWriter out = response.getWriter(); - out.print(new Gson().toJson( - new CustomError(HttpStatus.NOT_FOUND.value(), - String.format("Partner with id %d not found!", Id)) - )); - out.flush(); + handlePartnerResourceIsNotPresentReturnNotFound(Id, response); return null; } } + /** + * Create - Add a new partner + * + * @param partner An object partner + * @return The partner object saved + */ + @PostMapping("/partner") + public Partner createPartner(@RequestBody Partner partner) { + return partnerService.savePartner(partner); + } + + /** + * Update - Update an existing partner + * + * @param Id - The id of the partner to update + * @param partner - The partner object updated + * @param response + * @return The partner object updated + */ + @PutMapping("/partner/{id}") + public Partner updatePartner(@PathVariable("id") final Long Id, @RequestBody Partner partner, + HttpServletResponse response) throws IOException { + + Optional p = partnerService.getPartnerById(Id); + if (p.isPresent()) { + Partner currentPartner = p.get(); + + String name = partner.getName(); + if (name != null) { + currentPartner.setName(name); + } + String reference = partner.getReference(); + if (reference != null) { + currentPartner.setReference(reference); + } + String locale = partner.getLocale(); + if (locale != null) { + currentPartner.setLocale(locale); + } + String expirationTime = partner.getExpirationTime(); + if (expirationTime != null) { + currentPartner.setExpirationTime(expirationTime); + } + partnerService.savePartner(currentPartner); + return currentPartner; + } else { + handlePartnerResourceIsNotPresentReturnNotFound(Id, response); + return null; + } + } + + /** + * Delete - Delete a partner + * + * @param response + * @param Id - The id of the partner to delete + */ + @DeleteMapping("/partner/{id}") + public void deletePartner(@PathVariable("id") final Long Id, HttpServletResponse response) throws IOException { + Optional partner = partnerService.getPartnerById(Id); + if (partner.isPresent()) { + partnerService.deletePartner(Id); + } else { + handlePartnerResourceIsNotPresentReturnNotFound(Id, response); + } + + } + + /** + * Partner not found handling - Extraction of duplicated code for + * + * @param Id + * @param response + * @throws IOException + */ + private void handlePartnerResourceIsNotPresentReturnNotFound(@PathVariable("id") Long Id, HttpServletResponse response) throws IOException { + // Error handling when !partner.isPresent() + response.setStatus(HttpStatus.NOT_FOUND.value()); + response.setContentType(String.valueOf(MediaType.APPLICATION_JSON)); + response.setCharacterEncoding("UTF-8"); + + PrintWriter out = response.getWriter(); + out.print(new Gson().toJson( + new CustomError(HttpStatus.NOT_FOUND.value(), + String.format("Partner with id %d not found!", Id)) + )); + out.flush(); + } + } diff --git a/src/main/java/com/example/apispringgradleb2boost/model/Partner.java b/src/main/java/com/example/apispringgradleb2boost/model/Partner.java index e4668d1..079c1bf 100644 --- a/src/main/java/com/example/apispringgradleb2boost/model/Partner.java +++ b/src/main/java/com/example/apispringgradleb2boost/model/Partner.java @@ -2,22 +2,20 @@ package com.example.apispringgradleb2boost.model; import lombok.Data; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; +import javax.persistence.*; @Data @Entity @Table(name = "partners") public class Partner { @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "company_name") private String name; - @Column(name = "ref") + @Column(name = "ref", unique=true) private String reference; private String locale; diff --git a/src/main/java/com/example/apispringgradleb2boost/service/PartnerService.java b/src/main/java/com/example/apispringgradleb2boost/service/PartnerService.java index 34d004d..336a037 100644 --- a/src/main/java/com/example/apispringgradleb2boost/service/PartnerService.java +++ b/src/main/java/com/example/apispringgradleb2boost/service/PartnerService.java @@ -4,18 +4,18 @@ import com.example.apispringgradleb2boost.model.Partner; import com.example.apispringgradleb2boost.repository.PartnerRepository; import lombok.Data; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; - +import javax.validation.constraints.Min; import java.util.Optional; @Data @Service +@Validated public class PartnerService { - // TODO : service layer will be transactional and encapsulate all validation and database interactions @Autowired private PartnerRepository partnerRepository; @@ -24,12 +24,20 @@ public class PartnerService { return partnerRepository.findAll(); } - public Iterable getPartners(int from, int size) { + public Iterable getPartners(@Min(0) final int from, @Min(1) final int size) { Pageable pageable = PageRequest.of(from, size); return partnerRepository.findAll(pageable); } - public Optional getPartnerById(Long Id) { + public Optional getPartnerById(@Min(1) final Long Id) { return partnerRepository.findById(Id); } + + public Partner savePartner(Partner partner) { + return partnerRepository.save(partner); + } + + public void deletePartner(@Min(0) final Long Id) { + partnerRepository.deleteById(Id); + } } diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql index 7969917..b4706b1 100644 --- a/src/main/resources/schema.sql +++ b/src/main/resources/schema.sql @@ -2,7 +2,7 @@ CREATE TABLE partners ( id INT AUTO_INCREMENT PRIMARY KEY, company_name VARCHAR(250) NOT NULL, - ref VARCHAR(250) NOT NULL, + ref VARCHAR(250) UNIQUE NOT NULL, locale VARCHAR(250) NOT NULL, expires DATETIME NOT NULL ); \ No newline at end of file