diff --git a/src/main/java/fr/ulille/iut/pizzaland/ApiV1.java b/src/main/java/fr/ulille/iut/pizzaland/ApiV1.java index 34ff93594e2fafb7e191935d7a48968a946e90c1..2fd7689ad93685ca2639b65cf71ebbb71b551d8b 100644 --- a/src/main/java/fr/ulille/iut/pizzaland/ApiV1.java +++ b/src/main/java/fr/ulille/iut/pizzaland/ApiV1.java @@ -7,6 +7,7 @@ import java.util.logging.Logger; import javax.ws.rs.ApplicationPath; import fr.ulille.iut.pizzaland.beans.Ingredient; import fr.ulille.iut.pizzaland.dao.IngredientDao; +import fr.ulille.iut.pizzaland.dao.PizzaDao; import java.io.FileReader; import java.io.IOException; @@ -38,6 +39,10 @@ public class ApiV1 extends ResourceConfig { for ( Ingredient ingredient: ingredients) { ingredientDao.insert(ingredient.getName()); } + + PizzaDao pizzaDao = BDDFactory.buildDao(PizzaDao.class); + + } catch ( Exception ex ) { throw new IllegalStateException(ex); } diff --git a/src/main/java/fr/ulille/iut/pizzaland/dao/PizzaDao.java b/src/main/java/fr/ulille/iut/pizzaland/dao/PizzaDao.java index 626ba350df63893adc31034d49c9a2eb8597777e..2eafe9c662ae186bbbc841620d6dfb357366e0ed 100644 --- a/src/main/java/fr/ulille/iut/pizzaland/dao/PizzaDao.java +++ b/src/main/java/fr/ulille/iut/pizzaland/dao/PizzaDao.java @@ -1,14 +1,24 @@ package fr.ulille.iut.pizzaland.dao; +import java.util.List; + +import org.jdbi.v3.sqlobject.config.RegisterBeanMapper; +import org.jdbi.v3.sqlobject.statement.GetGeneratedKeys; +import org.jdbi.v3.sqlobject.statement.SqlQuery; import org.jdbi.v3.sqlobject.statement.SqlUpdate; import org.jdbi.v3.sqlobject.transaction.Transaction; +import fr.ulille.iut.pizzaland.beans.Pizza; + public interface PizzaDao { - @SqlUpdate("CREATE TABLE IF NOT EXISTS Pizzas ....") + @SqlUpdate("CREATE TABLE IF NOT EXISTS Pizzas (id INTEGER PRIMARY KEY, name VARCHAR UNIQUE NOT NULL") void createPizzaTable(); - @SqlUpdate("CREATE TABLE IF NOT EXISTS PizzaIngredientsAssociation .....") + @SqlUpdate("CREATE TABLE IF NOT EXISTS PizzaIngredientsAssociation(pizza Integer," + +"ingredient INTEGER," + + "PRIMARY KEY(pizza, ingredient),"+"FOREIGN KEY(pizza) REFERENCES Pizzas(id)," + +"FOREIGN KEY(ingredient) REFERENCES ingredient(id))") void createAssociationTable(); @Transaction @@ -17,4 +27,32 @@ public interface PizzaDao { createPizzaTable(); } + + @SqlUpdate("DROP TABLE IF EXISTS Pizzas") + void dropTablePizza(); + + @SqlUpdate("DROP TABLE IF EXISTS pizzaIngredientsAssociation") + void dropTableAssociations(); + + @SqlQuery("SELECT * FROM Pizzas") + @RegisterBeanMapper(Pizza.class) + List<Pizza> getAll(); + + + @SqlQuery("SELECT * FROM Pizzas WHERE id = :id") + @RegisterBeanMapper(Pizza.class) + Pizza findById(long id); + + @SqlQuery("SELECT * FROM Pizzas WHERE name = :name") + @RegisterBeanMapper(Pizza.class) + Pizza findByName(String name); + + @SqlUpdate("INSERT INTO Pizzas (name) VALUES(:name)") + @GetGeneratedKeys + long insert(String name); + + @SqlUpdate("DELETE FROM Pizzas WHERE id = :id") + void remove(long id); + + } \ No newline at end of file diff --git a/src/main/java/fr/ulille/iut/pizzaland/resources/PizzaResource.java b/src/main/java/fr/ulille/iut/pizzaland/resources/PizzaResource.java new file mode 100644 index 0000000000000000000000000000000000000000..891a3c8d84d2b28eba08a3347e7a3fd069d012ba --- /dev/null +++ b/src/main/java/fr/ulille/iut/pizzaland/resources/PizzaResource.java @@ -0,0 +1,144 @@ +package fr.ulille.iut.pizzaland.resources; + +import java.net.URI; +import java.util.List; +import java.util.ArrayList; +import java.util.logging.Logger; + +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.UriInfo; + +import org.slf4j.LoggerFactory; + +import javax.ws.rs.PathParam; +import javax.ws.rs.Consumes; +import javax.ws.rs.DELETE; +import javax.ws.rs.FormParam; + +import fr.ulille.iut.pizzaland.beans.Ingredient; +import fr.ulille.iut.pizzaland.beans.Pizza; +import fr.ulille.iut.pizzaland.dto.IngredientDto; +import fr.ulille.iut.pizzaland.dto.PizzaCreateDto; +import fr.ulille.iut.pizzaland.dto.PizzaDto; +import fr.ulille.iut.pizzaland.BDDFactory; +import fr.ulille.iut.pizzaland.dao.IngredientDao; +import fr.ulille.iut.pizzaland.dao.PizzaDao; + +import java.util.stream.Collectors; +import javax.ws.rs.POST; +import fr.ulille.iut.pizzaland.dto.IngredientCreateDto; +import javax.ws.rs.WebApplicationException; + +@Path("/pizzas") +public class PizzaResource { + final static Logger LOGGER = Logger.getLogger(PizzaResource.class.getName()); + @Context + public UriInfo uriInfo; + + private PizzaDao pizzas; + + + public PizzaResource() { + pizzas = BDDFactory.buildDao(PizzaDao.class); + pizzas.createPizzaTable(); + } + + @GET + public List<PizzaDto> getAll() { + LOGGER.info("PizzaResource:getAll"); + + List<PizzaDto> l = pizzas.getAll().stream().map(Pizza::toDto).collect(Collectors.toList()); + return l; + } + + @GET + @Path("{id}") + public PizzaDto getOnePizza(@PathParam("id") long id) { + LOGGER.info("getOnePizza(" + id + ")"); + try { + Pizza pizza = pizzas.findById(id); + return Pizza.toDto(pizza); + } catch (Exception e) { + // Cette exception générera une réponse avec une erreur 404 + throw new WebApplicationException(Response.Status.NOT_FOUND); + } + } + + @POST + public Response createPizza(PizzaCreateDto pizzaCreateDto) { + Pizza existing = pizzas.findByName(pizzaCreateDto.getName()); + if (existing != null) { + throw new WebApplicationException(Response.Status.CONFLICT); + } + + try { + Pizza pizza = Pizza.fromPizzaCreateDto(pizzaCreateDto); + long id = pizzas.insert(pizza.getName()); + pizza.setId(id); + PizzaDto pizzaDto = Pizza.toDto(pizza); + + URI uri = uriInfo.getAbsolutePathBuilder().path("" + id).build(); + + return Response.created(uri).entity(pizzaDto).build(); + } catch (Exception e) { + e.printStackTrace(); + throw new WebApplicationException(Response.Status.NOT_ACCEPTABLE); + } + } + + @DELETE + @Path("{id}") + public Response deletePizza(@PathParam("id") long id) { + if ( pizzas.findById(id) == null ) { + throw new WebApplicationException(Response.Status.NOT_FOUND); + } + + pizzas.remove(id); + + return Response.status(Response.Status.ACCEPTED).build(); + } + + @GET + @Path("{id}/name") + public String getPizzaName(@PathParam("id") long id) { + Pizza pizza= pizzas.findById(id); + if ( pizza == null ) { + throw new WebApplicationException(Response.Status.NOT_FOUND); + } + + return pizza.getName(); + } + + @POST + @Consumes("application/x-www-form-urlencoded") + public Response createPizza(@FormParam("name") String name) { + Pizza existing = pizzas.findByName(name); + if ( existing != null ) { + throw new WebApplicationException(Response.Status.CONFLICT); + } + + try { + Pizza pizza = new Pizza(); + pizza.setName(name); + + long id = pizzas.insert(pizza.getName()); + pizza.setId(id); + PizzaDto pizzaDto = Pizza.toDto(pizza); + + URI uri = uriInfo.getAbsolutePathBuilder().path("" + id).build(); + + return Response.created(uri).entity(pizzaDto).build(); + } + catch ( Exception e ) { + e.printStackTrace(); + throw new WebApplicationException(Response.Status.NOT_ACCEPTABLE); + } + } + + + + +}