Prechádzať zdrojové kódy

RIFFMASTER: BACKEND: Fix DB relationship Song-Riff[] by adding @JsonBackReference in Riff Entity

Kuba 2 rokov pred
rodič
commit
a9c520dac9
51 zmenil súbory, kde vykonal 187 pridanie a 53 odobranie
  1. 10 3
      Backend/Spring/.idea/workspace.xml
  2. 2 13
      Backend/Spring/src/main/java/pl/dmcs/jwoszczyk/configuration/SecurityConfiguration.java
  3. 30 0
      Backend/Spring/src/main/java/pl/dmcs/jwoszczyk/controller/RiffController.java
  4. 59 21
      Backend/Spring/src/main/java/pl/dmcs/jwoszczyk/controller/SongController.java
  5. 14 1
      Backend/Spring/src/main/java/pl/dmcs/jwoszczyk/domain/Riff.java
  6. 5 7
      Backend/Spring/src/main/java/pl/dmcs/jwoszczyk/domain/Song.java
  7. 15 0
      Backend/Spring/src/main/java/pl/dmcs/jwoszczyk/repository/IRiffRepository.java
  8. 4 1
      Backend/Spring/src/main/java/pl/dmcs/jwoszczyk/repository/ISongRepository.java
  9. 22 0
      Backend/Spring/src/main/java/pl/dmcs/jwoszczyk/service/IRiffService.java
  10. 3 1
      Backend/Spring/src/main/java/pl/dmcs/jwoszczyk/service/SongService.java
  11. BIN
      Backend/Spring/target/Spring-1.0-SNAPSHOT/WEB-INF/classes/pl/dmcs/jwoszczyk/configuration/SecurityConfiguration.class
  12. BIN
      Backend/Spring/target/Spring-1.0-SNAPSHOT/WEB-INF/classes/pl/dmcs/jwoszczyk/controller/RiffController.class
  13. BIN
      Backend/Spring/target/Spring-1.0-SNAPSHOT/WEB-INF/classes/pl/dmcs/jwoszczyk/controller/SongController.class
  14. BIN
      Backend/Spring/target/Spring-1.0-SNAPSHOT/WEB-INF/classes/pl/dmcs/jwoszczyk/domain/Riff.class
  15. BIN
      Backend/Spring/target/Spring-1.0-SNAPSHOT/WEB-INF/classes/pl/dmcs/jwoszczyk/domain/Song.class
  16. BIN
      Backend/Spring/target/Spring-1.0-SNAPSHOT/WEB-INF/classes/pl/dmcs/jwoszczyk/repository/IRiffRepository.class
  17. BIN
      Backend/Spring/target/Spring-1.0-SNAPSHOT/WEB-INF/classes/pl/dmcs/jwoszczyk/repository/ISongRepository.class
  18. BIN
      Backend/Spring/target/Spring-1.0-SNAPSHOT/WEB-INF/classes/pl/dmcs/jwoszczyk/service/IRiffService.class
  19. BIN
      Backend/Spring/target/Spring-1.0-SNAPSHOT/WEB-INF/classes/pl/dmcs/jwoszczyk/service/SongService.class
  20. BIN
      Backend/Spring/target/classes/pl/dmcs/jwoszczyk/configuration/SecurityConfiguration.class
  21. BIN
      Backend/Spring/target/classes/pl/dmcs/jwoszczyk/controller/RiffController.class
  22. BIN
      Backend/Spring/target/classes/pl/dmcs/jwoszczyk/controller/SongController.class
  23. BIN
      Backend/Spring/target/classes/pl/dmcs/jwoszczyk/domain/Riff.class
  24. BIN
      Backend/Spring/target/classes/pl/dmcs/jwoszczyk/domain/Song.class
  25. BIN
      Backend/Spring/target/classes/pl/dmcs/jwoszczyk/repository/IRiffRepository.class
  26. BIN
      Backend/Spring/target/classes/pl/dmcs/jwoszczyk/repository/ISongRepository.class
  27. BIN
      Backend/Spring/target/classes/pl/dmcs/jwoszczyk/service/IRiffService.class
  28. BIN
      Backend/Spring/target/classes/pl/dmcs/jwoszczyk/service/SongService.class
  29. BIN
      Frontend/RiffMasterFront/.angular/cache/16.0.4/angular-webpack/9163ed2c587ff4665fb17ea4ebc8750a69df1e73/10.pack
  30. BIN
      Frontend/RiffMasterFront/.angular/cache/16.0.4/angular-webpack/9163ed2c587ff4665fb17ea4ebc8750a69df1e73/11.pack
  31. BIN
      Frontend/RiffMasterFront/.angular/cache/16.0.4/angular-webpack/9163ed2c587ff4665fb17ea4ebc8750a69df1e73/12.pack
  32. BIN
      Frontend/RiffMasterFront/.angular/cache/16.0.4/angular-webpack/9163ed2c587ff4665fb17ea4ebc8750a69df1e73/13.pack
  33. BIN
      Frontend/RiffMasterFront/.angular/cache/16.0.4/angular-webpack/9163ed2c587ff4665fb17ea4ebc8750a69df1e73/14.pack
  34. BIN
      Frontend/RiffMasterFront/.angular/cache/16.0.4/angular-webpack/9163ed2c587ff4665fb17ea4ebc8750a69df1e73/15.pack
  35. BIN
      Frontend/RiffMasterFront/.angular/cache/16.0.4/angular-webpack/9163ed2c587ff4665fb17ea4ebc8750a69df1e73/7.pack
  36. BIN
      Frontend/RiffMasterFront/.angular/cache/16.0.4/angular-webpack/9163ed2c587ff4665fb17ea4ebc8750a69df1e73/8.pack
  37. BIN
      Frontend/RiffMasterFront/.angular/cache/16.0.4/angular-webpack/9163ed2c587ff4665fb17ea4ebc8750a69df1e73/9.pack
  38. BIN
      Frontend/RiffMasterFront/.angular/cache/16.0.4/angular-webpack/9163ed2c587ff4665fb17ea4ebc8750a69df1e73/index.pack
  39. BIN
      Frontend/RiffMasterFront/.angular/cache/16.0.4/angular-webpack/9163ed2c587ff4665fb17ea4ebc8750a69df1e73/index.pack.old
  40. 0 0
      Frontend/RiffMasterFront/.angular/cache/16.0.4/babel-webpack/27e4bae6dcec416cafbc86932317b2ff8d619a278e9e784144477bf3197f96c8.json
  41. 0 0
      Frontend/RiffMasterFront/.angular/cache/16.0.4/babel-webpack/5a8abf2503cd1b23da55b46340d7794b7a18e793f3e945b8a0b09bb61e5da1d9.json
  42. 0 0
      Frontend/RiffMasterFront/.angular/cache/16.0.4/babel-webpack/905b74e06c4e1794fe1f6aba1df8b8bacab682ec45e7cd7d50867555b20928da.json
  43. 0 0
      Frontend/RiffMasterFront/.angular/cache/16.0.4/babel-webpack/a77e05320176ac6d5f22b9b2a4f1ea8d89a6266df2538f8f251414fcb6a5ad36.json
  44. 0 0
      Frontend/RiffMasterFront/.angular/cache/16.0.4/babel-webpack/a9238e1fd57324002ddfe5cbf4c91702181d61c64dea3681fe87ada47689e9a3.json
  45. 0 0
      Frontend/RiffMasterFront/.angular/cache/16.0.4/babel-webpack/b0a673b3d87434317b706a6478d607f8fb8d5c0714f8ca42c8cd569281723a0b.json
  46. 0 0
      Frontend/RiffMasterFront/.angular/cache/16.0.4/babel-webpack/d728539f1325a61aa086769519eaa03c8387564f303cd3a6425a4e645e47cbee.json
  47. 0 0
      Frontend/RiffMasterFront/.angular/cache/16.0.4/babel-webpack/e698bb6af215fa05fb474a127e2be253fbd992f1fe4e6dd081f8e26d20b0ece9.json
  48. 7 1
      Frontend/RiffMasterFront/.idea/workspace.xml
  49. 4 0
      Frontend/RiffMasterFront/src/app/main-page/main-page.component.css
  50. 1 1
      Frontend/RiffMasterFront/src/app/main-page/main-page.component.html
  51. 11 4
      Frontend/RiffMasterFront/src/app/main-page/main-page.component.ts

+ 10 - 3
Backend/Spring/.idea/workspace.xml

@@ -10,9 +10,16 @@
   </component>
   <component name="ChangeListManager">
     <list default="true" id="8315de53-8c15-472c-a710-45938463dc02" name="Changes" comment="RIFFMASTER: add frontend files">
+      <change beforePath="$PROJECT_DIR$/../../Frontend/RiffMasterFront/.angular/cache/16.0.4/angular-webpack/9163ed2c587ff4665fb17ea4ebc8750a69df1e73/12.pack" beforeDir="false" afterPath="$PROJECT_DIR$/../../Frontend/RiffMasterFront/.angular/cache/16.0.4/angular-webpack/9163ed2c587ff4665fb17ea4ebc8750a69df1e73/12.pack" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/../../Frontend/RiffMasterFront/.angular/cache/16.0.4/angular-webpack/9163ed2c587ff4665fb17ea4ebc8750a69df1e73/13.pack" beforeDir="false" afterPath="$PROJECT_DIR$/../../Frontend/RiffMasterFront/.angular/cache/16.0.4/angular-webpack/9163ed2c587ff4665fb17ea4ebc8750a69df1e73/13.pack" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/../../Frontend/RiffMasterFront/.angular/cache/16.0.4/angular-webpack/9163ed2c587ff4665fb17ea4ebc8750a69df1e73/14.pack" beforeDir="false" afterPath="$PROJECT_DIR$/../../Frontend/RiffMasterFront/.angular/cache/16.0.4/angular-webpack/9163ed2c587ff4665fb17ea4ebc8750a69df1e73/14.pack" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/../../Frontend/RiffMasterFront/.angular/cache/16.0.4/angular-webpack/9163ed2c587ff4665fb17ea4ebc8750a69df1e73/15.pack" beforeDir="false" afterPath="$PROJECT_DIR$/../../Frontend/RiffMasterFront/.angular/cache/16.0.4/angular-webpack/9163ed2c587ff4665fb17ea4ebc8750a69df1e73/15.pack" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/../../Frontend/RiffMasterFront/.angular/cache/16.0.4/angular-webpack/9163ed2c587ff4665fb17ea4ebc8750a69df1e73/index.pack" beforeDir="false" afterPath="$PROJECT_DIR$/../../Frontend/RiffMasterFront/.angular/cache/16.0.4/angular-webpack/9163ed2c587ff4665fb17ea4ebc8750a69df1e73/index.pack" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/../../Frontend/RiffMasterFront/.angular/cache/16.0.4/angular-webpack/9163ed2c587ff4665fb17ea4ebc8750a69df1e73/index.pack.old" beforeDir="false" afterPath="$PROJECT_DIR$/../../Frontend/RiffMasterFront/.angular/cache/16.0.4/angular-webpack/9163ed2c587ff4665fb17ea4ebc8750a69df1e73/index.pack.old" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/../../Frontend/RiffMasterFront/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/../../Frontend/RiffMasterFront/.idea/workspace.xml" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/../../Frontend/RiffMasterFront/src/app/app.module.ts" beforeDir="false" afterPath="$PROJECT_DIR$/../../Frontend/RiffMasterFront/src/app/app.module.ts" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/../../Frontend/RiffMasterFront/src/app/main-page/main-page.component.css" beforeDir="false" afterPath="$PROJECT_DIR$/../../Frontend/RiffMasterFront/src/app/main-page/main-page.component.css" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/../../Frontend/RiffMasterFront/src/app/main-page/main-page.component.html" beforeDir="false" afterPath="$PROJECT_DIR$/../../Frontend/RiffMasterFront/src/app/main-page/main-page.component.html" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/../../Frontend/RiffMasterFront/src/app/main-page/main-page.component.ts" beforeDir="false" afterPath="$PROJECT_DIR$/../../Frontend/RiffMasterFront/src/app/main-page/main-page.component.ts" afterDir="false" />
     </list>
     <option name="SHOW_DIALOG" value="false" />
     <option name="HIGHLIGHT_CONFLICTS" value="true" />
@@ -22,9 +29,9 @@
   <component name="FileTemplateManagerImpl">
     <option name="RECENT_TEMPLATES">
       <list>
-        <option value="Interface" />
         <option value="Jsp File" />
         <option value="Class" />
+        <option value="Interface" />
       </list>
     </option>
   </component>
@@ -215,7 +222,7 @@
       <workItem from="1686820558130" duration="622000" />
       <workItem from="1686836941887" duration="14004000" />
       <workItem from="1686898654444" duration="1889000" />
-      <workItem from="1686909268841" duration="1233000" />
+      <workItem from="1686909268841" duration="13817000" />
     </task>
     <task id="LOCAL-00001" summary="add basic hello world and transfering data to server">
       <created>1679575346987</created>

+ 2 - 13
Backend/Spring/src/main/java/pl/dmcs/jwoszczyk/configuration/SecurityConfiguration.java

@@ -80,7 +80,9 @@ public class SecurityConfiguration {
         http.cors().and().csrf().disable()
                 .authorizeHttpRequests((authz) -> authz
                         .requestMatchers("/riffmaster/login*").permitAll()
+                        .requestMatchers("/riffs/song/**").permitAll()
                         .requestMatchers("/song**").permitAll()
+                        .requestMatchers("/riffs**").permitAll()
                         .requestMatchers("/appUsers*").hasAnyRole("ADMIN", "USER")
                         .requestMatchers("/appUserRole*").hasRole("ADMIN")
                         .requestMatchers("/exampleOne*").hasAuthority("ROLE_USER")
@@ -113,16 +115,3 @@ public class SecurityConfiguration {
     }
 
 }
-
-
-
-
-
-
-
-
-
-
-
-
-

+ 30 - 0
Backend/Spring/src/main/java/pl/dmcs/jwoszczyk/controller/RiffController.java

@@ -0,0 +1,30 @@
+package pl.dmcs.jwoszczyk.controller;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+import pl.dmcs.jwoszczyk.domain.Riff;
+import pl.dmcs.jwoszczyk.service.IRiffService;
+
+import java.util.List;
+
+@RestController
+@CrossOrigin(origins = "http://localhost:4200")
+public class RiffController {
+    private final IRiffService riffService;
+
+    @Autowired
+    public RiffController(IRiffService riffService) {
+        this.riffService = riffService;
+    }
+
+    @GetMapping("/riffs/song/{songId}")
+    public ResponseEntity<List<Riff>> getRiffsBySongId(@PathVariable long songId) {
+        List<Riff> riffs = riffService.getRiffsBySongId(songId);
+        if (riffs.isEmpty()) {
+            return ResponseEntity.noContent().build();
+        } else {
+            return ResponseEntity.ok(riffs);
+        }
+    }
+}

+ 59 - 21
Backend/Spring/src/main/java/pl/dmcs/jwoszczyk/controller/SongController.java

@@ -25,21 +25,45 @@ public class SongController {
         this.songService = songRepository;
     }
 
-    //################################################################_REST methods
 
 
-    @RequestMapping(
-            value = "/song",
-            method = RequestMethod.GET,
-            produces = MediaType.APPLICATION_JSON_VALUE)
+//#################################################################################_GET ALL SONGS
+
+//    @RequestMapping(value = "/song", method = RequestMethod.GET) //, produces = MediaType.APPLICATION_JSON_VALUE
+//    public ResponseEntity<List<Song>> getAllSongs()
+//    {
+//        List<Song> songs = songService.getAllSongs();
+//        System.out.println("getAllsongs get request works" + songs.size() );
+//
+//        // Print the riffs count for the first song
+//        if (!songs.isEmpty()) {
+//            Song firstSong = songs.get(0);
+//            int riffCount = firstSong.getRiffs().size();
+//            System.out.println("Riffs count for the first song: " + riffCount);
+//        }
+//
+//        return ResponseEntity.ok(songs);
+//    }
+
+    @RequestMapping(value = "/song", method = RequestMethod.GET)
     public ResponseEntity<List<Song>> getAllSongs() {
         List<Song> songs = songService.getAllSongs();
-        System.out.println("getAllsongs get request works" + songs.size());
+
+        // Load riffs for each song
+        for (Song song : songs) {
+            List<Riff> riffs = song.getRiffs();
+            riffs.size(); // Trigger lazy loading of riffs
+            song.setRiffs(riffs);
+        }
+
         return ResponseEntity.ok(songs);
     }
 
+//#################################################################################_GET A SONG
+
     @RequestMapping(value="/{id}", method = RequestMethod.GET)
-    public ResponseEntity<Song> getSongById(@PathVariable("id") long id) {
+    public ResponseEntity<Song> getSongById(@PathVariable("id") long id)
+    {
         Optional<Song> song = Optional.ofNullable(songService.getSong(id));
         if (song.isPresent()) {
             return ResponseEntity.ok(song.get());
@@ -48,17 +72,27 @@ public class SongController {
         }
     }
 
-    @RequestMapping(
-            value = "/song",
-            method = RequestMethod.POST)
-    public ResponseEntity<Song> addSong(@RequestBody Song song) {
+//#################################################################################_ADD NEW SONG
+    @RequestMapping( value = "/song", method = RequestMethod.POST)
+    public ResponseEntity<Song> addSong(@RequestBody Song song)
+    {
+        List<Riff> riffs = song.getRiffs();
+        if (riffs != null) {
+            for (Riff riff : riffs) {
+                riff.setSong(song); // Set the song reference for each riff
+            }
+        }
         Song addedSong = songService.addSong(song);
+        System.out.println("\n\nadding a new song: riffs:" + song.getRiffs().stream().count() + " \n\n");
         return ResponseEntity.status(HttpStatus.CREATED).body(addedSong);
     }
 
 
+//#################################################################################_UPDATE A SONG
+
     @PutMapping("/{id}")
-    public ResponseEntity<Song> updateSong(@PathVariable("id") long id, @RequestBody Song updatedSong) {
+    public ResponseEntity<Song> updateSong(@PathVariable("id") long id, @RequestBody Song updatedSong)
+    {
         Optional<Song> song = Optional.ofNullable(songService.getSong(id));
         if (song.isPresent()) {
             Song existingSong = song.get();
@@ -72,8 +106,11 @@ public class SongController {
         }
     }
 
+//#################################################################################_DELETE A SONG
+
     @DeleteMapping("/{id}")
-    public ResponseEntity<Void> deleteSong(@PathVariable("id") long id) {
+    public ResponseEntity<Void> deleteSong(@PathVariable("id") long id)
+    {
         Optional<Song> song = Optional.ofNullable(songService.getSong(id));
         if (song.isPresent()) {
             songService.removeSong(id);
@@ -83,20 +120,21 @@ public class SongController {
         }
     }
 
+//#################################################################################_GET RIFFS
 
     @GetMapping("/{songId}/riffs")
-    public ResponseEntity<Set<Riff>> getRiffs(@PathVariable long songId) {
-        Optional<Song> optionalSong = Optional.ofNullable(songService.getSong(songId));
-        if (optionalSong.isPresent()) {
-            Song song = optionalSong.get();
-            Set<Riff> riffs = song.getRiffs();
-            return ResponseEntity.ok(riffs);
+    public ResponseEntity<List<Riff>> getRiffs(@PathVariable long songId)
+    {
+        Song song = songService.getSong(songId);
+        List<Riff> riffs = song.getRiffs();
+        if (riffs.isEmpty()) {
+            return ResponseEntity.noContent().build();
         } else {
-            return ResponseEntity.notFound().build();
+            return ResponseEntity.ok(riffs);
         }
     }
 
-    //################################################################_
+
 
 
 }

+ 14 - 1
Backend/Spring/src/main/java/pl/dmcs/jwoszczyk/domain/Riff.java

@@ -1,5 +1,6 @@
 package pl.dmcs.jwoszczyk.domain;
 
+import com.fasterxml.jackson.annotation.JsonBackReference;
 import jakarta.persistence.*;
 
 import java.util.Date;
@@ -17,10 +18,22 @@ public class Riff {
 	private String name;
 	private double startMs;
 	private double endMs;
-	@ManyToOne(fetch = FetchType.LAZY)
+	@ManyToOne(fetch = FetchType.EAGER)
 	@JoinColumn(name = "song_id")
+	@JsonBackReference
 	private Song song;
+
+
 	//####################################################################_accesors
+	public Song getSong() {
+		return song;
+	}
+
+	public void setSong(Song song) {
+		this.song = song;
+	}
+
+
 
 	public long getId() {
 		return id;

+ 5 - 7
Backend/Spring/src/main/java/pl/dmcs/jwoszczyk/domain/Song.java

@@ -3,9 +3,7 @@ package pl.dmcs.jwoszczyk.domain;
 import jakarta.persistence.*;
 import jakarta.validation.constraints.NotNull;
 
-import java.util.Date;
-import java.util.HashSet;
-import java.util.Set;
+import java.util.*;
 
 @Entity
 @Table(name="song")
@@ -18,9 +16,8 @@ public class Song {
 	@NotNull
 	private String name;
 	private String link;
-	//@ManyToMany(fetch = FetchType.EAGER)
 	@OneToMany(mappedBy = "song", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
-	private Set<Riff> riffs = new HashSet<Riff>(0);
+	private List<Riff> riffs;
 	@NotNull
 	private double durationMs;
 	private long userId; //creator
@@ -28,6 +25,7 @@ public class Song {
 	private Date uploadDate;
 	private Date updateDate; //last update date
 
+
 	//####################################################################_accesors
 
 
@@ -55,11 +53,11 @@ public class Song {
 		this.link = link;
 	}
 
-	public Set<Riff> getRiffs() {
+	public List<Riff> getRiffs() {
 		return riffs;
 	}
 
-	public void setRiffs(Set<Riff> riffs) {
+	public void setRiffs(List<Riff> riffs) {
 		this.riffs = riffs;
 	}
 

+ 15 - 0
Backend/Spring/src/main/java/pl/dmcs/jwoszczyk/repository/IRiffRepository.java

@@ -0,0 +1,15 @@
+package pl.dmcs.jwoszczyk.repository;
+
+import jakarta.transaction.Transactional;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+import pl.dmcs.jwoszczyk.domain.Riff;
+import pl.dmcs.jwoszczyk.domain.Song;
+
+import java.util.List;
+
+@Transactional
+@Repository
+public interface IRiffRepository extends JpaRepository<Riff, Long> {
+    List<Riff> findBySongId(long songId);
+}

+ 4 - 1
Backend/Spring/src/main/java/pl/dmcs/jwoszczyk/repository/ISongRepository.java

@@ -1,11 +1,14 @@
 package pl.dmcs.jwoszczyk.repository;
 
+import jakarta.transaction.Transactional;
 import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
 import pl.dmcs.jwoszczyk.domain.AppUser;
 import pl.dmcs.jwoszczyk.domain.Song;
 
 import java.util.List;
-
+@Transactional
+@Repository
 public interface ISongRepository extends JpaRepository<Song, Long> {
     List<Song> findAll();
     Song findById(long id);

+ 22 - 0
Backend/Spring/src/main/java/pl/dmcs/jwoszczyk/service/IRiffService.java

@@ -0,0 +1,22 @@
+package pl.dmcs.jwoszczyk.service;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import pl.dmcs.jwoszczyk.domain.Riff;
+import pl.dmcs.jwoszczyk.repository.IRiffRepository;
+
+import java.util.List;
+
+@Service
+public class IRiffService {
+    private final IRiffRepository riffRepository;
+
+    @Autowired
+    public IRiffService(IRiffRepository riffRepository) {
+        this.riffRepository = riffRepository;
+    }
+
+    public List<Riff> getRiffsBySongId(long songId) {
+        return riffRepository.findBySongId(songId);
+    }
+}

+ 3 - 1
Backend/Spring/src/main/java/pl/dmcs/jwoszczyk/service/SongService.java

@@ -3,6 +3,7 @@ package pl.dmcs.jwoszczyk.service;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.crypto.password.PasswordEncoder;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import pl.dmcs.jwoszczyk.domain.Song;
 import pl.dmcs.jwoszczyk.repository.IAppUserRepository;
 import pl.dmcs.jwoszczyk.repository.IAppUserRoleRepository;
@@ -10,7 +11,8 @@ import pl.dmcs.jwoszczyk.repository.ISongRepository;
 
 import java.util.List;
 
-@Service
+@Service("songService")
+@Transactional
 public class SongService implements ISongService{
 
     //#########################################################################_Dependency Injection

BIN
Backend/Spring/target/Spring-1.0-SNAPSHOT/WEB-INF/classes/pl/dmcs/jwoszczyk/configuration/SecurityConfiguration.class


BIN
Backend/Spring/target/Spring-1.0-SNAPSHOT/WEB-INF/classes/pl/dmcs/jwoszczyk/controller/RiffController.class


BIN
Backend/Spring/target/Spring-1.0-SNAPSHOT/WEB-INF/classes/pl/dmcs/jwoszczyk/controller/SongController.class


BIN
Backend/Spring/target/Spring-1.0-SNAPSHOT/WEB-INF/classes/pl/dmcs/jwoszczyk/domain/Riff.class


BIN
Backend/Spring/target/Spring-1.0-SNAPSHOT/WEB-INF/classes/pl/dmcs/jwoszczyk/domain/Song.class


BIN
Backend/Spring/target/Spring-1.0-SNAPSHOT/WEB-INF/classes/pl/dmcs/jwoszczyk/repository/IRiffRepository.class


BIN
Backend/Spring/target/Spring-1.0-SNAPSHOT/WEB-INF/classes/pl/dmcs/jwoszczyk/repository/ISongRepository.class


BIN
Backend/Spring/target/Spring-1.0-SNAPSHOT/WEB-INF/classes/pl/dmcs/jwoszczyk/service/IRiffService.class


BIN
Backend/Spring/target/Spring-1.0-SNAPSHOT/WEB-INF/classes/pl/dmcs/jwoszczyk/service/SongService.class


BIN
Backend/Spring/target/classes/pl/dmcs/jwoszczyk/configuration/SecurityConfiguration.class


BIN
Backend/Spring/target/classes/pl/dmcs/jwoszczyk/controller/RiffController.class


BIN
Backend/Spring/target/classes/pl/dmcs/jwoszczyk/controller/SongController.class


BIN
Backend/Spring/target/classes/pl/dmcs/jwoszczyk/domain/Riff.class


BIN
Backend/Spring/target/classes/pl/dmcs/jwoszczyk/domain/Song.class


BIN
Backend/Spring/target/classes/pl/dmcs/jwoszczyk/repository/IRiffRepository.class


BIN
Backend/Spring/target/classes/pl/dmcs/jwoszczyk/repository/ISongRepository.class


BIN
Backend/Spring/target/classes/pl/dmcs/jwoszczyk/service/IRiffService.class


BIN
Backend/Spring/target/classes/pl/dmcs/jwoszczyk/service/SongService.class


BIN
Frontend/RiffMasterFront/.angular/cache/16.0.4/angular-webpack/9163ed2c587ff4665fb17ea4ebc8750a69df1e73/10.pack


BIN
Frontend/RiffMasterFront/.angular/cache/16.0.4/angular-webpack/9163ed2c587ff4665fb17ea4ebc8750a69df1e73/11.pack


BIN
Frontend/RiffMasterFront/.angular/cache/16.0.4/angular-webpack/9163ed2c587ff4665fb17ea4ebc8750a69df1e73/12.pack


BIN
Frontend/RiffMasterFront/.angular/cache/16.0.4/angular-webpack/9163ed2c587ff4665fb17ea4ebc8750a69df1e73/13.pack


BIN
Frontend/RiffMasterFront/.angular/cache/16.0.4/angular-webpack/9163ed2c587ff4665fb17ea4ebc8750a69df1e73/14.pack


BIN
Frontend/RiffMasterFront/.angular/cache/16.0.4/angular-webpack/9163ed2c587ff4665fb17ea4ebc8750a69df1e73/15.pack


BIN
Frontend/RiffMasterFront/.angular/cache/16.0.4/angular-webpack/9163ed2c587ff4665fb17ea4ebc8750a69df1e73/7.pack


BIN
Frontend/RiffMasterFront/.angular/cache/16.0.4/angular-webpack/9163ed2c587ff4665fb17ea4ebc8750a69df1e73/8.pack


BIN
Frontend/RiffMasterFront/.angular/cache/16.0.4/angular-webpack/9163ed2c587ff4665fb17ea4ebc8750a69df1e73/9.pack


BIN
Frontend/RiffMasterFront/.angular/cache/16.0.4/angular-webpack/9163ed2c587ff4665fb17ea4ebc8750a69df1e73/index.pack


BIN
Frontend/RiffMasterFront/.angular/cache/16.0.4/angular-webpack/9163ed2c587ff4665fb17ea4ebc8750a69df1e73/index.pack.old


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 0 - 0
Frontend/RiffMasterFront/.angular/cache/16.0.4/babel-webpack/27e4bae6dcec416cafbc86932317b2ff8d619a278e9e784144477bf3197f96c8.json


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 0 - 0
Frontend/RiffMasterFront/.angular/cache/16.0.4/babel-webpack/5a8abf2503cd1b23da55b46340d7794b7a18e793f3e945b8a0b09bb61e5da1d9.json


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 0 - 0
Frontend/RiffMasterFront/.angular/cache/16.0.4/babel-webpack/905b74e06c4e1794fe1f6aba1df8b8bacab682ec45e7cd7d50867555b20928da.json


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 0 - 0
Frontend/RiffMasterFront/.angular/cache/16.0.4/babel-webpack/a77e05320176ac6d5f22b9b2a4f1ea8d89a6266df2538f8f251414fcb6a5ad36.json


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 0 - 0
Frontend/RiffMasterFront/.angular/cache/16.0.4/babel-webpack/a9238e1fd57324002ddfe5cbf4c91702181d61c64dea3681fe87ada47689e9a3.json


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 0 - 0
Frontend/RiffMasterFront/.angular/cache/16.0.4/babel-webpack/b0a673b3d87434317b706a6478d607f8fb8d5c0714f8ca42c8cd569281723a0b.json


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 0 - 0
Frontend/RiffMasterFront/.angular/cache/16.0.4/babel-webpack/d728539f1325a61aa086769519eaa03c8387564f303cd3a6425a4e645e47cbee.json


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 0 - 0
Frontend/RiffMasterFront/.angular/cache/16.0.4/babel-webpack/e698bb6af215fa05fb474a127e2be253fbd992f1fe4e6dd081f8e26d20b0ece9.json


+ 7 - 1
Frontend/RiffMasterFront/.idea/workspace.xml

@@ -6,6 +6,12 @@
   <component name="ChangeListManager">
     <list default="true" id="d91bc08d-d968-4797-8fb3-ef602a37db2a" name="Changes" comment="RIFFMASTER: add frontend business logic (riff, song)">
       <change beforePath="$PROJECT_DIR$/../../Backend/Spring/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/../../Backend/Spring/.idea/workspace.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/../../Backend/Spring/src/main/java/pl/dmcs/jwoszczyk/configuration/SecurityConfiguration.java" beforeDir="false" afterPath="$PROJECT_DIR$/../../Backend/Spring/src/main/java/pl/dmcs/jwoszczyk/configuration/SecurityConfiguration.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/../../Backend/Spring/src/main/java/pl/dmcs/jwoszczyk/controller/SongController.java" beforeDir="false" afterPath="$PROJECT_DIR$/../../Backend/Spring/src/main/java/pl/dmcs/jwoszczyk/controller/SongController.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/../../Backend/Spring/src/main/java/pl/dmcs/jwoszczyk/domain/Riff.java" beforeDir="false" afterPath="$PROJECT_DIR$/../../Backend/Spring/src/main/java/pl/dmcs/jwoszczyk/domain/Riff.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/../../Backend/Spring/src/main/java/pl/dmcs/jwoszczyk/domain/Song.java" beforeDir="false" afterPath="$PROJECT_DIR$/../../Backend/Spring/src/main/java/pl/dmcs/jwoszczyk/domain/Song.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/../../Backend/Spring/src/main/java/pl/dmcs/jwoszczyk/repository/ISongRepository.java" beforeDir="false" afterPath="$PROJECT_DIR$/../../Backend/Spring/src/main/java/pl/dmcs/jwoszczyk/repository/ISongRepository.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/../../Backend/Spring/src/main/java/pl/dmcs/jwoszczyk/service/SongService.java" beforeDir="false" afterPath="$PROJECT_DIR$/../../Backend/Spring/src/main/java/pl/dmcs/jwoszczyk/service/SongService.java" afterDir="false" />
     </list>
     <option name="SHOW_DIALOG" value="false" />
     <option name="HIGHLIGHT_CONFLICTS" value="true" />
@@ -97,7 +103,7 @@
       <workItem from="1686820564623" duration="521000" />
       <workItem from="1686836939723" duration="5206000" />
       <workItem from="1686898660229" duration="4682000" />
-      <workItem from="1686909264196" duration="3087000" />
+      <workItem from="1686909264196" duration="5150000" />
     </task>
     <task id="LOCAL-00001" summary="RIFFMASTER: add frontend project">
       <created>1685976235580</created>

+ 4 - 0
Frontend/RiffMasterFront/src/app/main-page/main-page.component.css

@@ -83,3 +83,7 @@ body {
   overflow: hidden;
 }
 
+.file-input {
+  margin-left: 10px; /* Adjust the margin as needed */
+}
+

+ 1 - 1
Frontend/RiffMasterFront/src/app/main-page/main-page.component.html

@@ -63,7 +63,7 @@
       <!--      ##################################################################_ROW 3-->
 
       <div class="button-row">
-        <input type="file" (change)="onFileSelected($event)">
+        <input type="file" (change)="onFileSelected($event)" class="file-input">
       </div>
       <!--      ##################################################################_ROW 4-->
 

+ 11 - 4
Frontend/RiffMasterFront/src/app/main-page/main-page.component.ts

@@ -17,6 +17,7 @@ export class MainPageComponent implements OnInit {
   songs: Song[] = [];
   searchQuery: string = '';
   selectedSong!: Song; // Variable to store the selected song
+  inputSong!: Song;
   selectedFileName: string = '';
 
   constructor(
@@ -72,6 +73,7 @@ export class MainPageComponent implements OnInit {
       this.songService.parseXmlToSong(xmlContent).subscribe(// Parse the XML content to obtain the song object
         (song: Song) => {
           this.selectedSong = song;
+          this.inputSong = song;
           console.log('Selected song:', this.selectedSong);
         },
         (error: any) => {
@@ -83,13 +85,18 @@ export class MainPageComponent implements OnInit {
   }
 
   upload() {
-    if (this.selectedFile) {
-
+    if (this.selectedFile && this.inputSong) {
+      this.songService.uploadSong(this.inputSong).subscribe(
+        (uploadedSong: Song) => {
+          console.log('Song uploaded successfully:', uploadedSong);
+        },
+        (error) => {
+          console.error('Error uploading song:', error);
+        }
+      );
     }
   }
 
-
-
   download() {
     // Implement your download logic here
   }

Niektoré súbory nie sú zobrazené, pretože je v týchto rozdielových dátach zmenené mnoho súborov