From daf3dfed1d6c1fd07c51ec9ac095de4693c5ccd0 Mon Sep 17 00:00:00 2001
From: BEAUVAIS ANTOINE <antoine.beauvais@etu.unistra.fr>
Date: Thu, 23 Sep 2021 19:32:32 +0200
Subject: [PATCH] Added a mapping to retrieve stocks info.

---
 scripts/create-dev.sql                        |  4 +-
 .../java/fr/unistra/sil/erp/back/Config.java  |  2 +
 .../erp/back/controller/IRetrieveStocks.java  | 20 +++++++
 .../api/ApiRetrieveCategoriesController.java  |  1 +
 .../controller/api/ApiRetrieveStocks.java     | 57 +++++++++++++++++++
 .../sil/erp/back/db/DatabaseInterface.java    |  8 +++
 .../sil/erp/back/db/DatabaseSQLiteImpl.java   | 32 ++++++++++-
 .../fr/unistra/sil/erp/back/model/Stock.java  | 48 ++++++++++++++++
 8 files changed, 169 insertions(+), 3 deletions(-)
 create mode 100644 src/main/java/fr/unistra/sil/erp/back/controller/IRetrieveStocks.java
 create mode 100644 src/main/java/fr/unistra/sil/erp/back/controller/api/ApiRetrieveStocks.java
 create mode 100644 src/main/java/fr/unistra/sil/erp/back/model/Stock.java

diff --git a/scripts/create-dev.sql b/scripts/create-dev.sql
index ebff9cf..f73ce2f 100644
--- a/scripts/create-dev.sql
+++ b/scripts/create-dev.sql
@@ -89,5 +89,5 @@ INSERT INTO registry (id, dt, type, account_id, debit, credit, remarks)
 
 INSERT INTO stocks (id, item, quantity)
     VALUES(1, 1, 25),
-    VALUES(2, 2, 12),
-    VALUES(3, 3, 50);
\ No newline at end of file
+          (2, 2, 12),
+          (3, 3, 50);
\ No newline at end of file
diff --git a/src/main/java/fr/unistra/sil/erp/back/Config.java b/src/main/java/fr/unistra/sil/erp/back/Config.java
index 0fa1b11..dd7c053 100644
--- a/src/main/java/fr/unistra/sil/erp/back/Config.java
+++ b/src/main/java/fr/unistra/sil/erp/back/Config.java
@@ -22,4 +22,6 @@ public class Config {
     public static final String MAPPING_SUBTRANSAC = URL_PREFIX +
             "/submitTransaction";
     
+    public static final String MAPPING_GETSTOCKS = URL_PREFIX +
+            "/retrieveStocks";
 }
diff --git a/src/main/java/fr/unistra/sil/erp/back/controller/IRetrieveStocks.java b/src/main/java/fr/unistra/sil/erp/back/controller/IRetrieveStocks.java
new file mode 100644
index 0000000..883ba1d
--- /dev/null
+++ b/src/main/java/fr/unistra/sil/erp/back/controller/IRetrieveStocks.java
@@ -0,0 +1,20 @@
+/*
+ * CONTRAT DE LICENCE DE LOGICIEL LIBRE CeCILL-B
+ * https://cecill.info/licences/Licence_CeCILL-B_V1-fr.html
+ */
+package fr.unistra.sil.erp.back.controller;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.springframework.http.ResponseEntity;
+
+/**
+ * Interface for designing stocks access.
+ * @author BEAUVAIS ANTOINE
+ */
+public interface IRetrieveStocks {
+    
+    public ResponseEntity<Object> retrieveStocks(HttpServletRequest request,
+            HttpServletResponse response) throws Exception;
+    
+}
diff --git a/src/main/java/fr/unistra/sil/erp/back/controller/api/ApiRetrieveCategoriesController.java b/src/main/java/fr/unistra/sil/erp/back/controller/api/ApiRetrieveCategoriesController.java
index fa4a767..977b42a 100644
--- a/src/main/java/fr/unistra/sil/erp/back/controller/api/ApiRetrieveCategoriesController.java
+++ b/src/main/java/fr/unistra/sil/erp/back/controller/api/ApiRetrieveCategoriesController.java
@@ -5,6 +5,7 @@
 package fr.unistra.sil.erp.back.controller.api;
 
 import static fr.unistra.sil.erp.back.Config.MAPPING_GETCATEGORIES;
+import static fr.unistra.sil.erp.back.Config.MAPPING_GETSTOCKS;
 import fr.unistra.sil.erp.back.DatabaseSystem;
 import fr.unistra.sil.erp.back.controller.IRetrieveCategoriesController;
 import fr.unistra.sil.erp.back.model.Category;
diff --git a/src/main/java/fr/unistra/sil/erp/back/controller/api/ApiRetrieveStocks.java b/src/main/java/fr/unistra/sil/erp/back/controller/api/ApiRetrieveStocks.java
new file mode 100644
index 0000000..0e47d00
--- /dev/null
+++ b/src/main/java/fr/unistra/sil/erp/back/controller/api/ApiRetrieveStocks.java
@@ -0,0 +1,57 @@
+/*
+ * CONTRAT DE LICENCE DE LOGICIEL LIBRE CeCILL-B
+ * https://cecill.info/licences/Licence_CeCILL-B_V1-fr.html
+ */
+package fr.unistra.sil.erp.back.controller.api;
+
+import static fr.unistra.sil.erp.back.Config.MAPPING_GETSTOCKS;
+import fr.unistra.sil.erp.back.DatabaseSystem;
+import fr.unistra.sil.erp.back.controller.IRetrieveStocks;
+import fr.unistra.sil.erp.back.db.DatabaseConnectionException;
+import fr.unistra.sil.erp.back.db.DatabaseInterface;
+import fr.unistra.sil.erp.back.model.Stock;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * Retrieves stocks in JSON format.
+ * @author BEAUVAIS ANTOINE
+ */
+@RestController
+public class ApiRetrieveStocks implements IRetrieveStocks {
+
+    /**
+     * Sends the stocks as JSON format back to the client.
+     * @param request the HTTP request.
+     * @param response the HTTP response.
+     * @return the response. 
+     * @throws fr.unistra.sil.erp.back.controller.api.ApiServerErrorException 
+     */
+    @GetMapping(MAPPING_GETSTOCKS)
+    @Override
+    public ResponseEntity<Object> retrieveStocks(HttpServletRequest request,
+            HttpServletResponse response) throws ApiServerErrorException {
+        DatabaseInterface db;
+        try {
+            db = DatabaseSystem.getInstance();
+        } catch (DatabaseConnectionException ex) {
+            Logger.getLogger(ApiRetrieveCategoriesController.class.getName())
+                    .log(Level.SEVERE, "Failed to connect to database.", ex);
+            throw new ApiServerErrorException("Database failure.");
+        }
+        
+        List<Stock> res = db.getStocks();
+        if(res == null)
+            throw new ApiServerErrorException("Database failure.");
+        
+        return new ResponseEntity<>(res, HttpStatus.OK);
+    }
+    
+}
diff --git a/src/main/java/fr/unistra/sil/erp/back/db/DatabaseInterface.java b/src/main/java/fr/unistra/sil/erp/back/db/DatabaseInterface.java
index d9b5f58..19f0dfa 100644
--- a/src/main/java/fr/unistra/sil/erp/back/db/DatabaseInterface.java
+++ b/src/main/java/fr/unistra/sil/erp/back/db/DatabaseInterface.java
@@ -6,6 +6,7 @@ package fr.unistra.sil.erp.back.db;
 
 import fr.unistra.sil.erp.back.model.Category;
 import fr.unistra.sil.erp.back.model.Item;
+import fr.unistra.sil.erp.back.model.Stock;
 import java.util.List;
 
 /**
@@ -38,4 +39,11 @@ public interface DatabaseInterface {
      */
     public List<Category> getCategories();
     
+    /**
+     * Returns the list of all stocks.
+     * 
+     * @return the list of stocks.
+     */
+    public List<Stock> getStocks();
+    
 }
diff --git a/src/main/java/fr/unistra/sil/erp/back/db/DatabaseSQLiteImpl.java b/src/main/java/fr/unistra/sil/erp/back/db/DatabaseSQLiteImpl.java
index a67ae65..6ba2ee9 100644
--- a/src/main/java/fr/unistra/sil/erp/back/db/DatabaseSQLiteImpl.java
+++ b/src/main/java/fr/unistra/sil/erp/back/db/DatabaseSQLiteImpl.java
@@ -6,6 +6,7 @@ package fr.unistra.sil.erp.back.db;
 
 import fr.unistra.sil.erp.back.model.Category;
 import fr.unistra.sil.erp.back.model.Item;
+import fr.unistra.sil.erp.back.model.Stock;
 import java.sql.Connection;
 import java.sql.DriverManager;
 import java.sql.PreparedStatement;
@@ -18,7 +19,7 @@ import java.util.logging.Level;
 import java.util.logging.Logger;
 
 /**
- *
+ * SQLite implementation of the Database interface.
  * @author BEAUVAIS ANTOINE <antoine.beauvais@etu.unistra.fr>
  */
 public class DatabaseSQLiteImpl implements DatabaseInterface {
@@ -33,6 +34,11 @@ public class DatabaseSQLiteImpl implements DatabaseInterface {
     private static final String SQL_GETCATEGORIES =
             "SELECT id, name FROM categories";
     
+    private static final String SQL_GETSTOCKS = 
+            "SELECT s.id AS id, s.item AS item, " +
+            "i.name AS name, s.quantity AS quantity FROM stocks s " +
+            "INNER JOIN items i ON s.item = i.ref";
+    
     private Connection conn;
     
     public DatabaseSQLiteImpl()
@@ -156,5 +162,29 @@ public class DatabaseSQLiteImpl implements DatabaseInterface {
         
         return res;
     }
+
+    @Override
+    public List<Stock> getStocks() {
+        ResultSet rs = this.query(SQL_GETSTOCKS);
+        if(rs == null)
+            return null;
+        
+        List<Stock> res = new ArrayList<>();
+        try {
+            while(rs.next())
+            {
+                Stock s = new Stock(rs.getInt("id"),
+                        rs.getInt("item"), rs.getString("name"),
+                        rs.getInt("quantity"));
+                res.add(s);
+            }
+        } catch (SQLException ex) {
+            Logger.getLogger(DatabaseSQLiteImpl.class.getName()).log(
+                    Level.SEVERE, "Failed to fetch results.", ex);
+            return null;
+        }
+        
+        return res;
+    }
     
 }
diff --git a/src/main/java/fr/unistra/sil/erp/back/model/Stock.java b/src/main/java/fr/unistra/sil/erp/back/model/Stock.java
new file mode 100644
index 0000000..05c9504
--- /dev/null
+++ b/src/main/java/fr/unistra/sil/erp/back/model/Stock.java
@@ -0,0 +1,48 @@
+/*
+ * CONTRAT DE LICENCE DE LOGICIEL LIBRE CeCILL-B
+ * https://cecill.info/licences/Licence_CeCILL-B_V1-fr.html
+ */
+package fr.unistra.sil.erp.back.model;
+
+/**
+ * Representation of a stock entry.
+ * @author BEAUVAIS ANTOINE
+ */
+public class Stock {
+    
+    private final int id;
+    
+    private final int itemId;
+    
+    private final String itemName;
+    
+    private final int quantity;
+    
+    public Stock(int id, int itemId, String itemName, int quantity)
+    {
+        this.id = id;
+        this.itemId = itemId;
+        this.itemName = itemName;
+        this.quantity = quantity;
+    }
+    
+    public int getId()
+    {
+        return this.id;
+    }
+    
+    public int getItemId()
+    {
+        return this.itemId;
+    }
+    
+    public String getItemName()
+    {
+        return this.itemName;
+    }
+    
+    public int getQuantity()
+    {
+        return this.quantity;
+    }
+}
-- 
GitLab