diff --git a/.gitignore b/.gitignore
index 5074d96..db764ec 100644
--- a/.gitignore
+++ b/.gitignore
@@ -39,8 +39,18 @@ build/
.DS_Store
### Application Specific ###
-application-local.properties
+config-local.properties
*.db
pipes/
*.log
/.idea/
+
+ Configuration files with sensitive credentials
+# These files contain database passwords and API keys and should never be committed
+src/main/resources/config.properties
+src/main/resources/application.properties
+
+# Allow example configuration files to be committed
+!src/main/resources/*.properties.example
+src/scripts/*
+local-repo/
\ No newline at end of file
diff --git a/README.md b/README.md
index baf75eb..56207a1 100644
--- a/README.md
+++ b/README.md
@@ -34,7 +34,7 @@ MediaManager-Core/
│ │ ├── util/ # Utility classes
│ │ └── MediaManagerApplication.java
│ └── resources/
-│ ├── application.properties # App configuration
+│ ├── config.properties # App configuration
│ ├── log4j2.xml # Logging configuration
│ └── META-INF/
│ └── persistence.xml # JPA configuration
@@ -55,7 +55,7 @@ GRANT ALL PRIVILEGES ON DATABASE mediamanager TO mediamanager;
### 2. Configuration
-Edit `src/main/resources/application.properties` and update the database credentials:
+Edit `src/main/resources/config.properties` and update the database credentials:
```properties
db.url=jdbc:postgresql://localhost:5432/mediamanager
@@ -90,7 +90,7 @@ The application creates named pipes for inter-process communication. Default con
- Pipe name: `mediamanager-pipe`
- Buffer size: 8192 bytes
-You can modify these settings in `application.properties`.
+You can modify these settings in `config.properties`.
## Logging
@@ -116,8 +116,8 @@ mvn test
## Dependencies
-- PostgreSQL Driver: 42.7.3
-- Hibernate ORM: 6.4.4.Final
+- PostgreSQL Driver: 42.7.5
+- Hibernate ORM: 7.1.7.Final
- HikariCP: 5.1.0
- Log4j 2: 2.23.1
- Jackson: 2.16.1
diff --git a/pom.xml b/pom.xml
index 9a87f4d..8846994 100644
--- a/pom.xml
+++ b/pom.xml
@@ -13,7 +13,7 @@
17
UTF-8
7.1.7.Final
- 42.7.5
+ 42.7.7
5.1.0
2.23.1
5.10.2
@@ -35,6 +35,12 @@
${hibernate.version}
+
+ org.hibernate.orm
+ hibernate-community-dialects
+ ${hibernate.version}
+
+
com.zaxxer
@@ -55,7 +61,7 @@
org.apache.logging.log4j
- log4j-slf4j2-impl
+ log4j-slf4j-impl
${log4j.version}
@@ -78,9 +84,32 @@
${junit.version}
test
+
+ com.google.protobuf
+ protobuf-java
+ 4.32.0
+
+
+ org.xerial
+ sqlite-jdbc
+ 3.44.1.0
+
+
+ org.reflections
+ reflections
+ 0.10.2
+
+
+
+ kr.motd.maven
+ os-maven-plugin
+ 1.7.1
+
+
+
org.apache.maven.plugins
@@ -91,11 +120,75 @@
17
+
org.apache.maven.plugins
maven-surefire-plugin
3.2.5
+
+
+
+ org.xolstice.maven.plugins
+ protobuf-maven-plugin
+ 0.6.1
+
+ /usr/bin/protoc
+ ${project.basedir}/src/main/proto
+ ${project.build.directory}/generated-sources/protobuf/java
+ false
+
+
+
+
+ compile
+
+
+
+
+
+
+
+ org.codehaus.mojo
+ build-helper-maven-plugin
+ 3.5.0
+
+
+ add-source
+ generate-sources
+
+ add-source
+
+
+
+ ${project.build.directory}/generated-sources/protobuf/java
+
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-shade-plugin
+ 3.5.1
+
+
+ package
+
+ shade
+
+
+
+
+ com.mediamanager.MediaManagerApplication
+
+
+
+
+
+
diff --git a/src/main/java/com/mediamanager/MediaManagerApplication.java b/src/main/java/com/mediamanager/MediaManagerApplication.java
index d3030da..22834fb 100644
--- a/src/main/java/com/mediamanager/MediaManagerApplication.java
+++ b/src/main/java/com/mediamanager/MediaManagerApplication.java
@@ -1,5 +1,8 @@
package com.mediamanager;
+import com.mediamanager.service.database.DatabaseManager;
+import com.mediamanager.service.delegate.DelegateActionManager;
+import com.mediamanager.service.ipc.IPCManager;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -7,9 +10,25 @@ import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
+import com.mediamanager.service.database.SqliteDatabaseManager;
+
public class MediaManagerApplication {
private static final Logger logger = LogManager.getLogger(MediaManagerApplication.class);
private static Properties config;
+ private static DatabaseManager databaseManager;
+ private static DelegateActionManager actionManager;
+ private static IPCManager ipcManager;
+
+ public enum ApplicationMode {
+ LOCAL("local"),
+ SERVER("server");
+
+ private final String value;
+
+ ApplicationMode(String value) {
+ this.value = value;
+ }
+ }
public static void main(String[] args) {
logger.info("Starting MediaManager Core Application...");
@@ -17,19 +36,85 @@ public class MediaManagerApplication {
try {
// Load configuration
loadConfiguration();
+ String runTypeString = config.getProperty("runtype","local");
+ ApplicationMode mode = null;
+
+ for (ApplicationMode am : ApplicationMode.values()) {
+ if (am.value.equalsIgnoreCase(runTypeString)) {
+ mode = am;
+ break;
+ }
+ }
+ if (mode == null) {
+ logger.error("Invalid run type: {}", runTypeString);
+ throw new Exception("Invalid run type: " + runTypeString);
+ }
+ logger.info("Run type: {}", mode);
+ switch (mode) {
+ case LOCAL:
+ logger.info("Starting local database...");
+ databaseManager = new SqliteDatabaseManager(config);
+ break;
+ case SERVER:
+ throw new Exception("Server mode not yet implemented");
+ default:
+ }
+ databaseManager.init();
+ actionManager = new DelegateActionManager(databaseManager.getEntityManagerFactory());
+ actionManager.start();
+ ipcManager = new IPCManager(config,actionManager);
+ ipcManager.init();
- // TODO: Initialize database connection
- // TODO: Initialize IPC server with named pipes
// TODO: Start application services
logger.info("MediaManager Core started successfully");
- logger.info("IPC Pipe: {}", config.getProperty("ipc.pipe.path") + "/" + config.getProperty("ipc.pipe.name"));
+ logger.info("IPC Socket: {}", ipcManager.getSocketPath().toAbsolutePath().toString());
// Keep application running
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
+
logger.info("Shutting down MediaManager Core...");
- // TODO: Cleanup resources
+
+
+ if (databaseManager != null) {
+ databaseManager.close();
+ }
+
+ if (ipcManager != null) {
+ try {
+ ipcManager.close();
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ if (actionManager != null) {
+ actionManager.stop();
+ }
+
+ logger.info("MediaManager Core shutdown successfully");
+ logger.info("Goodbye!");
+
+
+ // Give Log4j2 time to write all pending messages before shutting down
+ try {
+ Thread.sleep(1000);
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ }
+
+ // Now shutdown Log4j2
+ org.apache.logging.log4j.LogManager.shutdown();
}));
+ logger.info("Application is running");
+ logger.info("Press Ctrl+C to exit");
+ Thread.currentThread().join();
+
+ } catch (InterruptedException e) {
+
+ logger.info("Application interrupted, initiating shutdown...");
+
+ Thread.currentThread().interrupt();
} catch (Exception e) {
logger.error("Failed to start MediaManager Core", e);
@@ -39,10 +124,9 @@ public class MediaManagerApplication {
private static void loadConfiguration() throws IOException {
config = new Properties();
- try (InputStream input = MediaManagerApplication.class.getClassLoader()
- .getResourceAsStream("application.properties")) {
+ try (InputStream input = MediaManagerApplication.class.getClassLoader().getResourceAsStream("config.properties")) {
if (input == null) {
- throw new IOException("Unable to find application.properties");
+ throw new IOException("Unable to find config.properties");
}
config.load(input);
logger.info("Configuration loaded successfully");
@@ -52,4 +136,4 @@ public class MediaManagerApplication {
public static Properties getConfig() {
return config;
}
-}
+}
\ No newline at end of file
diff --git a/src/main/java/com/mediamanager/mapper/AlbumArtMapper.java b/src/main/java/com/mediamanager/mapper/AlbumArtMapper.java
new file mode 100644
index 0000000..1bdf834
--- /dev/null
+++ b/src/main/java/com/mediamanager/mapper/AlbumArtMapper.java
@@ -0,0 +1,35 @@
+package com.mediamanager.mapper;
+
+import com.mediamanager.model.AlbumArt;
+import com.mediamanager.protocol.messages.AlbumArtMessages;
+
+public class AlbumArtMapper {
+ public static AlbumArtMessages.AlbumArt toProtobuf(AlbumArt entity) {
+ if (entity == null) {
+ return null;
+ }
+ String filepath = entity.getFilepath();
+ if (filepath == null || filepath.isEmpty()) {
+ throw new IllegalArgumentException("Filepath cannot be null or empty");
+ }
+ AlbumArtMessages.AlbumArt.Builder builder = AlbumArtMessages.AlbumArt.newBuilder()
+ .setFilepath(filepath);
+ Integer id = entity.getId();
+ if (id != null) {
+ builder.setId(id);
+ }
+ return builder.build();
+ }
+
+ public static AlbumArt toEntity(AlbumArtMessages.AlbumArt protobuf) {
+ if (protobuf == null) {
+ return null;
+ }
+ AlbumArt entity = new AlbumArt();
+ if (protobuf.getId() >0) {
+ entity.setId(protobuf.getId());
+ }
+ entity.setFilepath(protobuf.getFilepath());
+ return entity;
+ }
+}
diff --git a/src/main/java/com/mediamanager/mapper/AlbumHasArtistMapper.java b/src/main/java/com/mediamanager/mapper/AlbumHasArtistMapper.java
new file mode 100644
index 0000000..58bf3ca
--- /dev/null
+++ b/src/main/java/com/mediamanager/mapper/AlbumHasArtistMapper.java
@@ -0,0 +1,47 @@
+package com.mediamanager.mapper;
+
+import com.mediamanager.model.AlbumHasArtist;
+import com.mediamanager.protocol.messages.AlbumHasArtistMessages;
+
+public class AlbumHasArtistMapper {
+ public static AlbumHasArtistMessages.AlbumHasArtist toProtobuf(AlbumHasArtist entity) {
+ if (entity == null) {
+ return null;
+ }
+
+ AlbumHasArtistMessages.AlbumHasArtist.Builder builder = AlbumHasArtistMessages.AlbumHasArtist.newBuilder();
+
+ Integer id = entity.getId();
+ if (id != null) {
+ builder.setId(id);
+ }
+
+ // Map Album foreign key
+ if (entity.getAlbum() != null && entity.getAlbum().getId() != null) {
+ builder.setFkAlbumId(entity.getAlbum().getId());
+ }
+
+ // Map Artist foreign key
+ if (entity.getArtist() != null && entity.getArtist().getId() != null) {
+ builder.setFkArtistId(entity.getArtist().getId());
+ }
+
+ return builder.build();
+ }
+
+ public static AlbumHasArtist toEntity(AlbumHasArtistMessages.AlbumHasArtist protobuf) {
+ if (protobuf == null) {
+ return null;
+ }
+
+ AlbumHasArtist entity = new AlbumHasArtist();
+
+ if (protobuf.getId() > 0) {
+ entity.setId(protobuf.getId());
+ }
+
+ // Note: Foreign key relationships (Album, Artist) are handled in the service layer
+
+ return entity;
+ }
+}
diff --git a/src/main/java/com/mediamanager/mapper/AlbumHasGenreMapper.java b/src/main/java/com/mediamanager/mapper/AlbumHasGenreMapper.java
new file mode 100644
index 0000000..43c34f3
--- /dev/null
+++ b/src/main/java/com/mediamanager/mapper/AlbumHasGenreMapper.java
@@ -0,0 +1,47 @@
+package com.mediamanager.mapper;
+
+import com.mediamanager.model.AlbumHasGenre;
+import com.mediamanager.protocol.messages.AlbumHasGenreMessages;
+
+public class AlbumHasGenreMapper {
+ public static AlbumHasGenreMessages.AlbumHasGenre toProtobuf(AlbumHasGenre entity) {
+ if (entity == null) {
+ return null;
+ }
+
+ AlbumHasGenreMessages.AlbumHasGenre.Builder builder = AlbumHasGenreMessages.AlbumHasGenre.newBuilder();
+
+ Integer id = entity.getId();
+ if (id != null) {
+ builder.setId(id);
+ }
+
+ // Map Album foreign key
+ if (entity.getAlbum() != null && entity.getAlbum().getId() != null) {
+ builder.setFkAlbumId(entity.getAlbum().getId());
+ }
+
+ // Map Genre foreign key
+ if (entity.getGenre() != null && entity.getGenre().getId() != null) {
+ builder.setFkGenreId(entity.getGenre().getId());
+ }
+
+ return builder.build();
+ }
+
+ public static AlbumHasGenre toEntity(AlbumHasGenreMessages.AlbumHasGenre protobuf) {
+ if (protobuf == null) {
+ return null;
+ }
+
+ AlbumHasGenre entity = new AlbumHasGenre();
+
+ if (protobuf.getId() > 0) {
+ entity.setId(protobuf.getId());
+ }
+
+ // Note: Foreign key relationships (Album, Genre) are handled in the service layer
+
+ return entity;
+ }
+}
diff --git a/src/main/java/com/mediamanager/mapper/AlbumMapper.java b/src/main/java/com/mediamanager/mapper/AlbumMapper.java
new file mode 100644
index 0000000..57ff6bd
--- /dev/null
+++ b/src/main/java/com/mediamanager/mapper/AlbumMapper.java
@@ -0,0 +1,110 @@
+package com.mediamanager.mapper;
+
+import com.mediamanager.model.Album;
+import com.mediamanager.protocol.messages.AlbumMessages;
+
+import java.time.Instant;
+import java.time.ZoneId;
+
+public class AlbumMapper {
+ public static AlbumMessages.Album toProtobuf(Album entity) {
+ if (entity == null) {
+ return null;
+ }
+
+ String name = entity.getName();
+ if (name == null || name.isEmpty()) {
+ throw new IllegalArgumentException("Name cannot be null or empty");
+ }
+
+ AlbumMessages.Album.Builder builder = AlbumMessages.Album.newBuilder()
+ .setName(name);
+
+ Integer id = entity.getId();
+ if (id != null) {
+ builder.setId(id);
+ }
+
+ Integer year = entity.getYear();
+ if (year != null) {
+ builder.setYear(year);
+ }
+
+ Integer numberOfDiscs = entity.getNumberOfDiscs();
+ if (numberOfDiscs != null) {
+ builder.setNumberOfDiscs(numberOfDiscs);
+ }
+
+ String code = entity.getCode();
+ if (code != null) {
+ builder.setCode(code);
+ }
+
+ Boolean isCompilation = entity.getIsCompilation();
+ if (isCompilation != null) {
+ builder.setIsCompilation(isCompilation);
+ }
+
+ // Map AlbumType foreign key
+ if (entity.getAlbumType() != null && entity.getAlbumType().getId() != null) {
+ builder.setFkAlbumtypeId(entity.getAlbumType().getId());
+ }
+
+ // Map AlbumArt foreign key
+ if (entity.getAlbumArt() != null && entity.getAlbumArt().getId() != null) {
+ builder.setFkAlbumartId(entity.getAlbumArt().getId());
+ }
+
+ // Map timestamps
+ if (entity.getCreatedAt() != null) {
+ long createdAtEpoch = entity.getCreatedAt()
+ .atZone(ZoneId.systemDefault())
+ .toInstant()
+ .toEpochMilli();
+ builder.setCreatedAt(createdAtEpoch);
+ }
+
+ if (entity.getUpdatedAt() != null) {
+ long updatedAtEpoch = entity.getUpdatedAt()
+ .atZone(ZoneId.systemDefault())
+ .toInstant()
+ .toEpochMilli();
+ builder.setUpdatedAt(updatedAtEpoch);
+ }
+
+ return builder.build();
+ }
+
+ public static Album toEntity(AlbumMessages.Album protobuf) {
+ if (protobuf == null) {
+ return null;
+ }
+
+ Album entity = new Album();
+
+ if (protobuf.getId() > 0) {
+ entity.setId(protobuf.getId());
+ }
+
+ entity.setName(protobuf.getName());
+
+ if (protobuf.getYear() > 0) {
+ entity.setYear(protobuf.getYear());
+ }
+
+ if (protobuf.getNumberOfDiscs() > 0) {
+ entity.setNumberOfDiscs(protobuf.getNumberOfDiscs());
+ }
+
+ if (!protobuf.getCode().isEmpty()) {
+ entity.setCode(protobuf.getCode());
+ }
+
+ entity.setIsCompilation(protobuf.getIsCompilation());
+
+ // Note: Foreign key relationships (AlbumType, AlbumArt) are handled in the service layer
+ // Timestamps are managed by JPA @PrePersist and @PreUpdate
+
+ return entity;
+ }
+}
diff --git a/src/main/java/com/mediamanager/mapper/AlbumTypeMapper.java b/src/main/java/com/mediamanager/mapper/AlbumTypeMapper.java
new file mode 100644
index 0000000..2bdfbe1
--- /dev/null
+++ b/src/main/java/com/mediamanager/mapper/AlbumTypeMapper.java
@@ -0,0 +1,35 @@
+package com.mediamanager.mapper;
+
+import com.mediamanager.model.AlbumType;
+import com.mediamanager.protocol.messages.AlbumTypeMessages;
+
+public class AlbumTypeMapper {
+ public static AlbumTypeMessages.AlbumType toProtobuf(AlbumType entity) {
+ if (entity == null) {
+ return null;
+ }
+ String value = entity.getValue();
+ if (value == null || value.isEmpty()) {
+ throw new IllegalArgumentException("Value cannot be null or empty");
+ }
+ AlbumTypeMessages.AlbumType.Builder builder = AlbumTypeMessages.AlbumType.newBuilder()
+ .setValue(value);
+ Integer id = entity.getId();
+ if (id != null) {
+ builder.setId(id);
+ }
+ return builder.build();
+ }
+
+ public static AlbumType toEntity(AlbumTypeMessages.AlbumType protobuf) {
+ if (protobuf == null) {
+ return null;
+ }
+ AlbumType entity = new AlbumType();
+ if (protobuf.getId() >0) {
+ entity.setId(protobuf.getId());
+ }
+ entity.setValue(protobuf.getValue());
+ return entity;
+ }
+}
diff --git a/src/main/java/com/mediamanager/mapper/ArtistMapper.java b/src/main/java/com/mediamanager/mapper/ArtistMapper.java
new file mode 100644
index 0000000..29f2ce9
--- /dev/null
+++ b/src/main/java/com/mediamanager/mapper/ArtistMapper.java
@@ -0,0 +1,41 @@
+package com.mediamanager.mapper;
+
+import com.mediamanager.model.Artist;
+import com.mediamanager.protocol.messages.ArtistMessages;
+
+
+public class ArtistMapper {
+ public static ArtistMessages.Artist toProtobuf(Artist entity){
+ if (entity == null) {
+ return null;
+ }
+
+ String name = entity.getName();
+ if (name == null) {
+ throw new IllegalArgumentException("Artist name cannot be null");
+ }
+
+ ArtistMessages.Artist.Builder builder = ArtistMessages.Artist.newBuilder()
+ .setName(name);
+
+ // Only set ID when it's present and valid (> 0). Avoids NPE for null IDs.
+ Integer id = entity.getId();
+ if (id != null && id > 0) {
+ builder.setId(id);
+ }
+
+ return builder.build();
+ }
+ public static Artist toEntity(ArtistMessages.Artist protobuf) {
+ if (protobuf == null) {
+ return null;
+ }
+ Artist entity = new Artist();
+
+ if (protobuf.getId() > 0) {
+ entity.setId(protobuf.getId());
+ }
+ entity.setName(protobuf.getName());
+ return entity;
+ }
+}
diff --git a/src/main/java/com/mediamanager/mapper/BitDepthMapper.java b/src/main/java/com/mediamanager/mapper/BitDepthMapper.java
new file mode 100644
index 0000000..873629c
--- /dev/null
+++ b/src/main/java/com/mediamanager/mapper/BitDepthMapper.java
@@ -0,0 +1,39 @@
+package com.mediamanager.mapper;
+
+import com.mediamanager.model.BitDepth;
+import com.mediamanager.protocol.messages.BitDepthMessages;
+
+public class BitDepthMapper {
+ public static BitDepthMessages.BitDepth toProtobuf(BitDepth entity) {
+ if (entity == null){
+ return null;
+ }
+
+ String value = entity.getValue();
+ if (value == null) {
+ throw new IllegalArgumentException("Bit depth value cannot be null");
+ }
+ BitDepthMessages.BitDepth.Builder builder = BitDepthMessages.BitDepth.newBuilder()
+ .setValue(value);
+
+ Integer id = entity.getId();
+ if (id != null && id > 0) {
+ builder.setId(id);
+ }
+
+ return builder.build();
+ }
+
+ public static BitDepth toEntity(BitDepthMessages.BitDepth protobuf) {
+ if (protobuf == null) {
+ return null;
+ }
+ BitDepth entity = new BitDepth();
+
+ if (protobuf.getId() > 0) {
+ entity.setId(protobuf.getId());
+ }
+ entity.setValue(protobuf.getValue());
+ return entity;
+ }
+}
diff --git a/src/main/java/com/mediamanager/mapper/BitRateMapper.java b/src/main/java/com/mediamanager/mapper/BitRateMapper.java
new file mode 100644
index 0000000..b6e5c5c
--- /dev/null
+++ b/src/main/java/com/mediamanager/mapper/BitRateMapper.java
@@ -0,0 +1,39 @@
+package com.mediamanager.mapper;
+
+import com.mediamanager.model.BitRate;
+import com.mediamanager.protocol.messages.BitRateMessages;
+
+public class BitRateMapper {
+ public static BitRateMessages.BitRate toProtobuf(BitRate entity) {
+ if (entity == null) {
+ return null;
+ }
+
+ String value = entity.getValue();
+ if (value == null) {
+ throw new IllegalArgumentException("Bit rate value cannot be null");
+ }
+
+ BitRateMessages.BitRate.Builder builder = BitRateMessages.BitRate.newBuilder()
+ .setValue(value);
+
+ Integer id = entity.getId();
+ if (id != null && id > 0) {
+ builder.setId(id);
+ }
+ return builder.build();
+ }
+
+ public static BitRate toEntity(BitRateMessages.BitRate protobuf) {
+ if (protobuf == null) {
+ return null;
+ }
+ BitRate entity = new BitRate();
+
+ if (protobuf.getId() > 0) {
+ entity.setId(protobuf.getId());
+ }
+ entity.setValue(protobuf.getValue());
+ return entity;
+ }
+}
diff --git a/src/main/java/com/mediamanager/mapper/ComposerMapper.java b/src/main/java/com/mediamanager/mapper/ComposerMapper.java
new file mode 100644
index 0000000..cf783b5
--- /dev/null
+++ b/src/main/java/com/mediamanager/mapper/ComposerMapper.java
@@ -0,0 +1,38 @@
+package com.mediamanager.mapper;
+
+import com.mediamanager.model.Composer;
+import com.mediamanager.protocol.messages.ComposerMessages;
+
+public class ComposerMapper {
+ public static ComposerMessages.Composer toProtobuf(Composer entity) {
+ if (entity == null) {
+ return null;
+ }
+ ComposerMessages.Composer.Builder builder = ComposerMessages.Composer.newBuilder()
+ .setName(entity.getName());
+
+ Integer id = entity.getId();
+ if (id != null && id > 0) {
+ builder.setId(id);
+ }
+
+ return builder.build();
+
+ }
+
+ public static Composer toEntity(ComposerMessages.Composer protobuf) {
+ if (protobuf == null) {
+ return null;
+ }
+
+ Composer entity = new Composer();
+
+ if (protobuf.getId() > 0) {
+ entity.setId(protobuf.getId());
+ }
+
+ entity.setName(protobuf.getName());
+
+ return entity;
+ }
+}
diff --git a/src/main/java/com/mediamanager/mapper/DiscMapper.java b/src/main/java/com/mediamanager/mapper/DiscMapper.java
new file mode 100644
index 0000000..6ee867f
--- /dev/null
+++ b/src/main/java/com/mediamanager/mapper/DiscMapper.java
@@ -0,0 +1,50 @@
+package com.mediamanager.mapper;
+
+import com.mediamanager.model.Disc;
+import com.mediamanager.protocol.messages.DiscMessages;
+
+public class DiscMapper {
+ public static DiscMessages.Disc toProtobuf(Disc entity) {
+ if (entity == null) {
+ return null;
+ }
+
+ Integer discNumber = entity.getDiscNumber();
+ if (discNumber == null) {
+ throw new IllegalArgumentException("Disc number cannot be null");
+ }
+
+ DiscMessages.Disc.Builder builder = DiscMessages.Disc.newBuilder()
+ .setDiscNumber(discNumber);
+
+ Integer id = entity.getId();
+ if (id != null) {
+ builder.setId(id);
+ }
+
+ // Map Album foreign key
+ if (entity.getAlbum() != null && entity.getAlbum().getId() != null) {
+ builder.setFkAlbumId(entity.getAlbum().getId());
+ }
+
+ return builder.build();
+ }
+
+ public static Disc toEntity(DiscMessages.Disc protobuf) {
+ if (protobuf == null) {
+ return null;
+ }
+
+ Disc entity = new Disc();
+
+ if (protobuf.getId() > 0) {
+ entity.setId(protobuf.getId());
+ }
+
+ entity.setDiscNumber(protobuf.getDiscNumber());
+
+ // Note: Foreign key relationship (Album) is handled in the service layer
+
+ return entity;
+ }
+}
diff --git a/src/main/java/com/mediamanager/mapper/GenreMapper.java b/src/main/java/com/mediamanager/mapper/GenreMapper.java
new file mode 100644
index 0000000..331e67c
--- /dev/null
+++ b/src/main/java/com/mediamanager/mapper/GenreMapper.java
@@ -0,0 +1,40 @@
+package com.mediamanager.mapper;
+
+import com.mediamanager.model.Genre;
+import com.mediamanager.protocol.messages.GenreMessages;
+
+public class GenreMapper {
+ public static GenreMessages.Genre toProtobuf(Genre entity) {
+ if (entity == null) {
+ return null;
+ }
+
+ GenreMessages.Genre.Builder builder = GenreMessages.Genre.newBuilder()
+ .setName(entity.getName());
+
+ // Only set ID when it's present and valid (> 0). Avoids NPE for null IDs.
+ Integer id = entity.getId();
+ if (id != null && id > 0) {
+ builder.setId(id);
+ }
+
+ return builder.build();
+ }
+ public static Genre toEntity(GenreMessages.Genre protobuf) {
+ if (protobuf == null) {
+ return null;
+ }
+
+ Genre entity = new Genre();
+
+ // Só seta ID se for > 0 (protobuf default é 0)
+ if (protobuf.getId() > 0) {
+ entity.setId(protobuf.getId());
+ }
+
+ entity.setName(protobuf.getName());
+
+ return entity;
+ }
+}
+
diff --git a/src/main/java/com/mediamanager/mapper/SamplingRateMapper.java b/src/main/java/com/mediamanager/mapper/SamplingRateMapper.java
new file mode 100644
index 0000000..d1701cd
--- /dev/null
+++ b/src/main/java/com/mediamanager/mapper/SamplingRateMapper.java
@@ -0,0 +1,35 @@
+package com.mediamanager.mapper;
+
+import com.mediamanager.model.SamplingRate;
+import com.mediamanager.protocol.messages.SamplingRateMessages;
+
+public class SamplingRateMapper {
+ public static SamplingRateMessages.SamplingRate toProtobuf(SamplingRate entity) {
+ if (entity == null) {
+ return null;
+ }
+ String value = entity.getValue();
+ if (value == null || value.isEmpty()) {
+ throw new IllegalArgumentException("Value cannot be null or empty");
+ }
+ SamplingRateMessages.SamplingRate.Builder builder = SamplingRateMessages.SamplingRate.newBuilder()
+ .setValue(value);
+ Integer id = entity.getId();
+ if (id != null) {
+ builder.setId(id);
+ }
+ return builder.build();
+ }
+
+ public static SamplingRate toEntity(SamplingRateMessages.SamplingRate protobuf) {
+ if (protobuf == null) {
+ return null;
+ }
+ SamplingRate entity = new SamplingRate();
+ if (protobuf.getId() >0) {
+ entity.setId(protobuf.getId());
+ }
+ entity.setValue(protobuf.getValue());
+ return entity;
+ }
+}
diff --git a/src/main/java/com/mediamanager/mapper/TrackHasArtistMapper.java b/src/main/java/com/mediamanager/mapper/TrackHasArtistMapper.java
new file mode 100644
index 0000000..f8a0d20
--- /dev/null
+++ b/src/main/java/com/mediamanager/mapper/TrackHasArtistMapper.java
@@ -0,0 +1,47 @@
+package com.mediamanager.mapper;
+
+import com.mediamanager.model.TrackHasArtist;
+import com.mediamanager.protocol.messages.TrackHasArtistMessages;
+
+public class TrackHasArtistMapper {
+ public static TrackHasArtistMessages.TrackHasArtist toProtobuf(TrackHasArtist entity) {
+ if (entity == null) {
+ return null;
+ }
+
+ TrackHasArtistMessages.TrackHasArtist.Builder builder = TrackHasArtistMessages.TrackHasArtist.newBuilder();
+
+ Integer id = entity.getId();
+ if (id != null) {
+ builder.setId(id);
+ }
+
+ // Map Track foreign key
+ if (entity.getTrack() != null && entity.getTrack().getId() != null) {
+ builder.setFkTrackId(entity.getTrack().getId());
+ }
+
+ // Map Artist foreign key
+ if (entity.getArtist() != null && entity.getArtist().getId() != null) {
+ builder.setFkArtistId(entity.getArtist().getId());
+ }
+
+ return builder.build();
+ }
+
+ public static TrackHasArtist toEntity(TrackHasArtistMessages.TrackHasArtist protobuf) {
+ if (protobuf == null) {
+ return null;
+ }
+
+ TrackHasArtist entity = new TrackHasArtist();
+
+ if (protobuf.getId() > 0) {
+ entity.setId(protobuf.getId());
+ }
+
+ // Note: Foreign key relationships (Track, Artist) are handled in the service layer
+
+ return entity;
+ }
+}
diff --git a/src/main/java/com/mediamanager/mapper/TrackHasComposerMapper.java b/src/main/java/com/mediamanager/mapper/TrackHasComposerMapper.java
new file mode 100644
index 0000000..c722faa
--- /dev/null
+++ b/src/main/java/com/mediamanager/mapper/TrackHasComposerMapper.java
@@ -0,0 +1,47 @@
+package com.mediamanager.mapper;
+
+import com.mediamanager.model.TrackHasComposer;
+import com.mediamanager.protocol.messages.TrackHasComposerMessages;
+
+public class TrackHasComposerMapper {
+ public static TrackHasComposerMessages.TrackHasComposer toProtobuf(TrackHasComposer entity) {
+ if (entity == null) {
+ return null;
+ }
+
+ TrackHasComposerMessages.TrackHasComposer.Builder builder = TrackHasComposerMessages.TrackHasComposer.newBuilder();
+
+ Integer id = entity.getId();
+ if (id != null) {
+ builder.setId(id);
+ }
+
+ // Map Track foreign key
+ if (entity.getTrack() != null && entity.getTrack().getId() != null) {
+ builder.setFkTrackId(entity.getTrack().getId());
+ }
+
+ // Map Composer foreign key
+ if (entity.getComposer() != null && entity.getComposer().getId() != null) {
+ builder.setFkComposerId(entity.getComposer().getId());
+ }
+
+ return builder.build();
+ }
+
+ public static TrackHasComposer toEntity(TrackHasComposerMessages.TrackHasComposer protobuf) {
+ if (protobuf == null) {
+ return null;
+ }
+
+ TrackHasComposer entity = new TrackHasComposer();
+
+ if (protobuf.getId() > 0) {
+ entity.setId(protobuf.getId());
+ }
+
+ // Note: Foreign key relationships (Track, Composer) are handled in the service layer
+
+ return entity;
+ }
+}
diff --git a/src/main/java/com/mediamanager/mapper/TrackHasGenreMapper.java b/src/main/java/com/mediamanager/mapper/TrackHasGenreMapper.java
new file mode 100644
index 0000000..e3e6968
--- /dev/null
+++ b/src/main/java/com/mediamanager/mapper/TrackHasGenreMapper.java
@@ -0,0 +1,47 @@
+package com.mediamanager.mapper;
+
+import com.mediamanager.model.TrackHasGenre;
+import com.mediamanager.protocol.messages.TrackHasGenreMessages;
+
+public class TrackHasGenreMapper {
+ public static TrackHasGenreMessages.TrackHasGenre toProtobuf(TrackHasGenre entity) {
+ if (entity == null) {
+ return null;
+ }
+
+ TrackHasGenreMessages.TrackHasGenre.Builder builder = TrackHasGenreMessages.TrackHasGenre.newBuilder();
+
+ Integer id = entity.getId();
+ if (id != null) {
+ builder.setId(id);
+ }
+
+ // Map Track foreign key
+ if (entity.getTrack() != null && entity.getTrack().getId() != null) {
+ builder.setFkTrackId(entity.getTrack().getId());
+ }
+
+ // Map Genre foreign key
+ if (entity.getGenre() != null && entity.getGenre().getId() != null) {
+ builder.setFkGenreId(entity.getGenre().getId());
+ }
+
+ return builder.build();
+ }
+
+ public static TrackHasGenre toEntity(TrackHasGenreMessages.TrackHasGenre protobuf) {
+ if (protobuf == null) {
+ return null;
+ }
+
+ TrackHasGenre entity = new TrackHasGenre();
+
+ if (protobuf.getId() > 0) {
+ entity.setId(protobuf.getId());
+ }
+
+ // Note: Foreign key relationships (Track, Genre) are handled in the service layer
+
+ return entity;
+ }
+}
diff --git a/src/main/java/com/mediamanager/mapper/TrackMapper.java b/src/main/java/com/mediamanager/mapper/TrackMapper.java
new file mode 100644
index 0000000..0c6742a
--- /dev/null
+++ b/src/main/java/com/mediamanager/mapper/TrackMapper.java
@@ -0,0 +1,95 @@
+package com.mediamanager.mapper;
+
+import com.mediamanager.model.Track;
+import com.mediamanager.protocol.messages.TrackMessages;
+
+public class TrackMapper {
+ public static TrackMessages.Track toProtobuf(Track entity) {
+ if (entity == null) {
+ return null;
+ }
+
+ Integer trackNumber = entity.getTrackNumber();
+ if (trackNumber == null) {
+ throw new IllegalArgumentException("Track number cannot be null");
+ }
+
+ String title = entity.getTitle();
+ if (title == null) {
+ throw new IllegalArgumentException("Title cannot be null");
+ }
+
+ String filepath = entity.getFilepath();
+ if (filepath == null) {
+ throw new IllegalArgumentException("Filepath cannot be null");
+ }
+
+ TrackMessages.Track.Builder builder = TrackMessages.Track.newBuilder()
+ .setTrackNumber(trackNumber)
+ .setTitle(title)
+ .setFilepath(filepath);
+
+ Integer id = entity.getId();
+ if (id != null) {
+ builder.setId(id);
+ }
+
+ // Map duration (optional)
+ Integer duration = entity.getDuration();
+ if (duration != null) {
+ builder.setDuration(duration);
+ }
+
+ // Map Disc foreign key (required)
+ if (entity.getDisc() != null && entity.getDisc().getId() != null) {
+ builder.setFkDiscId(entity.getDisc().getId());
+ }
+
+ // Map Composer foreign key (optional)
+ if (entity.getComposer() != null && entity.getComposer().getId() != null) {
+ builder.setFkComposerId(entity.getComposer().getId());
+ }
+
+ // Map BitDepth foreign key (optional)
+ if (entity.getBitDepth() != null && entity.getBitDepth().getId() != null) {
+ builder.setFkBitdepthId(entity.getBitDepth().getId());
+ }
+
+ // Map BitRate foreign key (optional)
+ if (entity.getBitRate() != null && entity.getBitRate().getId() != null) {
+ builder.setFkBitrateId(entity.getBitRate().getId());
+ }
+
+ // Map SamplingRate foreign key (optional)
+ if (entity.getSamplingRate() != null && entity.getSamplingRate().getId() != null) {
+ builder.setFkSamplingrateId(entity.getSamplingRate().getId());
+ }
+
+ return builder.build();
+ }
+
+ public static Track toEntity(TrackMessages.Track protobuf) {
+ if (protobuf == null) {
+ return null;
+ }
+
+ Track entity = new Track();
+
+ if (protobuf.getId() > 0) {
+ entity.setId(protobuf.getId());
+ }
+
+ entity.setTrackNumber(protobuf.getTrackNumber());
+ entity.setTitle(protobuf.getTitle());
+ entity.setFilepath(protobuf.getFilepath());
+
+ if (protobuf.getDuration() > 0) {
+ entity.setDuration(protobuf.getDuration());
+ }
+
+ // Note: Foreign key relationships (Disc, Composer, BitDepth, BitRate, SamplingRate)
+ // are handled in the service layer
+
+ return entity;
+ }
+}
diff --git a/src/main/java/com/mediamanager/model/Album.java b/src/main/java/com/mediamanager/model/Album.java
new file mode 100644
index 0000000..ca4bab5
--- /dev/null
+++ b/src/main/java/com/mediamanager/model/Album.java
@@ -0,0 +1,229 @@
+package com.mediamanager.model;
+
+import jakarta.persistence.*;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Entity
+@Table(name = "album")
+public class Album {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Integer id;
+
+ @Column(nullable = false)
+ private String name;
+
+ @Column
+ private Integer year;
+
+ @Column(name = "number_of_discs")
+ private Integer numberOfDiscs;
+
+ @Column
+ private String code;
+
+ @Column(name = "is_compilation")
+ private Boolean isCompilation;
+
+ @ManyToOne(fetch = FetchType.LAZY)
+ @JoinColumn(name = "fk_albumtype_id")
+ private AlbumType albumType;
+
+ @ManyToOne(fetch = FetchType.LAZY)
+ @JoinColumn(name = "fk_albumart_id")
+ private AlbumArt albumArt;
+
+ // Relacionamento ManyToMany com Artist através da tabela de junção
+ @OneToMany(mappedBy = "album", cascade = CascadeType.ALL, orphanRemoval = true)
+ private List albumArtists = new ArrayList<>();
+
+ // Relacionamento ManyToMany com Genre através da tabela de junção
+ @OneToMany(mappedBy = "album", cascade = CascadeType.ALL, orphanRemoval = true)
+ private List albumGenres = new ArrayList<>(); // ← ADICIONE ESSA LINHA
+
+ @Column(name = "created_at", nullable = false, updatable = false)
+ private LocalDateTime createdAt;
+
+ @Column(name = "updated_at")
+ private LocalDateTime updatedAt;
+
+ @PrePersist
+ protected void onCreate() {
+ this.createdAt = LocalDateTime.now();
+ this.updatedAt = LocalDateTime.now();
+ }
+
+ @PreUpdate
+ protected void onUpdate() {
+ this.updatedAt = LocalDateTime.now();
+ }
+
+ public Album() {}
+
+ // Métodos helper para Artist (ManyToMany)
+ public void addArtist(Artist artist) {
+ AlbumHasArtist albumHasArtist = new AlbumHasArtist();
+ albumHasArtist.setAlbum(this);
+ albumHasArtist.setArtist(artist);
+ albumArtists.add(albumHasArtist);
+ }
+
+ public void removeArtist(Artist artist) {
+ albumArtists.removeIf(aa ->
+ aa.getArtist() != null &&
+ aa.getArtist().getId() != null &&
+ aa.getArtist().getId().equals(artist.getId())
+ );
+ }
+
+ // Método conveniente para pegar só os artistas
+ public List getArtists() {
+ return albumArtists.stream()
+ .map(AlbumHasArtist::getArtist)
+ .collect(Collectors.toList());
+ }
+
+ // ========== ADICIONE ESSES MÉTODOS PARA GENRE ==========
+
+ // Métodos helper para Genre (ManyToMany)
+ public void addGenre(Genre genre) {
+ AlbumHasGenre albumHasGenre = new AlbumHasGenre();
+ albumHasGenre.setAlbum(this);
+ albumHasGenre.setGenre(genre);
+ albumGenres.add(albumHasGenre);
+ }
+
+ public void removeGenre(Genre genre) {
+ if (genre == null) {
+ return;
+ }
+ albumGenres.removeIf(ag ->
+ ag.getGenre() != null &&
+ ag.getGenre().getId() != null &&
+ ag.getGenre().getId().equals(genre.getId())
+ );
+ }
+
+ // Método conveniente para pegar só os gêneros
+ public List getGenres() {
+ return albumGenres.stream()
+ .map(AlbumHasGenre::getGenre)
+ .collect(Collectors.toList());
+ }
+
+ // ========== FIM DOS MÉTODOS DE GENRE ==========
+
+ // Getters and Setters
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public Integer getYear() {
+ return year;
+ }
+
+ public void setYear(Integer year) {
+ this.year = year;
+ }
+
+ public Integer getNumberOfDiscs() {
+ return numberOfDiscs;
+ }
+
+ public void setNumberOfDiscs(Integer numberOfDiscs) {
+ this.numberOfDiscs = numberOfDiscs;
+ }
+
+ public String getCode() {
+ return code;
+ }
+
+ public void setCode(String code) {
+ this.code = code;
+ }
+
+ public Boolean getIsCompilation() {
+ return isCompilation;
+ }
+
+ public void setIsCompilation(Boolean isCompilation) {
+ this.isCompilation = isCompilation;
+ }
+
+ public AlbumType getAlbumType() {
+ return albumType;
+ }
+
+ public void setAlbumType(AlbumType albumType) {
+ this.albumType = albumType;
+ }
+
+ public AlbumArt getAlbumArt() {
+ return albumArt;
+ }
+
+ public void setAlbumArt(AlbumArt albumArt) {
+ this.albumArt = albumArt;
+ }
+
+ public List getAlbumArtists() {
+ return albumArtists;
+ }
+
+ public void setAlbumArtists(List albumArtists) {
+ this.albumArtists = albumArtists;
+ }
+
+ // ========== ADICIONE ESSES GETTERS/SETTERS ==========
+
+ public List getAlbumGenres() {
+ return albumGenres;
+ }
+
+ public void setAlbumGenres(List albumGenres) {
+ this.albumGenres = albumGenres;
+ }
+
+ // ========== FIM DOS GETTERS/SETTERS DE GENRE ==========
+
+ public LocalDateTime getCreatedAt() {
+ return createdAt;
+ }
+
+ public void setCreatedAt(LocalDateTime createdAt) {
+ this.createdAt = createdAt;
+ }
+
+ public LocalDateTime getUpdatedAt() {
+ return updatedAt;
+ }
+
+ public void setUpdatedAt(LocalDateTime updatedAt) {
+ this.updatedAt = updatedAt;
+ }
+
+ @Override
+ public String toString() {
+ return "Album{" +
+ "id=" + id +
+ ", name='" + name + '\'' +
+ ", year=" + year +
+ '}';
+ }
+}
diff --git a/src/main/java/com/mediamanager/model/AlbumArt.java b/src/main/java/com/mediamanager/model/AlbumArt.java
new file mode 100644
index 0000000..10bc72a
--- /dev/null
+++ b/src/main/java/com/mediamanager/model/AlbumArt.java
@@ -0,0 +1,33 @@
+package com.mediamanager.model;
+
+
+import jakarta.persistence.*;
+
+@Entity
+@Table(name = "albumArt")
+public class AlbumArt {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Integer id;
+
+ @Column(nullable = false)
+ private String filepath;
+
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getFilepath() {
+ return filepath;
+ }
+
+ public void setFilepath(String filepath) {
+ this.filepath = filepath;
+ }
+}
diff --git a/src/main/java/com/mediamanager/model/AlbumHasArtist.java b/src/main/java/com/mediamanager/model/AlbumHasArtist.java
new file mode 100644
index 0000000..aa04587
--- /dev/null
+++ b/src/main/java/com/mediamanager/model/AlbumHasArtist.java
@@ -0,0 +1,56 @@
+package com.mediamanager.model;
+
+import jakarta.persistence.*;
+
+@Entity
+@Table(name = "albumshasartist")
+public class AlbumHasArtist {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Integer id;
+
+ @ManyToOne(fetch = FetchType.LAZY)
+ @JoinColumn(name = "fk_album_id", nullable = false)
+ private Album album;
+
+ @ManyToOne(fetch = FetchType.LAZY)
+ @JoinColumn(name = "fk_artist_id", nullable = false)
+ private Artist artist;
+
+ public AlbumHasArtist() {}
+
+ // Getters and Setters
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public Album getAlbum() {
+ return album;
+ }
+
+ public void setAlbum(Album album) {
+ this.album = album;
+ }
+
+ public Artist getArtist() {
+ return artist;
+ }
+
+ public void setArtist(Artist artist) {
+ this.artist = artist;
+ }
+
+ @Override
+ public String toString() {
+ return "AlbumHasArtist{" +
+ "id=" + id +
+ ", albumId=" + (album != null ? album.getId() : null) +
+ ", artistId=" + (artist != null ? artist.getId() : null) +
+ '}';
+ }
+}
diff --git a/src/main/java/com/mediamanager/model/AlbumHasGenre.java b/src/main/java/com/mediamanager/model/AlbumHasGenre.java
new file mode 100644
index 0000000..c380a89
--- /dev/null
+++ b/src/main/java/com/mediamanager/model/AlbumHasGenre.java
@@ -0,0 +1,56 @@
+package com.mediamanager.model;
+
+import jakarta.persistence.*;
+
+@Entity
+@Table(name = "albumshasgenre")
+public class AlbumHasGenre {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Integer id;
+
+ @ManyToOne(fetch = FetchType.LAZY)
+ @JoinColumn(name = "fk_album_id", nullable = false)
+ private Album album;
+
+ @ManyToOne(fetch = FetchType.LAZY)
+ @JoinColumn(name = "fk_genre_id", nullable = false)
+ private Genre genre;
+
+ public AlbumHasGenre() {}
+
+ // Getters and Setters
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public Album getAlbum() {
+ return album;
+ }
+
+ public void setAlbum(Album album) {
+ this.album = album;
+ }
+
+ public Genre getGenre() {
+ return genre;
+ }
+
+ public void setGenre(Genre genre) {
+ this.genre = genre;
+ }
+
+ @Override
+ public String toString() {
+ return "AlbumHasGenre{" +
+ "id=" + id +
+ ", albumId=" + (album != null ? album.getId() : null) +
+ ", genreId=" + (genre != null ? genre.getId() : null) +
+ '}';
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/mediamanager/model/AlbumType.java b/src/main/java/com/mediamanager/model/AlbumType.java
new file mode 100644
index 0000000..ac5fad7
--- /dev/null
+++ b/src/main/java/com/mediamanager/model/AlbumType.java
@@ -0,0 +1,31 @@
+package com.mediamanager.model;
+
+import jakarta.persistence.*;
+
+@Entity
+@Table(name = "albumtype")
+public class AlbumType {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Integer id;
+
+ @Column(nullable = false)
+ private String value;
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+}
diff --git a/src/main/java/com/mediamanager/model/Artist.java b/src/main/java/com/mediamanager/model/Artist.java
new file mode 100644
index 0000000..22fe490
--- /dev/null
+++ b/src/main/java/com/mediamanager/model/Artist.java
@@ -0,0 +1,27 @@
+package com.mediamanager.model;
+
+import jakarta.persistence.*;
+
+@Entity
+@Table(name = "artist")
+public class Artist {
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Integer id;
+
+ @Column(nullable = false)
+ private String name;
+
+ public Integer getId() {
+ return id;
+ }
+ public void setId(Integer id) {
+ this.id = id;
+ }
+ public String getName() {
+ return name;
+ }
+ public void setName(String name) {
+ this.name = name;
+ }
+}
diff --git a/src/main/java/com/mediamanager/model/BitDepth.java b/src/main/java/com/mediamanager/model/BitDepth.java
new file mode 100644
index 0000000..3b80217
--- /dev/null
+++ b/src/main/java/com/mediamanager/model/BitDepth.java
@@ -0,0 +1,32 @@
+package com.mediamanager.model;
+
+import jakarta.persistence.*;
+
+@Entity
+@Table(name = "bit_depth")
+public class BitDepth {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Integer id;
+
+ @Column(nullable = false)
+ private String value;
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+}
+
diff --git a/src/main/java/com/mediamanager/model/BitRate.java b/src/main/java/com/mediamanager/model/BitRate.java
new file mode 100644
index 0000000..c3f6fa2
--- /dev/null
+++ b/src/main/java/com/mediamanager/model/BitRate.java
@@ -0,0 +1,31 @@
+package com.mediamanager.model;
+
+import jakarta.persistence.*;
+
+@Entity
+@Table(name = "bit_rate")
+public class BitRate {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Integer id;
+
+ @Column(nullable = false)
+ private String value;
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+}
diff --git a/src/main/java/com/mediamanager/model/Composer.java b/src/main/java/com/mediamanager/model/Composer.java
new file mode 100644
index 0000000..965bf6f
--- /dev/null
+++ b/src/main/java/com/mediamanager/model/Composer.java
@@ -0,0 +1,31 @@
+package com.mediamanager.model;
+
+
+import jakarta.persistence.*;
+
+@Entity
+@Table(name = "composer")
+public class Composer {
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Integer id;
+
+ @Column(nullable = false)
+ private String name;
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
diff --git a/src/main/java/com/mediamanager/model/Disc.java b/src/main/java/com/mediamanager/model/Disc.java
new file mode 100644
index 0000000..a7ca6a4
--- /dev/null
+++ b/src/main/java/com/mediamanager/model/Disc.java
@@ -0,0 +1,47 @@
+package com.mediamanager.model;
+
+import jakarta.persistence.*;
+
+@Entity
+@Table(name = "disc")
+public class Disc {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Integer id;
+
+ @Column(name = "disc_number", nullable = false)
+ private Integer discNumber;
+
+ @ManyToOne(fetch = FetchType.LAZY)
+ @JoinColumn(name = "fk_album_id",nullable = false)
+ private Album album;
+
+ public Disc() {
+
+ }
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public Integer getDiscNumber() {
+ return discNumber;
+ }
+
+ public void setDiscNumber(Integer discNumber) {
+ this.discNumber = discNumber;
+ }
+
+ public Album getAlbum() {
+ return album;
+ }
+
+ public void setAlbum(Album album) {
+ this.album = album;
+ }
+}
diff --git a/src/main/java/com/mediamanager/model/Genre.java b/src/main/java/com/mediamanager/model/Genre.java
new file mode 100644
index 0000000..b2a736b
--- /dev/null
+++ b/src/main/java/com/mediamanager/model/Genre.java
@@ -0,0 +1,30 @@
+package com.mediamanager.model;
+
+import jakarta.persistence.*;
+
+@Entity
+@Table(name = "genre")
+public class Genre {
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Integer id;
+
+ @Column(nullable = false)
+ private String name;
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
diff --git a/src/main/java/com/mediamanager/model/Media.java b/src/main/java/com/mediamanager/model/Media.java
deleted file mode 100644
index 99a455d..0000000
--- a/src/main/java/com/mediamanager/model/Media.java
+++ /dev/null
@@ -1,128 +0,0 @@
-package com.mediamanager.model;
-
-import jakarta.persistence.*;
-import java.time.LocalDateTime;
-
-@Entity
-@Table(name = "media")
-public class Media {
-
- @Id
- @GeneratedValue(strategy = GenerationType.IDENTITY)
- private Long id;
-
- @Column(nullable = false)
- private String title;
-
- @Column(nullable = false, unique = true)
- private String filePath;
-
- @Enumerated(EnumType.STRING)
- @Column(nullable = false)
- private MediaType type;
-
- @Column
- private Long fileSize;
-
- @Column
- private String mimeType;
-
- @Column(name = "created_at", nullable = false, updatable = false)
- private LocalDateTime createdAt;
-
- @Column(name = "updated_at")
- private LocalDateTime updatedAt;
-
- @PrePersist
- protected void onCreate() {
- createdAt = LocalDateTime.now();
- updatedAt = LocalDateTime.now();
- }
-
- @PreUpdate
- protected void onUpdate() {
- updatedAt = LocalDateTime.now();
- }
-
- // Constructors
- public Media() {}
-
- public Media(String title, String filePath, MediaType type) {
- this.title = title;
- this.filePath = filePath;
- this.type = type;
- }
-
- // Getters and Setters
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
- public String getTitle() {
- return title;
- }
-
- public void setTitle(String title) {
- this.title = title;
- }
-
- public String getFilePath() {
- return filePath;
- }
-
- public void setFilePath(String filePath) {
- this.filePath = filePath;
- }
-
- public MediaType getType() {
- return type;
- }
-
- public void setType(MediaType type) {
- this.type = type;
- }
-
- public Long getFileSize() {
- return fileSize;
- }
-
- public void setFileSize(Long fileSize) {
- this.fileSize = fileSize;
- }
-
- public String getMimeType() {
- return mimeType;
- }
-
- public void setMimeType(String mimeType) {
- this.mimeType = mimeType;
- }
-
- public LocalDateTime getCreatedAt() {
- return createdAt;
- }
-
- public void setCreatedAt(LocalDateTime createdAt) {
- this.createdAt = createdAt;
- }
-
- public LocalDateTime getUpdatedAt() {
- return updatedAt;
- }
-
- public void setUpdatedAt(LocalDateTime updatedAt) {
- this.updatedAt = updatedAt;
- }
-
- public enum MediaType {
- VIDEO,
- AUDIO,
- IMAGE,
- DOCUMENT,
- OTHER
- }
-}
diff --git a/src/main/java/com/mediamanager/model/SamplingRate.java b/src/main/java/com/mediamanager/model/SamplingRate.java
new file mode 100644
index 0000000..e090226
--- /dev/null
+++ b/src/main/java/com/mediamanager/model/SamplingRate.java
@@ -0,0 +1,30 @@
+package com.mediamanager.model;
+
+import jakarta.persistence.*;
+
+@Entity
+@Table(name = "sampling_rate")
+public class SamplingRate {
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Integer id;
+
+ @Column(nullable = false)
+ private String value;
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+}
diff --git a/src/main/java/com/mediamanager/model/Track.java b/src/main/java/com/mediamanager/model/Track.java
new file mode 100644
index 0000000..b939554
--- /dev/null
+++ b/src/main/java/com/mediamanager/model/Track.java
@@ -0,0 +1,128 @@
+package com.mediamanager.model;
+
+import jakarta.persistence.*;
+
+@Entity
+@Table(name = "track")
+public class Track {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Integer id;
+
+ @Column(name = "track_number")
+ private Integer trackNumber;
+
+ @Column
+ private String title;
+
+ @Column
+ private Integer duration;
+
+ @Column
+ private String filepath;
+
+ @ManyToOne(fetch = FetchType.LAZY)
+ @JoinColumn(name = "fk_disc_id")
+ private Disc disc;
+
+ @ManyToOne(fetch = FetchType.LAZY)
+ @JoinColumn(name = "fk_composer_id")
+ private Composer composer;
+
+ @ManyToOne(fetch = FetchType.LAZY)
+ @JoinColumn(name = "fk_bit_depth_id")
+ private BitDepth bitDepth;
+
+ @ManyToOne(fetch = FetchType.LAZY)
+ @JoinColumn(name = "fk_bit_rate_id")
+ private BitRate bitRate;
+
+ @ManyToOne(fetch = FetchType.LAZY)
+ @JoinColumn(name = "fk_sampling_rate_id")
+ private SamplingRate samplingRate;
+
+ public Track() {
+
+ }
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public Integer getTrackNumber() {
+ return trackNumber;
+ }
+
+ public void setTrackNumber(Integer trackNumber) {
+ this.trackNumber = trackNumber;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String name) {
+ this.title = name;
+ }
+
+ public Integer getDuration() {
+ return duration;
+ }
+
+ public void setDuration(Integer duration) {
+ this.duration = duration;
+ }
+
+ public String getFilepath() {
+ return filepath;
+ }
+
+ public void setFilepath(String filepath) {
+ this.filepath = filepath;
+ }
+
+ public Disc getDisc() {
+ return disc;
+ }
+
+ public void setDisc(Disc disc) {
+ this.disc = disc;
+ }
+
+ public Composer getComposer() {
+ return composer;
+ }
+
+ public void setComposer(Composer composer) {
+ this.composer = composer;
+ }
+
+ public BitDepth getBitDepth() {
+ return bitDepth;
+ }
+
+ public void setBitDepth(BitDepth bitDepth) {
+ this.bitDepth = bitDepth;
+ }
+
+ public BitRate getBitRate() {
+ return bitRate;
+ }
+
+ public void setBitRate(BitRate bitRate) {
+ this.bitRate = bitRate;
+ }
+
+ public SamplingRate getSamplingRate() {
+ return samplingRate;
+ }
+
+ public void setSamplingRate(SamplingRate samplingRate) {
+ this.samplingRate = samplingRate;
+ }
+}
diff --git a/src/main/java/com/mediamanager/model/TrackHasArtist.java b/src/main/java/com/mediamanager/model/TrackHasArtist.java
new file mode 100644
index 0000000..98a207e
--- /dev/null
+++ b/src/main/java/com/mediamanager/model/TrackHasArtist.java
@@ -0,0 +1,58 @@
+package com.mediamanager.model;
+
+import jakarta.persistence.*;
+
+@Entity
+@Table(
+ name = "trackhasartist",
+ uniqueConstraints = @UniqueConstraint(columnNames = {"fk_track_id", "fk_artist_id"})
+)
+public class TrackHasArtist {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Integer id;
+
+ @ManyToOne(fetch = FetchType.LAZY)
+ @JoinColumn(name = "fk_track_id", nullable = false)
+ private Track track;
+
+ @ManyToOne(fetch = FetchType.LAZY)
+ @JoinColumn(name = "fk_artist_id", nullable = false)
+ private Artist artist;
+
+ public TrackHasArtist() {}
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public Track getTrack() {
+ return track;
+ }
+
+ public void setTrack(Track track) {
+ this.track = track;
+ }
+
+ public Artist getArtist() {
+ return artist;
+ }
+
+ public void setArtist(Artist artist) {
+ this.artist = artist;
+ }
+
+ @Override
+ public String toString() {
+ return "TrackHasArtist{" +
+ "id=" + id +
+ ", trackId=" + (track != null ? track.getId() : null) +
+ ", artistId=" + (artist != null ? artist.getId() : null) +
+ '}';
+ }
+}
diff --git a/src/main/java/com/mediamanager/model/TrackHasComposer.java b/src/main/java/com/mediamanager/model/TrackHasComposer.java
new file mode 100644
index 0000000..e227580
--- /dev/null
+++ b/src/main/java/com/mediamanager/model/TrackHasComposer.java
@@ -0,0 +1,58 @@
+package com.mediamanager.model;
+
+import jakarta.persistence.*;
+
+@Entity
+@Table(
+ name = "trackhascomposer",
+ uniqueConstraints = @UniqueConstraint(columnNames = {"fk_track_id", "fk_composer_id"})
+)
+public class TrackHasComposer {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Integer id;
+
+ @ManyToOne(fetch = FetchType.LAZY)
+ @JoinColumn(name = "fk_track_id", nullable = false)
+ private Track track;
+
+ @ManyToOne(fetch = FetchType.LAZY)
+ @JoinColumn(name = "fk_composer_id", nullable = false)
+ private Composer composer;
+
+ public TrackHasComposer() {}
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public Track getTrack() {
+ return track;
+ }
+
+ public void setTrack(Track track) {
+ this.track = track;
+ }
+
+ public Composer getComposer() {
+ return composer;
+ }
+
+ public void setComposer(Composer composer) {
+ this.composer = composer;
+ }
+
+ @Override
+ public String toString() {
+ return "TrackHasComposer{" +
+ "id=" + id +
+ ", trackId=" + (track != null ? track.getId() : null) +
+ ", composerId=" + (composer != null ? composer.getId() : null) +
+ '}';
+ }
+}
diff --git a/src/main/java/com/mediamanager/model/TrackHasGenre.java b/src/main/java/com/mediamanager/model/TrackHasGenre.java
new file mode 100644
index 0000000..408dffb
--- /dev/null
+++ b/src/main/java/com/mediamanager/model/TrackHasGenre.java
@@ -0,0 +1,56 @@
+package com.mediamanager.model;
+
+import jakarta.persistence.*;
+
+@Entity
+@Table(name = "trackhasgenre",
+ uniqueConstraints = @UniqueConstraint(columnNames = {"fk_track_id", "fk_genre_id"}))
+public class TrackHasGenre {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Integer id;
+
+ @ManyToOne(fetch = FetchType.LAZY)
+ @JoinColumn(name = "fk_track_id", nullable = false)
+ private Track track;
+
+ @ManyToOne(fetch = FetchType.LAZY)
+ @JoinColumn(name = "fk_genre_id", nullable = false)
+ private Genre genre;
+
+ public TrackHasGenre() {}
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public Track getTrack() {
+ return track;
+ }
+
+ public void setTrack(Track track) {
+ this.track = track;
+ }
+
+ public Genre getGenre() {
+ return genre;
+ }
+
+ public void setGenre(Genre genre) {
+ this.genre = genre;
+ }
+
+ @Override
+ public String toString() {
+ return "TrackHasGenre{" +
+ "id=" + id +
+ ", trackId=" + (track != null ? track.getId() : null) +
+ ", genreId=" + (genre != null ? genre.getId() : null) +
+ '}';
+ }
+}
diff --git a/src/main/java/com/mediamanager/repository/AlbumArtRepository.java b/src/main/java/com/mediamanager/repository/AlbumArtRepository.java
new file mode 100644
index 0000000..cb5034c
--- /dev/null
+++ b/src/main/java/com/mediamanager/repository/AlbumArtRepository.java
@@ -0,0 +1,103 @@
+package com.mediamanager.repository;
+
+
+import com.mediamanager.model.AlbumArt;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.EntityManagerFactory;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+
+import java.util.List;
+import java.util.Optional;
+
+public class AlbumArtRepository {
+ private static final Logger logger = LogManager.getLogger(AlbumArtRepository.class);
+
+ private final EntityManagerFactory entityManagerFactory;
+
+ public AlbumArtRepository(EntityManagerFactory entityManagerFactory) {
+ this.entityManagerFactory = entityManagerFactory;
+ }
+
+ public AlbumArt save(AlbumArt albumArt) {
+ logger.debug("Saving AlbumArt: {}", albumArt.getFilepath());
+ EntityManager em = entityManagerFactory.createEntityManager();
+ em.getTransaction().begin();
+ try {
+ em.persist(albumArt);
+ em.getTransaction().commit();
+ logger.debug("AlbumArt has been saved successfully");
+ return albumArt;
+ } catch (Exception e) {
+ em.getTransaction().rollback();
+ logger.error("Error while saving AlbumArt: {}", e.getMessage());
+ throw e;
+ } finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+
+ public List findAll() {
+ logger.debug("Finding All AlbumArt");
+ EntityManager em = entityManagerFactory.createEntityManager();
+ try{
+ return em.createQuery("select a from AlbumArt a", AlbumArt.class).getResultList();
+ }finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+
+ public Optional findById(Integer id) {
+ logger.debug("Finding AlbumArt with id: {}", id);
+ EntityManager em = entityManagerFactory.createEntityManager();
+ try{
+ AlbumArt albumArt = em.find(AlbumArt.class, id);
+ return Optional.ofNullable(albumArt);
+ }finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+
+ public AlbumArt update(AlbumArt albumArt) {
+ logger.debug("Updating AlbumArt: {}", albumArt.getFilepath());
+ EntityManager em = entityManagerFactory.createEntityManager();
+ em.getTransaction().begin();
+ try {
+ AlbumArt updated = em.merge(albumArt);
+ em.getTransaction().commit();
+ logger.debug("AlbumArt has been updated successfully");
+ return updated;
+ } catch (Exception e) {
+ em.getTransaction().rollback();
+ logger.error("Error while updating AlbumArt: {}", e.getMessage());
+ throw e;
+ } finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+
+ public boolean deleteById(Integer id){
+ logger.debug("Deleting AlbumArt with id: {}", id);
+ EntityManager em = entityManagerFactory.createEntityManager();
+ em.getTransaction().begin();
+ try{
+ AlbumArt albumArt = em.find(AlbumArt.class, id);
+ if (albumArt == null) {
+ em.getTransaction().rollback();
+ return false;
+ }
+ em.remove(albumArt);
+ em.getTransaction().commit();
+ logger.debug("AlbumArt has been deleted successfully");
+ return true;
+ } catch (Exception e) {
+ em.getTransaction().rollback();
+ logger.error("Error while deleting AlbumArt: {}", e.getMessage());
+ throw e;
+ } finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+
+}
diff --git a/src/main/java/com/mediamanager/repository/AlbumHasArtistRepository.java b/src/main/java/com/mediamanager/repository/AlbumHasArtistRepository.java
new file mode 100644
index 0000000..f57140c
--- /dev/null
+++ b/src/main/java/com/mediamanager/repository/AlbumHasArtistRepository.java
@@ -0,0 +1,85 @@
+package com.mediamanager.repository;
+
+
+import com.mediamanager.model.AlbumHasArtist;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.EntityManagerFactory;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+
+import java.util.List;
+import java.util.Optional;
+
+public class AlbumHasArtistRepository {
+ private static final Logger logger = LogManager.getLogger(AlbumHasArtistRepository.class);
+
+ private final EntityManagerFactory entityManagerFactory;
+
+ public AlbumHasArtistRepository(EntityManagerFactory entityManagerFactory) {
+ this.entityManagerFactory = entityManagerFactory;
+ }
+
+ public AlbumHasArtist save(AlbumHasArtist albumHasArtist) {
+ logger.debug("Saving AlbumHasArtist: {}", albumHasArtist);
+ EntityManager em = entityManagerFactory.createEntityManager();
+ em.getTransaction().begin();
+ try {
+ em.persist(albumHasArtist);
+ em.getTransaction().commit();
+ logger.debug("AlbumHasArtist has been saved successfully");
+ return albumHasArtist;
+ } catch (Exception e) {
+ em.getTransaction().rollback();
+ logger.error("Error while saving AlbumHasArtist: {}", e.getMessage());
+ throw e;
+ } finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+
+ public List findAll() {
+ logger.debug("Finding All AlbumHasArtist");
+ EntityManager em = entityManagerFactory.createEntityManager();
+ try{
+ return em.createQuery("select a from AlbumHasArtist a", AlbumHasArtist.class).getResultList();
+ }finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+
+ public Optional findById(Integer id) {
+ logger.debug("Finding AlbumHasArtist with id: {}", id);
+ EntityManager em = entityManagerFactory.createEntityManager();
+ try{
+ AlbumHasArtist albumHasArtist = em.find(AlbumHasArtist.class, id);
+ return Optional.ofNullable(albumHasArtist);
+ }finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+
+ public boolean deleteById(Integer id){
+ logger.debug("Deleting AlbumHasArtist with id: {}", id);
+ EntityManager em = entityManagerFactory.createEntityManager();
+ em.getTransaction().begin();
+ try{
+ AlbumHasArtist albumHasArtist = em.find(AlbumHasArtist.class, id);
+ if (albumHasArtist == null) {
+ em.getTransaction().rollback();
+ return false;
+ }
+ em.remove(albumHasArtist);
+ em.getTransaction().commit();
+ logger.debug("AlbumHasArtist has been deleted successfully");
+ return true;
+ } catch (Exception e) {
+ em.getTransaction().rollback();
+ logger.error("Error while deleting AlbumHasArtist: {}", e.getMessage());
+ throw e;
+ } finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+
+}
diff --git a/src/main/java/com/mediamanager/repository/AlbumHasGenreRepository.java b/src/main/java/com/mediamanager/repository/AlbumHasGenreRepository.java
new file mode 100644
index 0000000..d842224
--- /dev/null
+++ b/src/main/java/com/mediamanager/repository/AlbumHasGenreRepository.java
@@ -0,0 +1,85 @@
+package com.mediamanager.repository;
+
+
+import com.mediamanager.model.AlbumHasGenre;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.EntityManagerFactory;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+
+import java.util.List;
+import java.util.Optional;
+
+public class AlbumHasGenreRepository {
+ private static final Logger logger = LogManager.getLogger(AlbumHasGenreRepository.class);
+
+ private final EntityManagerFactory entityManagerFactory;
+
+ public AlbumHasGenreRepository(EntityManagerFactory entityManagerFactory) {
+ this.entityManagerFactory = entityManagerFactory;
+ }
+
+ public AlbumHasGenre save(AlbumHasGenre albumHasGenre) {
+ logger.debug("Saving AlbumHasGenre: {}", albumHasGenre);
+ EntityManager em = entityManagerFactory.createEntityManager();
+ em.getTransaction().begin();
+ try {
+ em.persist(albumHasGenre);
+ em.getTransaction().commit();
+ logger.debug("AlbumHasGenre has been saved successfully");
+ return albumHasGenre;
+ } catch (Exception e) {
+ em.getTransaction().rollback();
+ logger.error("Error while saving AlbumHasGenre: {}", e.getMessage());
+ throw e;
+ } finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+
+ public List findAll() {
+ logger.debug("Finding All AlbumHasGenre");
+ EntityManager em = entityManagerFactory.createEntityManager();
+ try{
+ return em.createQuery("select a from AlbumHasGenre a", AlbumHasGenre.class).getResultList();
+ }finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+
+ public Optional findById(Integer id) {
+ logger.debug("Finding AlbumHasGenre with id: {}", id);
+ EntityManager em = entityManagerFactory.createEntityManager();
+ try{
+ AlbumHasGenre albumHasGenre = em.find(AlbumHasGenre.class, id);
+ return Optional.ofNullable(albumHasGenre);
+ }finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+
+ public boolean deleteById(Integer id){
+ logger.debug("Deleting AlbumHasGenre with id: {}", id);
+ EntityManager em = entityManagerFactory.createEntityManager();
+ em.getTransaction().begin();
+ try{
+ AlbumHasGenre albumHasGenre = em.find(AlbumHasGenre.class, id);
+ if (albumHasGenre == null) {
+ em.getTransaction().rollback();
+ return false;
+ }
+ em.remove(albumHasGenre);
+ em.getTransaction().commit();
+ logger.debug("AlbumHasGenre has been deleted successfully");
+ return true;
+ } catch (Exception e) {
+ em.getTransaction().rollback();
+ logger.error("Error while deleting AlbumHasGenre: {}", e.getMessage());
+ throw e;
+ } finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+
+}
diff --git a/src/main/java/com/mediamanager/repository/AlbumRepository.java b/src/main/java/com/mediamanager/repository/AlbumRepository.java
new file mode 100644
index 0000000..f744222
--- /dev/null
+++ b/src/main/java/com/mediamanager/repository/AlbumRepository.java
@@ -0,0 +1,103 @@
+package com.mediamanager.repository;
+
+
+import com.mediamanager.model.Album;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.EntityManagerFactory;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+
+import java.util.List;
+import java.util.Optional;
+
+public class AlbumRepository {
+ private static final Logger logger = LogManager.getLogger(AlbumRepository.class);
+
+ private final EntityManagerFactory entityManagerFactory;
+
+ public AlbumRepository(EntityManagerFactory entityManagerFactory) {
+ this.entityManagerFactory = entityManagerFactory;
+ }
+
+ public Album save(Album album) {
+ logger.debug("Saving Album: {}", album.getName());
+ EntityManager em = entityManagerFactory.createEntityManager();
+ em.getTransaction().begin();
+ try {
+ em.persist(album);
+ em.getTransaction().commit();
+ logger.debug("Album has been saved successfully");
+ return album;
+ } catch (Exception e) {
+ em.getTransaction().rollback();
+ logger.error("Error while saving Album: {}", e.getMessage());
+ throw e;
+ } finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+
+ public List findAll() {
+ logger.debug("Finding All Album");
+ EntityManager em = entityManagerFactory.createEntityManager();
+ try{
+ return em.createQuery("select a from Album a", Album.class).getResultList();
+ }finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+
+ public Optional findById(Integer id) {
+ logger.debug("Finding Album with id: {}", id);
+ EntityManager em = entityManagerFactory.createEntityManager();
+ try{
+ Album album = em.find(Album.class, id);
+ return Optional.ofNullable(album);
+ }finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+
+ public Album update(Album album) {
+ logger.debug("Updating Album: {}", album.getName());
+ EntityManager em = entityManagerFactory.createEntityManager();
+ em.getTransaction().begin();
+ try {
+ Album updated = em.merge(album);
+ em.getTransaction().commit();
+ logger.debug("Album has been updated successfully");
+ return updated;
+ } catch (Exception e) {
+ em.getTransaction().rollback();
+ logger.error("Error while updating Album: {}", e.getMessage());
+ throw e;
+ } finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+
+ public boolean deleteById(Integer id){
+ logger.debug("Deleting Album with id: {}", id);
+ EntityManager em = entityManagerFactory.createEntityManager();
+ em.getTransaction().begin();
+ try{
+ Album album = em.find(Album.class, id);
+ if (album == null) {
+ em.getTransaction().rollback();
+ return false;
+ }
+ em.remove(album);
+ em.getTransaction().commit();
+ logger.debug("Album has been deleted successfully");
+ return true;
+ } catch (Exception e) {
+ em.getTransaction().rollback();
+ logger.error("Error while deleting Album: {}", e.getMessage());
+ throw e;
+ } finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+
+}
diff --git a/src/main/java/com/mediamanager/repository/AlbumTypeRepository.java b/src/main/java/com/mediamanager/repository/AlbumTypeRepository.java
new file mode 100644
index 0000000..f359e38
--- /dev/null
+++ b/src/main/java/com/mediamanager/repository/AlbumTypeRepository.java
@@ -0,0 +1,103 @@
+package com.mediamanager.repository;
+
+
+import com.mediamanager.model.AlbumType;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.EntityManagerFactory;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+
+import java.util.List;
+import java.util.Optional;
+
+public class AlbumTypeRepository {
+ private static final Logger logger = LogManager.getLogger(AlbumTypeRepository.class);
+
+ private final EntityManagerFactory entityManagerFactory;
+
+ public AlbumTypeRepository(EntityManagerFactory entityManagerFactory) {
+ this.entityManagerFactory = entityManagerFactory;
+ }
+
+ public AlbumType save(AlbumType albumType) {
+ logger.debug("Saving AlbumType: {}", albumType.getValue());
+ EntityManager em = entityManagerFactory.createEntityManager();
+ em.getTransaction().begin();
+ try {
+ em.persist(albumType);
+ em.getTransaction().commit();
+ logger.debug("AlbumType has been saved successfully");
+ return albumType;
+ } catch (Exception e) {
+ em.getTransaction().rollback();
+ logger.error("Error while saving AlbumType: {}", e.getMessage());
+ throw e;
+ } finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+
+ public List findAll() {
+ logger.debug("Finding All AlbumType");
+ EntityManager em = entityManagerFactory.createEntityManager();
+ try{
+ return em.createQuery("select a from AlbumType a", AlbumType.class).getResultList();
+ }finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+
+ public Optional findById(Integer id) {
+ logger.debug("Finding AlbumType with id: {}", id);
+ EntityManager em = entityManagerFactory.createEntityManager();
+ try{
+ AlbumType albumType = em.find(AlbumType.class, id);
+ return Optional.ofNullable(albumType);
+ }finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+
+ public AlbumType update(AlbumType albumType) {
+ logger.debug("Updating AlbumType: {}", albumType.getValue());
+ EntityManager em = entityManagerFactory.createEntityManager();
+ em.getTransaction().begin();
+ try {
+ AlbumType updated = em.merge(albumType);
+ em.getTransaction().commit();
+ logger.debug("AlbumType has been updated successfully");
+ return updated;
+ } catch (Exception e) {
+ em.getTransaction().rollback();
+ logger.error("Error while updating AlbumType: {}", e.getMessage());
+ throw e;
+ } finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+
+ public boolean deleteById(Integer id){
+ logger.debug("Deleting AlbumType with id: {}", id);
+ EntityManager em = entityManagerFactory.createEntityManager();
+ em.getTransaction().begin();
+ try{
+ AlbumType albumType = em.find(AlbumType.class, id);
+ if (albumType == null) {
+ em.getTransaction().rollback();
+ return false;
+ }
+ em.remove(albumType);
+ em.getTransaction().commit();
+ logger.debug("AlbumType has been deleted successfully");
+ return true;
+ } catch (Exception e) {
+ em.getTransaction().rollback();
+ logger.error("Error while deleting AlbumType: {}", e.getMessage());
+ throw e;
+ } finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+
+}
diff --git a/src/main/java/com/mediamanager/repository/ArtistRepository.java b/src/main/java/com/mediamanager/repository/ArtistRepository.java
new file mode 100644
index 0000000..60d0b9d
--- /dev/null
+++ b/src/main/java/com/mediamanager/repository/ArtistRepository.java
@@ -0,0 +1,104 @@
+package com.mediamanager.repository;
+import com.mediamanager.model.Artist;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.EntityManagerFactory;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import java.util.List;
+import java.util.Optional;
+
+public class ArtistRepository {
+ private static final Logger logger = LogManager.getLogger(ArtistRepository.class);
+
+ private final EntityManagerFactory entityManagerFactory;
+
+ public ArtistRepository(EntityManagerFactory entityManagerFactory) {
+ this.entityManagerFactory = entityManagerFactory;
+ }
+
+ public Artist save(Artist artist){
+ logger.debug("Saving Artist: {}", artist.getName());
+ EntityManager em = entityManagerFactory.createEntityManager();
+ em.getTransaction().begin();
+ try {
+ em.persist(artist);
+ em.getTransaction().commit();
+ logger.debug("Artist saved with ID: {}", artist.getId());
+ return artist;
+ } catch (Exception e) {
+ em.getTransaction().rollback();
+ logger.error("Error saving Artist", e);
+ throw e;
+ } finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+
+ public List findAll(){
+ logger.debug("Finding all Artists");
+ EntityManager em = entityManagerFactory.createEntityManager();
+ try {
+ return em
+ .createQuery("SELECT a FROM Artist a ORDER BY a.name", Artist.class)
+ .getResultList();
+ } finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+
+ public Optional findById(Integer id){
+ logger.debug("Finding artist by ID: {}", id);
+ EntityManager em = entityManagerFactory.createEntityManager();
+ try {
+ Artist artist = em.find(Artist.class, id);
+ return Optional.ofNullable(artist);
+ } finally {
+ if (em.isOpen()) em.close();
+ }
+
+ }
+
+ public Artist update(Artist artist){
+ logger.debug("Updating artist ID: {}", artist.getId());
+ EntityManager em = entityManagerFactory.createEntityManager();
+ em.getTransaction().begin();
+ try {
+ Artist updated = em.merge(artist);
+ em.getTransaction().commit();
+ logger.debug("Artist updated successfully");
+ return updated;
+ } catch (Exception e) {
+ em.getTransaction().rollback();
+ logger.error("Error updating artist", e);
+ throw e;
+ } finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+
+ public boolean deleteById(Integer id){
+ logger.debug("Deleting Artist by ID: {}", id);
+ EntityManager em = entityManagerFactory.createEntityManager();
+ em.getTransaction().begin();
+ try {
+ Artist artist = em.find(Artist.class, id);
+ if (artist == null) {
+ em.getTransaction().rollback();
+ return false;
+ }
+ em.remove(artist);
+ em.getTransaction().commit();
+ logger.debug("Artist deleted successfully");
+ return true;
+ } catch (Exception e) {
+ em.getTransaction().rollback();
+ logger.error("Error deleting artist", e);
+ throw e;
+ } finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+ }
+
+
diff --git a/src/main/java/com/mediamanager/repository/BitDepthRepository.java b/src/main/java/com/mediamanager/repository/BitDepthRepository.java
new file mode 100644
index 0000000..24b9dc9
--- /dev/null
+++ b/src/main/java/com/mediamanager/repository/BitDepthRepository.java
@@ -0,0 +1,100 @@
+package com.mediamanager.repository;
+
+import com.mediamanager.model.BitDepth;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.EntityManagerFactory;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import java.util.List;
+import java.util.Optional;
+
+public class BitDepthRepository {
+ private static final Logger logger = LogManager.getLogger(BitDepthRepository.class);
+
+ private final EntityManagerFactory entityManagerFactory;
+
+ public BitDepthRepository(EntityManagerFactory entityManagerFactory) {
+ this.entityManagerFactory = entityManagerFactory;
+ }
+
+ public BitDepth save(BitDepth bitDepth) {
+ logger.debug("Saving BitDepth: {}", bitDepth.getValue());
+ EntityManager em = entityManagerFactory.createEntityManager();
+ em.getTransaction().begin();
+ try {
+ em.persist(bitDepth);
+ em.getTransaction().commit();
+ logger.debug("BitDepth saved with ID: {}", bitDepth.getId());
+ return bitDepth;
+ } catch (Exception e) {
+ em.getTransaction().rollback();
+ logger.error("Error saving BitDepth", e);
+ throw e;
+ } finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+
+ public List findAll(){
+ logger.debug("Finding all BitDepths");
+ EntityManager em = entityManagerFactory.createEntityManager();
+ try{
+ return em.createQuery("SELECT b FROM BitDepth b ORDER BY b.value", BitDepth.class).getResultList();
+ }finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+
+ public Optional findById(Integer id){
+ logger.debug("Finding BitDepth by ID: {}", id);
+ EntityManager em = entityManagerFactory.createEntityManager();
+ try{
+ BitDepth bitDepth = em.find(BitDepth.class, id);
+ return Optional.ofNullable(bitDepth);
+ }finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+
+ public BitDepth update(BitDepth bitDepth){
+ logger.debug("Updating BitDepth ID: {}", bitDepth.getId());
+ EntityManager em = entityManagerFactory.createEntityManager();
+ em.getTransaction().begin();
+ try{
+ BitDepth updated = em.merge(bitDepth);
+ em.getTransaction().commit();
+ logger.debug("BitDepth updated successfully");
+ return updated;
+ }catch (Exception e){
+ em.getTransaction().rollback();
+ logger.error("Error updating BitDepth", e);
+ throw e;
+ }finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+
+ public boolean deleteById(Integer id){
+ logger.debug("Deleting BitDepth by ID: {}", id);
+ EntityManager em = entityManagerFactory.createEntityManager();
+ em.getTransaction().begin();
+ try{
+ BitDepth bitDepth = em.find(BitDepth.class, id);
+ if (bitDepth == null) {
+ em.getTransaction().rollback();
+ return false;
+ }
+ em.remove(bitDepth);
+ em.getTransaction().commit();
+ logger.debug("BitDepth deleted successfully");
+ return true;
+ } catch (Exception e) {
+ em.getTransaction().rollback();
+ logger.error("Error deleting BitDepth", e);
+ throw e;
+ }finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+}
diff --git a/src/main/java/com/mediamanager/repository/BitRateRepository.java b/src/main/java/com/mediamanager/repository/BitRateRepository.java
new file mode 100644
index 0000000..42c5343
--- /dev/null
+++ b/src/main/java/com/mediamanager/repository/BitRateRepository.java
@@ -0,0 +1,101 @@
+package com.mediamanager.repository;
+
+import com.mediamanager.model.BitRate;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.EntityManagerFactory;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import java.util.List;
+import java.util.Optional;
+
+public class BitRateRepository {
+ private static final Logger logger = LogManager.getLogger(BitRateRepository.class);
+
+ private final EntityManagerFactory entityManagerFactory;
+
+ public BitRateRepository(EntityManagerFactory entityManagerFactory) {
+ this.entityManagerFactory = entityManagerFactory;
+ }
+
+ public BitRate save(BitRate bitRate) {
+ logger.debug("Saving BitRate: {}", bitRate.getValue());
+ EntityManager em = entityManagerFactory.createEntityManager();
+ em.getTransaction().begin();
+ try {
+ em.persist(bitRate);
+ em.getTransaction().commit();
+ logger.debug("BitRate saved with ID: {}", bitRate.getId());
+ return bitRate;
+ } catch (Exception e) {
+ em.getTransaction().rollback();
+ logger.error("Error saving BitRate", e);
+ throw e;
+ } finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+
+ public List findAll(){
+ logger.debug("Finding all BitRates");
+ EntityManager em = entityManagerFactory.createEntityManager();
+ try{
+ return em.createQuery("SELECT b FROM BitRate b ORDER BY b.value", BitRate.class).getResultList();
+ }finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+
+ public Optional findById(Integer id){
+ logger.debug("Finding BitRate by ID: {}", id);
+ EntityManager em = entityManagerFactory.createEntityManager();
+ try{
+ BitRate bitRate = em.find(BitRate.class, id);
+ return Optional.ofNullable(bitRate);
+ } finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+
+ public BitRate update(BitRate bitRate){
+ logger.debug("Updating BitRate ID: {}", bitRate.getId());
+ EntityManager em = entityManagerFactory.createEntityManager();
+ em.getTransaction().begin();
+ try{
+ BitRate updated = em.merge(bitRate);
+ em.getTransaction().commit();
+ logger.debug("BitRate updated with ID: {}", bitRate.getId());
+ return updated;
+ } catch (Exception e) {
+ em.getTransaction().rollback();
+ logger.error("Error updating BitRate", e);
+ throw e;
+ } finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+
+ public boolean deleteById(Integer id){
+ logger.debug("Deleting BitRate by ID: {}", id);
+ EntityManager em = entityManagerFactory.createEntityManager();
+ em.getTransaction().begin();
+ try{
+ BitRate bitRate = em.find(BitRate.class, id);
+ if (bitRate == null) {
+ em.getTransaction().rollback();
+ return false;
+ }
+ em.remove(bitRate);
+ em.getTransaction().commit();
+ logger.debug("BitRate deleted successfully");
+ return true;
+ } catch (Exception e) {
+ em.getTransaction().rollback();
+ logger.error("Error deleting BitRate", e);
+ throw e;
+ } finally {
+ if (em.isOpen()) em.close();
+ }
+
+ }
+}
diff --git a/src/main/java/com/mediamanager/repository/ComposerRepository.java b/src/main/java/com/mediamanager/repository/ComposerRepository.java
new file mode 100644
index 0000000..6e1a2aa
--- /dev/null
+++ b/src/main/java/com/mediamanager/repository/ComposerRepository.java
@@ -0,0 +1,102 @@
+package com.mediamanager.repository;
+
+import com.mediamanager.model.Composer;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.EntityManagerFactory;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import java.util.List;
+import java.util.Optional;
+
+public class ComposerRepository {
+ private static final Logger logger = LogManager.getLogger(ComposerRepository.class);
+
+ private final EntityManagerFactory entityManagerFactory;
+
+ public ComposerRepository(EntityManagerFactory entityManagerFactory) {
+ this.entityManagerFactory = entityManagerFactory;
+ }
+
+ public Composer save(Composer composer) {
+ logger.debug("Saving composer: {}", composer.getName());
+ EntityManager em = entityManagerFactory.createEntityManager();
+ em.getTransaction().begin();
+ try{
+ //ToDo: Add Id Validation
+ //ToDo: Add to all Repositories
+ em.persist(composer);
+ em.getTransaction().commit();
+ logger.debug("Composer saved with IS: {}", composer.getId());
+ return composer;
+ } catch (Exception e) {
+ em.getTransaction().rollback();
+ logger.error("Error saving composer", e);
+ throw e;
+ }finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+
+ public List findAll(){
+ logger.debug("Finding all composers");
+ EntityManager em = entityManagerFactory.createEntityManager();
+ try{
+ return em.createQuery("SELECT c FROM Composer c ORDER BY c.name", Composer.class).getResultList();
+ } finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+
+ public Optional findById(Integer id){
+ logger.debug("Finding composer by ID: {}", id);
+ EntityManager em = entityManagerFactory.createEntityManager();
+ try{
+ Composer composer = em.find(Composer.class, id);
+ return Optional.ofNullable(composer);
+ } finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+
+ public Composer update(Composer composer){
+ logger.debug("Updating composer ID: {}", composer.getId());
+ EntityManager em = entityManagerFactory.createEntityManager();
+ em.getTransaction().begin();
+ try{
+ Composer updated = em.merge(composer);
+ em.getTransaction().commit();
+ logger.debug("Composer updated successfully");
+ return updated;
+ } catch (Exception e) {
+ em.getTransaction().rollback();
+ logger.error("Error updating composer", e);
+ throw e;
+ } finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+
+ public boolean deleteById(Integer id){
+ logger.debug("Deleting composer by ID: {}", id);
+ EntityManager em = entityManagerFactory.createEntityManager();
+ em.getTransaction().begin();
+ try{
+ Composer composer = em.find(Composer.class, id);
+ if (composer == null) {
+ em.getTransaction().rollback();
+ return false;
+ }
+ em.remove(composer);
+ em.getTransaction().commit();
+ logger.debug("Composer deleted successfully");
+ return true;
+ } catch (Exception e) {
+ em.getTransaction().rollback();
+ logger.error("Error deleting composer", e);
+ throw e;
+ }finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+}
diff --git a/src/main/java/com/mediamanager/repository/DiscRepository.java b/src/main/java/com/mediamanager/repository/DiscRepository.java
new file mode 100644
index 0000000..69e7510
--- /dev/null
+++ b/src/main/java/com/mediamanager/repository/DiscRepository.java
@@ -0,0 +1,100 @@
+package com.mediamanager.repository;
+
+import com.mediamanager.model.Disc;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.EntityManagerFactory;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import java.util.List;
+import java.util.Optional;
+
+public class DiscRepository {
+ private static final Logger logger = LogManager.getLogger(DiscRepository.class);
+
+ private final EntityManagerFactory entityManagerFactory;
+
+ public DiscRepository(EntityManagerFactory entityManagerFactory) {
+ this.entityManagerFactory = entityManagerFactory;
+ }
+
+ public Disc save(Disc disc) {
+ logger.debug("Saving Disc: {}", disc.getDiscNumber());
+ EntityManager em = entityManagerFactory.createEntityManager();
+ em.getTransaction().begin();
+ try {
+ em.persist(disc);
+ em.getTransaction().commit();
+ logger.debug("Disc has been saved successfully");
+ return disc;
+ } catch (Exception e) {
+ em.getTransaction().rollback();
+ logger.error("Error while saving Disc: {}", e.getMessage());
+ throw e;
+ } finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+
+ public List findAll() {
+ logger.debug("Finding All Disc");
+ EntityManager em = entityManagerFactory.createEntityManager();
+ try{
+ return em.createQuery("select d from Disc d", Disc.class).getResultList();
+ }finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+
+ public Optional findById(Integer id) {
+ logger.debug("Finding Disc with id: {}", id);
+ EntityManager em = entityManagerFactory.createEntityManager();
+ try{
+ Disc disc = em.find(Disc.class, id);
+ return Optional.ofNullable(disc);
+ }finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+
+ public Disc update(Disc disc) {
+ logger.debug("Updating Disc: {}", disc.getDiscNumber());
+ EntityManager em = entityManagerFactory.createEntityManager();
+ em.getTransaction().begin();
+ try {
+ Disc updated = em.merge(disc);
+ em.getTransaction().commit();
+ logger.debug("Disc has been updated successfully");
+ return updated;
+ } catch (Exception e) {
+ em.getTransaction().rollback();
+ logger.error("Error while updating Disc: {}", e.getMessage());
+ throw e;
+ } finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+
+ public boolean deleteById(Integer id){
+ logger.debug("Deleting Disc with id: {}", id);
+ EntityManager em = entityManagerFactory.createEntityManager();
+ em.getTransaction().begin();
+ try{
+ Disc disc = em.find(Disc.class, id);
+ if (disc == null) {
+ em.getTransaction().rollback();
+ return false;
+ }
+ em.remove(disc);
+ em.getTransaction().commit();
+ logger.debug("Disc has been deleted successfully");
+ return true;
+ } catch (Exception e) {
+ em.getTransaction().rollback();
+ logger.error("Error while deleting Disc: {}", e.getMessage());
+ throw e;
+ } finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+}
diff --git a/src/main/java/com/mediamanager/repository/GenreRepository.java b/src/main/java/com/mediamanager/repository/GenreRepository.java
new file mode 100644
index 0000000..73e9be9
--- /dev/null
+++ b/src/main/java/com/mediamanager/repository/GenreRepository.java
@@ -0,0 +1,121 @@
+package com.mediamanager.repository;
+
+import com.mediamanager.model.Genre;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.EntityManagerFactory;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * Repository para acesso a dados de Genre
+ * Encapsula todas as operações de banco de dados
+ */
+public class GenreRepository {
+ private static final Logger logger = LogManager.getLogger(GenreRepository.class);
+
+ private final EntityManagerFactory entityManagerFactory;
+
+ public GenreRepository(EntityManagerFactory entityManagerFactory) {
+ this.entityManagerFactory = entityManagerFactory;
+ }
+
+ /**
+ * Salva um novo genre
+ */
+ public Genre save(Genre genre) {
+ logger.debug("Saving genre: {}", genre.getName());
+ EntityManager em = entityManagerFactory.createEntityManager();
+ em.getTransaction().begin();
+ try {
+ em.persist(genre);
+ em.getTransaction().commit();
+ logger.debug("Genre saved with ID: {}", genre.getId());
+ return genre;
+ } catch (Exception e) {
+ em.getTransaction().rollback();
+ logger.error("Error saving genre", e);
+ throw e;
+ } finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+
+ /**
+ * Busca todos os genres
+ */
+ public List findAll() {
+ logger.debug("Finding all genres");
+ EntityManager em = entityManagerFactory.createEntityManager();
+ try {
+ return em
+ .createQuery("SELECT g FROM Genre g ORDER BY g.name", Genre.class)
+ .getResultList();
+ } finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+
+ /**
+ * Busca genre por ID
+ */
+ public Optional findById(Integer id) {
+ logger.debug("Finding genre by ID: {}", id);
+ EntityManager em = entityManagerFactory.createEntityManager();
+ try {
+ Genre genre = em.find(Genre.class, id);
+ return Optional.ofNullable(genre);
+ } finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+
+ /**
+ * Atualiza um genre existente
+ */
+ public Genre update(Genre genre) {
+ logger.debug("Updating genre ID: {}", genre.getId());
+ EntityManager em = entityManagerFactory.createEntityManager();
+ em.getTransaction().begin();
+ try {
+ Genre updated = em.merge(genre);
+ em.getTransaction().commit();
+ logger.debug("Genre updated successfully");
+ return updated;
+ } catch (Exception e) {
+ em.getTransaction().rollback();
+ logger.error("Error updating genre", e);
+ throw e;
+ } finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+
+ /**
+ * Deleta um genre por ID
+ */
+ public boolean deleteById(Integer id) {
+ logger.debug("Deleting genre by ID: {}", id);
+ EntityManager em = entityManagerFactory.createEntityManager();
+ em.getTransaction().begin();
+ try {
+ Genre genre = em.find(Genre.class, id);
+ if (genre == null) {
+ em.getTransaction().rollback();
+ return false;
+ }
+ em.remove(genre);
+ em.getTransaction().commit();
+ logger.debug("Genre deleted successfully");
+ return true;
+ } catch (Exception e) {
+ em.getTransaction().rollback();
+ logger.error("Error deleting genre", e);
+ throw e;
+ } finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/mediamanager/repository/SamplingRateRepository.java b/src/main/java/com/mediamanager/repository/SamplingRateRepository.java
new file mode 100644
index 0000000..4d2fd82
--- /dev/null
+++ b/src/main/java/com/mediamanager/repository/SamplingRateRepository.java
@@ -0,0 +1,103 @@
+package com.mediamanager.repository;
+
+
+import com.mediamanager.model.SamplingRate;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.EntityManagerFactory;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+
+import java.util.List;
+import java.util.Optional;
+
+public class SamplingRateRepository {
+ private static final Logger logger = LogManager.getLogger(SamplingRateRepository.class);
+
+ private final EntityManagerFactory entityManagerFactory;
+
+ public SamplingRateRepository(EntityManagerFactory entityManagerFactory) {
+ this.entityManagerFactory = entityManagerFactory;
+ }
+
+ public SamplingRate save(SamplingRate samplingRate) {
+ logger.debug("Saving SamplingRate: {}", samplingRate.getValue());
+ EntityManager em = entityManagerFactory.createEntityManager();
+ em.getTransaction().begin();
+ try {
+ em.persist(samplingRate);
+ em.getTransaction().commit();
+ logger.debug("SamplingRate has been saved successfully");
+ return samplingRate;
+ } catch (Exception e) {
+ em.getTransaction().rollback();
+ logger.error("Error while saving SamplingRate: {}", e.getMessage());
+ throw e;
+ } finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+
+ public List findAll() {
+ logger.debug("Finding All SamplingRate");
+ EntityManager em = entityManagerFactory.createEntityManager();
+ try{
+ return em.createQuery("select s from SamplingRate s", SamplingRate.class).getResultList();
+ }finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+
+ public Optional findById(Integer id) {
+ logger.debug("Finding SamplingRate with id: {}", id);
+ EntityManager em = entityManagerFactory.createEntityManager();
+ try{
+ SamplingRate samplingRate = em.find(SamplingRate.class, id);
+ return Optional.ofNullable(samplingRate);
+ }finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+
+ public SamplingRate update(SamplingRate samplingRate) {
+ logger.debug("Updating SamplingRate: {}", samplingRate.getValue());
+ EntityManager em = entityManagerFactory.createEntityManager();
+ em.getTransaction().begin();
+ try {
+ SamplingRate updated = em.merge(samplingRate);
+ em.getTransaction().commit();
+ logger.debug("SamplingRate has been updated successfully");
+ return updated;
+ } catch (Exception e) {
+ em.getTransaction().rollback();
+ logger.error("Error while updating SamplingRate: {}", e.getMessage());
+ throw e;
+ } finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+
+ public boolean deleteById(Integer id){
+ logger.debug("Deleting SamplingRate with id: {}", id);
+ EntityManager em = entityManagerFactory.createEntityManager();
+ em.getTransaction().begin();
+ try{
+ SamplingRate samplingRate = em.find(SamplingRate.class, id);
+ if (samplingRate == null) {
+ em.getTransaction().rollback();
+ return false;
+ }
+ em.remove(samplingRate);
+ em.getTransaction().commit();
+ logger.debug("SamplingRate has been deleted successfully");
+ return true;
+ } catch (Exception e) {
+ em.getTransaction().rollback();
+ logger.error("Error while deleting SamplingRate: {}", e.getMessage());
+ throw e;
+ } finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+
+}
diff --git a/src/main/java/com/mediamanager/repository/TrackHasArtistRepository.java b/src/main/java/com/mediamanager/repository/TrackHasArtistRepository.java
new file mode 100644
index 0000000..1d81f37
--- /dev/null
+++ b/src/main/java/com/mediamanager/repository/TrackHasArtistRepository.java
@@ -0,0 +1,85 @@
+package com.mediamanager.repository;
+
+
+import com.mediamanager.model.TrackHasArtist;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.EntityManagerFactory;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+
+import java.util.List;
+import java.util.Optional;
+
+public class TrackHasArtistRepository {
+ private static final Logger logger = LogManager.getLogger(TrackHasArtistRepository.class);
+
+ private final EntityManagerFactory entityManagerFactory;
+
+ public TrackHasArtistRepository(EntityManagerFactory entityManagerFactory) {
+ this.entityManagerFactory = entityManagerFactory;
+ }
+
+ public TrackHasArtist save(TrackHasArtist trackHasArtist) {
+ logger.debug("Saving TrackHasArtist: {}", trackHasArtist);
+ EntityManager em = entityManagerFactory.createEntityManager();
+ em.getTransaction().begin();
+ try {
+ em.persist(trackHasArtist);
+ em.getTransaction().commit();
+ logger.debug("TrackHasArtist has been saved successfully");
+ return trackHasArtist;
+ } catch (Exception e) {
+ em.getTransaction().rollback();
+ logger.error("Error while saving TrackHasArtist: {}", e.getMessage());
+ throw e;
+ } finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+
+ public List findAll() {
+ logger.debug("Finding All TrackHasArtist");
+ EntityManager em = entityManagerFactory.createEntityManager();
+ try{
+ return em.createQuery("select t from TrackHasArtist t", TrackHasArtist.class).getResultList();
+ }finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+
+ public Optional findById(Integer id) {
+ logger.debug("Finding TrackHasArtist with id: {}", id);
+ EntityManager em = entityManagerFactory.createEntityManager();
+ try{
+ TrackHasArtist trackHasArtist = em.find(TrackHasArtist.class, id);
+ return Optional.ofNullable(trackHasArtist);
+ }finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+
+ public boolean deleteById(Integer id){
+ logger.debug("Deleting TrackHasArtist with id: {}", id);
+ EntityManager em = entityManagerFactory.createEntityManager();
+ em.getTransaction().begin();
+ try{
+ TrackHasArtist trackHasArtist = em.find(TrackHasArtist.class, id);
+ if (trackHasArtist == null) {
+ em.getTransaction().rollback();
+ return false;
+ }
+ em.remove(trackHasArtist);
+ em.getTransaction().commit();
+ logger.debug("TrackHasArtist has been deleted successfully");
+ return true;
+ } catch (Exception e) {
+ em.getTransaction().rollback();
+ logger.error("Error while deleting TrackHasArtist: {}", e.getMessage());
+ throw e;
+ } finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+
+}
diff --git a/src/main/java/com/mediamanager/repository/TrackHasComposerRepository.java b/src/main/java/com/mediamanager/repository/TrackHasComposerRepository.java
new file mode 100644
index 0000000..5ddbe61
--- /dev/null
+++ b/src/main/java/com/mediamanager/repository/TrackHasComposerRepository.java
@@ -0,0 +1,85 @@
+package com.mediamanager.repository;
+
+
+import com.mediamanager.model.TrackHasComposer;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.EntityManagerFactory;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+
+import java.util.List;
+import java.util.Optional;
+
+public class TrackHasComposerRepository {
+ private static final Logger logger = LogManager.getLogger(TrackHasComposerRepository.class);
+
+ private final EntityManagerFactory entityManagerFactory;
+
+ public TrackHasComposerRepository(EntityManagerFactory entityManagerFactory) {
+ this.entityManagerFactory = entityManagerFactory;
+ }
+
+ public TrackHasComposer save(TrackHasComposer trackHasComposer) {
+ logger.debug("Saving TrackHasComposer: {}", trackHasComposer);
+ EntityManager em = entityManagerFactory.createEntityManager();
+ em.getTransaction().begin();
+ try {
+ em.persist(trackHasComposer);
+ em.getTransaction().commit();
+ logger.debug("TrackHasComposer has been saved successfully");
+ return trackHasComposer;
+ } catch (Exception e) {
+ em.getTransaction().rollback();
+ logger.error("Error while saving TrackHasComposer: {}", e.getMessage());
+ throw e;
+ } finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+
+ public List findAll() {
+ logger.debug("Finding All TrackHasComposer");
+ EntityManager em = entityManagerFactory.createEntityManager();
+ try{
+ return em.createQuery("select t from TrackHasComposer t", TrackHasComposer.class).getResultList();
+ }finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+
+ public Optional findById(Integer id) {
+ logger.debug("Finding TrackHasComposer with id: {}", id);
+ EntityManager em = entityManagerFactory.createEntityManager();
+ try{
+ TrackHasComposer trackHasComposer = em.find(TrackHasComposer.class, id);
+ return Optional.ofNullable(trackHasComposer);
+ }finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+
+ public boolean deleteById(Integer id){
+ logger.debug("Deleting TrackHasComposer with id: {}", id);
+ EntityManager em = entityManagerFactory.createEntityManager();
+ em.getTransaction().begin();
+ try{
+ TrackHasComposer trackHasComposer = em.find(TrackHasComposer.class, id);
+ if (trackHasComposer == null) {
+ em.getTransaction().rollback();
+ return false;
+ }
+ em.remove(trackHasComposer);
+ em.getTransaction().commit();
+ logger.debug("TrackHasComposer has been deleted successfully");
+ return true;
+ } catch (Exception e) {
+ em.getTransaction().rollback();
+ logger.error("Error while deleting TrackHasComposer: {}", e.getMessage());
+ throw e;
+ } finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+
+}
diff --git a/src/main/java/com/mediamanager/repository/TrackHasGenreRepository.java b/src/main/java/com/mediamanager/repository/TrackHasGenreRepository.java
new file mode 100644
index 0000000..6437e04
--- /dev/null
+++ b/src/main/java/com/mediamanager/repository/TrackHasGenreRepository.java
@@ -0,0 +1,85 @@
+package com.mediamanager.repository;
+
+
+import com.mediamanager.model.TrackHasGenre;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.EntityManagerFactory;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+
+import java.util.List;
+import java.util.Optional;
+
+public class TrackHasGenreRepository {
+ private static final Logger logger = LogManager.getLogger(TrackHasGenreRepository.class);
+
+ private final EntityManagerFactory entityManagerFactory;
+
+ public TrackHasGenreRepository(EntityManagerFactory entityManagerFactory) {
+ this.entityManagerFactory = entityManagerFactory;
+ }
+
+ public TrackHasGenre save(TrackHasGenre trackHasGenre) {
+ logger.debug("Saving TrackHasGenre: {}", trackHasGenre);
+ EntityManager em = entityManagerFactory.createEntityManager();
+ em.getTransaction().begin();
+ try {
+ em.persist(trackHasGenre);
+ em.getTransaction().commit();
+ logger.debug("TrackHasGenre has been saved successfully");
+ return trackHasGenre;
+ } catch (Exception e) {
+ em.getTransaction().rollback();
+ logger.error("Error while saving TrackHasGenre: {}", e.getMessage());
+ throw e;
+ } finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+
+ public List findAll() {
+ logger.debug("Finding All TrackHasGenre");
+ EntityManager em = entityManagerFactory.createEntityManager();
+ try{
+ return em.createQuery("select t from TrackHasGenre t", TrackHasGenre.class).getResultList();
+ }finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+
+ public Optional findById(Integer id) {
+ logger.debug("Finding TrackHasGenre with id: {}", id);
+ EntityManager em = entityManagerFactory.createEntityManager();
+ try{
+ TrackHasGenre trackHasGenre = em.find(TrackHasGenre.class, id);
+ return Optional.ofNullable(trackHasGenre);
+ }finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+
+ public boolean deleteById(Integer id){
+ logger.debug("Deleting TrackHasGenre with id: {}", id);
+ EntityManager em = entityManagerFactory.createEntityManager();
+ em.getTransaction().begin();
+ try{
+ TrackHasGenre trackHasGenre = em.find(TrackHasGenre.class, id);
+ if (trackHasGenre == null) {
+ em.getTransaction().rollback();
+ return false;
+ }
+ em.remove(trackHasGenre);
+ em.getTransaction().commit();
+ logger.debug("TrackHasGenre has been deleted successfully");
+ return true;
+ } catch (Exception e) {
+ em.getTransaction().rollback();
+ logger.error("Error while deleting TrackHasGenre: {}", e.getMessage());
+ throw e;
+ } finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+
+}
diff --git a/src/main/java/com/mediamanager/repository/TrackRepository.java b/src/main/java/com/mediamanager/repository/TrackRepository.java
new file mode 100644
index 0000000..47dfff8
--- /dev/null
+++ b/src/main/java/com/mediamanager/repository/TrackRepository.java
@@ -0,0 +1,100 @@
+package com.mediamanager.repository;
+
+import com.mediamanager.model.Track;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.EntityManagerFactory;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import java.util.List;
+import java.util.Optional;
+
+public class TrackRepository {
+ private static final Logger logger = LogManager.getLogger(TrackRepository.class);
+
+ private final EntityManagerFactory entityManagerFactory;
+
+ public TrackRepository(EntityManagerFactory entityManagerFactory) {
+ this.entityManagerFactory = entityManagerFactory;
+ }
+
+ public Track save(Track track) {
+ logger.debug("Saving Track: {}", track.getTitle());
+ EntityManager em = entityManagerFactory.createEntityManager();
+ em.getTransaction().begin();
+ try {
+ em.persist(track);
+ em.getTransaction().commit();
+ logger.debug("Track has been saved successfully");
+ return track;
+ } catch (Exception e) {
+ em.getTransaction().rollback();
+ logger.error("Error while saving Track: {}", e.getMessage());
+ throw e;
+ } finally {
+ if (em.isOpen()) em.close();
+ }
+ }
+
+ public List