Compare commits

..
Author SHA1 Message Date
Gustavo Henrique Mirandaandcoderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> c62c5a20b3 Update src/main/java/com/mediamanager/model/TrackHasComposer.java
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
2025-12-09 19:33:52 -03:00
Gustavo Henrique Santos Souza de Miranda 2ee94c8331 Fix missing closing braces in Delete handlers
Fix compilation errors caused by missing or malformed class-closing braces
  in three Delete handler classes. These syntax errors prevented the classes
  from compiling properly.

  Changes:
  - DeleteTrackHasGenreHandler: Remove duplicate closing brace at line 62
    and ensure proper class-closing brace structure
  - DeleteTrackHasArtistHandler: Add missing class-closing brace at end of file
  - DeleteTrackHasComposerHandler: Add missing class-closing brace at end of file

  All three handlers now have correct brace structure:
    - Catch block closing brace (8 spaces indentation)
    - handle() method closing brace (4 spaces indentation)
    - Class closing brace (0 spaces indentation)

  This ensures all three classes compile successfully without syntax errors.

  Modified:
  - src/main/java/com/mediamanager/service/delegate/handler/trackhasgenre/DeleteTrackHasGenreHandler.java
  - src/main/java/com/mediamanager/service/delegate/handler/trackhasartist/DeleteTrackHasArtistHandler.java
  - src/main/java/com/mediamanager/service/delegate/handler/trackhascomposer/DeleteTrackHasComposerHandler.java

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

  Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-09 19:25:49 -03:00
Gustavo Henrique Santos Souza de Miranda be24b68923 Add ID validation to GetTrackHasGenreByIdHandler
Add validation to reject ID values <= 0 in GetTrackHasGenreByIdHandler
  before calling the service layer. This prevents the protobuf default value
  of 0 from being processed, which would incorrectly pass the null check in
  the service but represents an invalid ID.

  Changes:
  - Extract ID from GetTrackHasGenreByIdRequest and validate id <= 0
  - Throw IllegalArgumentException with message "ID must be greater than 0"
    if validation fails
  - Add specific catch block for IllegalArgumentException that returns
    HTTP 400 status code with "Validation error: " prefix
  - Mirrors validation pattern from CreateTrackHasGenreHandler

  This aligns with validation patterns used in similar handlers throughout
  the codebase (GetTrackHasArtistByIdHandler, GetTrackHasComposerByIdHandler)
  and ensures consistent error handling for invalid ID inputs.

  Modified:
  - src/main/java/com/mediamanager/service/delegate/handler/trackhasgenre/GetTrackHasGenreByIdHandler.java

  🤖 Generated with [Claude Code](https://claude.com/claude-code)
2025-12-09 19:21:04 -03:00
Gustavo Henrique Mirandaandcoderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> 19ddf262df Update src/main/java/com/mediamanager/service/delegate/handler/trackhasgenre/GetTrackHasGenreByIdHandler.java
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
2025-12-09 19:18:40 -03:00
Gustavo Henrique Mirandaandcoderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> b2571de6ad Update src/main/java/com/mediamanager/model/TrackHasGenre.java
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
2025-12-09 19:15:46 -03:00
Gustavo Henrique Mirandaandcoderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> b759f0f770 Update src/main/java/com/mediamanager/service/delegate/handler/trackhasartist/DeleteTrackHasArtistHandler.java
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
2025-12-09 19:15:25 -03:00
Gustavo Henrique Mirandaandcoderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> e994f4ef70 Update src/main/java/com/mediamanager/service/delegate/handler/trackhascomposer/DeleteTrackHasComposerHandler.java
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
2025-12-09 19:14:54 -03:00
Gustavo Henrique Mirandaandcoderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> 1bbbc4f2db Update src/main/java/com/mediamanager/model/TrackHasArtist.java
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
2025-12-09 19:14:37 -03:00
Gustavo Henrique Santos Souza de Miranda 80ee003fc9 Implement trackhascomposer relationship management
Add complete implementation for track-composer relationship management,
  following the established trackhasgenre pattern. This enables tracking
  which composers are associated with each track in the media library.

  Changes:
  - Enhance TrackHasComposer model: Add @Entity and @Table annotations,
    nullable constraints, constructor, and toString method
  - Implement TrackHasComposerRepository with full CRUD operations
  - Implement TrackHasComposerService with business logic and validation
  - Add TrackHasComposerMapper for entity/protobuf conversion
  - Create action handlers:
    * CreateTrackHasComposerHandler (trackhascomposer.create)
    * DeleteTrackHasComposerHandler (trackhascomposer.delete)
    * GetTrackHasComposerByIdHandler (trackhascomposer.getById)
    * GetTrackHasComposerHandler (trackhascomposer.getAll)
  - Register TrackHasComposerService in DelegateActionManager for
    automatic handler discovery and dependency injection
  - Proto file (trackhascomposer.proto) was already correct

  The implementation validates track and composer existence before creating
  relationships and provides proper error handling with appropriate HTTP
  status codes.

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

  Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-09 16:43:47 -03:00
Gustavo Henrique Santos Souza de Miranda 7fd3c3e9f7 Implement trackhasartist relationship management
Add complete implementation for track-artist relationship management,
  following the established albumhasgenre pattern. This enables tracking
  which artists are associated with each track in the media library.

  Changes:
  - Fix TrackHasArtist model: Rename from TrackHasArtistt.java (typo)
    and correct table name from "trackhasgenre" to "trackhasartist"
  - Implement TrackHasArtistRepository with full CRUD operations
  - Implement TrackHasArtistService with business logic and validation
  - Add TrackHasArtistMapper for entity/protobuf conversion
  - Create action handlers:
    * CreateTrackHasArtistHandler (trackhasartist.create)
    * DeleteTrackHasArtistHandler (trackhasartist.delete)
    * GetTrackHasArtistByIdHandler (trackhasartist.getById)
    * GetTrackHasArtistHandler (trackhasartist.getAll)
  - Register TrackHasArtistService in DelegateActionManager for
    automatic handler discovery and dependency injection
  - Proto file (trackhasartist.proto) was already correct

  The implementation validates track and artist existence before creating
  relationships and provides proper error handling with appropriate HTTP
  status codes.

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

  Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-09 02:44:57 -03:00
Gustavo Henrique Santos Souza de Miranda e0799828d0 Implement trackhasgenre relationship management
Add complete implementation for track-genre relationship management,
  following the established albumhasgenre pattern. This enables tracking
  which genres are associated with each track in the media library.

  Changes:
  - Fix trackhasgenre.proto: Correct CreateTrackHasGenreRequest to use
    fk_track_id instead of fk_album_id
  - Enhance TrackHasGenre model with nullable constraints, constructor,
    and toString method
  - Implement TrackHasGenreRepository with full CRUD operations
  - Implement TrackHasGenreService with business logic and validation
  - Add TrackHasGenreMapper for entity/protobuf conversion
  - Create action handlers:
    * CreateTrackHasGenreHandler (trackhasgenre.create)
    * DeleteTrackHasGenreHandler (trackhasgenre.delete)
    * GetTrackHasGenreByIdHandler (trackhasgenre.getById)
    * GetTrackHasGenreHandler (trackhasgenre.getAll)
  - Register TrackHasGenreService in DelegateActionManager for
    automatic handler discovery and dependency injection

  The implementation validates track and genre existence before creating
  relationships and provides proper error handling with appropriate HTTP
  status codes.

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

  Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-09 02:24:40 -03:00
Gustavo Henrique Miranda a804d76905 Merge pull request #28 from gmbrax/develop
Develop
2025-12-08 20:59:28 -03:00
Gustavo Henrique Miranda ae6f522901 Merge pull request #27 from gmbrax/fix/fix-CreateDiscHandler-Extra-Brace
Fix/fix create disc handler extra brace
2025-12-08 20:58:06 -03:00
Gustavo Henrique Santos Souza de Miranda fd71114426 Fix extra closing brace in CreateDiscHandler
Remove duplicate closing brace at end of CreateDiscHandler.java
  that was causing a syntax error.
2025-12-08 20:55:45 -03:00
Gustavo Henrique Miranda 2e0a39a455 Merge pull request #26 from gmbrax/develop
Develop
2025-12-08 20:51:38 -03:00
Gustavo Henrique Miranda eebe142b8c Merge branch 'feature/Implement-track-management' into develop 2025-12-08 20:51:21 -03:00
Gustavo Henrique Miranda 4073c53b3d Merge pull request #25 from gmbrax/feature/Implement-disc-management
Implement Disc entity with complete CRUD operations
2025-12-08 20:49:08 -03:00
Gustavo Henrique Santos Souza de Miranda 8208b58b34 Implement Track entity with complete CRUD operations
Add full Track implementation following the established pattern from Disc and Album entities.

  Components added:
  - Track entity model with relationships to Disc, Composer, BitDepth, BitRate, and SamplingRate
  - TrackRepository for data access layer with full CRUD operations
  - TrackService with business logic and validation
  - TrackMapper for protobuf/entity conversion
  - track.proto with all protobuf message definitions
  - Five action handlers: Create, GetAll, GetById, Update, Delete
  - TrackService registration in DelegateActionManager

  The Track entity supports:
  - Required fields: trackNumber, title, filepath, discId
  - Optional fields: duration, composerId, bitDepthId, bitRateId, samplingRateId
  - Full transaction management and error handling
  - Proper validation and logging throughout all layers
2025-12-08 20:43:08 -03:00
Gustavo Henrique Mirandaandcoderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> dfa4185e64 Update src/main/java/com/mediamanager/service/delegate/handler/disc/CreateDiscHandler.java
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
2025-12-08 20:42:23 -03:00
Gustavo Henrique Santos Souza de Miranda 07f7405b03 Implement Disc entity with complete CRUD operations
Add full implementation for Disc entity following existing patterns:
  - Create Disc model with Album relationship
  - Add DiscRepository for data persistence
  - Implement DiscService with business logic
  - Create DiscMapper for protobuf conversion
  - Add all handler classes (Create, Get, GetById, Update, Delete)
  - Register DiscService in DelegateActionManager
  - Define disc.proto with all message types

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

  Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-08 17:45:04 -03:00
Gustavo Henrique Miranda 61c5124d27 Merge pull request #24 from gmbrax/fix/fix-broken-album-method
Fix broken removeGenre implementation in Album entity
2025-12-08 00:39:31 -03:00
Gustavo Henrique Santos Souza de Miranda 8119530bef Fix broken removeGenre to correct logic for the null-pointer exception 2025-12-08 00:37:05 -03:00
Gustavo Henrique Santos Souza de Miranda 09d20efba6 Fix broken removeGenre to avoid possible null-pointer 2025-12-08 00:33:23 -03:00
Gustavo Henrique Santos Souza de Miranda bcd03fc7ce Fix broken removeGenre implementation in Album entity 2025-12-08 00:22:42 -03:00
Gustavo Henrique Miranda d70fae0719 Merge pull request #23 from gmbrax/feature/Implement-Album-Management
Implement Album management with full CRUD operations
2025-12-08 00:16:02 -03:00
Gustavo Henrique Miranda 9e3516aacb Enhance genre removal logic in Album class
Update removeGenre method to check for null IDs.
2025-12-08 00:14:51 -03:00
Gustavo Henrique Mirandaandcoderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> 7b7d1e7348 Update src/main/java/com/mediamanager/model/Album.java
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
2025-12-08 00:11:47 -03:00
Gustavo Henrique Santos Souza de Miranda e51d5aa678 Add bidirectional Genre relationship to Album entity
This commit extends the Album entity with bidirectional relationship
  management for the AlbumHasGenre join table, enabling many-to-many
  associations between albums and genres with convenient helper methods.

  Key enhancements:

  Relationship Mapping:
  - Added OneToMany relationship from Album to AlbumHasGenre
    * Bidirectional mapping with cascade ALL and orphan removal
    * Maintains collection of album-genre associations
    * Initialized as ArrayList to prevent null pointer exceptions
    * Follows the same pattern as albumArtists relationship

  Helper Methods for Genre Management:
  - addGenre(Genre genre):
    * Creates AlbumHasGenre join table entry
    * Sets bidirectional references to Album and Genre
    * Adds association to albumGenres collection
    * Simplifies adding genres to albums programmatically

  - removeGenre(Genre genre):
    * Removes association by comparing genre IDs
    * Safely handles null checks
    * Uses removeIf for clean collection manipulation
    * Maintains referential integrity

  - getGenres():
    * Convenience method to extract Genre list from join table
    * Uses Java streams for clean transformation
    * Maps AlbumHasGenre → Genre
    * Returns List<Genre> for easy consumption

  Collection Management:
  - Added getAlbumGenres() getter
    * Returns full List<AlbumHasGenre> for direct access
    * Useful for repository-level operations

  - Added setAlbumGenres() setter
    * Allows bulk replacement of genre associations
    * Required by JPA for entity hydration

  Benefits:
  - Enables navigating from Album to associated Genres
  - Simplifies genre association management in service layer
  - Cascade operations ensure join table entries are managed automatically
  - Orphan removal prevents orphaned join table entries
  - Consistent API with existing Artist relationship methods
  - Type-safe genre management through helper methods

  Pattern Consistency:
  This implementation mirrors the albumArtists relationship structure,
  providing a consistent API for managing both artist and genre associations
  on the Album entity. Both relationships use the same cascade and orphan
  removal strategies for reliable data integrity.

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

  Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>

  This commit message is ready to use in IntelliJ for the Album.java changes!
2025-12-07 23:31:07 -03:00
Gustavo Henrique Santos Souza de Miranda a102b24ecd Implement AlbumHasGenre relationship management with CRUD operations
This commit introduces the AlbumHasGenre join table entity management,
  establishing the many-to-many relationship between Album and Genre
  entities. This implementation follows the established repository pattern
  used for other join table entities like AlbumHasArtist.

  Key components implemented:

  Model Layer:
  - AlbumHasGenre entity representing the join table
  - ManyToOne relationships to Album and Genre entities
  - JPA annotations with proper foreign key constraints (nullable = false)
  - Complete getters and setters
  - Custom toString method for debugging

  Repository Layer:
  - AlbumHasGenreRepository with EntityManager-based operations
  - Full transaction management with proper rollback handling
  - Methods: save, findAll, findById, deleteById
  - No update method (join tables typically only need create/delete)

  Service Layer:
  - AlbumHasGenreService with business logic and validation
  - Constructor injection of AlbumHasGenreRepository, AlbumRepository, GenreRepository
  - Relationship validation: ensures both Album and Genre exist before creating association
  - Input validation for null/invalid IDs
  - ID validation for all operations requiring entity lookup
  - Comprehensive logging using Log4j2

  Mapper Layer:
  - AlbumHasGenreMapper for bidirectional entity/protobuf conversion
  - Foreign key mapping for Album and Genre relationships
  - Null safety checks and validation
  - Proper handling of optional ID field

  Action Handlers:
  - CreateAlbumHasGenreHandler (albumhasgenre.create)
  - GetAlbumHasGenreHandler (albumhasgenre.getAll)
  - GetAlbumHasGenreByIdHandler (albumhasgenre.getById)
  - DeleteAlbumHasGenreHandler (albumhasgenre.delete)
  - HTTP status code handling: 200 (success), 400 (validation),
    404 (not found), 500 (server error)
  - No update handler as join tables typically only require create/delete operations

  Protocol Buffers:
  - Complete proto definition with AlbumHasGenreMessages
  - Messages support fk_album_id and fk_genre_id foreign keys
  - CRUD message definitions (Create, Get, GetById, Delete)
  - No Update messages as per join table requirements

  Service Registration:
  - AlbumHasGenreRepository initialized with EntityManagerFactory
  - AlbumHasGenreService registered with ServiceLocator with required dependencies
  - Ensures all AlbumHasGenre action handlers can resolve dependencies
  - Proper dependency injection of AlbumRepository and GenreRepository

  The implementation follows best practices with proper error handling,
  logging, validation, relationship integrity checks, and consistency with
  existing codebase patterns. This enables proper many-to-many relationship
  management between albums and genres, allowing albums to be associated
  with multiple genres and vice versa.

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

  Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-07 23:24:52 -03:00
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
Gustavo Henrique Santos Souza de MirandaandClaude Sonnet 4.5 f31c657d61 Implement AlbumHasArtist relationship management with CRUD operations
This commit introduces the AlbumHasArtist join table entity management,
establishing the many-to-many relationship between Album and Artist
entities. This implementation follows the established repository pattern
used for other entities.

Key components implemented:

Model Layer:
- AlbumHasArtist entity representing the join table
- ManyToOne relationships to Album and Artist entities
- JPA annotations with proper foreign key constraints
- Complete getters and setters
- Custom toString method for debugging

Repository Layer:
- AlbumHasArtistRepository with EntityManager-based operations
- Full transaction management with proper rollback handling
- Methods: save, findAll, findById, deleteById
- No update method (join tables typically only need create/delete)

Service Layer:
- AlbumHasArtistService with business logic and validation
- Constructor injection of AlbumHasArtistRepository, AlbumRepository, ArtistRepository
- Relationship validation: ensures both Album and Artist exist before creating association
- Input validation for null/invalid IDs
- ID validation for all operations requiring entity lookup
- Comprehensive logging using Log4j2

Mapper Layer:
- AlbumHasArtistMapper for bidirectional entity/protobuf conversion
- Foreign key mapping for Album and Artist relationships
- Null safety checks and validation
- Proper handling of optional ID field

Action Handlers:
- CreateAlbumHasArtistHandler (albumhasartist.create)
- GetAlbumHasArtistHandler (albumhasartist.getAll)
- GetAlbumHasArtistByIdHandler (albumhasartist.getById)
- DeleteAlbumHasArtistHandler (albumhasartist.delete)
- HTTP status code handling: 200 (success), 400 (validation),
  404 (not found), 500 (server error)
- No update handler as join tables typically only require create/delete operations

Protocol Buffers:
- Complete proto definition with AlbumHasArtistMessages
- Messages support album_id and artist_id foreign keys
- CRUD message definitions (Create, Get, GetById, Delete)
- No Update messages as per join table requirements

Service Registration:
- AlbumHasArtistRepository initialized with EntityManagerFactory
- AlbumHasArtistService registered with ServiceLocator with required dependencies
- Ensures all AlbumHasArtist action handlers can resolve dependencies
- Proper dependency injection of AlbumRepository and ArtistRepository

The implementation follows best practices with proper error handling,
logging, validation, relationship integrity checks, and consistency with
existing codebase patterns. This enables proper many-to-many relationship
management between albums and artists.

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

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-07 21:03:20 -03:00
Gustavo Henrique Miranda dccbfcf546 Merge pull request #22 from gmbrax/feature/Implement-AlbumType-Management
Implement AlbumType management with full CRUD operations
2025-12-07 20:09:01 -03:00
Gustavo Henrique Santos Souza de MirandaandClaude Sonnet 4.5 21f5b93f48 Implement Album management with full CRUD operations
This commit introduces comprehensive Album entity management following
the established repository pattern used for other entities like AlbumType
and SamplingRate. The Album entity includes relationships with AlbumType
and AlbumArt entities.

Key components implemented:

Model Layer:
- Album entity with complete field set:
  * Basic fields: id, name, year, numberOfDiscs, code, isCompilation
  * Foreign key relationships: AlbumType and AlbumArt (ManyToOne)
  * Audit timestamps: createdAt, updatedAt with JPA lifecycle hooks
- JPA annotations with @PrePersist and @PreUpdate for automatic timestamps
- Complete getters and setters

Repository Layer:
- AlbumRepository with EntityManager-based operations
- Full transaction management with proper rollback handling
- Methods: save, findAll, findById, update, deleteById

Service Layer:
- AlbumService with business logic and validation
- Constructor injection of AlbumRepository, AlbumTypeRepository, AlbumArtRepository
- Relationship handling: validates and sets AlbumType and AlbumArt entities
- Input validation for null/empty name field
- ID validation for all operations requiring entity lookup
- Comprehensive logging using Log4j2

Mapper Layer:
- AlbumMapper for bidirectional entity/protobuf conversion
- Timestamp conversion between LocalDateTime and epoch milliseconds
- Foreign key mapping for AlbumType and AlbumArt relationships
- Null safety checks and validation
- Proper handling of optional fields

Action Handlers:
- CreateAlbumHandler (album.create)
- GetAlbumHandler (album.getAll)
- GetAlbumByIdHandler (album.getById)
- UpdateAlbumHandler (album.update)
- DeleteAlbumHandler (album.delete)
- HTTP status code handling: 200 (success), 400 (validation),
  404 (not found), 500 (server error)
- Handles optional fields with proper default value checks

Protocol Buffers:
- Fixed proto definition with correct Album fields
- CreateAlbumRequest and UpdateAlbumRequest with all entity fields
- All CRUD message definitions (Create, Get, GetById, Update, Delete)
- Support for foreign keys and timestamps

Service Registration:
- AlbumRepository initialized with EntityManagerFactory
- AlbumService registered with ServiceLocator with required dependencies
- Ensures all Album action handlers can resolve dependencies

The implementation follows best practices with proper error handling,
logging, validation, relationship management, and consistency with
existing codebase patterns.

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

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-07 20:07:34 -03:00
Gustavo Henrique Santos Souza de MirandaandClaude Sonnet 4.5 7446047b9d Implement AlbumType management with full CRUD operations
This commit introduces comprehensive AlbumType entity management following
the established repository pattern used for other entities like SamplingRate
and AlbumArt.

Key components implemented:

Model Layer:
- AlbumType entity with id and value fields
- JPA annotations for database persistence
- Complete getters and setters

Repository Layer:
- AlbumTypeRepository with EntityManager-based operations
- Full transaction management with proper rollback handling
- Methods: save, findAll, findById, update, deleteById

Service Layer:
- AlbumTypeService with business logic and validation
- Input validation for null/empty value fields
- ID validation for all operations requiring entity lookup
- Comprehensive logging using Log4j2

Mapper Layer:
- AlbumTypeMapper for bidirectional entity/protobuf conversion
- Null safety checks and validation
- Proper handling of optional ID field

Action Handlers:
- CreateAlbumTypeHandler (albumtype.create)
- GetAlbumTypeHandler (albumtype.getAll)
- GetAlbumTypeByIdHandler (albumtype.getById)
- UpdateAlbumTypeHandler (albumtype.update)
- DeleteAlbumTypeHandler (albumtype.delete)
- HTTP status code handling: 200 (success), 400 (validation),
  404 (not found), 500 (server error)

Protocol Buffers:
- Complete proto definition with AlbumTypeMessages
- All CRUD message definitions (Create, Get, GetById, Update, Delete)

Service Registration:
- AlbumTypeRepository initialized with EntityManagerFactory
- AlbumTypeService registered with ServiceLocator for dependency injection
- Ensures all AlbumType action handlers can resolve dependencies

The implementation follows best practices with proper error handling,
logging, validation, and consistency with existing codebase patterns.

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

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-07 13:15:01 -03:00
Gustavo Henrique Miranda f43c609e04 Merge pull request #21 from gmbrax/feature/Implement-AlbumArt-Management
Feature/implement album art management
2025-12-07 02:34:38 -03:00
86 changed files with 5853 additions and 0 deletions
@@ -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;
}
}
@@ -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;
}
}
@@ -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;
}
}
@@ -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;
}
}
@@ -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;
}
}
@@ -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;
}
}
@@ -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;
}
}
@@ -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;
}
}
@@ -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;
}
}
@@ -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<AlbumHasArtist> albumArtists = new ArrayList<>();
// Relacionamento ManyToMany com Genre através da tabela de junção
@OneToMany(mappedBy = "album", cascade = CascadeType.ALL, orphanRemoval = true)
private List<AlbumHasGenre> 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<Artist> 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<Genre> 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<AlbumHasArtist> getAlbumArtists() {
return albumArtists;
}
public void setAlbumArtists(List<AlbumHasArtist> albumArtists) {
this.albumArtists = albumArtists;
}
// ========== ADICIONE ESSES GETTERS/SETTERS ==========
public List<AlbumHasGenre> getAlbumGenres() {
return albumGenres;
}
public void setAlbumGenres(List<AlbumHasGenre> 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 +
'}';
}
}
@@ -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) +
'}';
}
}
@@ -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) +
'}';
}
}
@@ -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;
}
}
@@ -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;
}
}
@@ -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;
}
}
@@ -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) +
'}';
}
}
@@ -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) +
'}';
}
}
@@ -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) +
'}';
}
}
@@ -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<AlbumHasArtist> 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<AlbumHasArtist> 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();
}
}
}
@@ -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<AlbumHasGenre> 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<AlbumHasGenre> 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();
}
}
}
@@ -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<Album> 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<Album> 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();
}
}
}
@@ -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<AlbumType> 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<AlbumType> 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();
}
}
}
@@ -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<Disc> 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<Disc> 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();
}
}
}
@@ -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<TrackHasArtist> 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<TrackHasArtist> 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();
}
}
}
@@ -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<TrackHasComposer> 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<TrackHasComposer> 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();
}
}
}
@@ -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<TrackHasGenre> 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<TrackHasGenre> 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();
}
}
}
@@ -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<Track> findAll() {
logger.debug("Finding All Track");
EntityManager em = entityManagerFactory.createEntityManager();
try{
return em.createQuery("select t from Track t", Track.class).getResultList();
}finally {
if (em.isOpen()) em.close();
}
}
public Optional<Track> findById(Integer id) {
logger.debug("Finding Track with id: {}", id);
EntityManager em = entityManagerFactory.createEntityManager();
try{
Track track = em.find(Track.class, id);
return Optional.ofNullable(track);
}finally {
if (em.isOpen()) em.close();
}
}
public Track update(Track track) {
logger.debug("Updating Track: {}", track.getTitle());
EntityManager em = entityManagerFactory.createEntityManager();
em.getTransaction().begin();
try {
Track updated = em.merge(track);
em.getTransaction().commit();
logger.debug("Track has been updated successfully");
return updated;
} catch (Exception e) {
em.getTransaction().rollback();
logger.error("Error while updating Track: {}", e.getMessage());
throw e;
} finally {
if (em.isOpen()) em.close();
}
}
public boolean deleteById(Integer id){
logger.debug("Deleting Track with id: {}", id);
EntityManager em = entityManagerFactory.createEntityManager();
em.getTransaction().begin();
try{
Track track = em.find(Track.class, id);
if (track == null) {
em.getTransaction().rollback();
return false;
}
em.remove(track);
em.getTransaction().commit();
logger.debug("Track has been deleted successfully");
return true;
} catch (Exception e) {
em.getTransaction().rollback();
logger.error("Error while deleting Track: {}", e.getMessage());
throw e;
} finally {
if (em.isOpen()) em.close();
}
}
}
@@ -0,0 +1,153 @@
package com.mediamanager.service.album;
import com.mediamanager.model.Album;
import com.mediamanager.model.AlbumArt;
import com.mediamanager.model.AlbumType;
import com.mediamanager.repository.AlbumRepository;
import com.mediamanager.repository.AlbumArtRepository;
import com.mediamanager.repository.AlbumTypeRepository;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.util.List;
import java.util.Optional;
public class AlbumService {
private static final Logger logger = LogManager.getLogger(AlbumService.class);
private final AlbumRepository repository;
private final AlbumTypeRepository albumTypeRepository;
private final AlbumArtRepository albumArtRepository;
public AlbumService(AlbumRepository repository, AlbumTypeRepository albumTypeRepository, AlbumArtRepository albumArtRepository) {
this.repository = repository;
this.albumTypeRepository = albumTypeRepository;
this.albumArtRepository = albumArtRepository;
}
public Album createAlbum(String name, Integer year, Integer numberOfDiscs, String code, Boolean isCompilation, Integer albumTypeId, Integer albumArtId) {
logger.debug("Creating album:{}", name);
if (name == null || name.trim().isEmpty()) {
throw new IllegalArgumentException("Album name cannot be null or empty");
}
Album album = new Album();
album.setName(name);
album.setYear(year);
album.setNumberOfDiscs(numberOfDiscs);
album.setCode(code);
album.setIsCompilation(isCompilation);
// Set AlbumType if provided
if (albumTypeId != null && albumTypeId > 0) {
Optional<AlbumType> albumType = albumTypeRepository.findById(albumTypeId);
if (albumType.isEmpty()) {
throw new IllegalArgumentException("AlbumType not found with id: " + albumTypeId);
}
album.setAlbumType(albumType.get());
}
// Set AlbumArt if provided
if (albumArtId != null && albumArtId > 0) {
Optional<AlbumArt> albumArt = albumArtRepository.findById(albumArtId);
if (albumArt.isEmpty()) {
throw new IllegalArgumentException("AlbumArt not found with id: " + albumArtId);
}
album.setAlbumArt(albumArt.get());
}
return repository.save(album);
}
public List<Album> getAllAlbums() {
logger.info("Getting all albums");
return repository.findAll();
}
public Optional<Album> getAlbumById(Integer id) {
if (id == null) {
throw new IllegalArgumentException("ID cannot be null");
}
logger.info("Getting album by id:{}", id);
return repository.findById(id);
}
public Optional<Album> updateAlbum(Integer id, String name, Integer year,
Integer numberOfDiscs, String code,
Boolean isCompilation, Integer albumTypeId,
Integer albumArtId,
boolean updateYear, // ← Novo!
boolean updateNumberOfDiscs, // ← Novo!
boolean updateAlbumType, // ← Novo!
boolean updateAlbumArt) { // ← Novo!
if (id == null) {
throw new IllegalArgumentException("ID cannot be null");
}
logger.info("Updating album: {}", name);
if (name == null || name.trim().isEmpty()) {
throw new IllegalArgumentException("Album name cannot be null or empty");
}
Optional<Album> existingAlbum = repository.findById(id);
if (existingAlbum.isEmpty()) {
logger.warn("Album not found with id: {}", id);
return Optional.empty();
}
Album album = existingAlbum.get();
album.setName(name);
album.setCode(code);
album.setIsCompilation(isCompilation);
// Atualiza year SOMENTE se o campo foi fornecido
if (updateYear) {
album.setYear(year);
}
// Atualiza numberOfDiscs SOMENTE se o campo foi fornecido
if (updateNumberOfDiscs) {
album.setNumberOfDiscs(numberOfDiscs);
}
// Update AlbumType SOMENTE se o campo foi fornecido
if (updateAlbumType) {
if (albumTypeId != null && albumTypeId > 0) {
Optional<AlbumType> albumType = albumTypeRepository.findById(albumTypeId);
if (albumType.isEmpty()) {
throw new IllegalArgumentException("AlbumType not found with id: " + albumTypeId);
}
album.setAlbumType(albumType.get());
} else {
// Explicitamente passado como 0 ou null = remover a relação
album.setAlbumType(null);
}
}
// Se não foi fornecido, mantém o existente
// Update AlbumArt SOMENTE se o campo foi fornecido
if (updateAlbumArt) {
if (albumArtId != null && albumArtId > 0) {
Optional<AlbumArt> albumArt = albumArtRepository.findById(albumArtId);
if (albumArt.isEmpty()) {
throw new IllegalArgumentException("AlbumArt not found with id: " + albumArtId);
}
album.setAlbumArt(albumArt.get());
} else {
// Explicitamente passado como 0 ou null = remover a relação
album.setAlbumArt(null);
}
}
// Se não foi fornecido, mantém o existente
Album updatedAlbum = repository.update(album);
return Optional.of(updatedAlbum);
}
public boolean deleteAlbum(Integer id) {
if (id == null) {
throw new IllegalArgumentException("Album id cannot be null");
}
logger.info("Deleting album:{}", id);
return repository.deleteById(id);
}
}
@@ -0,0 +1,77 @@
package com.mediamanager.service.albumhasartist;
import com.mediamanager.model.Album;
import com.mediamanager.model.AlbumHasArtist;
import com.mediamanager.model.Artist;
import com.mediamanager.repository.AlbumHasArtistRepository;
import com.mediamanager.repository.AlbumRepository;
import com.mediamanager.repository.ArtistRepository;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.util.List;
import java.util.Optional;
public class AlbumHasArtistService {
private static final Logger logger = LogManager.getLogger(AlbumHasArtistService.class);
private final AlbumHasArtistRepository repository;
private final AlbumRepository albumRepository;
private final ArtistRepository artistRepository;
public AlbumHasArtistService(AlbumHasArtistRepository repository, AlbumRepository albumRepository, ArtistRepository artistRepository) {
this.repository = repository;
this.albumRepository = albumRepository;
this.artistRepository = artistRepository;
}
public AlbumHasArtist createAlbumHasArtist(Integer albumId, Integer artistId) {
logger.debug("Creating album has artist relationship - albumId:{}, artistId:{}", albumId, artistId);
if (albumId == null || albumId <= 0) {
throw new IllegalArgumentException("Album ID cannot be null or invalid");
}
if (artistId == null || artistId <= 0) {
throw new IllegalArgumentException("Artist ID cannot be null or invalid");
}
// Verify Album exists
Optional<Album> album = albumRepository.findById(albumId);
if (album.isEmpty()) {
throw new IllegalArgumentException("Album not found with id: " + albumId);
}
// Verify Artist exists
Optional<Artist> artist = artistRepository.findById(artistId);
if (artist.isEmpty()) {
throw new IllegalArgumentException("Artist not found with id: " + artistId);
}
AlbumHasArtist albumHasArtist = new AlbumHasArtist();
albumHasArtist.setAlbum(album.get());
albumHasArtist.setArtist(artist.get());
return repository.save(albumHasArtist);
}
public List<AlbumHasArtist> getAllAlbumHasArtists() {
logger.info("Getting all album has artist relationships");
return repository.findAll();
}
public Optional<AlbumHasArtist> getAlbumHasArtistById(Integer id) {
if (id == null) {
throw new IllegalArgumentException("ID cannot be null");
}
logger.info("Getting album has artist by id:{}", id);
return repository.findById(id);
}
public boolean deleteAlbumHasArtist(Integer id) {
if (id == null) {
throw new IllegalArgumentException("Album has artist id cannot be null");
}
logger.info("Deleting album has artist:{}", id);
return repository.deleteById(id);
}
}
@@ -0,0 +1,77 @@
package com.mediamanager.service.albumhasgenre;
import com.mediamanager.model.Album;
import com.mediamanager.model.AlbumHasGenre;
import com.mediamanager.model.Genre;
import com.mediamanager.repository.AlbumHasGenreRepository;
import com.mediamanager.repository.AlbumRepository;
import com.mediamanager.repository.GenreRepository;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.util.List;
import java.util.Optional;
public class AlbumHasGenreService {
private static final Logger logger = LogManager.getLogger(AlbumHasGenreService.class);
private final AlbumHasGenreRepository repository;
private final AlbumRepository albumRepository;
private final GenreRepository genreRepository;
public AlbumHasGenreService(AlbumHasGenreRepository repository, AlbumRepository albumRepository, GenreRepository genreRepository) {
this.repository = repository;
this.albumRepository = albumRepository;
this.genreRepository = genreRepository;
}
public AlbumHasGenre createAlbumHasGenre(Integer albumId, Integer genreId) {
logger.debug("Creating album has genre relationship - albumId:{}, genreId:{}", albumId, genreId);
if (albumId == null || albumId <= 0) {
throw new IllegalArgumentException("Album ID cannot be null or invalid");
}
if (genreId == null || genreId <= 0) {
throw new IllegalArgumentException("Genre ID cannot be null or invalid");
}
// Verify Album exists
Optional<Album> album = albumRepository.findById(albumId);
if (album.isEmpty()) {
throw new IllegalArgumentException("Album not found with id: " + albumId);
}
// Verify Genre exists
Optional<Genre> genre = genreRepository.findById(genreId);
if (genre.isEmpty()) {
throw new IllegalArgumentException("Genre not found with id: " + genreId);
}
AlbumHasGenre albumHasGenre = new AlbumHasGenre();
albumHasGenre.setAlbum(album.get());
albumHasGenre.setGenre(genre.get());
return repository.save(albumHasGenre);
}
public List<AlbumHasGenre> getAllAlbumHasGenres() {
logger.info("Getting all album has genre relationships");
return repository.findAll();
}
public Optional<AlbumHasGenre> getAlbumHasGenreById(Integer id) {
if (id == null) {
throw new IllegalArgumentException("ID cannot be null");
}
logger.info("Getting album has genre by id:{}", id);
return repository.findById(id);
}
public boolean deleteAlbumHasGenre(Integer id) {
if (id == null) {
throw new IllegalArgumentException("Album has genre id cannot be null");
}
logger.info("Deleting album has genre:{}", id);
return repository.deleteById(id);
}
}
@@ -0,0 +1,69 @@
package com.mediamanager.service.albumtype;
import com.mediamanager.model.AlbumType;
import com.mediamanager.repository.AlbumTypeRepository;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.util.List;
import java.util.Optional;
public class AlbumTypeService {
private static final Logger logger = LogManager.getLogger(AlbumTypeService.class);
private final AlbumTypeRepository repository;
public AlbumTypeService(AlbumTypeRepository repository) {
this.repository = repository;
}
public AlbumType createAlbumType(String value) {
logger.debug("Creating album type:{}", value);
if (value == null || value.trim().isEmpty()) {
throw new IllegalArgumentException("AlbumType value cannot be null or empty");
}
AlbumType albumType = new AlbumType();
albumType.setValue(value);
return repository.save(albumType);
}
public List<AlbumType> getAllAlbumTypes() {
logger.info("Getting all album types");
return repository.findAll();
}
public Optional<AlbumType> getAlbumTypeById(Integer id) {
if (id == null) {
throw new IllegalArgumentException("ID cannot be null");
}
logger.info("Getting album type by id:{}", id);
return repository.findById(id);
}
public Optional<AlbumType> updateAlbumType(Integer id, String value) {
if (id == null) {
throw new IllegalArgumentException("ID cannot be null");
}
logger.info("Updating album type:{}", value);
if (value == null || value.trim().isEmpty()) {
throw new IllegalArgumentException("AlbumType value cannot be null or empty");
}
Optional<AlbumType> existingAlbumType = repository.findById(id);
if(existingAlbumType.isEmpty()) {
logger.warn("Album type not found with id:{}", id);
return Optional.empty();
}
AlbumType albumType = existingAlbumType.get();
albumType.setValue(value);
AlbumType updatedAlbumType = repository.update(albumType);
return Optional.of(updatedAlbumType);
}
public boolean deleteAlbumType(Integer id) {
if (id == null) {
throw new IllegalArgumentException("Album type id cannot be null");
}
logger.info("Deleting album type:{}", id);
return repository.deleteById(id);
}
}
@@ -3,14 +3,25 @@ package com.mediamanager.service.delegate;
import com.google.protobuf.ByteString; import com.google.protobuf.ByteString;
import com.mediamanager.protocol.TransportProtocol; import com.mediamanager.protocol.TransportProtocol;
import com.mediamanager.repository.*; import com.mediamanager.repository.*;
import com.mediamanager.repository.DiscRepository;
import com.mediamanager.service.album.AlbumService;
import com.mediamanager.service.albumart.AlbumArtService; import com.mediamanager.service.albumart.AlbumArtService;
import com.mediamanager.service.albumhasartist.AlbumHasArtistService;
import com.mediamanager.service.albumhasgenre.AlbumHasGenreService;
import com.mediamanager.service.albumtype.AlbumTypeService;
import com.mediamanager.service.bitdepth.BitDepthService; import com.mediamanager.service.bitdepth.BitDepthService;
import com.mediamanager.service.bitrate.BitRateService; import com.mediamanager.service.bitrate.BitRateService;
import com.mediamanager.service.composer.ComposerService; import com.mediamanager.service.composer.ComposerService;
import com.mediamanager.service.trackhasgenre.TrackHasGenreService;
import com.mediamanager.service.trackhasartist.TrackHasArtistService;
import com.mediamanager.service.trackhascomposer.TrackHasComposerService;
import com.mediamanager.repository.GenreRepository; import com.mediamanager.repository.GenreRepository;
import com.mediamanager.service.artist.ArtistService; import com.mediamanager.service.artist.ArtistService;
import com.mediamanager.service.track.TrackService;
import com.mediamanager.service.delegate.annotation.Action; import com.mediamanager.service.delegate.annotation.Action;
import com.mediamanager.service.disc.DiscService;
import com.mediamanager.service.genre.GenreService; import com.mediamanager.service.genre.GenreService;
import com.mediamanager.service.samplingrate.SamplingRateService; import com.mediamanager.service.samplingrate.SamplingRateService;
import jakarta.persistence.EntityManagerFactory; import jakarta.persistence.EntityManagerFactory;
@@ -80,6 +91,42 @@ public class DelegateActionManager {
AlbumArtService albumArtService = new AlbumArtService(albumArtRepository); AlbumArtService albumArtService = new AlbumArtService(albumArtRepository);
serviceLocator.register(AlbumArtService.class, albumArtService); serviceLocator.register(AlbumArtService.class, albumArtService);
AlbumTypeRepository albumTypeRepository = new AlbumTypeRepository(entityManagerFactory);
AlbumTypeService albumTypeService = new AlbumTypeService(albumTypeRepository);
serviceLocator.register(AlbumTypeService.class, albumTypeService);
AlbumRepository albumRepository = new AlbumRepository(entityManagerFactory);
AlbumService albumService = new AlbumService(albumRepository, albumTypeRepository, albumArtRepository);
serviceLocator.register(AlbumService.class, albumService);
AlbumHasArtistRepository albumHasArtistRepository = new AlbumHasArtistRepository(entityManagerFactory);
AlbumHasArtistService albumHasArtistService = new AlbumHasArtistService(albumHasArtistRepository, albumRepository, artistRepository);
serviceLocator.register(AlbumHasArtistService.class, albumHasArtistService);
AlbumHasGenreRepository albumHasGenreRepository = new AlbumHasGenreRepository(entityManagerFactory);
AlbumHasGenreService albumHasGenreService = new AlbumHasGenreService(albumHasGenreRepository, albumRepository, genreRepository);
serviceLocator.register(AlbumHasGenreService.class, albumHasGenreService);
DiscRepository discRepository = new DiscRepository(entityManagerFactory);
DiscService discService = new DiscService(discRepository, albumRepository);
serviceLocator.register(DiscService.class, discService);
TrackRepository trackRepository = new TrackRepository(entityManagerFactory);
TrackService trackService = new TrackService(trackRepository, discRepository, composerRepository, bitDepthRepository, bitRateRepository, samplingRateRepository);
serviceLocator.register(TrackService.class, trackService);
TrackHasGenreRepository trackHasGenreRepository = new TrackHasGenreRepository(entityManagerFactory);
TrackHasGenreService trackHasGenreService = new TrackHasGenreService(trackHasGenreRepository, trackRepository, genreRepository);
serviceLocator.register(TrackHasGenreService.class, trackHasGenreService);
TrackHasArtistRepository trackHasArtistRepository = new TrackHasArtistRepository(entityManagerFactory);
TrackHasArtistService trackHasArtistService = new TrackHasArtistService(trackHasArtistRepository, trackRepository, artistRepository);
serviceLocator.register(TrackHasArtistService.class, trackHasArtistService);
TrackHasComposerRepository trackHasComposerRepository = new TrackHasComposerRepository(entityManagerFactory);
TrackHasComposerService trackHasComposerService = new TrackHasComposerService(trackHasComposerRepository, trackRepository, composerRepository);
serviceLocator.register(TrackHasComposerService.class, trackHasComposerService);
serviceLocator.logRegisteredServices(); serviceLocator.logRegisteredServices();
logger.info("Services initialized successfully"); logger.info("Services initialized successfully");
@@ -0,0 +1,59 @@
package com.mediamanager.service.delegate.handler.album;
import com.google.protobuf.ByteString;
import com.google.protobuf.InvalidProtocolBufferException;
import com.mediamanager.mapper.AlbumMapper;
import com.mediamanager.model.Album;
import com.mediamanager.protocol.TransportProtocol;
import com.mediamanager.protocol.messages.AlbumMessages;
import com.mediamanager.service.delegate.ActionHandler;
import com.mediamanager.service.delegate.annotation.Action;
import com.mediamanager.service.album.AlbumService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@Action("album.create")
public class CreateAlbumHandler implements ActionHandler {
private static final Logger logger = LogManager.getLogger(CreateAlbumHandler.class);
private final AlbumService albumService;
public CreateAlbumHandler(AlbumService albumService) {
this.albumService = albumService;
}
@Override
public TransportProtocol.Response.Builder handle(ByteString requestPayload) throws InvalidProtocolBufferException {
try{
AlbumMessages.CreateAlbumRequest createRequest =
AlbumMessages.CreateAlbumRequest.parseFrom(requestPayload);
Album album = albumService.createAlbum(
createRequest.getName(),
createRequest.getYear() > 0 ? createRequest.getYear() : null,
createRequest.getNumberOfDiscs() > 0 ? createRequest.getNumberOfDiscs() : null,
createRequest.getCode().isEmpty() ? null : createRequest.getCode(),
createRequest.getIsCompilation(),
createRequest.getFkAlbumtypeId() > 0 ? createRequest.getFkAlbumtypeId() : null,
createRequest.getFkAlbumartId() > 0 ? createRequest.getFkAlbumartId() : null
);
AlbumMessages.Album albumProto = AlbumMapper.toProtobuf(album);
AlbumMessages.CreateAlbumResponse createAlbumResponse = AlbumMessages.CreateAlbumResponse.newBuilder()
.setAlbum(albumProto)
.build();
return TransportProtocol.Response.newBuilder()
.setPayload(createAlbumResponse.toByteString());
} catch (IllegalArgumentException e) {
logger.error("Validation error", e);
return TransportProtocol.Response.newBuilder()
.setStatusCode(400)
.setPayload(ByteString.copyFromUtf8("Validation error: " + e.getMessage()));
} catch (Exception e) {
logger.error("Error creating album", e);
return TransportProtocol.Response.newBuilder()
.setStatusCode(500)
.setPayload(ByteString.copyFromUtf8("Error: " + e.getMessage()));
}
}
}
@@ -0,0 +1,62 @@
package com.mediamanager.service.delegate.handler.album;
import com.google.protobuf.ByteString;
import com.google.protobuf.InvalidProtocolBufferException;
import com.mediamanager.protocol.TransportProtocol;
import com.mediamanager.protocol.messages.AlbumMessages;
import com.mediamanager.service.delegate.ActionHandler;
import com.mediamanager.service.delegate.annotation.Action;
import com.mediamanager.service.album.AlbumService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@Action("album.delete")
public class DeleteAlbumHandler implements ActionHandler {
private static final Logger logger = LogManager.getLogger(DeleteAlbumHandler.class);
private final AlbumService albumService;
public DeleteAlbumHandler(AlbumService albumService) {
this.albumService = albumService;
}
@Override
public TransportProtocol.Response.Builder handle(ByteString requestPayload)
throws InvalidProtocolBufferException {
try {
AlbumMessages.DeleteAlbumRequest deleteRequest =
AlbumMessages.DeleteAlbumRequest.parseFrom(requestPayload);
int id = deleteRequest.getId();
boolean success = albumService.deleteAlbum(id);
AlbumMessages.DeleteAlbumResponse deleteResponse;
if (success) {
deleteResponse = AlbumMessages.DeleteAlbumResponse.newBuilder()
.setSuccess(true)
.setMessage("Album deleted successfully")
.build();
return TransportProtocol.Response.newBuilder()
.setPayload(deleteResponse.toByteString());
} else {
deleteResponse = AlbumMessages.DeleteAlbumResponse.newBuilder()
.setSuccess(false)
.setMessage("Album not found")
.build();
return TransportProtocol.Response.newBuilder()
.setStatusCode(404)
.setPayload(deleteResponse.toByteString());
}
} catch (Exception e) {
logger.error("Error deleting album", e);
AlbumMessages.DeleteAlbumResponse deleteResponse =
AlbumMessages.DeleteAlbumResponse.newBuilder()
.setSuccess(false)
.setMessage("Error: " + e.getMessage())
.build();
return TransportProtocol.Response.newBuilder()
.setStatusCode(500)
.setPayload(deleteResponse.toByteString());
}
}
}
@@ -0,0 +1,56 @@
package com.mediamanager.service.delegate.handler.album;
import com.google.protobuf.ByteString;
import com.google.protobuf.InvalidProtocolBufferException;
import com.mediamanager.mapper.AlbumMapper;
import com.mediamanager.model.Album;
import com.mediamanager.protocol.TransportProtocol;
import com.mediamanager.protocol.messages.AlbumMessages;
import com.mediamanager.service.delegate.ActionHandler;
import com.mediamanager.service.delegate.annotation.Action;
import com.mediamanager.service.album.AlbumService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.util.Optional;
@Action(value = "album.getById")
public class GetAlbumByIdHandler implements ActionHandler {
private static final Logger logger = LogManager.getLogger(GetAlbumByIdHandler.class);
private final AlbumService albumService;
public GetAlbumByIdHandler(AlbumService albumService) {
this.albumService = albumService;
}
@Override
public TransportProtocol.Response.Builder handle(ByteString requestPayload)
throws InvalidProtocolBufferException{
try{
AlbumMessages.GetAlbumByIdRequest getByIdRequest =
AlbumMessages.GetAlbumByIdRequest.parseFrom(requestPayload);
int id = getByIdRequest.getId();
Optional<Album> albumOpt = albumService.getAlbumById(id);
if (albumOpt.isEmpty()){
logger.warn("Album not found with ID: {}", id);
return TransportProtocol.Response.newBuilder()
.setStatusCode(404)
.setPayload(ByteString.copyFromUtf8("Album not found"));
}
AlbumMessages.Album albumProto = AlbumMapper.toProtobuf(albumOpt.get());
AlbumMessages.GetAlbumByIdResponse getByIdResponse = AlbumMessages.GetAlbumByIdResponse.newBuilder()
.setAlbum(albumProto)
.build();
return TransportProtocol.Response.newBuilder()
.setPayload(getByIdResponse.toByteString());
} catch (Exception e) {
logger.error("Error getting album by ID", e);
return TransportProtocol.Response.newBuilder()
.setStatusCode(500)
.setPayload(ByteString.copyFromUtf8("Error: "+ e.getMessage()));
}
}
}
@@ -0,0 +1,48 @@
package com.mediamanager.service.delegate.handler.album;
import com.google.protobuf.ByteString;
import com.google.protobuf.InvalidProtocolBufferException;
import com.mediamanager.mapper.AlbumMapper;
import com.mediamanager.model.Album;
import com.mediamanager.protocol.TransportProtocol;
import com.mediamanager.protocol.messages.AlbumMessages;
import com.mediamanager.service.delegate.ActionHandler;
import com.mediamanager.service.delegate.annotation.Action;
import com.mediamanager.service.album.AlbumService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.util.List;
@Action("album.getAll")
public class GetAlbumHandler implements ActionHandler {
private static final Logger logger = LogManager.getLogger(GetAlbumHandler.class);
private final AlbumService albumService;
public GetAlbumHandler(AlbumService albumService){this.albumService = albumService;}
@Override
public TransportProtocol.Response.Builder handle(ByteString requestPayload) throws InvalidProtocolBufferException {
try{
List<Album> albums = albumService.getAllAlbums();
AlbumMessages.GetAlbumsResponse.Builder responseBuilder = AlbumMessages.GetAlbumsResponse.newBuilder();
for (Album album : albums) {
AlbumMessages.Album albumProto = AlbumMapper.toProtobuf(album);
responseBuilder.addAlbums(albumProto);
}
AlbumMessages.GetAlbumsResponse getAlbumsResponse = responseBuilder.build();
return TransportProtocol.Response.newBuilder()
.setPayload(getAlbumsResponse.toByteString());
}catch (Exception e){
logger.error("Error getting albums", e);
return TransportProtocol.Response.newBuilder()
.setStatusCode(500)
.setPayload(ByteString.copyFromUtf8("Error: " + e.getMessage()));
}
}
}
@@ -0,0 +1,96 @@
package com.mediamanager.service.delegate.handler.album;
import com.google.protobuf.ByteString;
import com.google.protobuf.InvalidProtocolBufferException;
import com.mediamanager.mapper.AlbumMapper;
import com.mediamanager.model.Album;
import com.mediamanager.protocol.TransportProtocol;
import com.mediamanager.protocol.messages.AlbumMessages;
import com.mediamanager.service.delegate.ActionHandler;
import com.mediamanager.service.delegate.annotation.Action;
import com.mediamanager.service.album.AlbumService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.util.Optional;
@Action("album.update")
public class UpdateAlbumHandler implements ActionHandler {
private static final Logger logger = LogManager.getLogger(UpdateAlbumHandler.class);
private final AlbumService albumService;
public UpdateAlbumHandler(AlbumService albumService) {
this.albumService = albumService;
}
@Override
public TransportProtocol.Response.Builder handle(ByteString requestPayload)
throws InvalidProtocolBufferException {
try {
AlbumMessages.UpdateAlbumRequest updateRequest =
AlbumMessages.UpdateAlbumRequest.parseFrom(requestPayload);
int id = updateRequest.getId();
// Extrai valores dos wrappers - null se não foi fornecido
Integer year = updateRequest.hasYear()
? updateRequest.getYear().getValue()
: null;
Integer numberOfDiscs = updateRequest.hasNumberOfDiscs()
? updateRequest.getNumberOfDiscs().getValue()
: null;
Integer albumTypeId = updateRequest.hasFkAlbumtypeId()
? updateRequest.getFkAlbumtypeId().getValue()
: null;
Integer albumArtId = updateRequest.hasFkAlbumartId()
? updateRequest.getFkAlbumartId().getValue()
: null;
Optional<Album> albumOpt = albumService.updateAlbum(
id,
updateRequest.getName(),
year,
numberOfDiscs,
updateRequest.getCode().isEmpty() ? null : updateRequest.getCode(),
updateRequest.getIsCompilation(),
albumTypeId,
albumArtId,
updateRequest.hasYear(), // ← Novo!
updateRequest.hasNumberOfDiscs(), // ← Novo!
updateRequest.hasFkAlbumtypeId(), // ← Novo!
updateRequest.hasFkAlbumartId() // ← Novo!
);
if (albumOpt.isEmpty()) {
logger.warn("Album not found with ID: {}", id);
return TransportProtocol.Response.newBuilder()
.setStatusCode(404)
.setPayload(ByteString.copyFromUtf8("Album not found"));
}
AlbumMessages.Album albumProto = AlbumMapper.toProtobuf(albumOpt.get());
AlbumMessages.UpdateAlbumResponse updateResponse =
AlbumMessages.UpdateAlbumResponse.newBuilder()
.setAlbum(albumProto)
.build();
return TransportProtocol.Response.newBuilder()
.setPayload(updateResponse.toByteString());
} catch (IllegalArgumentException e) {
logger.error("Validation error", e);
return TransportProtocol.Response.newBuilder()
.setStatusCode(400)
.setPayload(ByteString.copyFromUtf8("Validation error: " + e.getMessage()));
} catch (Exception e) {
logger.error("Error updating album", e);
return TransportProtocol.Response.newBuilder()
.setStatusCode(500)
.setPayload(ByteString.copyFromUtf8("Error: " + e.getMessage()));
}
}
}
@@ -0,0 +1,54 @@
package com.mediamanager.service.delegate.handler.albumhasartist;
import com.google.protobuf.ByteString;
import com.google.protobuf.InvalidProtocolBufferException;
import com.mediamanager.mapper.AlbumHasArtistMapper;
import com.mediamanager.model.AlbumHasArtist;
import com.mediamanager.protocol.TransportProtocol;
import com.mediamanager.protocol.messages.AlbumHasArtistMessages;
import com.mediamanager.service.delegate.ActionHandler;
import com.mediamanager.service.delegate.annotation.Action;
import com.mediamanager.service.albumhasartist.AlbumHasArtistService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@Action("albumhasartist.create")
public class CreateAlbumHasArtistHandler implements ActionHandler {
private static final Logger logger = LogManager.getLogger(CreateAlbumHasArtistHandler.class);
private final AlbumHasArtistService albumHasArtistService;
public CreateAlbumHasArtistHandler(AlbumHasArtistService albumHasArtistService) {
this.albumHasArtistService = albumHasArtistService;
}
@Override
public TransportProtocol.Response.Builder handle(ByteString requestPayload) throws InvalidProtocolBufferException {
try{
AlbumHasArtistMessages.CreateAlbumHasArtistRequest createRequest =
AlbumHasArtistMessages.CreateAlbumHasArtistRequest.parseFrom(requestPayload);
AlbumHasArtist albumHasArtist = albumHasArtistService.createAlbumHasArtist(
createRequest.getFkAlbumId() > 0 ? createRequest.getFkAlbumId() : null,
createRequest.getFkArtistId() > 0 ? createRequest.getFkArtistId() : null
);
AlbumHasArtistMessages.AlbumHasArtist albumHasArtistProto = AlbumHasArtistMapper.toProtobuf(albumHasArtist);
AlbumHasArtistMessages.CreateAlbumHasArtistResponse createAlbumHasArtistResponse = AlbumHasArtistMessages.CreateAlbumHasArtistResponse.newBuilder()
.setAlbumhasartist(albumHasArtistProto)
.build();
return TransportProtocol.Response.newBuilder()
.setPayload(createAlbumHasArtistResponse.toByteString());
} catch (IllegalArgumentException e) {
logger.error("Validation error", e);
return TransportProtocol.Response.newBuilder()
.setStatusCode(400)
.setPayload(ByteString.copyFromUtf8("Validation error: " + e.getMessage()));
} catch (Exception e) {
logger.error("Error creating album has artist", e);
return TransportProtocol.Response.newBuilder()
.setStatusCode(500)
.setPayload(ByteString.copyFromUtf8("Error: " + e.getMessage()));
}
}
}
@@ -0,0 +1,62 @@
package com.mediamanager.service.delegate.handler.albumhasartist;
import com.google.protobuf.ByteString;
import com.google.protobuf.InvalidProtocolBufferException;
import com.mediamanager.protocol.TransportProtocol;
import com.mediamanager.protocol.messages.AlbumHasArtistMessages;
import com.mediamanager.service.delegate.ActionHandler;
import com.mediamanager.service.delegate.annotation.Action;
import com.mediamanager.service.albumhasartist.AlbumHasArtistService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@Action("albumhasartist.delete")
public class DeleteAlbumHasArtistHandler implements ActionHandler {
private static final Logger logger = LogManager.getLogger(DeleteAlbumHasArtistHandler.class);
private final AlbumHasArtistService albumHasArtistService;
public DeleteAlbumHasArtistHandler(AlbumHasArtistService albumHasArtistService) {
this.albumHasArtistService = albumHasArtistService;
}
@Override
public TransportProtocol.Response.Builder handle(ByteString requestPayload)
throws InvalidProtocolBufferException {
try {
AlbumHasArtistMessages.DeleteAlbumHasArtistRequest deleteRequest =
AlbumHasArtistMessages.DeleteAlbumHasArtistRequest.parseFrom(requestPayload);
int id = deleteRequest.getId();
boolean success = albumHasArtistService.deleteAlbumHasArtist(id);
AlbumHasArtistMessages.DeleteAlbumHasArtistResponse deleteResponse;
if (success) {
deleteResponse = AlbumHasArtistMessages.DeleteAlbumHasArtistResponse.newBuilder()
.setSuccess(true)
.setMessage("Album has artist deleted successfully")
.build();
return TransportProtocol.Response.newBuilder()
.setPayload(deleteResponse.toByteString());
} else {
deleteResponse = AlbumHasArtistMessages.DeleteAlbumHasArtistResponse.newBuilder()
.setSuccess(false)
.setMessage("Album has artist not found")
.build();
return TransportProtocol.Response.newBuilder()
.setStatusCode(404)
.setPayload(deleteResponse.toByteString());
}
} catch (Exception e) {
logger.error("Error deleting album has artist", e);
AlbumHasArtistMessages.DeleteAlbumHasArtistResponse deleteResponse =
AlbumHasArtistMessages.DeleteAlbumHasArtistResponse.newBuilder()
.setSuccess(false)
.setMessage("Error: " + e.getMessage())
.build();
return TransportProtocol.Response.newBuilder()
.setStatusCode(500)
.setPayload(deleteResponse.toByteString());
}
}
}
@@ -0,0 +1,56 @@
package com.mediamanager.service.delegate.handler.albumhasartist;
import com.google.protobuf.ByteString;
import com.google.protobuf.InvalidProtocolBufferException;
import com.mediamanager.mapper.AlbumHasArtistMapper;
import com.mediamanager.model.AlbumHasArtist;
import com.mediamanager.protocol.TransportProtocol;
import com.mediamanager.protocol.messages.AlbumHasArtistMessages;
import com.mediamanager.service.delegate.ActionHandler;
import com.mediamanager.service.delegate.annotation.Action;
import com.mediamanager.service.albumhasartist.AlbumHasArtistService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.util.Optional;
@Action(value = "albumhasartist.getById")
public class GetAlbumHasArtistByIdHandler implements ActionHandler {
private static final Logger logger = LogManager.getLogger(GetAlbumHasArtistByIdHandler.class);
private final AlbumHasArtistService albumHasArtistService;
public GetAlbumHasArtistByIdHandler(AlbumHasArtistService albumHasArtistService) {
this.albumHasArtistService = albumHasArtistService;
}
@Override
public TransportProtocol.Response.Builder handle(ByteString requestPayload)
throws InvalidProtocolBufferException{
try{
AlbumHasArtistMessages.GetAlbumHasArtistByIdRequest getByIdRequest =
AlbumHasArtistMessages.GetAlbumHasArtistByIdRequest.parseFrom(requestPayload);
int id = getByIdRequest.getId();
Optional<AlbumHasArtist> albumHasArtistOpt = albumHasArtistService.getAlbumHasArtistById(id);
if (albumHasArtistOpt.isEmpty()){
logger.warn("AlbumHasArtist not found with ID: {}", id);
return TransportProtocol.Response.newBuilder()
.setStatusCode(404)
.setPayload(ByteString.copyFromUtf8("AlbumHasArtist not found"));
}
AlbumHasArtistMessages.AlbumHasArtist albumHasArtistProto = AlbumHasArtistMapper.toProtobuf(albumHasArtistOpt.get());
AlbumHasArtistMessages.GetAlbumHasArtistByIdResponse getByIdResponse = AlbumHasArtistMessages.GetAlbumHasArtistByIdResponse.newBuilder()
.setAlbumhasartist(albumHasArtistProto)
.build();
return TransportProtocol.Response.newBuilder()
.setPayload(getByIdResponse.toByteString());
} catch (Exception e) {
logger.error("Error getting album has artist by ID", e);
return TransportProtocol.Response.newBuilder()
.setStatusCode(500)
.setPayload(ByteString.copyFromUtf8("Error: "+ e.getMessage()));
}
}
}
@@ -0,0 +1,48 @@
package com.mediamanager.service.delegate.handler.albumhasartist;
import com.google.protobuf.ByteString;
import com.google.protobuf.InvalidProtocolBufferException;
import com.mediamanager.mapper.AlbumHasArtistMapper;
import com.mediamanager.model.AlbumHasArtist;
import com.mediamanager.protocol.TransportProtocol;
import com.mediamanager.protocol.messages.AlbumHasArtistMessages;
import com.mediamanager.service.delegate.ActionHandler;
import com.mediamanager.service.delegate.annotation.Action;
import com.mediamanager.service.albumhasartist.AlbumHasArtistService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.util.List;
@Action("albumhasartist.getAll")
public class GetAlbumHasArtistHandler implements ActionHandler {
private static final Logger logger = LogManager.getLogger(GetAlbumHasArtistHandler.class);
private final AlbumHasArtistService albumHasArtistService;
public GetAlbumHasArtistHandler(AlbumHasArtistService albumHasArtistService){this.albumHasArtistService = albumHasArtistService;}
@Override
public TransportProtocol.Response.Builder handle(ByteString requestPayload) throws InvalidProtocolBufferException {
try{
List<AlbumHasArtist> albumHasArtists = albumHasArtistService.getAllAlbumHasArtists();
AlbumHasArtistMessages.GetAlbumHasArtistsResponse.Builder responseBuilder = AlbumHasArtistMessages.GetAlbumHasArtistsResponse.newBuilder();
for (AlbumHasArtist albumHasArtist : albumHasArtists) {
AlbumHasArtistMessages.AlbumHasArtist albumHasArtistProto = AlbumHasArtistMapper.toProtobuf(albumHasArtist);
responseBuilder.addAlbumhasartist(albumHasArtistProto);
}
AlbumHasArtistMessages.GetAlbumHasArtistsResponse getAlbumHasArtistsResponse = responseBuilder.build();
return TransportProtocol.Response.newBuilder()
.setPayload(getAlbumHasArtistsResponse.toByteString());
}catch (Exception e){
logger.error("Error getting album has artists", e);
return TransportProtocol.Response.newBuilder()
.setStatusCode(500)
.setPayload(ByteString.copyFromUtf8("Error: " + e.getMessage()));
}
}
}
@@ -0,0 +1,54 @@
package com.mediamanager.service.delegate.handler.albumhasgenre;
import com.google.protobuf.ByteString;
import com.google.protobuf.InvalidProtocolBufferException;
import com.mediamanager.mapper.AlbumHasGenreMapper;
import com.mediamanager.model.AlbumHasGenre;
import com.mediamanager.protocol.TransportProtocol;
import com.mediamanager.protocol.messages.AlbumHasGenreMessages;
import com.mediamanager.service.delegate.ActionHandler;
import com.mediamanager.service.delegate.annotation.Action;
import com.mediamanager.service.albumhasgenre.AlbumHasGenreService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@Action("albumhasgenre.create")
public class CreateAlbumHasGenreHandler implements ActionHandler {
private static final Logger logger = LogManager.getLogger(CreateAlbumHasGenreHandler.class);
private final AlbumHasGenreService albumHasGenreService;
public CreateAlbumHasGenreHandler(AlbumHasGenreService albumHasGenreService) {
this.albumHasGenreService = albumHasGenreService;
}
@Override
public TransportProtocol.Response.Builder handle(ByteString requestPayload) throws InvalidProtocolBufferException {
try{
AlbumHasGenreMessages.CreateAlbumHasGenreRequest createRequest =
AlbumHasGenreMessages.CreateAlbumHasGenreRequest.parseFrom(requestPayload);
AlbumHasGenre albumHasGenre = albumHasGenreService.createAlbumHasGenre(
createRequest.getFkAlbumId() > 0 ? createRequest.getFkAlbumId() : null,
createRequest.getFkGenreId() > 0 ? createRequest.getFkGenreId() : null
);
AlbumHasGenreMessages.AlbumHasGenre albumHasGenreProto = AlbumHasGenreMapper.toProtobuf(albumHasGenre);
AlbumHasGenreMessages.CreateAlbumHasGenreResponse createAlbumHasGenreResponse = AlbumHasGenreMessages.CreateAlbumHasGenreResponse.newBuilder()
.setAlbumhasgenre(albumHasGenreProto)
.build();
return TransportProtocol.Response.newBuilder()
.setPayload(createAlbumHasGenreResponse.toByteString());
} catch (IllegalArgumentException e) {
logger.error("Validation error", e);
return TransportProtocol.Response.newBuilder()
.setStatusCode(400)
.setPayload(ByteString.copyFromUtf8("Validation error: " + e.getMessage()));
} catch (Exception e) {
logger.error("Error creating album has genre", e);
return TransportProtocol.Response.newBuilder()
.setStatusCode(500)
.setPayload(ByteString.copyFromUtf8("Error: " + e.getMessage()));
}
}
}
@@ -0,0 +1,62 @@
package com.mediamanager.service.delegate.handler.albumhasgenre;
import com.google.protobuf.ByteString;
import com.google.protobuf.InvalidProtocolBufferException;
import com.mediamanager.protocol.TransportProtocol;
import com.mediamanager.protocol.messages.AlbumHasGenreMessages;
import com.mediamanager.service.delegate.ActionHandler;
import com.mediamanager.service.delegate.annotation.Action;
import com.mediamanager.service.albumhasgenre.AlbumHasGenreService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@Action("albumhasgenre.delete")
public class DeleteAlbumHasGenreHandler implements ActionHandler {
private static final Logger logger = LogManager.getLogger(DeleteAlbumHasGenreHandler.class);
private final AlbumHasGenreService albumHasGenreService;
public DeleteAlbumHasGenreHandler(AlbumHasGenreService albumHasGenreService) {
this.albumHasGenreService = albumHasGenreService;
}
@Override
public TransportProtocol.Response.Builder handle(ByteString requestPayload)
throws InvalidProtocolBufferException {
try {
AlbumHasGenreMessages.DeleteAlbumHasGenreRequest deleteRequest =
AlbumHasGenreMessages.DeleteAlbumHasGenreRequest.parseFrom(requestPayload);
int id = deleteRequest.getId();
boolean success = albumHasGenreService.deleteAlbumHasGenre(id);
AlbumHasGenreMessages.DeleteAlbumHasGenreResponse deleteResponse;
if (success) {
deleteResponse = AlbumHasGenreMessages.DeleteAlbumHasGenreResponse.newBuilder()
.setSuccess(true)
.setMessage("Album has genre deleted successfully")
.build();
return TransportProtocol.Response.newBuilder()
.setPayload(deleteResponse.toByteString());
} else {
deleteResponse = AlbumHasGenreMessages.DeleteAlbumHasGenreResponse.newBuilder()
.setSuccess(false)
.setMessage("Album has genre not found")
.build();
return TransportProtocol.Response.newBuilder()
.setStatusCode(404)
.setPayload(deleteResponse.toByteString());
}
} catch (Exception e) {
logger.error("Error deleting album has genre", e);
AlbumHasGenreMessages.DeleteAlbumHasGenreResponse deleteResponse =
AlbumHasGenreMessages.DeleteAlbumHasGenreResponse.newBuilder()
.setSuccess(false)
.setMessage("Error: " + e.getMessage())
.build();
return TransportProtocol.Response.newBuilder()
.setStatusCode(500)
.setPayload(deleteResponse.toByteString());
}
}
}
@@ -0,0 +1,56 @@
package com.mediamanager.service.delegate.handler.albumhasgenre;
import com.google.protobuf.ByteString;
import com.google.protobuf.InvalidProtocolBufferException;
import com.mediamanager.mapper.AlbumHasGenreMapper;
import com.mediamanager.model.AlbumHasGenre;
import com.mediamanager.protocol.TransportProtocol;
import com.mediamanager.protocol.messages.AlbumHasGenreMessages;
import com.mediamanager.service.delegate.ActionHandler;
import com.mediamanager.service.delegate.annotation.Action;
import com.mediamanager.service.albumhasgenre.AlbumHasGenreService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.util.Optional;
@Action(value = "albumhasgenre.getById")
public class GetAlbumHasGenreByIdHandler implements ActionHandler {
private static final Logger logger = LogManager.getLogger(GetAlbumHasGenreByIdHandler.class);
private final AlbumHasGenreService albumHasGenreService;
public GetAlbumHasGenreByIdHandler(AlbumHasGenreService albumHasGenreService) {
this.albumHasGenreService = albumHasGenreService;
}
@Override
public TransportProtocol.Response.Builder handle(ByteString requestPayload)
throws InvalidProtocolBufferException{
try{
AlbumHasGenreMessages.GetAlbumHasGenreByIdRequest getByIdRequest =
AlbumHasGenreMessages.GetAlbumHasGenreByIdRequest.parseFrom(requestPayload);
int id = getByIdRequest.getId();
Optional<AlbumHasGenre> albumHasGenreOpt = albumHasGenreService.getAlbumHasGenreById(id);
if (albumHasGenreOpt.isEmpty()){
logger.warn("AlbumHasGenre not found with ID: {}", id);
return TransportProtocol.Response.newBuilder()
.setStatusCode(404)
.setPayload(ByteString.copyFromUtf8("AlbumHasGenre not found"));
}
AlbumHasGenreMessages.AlbumHasGenre albumHasGenreProto = AlbumHasGenreMapper.toProtobuf(albumHasGenreOpt.get());
AlbumHasGenreMessages.GetAlbumHasGenreByIdResponse getByIdResponse = AlbumHasGenreMessages.GetAlbumHasGenreByIdResponse.newBuilder()
.setAlbumhasgenre(albumHasGenreProto)
.build();
return TransportProtocol.Response.newBuilder()
.setPayload(getByIdResponse.toByteString());
} catch (Exception e) {
logger.error("Error getting album has genre by ID", e);
return TransportProtocol.Response.newBuilder()
.setStatusCode(500)
.setPayload(ByteString.copyFromUtf8("Error: "+ e.getMessage()));
}
}
}
@@ -0,0 +1,48 @@
package com.mediamanager.service.delegate.handler.albumhasgenre;
import com.google.protobuf.ByteString;
import com.google.protobuf.InvalidProtocolBufferException;
import com.mediamanager.mapper.AlbumHasGenreMapper;
import com.mediamanager.model.AlbumHasGenre;
import com.mediamanager.protocol.TransportProtocol;
import com.mediamanager.protocol.messages.AlbumHasGenreMessages;
import com.mediamanager.service.delegate.ActionHandler;
import com.mediamanager.service.delegate.annotation.Action;
import com.mediamanager.service.albumhasgenre.AlbumHasGenreService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.util.List;
@Action("albumhasgenre.getAll")
public class GetAlbumHasGenreHandler implements ActionHandler {
private static final Logger logger = LogManager.getLogger(GetAlbumHasGenreHandler.class);
private final AlbumHasGenreService albumHasGenreService;
public GetAlbumHasGenreHandler(AlbumHasGenreService albumHasGenreService){this.albumHasGenreService = albumHasGenreService;}
@Override
public TransportProtocol.Response.Builder handle(ByteString requestPayload) throws InvalidProtocolBufferException {
try{
List<AlbumHasGenre> albumHasGenres = albumHasGenreService.getAllAlbumHasGenres();
AlbumHasGenreMessages.GetAlbumHasGenresResponse.Builder responseBuilder = AlbumHasGenreMessages.GetAlbumHasGenresResponse.newBuilder();
for (AlbumHasGenre albumHasGenre : albumHasGenres) {
AlbumHasGenreMessages.AlbumHasGenre albumHasGenreProto = AlbumHasGenreMapper.toProtobuf(albumHasGenre);
responseBuilder.addAlbumhasgenre(albumHasGenreProto);
}
AlbumHasGenreMessages.GetAlbumHasGenresResponse getAlbumHasGenresResponse = responseBuilder.build();
return TransportProtocol.Response.newBuilder()
.setPayload(getAlbumHasGenresResponse.toByteString());
}catch (Exception e){
logger.error("Error getting album has genres", e);
return TransportProtocol.Response.newBuilder()
.setStatusCode(500)
.setPayload(ByteString.copyFromUtf8("Error: " + e.getMessage()));
}
}
}
@@ -0,0 +1,49 @@
package com.mediamanager.service.delegate.handler.albumtype;
import com.google.protobuf.ByteString;
import com.google.protobuf.InvalidProtocolBufferException;
import com.mediamanager.mapper.AlbumTypeMapper;
import com.mediamanager.model.AlbumType;
import com.mediamanager.protocol.TransportProtocol;
import com.mediamanager.protocol.messages.AlbumTypeMessages;
import com.mediamanager.service.delegate.ActionHandler;
import com.mediamanager.service.delegate.annotation.Action;
import com.mediamanager.service.albumtype.AlbumTypeService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@Action("albumtype.create")
public class CreateAlbumTypeHandler implements ActionHandler {
private static final Logger logger = LogManager.getLogger(CreateAlbumTypeHandler.class);
private final AlbumTypeService albumTypeService;
public CreateAlbumTypeHandler(AlbumTypeService albumTypeService) {
this.albumTypeService = albumTypeService;
}
@Override
public TransportProtocol.Response.Builder handle(ByteString requestPayload) throws InvalidProtocolBufferException {
try{
AlbumTypeMessages.CreateAlbumTypeRequest createRequest =
AlbumTypeMessages.CreateAlbumTypeRequest.parseFrom(requestPayload);
AlbumType albumType = albumTypeService.createAlbumType(createRequest.getValue());
AlbumTypeMessages.AlbumType albumTypeProto = AlbumTypeMapper.toProtobuf(albumType);
AlbumTypeMessages.CreateAlbumTypeResponse createAlbumTypeResponse = AlbumTypeMessages.CreateAlbumTypeResponse.newBuilder()
.setAlbumtype(albumTypeProto)
.build();
return TransportProtocol.Response.newBuilder()
.setPayload(createAlbumTypeResponse.toByteString());
} catch (IllegalArgumentException e) {
logger.error("Validation error", e);
return TransportProtocol.Response.newBuilder()
.setStatusCode(400)
.setPayload(ByteString.copyFromUtf8("Validation error: " + e.getMessage()));
} catch (Exception e) {
logger.error("Error creating album type", e);
return TransportProtocol.Response.newBuilder()
.setStatusCode(500)
.setPayload(ByteString.copyFromUtf8("Error: " + e.getMessage()));
}
}
}
@@ -0,0 +1,62 @@
package com.mediamanager.service.delegate.handler.albumtype;
import com.google.protobuf.ByteString;
import com.google.protobuf.InvalidProtocolBufferException;
import com.mediamanager.protocol.TransportProtocol;
import com.mediamanager.protocol.messages.AlbumTypeMessages;
import com.mediamanager.service.delegate.ActionHandler;
import com.mediamanager.service.delegate.annotation.Action;
import com.mediamanager.service.albumtype.AlbumTypeService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@Action("albumtype.delete")
public class DeleteAlbumTypeHandler implements ActionHandler {
private static final Logger logger = LogManager.getLogger(DeleteAlbumTypeHandler.class);
private final AlbumTypeService albumTypeService;
public DeleteAlbumTypeHandler(AlbumTypeService albumTypeService) {
this.albumTypeService = albumTypeService;
}
@Override
public TransportProtocol.Response.Builder handle(ByteString requestPayload)
throws InvalidProtocolBufferException {
try {
AlbumTypeMessages.DeleteAlbumTypeRequest deleteRequest =
AlbumTypeMessages.DeleteAlbumTypeRequest.parseFrom(requestPayload);
int id = deleteRequest.getId();
boolean success = albumTypeService.deleteAlbumType(id);
AlbumTypeMessages.DeleteAlbumTypeResponse deleteResponse;
if (success) {
deleteResponse = AlbumTypeMessages.DeleteAlbumTypeResponse.newBuilder()
.setSuccess(true)
.setMessage("Album type deleted successfully")
.build();
return TransportProtocol.Response.newBuilder()
.setPayload(deleteResponse.toByteString());
} else {
deleteResponse = AlbumTypeMessages.DeleteAlbumTypeResponse.newBuilder()
.setSuccess(false)
.setMessage("Album type not found")
.build();
return TransportProtocol.Response.newBuilder()
.setStatusCode(404)
.setPayload(deleteResponse.toByteString());
}
} catch (Exception e) {
logger.error("Error deleting album type", e);
AlbumTypeMessages.DeleteAlbumTypeResponse deleteResponse =
AlbumTypeMessages.DeleteAlbumTypeResponse.newBuilder()
.setSuccess(false)
.setMessage("Error: " + e.getMessage())
.build();
return TransportProtocol.Response.newBuilder()
.setStatusCode(500)
.setPayload(deleteResponse.toByteString());
}
}
}
@@ -0,0 +1,56 @@
package com.mediamanager.service.delegate.handler.albumtype;
import com.google.protobuf.ByteString;
import com.google.protobuf.InvalidProtocolBufferException;
import com.mediamanager.mapper.AlbumTypeMapper;
import com.mediamanager.model.AlbumType;
import com.mediamanager.protocol.TransportProtocol;
import com.mediamanager.protocol.messages.AlbumTypeMessages;
import com.mediamanager.service.delegate.ActionHandler;
import com.mediamanager.service.delegate.annotation.Action;
import com.mediamanager.service.albumtype.AlbumTypeService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.util.Optional;
@Action(value = "albumtype.getById")
public class GetAlbumTypeByIdHandler implements ActionHandler {
private static final Logger logger = LogManager.getLogger(GetAlbumTypeByIdHandler.class);
private final AlbumTypeService albumTypeService;
public GetAlbumTypeByIdHandler(AlbumTypeService albumTypeService) {
this.albumTypeService = albumTypeService;
}
@Override
public TransportProtocol.Response.Builder handle(ByteString requestPayload)
throws InvalidProtocolBufferException{
try{
AlbumTypeMessages.GetAlbumTypeByIdRequest getByIdRequest =
AlbumTypeMessages.GetAlbumTypeByIdRequest.parseFrom(requestPayload);
int id = getByIdRequest.getId();
Optional<AlbumType> albumTypeOpt = albumTypeService.getAlbumTypeById(id);
if (albumTypeOpt.isEmpty()){
logger.warn("AlbumType not found with ID: {}", id);
return TransportProtocol.Response.newBuilder()
.setStatusCode(404)
.setPayload(ByteString.copyFromUtf8("AlbumType not found"));
}
AlbumTypeMessages.AlbumType albumTypeProto = AlbumTypeMapper.toProtobuf(albumTypeOpt.get());
AlbumTypeMessages.GetAlbumTypeByIdResponse getByIdResponse = AlbumTypeMessages.GetAlbumTypeByIdResponse.newBuilder()
.setAlbumtype(albumTypeProto)
.build();
return TransportProtocol.Response.newBuilder()
.setPayload(getByIdResponse.toByteString());
} catch (Exception e) {
logger.error("Error getting album type by ID", e);
return TransportProtocol.Response.newBuilder()
.setStatusCode(500)
.setPayload(ByteString.copyFromUtf8("Error: "+ e.getMessage()));
}
}
}
@@ -0,0 +1,48 @@
package com.mediamanager.service.delegate.handler.albumtype;
import com.google.protobuf.ByteString;
import com.google.protobuf.InvalidProtocolBufferException;
import com.mediamanager.mapper.AlbumTypeMapper;
import com.mediamanager.model.AlbumType;
import com.mediamanager.protocol.TransportProtocol;
import com.mediamanager.protocol.messages.AlbumTypeMessages;
import com.mediamanager.service.delegate.ActionHandler;
import com.mediamanager.service.delegate.annotation.Action;
import com.mediamanager.service.albumtype.AlbumTypeService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.util.List;
@Action("albumtype.getAll")
public class GetAlbumTypeHandler implements ActionHandler {
private static final Logger logger = LogManager.getLogger(GetAlbumTypeHandler.class);
private final AlbumTypeService albumTypeService;
public GetAlbumTypeHandler(AlbumTypeService albumTypeService){this.albumTypeService = albumTypeService;}
@Override
public TransportProtocol.Response.Builder handle(ByteString requestPayload) throws InvalidProtocolBufferException {
try{
List<AlbumType> albumTypes = albumTypeService.getAllAlbumTypes();
AlbumTypeMessages.GetAlbumTypesResponse.Builder responseBuilder = AlbumTypeMessages.GetAlbumTypesResponse.newBuilder();
for (AlbumType albumType : albumTypes) {
AlbumTypeMessages.AlbumType albumTypeProto = AlbumTypeMapper.toProtobuf(albumType);
responseBuilder.addAlbumtypes(albumTypeProto);
}
AlbumTypeMessages.GetAlbumTypesResponse getAlbumTypesResponse = responseBuilder.build();
return TransportProtocol.Response.newBuilder()
.setPayload(getAlbumTypesResponse.toByteString());
}catch (Exception e){
logger.error("Error getting album types", e);
return TransportProtocol.Response.newBuilder()
.setStatusCode(500)
.setPayload(ByteString.copyFromUtf8("Error: " + e.getMessage()));
}
}
}
@@ -0,0 +1,65 @@
package com.mediamanager.service.delegate.handler.albumtype;
import com.google.protobuf.ByteString;
import com.google.protobuf.InvalidProtocolBufferException;
import com.mediamanager.mapper.AlbumTypeMapper;
import com.mediamanager.model.AlbumType;
import com.mediamanager.protocol.TransportProtocol;
import com.mediamanager.protocol.messages.AlbumTypeMessages;
import com.mediamanager.service.delegate.ActionHandler;
import com.mediamanager.service.delegate.annotation.Action;
import com.mediamanager.service.albumtype.AlbumTypeService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.util.Optional;
@Action("albumtype.update")
public class UpdateAlbumTypeHandler implements ActionHandler {
private static final Logger logger = LogManager.getLogger(UpdateAlbumTypeHandler.class);
private final AlbumTypeService albumTypeService;
public UpdateAlbumTypeHandler(AlbumTypeService albumTypeService) {
this.albumTypeService = albumTypeService;
}
@Override
public TransportProtocol.Response.Builder handle(ByteString requestPayload) throws InvalidProtocolBufferException {
try{
AlbumTypeMessages.UpdateAlbumTypeRequest updateRequest =
AlbumTypeMessages.UpdateAlbumTypeRequest.parseFrom(requestPayload);
int id = updateRequest.getId();
String newValue = updateRequest.getValue();
Optional<AlbumType> albumTypeOpt = albumTypeService.updateAlbumType(id, newValue);
if(albumTypeOpt.isEmpty()){
logger.warn("AlbumType not found with ID: {}", id);
return TransportProtocol.Response.newBuilder()
.setStatusCode(404)
.setPayload(ByteString.copyFromUtf8("AlbumType not found"));
}
AlbumTypeMessages.AlbumType albumTypeProto = AlbumTypeMapper.toProtobuf(albumTypeOpt.get());
AlbumTypeMessages.UpdateAlbumTypeResponse updateResponse = AlbumTypeMessages.UpdateAlbumTypeResponse.newBuilder()
.setAlbumtype(albumTypeProto)
.build();
return TransportProtocol.Response.newBuilder()
.setPayload(updateResponse.toByteString());
} catch (IllegalArgumentException e){
logger.error("Validation error", e);
return TransportProtocol.Response.newBuilder()
.setStatusCode(400)
.setPayload(ByteString.copyFromUtf8("Validation error: " + e.getMessage()));
} catch (Exception e) {
logger.error("Error updating album type", e);
return TransportProtocol.Response.newBuilder()
.setStatusCode(500)
.setPayload(ByteString.copyFromUtf8("Error: " + e.getMessage()));
}
}
}
@@ -0,0 +1,61 @@
package com.mediamanager.service.delegate.handler.disc;
import com.google.protobuf.ByteString;
import com.google.protobuf.InvalidProtocolBufferException;
import com.mediamanager.mapper.DiscMapper;
import com.mediamanager.model.Disc;
import com.mediamanager.protocol.TransportProtocol;
import com.mediamanager.protocol.messages.DiscMessages;
import com.mediamanager.service.delegate.ActionHandler;
import com.mediamanager.service.delegate.annotation.Action;
import com.mediamanager.service.disc.DiscService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@Action("disc.create")
public class CreateDiscHandler implements ActionHandler {
private static final Logger logger = LogManager.getLogger(CreateDiscHandler.class);
private final DiscService discService;
public CreateDiscHandler(DiscService discService) {
this.discService = discService;
}
@Override
public TransportProtocol.Response.Builder handle(ByteString requestPayload) throws InvalidProtocolBufferException {
try {
DiscMessages.CreateDiscRequest createRequest =
DiscMessages.CreateDiscRequest.parseFrom(requestPayload);
Disc disc = discService.createDisc(
createRequest.getDiscNumber(),
createRequest.getFkAlbumId() > 0 ? createRequest.getFkAlbumId() : null
);
DiscMessages.Disc discProto = DiscMapper.toProtobuf(disc);
DiscMessages.CreateDiscResponse createDiscResponse = DiscMessages.CreateDiscResponse.newBuilder()
.setDisc(discProto)
.build();
return TransportProtocol.Response.newBuilder()
.setPayload(createDiscResponse.toByteString());
} catch (IllegalArgumentException e) {
logger.error("Validation error", e);
return TransportProtocol.Response.newBuilder()
.setStatusCode(400)
.setPayload(ByteString.copyFromUtf8("Invalid request"));
} catch (InvalidProtocolBufferException e) {
logger.error("Invalid CreateDiscRequest payload", e);
return TransportProtocol.Response.newBuilder()
.setStatusCode(400)
.setPayload(ByteString.copyFromUtf8("Invalid request payload"));
} catch (Exception e) {
logger.error("Error creating disc", e);
return TransportProtocol.Response.newBuilder()
.setStatusCode(500)
.setPayload(ByteString.copyFromUtf8("Internal server error"));
}
}
}
@@ -0,0 +1,59 @@
package com.mediamanager.service.delegate.handler.disc;
import com.google.protobuf.ByteString;
import com.google.protobuf.InvalidProtocolBufferException;
import com.mediamanager.protocol.TransportProtocol;
import com.mediamanager.protocol.messages.DiscMessages;
import com.mediamanager.service.delegate.ActionHandler;
import com.mediamanager.service.delegate.annotation.Action;
import com.mediamanager.service.disc.DiscService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@Action("disc.delete")
public class DeleteDiscHandler implements ActionHandler {
private static final Logger logger = LogManager.getLogger(DeleteDiscHandler.class);
private final DiscService discService;
public DeleteDiscHandler(DiscService discService) {
this.discService = discService;
}
@Override
public TransportProtocol.Response.Builder handle(ByteString requestPayload)
throws InvalidProtocolBufferException {
try {
DiscMessages.DeleteDiscRequest deleteRequest =
DiscMessages.DeleteDiscRequest.parseFrom(requestPayload);
int id = deleteRequest.getId();
boolean success = discService.deleteDisc(id);
DiscMessages.DeleteDiscResponse deleteResponse;
if (success) {
deleteResponse = DiscMessages.DeleteDiscResponse.newBuilder()
.setMessage("Disc deleted successfully")
.build();
return TransportProtocol.Response.newBuilder()
.setPayload(deleteResponse.toByteString());
} else {
deleteResponse = DiscMessages.DeleteDiscResponse.newBuilder()
.setMessage("Disc not found")
.build();
return TransportProtocol.Response.newBuilder()
.setStatusCode(404)
.setPayload(deleteResponse.toByteString());
}
} catch (Exception e) {
logger.error("Error deleting disc", e);
DiscMessages.DeleteDiscResponse deleteResponse =
DiscMessages.DeleteDiscResponse.newBuilder()
.setMessage("Error: " + e.getMessage())
.build();
return TransportProtocol.Response.newBuilder()
.setStatusCode(500)
.setPayload(deleteResponse.toByteString());
}
}
}
@@ -0,0 +1,56 @@
package com.mediamanager.service.delegate.handler.disc;
import com.google.protobuf.ByteString;
import com.google.protobuf.InvalidProtocolBufferException;
import com.mediamanager.mapper.DiscMapper;
import com.mediamanager.model.Disc;
import com.mediamanager.protocol.TransportProtocol;
import com.mediamanager.protocol.messages.DiscMessages;
import com.mediamanager.service.delegate.ActionHandler;
import com.mediamanager.service.delegate.annotation.Action;
import com.mediamanager.service.disc.DiscService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.util.Optional;
@Action(value = "disc.getById")
public class GetDiscByIdHandler implements ActionHandler {
private static final Logger logger = LogManager.getLogger(GetDiscByIdHandler.class);
private final DiscService discService;
public GetDiscByIdHandler(DiscService discService) {
this.discService = discService;
}
@Override
public TransportProtocol.Response.Builder handle(ByteString requestPayload)
throws InvalidProtocolBufferException{
try{
DiscMessages.GetDiscByIdRequest getByIdRequest =
DiscMessages.GetDiscByIdRequest.parseFrom(requestPayload);
int id = getByIdRequest.getId();
Optional<Disc> discOpt = discService.getDiscById(id);
if (discOpt.isEmpty()){
logger.warn("Disc not found with ID: {}", id);
return TransportProtocol.Response.newBuilder()
.setStatusCode(404)
.setPayload(ByteString.copyFromUtf8("Disc not found"));
}
DiscMessages.Disc discProto = DiscMapper.toProtobuf(discOpt.get());
DiscMessages.GetDiscByIdResponse getByIdResponse = DiscMessages.GetDiscByIdResponse.newBuilder()
.setDisc(discProto)
.build();
return TransportProtocol.Response.newBuilder()
.setPayload(getByIdResponse.toByteString());
} catch (Exception e) {
logger.error("Error getting disc by ID", e);
return TransportProtocol.Response.newBuilder()
.setStatusCode(500)
.setPayload(ByteString.copyFromUtf8("Error: "+ e.getMessage()));
}
}
}
@@ -0,0 +1,47 @@
package com.mediamanager.service.delegate.handler.disc;
import com.google.protobuf.ByteString;
import com.google.protobuf.InvalidProtocolBufferException;
import com.mediamanager.mapper.DiscMapper;
import com.mediamanager.model.Disc;
import com.mediamanager.protocol.TransportProtocol;
import com.mediamanager.protocol.messages.DiscMessages;
import com.mediamanager.service.delegate.ActionHandler;
import com.mediamanager.service.delegate.annotation.Action;
import com.mediamanager.service.disc.DiscService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.util.List;
@Action("disc.getAll")
public class GetDiscHandler implements ActionHandler {
private static final Logger logger = LogManager.getLogger(GetDiscHandler.class);
private final DiscService discService;
public GetDiscHandler(DiscService discService){this.discService = discService;}
@Override
public TransportProtocol.Response.Builder handle(ByteString requestPayload) throws InvalidProtocolBufferException {
try{
List<Disc> discs = discService.getAllDiscs();
DiscMessages.GetDiscsResponse.Builder responseBuilder = DiscMessages.GetDiscsResponse.newBuilder();
for (Disc disc : discs) {
DiscMessages.Disc discProto = DiscMapper.toProtobuf(disc);
responseBuilder.addDiscs(discProto);
}
DiscMessages.GetDiscsResponse getDiscsResponse = responseBuilder.build();
return TransportProtocol.Response.newBuilder()
.setPayload(getDiscsResponse.toByteString());
}catch (Exception e){
logger.error("Error getting discs", e);
return TransportProtocol.Response.newBuilder()
.setStatusCode(500)
.setPayload(ByteString.copyFromUtf8("Error: " + e.getMessage()));
}
}
}
@@ -0,0 +1,72 @@
package com.mediamanager.service.delegate.handler.disc;
import com.google.protobuf.ByteString;
import com.google.protobuf.InvalidProtocolBufferException;
import com.mediamanager.mapper.DiscMapper;
import com.mediamanager.model.Disc;
import com.mediamanager.protocol.TransportProtocol;
import com.mediamanager.protocol.messages.DiscMessages;
import com.mediamanager.service.delegate.ActionHandler;
import com.mediamanager.service.delegate.annotation.Action;
import com.mediamanager.service.disc.DiscService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.util.Optional;
@Action("disc.update")
public class UpdateDiscHandler implements ActionHandler {
private static final Logger logger = LogManager.getLogger(UpdateDiscHandler.class);
private final DiscService discService;
public UpdateDiscHandler(DiscService discService) {
this.discService = discService;
}
@Override
public TransportProtocol.Response.Builder handle(ByteString requestPayload)
throws InvalidProtocolBufferException {
try {
DiscMessages.UpdateDiscRequest updateRequest =
DiscMessages.UpdateDiscRequest.parseFrom(requestPayload);
int id = updateRequest.getId();
Integer discNumber = updateRequest.getDiscNumber();
Integer albumId = updateRequest.getFkAlbumId() > 0 ? updateRequest.getFkAlbumId() : null;
Optional<Disc> discOpt = discService.updateDisc(
id,
discNumber,
albumId
);
if (discOpt.isEmpty()) {
logger.warn("Disc not found with ID: {}", id);
return TransportProtocol.Response.newBuilder()
.setStatusCode(404)
.setPayload(ByteString.copyFromUtf8("Disc not found"));
}
DiscMessages.Disc discProto = DiscMapper.toProtobuf(discOpt.get());
DiscMessages.UpdateDiscResponse updateResponse =
DiscMessages.UpdateDiscResponse.newBuilder()
.setDisc(discProto)
.build();
return TransportProtocol.Response.newBuilder()
.setPayload(updateResponse.toByteString());
} catch (IllegalArgumentException e) {
logger.error("Validation error", e);
return TransportProtocol.Response.newBuilder()
.setStatusCode(400)
.setPayload(ByteString.copyFromUtf8("Validation error: " + e.getMessage()));
} catch (Exception e) {
logger.error("Error updating disc", e);
return TransportProtocol.Response.newBuilder()
.setStatusCode(500)
.setPayload(ByteString.copyFromUtf8("Error: " + e.getMessage()));
}
}
}
@@ -0,0 +1,61 @@
package com.mediamanager.service.delegate.handler.track;
import com.google.protobuf.ByteString;
import com.google.protobuf.InvalidProtocolBufferException;
import com.mediamanager.mapper.TrackMapper;
import com.mediamanager.model.Track;
import com.mediamanager.protocol.TransportProtocol;
import com.mediamanager.protocol.messages.TrackMessages;
import com.mediamanager.service.delegate.ActionHandler;
import com.mediamanager.service.delegate.annotation.Action;
import com.mediamanager.service.track.TrackService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@Action("track.create")
public class CreateTrackHandler implements ActionHandler {
private static final Logger logger = LogManager.getLogger(CreateTrackHandler.class);
private final TrackService trackService;
public CreateTrackHandler(TrackService trackService) {
this.trackService = trackService;
}
@Override
public TransportProtocol.Response.Builder handle(ByteString requestPayload) throws InvalidProtocolBufferException {
try{
TrackMessages.CreateTrackRequest createRequest =
TrackMessages.CreateTrackRequest.parseFrom(requestPayload);
Track track = trackService.createTrack(
createRequest.getTrackNumber(),
createRequest.getTitle(),
createRequest.hasDuration() ? createRequest.getDuration().getValue() : null,
createRequest.getFilepath(),
createRequest.getFkDiscId() > 0 ? createRequest.getFkDiscId() : null,
createRequest.hasFkComposerId() ? createRequest.getFkComposerId().getValue() : null,
createRequest.hasFkBitdepthId() ? createRequest.getFkBitdepthId().getValue() : null,
createRequest.hasFkBitrateId() ? createRequest.getFkBitrateId().getValue() : null,
createRequest.hasFkSamplingrateId() ? createRequest.getFkSamplingrateId().getValue() : null
);
TrackMessages.Track trackProto = TrackMapper.toProtobuf(track);
TrackMessages.CreateTrackResponse createTrackResponse = TrackMessages.CreateTrackResponse.newBuilder()
.setTrack(trackProto)
.build();
return TransportProtocol.Response.newBuilder()
.setPayload(createTrackResponse.toByteString());
} catch (IllegalArgumentException e) {
logger.error("Validation error", e);
return TransportProtocol.Response.newBuilder()
.setStatusCode(400)
.setPayload(ByteString.copyFromUtf8("Validation error: " + e.getMessage()));
} catch (Exception e) {
logger.error("Error creating track", e);
return TransportProtocol.Response.newBuilder()
.setStatusCode(500)
.setPayload(ByteString.copyFromUtf8("Error: " + e.getMessage()));
}
}
}
@@ -0,0 +1,62 @@
package com.mediamanager.service.delegate.handler.track;
import com.google.protobuf.ByteString;
import com.google.protobuf.InvalidProtocolBufferException;
import com.mediamanager.protocol.TransportProtocol;
import com.mediamanager.protocol.messages.TrackMessages;
import com.mediamanager.service.delegate.ActionHandler;
import com.mediamanager.service.delegate.annotation.Action;
import com.mediamanager.service.track.TrackService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@Action("track.delete")
public class DeleteTrackHandler implements ActionHandler {
private static final Logger logger = LogManager.getLogger(DeleteTrackHandler.class);
private final TrackService trackService;
public DeleteTrackHandler(TrackService trackService) {
this.trackService = trackService;
}
@Override
public TransportProtocol.Response.Builder handle(ByteString requestPayload)
throws InvalidProtocolBufferException {
try {
TrackMessages.DeleteTrackRequest deleteRequest =
TrackMessages.DeleteTrackRequest.parseFrom(requestPayload);
int id = deleteRequest.getId();
boolean success = trackService.deleteTrack(id);
TrackMessages.DeleteTrackResponse deleteResponse;
if (success) {
deleteResponse = TrackMessages.DeleteTrackResponse.newBuilder()
.setSuccess(true)
.setMessage("Track deleted successfully")
.build();
return TransportProtocol.Response.newBuilder()
.setPayload(deleteResponse.toByteString());
} else {
deleteResponse = TrackMessages.DeleteTrackResponse.newBuilder()
.setSuccess(false)
.setMessage("Track not found")
.build();
return TransportProtocol.Response.newBuilder()
.setStatusCode(404)
.setPayload(deleteResponse.toByteString());
}
} catch (Exception e) {
logger.error("Error deleting track", e);
TrackMessages.DeleteTrackResponse deleteResponse =
TrackMessages.DeleteTrackResponse.newBuilder()
.setSuccess(false)
.setMessage("Error: " + e.getMessage())
.build();
return TransportProtocol.Response.newBuilder()
.setStatusCode(500)
.setPayload(deleteResponse.toByteString());
}
}
}
@@ -0,0 +1,56 @@
package com.mediamanager.service.delegate.handler.track;
import com.google.protobuf.ByteString;
import com.google.protobuf.InvalidProtocolBufferException;
import com.mediamanager.mapper.TrackMapper;
import com.mediamanager.model.Track;
import com.mediamanager.protocol.TransportProtocol;
import com.mediamanager.protocol.messages.TrackMessages;
import com.mediamanager.service.delegate.ActionHandler;
import com.mediamanager.service.delegate.annotation.Action;
import com.mediamanager.service.track.TrackService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.util.Optional;
@Action(value = "track.getById")
public class GetTrackByIdHandler implements ActionHandler {
private static final Logger logger = LogManager.getLogger(GetTrackByIdHandler.class);
private final TrackService trackService;
public GetTrackByIdHandler(TrackService trackService) {
this.trackService = trackService;
}
@Override
public TransportProtocol.Response.Builder handle(ByteString requestPayload)
throws InvalidProtocolBufferException{
try{
TrackMessages.GetTrackByIdRequest getByIdRequest =
TrackMessages.GetTrackByIdRequest.parseFrom(requestPayload);
int id = getByIdRequest.getId();
Optional<Track> trackOpt = trackService.getTrackById(id);
if (trackOpt.isEmpty()){
logger.warn("Track not found with ID: {}", id);
return TransportProtocol.Response.newBuilder()
.setStatusCode(404)
.setPayload(ByteString.copyFromUtf8("Track not found"));
}
TrackMessages.Track trackProto = TrackMapper.toProtobuf(trackOpt.get());
TrackMessages.GetTrackByIdResponse getByIdResponse = TrackMessages.GetTrackByIdResponse.newBuilder()
.setTrack(trackProto)
.build();
return TransportProtocol.Response.newBuilder()
.setPayload(getByIdResponse.toByteString());
} catch (Exception e) {
logger.error("Error getting track by ID", e);
return TransportProtocol.Response.newBuilder()
.setStatusCode(500)
.setPayload(ByteString.copyFromUtf8("Error: "+ e.getMessage()));
}
}
}
@@ -0,0 +1,47 @@
package com.mediamanager.service.delegate.handler.track;
import com.google.protobuf.ByteString;
import com.google.protobuf.InvalidProtocolBufferException;
import com.mediamanager.mapper.TrackMapper;
import com.mediamanager.model.Track;
import com.mediamanager.protocol.TransportProtocol;
import com.mediamanager.protocol.messages.TrackMessages;
import com.mediamanager.service.delegate.ActionHandler;
import com.mediamanager.service.delegate.annotation.Action;
import com.mediamanager.service.track.TrackService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.util.List;
@Action("track.getAll")
public class GetTrackHandler implements ActionHandler {
private static final Logger logger = LogManager.getLogger(GetTrackHandler.class);
private final TrackService trackService;
public GetTrackHandler(TrackService trackService){this.trackService = trackService;}
@Override
public TransportProtocol.Response.Builder handle(ByteString requestPayload) throws InvalidProtocolBufferException {
try{
List<Track> tracks = trackService.getAllTracks();
TrackMessages.GetTracksResponse.Builder responseBuilder = TrackMessages.GetTracksResponse.newBuilder();
for (Track track : tracks) {
TrackMessages.Track trackProto = TrackMapper.toProtobuf(track);
responseBuilder.addTracks(trackProto);
}
TrackMessages.GetTracksResponse getTracksResponse = responseBuilder.build();
return TransportProtocol.Response.newBuilder()
.setPayload(getTracksResponse.toByteString());
}catch (Exception e){
logger.error("Error getting tracks", e);
return TransportProtocol.Response.newBuilder()
.setStatusCode(500)
.setPayload(ByteString.copyFromUtf8("Error: " + e.getMessage()));
}
}
}
@@ -0,0 +1,86 @@
package com.mediamanager.service.delegate.handler.track;
import com.google.protobuf.ByteString;
import com.google.protobuf.InvalidProtocolBufferException;
import com.mediamanager.mapper.TrackMapper;
import com.mediamanager.model.Track;
import com.mediamanager.protocol.TransportProtocol;
import com.mediamanager.protocol.messages.TrackMessages;
import com.mediamanager.service.delegate.ActionHandler;
import com.mediamanager.service.delegate.annotation.Action;
import com.mediamanager.service.track.TrackService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.util.Optional;
@Action("track.update")
public class UpdateTrackHandler implements ActionHandler {
private static final Logger logger = LogManager.getLogger(UpdateTrackHandler.class);
private final TrackService trackService;
public UpdateTrackHandler(TrackService trackService) {
this.trackService = trackService;
}
@Override
public TransportProtocol.Response.Builder handle(ByteString requestPayload)
throws InvalidProtocolBufferException {
try {
TrackMessages.UpdateTrackRequest updateRequest =
TrackMessages.UpdateTrackRequest.parseFrom(requestPayload);
int id = updateRequest.getId();
Integer trackNumber = updateRequest.hasTrackNumber() ? updateRequest.getTrackNumber().getValue() : null;
String title = updateRequest.getTitle();
Integer duration = updateRequest.hasDuration() ? updateRequest.getDuration().getValue() : null;
String filepath = updateRequest.getFilepath();
Integer discId = updateRequest.hasFkDiscId() ? updateRequest.getFkDiscId().getValue() : null;
Integer composerId = updateRequest.hasFkComposerId() ? updateRequest.getFkComposerId().getValue() : null;
Integer bitDepthId = updateRequest.hasFkBitdepthId() ? updateRequest.getFkBitdepthId().getValue() : null;
Integer bitRateId = updateRequest.hasFkBitrateId() ? updateRequest.getFkBitrateId().getValue() : null;
Integer samplingRateId = updateRequest.hasFkSamplingrateId() ? updateRequest.getFkSamplingrateId().getValue() : null;
Optional<Track> trackOpt = trackService.updateTrack(
id,
trackNumber,
title,
duration,
filepath,
discId,
composerId,
bitDepthId,
bitRateId,
samplingRateId
);
if (trackOpt.isEmpty()) {
logger.warn("Track not found with ID: {}", id);
return TransportProtocol.Response.newBuilder()
.setStatusCode(404)
.setPayload(ByteString.copyFromUtf8("Track not found"));
}
TrackMessages.Track trackProto = TrackMapper.toProtobuf(trackOpt.get());
TrackMessages.UpdateTrackResponse updateResponse =
TrackMessages.UpdateTrackResponse.newBuilder()
.setTrack(trackProto)
.build();
return TransportProtocol.Response.newBuilder()
.setPayload(updateResponse.toByteString());
} catch (IllegalArgumentException e) {
logger.error("Validation error", e);
return TransportProtocol.Response.newBuilder()
.setStatusCode(400)
.setPayload(ByteString.copyFromUtf8("Validation error: " + e.getMessage()));
} catch (Exception e) {
logger.error("Error updating track", e);
return TransportProtocol.Response.newBuilder()
.setStatusCode(500)
.setPayload(ByteString.copyFromUtf8("Error: " + e.getMessage()));
}
}
}
@@ -0,0 +1,54 @@
package com.mediamanager.service.delegate.handler.trackhasartist;
import com.google.protobuf.ByteString;
import com.google.protobuf.InvalidProtocolBufferException;
import com.mediamanager.mapper.TrackHasArtistMapper;
import com.mediamanager.model.TrackHasArtist;
import com.mediamanager.protocol.TransportProtocol;
import com.mediamanager.protocol.messages.TrackHasArtistMessages;
import com.mediamanager.service.delegate.ActionHandler;
import com.mediamanager.service.delegate.annotation.Action;
import com.mediamanager.service.trackhasartist.TrackHasArtistService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@Action("trackhasartist.create")
public class CreateTrackHasArtistHandler implements ActionHandler {
private static final Logger logger = LogManager.getLogger(CreateTrackHasArtistHandler.class);
private final TrackHasArtistService trackHasArtistService;
public CreateTrackHasArtistHandler(TrackHasArtistService trackHasArtistService) {
this.trackHasArtistService = trackHasArtistService;
}
@Override
public TransportProtocol.Response.Builder handle(ByteString requestPayload) throws InvalidProtocolBufferException {
try{
TrackHasArtistMessages.CreateTrackHasArtistRequest createRequest =
TrackHasArtistMessages.CreateTrackHasArtistRequest.parseFrom(requestPayload);
TrackHasArtist trackHasArtist = trackHasArtistService.createTrackHasArtist(
createRequest.getFkTrackId() > 0 ? createRequest.getFkTrackId() : null,
createRequest.getFkArtistId() > 0 ? createRequest.getFkArtistId() : null
);
TrackHasArtistMessages.TrackHasArtist trackHasArtistProto = TrackHasArtistMapper.toProtobuf(trackHasArtist);
TrackHasArtistMessages.CreateTrackHasArtistResponse createTrackHasArtistResponse = TrackHasArtistMessages.CreateTrackHasArtistResponse.newBuilder()
.setTrackhasartist(trackHasArtistProto)
.build();
return TransportProtocol.Response.newBuilder()
.setPayload(createTrackHasArtistResponse.toByteString());
} catch (IllegalArgumentException e) {
logger.error("Validation error", e);
return TransportProtocol.Response.newBuilder()
.setStatusCode(400)
.setPayload(ByteString.copyFromUtf8("Validation error: " + e.getMessage()));
} catch (Exception e) {
logger.error("Error creating track has artist", e);
return TransportProtocol.Response.newBuilder()
.setStatusCode(500)
.setPayload(ByteString.copyFromUtf8("Error: " + e.getMessage()));
}
}
}
@@ -0,0 +1,62 @@
package com.mediamanager.service.delegate.handler.trackhasartist;
import com.google.protobuf.ByteString;
import com.google.protobuf.InvalidProtocolBufferException;
import com.mediamanager.protocol.TransportProtocol;
import com.mediamanager.protocol.messages.TrackHasArtistMessages;
import com.mediamanager.service.delegate.ActionHandler;
import com.mediamanager.service.delegate.annotation.Action;
import com.mediamanager.service.trackhasartist.TrackHasArtistService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@Action("trackhasartist.delete")
public class DeleteTrackHasArtistHandler implements ActionHandler {
private static final Logger logger = LogManager.getLogger(DeleteTrackHasArtistHandler.class);
private final TrackHasArtistService trackHasArtistService;
public DeleteTrackHasArtistHandler(TrackHasArtistService trackHasArtistService) {
this.trackHasArtistService = trackHasArtistService;
}
@Override
public TransportProtocol.Response.Builder handle(ByteString requestPayload)
throws InvalidProtocolBufferException {
try {
TrackHasArtistMessages.DeleteTrackHasArtistRequest deleteRequest =
TrackHasArtistMessages.DeleteTrackHasArtistRequest.parseFrom(requestPayload);
int id = deleteRequest.getId();
boolean success = trackHasArtistService.deleteTrackHasArtist(id);
TrackHasArtistMessages.DeleteTrackHasArtistResponse deleteResponse;
if (success) {
deleteResponse = TrackHasArtistMessages.DeleteTrackHasArtistResponse.newBuilder()
.setSuccess(true)
.setMessage("Track has artist deleted successfully")
.build();
return TransportProtocol.Response.newBuilder()
.setPayload(deleteResponse.toByteString());
} else {
deleteResponse = TrackHasArtistMessages.DeleteTrackHasArtistResponse.newBuilder()
.setSuccess(false)
.setMessage("Track has artist not found")
.build();
return TransportProtocol.Response.newBuilder()
.setStatusCode(404)
.setPayload(deleteResponse.toByteString());
}
} catch (Exception e) {
logger.error("Error deleting track has artist", e);
TrackHasArtistMessages.DeleteTrackHasArtistResponse deleteResponse =
TrackHasArtistMessages.DeleteTrackHasArtistResponse.newBuilder()
.setSuccess(false)
.setMessage("Error: " + e.getMessage())
.build();
return TransportProtocol.Response.newBuilder()
.setStatusCode(500)
.setPayload(deleteResponse.toByteString());
}
}
}
@@ -0,0 +1,56 @@
package com.mediamanager.service.delegate.handler.trackhasartist;
import com.google.protobuf.ByteString;
import com.google.protobuf.InvalidProtocolBufferException;
import com.mediamanager.mapper.TrackHasArtistMapper;
import com.mediamanager.model.TrackHasArtist;
import com.mediamanager.protocol.TransportProtocol;
import com.mediamanager.protocol.messages.TrackHasArtistMessages;
import com.mediamanager.service.delegate.ActionHandler;
import com.mediamanager.service.delegate.annotation.Action;
import com.mediamanager.service.trackhasartist.TrackHasArtistService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.util.Optional;
@Action(value = "trackhasartist.getById")
public class GetTrackHasArtistByIdHandler implements ActionHandler {
private static final Logger logger = LogManager.getLogger(GetTrackHasArtistByIdHandler.class);
private final TrackHasArtistService trackHasArtistService;
public GetTrackHasArtistByIdHandler(TrackHasArtistService trackHasArtistService) {
this.trackHasArtistService = trackHasArtistService;
}
@Override
public TransportProtocol.Response.Builder handle(ByteString requestPayload)
throws InvalidProtocolBufferException{
try{
TrackHasArtistMessages.GetTrackHasArtistByIdRequest getByIdRequest =
TrackHasArtistMessages.GetTrackHasArtistByIdRequest.parseFrom(requestPayload);
int id = getByIdRequest.getId();
Optional<TrackHasArtist> trackHasArtistOpt = trackHasArtistService.getTrackHasArtistById(id);
if (trackHasArtistOpt.isEmpty()){
logger.warn("TrackHasArtist not found with ID: {}", id);
return TransportProtocol.Response.newBuilder()
.setStatusCode(404)
.setPayload(ByteString.copyFromUtf8("TrackHasArtist not found"));
}
TrackHasArtistMessages.TrackHasArtist trackHasArtistProto = TrackHasArtistMapper.toProtobuf(trackHasArtistOpt.get());
TrackHasArtistMessages.GetTrackHasArtistByIdResponse getByIdResponse = TrackHasArtistMessages.GetTrackHasArtistByIdResponse.newBuilder()
.setTrackhasartist(trackHasArtistProto)
.build();
return TransportProtocol.Response.newBuilder()
.setPayload(getByIdResponse.toByteString());
} catch (Exception e) {
logger.error("Error getting track has artist by ID", e);
return TransportProtocol.Response.newBuilder()
.setStatusCode(500)
.setPayload(ByteString.copyFromUtf8("Error: "+ e.getMessage()));
}
}
}
@@ -0,0 +1,48 @@
package com.mediamanager.service.delegate.handler.trackhasartist;
import com.google.protobuf.ByteString;
import com.google.protobuf.InvalidProtocolBufferException;
import com.mediamanager.mapper.TrackHasArtistMapper;
import com.mediamanager.model.TrackHasArtist;
import com.mediamanager.protocol.TransportProtocol;
import com.mediamanager.protocol.messages.TrackHasArtistMessages;
import com.mediamanager.service.delegate.ActionHandler;
import com.mediamanager.service.delegate.annotation.Action;
import com.mediamanager.service.trackhasartist.TrackHasArtistService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.util.List;
@Action("trackhasartist.getAll")
public class GetTrackHasArtistHandler implements ActionHandler {
private static final Logger logger = LogManager.getLogger(GetTrackHasArtistHandler.class);
private final TrackHasArtistService trackHasArtistService;
public GetTrackHasArtistHandler(TrackHasArtistService trackHasArtistService){this.trackHasArtistService = trackHasArtistService;}
@Override
public TransportProtocol.Response.Builder handle(ByteString requestPayload) throws InvalidProtocolBufferException {
try{
List<TrackHasArtist> trackHasArtists = trackHasArtistService.getAllTrackHasArtists();
TrackHasArtistMessages.GetTrackHasArtistsResponse.Builder responseBuilder = TrackHasArtistMessages.GetTrackHasArtistsResponse.newBuilder();
for (TrackHasArtist trackHasArtist : trackHasArtists) {
TrackHasArtistMessages.TrackHasArtist trackHasArtistProto = TrackHasArtistMapper.toProtobuf(trackHasArtist);
responseBuilder.addTrackhasartist(trackHasArtistProto);
}
TrackHasArtistMessages.GetTrackHasArtistsResponse getTrackHasArtistsResponse = responseBuilder.build();
return TransportProtocol.Response.newBuilder()
.setPayload(getTrackHasArtistsResponse.toByteString());
}catch (Exception e){
logger.error("Error getting track has artists", e);
return TransportProtocol.Response.newBuilder()
.setStatusCode(500)
.setPayload(ByteString.copyFromUtf8("Error: " + e.getMessage()));
}
}
}
@@ -0,0 +1,54 @@
package com.mediamanager.service.delegate.handler.trackhascomposer;
import com.google.protobuf.ByteString;
import com.google.protobuf.InvalidProtocolBufferException;
import com.mediamanager.mapper.TrackHasComposerMapper;
import com.mediamanager.model.TrackHasComposer;
import com.mediamanager.protocol.TransportProtocol;
import com.mediamanager.protocol.messages.TrackHasComposerMessages;
import com.mediamanager.service.delegate.ActionHandler;
import com.mediamanager.service.delegate.annotation.Action;
import com.mediamanager.service.trackhascomposer.TrackHasComposerService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@Action("trackhascomposer.create")
public class CreateTrackHasComposerHandler implements ActionHandler {
private static final Logger logger = LogManager.getLogger(CreateTrackHasComposerHandler.class);
private final TrackHasComposerService trackHasComposerService;
public CreateTrackHasComposerHandler(TrackHasComposerService trackHasComposerService) {
this.trackHasComposerService = trackHasComposerService;
}
@Override
public TransportProtocol.Response.Builder handle(ByteString requestPayload) throws InvalidProtocolBufferException {
try{
TrackHasComposerMessages.CreateTrackHasComposerRequest createRequest =
TrackHasComposerMessages.CreateTrackHasComposerRequest.parseFrom(requestPayload);
TrackHasComposer trackHasComposer = trackHasComposerService.createTrackHasComposer(
createRequest.getFkTrackId() > 0 ? createRequest.getFkTrackId() : null,
createRequest.getFkComposerId() > 0 ? createRequest.getFkComposerId() : null
);
TrackHasComposerMessages.TrackHasComposer trackHasComposerProto = TrackHasComposerMapper.toProtobuf(trackHasComposer);
TrackHasComposerMessages.CreateTrackHasComposerResponse createTrackHasComposerResponse = TrackHasComposerMessages.CreateTrackHasComposerResponse.newBuilder()
.setTrackhascomposer(trackHasComposerProto)
.build();
return TransportProtocol.Response.newBuilder()
.setPayload(createTrackHasComposerResponse.toByteString());
} catch (IllegalArgumentException e) {
logger.error("Validation error", e);
return TransportProtocol.Response.newBuilder()
.setStatusCode(400)
.setPayload(ByteString.copyFromUtf8("Validation error: " + e.getMessage()));
} catch (Exception e) {
logger.error("Error creating track has composer", e);
return TransportProtocol.Response.newBuilder()
.setStatusCode(500)
.setPayload(ByteString.copyFromUtf8("Error: " + e.getMessage()));
}
}
}
@@ -0,0 +1,62 @@
package com.mediamanager.service.delegate.handler.trackhascomposer;
import com.google.protobuf.ByteString;
import com.google.protobuf.InvalidProtocolBufferException;
import com.mediamanager.protocol.TransportProtocol;
import com.mediamanager.protocol.messages.TrackHasComposerMessages;
import com.mediamanager.service.delegate.ActionHandler;
import com.mediamanager.service.delegate.annotation.Action;
import com.mediamanager.service.trackhascomposer.TrackHasComposerService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@Action("trackhascomposer.delete")
public class DeleteTrackHasComposerHandler implements ActionHandler {
private static final Logger logger = LogManager.getLogger(DeleteTrackHasComposerHandler.class);
private final TrackHasComposerService trackHasComposerService;
public DeleteTrackHasComposerHandler(TrackHasComposerService trackHasComposerService) {
this.trackHasComposerService = trackHasComposerService;
}
@Override
public TransportProtocol.Response.Builder handle(ByteString requestPayload)
throws InvalidProtocolBufferException {
try {
TrackHasComposerMessages.DeleteTrackHasComposerRequest deleteRequest =
TrackHasComposerMessages.DeleteTrackHasComposerRequest.parseFrom(requestPayload);
int id = deleteRequest.getId();
boolean success = trackHasComposerService.deleteTrackHasComposer(id);
TrackHasComposerMessages.DeleteTrackHasComposerResponse deleteResponse;
if (success) {
deleteResponse = TrackHasComposerMessages.DeleteTrackHasComposerResponse.newBuilder()
.setSuccess(true)
.setMessage("Track has composer deleted successfully")
.build();
return TransportProtocol.Response.newBuilder()
.setPayload(deleteResponse.toByteString());
} else {
deleteResponse = TrackHasComposerMessages.DeleteTrackHasComposerResponse.newBuilder()
.setSuccess(false)
.setMessage("Track has composer not found")
.build();
return TransportProtocol.Response.newBuilder()
.setStatusCode(404)
.setPayload(deleteResponse.toByteString());
}
} catch (Exception e) {
logger.error("Error deleting track has composer", e);
TrackHasComposerMessages.DeleteTrackHasComposerResponse deleteResponse =
TrackHasComposerMessages.DeleteTrackHasComposerResponse.newBuilder()
.setSuccess(false)
.setMessage("Error: " + e.getMessage())
.build();
return TransportProtocol.Response.newBuilder()
.setStatusCode(500)
.setPayload(deleteResponse.toByteString());
}
}
}
@@ -0,0 +1,56 @@
package com.mediamanager.service.delegate.handler.trackhascomposer;
import com.google.protobuf.ByteString;
import com.google.protobuf.InvalidProtocolBufferException;
import com.mediamanager.mapper.TrackHasComposerMapper;
import com.mediamanager.model.TrackHasComposer;
import com.mediamanager.protocol.TransportProtocol;
import com.mediamanager.protocol.messages.TrackHasComposerMessages;
import com.mediamanager.service.delegate.ActionHandler;
import com.mediamanager.service.delegate.annotation.Action;
import com.mediamanager.service.trackhascomposer.TrackHasComposerService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.util.Optional;
@Action(value = "trackhascomposer.getById")
public class GetTrackHasComposerByIdHandler implements ActionHandler {
private static final Logger logger = LogManager.getLogger(GetTrackHasComposerByIdHandler.class);
private final TrackHasComposerService trackHasComposerService;
public GetTrackHasComposerByIdHandler(TrackHasComposerService trackHasComposerService) {
this.trackHasComposerService = trackHasComposerService;
}
@Override
public TransportProtocol.Response.Builder handle(ByteString requestPayload)
throws InvalidProtocolBufferException{
try{
TrackHasComposerMessages.GetTrackHasComposerByIdRequest getByIdRequest =
TrackHasComposerMessages.GetTrackHasComposerByIdRequest.parseFrom(requestPayload);
int id = getByIdRequest.getId();
Optional<TrackHasComposer> trackHasComposerOpt = trackHasComposerService.getTrackHasComposerById(id);
if (trackHasComposerOpt.isEmpty()){
logger.warn("TrackHasComposer not found with ID: {}", id);
return TransportProtocol.Response.newBuilder()
.setStatusCode(404)
.setPayload(ByteString.copyFromUtf8("TrackHasComposer not found"));
}
TrackHasComposerMessages.TrackHasComposer trackHasComposerProto = TrackHasComposerMapper.toProtobuf(trackHasComposerOpt.get());
TrackHasComposerMessages.GetTrackHasComposerByIdResponse getByIdResponse = TrackHasComposerMessages.GetTrackHasComposerByIdResponse.newBuilder()
.setTrackhascomposer(trackHasComposerProto)
.build();
return TransportProtocol.Response.newBuilder()
.setPayload(getByIdResponse.toByteString());
} catch (Exception e) {
logger.error("Error getting track has composer by ID", e);
return TransportProtocol.Response.newBuilder()
.setStatusCode(500)
.setPayload(ByteString.copyFromUtf8("Error: "+ e.getMessage()));
}
}
}
@@ -0,0 +1,48 @@
package com.mediamanager.service.delegate.handler.trackhascomposer;
import com.google.protobuf.ByteString;
import com.google.protobuf.InvalidProtocolBufferException;
import com.mediamanager.mapper.TrackHasComposerMapper;
import com.mediamanager.model.TrackHasComposer;
import com.mediamanager.protocol.TransportProtocol;
import com.mediamanager.protocol.messages.TrackHasComposerMessages;
import com.mediamanager.service.delegate.ActionHandler;
import com.mediamanager.service.delegate.annotation.Action;
import com.mediamanager.service.trackhascomposer.TrackHasComposerService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.util.List;
@Action("trackhascomposer.getAll")
public class GetTrackHasComposerHandler implements ActionHandler {
private static final Logger logger = LogManager.getLogger(GetTrackHasComposerHandler.class);
private final TrackHasComposerService trackHasComposerService;
public GetTrackHasComposerHandler(TrackHasComposerService trackHasComposerService){this.trackHasComposerService = trackHasComposerService;}
@Override
public TransportProtocol.Response.Builder handle(ByteString requestPayload) throws InvalidProtocolBufferException {
try{
List<TrackHasComposer> trackHasComposers = trackHasComposerService.getAllTrackHasComposers();
TrackHasComposerMessages.GetTrackHasComposersResponse.Builder responseBuilder = TrackHasComposerMessages.GetTrackHasComposersResponse.newBuilder();
for (TrackHasComposer trackHasComposer : trackHasComposers) {
TrackHasComposerMessages.TrackHasComposer trackHasComposerProto = TrackHasComposerMapper.toProtobuf(trackHasComposer);
responseBuilder.addTrackhascomposer(trackHasComposerProto);
}
TrackHasComposerMessages.GetTrackHasComposersResponse getTrackHasComposersResponse = responseBuilder.build();
return TransportProtocol.Response.newBuilder()
.setPayload(getTrackHasComposersResponse.toByteString());
}catch (Exception e){
logger.error("Error getting track has composers", e);
return TransportProtocol.Response.newBuilder()
.setStatusCode(500)
.setPayload(ByteString.copyFromUtf8("Error: " + e.getMessage()));
}
}
}
@@ -0,0 +1,54 @@
package com.mediamanager.service.delegate.handler.trackhasgenre;
import com.google.protobuf.ByteString;
import com.google.protobuf.InvalidProtocolBufferException;
import com.mediamanager.mapper.TrackHasGenreMapper;
import com.mediamanager.model.TrackHasGenre;
import com.mediamanager.protocol.TransportProtocol;
import com.mediamanager.protocol.messages.TrackHasGenreMessages;
import com.mediamanager.service.delegate.ActionHandler;
import com.mediamanager.service.delegate.annotation.Action;
import com.mediamanager.service.trackhasgenre.TrackHasGenreService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@Action("trackhasgenre.create")
public class CreateTrackHasGenreHandler implements ActionHandler {
private static final Logger logger = LogManager.getLogger(CreateTrackHasGenreHandler.class);
private final TrackHasGenreService trackHasGenreService;
public CreateTrackHasGenreHandler(TrackHasGenreService trackHasGenreService) {
this.trackHasGenreService = trackHasGenreService;
}
@Override
public TransportProtocol.Response.Builder handle(ByteString requestPayload) throws InvalidProtocolBufferException {
try{
TrackHasGenreMessages.CreateTrackHasGenreRequest createRequest =
TrackHasGenreMessages.CreateTrackHasGenreRequest.parseFrom(requestPayload);
TrackHasGenre trackHasGenre = trackHasGenreService.createTrackHasGenre(
createRequest.getFkTrackId() > 0 ? createRequest.getFkTrackId() : null,
createRequest.getFkGenreId() > 0 ? createRequest.getFkGenreId() : null
);
TrackHasGenreMessages.TrackHasGenre trackHasGenreProto = TrackHasGenreMapper.toProtobuf(trackHasGenre);
TrackHasGenreMessages.CreateTrackHasGenreResponse createTrackHasGenreResponse = TrackHasGenreMessages.CreateTrackHasGenreResponse.newBuilder()
.setTrackhasgenre(trackHasGenreProto)
.build();
return TransportProtocol.Response.newBuilder()
.setPayload(createTrackHasGenreResponse.toByteString());
} catch (IllegalArgumentException e) {
logger.error("Validation error", e);
return TransportProtocol.Response.newBuilder()
.setStatusCode(400)
.setPayload(ByteString.copyFromUtf8("Validation error: " + e.getMessage()));
} catch (Exception e) {
logger.error("Error creating track has genre", e);
return TransportProtocol.Response.newBuilder()
.setStatusCode(500)
.setPayload(ByteString.copyFromUtf8("Error: " + e.getMessage()));
}
}
}
@@ -0,0 +1,62 @@
package com.mediamanager.service.delegate.handler.trackhasgenre;
import com.google.protobuf.ByteString;
import com.google.protobuf.InvalidProtocolBufferException;
import com.mediamanager.protocol.TransportProtocol;
import com.mediamanager.protocol.messages.TrackHasGenreMessages;
import com.mediamanager.service.delegate.ActionHandler;
import com.mediamanager.service.delegate.annotation.Action;
import com.mediamanager.service.trackhasgenre.TrackHasGenreService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@Action("trackhasgenre.delete")
public class DeleteTrackHasGenreHandler implements ActionHandler {
private static final Logger logger = LogManager.getLogger(DeleteTrackHasGenreHandler.class);
private final TrackHasGenreService trackHasGenreService;
public DeleteTrackHasGenreHandler(TrackHasGenreService trackHasGenreService) {
this.trackHasGenreService = trackHasGenreService;
}
@Override
public TransportProtocol.Response.Builder handle(ByteString requestPayload)
throws InvalidProtocolBufferException {
try {
TrackHasGenreMessages.DeleteTrackHasGenreRequest deleteRequest =
TrackHasGenreMessages.DeleteTrackHasGenreRequest.parseFrom(requestPayload);
int id = deleteRequest.getId();
boolean success = trackHasGenreService.deleteTrackHasGenre(id);
TrackHasGenreMessages.DeleteTrackHasGenreResponse deleteResponse;
if (success) {
deleteResponse = TrackHasGenreMessages.DeleteTrackHasGenreResponse.newBuilder()
.setSuccess(true)
.setMessage("Track has genre deleted successfully")
.build();
return TransportProtocol.Response.newBuilder()
.setPayload(deleteResponse.toByteString());
} else {
deleteResponse = TrackHasGenreMessages.DeleteTrackHasGenreResponse.newBuilder()
.setSuccess(false)
.setMessage("Track has genre not found")
.build();
return TransportProtocol.Response.newBuilder()
.setStatusCode(404)
.setPayload(deleteResponse.toByteString());
}
} catch (Exception e) {
logger.error("Error deleting track has genre", e);
TrackHasGenreMessages.DeleteTrackHasGenreResponse deleteResponse =
TrackHasGenreMessages.DeleteTrackHasGenreResponse.newBuilder()
.setSuccess(false)
.setMessage("Error: " + e.getMessage())
.build();
return TransportProtocol.Response.newBuilder()
.setStatusCode(500)
.setPayload(deleteResponse.toByteString());
}
}
}
@@ -0,0 +1,66 @@
package com.mediamanager.service.delegate.handler.trackhasgenre;
import com.google.protobuf.ByteString;
import com.google.protobuf.InvalidProtocolBufferException;
import com.mediamanager.mapper.TrackHasGenreMapper;
import com.mediamanager.model.TrackHasGenre;
import com.mediamanager.protocol.TransportProtocol;
import com.mediamanager.protocol.messages.TrackHasGenreMessages;
import com.mediamanager.service.delegate.ActionHandler;
import com.mediamanager.service.delegate.annotation.Action;
import com.mediamanager.service.trackhasgenre.TrackHasGenreService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.util.Optional;
@Action(value = "trackhasgenre.getById")
public class GetTrackHasGenreByIdHandler implements ActionHandler {
private static final Logger logger = LogManager.getLogger(GetTrackHasGenreByIdHandler.class);
private final TrackHasGenreService trackHasGenreService;
public GetTrackHasGenreByIdHandler(TrackHasGenreService trackHasGenreService) {
this.trackHasGenreService = trackHasGenreService;
}
@Override
public TransportProtocol.Response.Builder handle(ByteString requestPayload)
throws InvalidProtocolBufferException{
try{
TrackHasGenreMessages.GetTrackHasGenreByIdRequest getByIdRequest =
TrackHasGenreMessages.GetTrackHasGenreByIdRequest.parseFrom(requestPayload);
int id = getByIdRequest.getId();
if (id <= 0) {
throw new IllegalArgumentException("ID must be greater than 0");
}
Optional<TrackHasGenre> trackHasGenreOpt = trackHasGenreService.getTrackHasGenreById(id);
if (trackHasGenreOpt.isEmpty()){
logger.warn("TrackHasGenre not found with ID: {}", id);
return TransportProtocol.Response.newBuilder()
.setStatusCode(404)
.setPayload(ByteString.copyFromUtf8("TrackHasGenre not found"));
}
TrackHasGenreMessages.TrackHasGenre trackHasGenreProto = TrackHasGenreMapper.toProtobuf(trackHasGenreOpt.get());
TrackHasGenreMessages.GetTrackHasGenreByIdResponse getByIdResponse = TrackHasGenreMessages.GetTrackHasGenreByIdResponse.newBuilder()
.setTrackhasgenre(trackHasGenreProto)
.build();
return TransportProtocol.Response.newBuilder()
.setStatusCode(200)
.setPayload(getByIdResponse.toByteString());
} catch (IllegalArgumentException e) {
logger.error("Validation error", e);
return TransportProtocol.Response.newBuilder()
.setStatusCode(400)
.setPayload(ByteString.copyFromUtf8("Validation error: " + e.getMessage()));
} catch (Exception e) {
logger.error("Error getting track has genre by ID", e);
return TransportProtocol.Response.newBuilder()
.setStatusCode(500)
.setPayload(ByteString.copyFromUtf8("Error: "+ e.getMessage()));
}
}
}
@@ -0,0 +1,48 @@
package com.mediamanager.service.delegate.handler.trackhasgenre;
import com.google.protobuf.ByteString;
import com.google.protobuf.InvalidProtocolBufferException;
import com.mediamanager.mapper.TrackHasGenreMapper;
import com.mediamanager.model.TrackHasGenre;
import com.mediamanager.protocol.TransportProtocol;
import com.mediamanager.protocol.messages.TrackHasGenreMessages;
import com.mediamanager.service.delegate.ActionHandler;
import com.mediamanager.service.delegate.annotation.Action;
import com.mediamanager.service.trackhasgenre.TrackHasGenreService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.util.List;
@Action("trackhasgenre.getAll")
public class GetTrackHasGenreHandler implements ActionHandler {
private static final Logger logger = LogManager.getLogger(GetTrackHasGenreHandler.class);
private final TrackHasGenreService trackHasGenreService;
public GetTrackHasGenreHandler(TrackHasGenreService trackHasGenreService){this.trackHasGenreService = trackHasGenreService;}
@Override
public TransportProtocol.Response.Builder handle(ByteString requestPayload) throws InvalidProtocolBufferException {
try{
List<TrackHasGenre> trackHasGenres = trackHasGenreService.getAllTrackHasGenres();
TrackHasGenreMessages.GetTrackHasGenresResponse.Builder responseBuilder = TrackHasGenreMessages.GetTrackHasGenresResponse.newBuilder();
for (TrackHasGenre trackHasGenre : trackHasGenres) {
TrackHasGenreMessages.TrackHasGenre trackHasGenreProto = TrackHasGenreMapper.toProtobuf(trackHasGenre);
responseBuilder.addTrackhasgenre(trackHasGenreProto);
}
TrackHasGenreMessages.GetTrackHasGenresResponse getTrackHasGenresResponse = responseBuilder.build();
return TransportProtocol.Response.newBuilder()
.setPayload(getTrackHasGenresResponse.toByteString());
}catch (Exception e){
logger.error("Error getting track has genres", e);
return TransportProtocol.Response.newBuilder()
.setStatusCode(500)
.setPayload(ByteString.copyFromUtf8("Error: " + e.getMessage()));
}
}
}
@@ -0,0 +1,98 @@
package com.mediamanager.service.disc;
import com.mediamanager.model.Album;
import com.mediamanager.model.Disc;
import com.mediamanager.repository.AlbumRepository;
import com.mediamanager.repository.DiscRepository;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.util.List;
import java.util.Optional;
public class DiscService {
private static final Logger logger = LogManager.getLogger(DiscService.class);
private final DiscRepository repository;
private final AlbumRepository albumRepository;
public DiscService(DiscRepository repository, AlbumRepository albumRepository) {
this.repository = repository;
this.albumRepository = albumRepository;
}
public Disc createDisc(Integer discNumber, Integer albumId) {
logger.debug("Creating disc with number: {}", discNumber);
if (discNumber == null) {
throw new IllegalArgumentException("Disc number cannot be null");
}
if (albumId == null) {
throw new IllegalArgumentException("Album ID cannot be null");
}
Disc disc = new Disc();
disc.setDiscNumber(discNumber);
// Set Album (required)
Optional<Album> album = albumRepository.findById(albumId);
if (album.isEmpty()) {
throw new IllegalArgumentException("Album not found with id: " + albumId);
}
disc.setAlbum(album.get());
return repository.save(disc);
}
public List<Disc> getAllDiscs() {
logger.info("Getting all discs");
return repository.findAll();
}
public Optional<Disc> getDiscById(Integer id) {
if (id == null) {
throw new IllegalArgumentException("ID cannot be null");
}
logger.info("Getting disc by id: {}", id);
return repository.findById(id);
}
public Optional<Disc> updateDisc(Integer id, Integer discNumber, Integer albumId) {
if (id == null) {
throw new IllegalArgumentException("ID cannot be null");
}
if (discNumber == null) {
throw new IllegalArgumentException("Disc number cannot be null");
}
if (albumId == null) {
throw new IllegalArgumentException("Album ID cannot be null");
}
logger.info("Updating disc with id: {}", id);
Optional<Disc> existingDisc = repository.findById(id);
if (existingDisc.isEmpty()) {
logger.warn("Disc not found with id: {}", id);
return Optional.empty();
}
Disc disc = existingDisc.get();
disc.setDiscNumber(discNumber);
// Update Album
Optional<Album> album = albumRepository.findById(albumId);
if (album.isEmpty()) {
throw new IllegalArgumentException("Album not found with id: " + albumId);
}
disc.setAlbum(album.get());
Disc updatedDisc = repository.update(disc);
return Optional.of(updatedDisc);
}
public boolean deleteDisc(Integer id) {
if (id == null) {
throw new IllegalArgumentException("Disc id cannot be null");
}
logger.info("Deleting disc: {}", id);
return repository.deleteById(id);
}
}
@@ -0,0 +1,213 @@
package com.mediamanager.service.track;
import com.mediamanager.model.*;
import com.mediamanager.repository.*;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.util.List;
import java.util.Optional;
public class TrackService {
private static final Logger logger = LogManager.getLogger(TrackService.class);
private final TrackRepository repository;
private final DiscRepository discRepository;
private final ComposerRepository composerRepository;
private final BitDepthRepository bitDepthRepository;
private final BitRateRepository bitRateRepository;
private final SamplingRateRepository samplingRateRepository;
public TrackService(TrackRepository repository,
DiscRepository discRepository,
ComposerRepository composerRepository,
BitDepthRepository bitDepthRepository,
BitRateRepository bitRateRepository,
SamplingRateRepository samplingRateRepository) {
this.repository = repository;
this.discRepository = discRepository;
this.composerRepository = composerRepository;
this.bitDepthRepository = bitDepthRepository;
this.bitRateRepository = bitRateRepository;
this.samplingRateRepository = samplingRateRepository;
}
public Track createTrack(Integer trackNumber, String title, Integer duration,
String filepath, Integer discId, Integer composerId,
Integer bitDepthId, Integer bitRateId, Integer samplingRateId) {
logger.debug("Creating track with title: {}", title);
if (trackNumber == null) {
throw new IllegalArgumentException("Track number cannot be null");
}
if (title == null || title.isEmpty()) {
throw new IllegalArgumentException("Title cannot be null or empty");
}
if (filepath == null || filepath.isEmpty()) {
throw new IllegalArgumentException("Filepath cannot be null or empty");
}
if (discId == null) {
throw new IllegalArgumentException("Disc ID cannot be null");
}
Track track = new Track();
track.setTrackNumber(trackNumber);
track.setTitle(title);
track.setDuration(duration);
track.setFilepath(filepath);
// Set Disc (required)
Optional<Disc> disc = discRepository.findById(discId);
if (disc.isEmpty()) {
throw new IllegalArgumentException("Disc not found with id: " + discId);
}
track.setDisc(disc.get());
// Set Composer (optional)
if (composerId != null) {
Optional<Composer> composer = composerRepository.findById(composerId);
if (composer.isEmpty()) {
throw new IllegalArgumentException("Composer not found with id: " + composerId);
}
track.setComposer(composer.get());
}
// Set BitDepth (optional)
if (bitDepthId != null) {
Optional<BitDepth> bitDepth = bitDepthRepository.findById(bitDepthId);
if (bitDepth.isEmpty()) {
throw new IllegalArgumentException("BitDepth not found with id: " + bitDepthId);
}
track.setBitDepth(bitDepth.get());
}
// Set BitRate (optional)
if (bitRateId != null) {
Optional<BitRate> bitRate = bitRateRepository.findById(bitRateId);
if (bitRate.isEmpty()) {
throw new IllegalArgumentException("BitRate not found with id: " + bitRateId);
}
track.setBitRate(bitRate.get());
}
// Set SamplingRate (optional)
if (samplingRateId != null) {
Optional<SamplingRate> samplingRate = samplingRateRepository.findById(samplingRateId);
if (samplingRate.isEmpty()) {
throw new IllegalArgumentException("SamplingRate not found with id: " + samplingRateId);
}
track.setSamplingRate(samplingRate.get());
}
return repository.save(track);
}
public List<Track> getAllTracks() {
logger.info("Getting all tracks");
return repository.findAll();
}
public Optional<Track> getTrackById(Integer id) {
if (id == null) {
throw new IllegalArgumentException("ID cannot be null");
}
logger.info("Getting track by id: {}", id);
return repository.findById(id);
}
public Optional<Track> updateTrack(Integer id, Integer trackNumber, String title,
Integer duration, String filepath, Integer discId,
Integer composerId, Integer bitDepthId,
Integer bitRateId, Integer samplingRateId) {
if (id == null) {
throw new IllegalArgumentException("ID cannot be null");
}
if (trackNumber == null) {
throw new IllegalArgumentException("Track number cannot be null");
}
if (title == null || title.isEmpty()) {
throw new IllegalArgumentException("Title cannot be null or empty");
}
if (filepath == null || filepath.isEmpty()) {
throw new IllegalArgumentException("Filepath cannot be null or empty");
}
if (discId == null) {
throw new IllegalArgumentException("Disc ID cannot be null");
}
logger.info("Updating track with id: {}", id);
Optional<Track> existingTrack = repository.findById(id);
if (existingTrack.isEmpty()) {
logger.warn("Track not found with id: {}", id);
return Optional.empty();
}
Track track = existingTrack.get();
track.setTrackNumber(trackNumber);
track.setTitle(title);
track.setDuration(duration);
track.setFilepath(filepath);
// Update Disc (required)
Optional<Disc> disc = discRepository.findById(discId);
if (disc.isEmpty()) {
throw new IllegalArgumentException("Disc not found with id: " + discId);
}
track.setDisc(disc.get());
// Update Composer (optional)
if (composerId != null) {
Optional<Composer> composer = composerRepository.findById(composerId);
if (composer.isEmpty()) {
throw new IllegalArgumentException("Composer not found with id: " + composerId);
}
track.setComposer(composer.get());
} else {
track.setComposer(null);
}
// Update BitDepth (optional)
if (bitDepthId != null) {
Optional<BitDepth> bitDepth = bitDepthRepository.findById(bitDepthId);
if (bitDepth.isEmpty()) {
throw new IllegalArgumentException("BitDepth not found with id: " + bitDepthId);
}
track.setBitDepth(bitDepth.get());
} else {
track.setBitDepth(null);
}
// Update BitRate (optional)
if (bitRateId != null) {
Optional<BitRate> bitRate = bitRateRepository.findById(bitRateId);
if (bitRate.isEmpty()) {
throw new IllegalArgumentException("BitRate not found with id: " + bitRateId);
}
track.setBitRate(bitRate.get());
} else {
track.setBitRate(null);
}
// Update SamplingRate (optional)
if (samplingRateId != null) {
Optional<SamplingRate> samplingRate = samplingRateRepository.findById(samplingRateId);
if (samplingRate.isEmpty()) {
throw new IllegalArgumentException("SamplingRate not found with id: " + samplingRateId);
}
track.setSamplingRate(samplingRate.get());
} else {
track.setSamplingRate(null);
}
Track updatedTrack = repository.update(track);
return Optional.of(updatedTrack);
}
public boolean deleteTrack(Integer id) {
if (id == null) {
throw new IllegalArgumentException("Track id cannot be null");
}
logger.info("Deleting track: {}", id);
return repository.deleteById(id);
}
}
@@ -0,0 +1,77 @@
package com.mediamanager.service.trackhasartist;
import com.mediamanager.model.Track;
import com.mediamanager.model.TrackHasArtist;
import com.mediamanager.model.Artist;
import com.mediamanager.repository.TrackHasArtistRepository;
import com.mediamanager.repository.TrackRepository;
import com.mediamanager.repository.ArtistRepository;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.util.List;
import java.util.Optional;
public class TrackHasArtistService {
private static final Logger logger = LogManager.getLogger(TrackHasArtistService.class);
private final TrackHasArtistRepository repository;
private final TrackRepository trackRepository;
private final ArtistRepository artistRepository;
public TrackHasArtistService(TrackHasArtistRepository repository, TrackRepository trackRepository, ArtistRepository artistRepository) {
this.repository = repository;
this.trackRepository = trackRepository;
this.artistRepository = artistRepository;
}
public TrackHasArtist createTrackHasArtist(Integer trackId, Integer artistId) {
logger.debug("Creating track has artist relationship - trackId:{}, artistId:{}", trackId, artistId);
if (trackId == null || trackId <= 0) {
throw new IllegalArgumentException("Track ID cannot be null or invalid");
}
if (artistId == null || artistId <= 0) {
throw new IllegalArgumentException("Artist ID cannot be null or invalid");
}
// Verify Track exists
Optional<Track> track = trackRepository.findById(trackId);
if (track.isEmpty()) {
throw new IllegalArgumentException("Track not found with id: " + trackId);
}
// Verify Artist exists
Optional<Artist> artist = artistRepository.findById(artistId);
if (artist.isEmpty()) {
throw new IllegalArgumentException("Artist not found with id: " + artistId);
}
TrackHasArtist trackHasArtist = new TrackHasArtist();
trackHasArtist.setTrack(track.get());
trackHasArtist.setArtist(artist.get());
return repository.save(trackHasArtist);
}
public List<TrackHasArtist> getAllTrackHasArtists() {
logger.info("Getting all track has artist relationships");
return repository.findAll();
}
public Optional<TrackHasArtist> getTrackHasArtistById(Integer id) {
if (id == null) {
throw new IllegalArgumentException("ID cannot be null");
}
logger.info("Getting track has artist by id:{}", id);
return repository.findById(id);
}
public boolean deleteTrackHasArtist(Integer id) {
if (id == null) {
throw new IllegalArgumentException("Track has artist id cannot be null");
}
logger.info("Deleting track has artist:{}", id);
return repository.deleteById(id);
}
}
@@ -0,0 +1,77 @@
package com.mediamanager.service.trackhascomposer;
import com.mediamanager.model.Track;
import com.mediamanager.model.TrackHasComposer;
import com.mediamanager.model.Composer;
import com.mediamanager.repository.TrackHasComposerRepository;
import com.mediamanager.repository.TrackRepository;
import com.mediamanager.repository.ComposerRepository;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.util.List;
import java.util.Optional;
public class TrackHasComposerService {
private static final Logger logger = LogManager.getLogger(TrackHasComposerService.class);
private final TrackHasComposerRepository repository;
private final TrackRepository trackRepository;
private final ComposerRepository composerRepository;
public TrackHasComposerService(TrackHasComposerRepository repository, TrackRepository trackRepository, ComposerRepository composerRepository) {
this.repository = repository;
this.trackRepository = trackRepository;
this.composerRepository = composerRepository;
}
public TrackHasComposer createTrackHasComposer(Integer trackId, Integer composerId) {
logger.debug("Creating track has composer relationship - trackId:{}, composerId:{}", trackId, composerId);
if (trackId == null || trackId <= 0) {
throw new IllegalArgumentException("Track ID cannot be null or invalid");
}
if (composerId == null || composerId <= 0) {
throw new IllegalArgumentException("Composer ID cannot be null or invalid");
}
// Verify Track exists
Optional<Track> track = trackRepository.findById(trackId);
if (track.isEmpty()) {
throw new IllegalArgumentException("Track not found with id: " + trackId);
}
// Verify Composer exists
Optional<Composer> composer = composerRepository.findById(composerId);
if (composer.isEmpty()) {
throw new IllegalArgumentException("Composer not found with id: " + composerId);
}
TrackHasComposer trackHasComposer = new TrackHasComposer();
trackHasComposer.setTrack(track.get());
trackHasComposer.setComposer(composer.get());
return repository.save(trackHasComposer);
}
public List<TrackHasComposer> getAllTrackHasComposers() {
logger.info("Getting all track has composer relationships");
return repository.findAll();
}
public Optional<TrackHasComposer> getTrackHasComposerById(Integer id) {
if (id == null) {
throw new IllegalArgumentException("ID cannot be null");
}
logger.info("Getting track has composer by id:{}", id);
return repository.findById(id);
}
public boolean deleteTrackHasComposer(Integer id) {
if (id == null) {
throw new IllegalArgumentException("Track has composer id cannot be null");
}
logger.info("Deleting track has composer:{}", id);
return repository.deleteById(id);
}
}
@@ -0,0 +1,77 @@
package com.mediamanager.service.trackhasgenre;
import com.mediamanager.model.Track;
import com.mediamanager.model.TrackHasGenre;
import com.mediamanager.model.Genre;
import com.mediamanager.repository.TrackHasGenreRepository;
import com.mediamanager.repository.TrackRepository;
import com.mediamanager.repository.GenreRepository;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.util.List;
import java.util.Optional;
public class TrackHasGenreService {
private static final Logger logger = LogManager.getLogger(TrackHasGenreService.class);
private final TrackHasGenreRepository repository;
private final TrackRepository trackRepository;
private final GenreRepository genreRepository;
public TrackHasGenreService(TrackHasGenreRepository repository, TrackRepository trackRepository, GenreRepository genreRepository) {
this.repository = repository;
this.trackRepository = trackRepository;
this.genreRepository = genreRepository;
}
public TrackHasGenre createTrackHasGenre(Integer trackId, Integer genreId) {
logger.debug("Creating track has genre relationship - trackId:{}, genreId:{}", trackId, genreId);
if (trackId == null || trackId <= 0) {
throw new IllegalArgumentException("Track ID cannot be null or invalid");
}
if (genreId == null || genreId <= 0) {
throw new IllegalArgumentException("Genre ID cannot be null or invalid");
}
// Verify Track exists
Optional<Track> track = trackRepository.findById(trackId);
if (track.isEmpty()) {
throw new IllegalArgumentException("Track not found with id: " + trackId);
}
// Verify Genre exists
Optional<Genre> genre = genreRepository.findById(genreId);
if (genre.isEmpty()) {
throw new IllegalArgumentException("Genre not found with id: " + genreId);
}
TrackHasGenre trackHasGenre = new TrackHasGenre();
trackHasGenre.setTrack(track.get());
trackHasGenre.setGenre(genre.get());
return repository.save(trackHasGenre);
}
public List<TrackHasGenre> getAllTrackHasGenres() {
logger.info("Getting all track has genre relationships");
return repository.findAll();
}
public Optional<TrackHasGenre> getTrackHasGenreById(Integer id) {
if (id == null) {
throw new IllegalArgumentException("ID cannot be null");
}
logger.info("Getting track has genre by id:{}", id);
return repository.findById(id);
}
public boolean deleteTrackHasGenre(Integer id) {
if (id == null) {
throw new IllegalArgumentException("Track has genre id cannot be null");
}
logger.info("Deleting track has genre:{}", id);
return repository.deleteById(id);
}
}
+77
View File
@@ -0,0 +1,77 @@
syntax = "proto3";
import "google/protobuf/wrappers.proto"; // ← Adicione esse import!
option java_package = "com.mediamanager.protocol.messages";
option java_outer_classname = "AlbumMessages";
package mediamanager.messages;
message Album {
int32 id = 1;
string name = 2;
int32 year = 3;
int32 number_of_discs = 4;
string code = 5;
bool is_compilation = 6;
int32 fk_albumtype_id = 7;
int32 fk_albumart_id = 8;
int64 created_at = 9;
int64 updated_at = 10;
}
message CreateAlbumRequest {
string name = 1;
int32 year = 2;
int32 number_of_discs = 3;
string code = 4;
bool is_compilation = 5;
int32 fk_albumtype_id = 6;
int32 fk_albumart_id = 7;
}
message CreateAlbumResponse {
Album album = 1;
}
message GetAlbumsRequest {
}
message GetAlbumsResponse {
repeated Album albums = 1;
}
message GetAlbumByIdRequest {
int32 id = 1;
}
message GetAlbumByIdResponse {
Album album = 1;
}
message UpdateAlbumRequest {
int32 id = 1;
string name = 2;
google.protobuf.Int32Value year = 3; // ← Mudou!
google.protobuf.Int32Value number_of_discs = 4; // ← Mudou!
string code = 5;
bool is_compilation = 6;
google.protobuf.Int32Value fk_albumtype_id = 7; // ← Mudou!
google.protobuf.Int32Value fk_albumart_id = 8; // ← Mudou!
}
message UpdateAlbumResponse {
Album album = 1;
}
message DeleteAlbumRequest {
int32 id = 1;
}
message DeleteAlbumResponse {
bool success = 1;
string message = 2;
}
+46
View File
@@ -0,0 +1,46 @@
syntax = "proto3";
option java_package = "com.mediamanager.protocol.messages";
option java_outer_classname = "AlbumHasArtistMessages";
package mediamanager.messages;
message AlbumHasArtist {
int32 id = 1;
int32 fk_album_id = 2;
int32 fk_artist_id = 3;
}
message CreateAlbumHasArtistRequest {
int32 fk_album_id = 1;
int32 fk_artist_id = 2;
}
message CreateAlbumHasArtistResponse {
AlbumHasArtist albumhasartist = 1;
}
message GetAlbumHasArtistsRequest {
}
message GetAlbumHasArtistsResponse {
repeated AlbumHasArtist albumhasartist = 1;
}
message GetAlbumHasArtistByIdRequest {
int32 id = 1;
}
message GetAlbumHasArtistByIdResponse {
AlbumHasArtist albumhasartist = 1;
}
message DeleteAlbumHasArtistRequest {
int32 id = 1;
}
message DeleteAlbumHasArtistResponse {
bool success = 1;
string message = 2;
}
+46
View File
@@ -0,0 +1,46 @@
syntax = "proto3";
option java_package = "com.mediamanager.protocol.messages";
option java_outer_classname = "AlbumHasGenreMessages";
package mediamanager.messages;
message AlbumHasGenre {
int32 id = 1;
int32 fk_album_id = 2;
int32 fk_genre_id = 3;
}
message CreateAlbumHasGenreRequest {
int32 fk_album_id = 1;
int32 fk_genre_id = 2;
}
message CreateAlbumHasGenreResponse {
AlbumHasGenre albumhasgenre = 1;
}
message GetAlbumHasGenresRequest {
}
message GetAlbumHasGenresResponse {
repeated AlbumHasGenre albumhasgenre = 1;
}
message GetAlbumHasGenreByIdRequest {
int32 id = 1;
}
message GetAlbumHasGenreByIdResponse {
AlbumHasGenre albumhasgenre = 1;
}
message DeleteAlbumHasGenreRequest {
int32 id = 1;
}
message DeleteAlbumHasGenreResponse {
bool success = 1;
string message = 2;
}
+53
View File
@@ -0,0 +1,53 @@
syntax = "proto3";
option java_package = "com.mediamanager.protocol.messages";
option java_outer_classname = "AlbumTypeMessages";
package mediamanager.messages;
message AlbumType {
int32 id = 1;
string value = 2;
}
message CreateAlbumTypeRequest {
string value = 1;
}
message CreateAlbumTypeResponse {
AlbumType albumtype = 1;
}
message GetAlbumTypesRequest {
}
message GetAlbumTypesResponse {
repeated AlbumType albumtypes = 1;
}
message GetAlbumTypeByIdRequest {
int32 id = 1;
}
message GetAlbumTypeByIdResponse {
AlbumType albumtype = 1;
}
message UpdateAlbumTypeRequest {
int32 id = 1;
string value = 2; // Novo nome
}
message UpdateAlbumTypeResponse {
AlbumType albumtype = 1;
}
message DeleteAlbumTypeRequest {
int32 id = 1;
}
message DeleteAlbumTypeResponse {
bool success = 1;
string message = 2;
}
+54
View File
@@ -0,0 +1,54 @@
syntax = "proto3";
option java_package = "com.mediamanager.protocol.messages";
option java_outer_classname = "DiscMessages";
package mediamanager.messages;
message Disc{
int32 id = 1;
int32 disc_number = 2;
int32 fk_album_id = 3;
}
message CreateDiscRequest {
int32 disc_number = 1;
int32 fk_album_id = 2;
}
message CreateDiscResponse {
Disc disc = 1;
}
message GetDiscsRequest {
}
message GetDiscsResponse {
repeated Disc discs = 1;
}
message GetDiscByIdRequest {
int32 id = 1;
}
message GetDiscByIdResponse {
Disc disc = 1;
}
message UpdateDiscRequest {
int32 id = 1;
int32 disc_number = 2;
int32 fk_album_id = 3;
}
message UpdateDiscResponse {
Disc disc = 1;
}
message DeleteDiscRequest {
int32 id = 1;
}
message DeleteDiscResponse {
string message = 1;
}
+81
View File
@@ -0,0 +1,81 @@
syntax = "proto3";
import "google/protobuf/wrappers.proto";
option java_package = "com.mediamanager.protocol.messages";
option java_outer_classname = "TrackMessages";
package mediamanager.messages;
message Track{
int32 id = 1;
int32 track_number = 2;
string title = 3;
int32 duration = 4;
string filepath = 5;
int32 fk_disc_id = 6;
int32 fk_composer_id = 7;
int32 fk_bitdepth_id = 8;
int32 fk_bitrate_id = 9;
int32 fk_samplingrate_id = 10;
}
message CreateTrackRequest {
int32 track_number = 1;
string title = 2;
google.protobuf.Int32Value duration = 3;
string filepath = 4;
int32 fk_disc_id = 5;
google.protobuf.Int32Value fk_composer_id = 6;
google.protobuf.Int32Value fk_bitdepth_id = 7;
google.protobuf.Int32Value fk_bitrate_id = 8;
google.protobuf.Int32Value fk_samplingrate_id = 9;
}
message CreateTrackResponse {
Track track = 1;
}
message GetTracksRequest {
}
message GetTracksResponse {
repeated Track tracks = 1;
}
message GetTrackByIdRequest {
int32 id = 1;
}
message GetTrackByIdResponse {
Track track = 1;
}
message UpdateTrackRequest {
int32 id = 1;
google.protobuf.Int32Value track_number = 2;
string title = 3;
google.protobuf.Int32Value duration = 4;
string filepath = 5;
google.protobuf.Int32Value fk_disc_id = 6;
google.protobuf.Int32Value fk_composer_id = 7;
google.protobuf.Int32Value fk_bitdepth_id = 8;
google.protobuf.Int32Value fk_bitrate_id = 9;
google.protobuf.Int32Value fk_samplingrate_id = 10;
}
message UpdateTrackResponse {
Track track = 1;
}
message DeleteTrackRequest {
int32 id = 1;
}
message DeleteTrackResponse {
bool success = 1;
string message = 2;
}
+46
View File
@@ -0,0 +1,46 @@
syntax = "proto3";
option java_package = "com.mediamanager.protocol.messages";
option java_outer_classname = "TrackHasArtistMessages";
package mediamanager.messages;
message TrackHasArtist{
int32 id = 1;
int32 fk_track_id = 2;
int32 fk_artist_id =3;
}
message CreateTrackHasArtistRequest {
int32 fk_track_id = 1;
int32 fk_artist_id = 2;
}
message CreateTrackHasArtistResponse {
TrackHasArtist trackhasartist = 1;
}
message GetTrackHasArtistsRequest {
}
message GetTrackHasArtistsResponse {
repeated TrackHasArtist trackhasartist = 1;
}
message GetTrackHasArtistByIdRequest {
int32 id = 1;
}
message GetTrackHasArtistByIdResponse {
TrackHasArtist trackhasartist = 1;
}
message DeleteTrackHasArtistRequest {
int32 id = 1;
}
message DeleteTrackHasArtistResponse {
bool success = 1;
string message = 2;
}
+46
View File
@@ -0,0 +1,46 @@
syntax = "proto3";
option java_package = "com.mediamanager.protocol.messages";
option java_outer_classname = "TrackHasComposerMessages";
package mediamanager.messages;
message TrackHasComposer{
int32 id = 1;
int32 fk_track_id = 2;
int32 fk_composer_id =3;
}
message CreateTrackHasComposerRequest {
int32 fk_track_id = 1;
int32 fk_composer_id = 2;
}
message CreateTrackHasComposerResponse {
TrackHasComposer trackhascomposer = 1;
}
message GetTrackHasComposersRequest {
}
message GetTrackHasComposersResponse {
repeated TrackHasComposer trackhascomposer = 1;
}
message GetTrackHasComposerByIdRequest {
int32 id = 1;
}
message GetTrackHasComposerByIdResponse {
TrackHasComposer trackhascomposer = 1;
}
message DeleteTrackHasComposerRequest {
int32 id = 1;
}
message DeleteTrackHasComposerResponse {
bool success = 1;
string message = 2;
}
+46
View File
@@ -0,0 +1,46 @@
syntax = "proto3";
option java_package = "com.mediamanager.protocol.messages";
option java_outer_classname = "TrackHasGenreMessages";
package mediamanager.messages;
message TrackHasGenre{
int32 id = 1;
int32 fk_track_id = 2;
int32 fk_genre_id =3;
}
message CreateTrackHasGenreRequest {
int32 fk_track_id = 1;
int32 fk_genre_id = 2;
}
message CreateTrackHasGenreResponse {
TrackHasGenre trackhasgenre = 1;
}
message GetTrackHasGenresRequest {
}
message GetTrackHasGenresResponse {
repeated TrackHasGenre trackhasgenre = 1;
}
message GetTrackHasGenreByIdRequest {
int32 id = 1;
}
message GetTrackHasGenreByIdResponse {
TrackHasGenre trackhasgenre = 1;
}
message DeleteTrackHasGenreRequest {
int32 id = 1;
}
message DeleteTrackHasGenreResponse {
bool success = 1;
string message = 2;
}