diff --git a/src/main/java/fr/ulille/iut/pizzaland/ApiV1.java b/src/main/java/fr/ulille/iut/pizzaland/ApiV1.java
index b565c8399d5213fc5b2335568b0224cea580b1e5..f40e989a7661fecbb76adf75586adbd38ac80276 100644
--- a/src/main/java/fr/ulille/iut/pizzaland/ApiV1.java
+++ b/src/main/java/fr/ulille/iut/pizzaland/ApiV1.java
@@ -2,8 +2,16 @@ package fr.ulille.iut.pizzaland;
 
 import org.glassfish.jersey.server.ResourceConfig;
 
+import fr.ulille.iut.pizzaland.beans.Ingredient;
+import fr.ulille.iut.pizzaland.dao.IngredientDAO;
+
+import java.io.FileReader;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.logging.Logger;
 
+import javax.json.bind.Jsonb;
+import javax.json.bind.JsonbBuilder;
 import javax.ws.rs.ApplicationPath;
 
 @ApplicationPath("api/v1/")
@@ -12,5 +20,26 @@ public class ApiV1 extends ResourceConfig {
 
     public ApiV1() {
         packages("fr.ulille.iut.pizzaland");
+        
+        String environment = System.getenv("PIZZAENV");
+
+        if ( environment != null && environment.equals("withdb") ) {
+      	LOGGER.info("Loading with database");
+          Jsonb jsonb = JsonbBuilder.create();
+          try {
+      		FileReader reader = new FileReader( getClass().getClassLoader().getResource("ingredients.json").getFile() );
+              List<Ingredient> ingredients = JsonbBuilder.create().fromJson(reader, new ArrayList<Ingredient>(){}.getClass().getGenericSuperclass());
+                  
+              IngredientDAO ingredientDao = BDDFactory.buildDao(IngredientDAO.class);
+              ingredientDao.dropTable();
+              ingredientDao.createTable();
+              for ( Ingredient ingredient: ingredients) {
+                   ingredientDao.insert(ingredient.getName());              
+              }
+      	} catch ( Exception ex ) {
+      		throw new IllegalStateException(ex);
+          }
+        } 
+
     }
 }
diff --git a/src/main/java/fr/ulille/iut/pizzaland/BDDFactory.java b/src/main/java/fr/ulille/iut/pizzaland/BDDFactory.java
index 31845d1cd16ab4956c263d903daf752b51cbbd77..9f601c183e5fc35dd12f9a2a7dbc5602feb2723e 100644
--- a/src/main/java/fr/ulille/iut/pizzaland/BDDFactory.java
+++ b/src/main/java/fr/ulille/iut/pizzaland/BDDFactory.java
@@ -10,15 +10,12 @@ import org.jdbi.v3.sqlobject.SqlObjectPlugin;
 
 public class BDDFactory {
     private static Jdbi jdbi = null;
-    private static String dbPath = "jdbc:sqlite:"
-	+ System.getProperty("java.io.tmpdir")
-	+ System.getProperty("file.separator")
-	+ System.getProperty("user.name")
-	+ "_";
-	
+
     public static Jdbi getJdbi() {
         if ( jdbi == null ) {
-            jdbi = Jdbi.create(dbPath + "pizza.db")
+            jdbi = Jdbi.create("jdbc:sqlite:"
+                + System.getProperty("java.io.tmpdir")
+                + System.getProperty("file.separator") + "pizza.db")
                 .installPlugin(new SQLitePlugin())
                 .installPlugin(new SqlObjectPlugin());
         }
@@ -27,7 +24,9 @@ public class BDDFactory {
 
     public static void setJdbiForTests() {
         if ( jdbi == null ) {
-            jdbi = Jdbi.create(dbPath + "pizza_test.db")
+            jdbi = Jdbi.create("jdbc:sqlite:"
+                + System.getProperty("java.io.tmpdir")
+                + System.getProperty("file.separator") + "pizza_test.db")
             .installPlugin(new SQLitePlugin())
             .installPlugin(new SqlObjectPlugin());
         }
@@ -44,4 +43,4 @@ public class BDDFactory {
     public static <T> T buildDao(Class<T> daoClass) {
         return getJdbi().onDemand(daoClass);
     }   
-}
+}
\ No newline at end of file
diff --git a/src/main/java/fr/ulille/iut/pizzaland/beans/Ingredient.java b/src/main/java/fr/ulille/iut/pizzaland/beans/Ingredient.java
new file mode 100644
index 0000000000000000000000000000000000000000..4f5831ad02db6703cacf82594321f7e9e626e9f8
--- /dev/null
+++ b/src/main/java/fr/ulille/iut/pizzaland/beans/Ingredient.java
@@ -0,0 +1,93 @@
+package fr.ulille.iut.pizzaland.beans;
+
+import fr.ulille.iut.pizzaland.dto.IngredientCreateDto;
+import fr.ulille.iut.pizzaland.dto.IngredientDto;
+
+public class Ingredient {
+	
+	private long id;
+	private String name;
+	
+	public Ingredient() {
+		
+	}
+	
+	public Ingredient(long id, String name) {
+		this.id = id;
+		this.name = name;
+	}
+
+	public void setId(long id) {
+		this.id = id;
+	}
+	
+	public long getId() {
+		return this.id;
+	}
+
+	public void setName(String name) {
+	this.name=name;
+	}
+	
+	public String getName() {
+		return this.name;
+	}
+
+	public static Ingredient fromDto(IngredientDto dto) {
+		Ingredient ingredient = new Ingredient();
+		ingredient.setId(dto.getId());
+		ingredient.setName(dto.getName());
+		
+		return ingredient;
+	}
+
+	public static IngredientDto toDto(Ingredient ingredient) {
+		IngredientDto dto = new IngredientDto();
+		dto.setId(ingredient.getId());
+		dto.setName(ingredient.getName());
+		
+		return dto;
+	}
+	
+	@Override
+	public boolean equals(Object obj) {
+		if (this == obj)
+	        return true;
+		if (obj == null)
+	        return false;
+	    if (getClass() != obj.getClass())
+	        return false;
+	    Ingredient other = (Ingredient) obj;
+	    if (id != other.id)
+	    	return false;
+	    if (name == null) {
+	    	if (other.name != null)
+	        	return false;
+	    } else if (!name.equals(other.name))
+	    	return false;
+	    return true;
+	}
+
+	  @Override
+	  public String toString() {
+	    return "Ingredient [id=" + id + ", name=" + name + "]";
+	  }
+
+	
+	public static IngredientCreateDto toCreateDto(Ingredient ingredient) {
+	    IngredientCreateDto dto = new IngredientCreateDto();
+	    dto.setName(ingredient.getName());
+	    
+	    return dto;
+	}
+
+	public static Ingredient fromIngredientCreateDto(IngredientCreateDto dto) {
+		Ingredient ingredient = new Ingredient();
+	    ingredient.setName(dto.getName());
+
+	    return ingredient;
+	}
+
+
+
+}
diff --git a/src/main/java/fr/ulille/iut/pizzaland/beans/Pizza.java b/src/main/java/fr/ulille/iut/pizzaland/beans/Pizza.java
new file mode 100644
index 0000000000000000000000000000000000000000..215cd4fa4fc4d80ade108c11b78b0b5a98ce76ca
--- /dev/null
+++ b/src/main/java/fr/ulille/iut/pizzaland/beans/Pizza.java
@@ -0,0 +1,99 @@
+package fr.ulille.iut.pizzaland.beans;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import fr.ulille.iut.pizzaland.dto.PizzaCreateDto;
+import fr.ulille.iut.pizzaland.dto.PizzaDto;
+
+public class Pizza {
+	
+	private long id;
+	private String name;
+	private List<Ingredient> ingredients = new ArrayList<Ingredient>();
+	
+	public Pizza(long id, String name) {
+		this.id = id;
+		this.name = name;
+	}
+	
+	public Pizza() {
+		
+	}
+	
+	public void setId(long id) {
+		this.id = id;
+	}
+	
+	public long getId() {
+		return this.id;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+	
+	public String getName() {
+		return this.name;
+	}
+	
+	public List<Ingredient> getIngredients(){
+		return this.ingredients;
+	}
+
+	public void addIngredient(Ingredient ingredient) {
+		this.ingredients.add(ingredient);
+	}
+	
+	private void setIngredient(List<Ingredient> ingredients) {
+		this.ingredients = ingredients;
+	}
+
+	public static PizzaDto toDto(Pizza pizza) {
+	    PizzaDto dto = new PizzaDto();
+	    dto.setId(pizza.getId());
+	    dto.setName(pizza.getName());
+
+	    return dto;
+	  }
+
+	  public static Pizza fromDto(PizzaDto dto) {
+	    Pizza pizza = new Pizza();
+	    pizza.setId(dto.getId());
+	    pizza.setName(dto.getName());
+
+	    return pizza;
+	  }
+	  
+	  @Override
+	  public boolean equals(Object obj) {
+	    if (this == obj)
+	        return true;
+	    if (obj == null)
+	        return false;
+	    if (getClass() != obj.getClass())
+	        return false;
+	    Pizza other = (Pizza) obj;
+	    if (id != other.id)
+	        return false;
+	    if (name == null) {
+	        if (other.name != null)
+	            return false;
+	    } else if (!name.equals(other.name))
+	        return false;
+	    return true;
+	  }
+
+	  @Override
+	  public String toString() {
+	    return "Pizza [id=" + id + ", name=" + name + "]";
+	  }
+
+	public static Pizza fromPizzaCreateDto(PizzaCreateDto dtoCreate) {
+		Pizza pizza = new Pizza();
+		pizza.setName(dtoCreate.getName());
+		pizza.setIngredient(dtoCreate.getIngredients());
+		return pizza;
+	}
+}
+
diff --git a/src/main/java/fr/ulille/iut/pizzaland/dao/IngredientDAO.java b/src/main/java/fr/ulille/iut/pizzaland/dao/IngredientDAO.java
new file mode 100644
index 0000000000000000000000000000000000000000..fde2eddfcb03b20e02c010960b1970877dac5c1f
--- /dev/null
+++ b/src/main/java/fr/ulille/iut/pizzaland/dao/IngredientDAO.java
@@ -0,0 +1,39 @@
+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 fr.ulille.iut.pizzaland.beans.Ingredient;
+
+public interface IngredientDAO {
+	
+	 @SqlUpdate("CREATE TABLE IF NOT EXISTS ingredients (id INTEGER PRIMARY KEY, name VARCHAR UNIQUE NOT NULL)")
+	  void createTable();
+
+	  @SqlUpdate("DROP TABLE IF EXISTS ingredients")
+	  void dropTable();
+
+	  @SqlUpdate("INSERT INTO ingredients (name) VALUES (:name)")
+	  @GetGeneratedKeys
+	  long insert(String name);
+
+	  @SqlQuery("SELECT * FROM ingredients")
+	  @RegisterBeanMapper(Ingredient.class)
+	  List<Ingredient> getAll();
+
+	  @SqlQuery("SELECT * FROM ingredients WHERE id = :id")
+	  @RegisterBeanMapper(Ingredient.class)
+	  Ingredient findById(long id);
+
+	  @SqlQuery("SELECT * FROM ingredients WHERE name = :name")
+	  @RegisterBeanMapper(Ingredient.class)
+	  Ingredient findByName(String name);
+
+	  @SqlUpdate("DELETE FROM ingredients WHERE id = :id")
+	  void remove(long id);
+
+}
diff --git a/src/main/java/fr/ulille/iut/pizzaland/dao/PizzaDAO.java b/src/main/java/fr/ulille/iut/pizzaland/dao/PizzaDAO.java
new file mode 100644
index 0000000000000000000000000000000000000000..94d5357f2c088fd460af940e5d5836591cd821b9
--- /dev/null
+++ b/src/main/java/fr/ulille/iut/pizzaland/dao/PizzaDAO.java
@@ -0,0 +1,60 @@
+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.Ingredient;
+import fr.ulille.iut.pizzaland.beans.Pizza;
+
+public interface PizzaDAO {
+
+	@SqlUpdate("CREATE TABLE IF NOT EXISTS pizzas (id INTEGER PRIMARY KEY, name VARCHAR UNIQUE NOT NULL)")
+	void createTablePizza();
+	
+	@SqlUpdate("CREATE TABLE IF NOT EXISTS pizzasIngredients (idPizza INTEGER, idIngredient INTEGER, CONSTRAINT pk_pizzasIngredients PRIMARY KEY (idPizza,idIngredient))")
+	void createTableIngredients();
+	
+	@Transaction
+	default void createTablePizzaIngredients() {
+		createTablePizza();
+		createTableIngredients();
+		
+	}
+
+	@SqlUpdate("DROP TABLE IF EXISTS pizzas")
+	void dropTable();
+
+	@SqlUpdate("INSERT INTO pizzas (name) VALUES (:name)")
+	@GetGeneratedKeys
+	long insert(String name);
+	
+	@SqlUpdate("INSERT INTO pizzasIngredients VALUES (:idPizza,:idIngredient)")
+	void insertIngredient(long idPizza, long idIngredient);
+
+	@SqlQuery("SELECT * FROM pizzas")
+	@RegisterBeanMapper(Pizza.class)
+	List<Pizza> getAll();
+	
+	@SqlQuery("SELECT * FROM pizzasIngredients WHERE idPizza = :idPizza")
+	List<Ingredient> getIngredient(long idPizza);
+
+	@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("DELETE FROM pizzasIngredients WHERE idPizza = :idPizza")
+	void removeFromPizzasIngredients(long idPizza);
+	
+	@SqlUpdate("DELETE FROM pizzas WHERE idPizza = :idPizza")
+	void removeFromPizzas(long idPizza);
+
+}
diff --git a/src/main/java/fr/ulille/iut/pizzaland/dto/IngredientCreateDto.java b/src/main/java/fr/ulille/iut/pizzaland/dto/IngredientCreateDto.java
new file mode 100644
index 0000000000000000000000000000000000000000..65065bbcf50f4288dc1aa4e32b1be6f13562f534
--- /dev/null
+++ b/src/main/java/fr/ulille/iut/pizzaland/dto/IngredientCreateDto.java
@@ -0,0 +1,20 @@
+package fr.ulille.iut.pizzaland.dto;
+
+public class IngredientCreateDto {
+	
+private String name;
+	
+	public IngredientCreateDto() {
+
+	}
+	
+	public void setName(String name) {
+		this.name = name;
+	}
+	
+	public String getName() {
+		return name;
+	}
+
+
+}
diff --git a/src/main/java/fr/ulille/iut/pizzaland/dto/IngredientDto.java b/src/main/java/fr/ulille/iut/pizzaland/dto/IngredientDto.java
index 1a9360bf01fa2544b241a017cfa0c056dada02e2..198bfd7d037ceeb32000f1216d4b1dce3b256952 100644
--- a/src/main/java/fr/ulille/iut/pizzaland/dto/IngredientDto.java
+++ b/src/main/java/fr/ulille/iut/pizzaland/dto/IngredientDto.java
@@ -1,8 +1,27 @@
 package fr.ulille.iut.pizzaland.dto;
 
 public class IngredientDto {
+	
+	long id;
+	String name;
 
     public IngredientDto() {
         
     }
+
+	public void setId(long id) {
+		this.id=id;
+	}
+	
+	public long getId() {
+		return this.id;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+	
+	public String getName() {
+		return this.name;
+	}
 }
diff --git a/src/main/java/fr/ulille/iut/pizzaland/dto/PizzaCreateDto.java b/src/main/java/fr/ulille/iut/pizzaland/dto/PizzaCreateDto.java
new file mode 100644
index 0000000000000000000000000000000000000000..4a3a7cced950f64985617e725bfb09dcffde9ce1
--- /dev/null
+++ b/src/main/java/fr/ulille/iut/pizzaland/dto/PizzaCreateDto.java
@@ -0,0 +1,36 @@
+package fr.ulille.iut.pizzaland.dto;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import fr.ulille.iut.pizzaland.beans.Ingredient;
+
+public class PizzaCreateDto {
+	
+	private String name;
+	private List<Ingredient> ingredients;
+	
+	public PizzaCreateDto() {
+		
+	}
+	
+	public void setName(String name) {
+		this.name = name;
+	}
+	
+	public String getName() {
+		return this.name;
+	}
+	
+	public void addIngredient(Ingredient ingredient) {
+		if(ingredients == null) {
+			this.ingredients= new ArrayList<Ingredient>();
+		}
+		ingredients.add(ingredient);
+	}
+	
+	public List<Ingredient> getIngredients(){
+		return this.ingredients;
+	}
+
+}
diff --git a/src/main/java/fr/ulille/iut/pizzaland/dto/PizzaDto.java b/src/main/java/fr/ulille/iut/pizzaland/dto/PizzaDto.java
new file mode 100644
index 0000000000000000000000000000000000000000..141627c61a3b29fcaa1863db0c86fc661697c947
--- /dev/null
+++ b/src/main/java/fr/ulille/iut/pizzaland/dto/PizzaDto.java
@@ -0,0 +1,42 @@
+package fr.ulille.iut.pizzaland.dto;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import fr.ulille.iut.pizzaland.beans.Ingredient;
+
+public class PizzaDto {
+	
+	long id;
+	String name;
+	List<Ingredient> ingredients = new ArrayList<Ingredient>();
+	
+	public PizzaDto() {
+		
+	}
+	
+	public void setId(long id) {
+		this.id = id;
+	}
+	
+	public long getId() {
+		return this.id;
+	}
+	
+	public void setName(String name) {
+		this.name = name;
+	}
+	
+	public String getName() {
+		return this.name;
+	}
+	
+	public void addIngredient(Ingredient ingredient) {
+		ingredients.add(ingredient);
+	}
+	
+	public List<Ingredient> getIngredients(){
+		return this.ingredients;
+	}
+
+}
diff --git a/src/main/java/fr/ulille/iut/pizzaland/resources/IngredientResource.java b/src/main/java/fr/ulille/iut/pizzaland/resources/IngredientResource.java
index bc19082daf4dd4cd778b956d9607e2f259a94cd1..2fd185aba2e42c2a9b1d449ab8f9595e62f0e601 100644
--- a/src/main/java/fr/ulille/iut/pizzaland/resources/IngredientResource.java
+++ b/src/main/java/fr/ulille/iut/pizzaland/resources/IngredientResource.java
@@ -2,31 +2,116 @@ package fr.ulille.iut.pizzaland.resources;
 
 import java.net.URI;
 import java.util.List;
-import java.util.ArrayList;
 import java.util.logging.Logger;
+import java.util.stream.Collectors;
 
+import javax.ws.rs.DELETE;
 import javax.ws.rs.GET;
+import javax.ws.rs.POST;
 import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.WebApplicationException;
 import javax.ws.rs.core.Context;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.UriInfo;
 
+import fr.ulille.iut.pizzaland.BDDFactory;
+import fr.ulille.iut.pizzaland.beans.Ingredient;
+import fr.ulille.iut.pizzaland.dao.IngredientDAO;
+import fr.ulille.iut.pizzaland.dto.IngredientCreateDto;
 import fr.ulille.iut.pizzaland.dto.IngredientDto;
 
 @Path("/ingredients")
 public class IngredientResource {
     private static final Logger LOGGER = Logger.getLogger(IngredientResource.class.getName());
+    private IngredientDAO dao;
 
     @Context
     public UriInfo uriInfo;
 
     public IngredientResource() {
+    	dao = BDDFactory.buildDao(IngredientDAO.class);
+    	dao.createTable();
+    }
+    
+ /*@GET
+    @Path("{id}")
+    public IngredientDto getOneIngredient() {
+    	Ingredient ingredient = new Ingredient();
+    	ingredient.setId(1);
+    	ingredient.setName("mozzarella");
+    	
+		return Ingredient.toDto(ingredient);
+    	
+    }*/
+    
+    @GET
+    @Path("{id}")
+    public IngredientDto getOneIngredient(@PathParam("id") long id) {
+    	LOGGER.info("getOneIngredient(" + id + ")");
+    	try {
+            Ingredient ingredient = dao.findById(id);
+    		return Ingredient.toDto(ingredient);
+    	}
+        catch ( Exception e ) {
+        	// Cette exception générera une réponse avec une erreur 404
+            throw new WebApplicationException(Response.Status.NOT_FOUND);
+        }
     }
 
     @GET
     public List<IngredientDto> getAll() {
         LOGGER.info("IngredientResource:getAll");
+        List<IngredientDto> l = dao.getAll().stream().map(Ingredient::toDto).collect(Collectors.toList());
+
+        return l;
+    }
+    
+    @POST
+    public Response createIngredient(IngredientCreateDto ingredientCreateDto) {
+        Ingredient existing = dao.findByName(ingredientCreateDto.getName());
+        if ( existing != null ) {
+            throw new WebApplicationException(Response.Status.CONFLICT);
+        }
+        
+        try {
+            Ingredient ingredient = Ingredient.fromIngredientCreateDto(ingredientCreateDto);
+            long id = dao.insert(ingredient.getName());
+            ingredient.setId(id);
+            IngredientDto ingredientDto = Ingredient.toDto(ingredient);
+
+            URI uri = uriInfo.getAbsolutePathBuilder().path("" + id).build();
 
-	return null;
+            return Response.created(uri).entity(ingredientDto).build();
+        }
+        catch ( Exception e ) {
+            e.printStackTrace();
+            throw new WebApplicationException(Response.Status.NOT_ACCEPTABLE);
+        }
     }
+    
+    @DELETE
+    @Path("{id}")
+    public Response deleteIngredient(@PathParam("id") long id) {
+    	if ( dao.findById(id) == null ) {
+    		throw new WebApplicationException(Response.Status.NOT_FOUND);
+    	}
+
+        dao.remove(id);
+
+        return Response.status(Response.Status.ACCEPTED).build();
+    }
+    
+    @GET
+    @Path("{id}/name")
+    public String getIngredientName(@PathParam("id") long id) {
+        Ingredient ingredient = dao.findById(id);
+    	if ( ingredient == null ) {
+    		throw new WebApplicationException(Response.Status.NOT_FOUND);
+    	}
+          
+    	return ingredient.getName();
+    }
+
+    
 }
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..8a90f7168148d067ffa3c6ab6256ccb40cc2a8d0
--- /dev/null
+++ b/src/main/java/fr/ulille/iut/pizzaland/resources/PizzaResource.java
@@ -0,0 +1,124 @@
+package fr.ulille.iut.pizzaland.resources;
+
+import java.net.URI;
+import java.util.List;
+import java.util.logging.Logger;
+import java.util.stream.Collectors;
+
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+import javax.ws.rs.core.UriInfo;
+
+import fr.ulille.iut.pizzaland.BDDFactory;
+import fr.ulille.iut.pizzaland.beans.Ingredient;
+import fr.ulille.iut.pizzaland.beans.Pizza;
+import fr.ulille.iut.pizzaland.dao.PizzaDAO;
+import fr.ulille.iut.pizzaland.dto.IngredientDto;
+import fr.ulille.iut.pizzaland.dto.PizzaCreateDto;
+import fr.ulille.iut.pizzaland.dto.PizzaDto;
+
+@Path("/pizzas")
+public class PizzaResource {
+	private static final Logger LOGGER = Logger.getLogger(IngredientResource.class.getName());
+	private PizzaDAO dao;
+
+	@Context
+	public UriInfo uriInfo;
+
+	public PizzaResource() {
+		dao = BDDFactory.buildDao(PizzaDAO.class);
+	    dao.createTablePizzaIngredients();
+	}
+
+	@GET
+	public List<PizzaDto> getAll() {
+
+		LOGGER.info("IngredientResource:getAll");
+
+	    List<PizzaDto> l = dao.getAll().stream().map(Pizza::toDto).collect(Collectors.toList());
+	    return l;
+	}
+	
+	@GET
+	@Path("{id}/name")
+	public String getPizzaName(@PathParam("id") long id) {
+		LOGGER.info("getPizzaName("+id+")");
+		Pizza pizza = dao.findById(id);
+		if(pizza == null) {
+			throw new WebApplicationException(Response.Status.NOT_FOUND);
+		}
+		return pizza.getName();
+	}
+	
+	@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) {
+			throw new WebApplicationException(Response.Status.NOT_FOUND);
+		}	*/
+		Pizza pizza = dao.findById(id);
+		if(pizza == null) {
+			throw new WebApplicationException(Response.Status.NOT_FOUND);
+		}
+		return Pizza.toDto(pizza);
+	}
+	
+	@GET
+	@Path("{id}/ingredients)")
+	public List<Ingredient> getIngredients(@PathParam("id") long id){
+		LOGGER.info("getIngredients(" + id + ")");
+		try {
+			return dao.getIngredient(id);
+		} catch(Exception e) {
+			throw new WebApplicationException(Response.Status.NOT_FOUND);
+		}
+	}
+	
+	@DELETE
+	@Path("{id}")
+	public Response deletePizza(@PathParam("id") long id){
+		LOGGER.info("deletePizza("+id+")");
+		if(dao.findById(id) == null) {
+			throw new WebApplicationException(Response.Status.NOT_FOUND);
+		}
+		dao.removeFromPizzas(id);
+		
+		return Response.status(Status.ACCEPTED).build();
+	}
+	
+	@POST
+	@Path("{id}")
+	public Response createPizza(PizzaCreateDto dtoCreate) {
+		 Pizza existing = dao.findByName(dtoCreate.getName());
+	        if ( existing != null ) {
+	            throw new WebApplicationException(Response.Status.CONFLICT);
+	        }
+	        
+	        try {
+	            Pizza pizza = Pizza.fromPizzaCreateDto(dtoCreate);
+	            long id = dao.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);
+	        }
+	}
+
+}
diff --git a/src/test/java/fr/ulille/iut/pizzaland/IngredientResourceTest.java b/src/test/java/fr/ulille/iut/pizzaland/IngredientResourceTest.java
index 2c8b1be3f265046d4d3557185aac26b7704ec1ac..7dc67eb09ea3bf45bbc26d8e1fb34b16862a4f18 100644
--- a/src/test/java/fr/ulille/iut/pizzaland/IngredientResourceTest.java
+++ b/src/test/java/fr/ulille/iut/pizzaland/IngredientResourceTest.java
@@ -1,6 +1,9 @@
 package fr.ulille.iut.pizzaland;
 
 import fr.ulille.iut.pizzaland.ApiV1;
+import fr.ulille.iut.pizzaland.beans.Ingredient;
+import fr.ulille.iut.pizzaland.dao.IngredientDAO;
+import fr.ulille.iut.pizzaland.dto.IngredientCreateDto;
 import fr.ulille.iut.pizzaland.dto.IngredientDto;
 
 import org.glassfish.jersey.test.JerseyTest;
@@ -26,9 +29,12 @@ import java.util.logging.Logger;
  */
 public class IngredientResourceTest extends JerseyTest {
     private static final Logger LOGGER = Logger.getLogger(IngredientResourceTest.class.getName());
+    private IngredientDAO dao;
     
     @Override
     protected Application configure() {
+    	BDDFactory.setJdbiForTests();
+    	
        return new ApiV1();
     }
 
@@ -38,12 +44,14 @@ public class IngredientResourceTest extends JerseyTest {
     // https://stackoverflow.com/questions/25906976/jerseytest-and-junit-throws-nullpointerexception
     @Before
     public void setEnvUp() {
-	
+    	dao = BDDFactory.buildDao(IngredientDAO.class);
+        dao.createTable();
+
     }
 
     @After
     public void tearEnvDown() throws Exception {
-
+    	dao.dropTable();
     }
 
     @Test
@@ -66,4 +74,122 @@ public class IngredientResourceTest extends JerseyTest {
         assertEquals(0, ingredients.size());
 
     }
+    
+    @Test
+    public void testGetExistingIngredient() {
+      /*Ingredient ingredient = new Ingredient();
+      ingredient.setId(1);
+      ingredient.setName("mozzarella");
+    
+      Response response = target("/ingredients/1").request().get();
+      assertEquals(Response.Status.OK.getStatusCode(), response.getStatus());
+
+      Ingredient result  = Ingredient.fromDto(response.readEntity(IngredientDto.class));
+      assertEquals(ingredient, result);*/
+      
+      Ingredient ingredient = new Ingredient();
+      ingredient.setName("Chorizo");
+      ingredient.setId(1);
+
+      long id = dao.insert(ingredient.getName());
+      ingredient.setId(id);
+
+      Response response = target("/ingredients/" + id).request().get();
+
+      assertEquals(Response.Status.OK.getStatusCode(), response.getStatus());
+
+      Ingredient result = Ingredient.fromDto(response.readEntity(IngredientDto.class));
+      assertEquals(ingredient, result);
+	
+   }
+    
+    @Test
+    public void testGetNotExistingPizza() {
+      Response response = target("/pizzas/125").request().get();
+      assertEquals(Response.Status.NOT_FOUND.getStatusCode(),response.getStatus());
+    }
+    
+    @Test
+    public void testCreateIngredient() {
+        IngredientCreateDto ingredientCreateDto = new IngredientCreateDto();
+        ingredientCreateDto.setName("Chorizo");
+
+        Response response = target("/ingredients").request().post(Entity.json(ingredientCreateDto));
+
+        // On vérifie le code de status à 201
+        assertEquals(Response.Status.CREATED.getStatusCode(), response.getStatus());
+
+        IngredientDto returnedEntity = response.readEntity(IngredientDto.class);
+
+        // On vérifie que le champ d'entête Location correspond à
+        // l'URI de la nouvelle entité
+        assertEquals(target("/ingredients/" + returnedEntity.getId()).getUri(), response.getLocation());
+    	
+    	// On vérifie que le nom correspond
+        assertEquals(returnedEntity.getName(), ingredientCreateDto.getName());
+    }
+    	
+    @Test
+    public void testCreateSameIngredient() {
+        IngredientCreateDto ingredientCreateDto = new IngredientCreateDto();
+        ingredientCreateDto.setName("Chorizo");
+        dao.insert(ingredientCreateDto.getName());
+
+        Response response = target("/ingredients").request().post(Entity.json(ingredientCreateDto));
+
+        assertEquals(Response.Status.CONFLICT.getStatusCode(), response.getStatus());
+    }
+
+    @Test
+    public void testCreateIngredientWithoutName() {
+        IngredientCreateDto ingredientCreateDto = new IngredientCreateDto();
+
+        Response response = target("/ingredients").request().post(Entity.json(ingredientCreateDto));
+
+        assertEquals(Response.Status.NOT_ACCEPTABLE.getStatusCode(), response.getStatus());
+    }
+
+    @Test
+    public void testDeleteExistingIngredient() {
+        Ingredient ingredient = new Ingredient();
+        ingredient.setName("Chorizo");
+        long id = dao.insert(ingredient.getName());
+        ingredient.setId(id);
+
+        Response response = target("/ingredients/" + id).request().delete();
+
+        assertEquals(Response.Status.ACCEPTED.getStatusCode(), response.getStatus());
+
+        Ingredient result = dao.findById(id);
+    	assertEquals(result, null);
+    }
+
+    @Test
+    public void testDeleteNotExistingIngredient() {
+        Response response = target("/ingredients/125").request().delete();
+        assertEquals(Response.Status.NOT_FOUND.getStatusCode(),
+    	response.getStatus());
+    }
+
+    @Test
+    public void testGetIngredientName() {
+        Ingredient ingredient = new Ingredient();
+        ingredient.setName("Chorizo");
+        long id = dao.insert(ingredient.getName());
+
+        Response response = target("ingredients/" + id + "/name").request().get();
+
+        assertEquals(Response.Status.OK.getStatusCode(), response.getStatus());
+
+        assertEquals("Chorizo", response.readEntity(String.class));
+    }
+
+    @Test
+    public void testGetNotExistingIngredientName() {
+        Response response = target("ingredients/125/name").request().get();
+
+        assertEquals(Response.Status.NOT_FOUND.getStatusCode(), response.getStatus());
+    }
+
+
 }
diff --git a/src/test/java/fr/ulille/iut/pizzaland/PizzaResourceTest.java b/src/test/java/fr/ulille/iut/pizzaland/PizzaResourceTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..fb01ea8f05343480d7ceb8e806acd11eb4d4ccf6
--- /dev/null
+++ b/src/test/java/fr/ulille/iut/pizzaland/PizzaResourceTest.java
@@ -0,0 +1,149 @@
+package fr.ulille.iut.pizzaland;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.List;
+
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.core.Application;
+import javax.ws.rs.core.GenericType;
+import javax.ws.rs.core.Response;
+
+import org.glassfish.jersey.test.JerseyTest;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import fr.ulille.iut.pizzaland.beans.Ingredient;
+import fr.ulille.iut.pizzaland.beans.Pizza;
+import fr.ulille.iut.pizzaland.dao.IngredientDAO;
+import fr.ulille.iut.pizzaland.dao.PizzaDAO;
+import fr.ulille.iut.pizzaland.dto.IngredientCreateDto;
+import fr.ulille.iut.pizzaland.dto.IngredientDto;
+import fr.ulille.iut.pizzaland.dto.PizzaCreateDto;
+import fr.ulille.iut.pizzaland.dto.PizzaDto;
+
+public class PizzaResourceTest extends JerseyTest{
+
+	private PizzaDAO dao;
+	private IngredientDAO daoIng;
+
+	@Override
+	protected Application configure() {
+		BDDFactory.setJdbiForTests();
+		return new ApiV1();
+	}
+
+	@Before
+	public void setEnvUp() {
+		dao = BDDFactory.buildDao(PizzaDAO.class);
+		dao.createTablePizzaIngredients();
+		daoIng = BDDFactory.buildDao(IngredientDAO.class);
+		daoIng.createTable();
+	}
+
+	@After
+	public void tearEnvDown() throws Exception {
+		dao.dropTable();
+	}
+
+	@Test
+	public void testGetEmptyList() {
+		Response response = target("/pizzas").request().get();
+		assertEquals(Response.Status.OK.getStatusCode(), response.getStatus());
+		List<PizzaDto> pizzas;
+		pizzas = response.readEntity(new GenericType<List<PizzaDto>>(){});
+		assertEquals(0, pizzas.size());
+	}
+
+	@Test
+	public void testGetExistingPizza() {
+		Pizza pizza = new Pizza();
+		pizza.setName("Chevre");
+
+		long id = dao.insert(pizza.getName());
+		pizza.setId(id);
+
+		Response response = target("/pizzas/" + id).request().get();
+
+		assertEquals(Response.Status.OK.getStatusCode(), response.getStatus());
+
+		Pizza result = Pizza.fromDto(response.readEntity(PizzaDto.class));
+		assertEquals(pizza, result);
+	}
+	
+	public void testGetNotExistingPizza() {
+		Response response = target("/pizzas/12").request().get();	
+		assertEquals(Response.Status.NOT_FOUND.getStatusCode(), response.getStatus());
+	}
+	
+	//TODO réparer erreur
+	@Test
+	public void testGetIngredients() {
+		Pizza pizza = new Pizza();
+		pizza.setName("Chevre");
+		long idIng = daoIng.insert("Chevre");
+		long id = dao.insert(pizza.getName());
+		pizza.setId(id);
+		dao.insertIngredient(pizza.getId(), idIng);
+
+		String target = "/pizzas/" + id +"/ingredients";
+		Response response = target(target).request().get();
+
+		assertEquals(Response.Status.OK.getStatusCode(), response.getStatus());
+
+		Pizza result = Pizza.fromDto(response.readEntity(PizzaDto.class));
+		assertEquals(pizza, result);
+	}
+	
+	@Test
+	public void testGetPizzaName() {
+		Pizza pizza = new Pizza();
+        pizza.setName("Chèvre");
+        long id = dao.insert(pizza.getName());
+
+        Response response = target("pizzas/" + id + "/name").request().get();
+
+        assertEquals(Response.Status.OK.getStatusCode(), response.getStatus());
+
+        assertEquals("Chèvre", response.readEntity(String.class));
+	}
+	
+	//TODO réparer erreur
+	@Test
+	public void testDeleteExistingPizza() {
+		Pizza pizza = new Pizza();
+		pizza.setName("Chevre");
+
+		long id = dao.insert(pizza.getName());
+		pizza.setId(id);
+
+		Response response = target("/pizzas/" + id).request().get();
+
+		assertEquals(Response.Status.OK.getStatusCode(), response.getStatus());
+		
+		response = target("/pizzas/" + id).request().delete();
+		
+		assertEquals(Response.Status.ACCEPTED.getStatusCode(), response);
+		
+		Pizza result = dao.findById(id);
+    	assertEquals(result, null);
+	}
+	
+	@Test
+	public void testCreatePizza() {
+		PizzaCreateDto pizzaCreateDto = new PizzaCreateDto();
+        pizzaCreateDto.setName("Chèvre");
+
+        Response response = target("/pizzas").request().post(Entity.json(pizzaCreateDto));
+
+        assertEquals(Response.Status.CREATED.getStatusCode(), response.getStatus());
+
+        PizzaDto returnedEntity = response.readEntity(PizzaDto.class);
+
+        assertEquals(target("/pizzas/" + returnedEntity.getId()).getUri(), response.getLocation());
+
+        assertEquals(returnedEntity.getName(), pizzaCreateDto.getName());
+	}
+
+}