diff --git a/.env b/.env deleted file mode 100644 index 2e0057f..0000000 --- a/.env +++ /dev/null @@ -1,19 +0,0 @@ -# Paths -INIT_PATH=./workdir/init/ -DEPLOYMENT_PATH=./build/libs/ -DATABASE_INIT_PATH=./workdir/db/init/ -DATABASE_DATA_PATH=./mysql-volume/ - -# Wildfly config -WILDFLY_VERSION=23.0.0.Final -WILDFLY_DEBUG=false -WILDFLY_ADMIN_USER=admin -WILDFLY_ADMIN_PASS=pass - -# MySQL config -MYSQL_VERSION=8.0 -MYSQL_DATABASE=pixel -MYSQL_USER=mysql -MYSQL_PASSWORD=mysql -MYSQL_ROOT_PASSWORD=pass -MYSQL_CONNECTOR_VERSION=8.0.23 diff --git a/.gitignore b/.gitignore index e2785fe..35be5d4 100644 --- a/.gitignore +++ b/.gitignore @@ -7,4 +7,4 @@ bin .sass-cache # Ignore docker volume directory -mysql-volume +docker/mariadb-volume/ diff --git a/build.gradle b/build.gradle index 54afc9f..cd378b6 100644 --- a/build.gradle +++ b/build.gradle @@ -18,8 +18,8 @@ dependencies { // Pour pouvoir parser le JSON implementation 'com.google.code.gson:gson:2.8.6' + // pour permettre la persistence des données dans une db implementation 'org.hibernate:hibernate-core:5.4.30.Final' - // implementation 'mysql:mysql-connector-java:8.0.24' // des fonctions pratiques implementation 'org.apache.commons:commons-lang3:3.0' diff --git a/docker/.env b/docker/.env new file mode 100644 index 0000000..6bd485d --- /dev/null +++ b/docker/.env @@ -0,0 +1,9 @@ +# Wildfly config +WILDFLY_ADMIN_USER=admin +WILDFLY_ADMIN_PASS=pass + +# MySQL config +MYSQL_DATABASE=pixel +MYSQL_USER=mysql +MYSQL_PASSWORD=mysql +MYSQL_ROOT_PASSWORD=pass diff --git a/docker/Dockerfile b/docker/Dockerfile new file mode 100644 index 0000000..6bb019b --- /dev/null +++ b/docker/Dockerfile @@ -0,0 +1,23 @@ +FROM quay.io/wildfly/wildfly + +# Enviorment variables +ENV WILDFLY_USER admin +ENV WILDFLY_PASS pass + +ENV DB_NAME sample +ENV DB_USER mysql +ENV DB_PASS mysql +ENV DB_URI localhost:3306 + +RUN echo "=> Downloading MariaDB driver" +RUN curl https://downloads.mariadb.com/Connectors/java/connector-java-3.0.4/mariadb-java-client-3.0.4.jar > /opt/jboss/mariadb.driver.jar + +ENV JBOSS_CLI /opt/jboss/wildfly/bin/jboss-cli.sh +ENV DEPLOYMENT_DIR /opt/jboss/wildfly/standalone/deployments/ + +# Expose http and admin ports and debug port +EXPOSE 8080 9990 + +RUN mkdir -p ${JBOSS_HOME}/customization/init.d +ADD docker-entrypoint.sh /opt/jboss/wildfly/customization/ +CMD ["/opt/jboss/wildfly/customization/docker-entrypoint.sh"] diff --git a/docker-compose.yml b/docker/docker-compose.yml old mode 100644 new mode 100755 similarity index 55% rename from docker-compose.yml rename to docker/docker-compose.yml index a3c1710..ecb0f1e --- a/docker-compose.yml +++ b/docker/docker-compose.yml @@ -1,26 +1,28 @@ version: "3" services: - wildfly: + app: hostname: wildfly container_name: wildfly - image: kaaass/wildfly-mysql + build: + context: . + network: host environment: - - WILDFLY_DEBUG=${WILDFLY_DEBUG} - WILDFLY_USER=${WILDFLY_ADMIN_USER} - WILDFLY_PASS=${WILDFLY_ADMIN_PASS} - DB_NAME=${MYSQL_DATABASE} - DB_USER=${MYSQL_USER} - DB_PASS=${MYSQL_PASSWORD} - - DB_URI=mariadb:3306 - depends_on: - - db + - DB_URI=db:3306 volumes: - - ${DEPLOYMENT_PATH}:/opt/jboss/wildfly/standalone/deployments/:rw + - ../build/libs/:/opt/jboss/wildfly/standalone/deployments/ ports: - "8080:8080" # application - "9990:9990" # admin console - - "8787:8787" # java debug + depends_on: + db: + condition: service_healthy + restart: unless-stopped db: hostname: mariadb @@ -32,6 +34,19 @@ services: - MYSQL_PASSWORD=${MYSQL_PASSWORD} - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD} volumes: - - ${DATABASE_DATA_PATH}:/var/lib/mysql/ # data storage + - ./mariadb-volume/:/var/lib/mysql/ # data storage ports: - "3306:3306" + healthcheck: + test: + [ + "CMD-SHELL", + 'mysqladmin -p$$MYSQL_ROOT_PASSWORD -h localhost ping | grep "mysqld is alive" || exit 1', + ] + interval: 2s + retries: 30 + restart: unless-stopped + +volumes: + mariadb-volume: + driver: local diff --git a/docker/docker-entrypoint.sh b/docker/docker-entrypoint.sh new file mode 100755 index 0000000..3a02af0 --- /dev/null +++ b/docker/docker-entrypoint.sh @@ -0,0 +1,70 @@ +#!/bin/bash +set -e + +if [[ ! -f $JBOSS_HOME/.setup ]]; then + + # run init script + if (ls ${JBOSS_HOME}/customization/init.d/* 1>/dev/null 2>&1); then + for f in ${JBOSS_HOME}/customization/init.d/*; do + echo "=> Run custom init script '$f'" + bash "$f" + done + fi + + # Set environment variables + DATASOURCE=java:/jdbc/datasources/${DB_NAME}DS + + # Setup WildFly admin user + echo "=> Add WildFly administrator" + $JBOSS_HOME/bin/add-user.sh -u $WILDFLY_USER -p $WILDFLY_PASS --silent + + # Configure datasource + echo "=> Create datasource: '${DATASOURCE}'" + $JBOSS_CLI < Clean up" + rm -rf $JBOSS_HOME/standalone/configuration/standalone_xml_history/* \ + $JBOSS_HOME/standalone/log/* \ + /tmp/*.jar + unset WILDFLY_USER WILDFLY_PASS DB_NAME DB_USER DB_PASS DATASOURCE + + touch $JBOSS_HOME/.setup + echo "=> Setup finished !!" +fi + +echo "=> Start WildFly" +# Boot WildFly in standalone mode and bind it to all interfaces (enable admin console and debug) +$JBOSS_HOME/bin/standalone.sh -b 0.0.0.0 -bmanagement 0.0.0.0 diff --git a/src/main/java/com/pixels/Backend.java b/src/main/java/com/pixels/Backend.java new file mode 100644 index 0000000..1ab4a65 --- /dev/null +++ b/src/main/java/com/pixels/Backend.java @@ -0,0 +1,8 @@ +package com.pixels; + +import javax.ws.rs.ApplicationPath; +import javax.ws.rs.core.Application; + +@ApplicationPath("/api") +public class Backend extends Application { +} diff --git a/src/main/java/com/pixels/beans/Group.java b/src/main/java/com/pixels/beans/Groupe.java similarity index 76% rename from src/main/java/com/pixels/beans/Group.java rename to src/main/java/com/pixels/beans/Groupe.java index 7f644d8..3aac979 100644 --- a/src/main/java/com/pixels/beans/Group.java +++ b/src/main/java/com/pixels/beans/Groupe.java @@ -8,8 +8,8 @@ import java.io.Serializable; @Data @Entity -@NamedQuery(name = "Group.list", query = "SELECT g FROM Group g") -public class Group implements Serializable { +@NamedQuery(name = "Groupe.list", query = "SELECT g FROM Groupe g") +public class Groupe implements Serializable { @Id // clé primaire @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -20,5 +20,4 @@ public class Group implements Serializable { @OneToOne // le wallet commun à tous les membres du groupe private Wallet wallet; - } \ No newline at end of file diff --git a/src/main/java/com/pixels/services/PixelService.java b/src/main/java/com/pixels/services/PixelService.java new file mode 100644 index 0000000..3b19b93 --- /dev/null +++ b/src/main/java/com/pixels/services/PixelService.java @@ -0,0 +1,51 @@ +package com.pixels.services; + +import java.util.List; + +import javax.ejb.Singleton; +import javax.json.Json; +import javax.json.JsonObject; +import javax.json.JsonObjectBuilder; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.ws.rs.Consumes; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; + +import com.google.gson.Gson; +import com.pixels.beans.Pixel; + +@Singleton +@Path("/pixel") +public class PixelService { + + @PersistenceContext + private EntityManager em; + + Gson gson = new Gson(); + + @GET + @Produces(MediaType.APPLICATION_JSON) + public String list() { + List query = em.createNamedQuery("Pixel.list", Pixel.class).getResultList(); + return gson.toJson(query); + } + + @POST + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + public JsonObject add() { + + JsonObjectBuilder response = Json.createObjectBuilder(); + + Pixel pixel = new Pixel(); + em.persist(pixel); + + response.add("status", "pixel created !"); + return response.build(); + } + +} \ No newline at end of file diff --git a/src/main/resources/META-INF/persistence.xml b/src/main/resources/META-INF/persistence.xml index 33a4cbd..5a8adaf 100644 --- a/src/main/resources/META-INF/persistence.xml +++ b/src/main/resources/META-INF/persistence.xml @@ -7,13 +7,10 @@ java:/jdbc/datasources/pixelDS - - - - + \ No newline at end of file