From a525df35201aeb89aaea5259cabaa07af79d2adc Mon Sep 17 00:00:00 2001 From: Robert Goldmann <deadlocker@gmx.de> Date: Mon, 20 Feb 2017 13:00:41 +0100 Subject: [PATCH] moved DatabaseHandler to SparkServer (only one connection to avoid errors) --- .../server/SparkServer.java | 36 ++++++++++--------- .../server/category/CategoryAdd.java | 10 +++--- .../server/category/CategoryDelete.java | 10 +++--- .../server/category/CategoryGet.java | 8 ++--- .../server/category/CategoryGetAll.java | 10 +++--- .../server/category/CategoryUpdate.java | 14 ++++---- .../categorybudget/CategoryBudgetGet.java | 11 +++--- .../server/payment/normal/PaymentAdd.java | 10 +++--- .../server/payment/normal/PaymentDelete.java | 12 +++---- .../server/payment/normal/PaymentGet.java | 10 +++--- .../server/payment/normal/PaymentUpdate.java | 12 +++---- .../repeating/RepeatingPaymentAdd.java | 12 +++---- .../repeating/RepeatingPaymentDelete.java | 12 +++---- .../repeating/RepeatingPaymentGet.java | 14 ++++---- .../repeating/RepeatingPaymentGetAll.java | 14 ++++---- .../updater/RepeatingPaymentUpdater.java | 10 +++--- 16 files changed, 89 insertions(+), 116 deletions(-) diff --git a/src/de/deadlocker8/budgetmasterserver/server/SparkServer.java b/src/de/deadlocker8/budgetmasterserver/server/SparkServer.java index fdbd552f0..349ae5031 100644 --- a/src/de/deadlocker8/budgetmasterserver/server/SparkServer.java +++ b/src/de/deadlocker8/budgetmasterserver/server/SparkServer.java @@ -10,6 +10,7 @@ import java.nio.file.Paths; import com.google.gson.Gson; import com.google.gson.GsonBuilder; +import de.deadlocker8.budgetmasterserver.main.DatabaseHandler; import de.deadlocker8.budgetmasterserver.main.Settings; import de.deadlocker8.budgetmasterserver.main.Utils; import de.deadlocker8.budgetmasterserver.server.category.CategoryAdd; @@ -36,6 +37,7 @@ public class SparkServer { private static Settings settings; private static Gson gson; + private static DatabaseHandler handler; public static void main(String[] args) throws URISyntaxException { @@ -63,6 +65,8 @@ public class SparkServer // DEBUG secure("certs/keystore.jks", "geheim", null, null); RouteOverview.enableRouteOverview(); + + handler = new DatabaseHandler(settings); before((request, response) -> { @@ -73,34 +77,34 @@ public class SparkServer halt(401, "Unauthorized"); } - new RepeatingPaymentUpdater(settings).updateRepeatingPayments(); + new RepeatingPaymentUpdater(handler).updateRepeatingPayments(); }); // Category - get("/category", new CategoryGetAll(settings, gson)); - get("/category/single", new CategoryGet(settings, gson)); - post("/category", new CategoryAdd(settings)); - put("/category", new CategoryUpdate(settings)); - delete("/category", new CategoryDelete(settings)); + get("/category", new CategoryGetAll(handler, gson)); + get("/category/single", new CategoryGet(handler, gson)); + post("/category", new CategoryAdd(handler)); + put("/category", new CategoryUpdate(handler)); + delete("/category", new CategoryDelete(handler)); // CategoryBudget - get("/categorybudget", new CategoryBudgetGet(settings, gson)); + get("/categorybudget", new CategoryBudgetGet(handler, gson)); // Payment // Normal - get("/payment", new PaymentGet(settings, gson)); - post("/payment", new PaymentAdd(settings)); - put("/payment", new PaymentUpdate(settings)); - delete("/payment", new PaymentDelete(settings)); + get("/payment", new PaymentGet(handler, gson)); + post("/payment", new PaymentAdd(handler)); + put("/payment", new PaymentUpdate(handler)); + delete("/payment", new PaymentDelete(handler)); // Repeating - get("/repeatingpayment/single", new RepeatingPaymentGet(settings, gson)); - get("/repeatingpayment", new RepeatingPaymentGetAll(settings, gson)); - post("/repeatingpayment", new RepeatingPaymentAdd(settings)); - delete("/repeatingpayment", new RepeatingPaymentDelete(settings)); + get("/repeatingpayment/single", new RepeatingPaymentGet(handler, gson)); + get("/repeatingpayment", new RepeatingPaymentGetAll(handler, gson)); + post("/repeatingpayment", new RepeatingPaymentAdd(handler)); + delete("/repeatingpayment", new RepeatingPaymentDelete(handler)); after((request, response) -> { - new RepeatingPaymentUpdater(settings).updateRepeatingPayments(); + new RepeatingPaymentUpdater(handler).updateRepeatingPayments(); }); Spark.exception(Exception.class, (exception, request, response) -> { diff --git a/src/de/deadlocker8/budgetmasterserver/server/category/CategoryAdd.java b/src/de/deadlocker8/budgetmasterserver/server/category/CategoryAdd.java index 12eec2798..c20739e61 100644 --- a/src/de/deadlocker8/budgetmasterserver/server/category/CategoryAdd.java +++ b/src/de/deadlocker8/budgetmasterserver/server/category/CategoryAdd.java @@ -3,7 +3,6 @@ package de.deadlocker8.budgetmasterserver.server.category; import static spark.Spark.halt; import de.deadlocker8.budgetmasterserver.main.DatabaseHandler; -import de.deadlocker8.budgetmasterserver.main.Settings; import javafx.scene.paint.Color; import spark.Request; import spark.Response; @@ -11,11 +10,11 @@ import spark.Route; public class CategoryAdd implements Route { - private Settings settings; + private DatabaseHandler handler; - public CategoryAdd(Settings settings) + public CategoryAdd( DatabaseHandler handler) { - this.settings = settings; + this.handler = handler; } @Override @@ -27,8 +26,7 @@ public class CategoryAdd implements Route } try - { - DatabaseHandler handler = new DatabaseHandler(settings); + { handler.addCategory(req.queryMap("name").value(), Color.web("#" + req.queryMap("color").value())); return ""; diff --git a/src/de/deadlocker8/budgetmasterserver/server/category/CategoryDelete.java b/src/de/deadlocker8/budgetmasterserver/server/category/CategoryDelete.java index 98f334902..3a0088e2a 100644 --- a/src/de/deadlocker8/budgetmasterserver/server/category/CategoryDelete.java +++ b/src/de/deadlocker8/budgetmasterserver/server/category/CategoryDelete.java @@ -3,18 +3,17 @@ package de.deadlocker8.budgetmasterserver.server.category; import static spark.Spark.halt; import de.deadlocker8.budgetmasterserver.main.DatabaseHandler; -import de.deadlocker8.budgetmasterserver.main.Settings; import spark.Request; import spark.Response; import spark.Route; public class CategoryDelete implements Route { - private Settings settings; + private DatabaseHandler handler; - public CategoryDelete(Settings settings) + public CategoryDelete(DatabaseHandler handler) { - this.settings = settings; + this.handler = handler; } @Override @@ -37,8 +36,7 @@ public class CategoryDelete implements Route } try - { - DatabaseHandler handler = new DatabaseHandler(settings); + { handler.deleteCategory(id); return ""; diff --git a/src/de/deadlocker8/budgetmasterserver/server/category/CategoryGet.java b/src/de/deadlocker8/budgetmasterserver/server/category/CategoryGet.java index 5736fc79d..55953ad73 100644 --- a/src/de/deadlocker8/budgetmasterserver/server/category/CategoryGet.java +++ b/src/de/deadlocker8/budgetmasterserver/server/category/CategoryGet.java @@ -6,19 +6,18 @@ import com.google.gson.Gson; import de.deadlocker8.budgetmaster.logic.Category; import de.deadlocker8.budgetmasterserver.main.DatabaseHandler; -import de.deadlocker8.budgetmasterserver.main.Settings; import spark.Request; import spark.Response; import spark.Route; public class CategoryGet implements Route { - private Settings settings; + private DatabaseHandler handler; private Gson gson; - public CategoryGet(Settings settings, Gson gson) + public CategoryGet(DatabaseHandler handler, Gson gson) { - this.settings = settings; + this.handler = handler; this.gson = gson; } @@ -43,7 +42,6 @@ public class CategoryGet implements Route try { - DatabaseHandler handler = new DatabaseHandler(settings); Category categeory = handler.getCategory(id); return gson.toJson(categeory); diff --git a/src/de/deadlocker8/budgetmasterserver/server/category/CategoryGetAll.java b/src/de/deadlocker8/budgetmasterserver/server/category/CategoryGetAll.java index c17b7ae96..75a921947 100644 --- a/src/de/deadlocker8/budgetmasterserver/server/category/CategoryGetAll.java +++ b/src/de/deadlocker8/budgetmasterserver/server/category/CategoryGetAll.java @@ -8,19 +8,18 @@ import com.google.gson.Gson; import de.deadlocker8.budgetmaster.logic.Category; import de.deadlocker8.budgetmasterserver.main.DatabaseHandler; -import de.deadlocker8.budgetmasterserver.main.Settings; import spark.Request; import spark.Response; import spark.Route; public class CategoryGetAll implements Route { - private Settings settings; + private DatabaseHandler handler; private Gson gson; - public CategoryGetAll(Settings settings, Gson gson) + public CategoryGetAll(DatabaseHandler handler, Gson gson) { - this.settings = settings; + this.handler = handler; this.gson = gson; } @@ -28,8 +27,7 @@ public class CategoryGetAll implements Route public Object handle(Request req, Response res) throws Exception { try - { - DatabaseHandler handler = new DatabaseHandler(settings); + { ArrayList<Category> categories = handler.getCategories(); return gson.toJson(categories); diff --git a/src/de/deadlocker8/budgetmasterserver/server/category/CategoryUpdate.java b/src/de/deadlocker8/budgetmasterserver/server/category/CategoryUpdate.java index 43bb4fe9f..315199436 100644 --- a/src/de/deadlocker8/budgetmasterserver/server/category/CategoryUpdate.java +++ b/src/de/deadlocker8/budgetmasterserver/server/category/CategoryUpdate.java @@ -3,7 +3,6 @@ package de.deadlocker8.budgetmasterserver.server.category; import static spark.Spark.halt; import de.deadlocker8.budgetmasterserver.main.DatabaseHandler; -import de.deadlocker8.budgetmasterserver.main.Settings; import javafx.scene.paint.Color; import spark.Request; import spark.Response; @@ -11,11 +10,11 @@ import spark.Route; public class CategoryUpdate implements Route { - private Settings settings; - - public CategoryUpdate(Settings settings) - { - this.settings = settings; + private DatabaseHandler handler; + + public CategoryUpdate(DatabaseHandler handler) + { + this.handler = handler; } @Override @@ -38,8 +37,7 @@ public class CategoryUpdate implements Route } try - { - DatabaseHandler handler = new DatabaseHandler(settings); + { handler.updateCategory(id, req.queryMap("name").value(), Color.web("#" + req.queryMap("color").value())); return ""; diff --git a/src/de/deadlocker8/budgetmasterserver/server/categorybudget/CategoryBudgetGet.java b/src/de/deadlocker8/budgetmasterserver/server/categorybudget/CategoryBudgetGet.java index 0d78bae4a..c6e752a9a 100644 --- a/src/de/deadlocker8/budgetmasterserver/server/categorybudget/CategoryBudgetGet.java +++ b/src/de/deadlocker8/budgetmasterserver/server/categorybudget/CategoryBudgetGet.java @@ -6,22 +6,20 @@ import java.util.ArrayList; import com.google.gson.Gson; -import de.deadlocker8.budgetmaster.logic.Category; import de.deadlocker8.budgetmaster.logic.CategoryBudget; import de.deadlocker8.budgetmasterserver.main.DatabaseHandler; -import de.deadlocker8.budgetmasterserver.main.Settings; import spark.Request; import spark.Response; import spark.Route; public class CategoryBudgetGet implements Route { - private Settings settings; + private DatabaseHandler handler; private Gson gson; - public CategoryBudgetGet(Settings settings, Gson gson) + public CategoryBudgetGet(DatabaseHandler handler, Gson gson) { - this.settings = settings; + this.handler = handler; this.gson = gson; } @@ -47,8 +45,7 @@ public class CategoryBudgetGet implements Route } try - { - DatabaseHandler handler = new DatabaseHandler(settings); + { ArrayList<CategoryBudget> categories = handler.getCategoryBudget(year, month); return gson.toJson(categories); diff --git a/src/de/deadlocker8/budgetmasterserver/server/payment/normal/PaymentAdd.java b/src/de/deadlocker8/budgetmasterserver/server/payment/normal/PaymentAdd.java index 41216007b..07fdabe48 100644 --- a/src/de/deadlocker8/budgetmasterserver/server/payment/normal/PaymentAdd.java +++ b/src/de/deadlocker8/budgetmasterserver/server/payment/normal/PaymentAdd.java @@ -3,18 +3,17 @@ package de.deadlocker8.budgetmasterserver.server.payment.normal; import static spark.Spark.halt; import de.deadlocker8.budgetmasterserver.main.DatabaseHandler; -import de.deadlocker8.budgetmasterserver.main.Settings; import spark.Request; import spark.Response; import spark.Route; public class PaymentAdd implements Route { - private Settings settings; + private DatabaseHandler handler; - public PaymentAdd(Settings settings) + public PaymentAdd(DatabaseHandler handler) { - this.settings = settings; + this.handler = handler; } @Override @@ -34,8 +33,7 @@ public class PaymentAdd implements Route categoryID = Integer.parseInt(req.queryMap("categoryID").value()); try - { - DatabaseHandler handler = new DatabaseHandler(settings); + { handler.addNormalPayment(amount, req.queryMap("date").value(), categoryID, req.queryMap("name").value()); return ""; diff --git a/src/de/deadlocker8/budgetmasterserver/server/payment/normal/PaymentDelete.java b/src/de/deadlocker8/budgetmasterserver/server/payment/normal/PaymentDelete.java index 490d9597b..0933a3ba5 100644 --- a/src/de/deadlocker8/budgetmasterserver/server/payment/normal/PaymentDelete.java +++ b/src/de/deadlocker8/budgetmasterserver/server/payment/normal/PaymentDelete.java @@ -3,18 +3,17 @@ package de.deadlocker8.budgetmasterserver.server.payment.normal; import static spark.Spark.halt; import de.deadlocker8.budgetmasterserver.main.DatabaseHandler; -import de.deadlocker8.budgetmasterserver.main.Settings; import spark.Request; import spark.Response; import spark.Route; public class PaymentDelete implements Route { - private Settings settings; + private DatabaseHandler handler; - public PaymentDelete(Settings settings) - { - this.settings = settings; + public PaymentDelete(DatabaseHandler handler) + { + this.handler = handler; } @Override @@ -37,8 +36,7 @@ public class PaymentDelete implements Route } try - { - DatabaseHandler handler = new DatabaseHandler(settings); + { handler.deletePayment(id); return ""; diff --git a/src/de/deadlocker8/budgetmasterserver/server/payment/normal/PaymentGet.java b/src/de/deadlocker8/budgetmasterserver/server/payment/normal/PaymentGet.java index e39a7aac9..dcaab7e84 100644 --- a/src/de/deadlocker8/budgetmasterserver/server/payment/normal/PaymentGet.java +++ b/src/de/deadlocker8/budgetmasterserver/server/payment/normal/PaymentGet.java @@ -8,19 +8,18 @@ import com.google.gson.Gson; import de.deadlocker8.budgetmaster.logic.NormalPayment; import de.deadlocker8.budgetmasterserver.main.DatabaseHandler; -import de.deadlocker8.budgetmasterserver.main.Settings; import spark.Request; import spark.Response; import spark.Route; public class PaymentGet implements Route { - private Settings settings; + private DatabaseHandler handler; private Gson gson; - public PaymentGet(Settings settings, Gson gson) + public PaymentGet(DatabaseHandler handler, Gson gson) { - this.settings = settings; + this.handler = handler; this.gson = gson; } @@ -46,8 +45,7 @@ public class PaymentGet implements Route } try - { - DatabaseHandler handler = new DatabaseHandler(settings); + { ArrayList<NormalPayment> payments = new ArrayList<>(); payments.addAll(handler.getPayments(year, month)); diff --git a/src/de/deadlocker8/budgetmasterserver/server/payment/normal/PaymentUpdate.java b/src/de/deadlocker8/budgetmasterserver/server/payment/normal/PaymentUpdate.java index dba9d8f7f..36e8368dd 100644 --- a/src/de/deadlocker8/budgetmasterserver/server/payment/normal/PaymentUpdate.java +++ b/src/de/deadlocker8/budgetmasterserver/server/payment/normal/PaymentUpdate.java @@ -3,18 +3,17 @@ package de.deadlocker8.budgetmasterserver.server.payment.normal; import static spark.Spark.halt; import de.deadlocker8.budgetmasterserver.main.DatabaseHandler; -import de.deadlocker8.budgetmasterserver.main.Settings; import spark.Request; import spark.Response; import spark.Route; public class PaymentUpdate implements Route { - private Settings settings; + private DatabaseHandler handler; - public PaymentUpdate(Settings settings) - { - this.settings = settings; + public PaymentUpdate(DatabaseHandler handler) + { + this.handler = handler; } @Override @@ -41,8 +40,7 @@ public class PaymentUpdate implements Route } try - { - DatabaseHandler handler = new DatabaseHandler(settings); + { handler.updateNormalPayment(id, amount, req.queryMap("date").value(), categoryID, req.queryMap("name").value()); return ""; diff --git a/src/de/deadlocker8/budgetmasterserver/server/payment/repeating/RepeatingPaymentAdd.java b/src/de/deadlocker8/budgetmasterserver/server/payment/repeating/RepeatingPaymentAdd.java index 132adea95..9480cb85c 100644 --- a/src/de/deadlocker8/budgetmasterserver/server/payment/repeating/RepeatingPaymentAdd.java +++ b/src/de/deadlocker8/budgetmasterserver/server/payment/repeating/RepeatingPaymentAdd.java @@ -3,18 +3,17 @@ package de.deadlocker8.budgetmasterserver.server.payment.repeating; import static spark.Spark.halt; import de.deadlocker8.budgetmasterserver.main.DatabaseHandler; -import de.deadlocker8.budgetmasterserver.main.Settings; import spark.Request; import spark.Response; import spark.Route; public class RepeatingPaymentAdd implements Route { - private Settings settings; + private DatabaseHandler handler; - public RepeatingPaymentAdd(Settings settings) - { - this.settings = settings; + public RepeatingPaymentAdd(DatabaseHandler handler) + { + this.handler = handler; } @Override @@ -38,8 +37,7 @@ public class RepeatingPaymentAdd implements Route repeatMonthDay = Integer.parseInt(req.queryMap("repeatMonthDay").value()); try - { - DatabaseHandler handler = new DatabaseHandler(settings); + { handler.addRepeatingPayment(amount, req.queryMap("date").value(), categoryID, req.queryMap("name").value(), repeatInterval, req.queryMap("repeatEndDate").value(), repeatMonthDay); return ""; diff --git a/src/de/deadlocker8/budgetmasterserver/server/payment/repeating/RepeatingPaymentDelete.java b/src/de/deadlocker8/budgetmasterserver/server/payment/repeating/RepeatingPaymentDelete.java index 6a60f3d48..b2b480c5d 100644 --- a/src/de/deadlocker8/budgetmasterserver/server/payment/repeating/RepeatingPaymentDelete.java +++ b/src/de/deadlocker8/budgetmasterserver/server/payment/repeating/RepeatingPaymentDelete.java @@ -3,18 +3,17 @@ package de.deadlocker8.budgetmasterserver.server.payment.repeating; import static spark.Spark.halt; import de.deadlocker8.budgetmasterserver.main.DatabaseHandler; -import de.deadlocker8.budgetmasterserver.main.Settings; import spark.Request; import spark.Response; import spark.Route; public class RepeatingPaymentDelete implements Route { - private Settings settings; + private DatabaseHandler handler; - public RepeatingPaymentDelete(Settings settings) - { - this.settings = settings; + public RepeatingPaymentDelete(DatabaseHandler handler) + { + this.handler = handler; } @Override @@ -37,8 +36,7 @@ public class RepeatingPaymentDelete implements Route } try - { - DatabaseHandler handler = new DatabaseHandler(settings); + { handler.deleteRepeatingPayment(id); return ""; diff --git a/src/de/deadlocker8/budgetmasterserver/server/payment/repeating/RepeatingPaymentGet.java b/src/de/deadlocker8/budgetmasterserver/server/payment/repeating/RepeatingPaymentGet.java index 6880c3974..fc6e13d84 100644 --- a/src/de/deadlocker8/budgetmasterserver/server/payment/repeating/RepeatingPaymentGet.java +++ b/src/de/deadlocker8/budgetmasterserver/server/payment/repeating/RepeatingPaymentGet.java @@ -6,22 +6,21 @@ import com.google.gson.Gson; import de.deadlocker8.budgetmaster.logic.RepeatingPayment; import de.deadlocker8.budgetmasterserver.main.DatabaseHandler; -import de.deadlocker8.budgetmasterserver.main.Settings; import spark.Request; import spark.Response; import spark.Route; public class RepeatingPaymentGet implements Route { - private Settings settings; + private DatabaseHandler handler; private Gson gson; - - public RepeatingPaymentGet(Settings settings, Gson gson) + + public RepeatingPaymentGet(DatabaseHandler handler, Gson gson) { - this.settings = settings; + this.handler = handler; this.gson = gson; } - + @Override public Object handle(Request req, Response res) throws Exception { @@ -42,8 +41,7 @@ public class RepeatingPaymentGet implements Route } try - { - DatabaseHandler handler = new DatabaseHandler(settings); + { RepeatingPayment payment = handler.getRepeatingPayment(id); return gson.toJson(payment); diff --git a/src/de/deadlocker8/budgetmasterserver/server/payment/repeating/RepeatingPaymentGetAll.java b/src/de/deadlocker8/budgetmasterserver/server/payment/repeating/RepeatingPaymentGetAll.java index 03c15965a..0d1551c5b 100644 --- a/src/de/deadlocker8/budgetmasterserver/server/payment/repeating/RepeatingPaymentGetAll.java +++ b/src/de/deadlocker8/budgetmasterserver/server/payment/repeating/RepeatingPaymentGetAll.java @@ -8,22 +8,21 @@ import com.google.gson.Gson; import de.deadlocker8.budgetmaster.logic.RepeatingPaymentEntry; import de.deadlocker8.budgetmasterserver.main.DatabaseHandler; -import de.deadlocker8.budgetmasterserver.main.Settings; import spark.Request; import spark.Response; import spark.Route; public class RepeatingPaymentGetAll implements Route { - private Settings settings; + private DatabaseHandler handler; private Gson gson; - public RepeatingPaymentGetAll(Settings settings, Gson gson) - { - this.settings = settings; + public RepeatingPaymentGetAll(DatabaseHandler handler, Gson gson) + { + this.handler = handler; this.gson = gson; } - + @Override public Object handle(Request req, Response res) throws Exception { @@ -46,8 +45,7 @@ public class RepeatingPaymentGetAll implements Route } try - { - DatabaseHandler handler = new DatabaseHandler(settings); + { ArrayList<RepeatingPaymentEntry> payments = new ArrayList<>(); payments.addAll(handler.getRepeatingPayments(year, month)); diff --git a/src/de/deadlocker8/budgetmasterserver/server/updater/RepeatingPaymentUpdater.java b/src/de/deadlocker8/budgetmasterserver/server/updater/RepeatingPaymentUpdater.java index 7bbc6fd95..a206cd4ff 100644 --- a/src/de/deadlocker8/budgetmasterserver/server/updater/RepeatingPaymentUpdater.java +++ b/src/de/deadlocker8/budgetmasterserver/server/updater/RepeatingPaymentUpdater.java @@ -9,24 +9,22 @@ import org.joda.time.Months; import de.deadlocker8.budgetmaster.logic.LatestRepeatingPayment; import de.deadlocker8.budgetmaster.logic.RepeatingPayment; import de.deadlocker8.budgetmasterserver.main.DatabaseHandler; -import de.deadlocker8.budgetmasterserver.main.Settings; import logger.LogLevel; import logger.Logger; public class RepeatingPaymentUpdater { - private Settings settings; + private DatabaseHandler handler; - public RepeatingPaymentUpdater(Settings settings) + public RepeatingPaymentUpdater(DatabaseHandler handler) { - this.settings = settings; + this.handler = handler; } public void updateRepeatingPayments() { try - { - DatabaseHandler handler = new DatabaseHandler(settings); + { ArrayList<RepeatingPayment> repeatingPayments = handler.getAllRepeatingPayments(); ArrayList<LatestRepeatingPayment> latest = handler.getLatestRepeatingPaymentEntries();; -- GitLab