From 2fda3af3ed256d2ba186c42f45469f5bb1352570 Mon Sep 17 00:00:00 2001 From: DongHwi Kim <ken7905@ajou.ac.kr> Date: Mon, 17 Jul 2023 18:52:44 +0900 Subject: [PATCH] delte complete --- postSong.json | 22 +++++ .../controller/MyWebController.java | 93 ++++++++++++------ .../dto/FavoriteMusicRequestDto.java | 30 ++++++ .../repository/FavoriteRepository.java | 3 + .../myspringweb/service/MusicService.java | 62 ++++++++++++ .../controller/MyWebController.class | Bin 3104 -> 2458 bytes .../dto/FavoriteMusicRequestDto.class | Bin 0 -> 2582 bytes .../repository/FavoriteRepository.class | Bin 619 -> 812 bytes .../myspringweb/service/MusicService.class | Bin 0 -> 3035 bytes 9 files changed, 179 insertions(+), 31 deletions(-) create mode 100644 postSong.json create mode 100644 src/main/java/kr/ajousw/myspringweb/dto/FavoriteMusicRequestDto.java create mode 100644 src/main/java/kr/ajousw/myspringweb/service/MusicService.java create mode 100644 target/classes/kr/ajousw/myspringweb/dto/FavoriteMusicRequestDto.class create mode 100644 target/classes/kr/ajousw/myspringweb/service/MusicService.class diff --git a/postSong.json b/postSong.json new file mode 100644 index 0000000..ddb0c7e --- /dev/null +++ b/postSong.json @@ -0,0 +1,22 @@ +{ + "wrapperType":"collection", + "collectionType":"Album", + "artistId":994656, + "collectionId":580708175, + "amgArtistId":4739, + "artistName":"Led Zeppelin", + "collectionName":"Led Zeppelin IV (Remastered)", + "collectionCensoredName":"Led Zeppelin IV (Remastered)", + "artistViewUrl":"https://music.apple.com/us/artist/led-zeppelin/994656?uo=4", + "collectionViewUrl":"https://music.apple.com/us/album/led-zeppelin-iv-remastered/580708175?uo=4", + "artworkUrl60":"https://is1-ssl.mzstatic.com/image/thumb/Music115/v4/5c/15/9b/5c159b27-95ca-b9a7-84e3-28e795fffd39/dj.kvkrpptq.jpg/60x60bb.jpg", + "artworkUrl100":"https://is1-ssl.mzstatic.com/image/thumb/Music115/v4/5c/15/9b/5c159b27-95ca-b9a7-84e3-28e795fffd39/dj.kvkrpptq.jpg/100x100bb.jpg", + "collectionPrice":9.99, + "collectionExplicitness":"notExplicit", + "trackCount":8, + "copyright":"℗ 1971 Atlantic Recording Corporation, a Warner Music Group Company. Marketed by Rhino Entertainment Company, a Warner Music Group Company.", + "country":"USA", + "currency":"USD", + "releaseDate":"1971-11-08T08:00:00Z", + "primaryGenreName":"Rock" +} diff --git a/src/main/java/kr/ajousw/myspringweb/controller/MyWebController.java b/src/main/java/kr/ajousw/myspringweb/controller/MyWebController.java index a05f7c4..29e7784 100644 --- a/src/main/java/kr/ajousw/myspringweb/controller/MyWebController.java +++ b/src/main/java/kr/ajousw/myspringweb/controller/MyWebController.java @@ -4,8 +4,11 @@ import java.io.IOException; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; @@ -13,53 +16,81 @@ import org.springframework.web.client.RestTemplate; import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.servlet.http.HttpServletRequest; +import jakarta.transaction.Transactional; +import kr.ajousw.myspringweb.dto.FavoriteMusicRequestDto; import kr.ajousw.myspringweb.dto.MusicList; import kr.ajousw.myspringweb.entity.FavoriteMusic; import kr.ajousw.myspringweb.repository.FavoriteRepository; +import kr.ajousw.myspringweb.service.MusicService; @RestController public class MyWebController{ private final RestTemplate restTemplate = new RestTemplate(); private final String BASE_URL = "<https://itunes.apple.com/search?entity=song&attribute=songTerm&term=>"; - @GetMapping(value = "/musicSearch/{term}") - public MusicList musicSearchBypath(@PathVariable String term){ - try{ - String response = restTemplate.getForObject(BASE_URL + term, String.class); - ObjectMapper mapper = new ObjectMapper(); - MusicList list = mapper.readValue(response,MusicList.class); - System.out.println(list.getResultCount()); - return list; - } catch(IOException e){ - System.out.println(e.toString()); - return null; - } + @Autowired + MusicService service; + + @GetMapping(value = "/musicSearch/{name}") + public MusicList musicSearchBypath(@PathVariable String name){ + return service.searchMusic(name); + // try{ + // String response = restTemplate.getForObject(BASE_URL + term, String.class); + // ObjectMapper mapper = new ObjectMapper(); + // MusicList list = mapper.readValue(response,MusicList.class); + // System.out.println(list.getResultCount()); + // return list; + // } catch(IOException e){ + // System.out.println(e.toString()); + // return null; + // } } @GetMapping(value = "/musicSearch") - public MusicList musicSearchByParam(@RequestParam("term") String term){ - try{ - String response = restTemplate.getForObject(BASE_URL + term, String.class); - ObjectMapper mapper = new ObjectMapper(); - MusicList list = mapper.readValue(response,MusicList.class); - System.out.println(list.getResultCount()); - return list; - } catch(IOException e){ - System.out.println(e.toString()); - return null; - } + public MusicList musicSearchByParam(@RequestParam("term") String name){ + return service.searchMusic(name); + // try{ + // String response = restTemplate.getForObject(BASE_URL + term, String.class); + // ObjectMapper mapper = new ObjectMapper(); + // MusicList list = mapper.readValue(response,MusicList.class); + // System.out.println(list.getResultCount()); + // return list; + // } catch(IOException e){ + // System.out.println(e.toString()); + // return null; + // } } - @Autowired - FavoriteRepository albumsRepo; + // @Autowired + // FavoriteRepository albumsRepo; @GetMapping(value = "/likes") public List<FavoriteMusic> getLikes(){ - try{ - return albumsRepo.findAll(); - } catch(Exception e){ - System.out.println(e.toString()); - return null; - } + return service.getLikes(); + // try{ + // return albumsRepo.findAll(); + // } catch(Exception e){ + // System.out.println(e.toString()); + // return null; + // } + } + // @Autowired + // FavoriteRepository albumsRepo; + @PostMapping(value = "/likes") + // @Transactional + public int postLikes(@RequestBody FavoriteMusicRequestDto favorite){ + return service.saveFavorite(favorite); + // FavoriteMusic music = albumsRepo.save(favorite.toEntity()); + // if(music != null){ + // return 1; + // } + // else{ + // return 0; + // } + } + @DeleteMapping(value = "/likes/{id}") + public void deleteFavorite(@PathVariable String id) { + service.deleteFavorite(id); + } } \ No newline at end of file diff --git a/src/main/java/kr/ajousw/myspringweb/dto/FavoriteMusicRequestDto.java b/src/main/java/kr/ajousw/myspringweb/dto/FavoriteMusicRequestDto.java new file mode 100644 index 0000000..e251cee --- /dev/null +++ b/src/main/java/kr/ajousw/myspringweb/dto/FavoriteMusicRequestDto.java @@ -0,0 +1,30 @@ +package kr.ajousw.myspringweb.dto; + +import jakarta.persistence.Column; +import kr.ajousw.myspringweb.entity.FavoriteMusic; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +@Getter +@Setter +@ToString +public class FavoriteMusicRequestDto { + private String collectionId; + private String artistId; + private String artistName; + private String artistViewUrl; + private String collectionName; + private String collectionViewUrl; + public FavoriteMusic toEntity(){ + FavoriteMusic music = new FavoriteMusic(); + music.setCollectionId(this.collectionId); + music.setArtistId(this.artistId); + music.setArtistName(this.artistName); + music.setArtistViewUrl(this.artistViewUrl); + music.setCollectionName(this.collectionName); + music.setCollectionViewUrl(this.collectionViewUrl); + return music; + } + +} diff --git a/src/main/java/kr/ajousw/myspringweb/repository/FavoriteRepository.java b/src/main/java/kr/ajousw/myspringweb/repository/FavoriteRepository.java index b25b2ab..2ab94f8 100644 --- a/src/main/java/kr/ajousw/myspringweb/repository/FavoriteRepository.java +++ b/src/main/java/kr/ajousw/myspringweb/repository/FavoriteRepository.java @@ -1,5 +1,6 @@ package kr.ajousw.myspringweb.repository; +import java.util.Iterator; import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; @@ -8,5 +9,7 @@ import kr.ajousw.myspringweb.entity.FavoriteMusic; public interface FavoriteRepository extends JpaRepository<FavoriteMusic, String>{ List<FavoriteMusic> findAll(); + + void deleteById(String id); } diff --git a/src/main/java/kr/ajousw/myspringweb/service/MusicService.java b/src/main/java/kr/ajousw/myspringweb/service/MusicService.java new file mode 100644 index 0000000..0d6ac41 --- /dev/null +++ b/src/main/java/kr/ajousw/myspringweb/service/MusicService.java @@ -0,0 +1,62 @@ +package kr.ajousw.myspringweb.service; + +import java.io.IOException; +import java.util.List; + +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + +import com.fasterxml.jackson.databind.ObjectMapper; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.transaction.Transactional; +import kr.ajousw.myspringweb.dto.FavoriteMusicRequestDto; +import kr.ajousw.myspringweb.dto.MusicList; +import kr.ajousw.myspringweb.entity.FavoriteMusic; +import kr.ajousw.myspringweb.repository.FavoriteRepository; +import lombok.RequiredArgsConstructor; + +@Service +@Transactional +@RequiredArgsConstructor +public class MusicService { + private final FavoriteRepository albumsRepo; + RestTemplate restTemplate = new RestTemplate(); + HttpServletRequest request; + public MusicList searchMusic(String name) { + + MusicList musicList = null; + try { + String jsonString = restTemplate.getForObject(request.getRequestURI(), String.class); + ObjectMapper objectMapper = new ObjectMapper(); + musicList = objectMapper.readValue(jsonString, MusicList.class); + } catch (IOException e) { + e.printStackTrace(); + } + + return musicList; + } + + public List<FavoriteMusic> getLikes() { + try{ + return albumsRepo.findAll(); + } catch(Exception e){ + System.out.println(e.toString()); + return null; + } + } + + public int saveFavorite(FavoriteMusicRequestDto favorite) { + FavoriteMusic music = albumsRepo.save(favorite.toEntity()); + if(music != null){ + return 1; + } + else{ + return 0; + } + } + + public void deleteFavorite(String id){ + albumsRepo.deleteById(id); + } +} diff --git a/target/classes/kr/ajousw/myspringweb/controller/MyWebController.class b/target/classes/kr/ajousw/myspringweb/controller/MyWebController.class index f701fc68275b6eafdaedfcc4a848ff9ed28e20bb..53f84323cb344fa26ed349a62edf81fad185a3f4 100644 GIT binary patch delta 989 zcmZ1=F-w^1)W2Q(7#J9A8T>YKaWZnV7pE4LWhSRGGU!ZJWE2;Ha`k;ni!+mhA#$5T z8ILlu<R#{&PL^Yi7v*GNWYFMY;9=n9V$fpHVQ0{0WYC%@Af}5=FAsw*gCZjXcX4WB zQE~>@R7M7nS(9(F6|=IGq!#5)_F}J)0vTn+!(hT-%E-W3kY8NllbM}b%*bG-0dm&l z1#B#`Zi!|2MVTe3U_*jZ3rkarOI%9wtu;Lv8B8aiWzysi$S*GOO)MzL%uBb1icPj< zXV-DcPpPy9+2Fv#;K*RZ$iP#aSe6PikCA~R4QezagE7oH9hfw_b&L#rDXBTBB}n>3 zCr@M&VF_boFb6q9+XXC*a0s`44#+e5)tM=^AXj+uFt{+dGBPk_rcCzdn8wI9`5A{b zuQUS-gA4;dgDit6gY;xQPKSD11||k31_lOBtt|}d+S?d3H!v_TFfqt5Ffgz&FfuSO zs4&PfFffQg6fwv#$TNTdCxadX2LmI6J_7>-D<gv*0|Nsig8_pg0}BHm0|Nse10#bH z10#cSGy`KXgCT<|0|NsOBLgFY5lFC@!I(h^oIaT9A?D(;+?aUFO&ClWm>JB#t~bZx z2n(>4Ap1eS;sDvWjlr@W-McPe8+pK9=YV>bk-?h52FYi(AWwjOW&!pYJIH5t3=Ci! z&;!(d4cJMD01X7&01eQ3s1*zhoD5D3&WI3o0*9yzgDaA~Zg6|u5%#J<?R7+pNRN$h rd%3`Y9K*oD5Ql6x$ZB0sWHN9vcp=B87g(n^nDhY$B`7KQGB5xDRqmVC literal 3104 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 Vh9U+ghElL|%D~P6<(+Z{1^~(TGG+h( diff --git a/target/classes/kr/ajousw/myspringweb/dto/FavoriteMusicRequestDto.class b/target/classes/kr/ajousw/myspringweb/dto/FavoriteMusicRequestDto.class new file mode 100644 index 0000000000000000000000000000000000000000..1e3a413feb6e9a8f713401ae07b80d63edd9a36b GIT binary patch literal 2582 zcmX^0Z`VEs1_oP(EOrJaMh3&|BK^dy{L<ob{oKmpf}+g4^zzgs{gje?eYeE2{G!Z~ zRNvC#%;ccd!qU{@5|@&Eb_Nzk27#=^vPAuy#JqHU|D>$c<Pt^(p5*+ToYdr!%=|ph z6h;OiAB2+N5|Fvpj0_x!MJ1WVB_Me&2-7byH<gir7s3h4Of3&B%3);SLzo3oAczov zD`K<B%*!mXV`N~~&<tZ_U~$e*N#$Z-W)R?E;9=lpWZ?J7%uDqv%}q)z3Q0`LNd>tn zKRGccEU_pP#D@y9lw@QUGcp+akQ@>q50&J*=9OfYR5CK?X=vgwA{DFxH9W1^86+4P zw6NQWO#>H$ID-Hu10#bp4+AR$8;C2*!yv~X&&a@EoLb_H68NGTn4zy32GXs_!@v&F zt<1xq0@BT0oLb@tjTVp!H68{IhzboJ22GF(UbqTSWPsFY^DuBi)adds=z-J-z|}zG z2c*n^hk*;C%!r4<7^F-P#i=mkOnDf%A?nO|7%V{QL{QX0jbvnC%>|`JMg|>HLYk3* zKOH@QL^L!pLx_=qI~@@gj10VR9>}4L3<7XI+(CjUCPS2opoqbh3izg$WaOs=Bo-y+ zrk11@6*Dq$l;lIQ20Mc*BZD}4hH)y*%t=Wt;$U!RWKhMC8#NFa!!yN}i@}A#6O{br zxfmE3ym=U`8EimezB~+m4E~G^Y>5R0sd*`k47%772u6rN9bnDD5Xi{Dt)l?RrC@s) z8G?BjY#D4g7(y8tcwthY0I&sF9nQmG2a=3rWDtN!LPG*9AI-yH50Z~%WDwL*K==V} zKs*nF14uz4BZCOC0%Svyc^Di)YEl^)7&SrOOy^;6X0Tyo;0n$!ElN&x%LHY585|*} z2MTTmMFvI&W(EcZHU=h8wqjslU;<?jFwMch2BtZoG#8ZS2GjfujG%Icfsuiafq_Av zfsuicfq{WlYdZt~MzA(Pu(2RP9tI%>1_mC80tR6Q5e5bZMg~y^F{tJ)1||k31_lPJ z-3;Q9+ZiN%w6(S{NNr<~0nrNE7?eP?>NW;-5UsV1K?g+ZZ(}e7(I(p%%(OSaZB%05 zU|?VnVc=j8We{KxV~}7FXHZ~}V9;QYWH4ZmVz6M42D?TKVk6Ww91KPbmJC*4Pgpb9 zK;4D#)D{LQgcWRHk8pyGLHCp`R?P~;X|}_vS(P}=_E<G*5vSP!t7d)TG&^F|Y(ku7 zIR<$KCU6q6f~EpCE$yugQs`-j3mn{#SYw068YtPaGJvAP36%608CV$v7#KmtIyNH} zh&7TO*+_P<k($_DsY<Mopsd8m0Cgn?*hoF>MrsjjBq&$HjpPIyX^h=SePWFSWpKEW zTwo(Dup4PYtdXFy0&XNX*hpu1a;axv24|(v-3%^~LT=j`JhZkkcx_|w5enGG;G?yT zAqd0{fw03s><9=u3dD|qu;W1N1PD6`#7^19;IoY(4L$jBgA))WzlK5+5F<kdxZubH E0H$fl<^TWy literal 0 HcmV?d00001 diff --git a/target/classes/kr/ajousw/myspringweb/repository/FavoriteRepository.class b/target/classes/kr/ajousw/myspringweb/repository/FavoriteRepository.class index 4a1f88d371634494cc49158cf175b63f6d9994e2..1d2b7d568dc3f3bd42637dc87c15108297b5b75d 100644 GIT binary patch delta 354 zcmaFOvWAW8)W2Q(7#J9A8DuAN{i^3mNzF+uNp-69OkrdY)$qwmEKAhSNz6;v4=yRn z%uBb{3}a+q%1mKo5b#Yc$;eL$NGwXsO)W_+Dn?W9pOlrFTmn|l;+&t7%FZCf$RL1j z9ybFcg9r};Hv<nN1HVt^WJ5+3MKKLcBzrweQi~Fka#F29N+o$1*cmt`2Qwb1XJKIk zu^AW{I2jlim>9TN7(vD`Ff#BlFfgz(GVn4m2skouGw?GoG6*m*FlaL{F)%SOFmP*W zA7BvN$so+cuo0|Nl!1YPje(JYfq{`h3@ifD$j%@R)u_(E2$p5n+Q}fn$glydL=}rJ O1||k6u%tB9O)>!QG(0!} delta 156 zcmZ3(_L_z3)W2Q(7#J9A8AK*>{n8NA(DcblEKAhSNz6;v_bf>*N=(X0wPs{san4Uk z<z`@H;NxLnXW*Dz$EZ2^6yv@KCKg5zpMjBqlYxPOiGfSNk%657q>zV!fkB;tk%5tc lfq`9XCj&1d!v?Steg*~xHn1=wg8*0rq)`ye5`r2d3;<^n7V`iA diff --git a/target/classes/kr/ajousw/myspringweb/service/MusicService.class b/target/classes/kr/ajousw/myspringweb/service/MusicService.class new file mode 100644 index 0000000000000000000000000000000000000000..8d7cca1b85391f6419bec63f0d2ab3ce7e2e280f GIT binary patch literal 3035 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 literal 0 HcmV?d00001 -- GitLab