diff --git a/back/Dockerfile b/back/Dockerfile
index 2d4b2d5..b8462a2 100644
--- a/back/Dockerfile
+++ b/back/Dockerfile
@@ -1,7 +1,8 @@
-FROM maven:3.6.3-openjdk-16 AS build
+FROM maven:3-openjdk-23 AS build
COPY pom.xml /tmp/
COPY src /tmp/src/
+COPY Formatter.xml /tmp/
WORKDIR /tmp/
RUN mvn clean compile assembly:single
diff --git a/back/pom.xml b/back/pom.xml
index 3a58770..beac2b7 100644
--- a/back/pom.xml
+++ b/back/pom.xml
@@ -5,9 +5,9 @@
karideo
0.3.0
- 3.1
- 21
- 21
+ 3.13.0
+ 23
+ 23
3.1.1
@@ -20,17 +20,34 @@
kangaroo-and-rabbit
archidata
- 0.12.0
+ 0.23.6
+
org.slf4j
- slf4j-simple
- 2.1.0-alpha1
+ jul-to-slf4j
+ 2.0.9
+
+
+
+ ch.qos.logback
+ logback-classic
+ 1.4.11
+
+
+ xerces
+ xercesImpl
+ 2.12.2
+
+
+ org.codehaus.janino
+ janino
+ 3.1.9
com.fasterxml.jackson.datatype
jackson-datatype-jsr310
- 2.17.1
+ 2.18.1
org.apache.maven.plugins
maven-source-plugin
- 3.2.1
+ 4.0.0-beta-1
attach-sources
@@ -110,10 +156,12 @@
org.apache.maven.plugins
maven-surefire-plugin
- 3.0.0-M5
+ 3.2.5
+ org.apache.maven.plugins
maven-assembly-plugin
+ 3.7.1
@@ -125,80 +173,21 @@
-
-
org.apache.maven.plugins
maven-javadoc-plugin
- 3.2.0
+ 3.3.0
private
true
-
- org.codehaus.mojo
- exec-maven-plugin
- 3.1.0
-
-
- exec-application
- package
-
- java
-
-
-
-
- org.kar.karideo.WebLauncher
-
-
+
net.revelc.code.formatter
formatter-maven-plugin
- 2.23.0
+ 2.24.1
UTF-8
LF
@@ -229,14 +218,6 @@
spotbugs-security-include.xml
spotbugs-security-exclude.xml
-
@@ -247,7 +228,7 @@
org.apache.maven.plugins
maven-javadoc-plugin
- 3.2.0
+ 3.3.0
public
diff --git a/back/src/org/kar/karideo/GenerateApi.java b/back/src/org/kar/karideo/GenerateApi.java
new file mode 100644
index 0000000..1e68c7d
--- /dev/null
+++ b/back/src/org/kar/karideo/GenerateApi.java
@@ -0,0 +1,17 @@
+package org.kar.karideo;
+
+import org.kar.karideo.migration.Initialization;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class GenerateApi {
+ private final static Logger LOGGER = LoggerFactory.getLogger(GenerateApi.class);
+
+ private GenerateApi() {}
+
+ public static void main(final String[] args) throws Exception {
+ LOGGER.info("Generate API");
+ Initialization.generateObjects();
+ LOGGER.info("STOP the REST server.");
+ }
+}
diff --git a/back/src/org/kar/karideo/WebLauncher.java b/back/src/org/kar/karideo/WebLauncher.java
index 16264ca..4653ea0 100755
--- a/back/src/org/kar/karideo/WebLauncher.java
+++ b/back/src/org/kar/karideo/WebLauncher.java
@@ -1,21 +1,22 @@
package org.kar.karideo;
import java.net.URI;
+import java.util.logging.LogManager;
import org.glassfish.grizzly.http.server.HttpServer;
import org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory;
import org.glassfish.jersey.jackson.JacksonFeature;
import org.glassfish.jersey.media.multipart.MultiPartFeature;
import org.glassfish.jersey.server.ResourceConfig;
-import org.kar.archidata.GlobalConfiguration;
import org.kar.archidata.UpdateJwtPublicKey;
import org.kar.archidata.api.DataResource;
import org.kar.archidata.catcher.GenericCatcher;
-import org.kar.archidata.db.DBConfig;
+import org.kar.archidata.db.DbConfig;
import org.kar.archidata.filter.CORSFilter;
import org.kar.archidata.filter.OptionFilter;
import org.kar.archidata.migration.MigrationEngine;
import org.kar.archidata.tools.ConfigBaseVariable;
+import org.kar.archidata.tools.ContextGenericTools;
import org.kar.karideo.api.Front;
import org.kar.karideo.api.HealthCheck;
import org.kar.karideo.api.MediaResource;
@@ -30,14 +31,16 @@ import org.kar.karideo.migration.Migration20230810;
import org.kar.karideo.migration.Migration20231015;
import org.kar.karideo.migration.Migration20231126;
import org.kar.karideo.migration.Migration20240226;
+import org.kar.karideo.migration.Migration20240611;
+import org.kar.karideo.migration.Migration20250214;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import org.slf4j.bridge.SLF4JBridgeHandler;
import jakarta.ws.rs.core.UriBuilder;
public class WebLauncher {
final static Logger LOGGER = LoggerFactory.getLogger(WebLauncher.class);
- public static DBConfig dbConfig;
protected UpdateJwtPublicKey keyUpdater = null;
protected HttpServer server = null;
@@ -59,12 +62,18 @@ public class WebLauncher {
migrationEngine.add(new Migration20231015());
migrationEngine.add(new Migration20231126());
migrationEngine.add(new Migration20240226());
+ migrationEngine.add(new Migration20240611());
+ migrationEngine.add(new Migration20250214());
WebLauncher.LOGGER.info("Migrate the DB [START]");
- migrationEngine.migrateWaitAdmin(GlobalConfiguration.dbConfig);
+ migrationEngine.migrateWaitAdmin(new DbConfig());
WebLauncher.LOGGER.info("Migrate the DB [STOP]");
}
public static void main(final String[] args) throws Exception {
+ // Loop-back of logger JDK logging API to SLF4J
+ LogManager.getLogManager().reset();
+ SLF4JBridgeHandler.install();
+
WebLauncher.LOGGER.info("[START] application wake UP");
final WebLauncher launcher = new WebLauncher();
launcher.migrateDB();
@@ -104,7 +113,7 @@ public class WebLauncher {
rc.register(HealthCheck.class);
rc.register(Front.class);
-
+ ContextGenericTools.addJsr310(rc);
// add jackson to be discover when we are ins stand-alone server
rc.register(JacksonFeature.class);
// enable this to show low level request
diff --git a/back/src/org/kar/karideo/WebLauncherLocal.java b/back/src/org/kar/karideo/WebLauncherLocal.java
index e04e70b..a6c3827 100755
--- a/back/src/org/kar/karideo/WebLauncherLocal.java
+++ b/back/src/org/kar/karideo/WebLauncherLocal.java
@@ -1,40 +1,25 @@
package org.kar.karideo;
-import java.util.List;
+import java.util.logging.LogManager;
-import org.kar.archidata.api.DataResource;
-import org.kar.archidata.externalRestApi.AnalyzeApi;
-import org.kar.archidata.externalRestApi.TsGenerateApi;
import org.kar.archidata.tools.ConfigBaseVariable;
-import org.kar.karideo.api.Front;
-import org.kar.karideo.api.HealthCheck;
-import org.kar.karideo.api.MediaResource;
-import org.kar.karideo.api.SeasonResource;
-import org.kar.karideo.api.SeriesResource;
-import org.kar.karideo.api.TypeResource;
-import org.kar.karideo.api.UserMediaAdvancementResource;
-import org.kar.karideo.api.UserResource;
+import org.kar.karideo.migration.Initialization;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import org.slf4j.bridge.SLF4JBridgeHandler;
public class WebLauncherLocal extends WebLauncher {
- private final static Logger LOGGER = LoggerFactory.getLogger(WebLauncherLocal.class);
+ private static final Logger LOGGER = LoggerFactory.getLogger(WebLauncherLocal.class);
private WebLauncherLocal() {}
- public static void generateObjects() throws Exception {
- LOGGER.info("Generate APIs");
- final List> listOfResources = List.of(Front.class, HealthCheck.class, SeasonResource.class, SeriesResource.class, TypeResource.class, UserMediaAdvancementResource.class,
- UserResource.class, MediaResource.class, DataResource.class);
- final AnalyzeApi api = new AnalyzeApi();
- api.addAllApi(listOfResources);
- TsGenerateApi.generateApi(api, "../front/src/app/back-api/");
- LOGGER.info("Generate APIs (DONE)");
- }
-
public static void main(final String[] args) throws Exception {
- generateObjects();
+ // Loop-back of logger JDK logging API to SLF4J
+ LogManager.getLogManager().reset();
+ SLF4JBridgeHandler.install();
+ // Generate the APIs in type-script
+ Initialization.generateObjects();
final WebLauncherLocal launcher = new WebLauncherLocal();
launcher.process();
LOGGER.info("end-configure the server & wait finish process:");
@@ -48,6 +33,7 @@ public class WebLauncherLocal extends WebLauncher {
// for local test:
ConfigBaseVariable.apiAdress = "http://0.0.0.0:18080/karideo/api/";
ConfigBaseVariable.dbPort = "3906";
+ ConfigBaseVariable.testMode = "true";
}
try {
super.migrateDB();
diff --git a/back/src/org/kar/karideo/api/MediaResource.java b/back/src/org/kar/karideo/api/MediaResource.java
index fc47f88..8a4b866 100644
--- a/back/src/org/kar/karideo/api/MediaResource.java
+++ b/back/src/org/kar/karideo/api/MediaResource.java
@@ -11,8 +11,9 @@ import org.glassfish.jersey.media.multipart.FormDataParam;
import org.kar.archidata.annotation.AsyncType;
import org.kar.archidata.annotation.TypeScriptProgress;
import org.kar.archidata.api.DataResource;
+import org.kar.archidata.dataAccess.DBAccess;
import org.kar.archidata.dataAccess.DataAccess;
-import org.kar.archidata.dataAccess.addOn.AddOnDataJson;
+import org.kar.archidata.dataAccess.addOnSQL.AddOnDataJson;
import org.kar.archidata.exception.FailException;
import org.kar.archidata.exception.InputException;
import org.kar.archidata.model.Data;
@@ -97,7 +98,7 @@ public class MediaResource {
@FormDataParam("file") final InputStream fileInputStream, //
@FormDataParam("file") final FormDataContentDisposition fileMetaData //
) throws FailException {
- try {
+ try (DBAccess db = DBAccess.createInterface()) {
// correct input string stream :
fileName = multipartCorrection(fileName);
universe = multipartCorrection(universe);
@@ -125,12 +126,12 @@ public class MediaResource {
final long tmpUID = DataResource.getTmpDataId();
final String sha512 = DataResource.saveTemporaryFile(fileInputStream, tmpUID);
- Data data = DataResource.getWithSha512(sha512);
+ Data data = DataTools.getWithSha512(db, sha512);
if (data == null) {
LOGGER.info("Need to add the data in the BDD ... ");
System.out.flush();
try {
- data = DataResource.createNewData(tmpUID, fileName, sha512);
+ data = DataTools.createNewData(db, tmpUID, fileName, sha512);
} catch (final IOException ex) {
DataResource.removeTemporaryFile(tmpUID);
ex.printStackTrace();
@@ -139,7 +140,7 @@ public class MediaResource {
} else if (data != null && data.deleted != null && data.deleted) {
LOGGER.info("Data already exist but deleted");
System.out.flush();
- DataTools.undelete(data.uuid);
+ DataTools.undelete(db, data.oid);
data.deleted = false;
} else {
LOGGER.info("Data already exist ... all good");
@@ -179,7 +180,7 @@ public class MediaResource {
try {
final Media media = new Media();
media.name = title;
- media.dataId = data.uuid;
+ media.dataId = data.oid;
media.typeId = typeNode.id;
media.seriesId = null;
if (seriesNode != null) {
@@ -193,7 +194,7 @@ public class MediaResource {
if (episode != null && !episode.contentEquals("")) {
media.episode = Integer.parseInt(episode);
}
- final Media out = DataAccess.insert(media);
+ final Media out = db.insert(media);
LOGGER.info("Generate new media {}", out);
return out;
} catch (final SQLException ex) {
@@ -219,12 +220,13 @@ public class MediaResource {
@TypeScriptProgress
public Media uploadCover( //
@PathParam("id") final Long id, //
- @FormDataParam("fileName") final String fileName, //
@FormDataParam("file") final InputStream fileInputStream, //
@FormDataParam("file") final FormDataContentDisposition fileMetaData//
) throws Exception {
- DataTools.uploadCover(Media.class, id, fileName, fileInputStream, fileMetaData);
- return DataAccess.get(Media.class, id);
+ try (DBAccess dbIo = DBAccess.createInterface()) {
+ DataTools.uploadCover(dbIo, Media.class, id, fileInputStream, fileMetaData);
+ return dbIo.get(Media.class, id);
+ }
}
@DELETE
@@ -235,8 +237,10 @@ public class MediaResource {
@PathParam("id") final Long id, //
@PathParam("coverId") final UUID coverId //
) throws Exception {
- AddOnDataJson.removeLink(Media.class, id, "covers", coverId);
- return DataAccess.get(Media.class, id);
+ try (DBAccess dbIo = DBAccess.createInterface()) {
+ AddOnDataJson.removeLink(dbIo, Media.class, "id", id, "covers", coverId);
+ return dbIo.get(Media.class, id);
+ }
}
@DELETE
diff --git a/back/src/org/kar/karideo/api/SeasonResource.java b/back/src/org/kar/karideo/api/SeasonResource.java
index 895ffe0..773c04f 100644
--- a/back/src/org/kar/karideo/api/SeasonResource.java
+++ b/back/src/org/kar/karideo/api/SeasonResource.java
@@ -8,10 +8,11 @@ import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
import org.glassfish.jersey.media.multipart.FormDataParam;
import org.kar.archidata.annotation.AsyncType;
import org.kar.archidata.annotation.TypeScriptProgress;
+import org.kar.archidata.dataAccess.DBAccess;
import org.kar.archidata.dataAccess.DataAccess;
import org.kar.archidata.dataAccess.QueryAnd;
import org.kar.archidata.dataAccess.QueryCondition;
-import org.kar.archidata.dataAccess.addOn.AddOnDataJson;
+import org.kar.archidata.dataAccess.addOnSQL.AddOnDataJson;
import org.kar.archidata.dataAccess.options.Condition;
import org.kar.archidata.tools.DataTools;
import org.kar.karideo.model.Season;
@@ -85,10 +86,12 @@ public class SeasonResource {
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Operation(description = "Upload a new season cover season", tags = "GLOBAL")
@TypeScriptProgress
- public Season uploadCover(@PathParam("id") final Long id, @FormDataParam("fileName") final String fileName, @FormDataParam("file") final InputStream fileInputStream,
- @FormDataParam("file") final FormDataContentDisposition fileMetaData) throws Exception {
- DataTools.uploadCover(Season.class, id, fileName, fileInputStream, fileMetaData);
- return DataAccess.get(Season.class, id);
+ public Season uploadCover(@PathParam("id") final Long id, @FormDataParam("file") final InputStream fileInputStream, @FormDataParam("file") final FormDataContentDisposition fileMetaData)
+ throws Exception {
+ try (DBAccess dbIo = DBAccess.createInterface()) {
+ DataTools.uploadCover(dbIo, Season.class, id, fileInputStream, fileMetaData);
+ return dbIo.get(Season.class, id);
+ }
}
@DELETE
@@ -96,8 +99,10 @@ public class SeasonResource {
@RolesAllowed("ADMIN")
@Operation(description = "Remove a specific cover of a season", tags = "GLOBAL")
public Season removeCover(@PathParam("id") final Long id, @PathParam("coverId") final UUID coverId) throws Exception {
- AddOnDataJson.removeLink(Season.class, id, "covers", coverId);
- return DataAccess.get(Season.class, id);
+ try (DBAccess dbIo = DBAccess.createInterface()) {
+ AddOnDataJson.removeLink(dbIo, Season.class, "id", id, "covers", coverId);
+ return dbIo.get(Season.class, id);
+ }
}
public static Season getOrCreate(final String name, final Long seriesId) {
diff --git a/back/src/org/kar/karideo/api/SeriesResource.java b/back/src/org/kar/karideo/api/SeriesResource.java
index 89e333c..e592dde 100644
--- a/back/src/org/kar/karideo/api/SeriesResource.java
+++ b/back/src/org/kar/karideo/api/SeriesResource.java
@@ -8,10 +8,11 @@ import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
import org.glassfish.jersey.media.multipart.FormDataParam;
import org.kar.archidata.annotation.AsyncType;
import org.kar.archidata.annotation.TypeScriptProgress;
+import org.kar.archidata.dataAccess.DBAccess;
import org.kar.archidata.dataAccess.DataAccess;
import org.kar.archidata.dataAccess.QueryAnd;
import org.kar.archidata.dataAccess.QueryCondition;
-import org.kar.archidata.dataAccess.addOn.AddOnDataJson;
+import org.kar.archidata.dataAccess.addOnSQL.AddOnDataJson;
import org.kar.archidata.dataAccess.options.Condition;
import org.kar.archidata.tools.DataTools;
import org.kar.karideo.model.Series;
@@ -85,10 +86,12 @@ public class SeriesResource {
@Consumes({ MediaType.MULTIPART_FORM_DATA })
@Operation(description = "Upload a new season cover Series", tags = "GLOBAL")
@TypeScriptProgress
- public Series uploadCover(@PathParam("id") final Long id, @FormDataParam("fileName") final String fileName, @FormDataParam("file") final InputStream fileInputStream,
- @FormDataParam("file") final FormDataContentDisposition fileMetaData) throws Exception {
- DataTools.uploadCover(Series.class, id, fileName, fileInputStream, fileMetaData);
- return DataAccess.get(Series.class, id);
+ public Series uploadCover(@PathParam("id") final Long id, @FormDataParam("file") final InputStream fileInputStream, @FormDataParam("file") final FormDataContentDisposition fileMetaData)
+ throws Exception {
+ try (DBAccess dbIo = DBAccess.createInterface()) {
+ DataTools.uploadCover(dbIo, Series.class, id, fileInputStream, fileMetaData);
+ return dbIo.get(Series.class, id);
+ }
}
@DELETE
@@ -96,8 +99,10 @@ public class SeriesResource {
@RolesAllowed("ADMIN")
@Operation(description = "Remove a specific Series of a season", tags = "GLOBAL")
public Series removeCover(@PathParam("id") final Long id, @PathParam("coverId") final UUID coverId) throws Exception {
- AddOnDataJson.removeLink(Series.class, id, "covers", coverId);
- return DataAccess.get(Series.class, id);
+ try (DBAccess dbIo = DBAccess.createInterface()) {
+ AddOnDataJson.removeLink(dbIo, Series.class, "id", id, "covers", coverId);
+ return dbIo.get(Series.class, id);
+ }
}
public static Series getOrCreate(final String name, final Long typeId) {
diff --git a/back/src/org/kar/karideo/api/TypeResource.java b/back/src/org/kar/karideo/api/TypeResource.java
index 5c942aa..dc5c495 100644
--- a/back/src/org/kar/karideo/api/TypeResource.java
+++ b/back/src/org/kar/karideo/api/TypeResource.java
@@ -8,9 +8,10 @@ import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
import org.glassfish.jersey.media.multipart.FormDataParam;
import org.kar.archidata.annotation.AsyncType;
import org.kar.archidata.annotation.TypeScriptProgress;
+import org.kar.archidata.dataAccess.DBAccess;
import org.kar.archidata.dataAccess.DataAccess;
import org.kar.archidata.dataAccess.QueryCondition;
-import org.kar.archidata.dataAccess.addOn.AddOnDataJson;
+import org.kar.archidata.dataAccess.addOnSQL.AddOnDataJson;
import org.kar.archidata.dataAccess.options.Condition;
import org.kar.archidata.tools.DataTools;
import org.kar.karideo.model.Type;
@@ -88,10 +89,12 @@ public class TypeResource {
@Consumes({ MediaType.MULTIPART_FORM_DATA })
@Operation(description = "Upload a new season cover Type", tags = "GLOBAL")
@TypeScriptProgress
- public Type uploadCover(@PathParam("id") final Long id, @FormDataParam("fileName") final String fileName, @FormDataParam("file") final InputStream fileInputStream,
- @FormDataParam("file") final FormDataContentDisposition fileMetaData) throws Exception {
- DataTools.uploadCover(Type.class, id, fileName, fileInputStream, fileMetaData);
- return DataAccess.get(Type.class, id);
+ public Type uploadCover(@PathParam("id") final Long id, @FormDataParam("file") final InputStream fileInputStream, @FormDataParam("file") final FormDataContentDisposition fileMetaData)
+ throws Exception {
+ try (DBAccess dbIo = DBAccess.createInterface()) {
+ DataTools.uploadCover(dbIo, Type.class, id, fileInputStream, fileMetaData);
+ return dbIo.get(Type.class, id);
+ }
}
@DELETE
@@ -99,8 +102,11 @@ public class TypeResource {
@RolesAllowed("ADMIN")
@Operation(description = "Remove a specific cover of a type", tags = "GLOBAL")
public Type removeCover(@PathParam("id") final Long id, @PathParam("coverId") final UUID coverId) throws Exception {
- AddOnDataJson.removeLink(Type.class, id, "covers", coverId);
- return DataAccess.get(Type.class, id);
+
+ try (DBAccess dbIo = DBAccess.createInterface()) {
+ AddOnDataJson.removeLink(dbIo, Type.class, "id", id, "covers", coverId);
+ return dbIo.get(Type.class, id);
+ }
}
public static Type getOrCreate(final String name) {
diff --git a/back/src/org/kar/karideo/api/UserMediaAdvancementResource.java b/back/src/org/kar/karideo/api/UserMediaAdvancementResource.java
index 3e7836d..82c0f6f 100644
--- a/back/src/org/kar/karideo/api/UserMediaAdvancementResource.java
+++ b/back/src/org/kar/karideo/api/UserMediaAdvancementResource.java
@@ -90,7 +90,7 @@ public class UserMediaAdvancementResource {
elem.count++;
}
LOGGER.info("{},{},{}", elem.time, elem.percent, elem.count);
- final int nbAfected = DataAccess.update(elem, elem.id, List.of("time", "percent", "count"));
+ final long nbAfected = DataAccess.update(elem, elem.id, List.of("time", "percent", "count"));
return DataAccess.get(UserMediaAdvancement.class, elem.id);
}
diff --git a/back/src/org/kar/karideo/migration/Initialization.java b/back/src/org/kar/karideo/migration/Initialization.java
index f4ea112..52f1d8c 100644
--- a/back/src/org/kar/karideo/migration/Initialization.java
+++ b/back/src/org/kar/karideo/migration/Initialization.java
@@ -2,10 +2,21 @@ package org.kar.karideo.migration;
import java.util.List;
-import org.kar.archidata.dataAccess.DataAccess;
+import org.kar.archidata.api.DataResource;
+import org.kar.archidata.dataAccess.DBAccess;
+import org.kar.archidata.externalRestApi.AnalyzeApi;
+import org.kar.archidata.externalRestApi.TsGenerateApi;
import org.kar.archidata.migration.MigrationSqlStep;
import org.kar.archidata.model.Data;
import org.kar.archidata.model.User;
+import org.kar.karideo.api.Front;
+import org.kar.karideo.api.HealthCheck;
+import org.kar.karideo.api.MediaResource;
+import org.kar.karideo.api.SeasonResource;
+import org.kar.karideo.api.SeriesResource;
+import org.kar.karideo.api.TypeResource;
+import org.kar.karideo.api.UserMediaAdvancementResource;
+import org.kar.karideo.api.UserResource;
import org.kar.karideo.model.Media;
import org.kar.karideo.model.Season;
import org.kar.karideo.model.Series;
@@ -26,8 +37,14 @@ public class Initialization extends MigrationSqlStep {
return "Initialization";
}
- public Initialization() {
-
+ public static void generateObjects() throws Exception {
+ LOGGER.info("Generate APIs");
+ final List> listOfResources = List.of(Front.class, HealthCheck.class, SeasonResource.class, SeriesResource.class, TypeResource.class, UserMediaAdvancementResource.class,
+ UserResource.class, MediaResource.class, DataResource.class);
+ final AnalyzeApi api = new AnalyzeApi();
+ api.addAllApi(listOfResources);
+ TsGenerateApi.generateApi(api, "../front/src/app/back-api/");
+ LOGGER.info("Generate APIs (DONE)");
}
@Override
@@ -36,19 +53,21 @@ public class Initialization extends MigrationSqlStep {
addClass(clazz);
}
- addAction("""
- INSERT INTO `type` (`id`, `name`, `description`) VALUES
- (UUID_TO_BIN('15237fd7-d4ee-11ee-a8dd-02420a030203'), 'Documentary', 'Documentary (animals, space, earth...)'),
- (UUID_TO_BIN('553146c1-d4ee-11ee-a8dd-02420a030203'), 'Movie', 'Movie with real humans (film)'),
- (UUID_TO_BIN('59c430a3-d4ee-11ee-a8dd-02420a030203'), 'Animation', 'Animation movies (film)'),
- (UUID_TO_BIN('5cd619e3-d4ee-11ee-a8dd-02420a030203'), 'Short movie', 'Small movies (less 2 minutes)'),
- (UUID_TO_BIN('5fbbf085-d4ee-11ee-a8dd-02420a030203'), 'TV show', 'TV show for old peoples'),
- (UUID_TO_BIN('66dcb6ba-d4ee-11ee-a8dd-02420a030203'), 'Animation TV show', 'TV show for young peoples'),
- (UUID_TO_BIN('69ee5c15-d4ee-11ee-a8dd-02420a030203'), 'Theater', 'Theater play'),
- (UUID_TO_BIN('6ce72530-d4ee-11ee-a8dd-02420a030203'), 'One man show', 'Recorded stand up'),
- (UUID_TO_BIN('6ff1691a-d4ee-11ee-a8dd-02420a030203'), 'Concert', 'Recorded concert'),
- (UUID_TO_BIN('730815ef-d4ee-11ee-a8dd-02420a030203'), 'Opera', 'Recorded opera');
- """);
+ addAction((final DBAccess da) -> {
+ final List data = List.of(//
+ new Type("Documentary", "Documentary (animals, space, earth...)"), //
+ new Type("Movie", "Movie with real humans (film)"), //
+ new Type("Animation", "Animation movies (film)"), //
+ new Type("Short movie", "Small movies (less 2 minutes)"), //
+ new Type("TV show", "TV show for old peoples"), //
+ new Type("Animation TV show", "TV show for young peoples"), //
+ new Type("Theater", "Theater play"), //
+ new Type("One man show", "Recorded stand up"), //
+ new Type("Concert", "Recorded concert"), //
+ new Type("Opera", "Recorded opera") //
+ );
+ da.insertMultiple(data);
+ });
// set start increment element to permit to add after default elements
addAction("""
ALTER TABLE `media` AUTO_INCREMENT = 1000;
@@ -67,10 +86,10 @@ public class Initialization extends MigrationSqlStep {
""", "mysql");
}
- public static void dropAll() {
+ public static void dropAll(final DBAccess da) {
for (final Class> element : CLASSES_BASE) {
try {
- DataAccess.drop(element);
+ da.drop(element);
} catch (final Exception ex) {
LOGGER.error("Fail to drop table !!!!!!");
ex.printStackTrace();
@@ -78,10 +97,10 @@ public class Initialization extends MigrationSqlStep {
}
}
- public static void cleanAll() {
+ public static void cleanAll(final DBAccess da) {
for (final Class> element : CLASSES_BASE) {
try {
- DataAccess.cleanAll(element);
+ da.cleanAll(element);
} catch (final Exception ex) {
LOGGER.error("Fail to clean table !!!!!!");
ex.printStackTrace();
diff --git a/back/src/org/kar/karideo/migration/Migration20240226.java b/back/src/org/kar/karideo/migration/Migration20240226.java
index f231158..ee1e280 100644
--- a/back/src/org/kar/karideo/migration/Migration20240226.java
+++ b/back/src/org/kar/karideo/migration/Migration20240226.java
@@ -1,23 +1,6 @@
package org.kar.karideo.migration;
-import java.nio.file.Files;
-import java.nio.file.NoSuchFileException;
-import java.nio.file.Paths;
-import java.nio.file.StandardCopyOption;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.UUID;
-
-import org.kar.archidata.api.DataResource;
-import org.kar.archidata.dataAccess.DataAccess;
-import org.kar.archidata.dataAccess.addOn.model.LinkTableLongLong;
-import org.kar.archidata.dataAccess.options.AccessDeletedItems;
-import org.kar.archidata.dataAccess.options.OverrideTableName;
import org.kar.archidata.migration.MigrationSqlStep;
-import org.kar.archidata.tools.UuidUtils;
-import org.kar.karideo.migration.model.CoverConversion;
-import org.kar.karideo.migration.model.MediaConversion;
-import org.kar.karideo.migration.model.UUIDConversion;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -36,102 +19,6 @@ public class Migration20240226 extends MigrationSqlStep {
}
@Override
- public void generateStep() throws Exception {
- addAction("""
- ALTER TABLE `data` ADD `uuid` binary(16) AFTER `id`;
- """);
- addAction(() -> {
- final List datas = DataAccess.gets(UUIDConversion.class, new AccessDeletedItems(), new OverrideTableName("data"));
- for (final UUIDConversion elem : datas) {
- elem.uuid = UuidUtils.nextUUID();
- }
- for (final UUIDConversion elem : datas) {
- DataAccess.update(elem, elem.id, List.of("uuid"), new OverrideTableName("data"));
- }
- });
- addAction("""
- ALTER TABLE `data` CHANGE `uuid` `uuid` binary(16) DEFAULT (UUID_TO_BIN(UUID(), TRUE));
- """);
- final List tableToTransform = List.of("media", "season", "series", "type", "user");
- for (final String tableName : tableToTransform) {
- addAction("ALTER TABLE `" + tableName + "` ADD `covers` text NULL;");
- addAction(() -> {
- final List datas = DataAccess.gets(UUIDConversion.class, new AccessDeletedItems(), new OverrideTableName("data"));
- final List medias = DataAccess.gets(CoverConversion.class, new AccessDeletedItems(), new OverrideTableName(tableName));
- final List links = DataAccess.gets(LinkTableLongLong.class, new OverrideTableName(tableName + "_link_cover"));
- LOGGER.info("Get somes data: {} {} {}", datas.size(), medias.size(), links.size());
- for (final CoverConversion media : medias) {
- final List values = new ArrayList<>();
- for (final LinkTableLongLong link : links) {
- if (link.object1Id.equals(media.id)) {
- for (final UUIDConversion data : datas) {
- if (data.id.equals(link.object2Id)) {
- values.add(data.uuid);
- break;
- }
- }
- break;
- }
- }
- if (values.size() != 0) {
- media.covers = values;
- LOGGER.info(" update: {} => {}", media.id, media.covers);
- DataAccess.update(media, media.id, List.of("covers"), new OverrideTableName(tableName));
- }
- }
- });
- addAction("DROP TABLE `" + tableName + "_link_cover`;");
- }
- addAction("""
- ALTER TABLE `media` ADD `dataUUID` binary(16) AFTER dataId;
- """);
- addAction(() -> {
- final List datas = DataAccess.gets(UUIDConversion.class, new AccessDeletedItems(), new OverrideTableName("data"));
- final List medias = DataAccess.gets(MediaConversion.class, new AccessDeletedItems(), new OverrideTableName("media"));
- for (final MediaConversion media : medias) {
- for (final UUIDConversion data : datas) {
- if (data.id.equals(media.dataId)) {
- media.dataUUID = data.uuid;
- DataAccess.update(media, media.id, List.of("dataUUID"), new OverrideTableName("media"));
- break;
- }
- }
- }
- });
- addAction("""
- ALTER TABLE `media` DROP `dataId`;
- """);
- addAction("""
- ALTER TABLE `media` CHANGE `dataUUID` `dataId` binary(16) NOT NULL;
- """);
- // Move the files...
- addAction(() -> {
- final List datas = DataAccess.gets(UUIDConversion.class, new AccessDeletedItems(), new OverrideTableName("data"));
- for (final UUIDConversion data : datas) {
- final String origin = DataResource.getFileDataOld(data.id);
- final String destination = DataResource.getFileData(data.uuid);
- LOGGER.info("move file = {}", origin);
- LOGGER.info(" ==> {}", destination);
- try {
- Files.move(Paths.get(origin), Paths.get(destination), StandardCopyOption.ATOMIC_MOVE);
- } catch (final NoSuchFileException ex) {
- LOGGER.error("MOVE_ERROR : {} -> {}", origin, destination);
- }
- }
- });
- /* I am not sure then I prefer keep the primary key for the moment addAction(""" ALTER TABLE `data` DROP `id`; """); */
- addAction("""
- ALTER TABLE `data` CHANGE `id` `idOld` bigint NOT NULL DEFAULT 0;
- """);
- addAction("""
- ALTER TABLE `data` DROP PRIMARY KEY;
- """);
- addAction("""
- ALTER TABLE `data` CHANGE `uuid` `id` binary(16) DEFAULT (UUID_TO_BIN(UUID(), TRUE));
- """);
- addAction("""
- ALTER TABLE `data` ADD PRIMARY KEY `id` (`id`);
- """);
- }
+ public void generateStep() throws Exception {}
}
diff --git a/back/src/org/kar/karideo/migration/Migration20240611.java b/back/src/org/kar/karideo/migration/Migration20240611.java
new file mode 100644
index 0000000..6ebd66a
--- /dev/null
+++ b/back/src/org/kar/karideo/migration/Migration20240611.java
@@ -0,0 +1,28 @@
+package org.kar.karideo.migration;
+
+import org.kar.archidata.migration.MigrationSqlStep;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class Migration20240611 extends MigrationSqlStep {
+ private static final Logger LOGGER = LoggerFactory.getLogger(Migration20240226.class);
+
+ public static final int KARSO_INITIALISATION_ID = 1;
+
+ @Override
+ public String getName() {
+ return "migration-2024-06-11: corect data uuid";
+ }
+
+ public Migration20240611() {
+
+ }
+
+ @Override
+ public void generateStep() throws Exception {
+ addAction("""
+ ALTER TABLE `data` CHANGE `id` `uuid` binary(16) DEFAULT (UUID_TO_BIN(UUID(), TRUE));
+ """);
+ }
+
+}
diff --git a/back/src/org/kar/karideo/migration/Migration20250214.java b/back/src/org/kar/karideo/migration/Migration20250214.java
new file mode 100644
index 0000000..75a823b
--- /dev/null
+++ b/back/src/org/kar/karideo/migration/Migration20250214.java
@@ -0,0 +1,126 @@
+package org.kar.karideo.migration;
+
+import java.nio.file.Files;
+import java.nio.file.NoSuchFileException;
+import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
+import org.bson.types.ObjectId;
+import org.kar.archidata.api.DataResource;
+import org.kar.archidata.dataAccess.DBAccess;
+import org.kar.archidata.dataAccess.options.AccessDeletedItems;
+import org.kar.archidata.dataAccess.options.OverrideTableName;
+import org.kar.archidata.migration.MigrationSqlStep;
+import org.kar.karideo.migration.model.CoverConversion;
+import org.kar.karideo.migration.model.MediaConversion;
+import org.kar.karideo.migration.model.OIDConversion;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class Migration20250214 extends MigrationSqlStep {
+ private static final Logger LOGGER = LoggerFactory.getLogger(Migration20240226.class);
+
+ public static final int KARSO_INITIALISATION_ID = 1;
+
+ @Override
+ public String getName() {
+ return "migration-2025-01-04: convert base from UUID to OID";
+ }
+
+ @Override
+ public void generateStep() throws Exception {
+
+ addAction("""
+ ALTER TABLE `data` ADD `_id` binary(12) AFTER `uuid`;
+ """);
+ addAction((final DBAccess da) -> {
+ final List datas = da.gets(OIDConversion.class, new AccessDeletedItems(), new OverrideTableName("data"));
+ for (final OIDConversion elem : datas) {
+ elem._id = new ObjectId();
+ }
+ for (final OIDConversion elem : datas) {
+ da.update(elem, elem.uuid, List.of("_id"), new OverrideTableName("data"));
+ }
+ });
+ final List tableToTransform = List.of("media", "season", "series", "type", "user");
+ for (final String tableName : tableToTransform) {
+ addAction("ALTER TABLE `" + tableName + "` ADD `covers_oid` text NULL;");
+ addAction((final DBAccess da) -> {
+ final List datas = da.gets(OIDConversion.class, new AccessDeletedItems(), new OverrideTableName("data"));
+ final List tableCoverTransforms = da.gets(CoverConversion.class, new AccessDeletedItems(), new OverrideTableName(tableName));
+ LOGGER.info("Get somes data: {} {}", datas.size(), tableCoverTransforms.size());
+ for (final CoverConversion tableTransform : tableCoverTransforms) {
+ final List values = new ArrayList<>();
+ if (tableTransform.covers == null) {
+ continue;
+ }
+ for (final UUID link : tableTransform.covers) {
+ for (final OIDConversion data : datas) {
+ if (data.uuid.equals(link)) {
+ values.add(data._id);
+ break;
+ }
+ }
+ }
+ if (values.size() != 0) {
+ tableTransform.covers_oid = values;
+ LOGGER.info(" update: {}: {} => {}", tableTransform.id, tableTransform.covers, tableTransform.covers_oid);
+ da.update(tableTransform, tableTransform.id, List.of("covers_oid"), new OverrideTableName(tableName));
+ }
+ }
+ });
+ addAction("ALTER TABLE `" + tableName + "` DROP `covers`;");
+ addAction("ALTER TABLE `" + tableName + "` CHANGE `covers_oid` `covers` text NULL;");
+ }
+ addAction("""
+ ALTER TABLE `media` ADD `dataOid` binary(12) AFTER dataId;
+ """);
+ addAction((final DBAccess da) -> {
+ final List datas = da.gets(OIDConversion.class, new AccessDeletedItems(), new OverrideTableName("data"));
+ final List medias = da.gets(MediaConversion.class, new AccessDeletedItems(), new OverrideTableName("media"));
+ for (final MediaConversion media : medias) {
+ for (final OIDConversion data : datas) {
+ if (data.uuid.equals(media.dataId)) {
+ media.dataOid = data._id;
+ da.update(media, media.id, List.of("dataOid"), new OverrideTableName("media"));
+ break;
+ }
+ }
+ }
+ });
+ addAction("""
+ ALTER TABLE `media` DROP `dataId`;
+ """);
+ addAction("""
+ ALTER TABLE `media` CHANGE `dataOid` `dataId` binary(12) NOT NULL;
+ """);
+ // Move the files...
+ addAction((final DBAccess da) -> {
+ final List datas = da.gets(OIDConversion.class, new AccessDeletedItems(), new OverrideTableName("data"));
+ for (final OIDConversion data : datas) {
+ final String origin = DataResource.getFileDataOld(data.uuid);
+ final String destination = DataResource.getFileData(data._id);
+ LOGGER.info("move file = {}", origin);
+ LOGGER.info(" ==> {}", destination);
+ try {
+ Files.move(Paths.get(origin), Paths.get(destination), StandardCopyOption.ATOMIC_MOVE);
+ } catch (final NoSuchFileException ex) {
+ LOGGER.warn("Fail to move file : {}", ex.getMessage());
+ }
+ }
+ });
+ addAction("""
+ ALTER TABLE `data` DROP INDEX `PRIMARY`;
+ """);
+ // addAction("""
+ // ALTER TABLE `data` DROP `uuid`;
+ // """);
+ addAction("""
+ ALTER TABLE `data` ADD PRIMARY KEY `_id` (`_id`);
+ """);
+ }
+
+}
diff --git a/back/src/org/kar/karideo/migration/model/CoverConversion.java b/back/src/org/kar/karideo/migration/model/CoverConversion.java
index 0e9f922..2182f2a 100644
--- a/back/src/org/kar/karideo/migration/model/CoverConversion.java
+++ b/back/src/org/kar/karideo/migration/model/CoverConversion.java
@@ -3,6 +3,7 @@ package org.kar.karideo.migration.model;
import java.util.List;
import java.util.UUID;
+import org.bson.types.ObjectId;
import org.kar.archidata.annotation.DataJson;
import jakarta.persistence.Id;
@@ -12,4 +13,6 @@ public class CoverConversion {
public Long id = null;
@DataJson
public List covers = null;
+ @DataJson
+ public List covers_oid = null;
}
diff --git a/back/src/org/kar/karideo/migration/model/MediaConversion.java b/back/src/org/kar/karideo/migration/model/MediaConversion.java
index 2e90125..aaf9968 100644
--- a/back/src/org/kar/karideo/migration/model/MediaConversion.java
+++ b/back/src/org/kar/karideo/migration/model/MediaConversion.java
@@ -2,11 +2,12 @@ package org.kar.karideo.migration.model;
import java.util.UUID;
+import org.bson.types.ObjectId;
import jakarta.persistence.Id;
public class MediaConversion {
@Id
public Long id = null;
- public Long dataId = null;
- public UUID dataUUID = null;
+ public UUID dataId = null;
+ public ObjectId dataOid = null;
}
diff --git a/back/src/org/kar/karideo/migration/model/UUIDConversion.java b/back/src/org/kar/karideo/migration/model/OIDConversion.java
similarity index 59%
rename from back/src/org/kar/karideo/migration/model/UUIDConversion.java
rename to back/src/org/kar/karideo/migration/model/OIDConversion.java
index a6e43c4..c6a283c 100644
--- a/back/src/org/kar/karideo/migration/model/UUIDConversion.java
+++ b/back/src/org/kar/karideo/migration/model/OIDConversion.java
@@ -2,10 +2,12 @@ package org.kar.karideo.migration.model;
import java.util.UUID;
+import org.bson.types.ObjectId;
+
import jakarta.persistence.Id;
-public class UUIDConversion {
+public class OIDConversion {
@Id
- public Long id = null;
public UUID uuid = null;
+ public ObjectId _id = null;
}
diff --git a/back/src/org/kar/karideo/model/Media.java b/back/src/org/kar/karideo/model/Media.java
index 58c2234..98eafc8 100644
--- a/back/src/org/kar/karideo/model/Media.java
+++ b/back/src/org/kar/karideo/model/Media.java
@@ -1,8 +1,8 @@
package org.kar.karideo.model;
import java.util.List;
-import java.util.UUID;
+import org.bson.types.ObjectId;
import org.kar.archidata.annotation.DataJson;
import org.kar.archidata.model.Data;
import org.kar.archidata.model.GenericDataSoftDelete;
@@ -10,6 +10,7 @@ import org.kar.archidata.model.GenericDataSoftDelete;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.annotation.Nullable;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
@@ -29,7 +30,7 @@ public class Media extends GenericDataSoftDelete {
@Schema(description = "Foreign Key Id of the data")
@ManyToOne(fetch = FetchType.LAZY, targetEntity = Data.class)
@Column(nullable = false)
- public UUID dataId;
+ public ObjectId dataId;
@Schema(description = "Type of the media")
@ManyToOne(fetch = FetchType.LAZY, targetEntity = Type.class)
public Long typeId;
@@ -49,7 +50,8 @@ public class Media extends GenericDataSoftDelete {
public Integer ageLimit;
@Schema(description = "List of Id of the specific covers")
@DataJson(targetEntity = Data.class)
- public List covers = null;
+ @Nullable
+ public List covers = null;
@Override
public String toString() {
diff --git a/back/src/org/kar/karideo/model/Season.java b/back/src/org/kar/karideo/model/Season.java
index 610f761..a5c0c8f 100644
--- a/back/src/org/kar/karideo/model/Season.java
+++ b/back/src/org/kar/karideo/model/Season.java
@@ -1,8 +1,8 @@
package org.kar.karideo.model;
import java.util.List;
-import java.util.UUID;
+import org.bson.types.ObjectId;
import org.kar.archidata.annotation.DataIfNotExists;
import org.kar.archidata.annotation.DataJson;
import org.kar.archidata.model.GenericDataSoftDelete;
@@ -10,6 +10,7 @@ import org.kar.archidata.model.GenericDataSoftDelete;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.annotation.Nullable;
import jakarta.persistence.Column;
import jakarta.persistence.FetchType;
import jakarta.persistence.ManyToOne;
@@ -31,5 +32,6 @@ public class Season extends GenericDataSoftDelete {
public Long parentId;
@Schema(description = "List of Id of the specific covers")
@DataJson()
- public List covers = null;
+ @Nullable
+ public List covers = null;
}
\ No newline at end of file
diff --git a/back/src/org/kar/karideo/model/Series.java b/back/src/org/kar/karideo/model/Series.java
index 8bb5f2a..41a6584 100644
--- a/back/src/org/kar/karideo/model/Series.java
+++ b/back/src/org/kar/karideo/model/Series.java
@@ -1,8 +1,8 @@
package org.kar.karideo.model;
import java.util.List;
-import java.util.UUID;
+import org.bson.types.ObjectId;
import org.kar.archidata.annotation.DataIfNotExists;
import org.kar.archidata.annotation.DataJson;
import org.kar.archidata.model.GenericDataSoftDelete;
@@ -10,6 +10,7 @@ import org.kar.archidata.model.GenericDataSoftDelete;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.annotation.Nullable;
import jakarta.persistence.Column;
import jakarta.persistence.FetchType;
import jakarta.persistence.ManyToOne;
@@ -31,5 +32,6 @@ public class Series extends GenericDataSoftDelete {
public Long parentId;
@Schema(description = "List of Id of the specific covers")
@DataJson()
- public List covers = null;
+ @Nullable
+ public List covers = null;
}
diff --git a/back/src/org/kar/karideo/model/Type.java b/back/src/org/kar/karideo/model/Type.java
index a2645e9..17418d0 100644
--- a/back/src/org/kar/karideo/model/Type.java
+++ b/back/src/org/kar/karideo/model/Type.java
@@ -1,8 +1,8 @@
package org.kar.karideo.model;
import java.util.List;
-import java.util.UUID;
+import org.bson.types.ObjectId;
import org.kar.archidata.annotation.DataIfNotExists;
import org.kar.archidata.annotation.DataJson;
import org.kar.archidata.model.GenericDataSoftDelete;
@@ -10,6 +10,7 @@ import org.kar.archidata.model.GenericDataSoftDelete;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.annotation.Nullable;
import jakarta.persistence.Column;
import jakarta.persistence.Table;
@@ -25,5 +26,14 @@ public class Type extends GenericDataSoftDelete {
public String description;
@Schema(description = "List of Id of the specific covers")
@DataJson()
- public List covers = null;
+ @Nullable
+ public List covers = null;
+
+ public Type() {}
+
+ public Type(final String name, final String description) {
+ this.name = name;
+ this.description = description;
+ }
+
}
diff --git a/back/src/org/kar/karideo/model/UserMediaAdvancement.java b/back/src/org/kar/karideo/model/UserMediaAdvancement.java
index 915e36f..3c46606 100644
--- a/back/src/org/kar/karideo/model/UserMediaAdvancement.java
+++ b/back/src/org/kar/karideo/model/UserMediaAdvancement.java
@@ -7,6 +7,7 @@ import org.kar.archidata.model.GenericDataSoftDelete;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.annotation.Nullable;
import jakarta.persistence.Column;
import jakarta.persistence.FetchType;
import jakarta.persistence.ManyToOne;
@@ -20,6 +21,7 @@ public class UserMediaAdvancement extends GenericDataSoftDelete {
@Column(nullable = false)
@Schema(description = "Foreign Key Id of the user")
@ManyToOne(fetch = FetchType.LAZY, targetEntity = UserKarideo.class)
+ @Nullable
public Long userId;
@Column(nullable = false)
@Schema(description = "Id of the media")
diff --git a/back/test/src/test/kar/karideo/ConfigureDb.java b/back/test/src/test/kar/karideo/ConfigureDb.java
new file mode 100644
index 0000000..b116ed9
--- /dev/null
+++ b/back/test/src/test/kar/karideo/ConfigureDb.java
@@ -0,0 +1,128 @@
+package test.kar.karideo;
+
+import java.io.IOException;
+import java.util.List;
+
+import org.kar.archidata.dataAccess.DBAccess;
+import org.kar.archidata.db.DbConfig;
+import org.kar.archidata.db.DbIoFactory;
+import org.kar.archidata.exception.DataAccessException;
+import org.kar.archidata.tools.ConfigBaseVariable;
+import org.kar.karideo.model.Media;
+import org.kar.karideo.model.Season;
+import org.kar.karideo.model.Series;
+import org.kar.karideo.model.Type;
+import org.kar.karideo.model.UserKarideo;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import jakarta.ws.rs.InternalServerErrorException;
+
+public class ConfigureDb {
+ final static private Logger LOGGER = LoggerFactory.getLogger(ConfigureDb.class);
+ final static private String modeTestForced = null;// "MONGO";
+ public static DBAccess da = null;
+
+ public static void configure() throws IOException, InternalServerErrorException, DataAccessException {
+ String modeTest = System.getenv("TEST_E2E_MODE");
+ if (modeTest == null || modeTest.isEmpty() || "false".equalsIgnoreCase(modeTest)) {
+ modeTest = "SQLITE-MEMORY";
+ } else if ("true".equalsIgnoreCase(modeTest)) {
+ modeTest = "MY-SQL";
+ }
+ // override the local test:
+ if (modeTestForced != null) {
+ modeTest = modeTestForced;
+ }
+ // for local test:
+ ConfigBaseVariable.apiAdress = "http://127.0.0.1:12342/test/api/";
+ // Enable the test mode permit to access to the test token (never use it in production).
+ ConfigBaseVariable.testMode = "true";
+ final List> listObject = List.of( //
+ Media.class, //
+ Season.class, //
+ Series.class, //
+ Type.class, //
+ UserKarideo.class //
+ );
+ if ("SQLITE-MEMORY".equalsIgnoreCase(modeTest)) {
+ ConfigBaseVariable.dbType = "sqlite";
+ ConfigBaseVariable.bdDatabase = null;
+ ConfigBaseVariable.dbHost = "memory";
+ // for test we need to connect all time the DB
+ ConfigBaseVariable.dbKeepConnected = "true";
+ } else if ("SQLITE".equalsIgnoreCase(modeTest)) {
+ ConfigBaseVariable.dbType = "sqlite";
+ ConfigBaseVariable.bdDatabase = null;
+ ConfigBaseVariable.dbKeepConnected = "true";
+ } else if ("MY-SQL".equalsIgnoreCase(modeTest)) {
+ ConfigBaseVariable.dbType = "mysql";
+ ConfigBaseVariable.bdDatabase = "test_Karideo_db";
+ ConfigBaseVariable.dbPort = "3906";
+ ConfigBaseVariable.dbUser = "root";
+ } else if ("MONGO".equalsIgnoreCase(modeTest)) {
+ ConfigBaseVariable.dbType = "mongo";
+ ConfigBaseVariable.bdDatabase = "test_Karideo_db";
+ } else {
+ // User local modification ...
+ ConfigBaseVariable.bdDatabase = "test_Karideo_db";
+ ConfigBaseVariable.dbPort = "3906";
+ ConfigBaseVariable.dbUser = "root";
+ }
+ removeDB();
+ // Connect the dataBase...
+ da = DBAccess.createInterface();
+ }
+
+ public static void removeDB() {
+ String modeTest = System.getenv("TEST_E2E_MODE");
+ if (modeTest == null || modeTest.isEmpty() || "false".equalsIgnoreCase(modeTest)) {
+ modeTest = "SQLITE-MEMORY";
+ } else if ("true".equalsIgnoreCase(modeTest)) {
+ modeTest = "MY-SQL";
+ }
+ // override the local test:
+ if (modeTestForced != null) {
+ modeTest = modeTestForced;
+ }
+ DbConfig config = null;
+ try {
+ config = new DbConfig();
+ } catch (final DataAccessException e) {
+ e.printStackTrace();
+ LOGGER.error("Fail to clean the DB");
+ return;
+ }
+ config.setDbName(null);
+ LOGGER.info("Remove the DB and create a new one '{}'", config.getDbName());
+ try (final DBAccess daRoot = DBAccess.createInterface(config)) {
+ if ("SQLITE-MEMORY".equalsIgnoreCase(modeTest)) {
+ // nothing to do ...
+ } else if ("SQLITE".equalsIgnoreCase(modeTest)) {
+ daRoot.deleteDB(ConfigBaseVariable.bdDatabase);
+ } else if ("MY-SQL".equalsIgnoreCase(modeTest)) {
+ daRoot.deleteDB(ConfigBaseVariable.bdDatabase);
+ } else if ("MONGO".equalsIgnoreCase(modeTest)) {
+ daRoot.deleteDB(ConfigBaseVariable.bdDatabase);
+ }
+ daRoot.createDB(ConfigBaseVariable.bdDatabase);
+ } catch (final InternalServerErrorException e) {
+ e.printStackTrace();
+ LOGGER.error("Fail to clean the DB");
+ return;
+ } catch (final IOException e) {
+ e.printStackTrace();
+ LOGGER.error("Fail to clean the DB");
+ return;
+ }
+ }
+
+ public static void clear() throws IOException {
+ LOGGER.info("Remove the test db");
+ removeDB();
+ // The connection is by default open ==> close it at the end of test:
+ da.close();
+ DbIoFactory.closeAllForceMode();
+ ConfigBaseVariable.clearAllValue();
+ }
+}
diff --git a/back/test/src/test/kar/karideo/TestBase.java b/back/test/src/test/kar/karideo/TestBase.java
new file mode 100644
index 0000000..2331adb
--- /dev/null
+++ b/back/test/src/test/kar/karideo/TestBase.java
@@ -0,0 +1,48 @@
+package test.kar.karideo;
+
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.MethodOrderer;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestMethodOrder;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.kar.archidata.tools.ConfigBaseVariable;
+import org.kar.archidata.tools.RESTApi;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@ExtendWith(StepwiseExtension.class)
+@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
+public class TestBase {
+ private final static Logger LOGGER = LoggerFactory.getLogger(TestBase.class);
+ public final static String ENDPOINT_NAME = "species/";
+
+ static WebLauncherTest webInterface = null;
+ static RESTApi api = null;
+
+ @BeforeAll
+ public static void configureWebServer() throws Exception {
+ ConfigureDb.configure();
+ LOGGER.info("configure server ...");
+ webInterface = new WebLauncherTest();
+ LOGGER.info("Start REST (BEGIN)");
+ webInterface.process();
+ LOGGER.info("Start REST (DONE)");
+ api = new RESTApi(ConfigBaseVariable.apiAdress);
+ api.setToken(Common.ADMIN_TOKEN);
+ }
+
+ @AfterAll
+ public static void stopWebServer() throws Exception {
+ LOGGER.info("Kill the web server");
+ webInterface.stop();
+ webInterface = null;
+ ConfigureDb.clear();
+ }
+
+ @Test
+ public static void TestEmpty() throws Exception {
+
+ }
+
+}
diff --git a/back/test/src/test/kar/karideo/TestHealthCheck.java b/back/test/src/test/kar/karideo/TestHealthCheck.java
index fd2a425..23d5deb 100644
--- a/back/test/src/test/kar/karideo/TestHealthCheck.java
+++ b/back/test/src/test/kar/karideo/TestHealthCheck.java
@@ -10,8 +10,7 @@ import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;
import org.junit.jupiter.api.extension.ExtendWith;
-import org.kar.archidata.db.DBEntry;
-import org.kar.archidata.exception.RESTErrorResponseExeption;
+import org.kar.archidata.exception.RESTErrorResponseException;
import org.kar.archidata.tools.ConfigBaseVariable;
import org.kar.archidata.tools.RESTApi;
import org.kar.karideo.api.HealthCheck.HealthResult;
@@ -49,7 +48,7 @@ public class TestHealthCheck {
webInterface.stop();
webInterface = null;
LOGGER.info("Remove the test db");
- DBEntry.closeAllForceMode();
+ // DBEntry.closeAllForceMode();
ConfigBaseVariable.clearAllValue();
}
@@ -64,7 +63,7 @@ public class TestHealthCheck {
@Order(2)
@Test
public void checkHealthCheckWrongAPI() throws Exception {
- Assertions.assertThrows(RESTErrorResponseExeption.class, () -> api.get(HealthResult.class, "health_checks"));
+ Assertions.assertThrows(RESTErrorResponseException.class, () -> api.get(HealthResult.class, "health_checks"));
}
}
diff --git a/back/test/src/test/kar/karideo/WebLauncherTest.java b/back/test/src/test/kar/karideo/WebLauncherTest.java
index 930c089..43789e3 100755
--- a/back/test/src/test/kar/karideo/WebLauncherTest.java
+++ b/back/test/src/test/kar/karideo/WebLauncherTest.java
@@ -1,7 +1,6 @@
package test.kar.karideo;
-import org.kar.archidata.tools.ConfigBaseVariable;
import org.kar.karideo.WebLauncher;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -9,26 +8,5 @@ import org.slf4j.LoggerFactory;
public class WebLauncherTest extends WebLauncher {
final private static Logger LOGGER = LoggerFactory.getLogger(WebLauncherTest.class);
- public WebLauncherTest() {
- LOGGER.debug("Configure REST system");
- // for local test:
- ConfigBaseVariable.apiAdress = "http://127.0.0.1:12342/test/api/";
- // Enable the test mode permit to access to the test token (never use it in production).
- ConfigBaseVariable.testMode = "true";
- // for the test we a in memory sqlite..
- if (true) {
- if (!"true".equalsIgnoreCase(System.getenv("TEST_E2E_MODE"))) {
- ConfigBaseVariable.dbType = "sqlite";
- ConfigBaseVariable.dbHost = "memory";
- // for test we need to connect all time the DB
- ConfigBaseVariable.dbKeepConnected = "true";
- }
- } else {
- // Enable this if you want to access to a local MySQL base to test with an adminer
- ConfigBaseVariable.bdDatabase = "test_db";
- ConfigBaseVariable.dbPort = "3309";
- ConfigBaseVariable.dbUser = "root";
- ConfigBaseVariable.dbPassword = "password";
- }
- }
+ public WebLauncherTest() {}
}
diff --git a/front/package.json b/front/package.json
deleted file mode 100644
index d4aaaa1..0000000
--- a/front/package.json
+++ /dev/null
@@ -1,50 +0,0 @@
-{
- "name": "karideo",
- "version": "0.0.0",
- "license": "MPL-2",
- "scripts": {
- "all": "npm run build && npm run test",
- "ng": "ng",
- "dev": "ng serve --configuration=develop --watch --port 4202",
- "dev-hot-update": "ng serve --configuration=develop --watch --hmr --port 4202",
- "build": "ng build --prod",
- "test": "ng test",
- "lint": "ng lint",
- "style": "prettier --write .",
- "e2e": "ng e2e",
- "update_packages": "ncu --upgrade",
- "install_dependency": "pnpm install --force",
- "link_kar_cw": "pnpm link ../../kar-cw/dist/kar-cw/",
- "unlink_kar_cw": "pnpm unlink ../../kar-cw/dist/kar-cw/"
- },
- "private": true,
- "dependencies": {
- "@angular/animations": "^18.0.2",
- "@angular/cdk": "^18.0.2",
- "@angular/common": "^18.0.2",
- "@angular/compiler": "^18.0.2",
- "@angular/core": "^18.0.2",
- "@angular/forms": "^18.0.2",
- "@angular/material": "^18.0.2",
- "@angular/platform-browser": "^18.0.2",
- "@angular/platform-browser-dynamic": "^18.0.2",
- "@angular/router": "^18.0.2",
- "rxjs": "^7.8.1",
- "zone.js": "^0.14.6",
- "zod": "3.23.8",
- "@kangaroo-and-rabbit/kar-cw": "^0.4.1"
- },
- "devDependencies": {
- "@angular-devkit/build-angular": "^18.0.3",
- "@angular-eslint/builder": "18.0.1",
- "@angular-eslint/eslint-plugin": "18.0.1",
- "@angular-eslint/eslint-plugin-template": "18.0.1",
- "@angular-eslint/schematics": "18.0.1",
- "@angular-eslint/template-parser": "18.0.1",
- "@angular/cli": "^18.0.3",
- "@angular/compiler-cli": "^18.0.2",
- "@angular/language-service": "^18.0.2",
- "npm-check-updates": "^16.14.20",
- "tslib": "^2.6.3"
- }
-}
\ No newline at end of file
diff --git a/front/.browserslistrc b/front_angular/.browserslistrc
similarity index 100%
rename from front/.browserslistrc
rename to front_angular/.browserslistrc
diff --git a/front/.editorconfig b/front_angular/.editorconfig
similarity index 100%
rename from front/.editorconfig
rename to front_angular/.editorconfig
diff --git a/front/.eslintignore b/front_angular/.eslintignore
similarity index 100%
rename from front/.eslintignore
rename to front_angular/.eslintignore
diff --git a/front/.eslintrc.js b/front_angular/.eslintrc.js
similarity index 100%
rename from front/.eslintrc.js
rename to front_angular/.eslintrc.js
diff --git a/front/.gitignore b/front_angular/.gitignore
similarity index 100%
rename from front/.gitignore
rename to front_angular/.gitignore
diff --git a/front/Dockerfile b/front_angular/Dockerfile
similarity index 100%
rename from front/Dockerfile
rename to front_angular/Dockerfile
diff --git a/front/Dockerfile.dev b/front_angular/Dockerfile.dev
similarity index 100%
rename from front/Dockerfile.dev
rename to front_angular/Dockerfile.dev
diff --git a/front/angular.json b/front_angular/angular.json
similarity index 100%
rename from front/angular.json
rename to front_angular/angular.json
diff --git a/front/docker-compose.yaml b/front_angular/docker-compose.yaml
similarity index 100%
rename from front/docker-compose.yaml
rename to front_angular/docker-compose.yaml
diff --git a/front/e2e/app.e2e-spec.ts b/front_angular/e2e/app.e2e-spec.ts
similarity index 100%
rename from front/e2e/app.e2e-spec.ts
rename to front_angular/e2e/app.e2e-spec.ts
diff --git a/front/e2e/app.po.ts b/front_angular/e2e/app.po.ts
similarity index 100%
rename from front/e2e/app.po.ts
rename to front_angular/e2e/app.po.ts
diff --git a/front/e2e/tsconfig.e2e.json b/front_angular/e2e/tsconfig.e2e.json
similarity index 100%
rename from front/e2e/tsconfig.e2e.json
rename to front_angular/e2e/tsconfig.e2e.json
diff --git a/front/httpd/httpd.conf b/front_angular/httpd/httpd.conf
similarity index 100%
rename from front/httpd/httpd.conf
rename to front_angular/httpd/httpd.conf
diff --git a/front/karma.conf.js b/front_angular/karma.conf.js
similarity index 100%
rename from front/karma.conf.js
rename to front_angular/karma.conf.js
diff --git a/front_angular/package.json b/front_angular/package.json
new file mode 100644
index 0000000..7c5c5a4
--- /dev/null
+++ b/front_angular/package.json
@@ -0,0 +1,50 @@
+{
+ "name": "karideo",
+ "version": "0.0.0",
+ "license": "MPL-2",
+ "scripts": {
+ "all": "npm run build && npm run test",
+ "ng": "ng",
+ "dev": "ng serve --configuration=develop --watch --port 4202",
+ "dev-hot-update": "ng serve --configuration=develop --watch --hmr --port 4202",
+ "build": "ng build --prod",
+ "test": "ng test",
+ "lint": "ng lint",
+ "style": "prettier --write .",
+ "e2e": "ng e2e",
+ "update_packages": "ncu --upgrade",
+ "install_dependency": "pnpm install --force",
+ "link_kar_cw": "pnpm link ../../kar-cw/dist/kar-cw/",
+ "unlink_kar_cw": "pnpm unlink ../../kar-cw/dist/kar-cw/"
+ },
+ "private": true,
+ "dependencies": {
+ "@angular/animations": "^18.1.3",
+ "@angular/cdk": "^18.1.3",
+ "@angular/common": "^18.1.3",
+ "@angular/compiler": "^18.1.3",
+ "@angular/core": "^18.1.3",
+ "@angular/forms": "^18.1.3",
+ "@angular/material": "^18.1.3",
+ "@angular/platform-browser": "^18.1.3",
+ "@angular/platform-browser-dynamic": "^18.1.3",
+ "@angular/router": "^18.1.3",
+ "rxjs": "^7.8.1",
+ "zone.js": "^0.14.8",
+ "zod": "3.23.8",
+ "@kangaroo-and-rabbit/kar-cw": "^0.4.1"
+ },
+ "devDependencies": {
+ "@angular-devkit/build-angular": "^18.1.3",
+ "@angular-eslint/builder": "18.2.0",
+ "@angular-eslint/eslint-plugin": "18.2.0",
+ "@angular-eslint/eslint-plugin-template": "18.2.0",
+ "@angular-eslint/schematics": "18.2.0",
+ "@angular-eslint/template-parser": "18.2.0",
+ "@angular/cli": "^18.1.3",
+ "@angular/compiler-cli": "^18.1.3",
+ "@angular/language-service": "^18.1.3",
+ "npm-check-updates": "^17.0.0",
+ "tslib": "^2.6.3"
+ }
+}
\ No newline at end of file
diff --git a/front/pnpm-lock.yaml b/front_angular/pnpm-lock.yaml
similarity index 100%
rename from front/pnpm-lock.yaml
rename to front_angular/pnpm-lock.yaml
diff --git a/front/protractor.conf.js b/front_angular/protractor.conf.js
similarity index 100%
rename from front/protractor.conf.js
rename to front_angular/protractor.conf.js
diff --git a/front/readme.md b/front_angular/readme.md
similarity index 100%
rename from front/readme.md
rename to front_angular/readme.md
diff --git a/front/src/app/app-routing.module.ts b/front_angular/src/app/app-routing.module.ts
similarity index 100%
rename from front/src/app/app-routing.module.ts
rename to front_angular/src/app/app-routing.module.ts
diff --git a/front/src/app/app.component.html b/front_angular/src/app/app.component.html
similarity index 100%
rename from front/src/app/app.component.html
rename to front_angular/src/app/app.component.html
diff --git a/front/src/app/app.component.less b/front_angular/src/app/app.component.less
similarity index 100%
rename from front/src/app/app.component.less
rename to front_angular/src/app/app.component.less
diff --git a/front/src/app/app.component.ts b/front_angular/src/app/app.component.ts
similarity index 100%
rename from front/src/app/app.component.ts
rename to front_angular/src/app/app.component.ts
diff --git a/front/src/app/app.module.ts b/front_angular/src/app/app.module.ts
similarity index 100%
rename from front/src/app/app.module.ts
rename to front_angular/src/app/app.module.ts
diff --git a/front/src/app/back-api/api/data-resource.ts b/front_angular/src/app/back-api/api/data-resource.ts
similarity index 92%
rename from front/src/app/back-api/api/data-resource.ts
rename to front_angular/src/app/back-api/api/data-resource.ts
index 61891c1..7b32bb2 100644
--- a/front/src/app/back-api/api/data-resource.ts
+++ b/front_angular/src/app/back-api/api/data-resource.ts
@@ -10,7 +10,7 @@ import {
} from "../rest-tools";
import {
- UUID,
+ ObjectId,
} from "../model";
export namespace DataResource {
@@ -30,13 +30,13 @@ export namespace DataResource {
},
params: {
name: string,
- uuid: UUID,
+ oid: ObjectId,
},
data: string,
}): Promise