From 2c0fb992023b966f53fba6f96c056a1bc4b7d4a5 Mon Sep 17 00:00:00 2001 From: Edouard DUPIN Date: Sat, 12 Oct 2024 10:46:02 +0200 Subject: [PATCH] [FEAT] update with archidata mongo interface --- back/src/org/kar/karusic/MorphiaService.java | 27 +--- back/src/org/kar/karusic/WebLauncher.java | 10 +- .../org/kar/karusic/api/AlbumResource.java | 143 +++++++----------- .../org/kar/karusic/api/ArtistResource.java | 25 +-- .../org/kar/karusic/api/GenderResource.java | 25 +-- .../org/kar/karusic/api/PlaylistResource.java | 30 ++-- .../org/kar/karusic/api/TrackResource.java | 44 +++--- .../src/org/kar/karusic/api/UserResource.java | 5 +- .../kar/karusic/migration/Initialization.java | 66 ++++---- back/src/org/kar/karusic/model/Album.java | 2 + back/src/org/kar/karusic/model/Artist.java | 2 + back/src/org/kar/karusic/model/Gender.java | 9 ++ back/src/org/kar/karusic/model/Playlist.java | 2 + back/src/org/kar/karusic/model/Track.java | 2 + back/src/resources/simplelogger.properties | 4 +- back/test/src/test/kar/karusic/TestBase.java | 1 - env_dev/docker-compose.yaml | 27 ++-- front/src/back-api/api/album-resource.ts | 24 --- 18 files changed, 202 insertions(+), 246 deletions(-) diff --git a/back/src/org/kar/karusic/MorphiaService.java b/back/src/org/kar/karusic/MorphiaService.java index 68a24b6..f6bfa78 100644 --- a/back/src/org/kar/karusic/MorphiaService.java +++ b/back/src/org/kar/karusic/MorphiaService.java @@ -1,34 +1,17 @@ package org.kar.karusic; +import org.kar.archidata.db.DbInterfaceMorphia; import org.kar.karusic.model.Album; import org.kar.karusic.model.Artist; import org.kar.karusic.model.Gender; import org.kar.karusic.model.Playlist; import org.kar.karusic.model.Track; -import com.mongodb.client.MongoClient; -import com.mongodb.client.MongoClients; +public class MorphiaService extends DbInterfaceMorphia { -import dev.morphia.Datastore; -import dev.morphia.Morphia; - -public class MorphiaService { - - private final Datastore datastore; - public MorphiaService() { - // Connect to MongoDB - final MongoClient mongoClient = MongoClients.create("mongodb://root:base_db_password@localhost:27017"); - this.datastore = Morphia.createDatastore(mongoClient, "karusic"); - - // Map entities - this.datastore.getMapper().map(Album.class, Artist.class, Gender.class, Playlist.class, Track.class); - - // Ensure indexes - this.datastore.ensureIndexes(); - } - - public Datastore getDatastore() { - return this.datastore; + super("mongodb://root:base_db_password@localhost:27017", "karusic", Album.class, Artist.class, Gender.class, Playlist.class, Track.class); + } + } diff --git a/back/src/org/kar/karusic/WebLauncher.java b/back/src/org/kar/karusic/WebLauncher.java index 25f33f8..b9b32eb 100755 --- a/back/src/org/kar/karusic/WebLauncher.java +++ b/back/src/org/kar/karusic/WebLauncher.java @@ -17,6 +17,7 @@ import org.kar.archidata.UpdateJwtPublicKey; import org.kar.archidata.api.DataResource; import org.kar.archidata.api.ProxyResource; import org.kar.archidata.catcher.GenericCatcher; +import org.kar.archidata.dataAccess.DataAccess; import org.kar.archidata.filter.CORSFilter; import org.kar.archidata.filter.OptionFilter; import org.kar.archidata.migration.MigrationEngine; @@ -45,8 +46,11 @@ public class WebLauncher { protected UpdateJwtPublicKey keyUpdater = null; protected HttpServer server = null; + private final DataAccess da; + public WebLauncher() { ConfigBaseVariable.bdDatabase = "karusic"; + this.da = DataAccess.createInterface(); } private static URI getBaseURI() { @@ -55,7 +59,7 @@ public class WebLauncher { public void migrateDB() throws Exception { WebLauncher.LOGGER.info("Create migration engine"); - final MigrationEngine migrationEngine = new MigrationEngine(); + final MigrationEngine migrationEngine = new MigrationEngine(this.da); WebLauncher.LOGGER.info("Add initialization"); migrationEngine.setInit(new Initialization()); WebLauncher.LOGGER.info("Add migration since last version"); @@ -64,7 +68,7 @@ public class WebLauncher { migrationEngine.add(new Migration20240226()); migrationEngine.add(new Migration20240907()); WebLauncher.LOGGER.info("Migrate the DB [START]"); - migrationEngine.migrateWaitAdmin(GlobalConfiguration.dbConfig); + migrationEngine.migrateWaitAdmin(GlobalConfiguration.getDbconfig()); WebLauncher.LOGGER.info("Migrate the DB [STOP]"); } @@ -148,7 +152,7 @@ public class WebLauncher { // System.out.println(" getDBLogin: '" + ConfigVariable.getDBLogin() + "'"); // System.out.println(" getDBPassword: '" + ConfigVariable.getDBPassword() + "'"); // System.out.println(" getDBName: '" + ConfigVariable.getDBName() + "'"); - System.out.println(" ==> " + GlobalConfiguration.dbConfig); + System.out.println(" ==> " + GlobalConfiguration.getDbconfig()); System.out.println("OAuth service " + getBaseURI()); this.server = GrizzlyHttpServerFactory.createHttpServer(getBaseURI(), rc); final HttpServer serverLink = this.server; diff --git a/back/src/org/kar/karusic/api/AlbumResource.java b/back/src/org/kar/karusic/api/AlbumResource.java index c87f167..bf69871 100644 --- a/back/src/org/kar/karusic/api/AlbumResource.java +++ b/back/src/org/kar/karusic/api/AlbumResource.java @@ -11,17 +11,13 @@ import org.kar.archidata.annotation.FormDataOptional; import org.kar.archidata.annotation.TypeScriptProgress; import org.kar.archidata.dataAccess.DataAccess; import org.kar.archidata.dataAccess.addOn.AddOnDataJson; -import org.kar.archidata.dataAccess.addOn.AddOnManyToMany; import org.kar.archidata.dataAccess.options.CheckFunction; import org.kar.archidata.tools.DataTools; -import org.kar.karusic.MorphiaService; import org.kar.karusic.model.Album; import org.kar.karusic.model.Album.AlbumChecker; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import dev.morphia.query.Query; -import dev.morphia.query.filters.Filters; import io.swagger.v3.oas.annotations.Operation; import jakarta.annotation.security.RolesAllowed; import jakarta.ws.rs.Consumes; @@ -39,133 +35,108 @@ import jakarta.ws.rs.core.MediaType; public class AlbumResource { private static final Logger LOGGER = LoggerFactory.getLogger(AlbumResource.class); static final AlbumChecker CHECKER = new AlbumChecker(); - - private final MorphiaService morphiaService = new MorphiaService(); - + + private final DataAccess da = DataAccess.createInterface(); + @GET @Path("{id}") @RolesAllowed("USER") @Operation(description = "Get a specific Album with his ID") public Album get(@PathParam("id") final Long id) throws Exception { - //return DataAccess.get(Album.class, id); - return this.morphiaService.getDatastore().find(Album.class).filter(Filters.eq("id", id)).first(); + return this.da.get(Album.class, id); + // return this.morphiaService.getDatastore().find(Album.class).filter(Filters.eq("id", id)).first(); } - + @GET @RolesAllowed("USER") @Operation(description = "Get all the available Albums") public List gets() throws Exception { - //return DataAccess.gets(Album.class); - final Query query = this.morphiaService.getDatastore().find(Album.class); - return query.stream().toList(); + return this.da.gets(Album.class); + // final Query query = this.morphiaService.getDatastore().find(Album.class); + // return query.stream().toList(); } - + @POST @RolesAllowed("ADMIN") @Consumes(MediaType.APPLICATION_JSON) @Operation(description = "Add an album (when all the data already exist)") public Album post(final Album data) throws Exception { // TODO: how to manage the checker ??? - final Album ret = this.morphiaService.getDatastore().save(data); - return ret; - /* - - final MongoCollection trackCollection = db.getCollection("TTRACLK", Track.class); - - final InsertOneResult res = trackCollection.insertOne(plop); - - LOGGER.warn("plpop {}", res); - - final ObjectId ploppppp = res.getInsertedId().asObjectId().getValue(); - - LOGGER.warn("plpop 2522 {}", res.getInsertedId().asObjectId().getValue()); - - final Track ret = trackCollection.find(Filters.eq("_id", res.getInsertedId().asObjectId().getValue())) - - .first(); - - System.out.println("Grade found:\t" + ret); - - return DataAccess.insert(data, new CheckFunction(CHECKER)); - */ + // final Album ret = this.morphiaService.getDatastore().save(data); + // return ret; + /* final MongoCollection trackCollection = db.getCollection("TTRACLK", Track.class); final InsertOneResult res = trackCollection.insertOne(plop); LOGGER.warn("plpop {}", res); final + * ObjectId ploppppp = res.getInsertedId().asObjectId().getValue(); LOGGER.warn("plpop 2522 {}", res.getInsertedId().asObjectId().getValue()); final Track ret = + * trackCollection.find(Filters.eq("_id", res.getInsertedId().asObjectId().getValue())) .first(); System.out.println("Grade found:\t" + ret); */ + return this.da.insert(data, new CheckFunction(CHECKER)); } - + @PATCH @Path("{id}") @RolesAllowed("ADMIN") @Consumes(MediaType.APPLICATION_JSON) @Operation(description = "Update a specific album") - public Album patch(@PathParam("id") final Long id, @AsyncType(Album.class) final String jsonRequest) - throws Exception { - // final Query query = this.morphiaService.getDatastore().find(Album.class).filter(Filters.eq("id", id)); - // final UpdateOperations ops = this.morphiaService.getDatastore().createUpdateOperations(Album.class) - // .set("name", master.getName()); - // this.morphiaService.getDatastore().update(query, ops); - // return Response.ok(master).build(); - - DataAccess.updateWithJson(Album.class, id, jsonRequest, new CheckFunction(CHECKER)); - return DataAccess.get(Album.class, id); + public Album patch(@PathParam("id") final Long id, @AsyncType(Album.class) final String jsonRequest) throws Exception { + // final Query query = this.morphiaService.getDatastore().find(Album.class).filter(Filters.eq("id", id)); + // final UpdateOperations ops = this.morphiaService.getDatastore().createUpdateOperations(Album.class) + // .set("name", master.getName()); + // this.morphiaService.getDatastore().update(query, ops); + // return Response.ok(master).build(); + + this.da.updateWithJson(Album.class, id, jsonRequest, new CheckFunction(CHECKER)); + return this.da.get(Album.class, id); } - // @PUT - // @Path("{id}") - // @RolesAllowed("ADMIN") - // @Consumes(MediaType.APPLICATION_JSON) - // @Operation(description = "Update a specific album") - // public Album put(@PathParam("id") final Long id, final Album album) - // throws Exception { - // final Query query = this.morphiaService.getDatastore().find(Album.class).filter(Filters.eq("id", id)); - // final UpdateOperations ops = this.morphiaService.getDatastore().createUpdateOperations(Album.class) - // .set("name", album.getName()); - // this.morphiaService.getDatastore().update(query, ops); - // return Response.ok(album).build(); - // } - + // @PUT + // @Path("{id}") + // @RolesAllowed("ADMIN") + // @Consumes(MediaType.APPLICATION_JSON) + // @Operation(description = "Update a specific album") + // public Album put(@PathParam("id") final Long id, final Album album) + // throws Exception { + // final Query query = this.morphiaService.getDatastore().find(Album.class).filter(Filters.eq("id", id)); + // final UpdateOperations ops = this.morphiaService.getDatastore().createUpdateOperations(Album.class) + // .set("name", album.getName()); + // this.morphiaService.getDatastore().update(query, ops); + // return Response.ok(album).build(); + // } + @DELETE @Path("{id}") @RolesAllowed("ADMIN") @Operation(description = "Remove a specific album") public void remove(@PathParam("id") final Long id) throws Exception { - //DataAccess.delete(Album.class, id); - this.morphiaService.getDatastore().find(Album.class).filter(Filters.eq("id", id)).delete(); + this.da.delete(Album.class, id); + // this.morphiaService.getDatastore().find(Album.class).filter(Filters.eq("id", id)).delete(); } - - @POST - @Path("{id}/track/{trackId}") - @RolesAllowed("ADMIN") - @Consumes({ MediaType.MULTIPART_FORM_DATA }) - @Operation(description = "Add a Track on a specific album") - public Album addTrack(@PathParam("id") final Long id, @PathParam("trackId") final Long trackId) throws Exception { - AddOnManyToMany.removeLink(Album.class, id, "track", trackId); - return DataAccess.get(Album.class, id); - } - + + /* @POST + * @Path("{id}/track/{trackId}") + * @RolesAllowed("ADMIN") + * @Consumes({ MediaType.MULTIPART_FORM_DATA }) + * @Operation(description = "Add a Track on a specific album") public Album addTrack(@PathParam("id") final Long id, @PathParam("trackId") final Long trackId) throws Exception { + * AddOnManyToMany.removeLink(this.dam, Album.class, id, "track", trackId); return this.dam.get(Album.class, id); } */ @POST @Path("{id}/cover") @RolesAllowed("ADMIN") @Consumes({ MediaType.MULTIPART_FORM_DATA }) @Operation(description = "Add a cover on a specific album") @TypeScriptProgress - public Album uploadCover( - @PathParam("id") final Long id, - @FormDataOptional @FormDataParam("uri") final String uri, - @FormDataOptional @FormDataParam("file") final InputStream fileInputStream, + public Album uploadCover(@PathParam("id") final Long id, @FormDataOptional @FormDataParam("uri") final String uri, @FormDataOptional @FormDataParam("file") final InputStream fileInputStream, @FormDataOptional @FormDataParam("file") final FormDataContentDisposition fileMetaData) throws Exception { if (uri != null) { - DataTools.uploadCoverFromUri(Album.class, id, uri); + DataTools.uploadCoverFromUri(this.da, Album.class, id, uri); } else { - DataTools.uploadCover(Album.class, id, fileInputStream, fileMetaData); + DataTools.uploadCover(this.da, Album.class, id, fileInputStream, fileMetaData); } - return DataAccess.get(Album.class, id); + return this.da.get(Album.class, id); } - + @DELETE @Path("{id}/cover/{coverId}") @RolesAllowed("ADMIN") @Operation(description = "Remove a cover on a specific album") - public Album removeCover(@PathParam("id") final Long id, @PathParam("coverId") final UUID coverId) - throws Exception { - AddOnDataJson.removeLink(Album.class, id, "covers", coverId); - return DataAccess.get(Album.class, id); + public Album removeCover(@PathParam("id") final Long id, @PathParam("coverId") final UUID coverId) throws Exception { + AddOnDataJson.removeLink(this.da, Album.class, id, "covers", coverId); + return this.da.get(Album.class, id); } } diff --git a/back/src/org/kar/karusic/api/ArtistResource.java b/back/src/org/kar/karusic/api/ArtistResource.java index 2507576..5c3ef12 100644 --- a/back/src/org/kar/karusic/api/ArtistResource.java +++ b/back/src/org/kar/karusic/api/ArtistResource.java @@ -34,25 +34,26 @@ import jakarta.ws.rs.core.MediaType; public class ArtistResource { private static final Logger LOGGER = LoggerFactory.getLogger(ArtistResource.class); static final ArtistChecker CHECKER = new ArtistChecker(); + private final DataAccess da = DataAccess.createInterface(); @GET @Path("{id}") @RolesAllowed("USER") - public static Artist get(@PathParam("id") final Long id) throws Exception { - return DataAccess.get(Artist.class, id); + public Artist get(@PathParam("id") final Long id) throws Exception { + return this.da.get(Artist.class, id); } @GET @RolesAllowed("USER") public List gets() throws Exception { - return DataAccess.gets(Artist.class); + return this.da.gets(Artist.class); } @POST @RolesAllowed("ADMIN") @Consumes(MediaType.APPLICATION_JSON) public Artist post(final Artist data) throws Exception { - return DataAccess.insert(data, new CheckFunction(CHECKER)); + return this.da.insert(data, new CheckFunction(CHECKER)); } @PATCH @@ -60,15 +61,15 @@ public class ArtistResource { @RolesAllowed("ADMIN") @Consumes(MediaType.APPLICATION_JSON) public Artist patch(@PathParam("id") final Long id, @AsyncType(Artist.class) final String jsonRequest) throws Exception { - DataAccess.updateWithJson(Artist.class, id, jsonRequest, new CheckFunction(CHECKER)); - return DataAccess.get(Artist.class, id); + this.da.updateWithJson(Artist.class, id, jsonRequest, new CheckFunction(CHECKER)); + return this.da.get(Artist.class, id); } @DELETE @Path("{id}") @RolesAllowed("ADMIN") public void remove(@PathParam("id") final Long id) throws Exception { - DataAccess.delete(Artist.class, id); + this.da.delete(Artist.class, id); } @POST @@ -79,11 +80,11 @@ public class ArtistResource { public Artist uploadCover(@PathParam("id") final Long id, @FormDataOptional @FormDataParam("uri") final String uri, @FormDataOptional @FormDataParam("file") final InputStream fileInputStream, @FormDataOptional @FormDataParam("file") final FormDataContentDisposition fileMetaData) throws Exception { if (uri != null) { - DataTools.uploadCoverFromUri(Artist.class, id, uri); + DataTools.uploadCoverFromUri(this.da, Artist.class, id, uri); } else { - DataTools.uploadCover(Artist.class, id, fileInputStream, fileMetaData); + DataTools.uploadCover(this.da, Artist.class, id, fileInputStream, fileMetaData); } - return DataAccess.get(Artist.class, id); + return this.da.get(Artist.class, id); } @DELETE @@ -91,7 +92,7 @@ public class ArtistResource { @RolesAllowed("ADMIN") public Artist removeCover(@PathParam("id") final Long id, @PathParam("coverId") final UUID coverId) throws Exception { LOGGER.error("klmlmkmlkmlklmklmk"); - AddOnDataJson.removeLink(Artist.class, id, "covers", coverId); - return DataAccess.get(Artist.class, id); + AddOnDataJson.removeLink(this.da, Artist.class, id, "covers", coverId); + return this.da.get(Artist.class, id); } } diff --git a/back/src/org/kar/karusic/api/GenderResource.java b/back/src/org/kar/karusic/api/GenderResource.java index 00272ed..6120112 100644 --- a/back/src/org/kar/karusic/api/GenderResource.java +++ b/back/src/org/kar/karusic/api/GenderResource.java @@ -34,25 +34,26 @@ import jakarta.ws.rs.core.MediaType; public class GenderResource { private static final Logger LOGGER = LoggerFactory.getLogger(GenderResource.class); static final GenderChecker CHECKER = new GenderChecker(); + private final DataAccess da = DataAccess.createInterface(); @GET @Path("{id}") @RolesAllowed("USER") - public static Gender get(@PathParam("id") final Long id) throws Exception { - return DataAccess.get(Gender.class, id); + public Gender get(@PathParam("id") final Long id) throws Exception { + return this.da.get(Gender.class, id); } @GET @RolesAllowed("USER") public List gets() throws Exception { - return DataAccess.gets(Gender.class); + return this.da.gets(Gender.class); } @POST @RolesAllowed("ADMIN") @Consumes(MediaType.APPLICATION_JSON) public Gender post(final Gender data) throws Exception { - return DataAccess.insert(data, new CheckFunction(CHECKER)); + return this.da.insert(data, new CheckFunction(CHECKER)); } @PATCH @@ -60,15 +61,15 @@ public class GenderResource { @RolesAllowed("ADMIN") @Consumes(MediaType.APPLICATION_JSON) public Gender patch(@PathParam("id") final Long id, @AsyncType(Gender.class) final String jsonRequest) throws Exception { - DataAccess.updateWithJson(Gender.class, id, jsonRequest, new CheckFunction(CHECKER)); - return DataAccess.get(Gender.class, id); + this.da.updateWithJson(Gender.class, id, jsonRequest, new CheckFunction(CHECKER)); + return this.da.get(Gender.class, id); } @DELETE @Path("{id}") @RolesAllowed("ADMIN") public void remove(@PathParam("id") final Long id) throws Exception { - DataAccess.delete(Gender.class, id); + this.da.delete(Gender.class, id); } @POST @@ -79,18 +80,18 @@ public class GenderResource { public Gender uploadCover(@PathParam("id") final Long id, @FormDataOptional @FormDataParam("uri") final String uri, @FormDataOptional @FormDataParam("file") final InputStream fileInputStream, @FormDataOptional @FormDataParam("file") final FormDataContentDisposition fileMetaData) throws Exception { if (uri != null) { - DataTools.uploadCoverFromUri(Gender.class, id, uri); + DataTools.uploadCoverFromUri(this.da, Gender.class, id, uri); } else { - DataTools.uploadCover(Gender.class, id, fileInputStream, fileMetaData); + DataTools.uploadCover(this.da, Gender.class, id, fileInputStream, fileMetaData); } - return DataAccess.get(Gender.class, id); + return this.da.get(Gender.class, id); } @DELETE @Path("{id}/cover/{coverId}") @RolesAllowed("ADMIN") public Gender removeCover(@PathParam("id") final Long id, @PathParam("coverId") final UUID coverId) throws Exception { - AddOnDataJson.removeLink(Gender.class, id, "covers", coverId); - return DataAccess.get(Gender.class, id); + AddOnDataJson.removeLink(this.da, Gender.class, id, "covers", coverId); + return this.da.get(Gender.class, id); } } diff --git a/back/src/org/kar/karusic/api/PlaylistResource.java b/back/src/org/kar/karusic/api/PlaylistResource.java index 24c0238..597c220 100644 --- a/back/src/org/kar/karusic/api/PlaylistResource.java +++ b/back/src/org/kar/karusic/api/PlaylistResource.java @@ -9,7 +9,6 @@ import org.glassfish.jersey.media.multipart.FormDataParam; import org.kar.archidata.annotation.AsyncType; import org.kar.archidata.dataAccess.DataAccess; import org.kar.archidata.dataAccess.addOn.AddOnDataJson; -import org.kar.archidata.dataAccess.addOn.AddOnManyToMany; import org.kar.archidata.dataAccess.options.CheckFunction; import org.kar.archidata.tools.DataTools; import org.kar.karusic.model.Playlist; @@ -33,25 +32,26 @@ import jakarta.ws.rs.core.MediaType; public class PlaylistResource { private static final Logger LOGGER = LoggerFactory.getLogger(PlaylistResource.class); static final TrackChecker CHECKER = new TrackChecker(); + private final DataAccess da = DataAccess.createInterface(); @GET @Path("{id}") @RolesAllowed("USER") - public static Playlist get(@PathParam("id") final Long id) throws Exception { - return DataAccess.get(Playlist.class, id); + public Playlist get(@PathParam("id") final Long id) throws Exception { + return this.da.get(Playlist.class, id); } @GET @RolesAllowed("USER") public List gets() throws Exception { - return DataAccess.gets(Playlist.class); + return this.da.gets(Playlist.class); } @POST @RolesAllowed("ADMIN") @Consumes(MediaType.APPLICATION_JSON) public Playlist post(final Playlist data) throws Exception { - return DataAccess.insert(data, new CheckFunction(CHECKER)); + return this.da.insert(data, new CheckFunction(CHECKER)); } @PATCH @@ -59,15 +59,15 @@ public class PlaylistResource { @RolesAllowed("ADMIN") @Consumes(MediaType.APPLICATION_JSON) public Playlist patch(@PathParam("id") final Long id, @AsyncType(Playlist.class) final String jsonRequest) throws Exception { - DataAccess.updateWithJson(Playlist.class, id, jsonRequest, new CheckFunction(CHECKER)); - return DataAccess.get(Playlist.class, id); + this.da.updateWithJson(Playlist.class, id, jsonRequest, new CheckFunction(CHECKER)); + return this.da.get(Playlist.class, id); } @DELETE @Path("{id}") @RolesAllowed("ADMIN") public void remove(@PathParam("id") final Long id) throws Exception { - DataAccess.delete(Playlist.class, id); + this.da.delete(Playlist.class, id); } @POST @@ -75,16 +75,16 @@ public class PlaylistResource { @RolesAllowed("ADMIN") @Consumes({ MediaType.MULTIPART_FORM_DATA }) public Playlist addTrack(@PathParam("id") final Long id, @PathParam("trackId") final Long trackId) throws Exception { - AddOnManyToMany.removeLink(Playlist.class, id, "track", trackId); - return DataAccess.get(Playlist.class, id); + AddOnDataJson.removeLink(this.da, Playlist.class, id, "track", trackId); + return this.da.get(Playlist.class, id); } @DELETE @Path("{id}/track/{trackId}") @RolesAllowed("ADMIN") public Playlist removeTrack(@PathParam("id") final Long id, @PathParam("trackId") final Long trackId) throws Exception { - AddOnManyToMany.removeLink(Playlist.class, id, "track", trackId); - return DataAccess.get(Playlist.class, id); + AddOnDataJson.removeLink(this.da, Playlist.class, id, "track", trackId); + return this.da.get(Playlist.class, id); } @POST @@ -94,14 +94,14 @@ public class PlaylistResource { @AsyncType(Playlist.class) public void uploadCover(@PathParam("id") final Long id, @FormDataParam("file") final InputStream fileInputStream, @FormDataParam("file") final FormDataContentDisposition fileMetaData) throws Exception { - DataTools.uploadCover(Playlist.class, id, fileInputStream, fileMetaData); + DataTools.uploadCover(this.da, Playlist.class, id, fileInputStream, fileMetaData); } @DELETE @Path("{id}/cover/{coverId}") @RolesAllowed("ADMIN") public Playlist removeCover(@PathParam("id") final Long id, @PathParam("coverId") final UUID coverId) throws Exception { - AddOnDataJson.removeLink(Playlist.class, id, "covers", coverId); - return DataAccess.get(Playlist.class, id); + AddOnDataJson.removeLink(this.da, Playlist.class, id, "covers", coverId); + return this.da.get(Playlist.class, id); } } diff --git a/back/src/org/kar/karusic/api/TrackResource.java b/back/src/org/kar/karusic/api/TrackResource.java index 0dec8aa..79dcf80 100644 --- a/back/src/org/kar/karusic/api/TrackResource.java +++ b/back/src/org/kar/karusic/api/TrackResource.java @@ -14,7 +14,6 @@ import org.kar.archidata.annotation.FormDataOptional; import org.kar.archidata.annotation.TypeScriptProgress; import org.kar.archidata.dataAccess.DataAccess; import org.kar.archidata.dataAccess.addOn.AddOnDataJson; -import org.kar.archidata.dataAccess.addOn.AddOnManyToMany; import org.kar.archidata.dataAccess.options.CheckFunction; import org.kar.archidata.model.Data; import org.kar.archidata.tools.DataTools; @@ -40,25 +39,26 @@ import jakarta.ws.rs.core.Response; public class TrackResource { private static final Logger LOGGER = LoggerFactory.getLogger(TrackResource.class); static final TrackChecker CHECKER = new TrackChecker(); + private final DataAccess da = DataAccess.createInterface(); @GET @Path("{id}") @RolesAllowed("USER") - public static Track get(@PathParam("id") final Long id) throws Exception { - return DataAccess.get(Track.class, id); + public Track get(@PathParam("id") final Long id) throws Exception { + return this.da.get(Track.class, id); } @GET @RolesAllowed("USER") public List gets() throws Exception { - return DataAccess.gets(Track.class); + return this.da.gets(Track.class); } @POST @RolesAllowed("ADMIN") @Consumes(MediaType.APPLICATION_JSON) public Track post(final Track data) throws Exception { - return DataAccess.insert(data, new CheckFunction(CHECKER)); + return this.da.insert(data, new CheckFunction(CHECKER)); } @PATCH @@ -66,15 +66,15 @@ public class TrackResource { @RolesAllowed("ADMIN") @Consumes(MediaType.APPLICATION_JSON) public Track patch(@PathParam("id") final Long id, @AsyncType(Track.class) final String jsonRequest) throws Exception { - DataAccess.updateWithJson(Track.class, id, jsonRequest, new CheckFunction(CHECKER)); - return DataAccess.get(Track.class, id); + this.da.updateWithJson(Track.class, id, jsonRequest, new CheckFunction(CHECKER)); + return this.da.get(Track.class, id); } @DELETE @Path("{id}") @RolesAllowed("ADMIN") public void remove(@PathParam("id") final Long id) throws Exception { - DataAccess.delete(Track.class, id); + this.da.delete(Track.class, id); } @POST @@ -82,16 +82,16 @@ public class TrackResource { @RolesAllowed("ADMIN") @Consumes({ MediaType.MULTIPART_FORM_DATA }) public Track addTrack(@PathParam("id") final Long id, @PathParam("artistId") final Long artistId) throws Exception { - AddOnManyToMany.removeLink(Track.class, id, "artist", artistId); - return DataAccess.get(Track.class, id); + AddOnDataJson.removeLink(this.da, Track.class, id, "artist", artistId); + return this.da.get(Track.class, id); } @DELETE @Path("{id}/artist/{trackId}") @RolesAllowed("ADMIN") public Track removeTrack(@PathParam("id") final Long id, @PathParam("artistId") final Long artistId) throws Exception { - AddOnManyToMany.removeLink(Track.class, id, "artist", artistId); - return DataAccess.get(Track.class, id); + AddOnDataJson.removeLink(this.da, Track.class, id, "artist", artistId); + return this.da.get(Track.class, id); } @POST @@ -102,19 +102,19 @@ public class TrackResource { public Track uploadCover(@PathParam("id") final Long id, @FormDataParam("uri") final String uri, @FormDataParam("file") final InputStream fileInputStream, @FormDataParam("file") final FormDataContentDisposition fileMetaData) throws Exception { if (uri != null) { - DataTools.uploadCoverFromUri(Track.class, id, uri); + DataTools.uploadCoverFromUri(this.da, Track.class, id, uri); } else { - DataTools.uploadCover(Track.class, id, fileInputStream, fileMetaData); + DataTools.uploadCover(this.da, Track.class, id, fileInputStream, fileMetaData); } - return DataAccess.get(Track.class, id); + return this.da.get(Track.class, id); } @DELETE @Path("{id}/cover/{coverId}") @RolesAllowed("ADMIN") public Track removeCover(@PathParam("id") final Long id, @PathParam("coverId") final UUID coverId) throws Exception { - AddOnDataJson.removeLink(Track.class, id, "covers", coverId); - return DataAccess.get(Track.class, id); + AddOnDataJson.removeLink(this.da, Track.class, id, "covers", coverId); + return this.da.get(Track.class, id); } @POST @@ -153,12 +153,12 @@ public class TrackResource { final long tmpUID = DataTools.getTmpDataId(); final String sha512 = DataTools.saveTemporaryFile(fileInputStream, tmpUID); - Data data = DataTools.getWithSha512(sha512); + Data data = DataTools.getWithSha512(this.da, sha512); if (data == null) { LOGGER.info("Need to add the data in the BDD ... "); try { - data = DataTools.createNewData(tmpUID, fileMetaData.getFileName(), sha512); + data = DataTools.createNewData(this.da, tmpUID, fileMetaData.getFileName(), sha512); } catch (final IOException ex) { DataTools.removeTemporaryFile(tmpUID); ex.printStackTrace(); @@ -170,7 +170,7 @@ public class TrackResource { } } else if (data.deleted) { LOGGER.info("Data already exist but deleted"); - DataTools.undelete(data.uuid); + DataTools.undelete(this.da, data.uuid); data.deleted = false; } else { LOGGER.info("Data already exist ... all good"); @@ -188,8 +188,8 @@ public class TrackResource { trackElem.artists = new ArrayList<>(); trackElem.artists.add(artistId != null ? Long.parseLong(artistId) : null); } - trackElem = DataAccess.insert(trackElem, new CheckFunction(CHECKER)); - /* Old mode of artist insertion (removed due to the slowlest request of getting value if (artistElem != null) { DataAccess.addLink(Track.class, trackElem.id, "artist", artistElem.id); } */ + trackElem = this.da.insert(trackElem, new CheckFunction(CHECKER)); + /* Old mode of artist insertion (removed due to the slowlest request of getting value if (artistElem != null) { this.dam.addLink(Track.class, trackElem.id, "artist", artistElem.id); } */ return Response.ok(trackElem).build(); } catch (final Exception ex) { LOGGER.info("Catch an unexpected error ... {}", ex.getMessage()); diff --git a/back/src/org/kar/karusic/api/UserResource.java b/back/src/org/kar/karusic/api/UserResource.java index 6750303..140373c 100755 --- a/back/src/org/kar/karusic/api/UserResource.java +++ b/back/src/org/kar/karusic/api/UserResource.java @@ -26,6 +26,7 @@ import jakarta.ws.rs.core.SecurityContext; @Produces(MediaType.APPLICATION_JSON) public class UserResource { private static final Logger LOGGER = LoggerFactory.getLogger(UserResource.class); + private final DataAccess da = DataAccess.createInterface(); @JsonInclude(JsonInclude.Include.NON_NULL) public class UserOut { @@ -47,7 +48,7 @@ public class UserResource { public List gets() { LOGGER.info("getUsers"); try { - return DataAccess.gets(UserKarusic.class); + return this.da.gets(UserKarusic.class); } catch (final Exception e) { // TODO Auto-generated catch block e.printStackTrace(); @@ -66,7 +67,7 @@ public class UserResource { LOGGER.info("== USER {} ", gc.userByToken.name); LOGGER.info("==================================================="); try { - return DataAccess.get(UserKarusic.class, userId); + return this.da.get(UserKarusic.class, userId); } catch (final Exception e) { // TODO Auto-generated catch block e.printStackTrace(); diff --git a/back/src/org/kar/karusic/migration/Initialization.java b/back/src/org/kar/karusic/migration/Initialization.java index 0396ff2..4dcfbcf 100644 --- a/back/src/org/kar/karusic/migration/Initialization.java +++ b/back/src/org/kar/karusic/migration/Initialization.java @@ -35,35 +35,35 @@ public class Initialization extends MigrationSqlStep { addClass(elem); } - addAction(""" - INSERT INTO `gender` (`id`, `name`, `description`) VALUES - (1, 'Variété française', NULL), - (2, 'Pop', NULL), - (3, 'inconnue', NULL), - (4, 'Disco', NULL), - (5, 'Enfants', NULL), - (6, 'Portugaise', NULL), - (7, 'Apprentissage', NULL), - (8, 'Blues', NULL), - (9, 'Jazz', NULL), - (10, 'Chanson Noël', NULL), - (11, 'DubStep', NULL), - (12, 'Rap français', NULL), - (13, 'Classique', NULL), - (14, 'Rock', NULL), - (15, 'Electro', NULL), - (16, 'Celtique', NULL), - (17, 'Country', NULL), - (18, 'Variété Québéquoise', NULL), - (19, 'Médiéval', NULL), - (20, 'Variété Italienne', NULL), - (21, 'Comédie Musicale', NULL), - (22, 'Vianney', NULL), - (23, 'Bande Original', NULL), - (24, 'Bande Originale', NULL), - (25, 'Variété Belge', NULL), - (26, 'Gospel', NULL); - """); + addAction((final DataAccess da) -> { + final List data = List.of(// + new Gender(1L, "Variété française"), // + new Gender(2L, "Pop"), // + new Gender(3L, "inconnue"), // + new Gender(4L, "Disco"), // + new Gender(5L, "Enfants"), // + new Gender(6L, "Portugaise"), // + new Gender(7L, "Apprentissage"), // + new Gender(8L, "Blues"), // + new Gender(9L, "Jazz"), // + new Gender(10L, "Chanson Noël"), // + new Gender(11L, "DubStep"), // + new Gender(12L, "Rap français"), // + new Gender(13L, "Classique"), // + new Gender(14L, "Rock"), // + new Gender(15L, "Electro"), // + new Gender(16L, "Celtique"), // + new Gender(17L, "Country"), // + new Gender(18L, "Variété Québéquoise"), // + new Gender(19L, "Médiéval"), // + new Gender(20L, "Variété Italienne"), // + new Gender(21L, "Comédie Musicale"), // + new Gender(22L, "Vianney"), // + new Gender(23L, "Bande Original"), // + new Gender(24L, "Bande Originale"), // + new Gender(25L, "Variété Belge"), // + new Gender(26L, "Gospel")); + }); // set start increment element to permit to add after default elements addAction(""" ALTER TABLE `album` AUTO_INCREMENT = 1000; @@ -85,10 +85,10 @@ public class Initialization extends MigrationSqlStep { """, "mysql"); } - public static void dropAll() { + public static void dropAll(final DataAccess 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(); @@ -96,10 +96,10 @@ public class Initialization extends MigrationSqlStep { } } - public static void cleanAll() { + public static void cleanAll(final DataAccess 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/karusic/model/Album.java b/back/src/org/kar/karusic/model/Album.java index 963bf14..e67e6bf 100644 --- a/back/src/org/kar/karusic/model/Album.java +++ b/back/src/org/kar/karusic/model/Album.java @@ -12,11 +12,13 @@ import org.kar.archidata.model.GenericDataSoftDelete; import com.fasterxml.jackson.annotation.JsonInclude; +import dev.morphia.annotations.Entity; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.annotation.Nullable; import jakarta.persistence.Column; import jakarta.persistence.Table; +@Entity("Album") @Table(name = "album") @DataIfNotExists @JsonInclude(JsonInclude.Include.NON_NULL) diff --git a/back/src/org/kar/karusic/model/Artist.java b/back/src/org/kar/karusic/model/Artist.java index d9e733c..0e386b0 100644 --- a/back/src/org/kar/karusic/model/Artist.java +++ b/back/src/org/kar/karusic/model/Artist.java @@ -12,11 +12,13 @@ import org.kar.archidata.model.GenericDataSoftDelete; import com.fasterxml.jackson.annotation.JsonInclude; +import dev.morphia.annotations.Entity; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.annotation.Nullable; import jakarta.persistence.Column; import jakarta.persistence.Table; +@Entity("Artist") @Table(name = "artist") @DataIfNotExists @JsonInclude(JsonInclude.Include.NON_NULL) diff --git a/back/src/org/kar/karusic/model/Gender.java b/back/src/org/kar/karusic/model/Gender.java index 0fdd860..29efde4 100644 --- a/back/src/org/kar/karusic/model/Gender.java +++ b/back/src/org/kar/karusic/model/Gender.java @@ -23,11 +23,13 @@ import org.kar.archidata.model.GenericDataSoftDelete; import com.fasterxml.jackson.annotation.JsonInclude; +import dev.morphia.annotations.Entity; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.annotation.Nullable; import jakarta.persistence.Column; import jakarta.persistence.Table; +@Entity("Gender") @Table(name = "gender") @DataIfNotExists @JsonInclude(JsonInclude.Include.NON_NULL) @@ -47,4 +49,11 @@ public class Gender extends GenericDataSoftDelete { @Nullable public List covers = null; + public Gender() {} + + public Gender(final Long id, final String name) { + this.id = id; + this.name = name; + } + } diff --git a/back/src/org/kar/karusic/model/Playlist.java b/back/src/org/kar/karusic/model/Playlist.java index 990bc44..fdb43e6 100644 --- a/back/src/org/kar/karusic/model/Playlist.java +++ b/back/src/org/kar/karusic/model/Playlist.java @@ -23,6 +23,7 @@ import org.kar.archidata.model.GenericDataSoftDelete; import com.fasterxml.jackson.annotation.JsonInclude; +import dev.morphia.annotations.Entity; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.annotation.Nullable; import jakarta.persistence.Column; @@ -30,6 +31,7 @@ import jakarta.persistence.FetchType; import jakarta.persistence.ManyToMany; import jakarta.persistence.Table; +@Entity("Playlist") @Table(name = "playlist") @DataIfNotExists @JsonInclude(JsonInclude.Include.NON_NULL) diff --git a/back/src/org/kar/karusic/model/Track.java b/back/src/org/kar/karusic/model/Track.java index 1eba2e3..897946c 100644 --- a/back/src/org/kar/karusic/model/Track.java +++ b/back/src/org/kar/karusic/model/Track.java @@ -23,11 +23,13 @@ import org.kar.archidata.model.GenericDataSoftDelete; import com.fasterxml.jackson.annotation.JsonInclude; +import dev.morphia.annotations.Entity; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.annotation.Nullable; import jakarta.persistence.Column; import jakarta.persistence.Table; +@Entity("Track") @Table(name = "track") @DataIfNotExists @JsonInclude(JsonInclude.Include.NON_NULL) diff --git a/back/src/resources/simplelogger.properties b/back/src/resources/simplelogger.properties index 4314b58..7673899 100644 --- a/back/src/resources/simplelogger.properties +++ b/back/src/resources/simplelogger.properties @@ -3,12 +3,14 @@ # Default logging detail level for all instances of SimpleLogger. # Must be one of ("trace", "debug", "info", "warn", or "error"). # If not specified, defaults to "info". -org.slf4j.simpleLogger.defaultLogLevel=trace +org.slf4j.simpleLogger.defaultLogLevel=INFO # Logging detail level for a SimpleLogger instance named "xxxxx". # Must be one of ("trace", "debug", "info", "warn", or "error"). # If not specified, the default logging detail level is used. #org.slf4j.simpleLogger.log.xxxxx= +org.slf4j.simpleLogger.log.org.kar.archidata=TRACE +org.slf4j.simpleLogger.log.org.kar.karusic=TRACE # Set to true if you want the current date and time to be included in output messages. # Default is false, and will output the number of milliseconds elapsed since startup. diff --git a/back/test/src/test/kar/karusic/TestBase.java b/back/test/src/test/kar/karusic/TestBase.java index 5316eed..c5369ca 100644 --- a/back/test/src/test/kar/karusic/TestBase.java +++ b/back/test/src/test/kar/karusic/TestBase.java @@ -7,7 +7,6 @@ import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.MethodOrderer; import org.junit.jupiter.api.TestMethodOrder; import org.junit.jupiter.api.extension.ExtendWith; -import org.kar.archidata.db.DBEntry; import org.kar.archidata.tools.ConfigBaseVariable; import org.kar.archidata.tools.RESTApi; import org.kar.karusic.migration.Initialization; diff --git a/env_dev/docker-compose.yaml b/env_dev/docker-compose.yaml index 49351f6..8fa492d 100644 --- a/env_dev/docker-compose.yaml +++ b/env_dev/docker-compose.yaml @@ -27,19 +27,6 @@ services: volumes: - ./dataMongo:/data/db - mongo_express_service: - image: mongo-express - restart: always - ports: - - 8081:8081 - links: - - kar_mongodb_service:db - environment: - ME_CONFIG_MONGODB_ADMINUSERNAME: root - ME_CONFIG_MONGODB_ADMINPASSWORD: base_db_password - ME_CONFIG_MONGODB_URL: mongodb://root:base_db_password@db:27017/ - ME_CONFIG_BASICAUTH: false - kar_adminer_service: image: adminer:latest restart: always @@ -52,3 +39,17 @@ services: ports: - 4079:8080 mem_limit: 50m + + mongo_express_service: + image: mongo-express + restart: always + ports: + - 4077:8081 + links: + - kar_mongodb_service:db + environment: + ME_CONFIG_MONGODB_ADMINUSERNAME: root + ME_CONFIG_MONGODB_ADMINPASSWORD: base_db_password + ME_CONFIG_MONGODB_URL: mongodb://root:base_db_password@db:27017/ + ME_CONFIG_BASICAUTH: false + diff --git a/front/src/back-api/api/album-resource.ts b/front/src/back-api/api/album-resource.ts index 3cb986e..dcab053 100644 --- a/front/src/back-api/api/album-resource.ts +++ b/front/src/back-api/api/album-resource.ts @@ -192,30 +192,6 @@ export namespace AlbumResource { params, }, isAlbum); }; - /** - * Remove a Track on a specific album - */ - export function removeTrack({ - restConfig, - params, - }: { - restConfig: RESTConfig, - params: { - trackId: Long, - id: Long, - }, - }): Promise { - return RESTRequestJson({ - restModel: { - endPoint: "/album/{id}/track/{trackId}", - requestType: HTTPRequestModel.DELETE, - contentType: HTTPMimeType.TEXT_PLAIN, - accept: HTTPMimeType.JSON, - }, - restConfig, - params, - }, isAlbum); - }; /** * Add a cover on a specific album */