Go to file
Gustavo Henrique Santos Souza de Miranda adb536e135 Enhance Album entity with bidirectional relationships and partial update support
This commit introduces significant improvements to the Album entity and its
  update functionality, adding bidirectional relationship management with
  AlbumHasArtist and implementing proper partial update semantics using
  protobuf wrapper types.

  Key enhancements:

  Model Layer Improvements:
  - Added OneToMany relationship from Album to AlbumHasArtist
    * Bidirectional mapping with cascade ALL and orphan removal
    * Maintains collection of album-artist associations
  - Implemented helper methods for artist management:
    * addArtist(): creates and adds AlbumHasArtist association
    * removeArtist(): removes association by artist ID
    * getArtists(): convenience method to extract Artist list from associations
  - Added getters/setters for albumArtists collection
  - Improved entity relationship management

  Service Layer Enhancements:
  - Refactored updateAlbum() to support partial updates
  - Added boolean flags to control field updates:
    * updateYear: controls whether year field should be modified
    * updateNumberOfDiscs: controls disc count updates
    * updateAlbumType: controls AlbumType relationship updates
    * updateAlbumArt: controls AlbumArt relationship updates
  - Only updates fields when explicitly provided by client
  - Maintains existing values for non-provided fields
  - Allows explicit null/removal of optional relationships
  - Improved update logic clarity and maintainability

  Handler Layer Improvements (UpdateAlbumHandler):
  - Integrated protobuf wrapper type handling
  - Uses hasYear(), hasNumberOfDiscs(), etc. to detect field presence
  - Extracts values from Int32Value wrappers
  - Passes presence flags to service layer
  - Properly distinguishes between "not provided" and "null/0"
  - Improved code formatting and readability

  Protocol Buffer Enhancements:
  - Added import for google.protobuf.wrappers
  - Changed UpdateAlbumRequest optional fields to wrapper types:
    * year: int32 → google.protobuf.Int32Value
    * number_of_discs: int32 → google.protobuf.Int32Value
    * fk_albumtype_id: int32 → google.protobuf.Int32Value
    * fk_albumart_id: int32 → google.protobuf.Int32Value
  - Enables proper optional field semantics
  - Allows clients to omit fields from update requests
  - Supports explicit null to remove relationships

  Benefits of these changes:
  - Proper partial update support: clients can update only specific fields
  - Prevents unintended field overwrites with default values
  - Bidirectional navigation from Album to Artists
  - Cascade operations for album-artist associations
  - Cleaner API semantics with explicit field presence detection
  - Better alignment with REST PATCH semantics
  - Maintains backward compatibility for required fields

  Example usage:
  - Update only name: provide name, omit other fields
  - Remove AlbumType: provide fk_albumtype_id with value 0 or null
  - Keep existing year: omit year field from request
  - Update multiple fields: provide only the fields to change

  🤖 Generated with [Claude Code](https://claude.com/claude-code)

  Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-07 23:03:14 -03:00
src/main Enhance Album entity with bidirectional relationships and partial update support 2025-12-07 23:03:14 -03:00
.gitignore Register AlbumArtService with service locator and update gitignore 2025-12-07 02:17:29 -03:00
COPYING Add GPLv3 license to project: included `COPYING` file with full license text. 2025-11-13 02:28:26 -03:00
README.md Replace `application.properties` with `config.properties`: 2025-11-13 03:25:33 -03:00
pom.xml Remove `Media` entity and integrate Hibernate ORM into `DatabaseManager`: 2025-11-27 18:40:08 -03:00

README.md

MediaManager Core

A Java-based media management system that uses IPC (Inter-Process Communication) with named pipes and PostgreSQL for data persistence.

Features

  • IPC communication using named pipes
  • PostgreSQL database integration
  • JPA/Hibernate for ORM
  • Log4j 2 for logging
  • HikariCP connection pooling
  • Sample Media entity model

Prerequisites

  • Java 17 or higher
  • Maven 3.6+
  • PostgreSQL 12 or higher

Project Structure

MediaManager-Core/
├── src/
│   └── main/
│       ├── java/
│       │   └── com/
│       │       └── mediamanager/
│       │           ├── config/          # Configuration classes
│       │           ├── model/           # JPA entities
│       │           ├── repository/      # Data access layer
│       │           ├── service/         # Business logic
│       │           ├── ipc/            # IPC implementation
│       │           ├── util/           # Utility classes
│       │           └── MediaManagerApplication.java
│       └── resources/
│           ├── config.properties       # App configuration
│           ├── log4j2.xml              # Logging configuration
│           └── META-INF/
│               └── persistence.xml     # JPA configuration
└── pom.xml

Setup

1. Database Setup

Create a PostgreSQL database and user:

CREATE DATABASE mediamanager;
CREATE USER mediamanager WITH PASSWORD 'changeme';
GRANT ALL PRIVILEGES ON DATABASE mediamanager TO mediamanager;

2. Configuration

Edit src/main/resources/config.properties and update the database credentials:

db.url=jdbc:postgresql://localhost:5432/mediamanager
db.username=mediamanager
db.password=your_password_here

3. Build the Project

mvn clean install

4. Run the Application

mvn exec:java -Dexec.mainClass="com.mediamanager.MediaManagerApplication"

Or build and run the JAR:

mvn clean package
java -jar target/MediaManager-Core-0.0.1-SNAPSHOT.jar

IPC Configuration

The application creates named pipes for inter-process communication. Default configuration:

  • Pipe path: /tmp/mediamanager
  • Pipe name: mediamanager-pipe
  • Buffer size: 8192 bytes

You can modify these settings in config.properties.

Logging

Logs are written to:

  • Console (STDOUT)
  • logs/mediamanager.log (rotating daily, max 10MB per file)

Log configuration can be modified in src/main/resources/log4j2.xml.

Development

Adding New Entities

  1. Create entity class in com.mediamanager.model
  2. Add the entity class to persistence.xml
  3. Create corresponding repository and service classes

Running Tests

mvn test

Dependencies

  • PostgreSQL Driver: 42.7.5
  • Hibernate ORM: 7.1.7.Final
  • HikariCP: 5.1.0
  • Log4j 2: 2.23.1
  • Jackson: 2.16.1
  • JUnit 5: 5.10.2

License

TBD

TODO

  • Implement IPC server with named pipes
  • Implement database connection manager
  • Create repository layer
  • Create service layer
  • Add comprehensive tests
  • Add API documentation