diff --git a/deployment/stats/conf.json.template b/deployment/stats/conf.json.template index d12a423..9960bcd 100644 --- a/deployment/stats/conf.json.template +++ b/deployment/stats/conf.json.template @@ -1,5 +1,5 @@ { - "name": "fr.wseduc~stats~1.12-SNAPSHOT", + "name": "fr.wseduc~stats~1.12.12", "config": { "main" : "fr.wseduc.stats.Stats", "port" : 8225, diff --git a/gradle.properties b/gradle.properties index ca3c3c2..26ea445 100644 --- a/gradle.properties +++ b/gradle.properties @@ -29,6 +29,6 @@ vertxVersion=3.9.5 toolsVersion=2.0.0-final junitVersion=4.10 -entCoreVersion=4.6-SNAPSHOT +entCoreVersion=4.9-SNAPSHOT vertxCronTimer=2.0.0 jodaTimeVersion=2.9.4 diff --git a/gulpfile.js b/gulpfile.js index f3a9846..bc7ea25 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -1,10 +1,8 @@ var gulp = require('gulp'); var webpack = require('webpack-stream'); var merge = require('merge2'); -var rev = require('gulp-rev'); -var revReplace = require("gulp-rev-replace"); +const replace = require('gulp-replace'); var clean = require('gulp-clean'); -var sourcemaps = require('gulp-sourcemaps'); var argv = require('yargs').argv; var fs = require('fs'); @@ -13,16 +11,7 @@ gulp.task('drop-cache', function(){ .pipe(clean()); }); -gulp.task('copy-files', ['drop-cache'], () => { - var html = gulp.src('./node_modules/entcore/src/template/**/*.html') - .pipe(gulp.dest('./src/main/resources/public/template/entcore')); - var bundle = gulp.src('./node_modules/entcore/bundle/*') - .pipe(gulp.dest('./src/main/resources/public/dist/entcore')); - - return merge(html, bundle); -}) - -gulp.task('webpack', ['copy-files'], () => { +gulp.task('webpack', ['drop-cache'], () => { return gulp.src('./src/main/resources/public') .pipe(webpack(require('./webpack.config.js'))) .on('error', function handleError() { @@ -31,17 +20,9 @@ gulp.task('webpack', ['copy-files'], () => { .pipe(gulp.dest('./src/main/resources/public/dist')); }); -gulp.task('rev', ['webpack'], () => { - return gulp.src('./src/main/resources/public/dist/**/*.js') - .pipe(rev()) - .pipe(gulp.dest('./src/main/resources/public/dist')) - .pipe(rev.manifest()) - .pipe(gulp.dest('./')); -}); - -gulp.task('build', ['rev'], () => { +gulp.task('build', ['webpack'], () => { var refs = gulp.src("./src/main/resources/view-src/**/*.+(html|json|csv)") - .pipe(revReplace({manifest: gulp.src("./rev-manifest.json") })) + .pipe(replace('@@VERSION', Date.now())) .pipe(gulp.dest("./src/main/resources/view")); var copyBehaviours = gulp.src('./src/main/resources/public/dist/behaviours.js') diff --git a/package.json b/package.json index 1d94892..027abaa 100644 --- a/package.json +++ b/package.json @@ -7,13 +7,10 @@ "@types/core-js": "0.9.42", "axios": "0.16.2", "core-js": "2.4.1", - "entcore": "~4.6.0-dev", + "entcore": "~4.8.0-dev", "entcore-toolkit": "^1.0.1", "gulp": "3.9.1", "gulp-clean": "^0.3.2", - "gulp-rev": "^7.1.2", - "gulp-rev-replace": "^0.4.3", - "gulp-sourcemaps": "^2.6.0", "merge2": "^1.1.0", "ts-loader": "^3.2.0", "typescript": "3.9.5", @@ -22,7 +19,8 @@ "yargs": "^8.0.2" }, "devDependencies": { - "@types/jquery": "^2.0.34" + "@types/jquery": "^2.0.34", + "gulp-replace": "1.0.0" }, "scripts": { "test": "echo \"Error: no test specified\" && exit 1" diff --git a/src/main/java/fr/wseduc/stats/Stats.java b/src/main/java/fr/wseduc/stats/Stats.java index fab93ef..aef4fa8 100644 --- a/src/main/java/fr/wseduc/stats/Stats.java +++ b/src/main/java/fr/wseduc/stats/Stats.java @@ -24,6 +24,10 @@ import java.text.ParseException; +import io.vertx.pgclient.PgConnectOptions; +import io.vertx.pgclient.PgPool; +import io.vertx.pgclient.SslMode; +import io.vertx.sqlclient.PoolOptions; import org.entcore.common.aggregation.MongoConstants.COLLECTIONS; import org.entcore.common.events.EventHelper; import org.entcore.common.events.EventStore; @@ -31,9 +35,6 @@ import org.entcore.common.http.BaseServer; import org.entcore.common.mongodb.MongoDbConf; -import io.reactiverse.pgclient.PgClient; -import io.reactiverse.pgclient.PgPool; -import io.reactiverse.pgclient.PgPoolOptions; import io.vertx.core.json.JsonObject; import io.vertx.core.logging.Logger; import io.vertx.core.logging.LoggerFactory; @@ -85,23 +86,31 @@ public void start() throws Exception { final JsonObject readPGConfig = config.getJsonObject("read-pg-config"); final boolean oldStats = config.getBoolean("mongo-stats-service", false); if (readPGConfig != null && !readPGConfig.isEmpty() && !oldStats) { - final PgPoolOptions options = new PgPoolOptions().setPort(readPGConfig.getInteger("port", 5432)) + final PgConnectOptions connectOptions = new PgConnectOptions().setPort(readPGConfig.getInteger("port", 5432)) .setHost(readPGConfig.getString("host")).setDatabase(readPGConfig.getString("database")) - .setUser(readPGConfig.getString("user")).setPassword(readPGConfig.getString("password")) - .setMaxSize(readPGConfig.getInteger("pool-size", 5)); - PgPool pgPool = PgClient.pool(vertx, options); + .setUser(readPGConfig.getString("user")).setPassword(readPGConfig.getString("password")); + final SslMode sslMode = SslMode.valueOf(readPGConfig.getString("ssl-mode", "DISABLE")); + if (!SslMode.DISABLE.equals(sslMode)) { + connectOptions.setSslMode(sslMode).setTrustAll(SslMode.ALLOW.equals(sslMode) || SslMode.PREFER.equals(sslMode) || SslMode.REQUIRE.equals(sslMode)); + } + PoolOptions poolOptions = new PoolOptions().setMaxSize(readPGConfig.getInteger("pool-size", 5)); + PgPool pgPool = PgPool.pool(vertx, connectOptions, poolOptions); statsService = new PGStatsService(platformId, config.getJsonObject("api-allowed-values")); ((PGStatsService) statsService).setReadPgPool(pgPool); } else if (eventStoreConfig != null && eventStoreConfig.getJsonObject("postgresql-slave") != null && !oldStats) { final JsonObject eventStorePGConfig = eventStoreConfig.getJsonObject("postgresql-slave"); - final PgPoolOptions options = new PgPoolOptions() + final PgConnectOptions connectOptions = new PgConnectOptions() .setPort(eventStorePGConfig.getInteger("port", 5432)) .setHost(eventStorePGConfig.getString("host")) .setDatabase(eventStorePGConfig.getString("database")) .setUser(eventStorePGConfig.getString("user")) - .setPassword(eventStorePGConfig.getString("password")) - .setMaxSize(eventStorePGConfig.getInteger("pool-size", 5)); - PgPool pgPool = PgClient.pool(vertx, options); + .setPassword(eventStorePGConfig.getString("password")); + final SslMode sslMode = SslMode.valueOf(eventStorePGConfig.getString("ssl-mode", "DISABLE")); + if (!SslMode.DISABLE.equals(sslMode)) { + connectOptions.setSslMode(sslMode).setTrustAll(SslMode.ALLOW.equals(sslMode) || SslMode.PREFER.equals(sslMode) || SslMode.REQUIRE.equals(sslMode)); + } + PoolOptions poolOptions = new PoolOptions().setMaxSize(eventStorePGConfig.getInteger("pool-size", 5)); + PgPool pgPool = PgPool.pool(vertx, connectOptions, poolOptions); statsService = new PGStatsService(platformId, config.getJsonObject("api-allowed-values")); ((PGStatsService) statsService).setReadPgPool(pgPool); } else { diff --git a/src/main/java/fr/wseduc/stats/services/PGStatsService.java b/src/main/java/fr/wseduc/stats/services/PGStatsService.java index 74821bc..d8164a0 100644 --- a/src/main/java/fr/wseduc/stats/services/PGStatsService.java +++ b/src/main/java/fr/wseduc/stats/services/PGStatsService.java @@ -5,15 +5,15 @@ import java.util.stream.IntStream; import java.time.LocalDateTime; +import io.vertx.pgclient.PgPool; +import io.vertx.sqlclient.Row; +import io.vertx.sqlclient.RowSet; +import io.vertx.sqlclient.Tuple; import org.entcore.common.utils.StringUtils; import org.entcore.common.validation.ValidationException; import fr.wseduc.webutils.Either; import fr.wseduc.webutils.Utils; -import io.reactiverse.pgclient.PgPool; -import io.reactiverse.pgclient.PgRowSet; -import io.reactiverse.pgclient.Row; -import io.reactiverse.pgclient.Tuple; import io.vertx.core.AsyncResult; import io.vertx.core.Handler; import io.vertx.core.MultiMap; @@ -87,7 +87,7 @@ private void listStats(MultiMap params, boolean export, String language, Handler } log.info("query : " + query); log.info("tuple : " + deepToString(t)); - readPgPool.preparedQuery(query, t, pgRowsToEither(handler)); + readPgPool.preparedQuery(query).execute(t, pgRowsToEither(handler)); } catch (Exception e) { handler.handle(new Either.Left<>(e.getMessage())); } @@ -193,10 +193,10 @@ private String genDeviceQuery(MultiMap params, final List entityIds, fin return query; } - private Handler> pgRowsToEither(Handler> handler) { + private Handler>> pgRowsToEither(Handler> handler) { return ar -> { if (ar.succeeded()) { - final PgRowSet rows = ar.result(); + final RowSet rows = ar.result(); final List columns = rows.columnsNames(); final JsonArray res = new JsonArray(); for (Row row: rows) { diff --git a/src/main/resources/api-allowed-values.json b/src/main/resources/api-allowed-values.json index ae3a4b0..1ed4f1f 100644 --- a/src/main/resources/api-allowed-values.json +++ b/src/main/resources/api-allowed-values.json @@ -8,13 +8,13 @@ "AideAuDevoirs","Alise","artips","Balado","BiblioCollege","Brne","Capytale","CerisePrim","CerisePro","Cesame","Chamilo", "CIDJ","CNS","corelycee","DeltaExpert","Educagri","Educ-Arte","Edulib","Edulib2","Edulib-Belin","Edulib-Magnard","EduMalin","EduMaxicours","EduMedia", "edumoov","Elea","Eliot","ElyceeHDF","English-Attack","Esidoc","EulerRessources","EulerRessources-pp","ExplorateurDeMetiers","FoliosOnisep", - "Formulaire","Formulaire-public","Diary","Edt","Competences","Viescolaire","Geogebra","GRR", - "HiSQOOL","Homework-assistance","HumanRoads","Interforum","InterForum","JuniorUniversalis","KiosqueEDU","KiosqueEDU-aca","KNE-Annabac","KNE-CNS","Kwyk","Labomep","LaboMEP", - "LDE","LeLivreScolaire","LeSite-tv","library","Lool","Lstl","madmagz","madmagz-77","madmagz-aisne","madmagz-draaf","madmagz-ent04","madmagz-idf","madmagz-na", + "Formulaire","Formulaire-public","Diary","Edt","Competences","Viescolaire","Geogebra","GRR", "Jupyter", + "HiSQOOL","HomeworkAssistance","HumanRoads","Interforum","InterForum","JuniorUniversalis","KiosqueEDU","KiosqueEDU-aca","KNE-Annabac","KNE-CNS","Kwyk","Labomep","LaboMEP", + "LDE","LeLivreScolaire","LeSite-tv","library","Lool","Lstl","Lystore","madmagz","madmagz-77","madmagz-aisne","madmagz-draaf","madmagz-ent04","madmagz-idf","madmagz-na", "madmagz-nord","madmagz-oise","madmagz-paris","madmagz-regionhdf","madmagz-somme1d","madmagz-somme2d","milliweb-oAuth","MindViewOnline","Moodle","MSEL", - "numericours","numeritab","OGIL","OGIL-Region","Onisep","Onisep-Services","Passerelle","PasserellePise","Pearltrees","Peertube NA","PMB-lyceeconnecte","ProEPS", - "projet-voltaire","Pronote","Riot Region","Sacoche","Salvum","Scratch","Speakshake","Tactileo","TurboSelf","Universalis","Universalis-Junior", - "Webclasseur","Wekan Region","Wims-Auto","Wims-Euler","Wims-Math" + "numericours","numeritab","OGIL","OGIL-Region","Onisep","Onisep-Services","Passerelle","PasserellePise","Pearltrees","Peertube","PMB-lyceeconnecte","PMB-Gestion-lyceeconnecte", + "ProEPS","projet-voltaire","Pronote","Riot","Sacoche","Salvum","Scratch","Speakshake","Tactileo","TurboSelf","Universalis","Universalis-Junior", + "Webclasseur","Wekan","Wims-Auto","Wims-Euler","Wims-Math" ], "devices-mapping" : { "select-devices" : ["desktop", "mobile_app", "tablet"], diff --git a/src/main/resources/i18n/en.json b/src/main/resources/i18n/en.json index c34c44e..c17f791 100644 --- a/src/main/resources/i18n/en.json +++ b/src/main/resources/i18n/en.json @@ -57,5 +57,24 @@ "myaccount": "My Account", "classparam": "Class settings", "zimbra" : "Messaging", - "presences" : "Attendance" + "presences" : "Attendance", + "webconference": "Access to a virtual room", + "moodle": "Moodle", + "pmb-lyceeconnecte": "PMB", + "pmb-gestion-lyceeconnecte" : "PMB Gestion", + "capytale": "Capytale", + "cerisepro": "Cerise Pro", + "edumedia": "Edumedia", + "esidoc": "Esidoc", + "foliosonisep": "Folios Onisep", + "library": "Library", + "onisep": "Onisep", + "pronote": "Pronote", + "scratch": "Scratch", + "geogebra": "GeoGebra", + "lool": "Lool", + "riot": "Riot", + "wekan": "Wekan", + "peertube": "Peertube", + "jupyter": "Jupyter" } diff --git a/src/main/resources/i18n/fr.json b/src/main/resources/i18n/fr.json index a1475be..7574145 100644 --- a/src/main/resources/i18n/fr.json +++ b/src/main/resources/i18n/fr.json @@ -100,5 +100,24 @@ "stats.error.nonadmlofstructure": "Vous n'avez pas accès aux statistiques de l'établissement, merci de sélectionner une classe", "stats.error.nodata":"Données indisponibles", "stats.support": "Support", - "webconference": "Accès à une salle virtuelle" + "webconference": "Accès à une salle virtuelle", + "homeworkassistance": "Homework-Assistance", + "moodle": "Moodle", + "pmb-lyceeconnecte": "PMB", + "pmb-gestion-lyceeconnecte" : "PMB Gestion", + "capytale": "Capytale", + "cerisepro": "Cerise Pro", + "edumedia": "Edumedia", + "esidoc": "Esidoc", + "foliosonisep": "Folios Onisep", + "library": "Bibliothèque", + "onisep": "Onisep", + "pronote": "Pronote", + "scratch": "Scratch", + "geogebra": "GeoGebra", + "lool": "Lool", + "riot": "Messagerie Riot", + "wekan": "Wekan", + "peertube": "Peertube", + "jupyter": "Jupyter" } diff --git a/src/main/resources/view-src/stats.html b/src/main/resources/view-src/stats.html index cc67128..fab500d 100644 --- a/src/main/resources/view-src/stats.html +++ b/src/main/resources/view-src/stats.html @@ -5,11 +5,10 @@ {{#i18n}}stats.title{{/i18n}} - - - - + + +