diff --git a/src/docs/asciidoc/index.adoc b/src/docs/asciidoc/index.adoc index 961b467..2352916 100644 --- a/src/docs/asciidoc/index.adoc +++ b/src/docs/asciidoc/index.adoc @@ -119,6 +119,16 @@ operation::link-controller-test/delete-link[snippets='http-request,request-heade operation::link-controller-test/delete-link[snippets='http-response,response-fields'] +=== 허브 링크 삭제 + +==== request + +operation::link-controller-test/delete-hub-link[snippets='http-request,request-headers,path-parameters'] + +==== response + +operation::link-controller-test/delete-hub-link[snippets='http-response,response-fields'] + == 허브 === 허브 생성 diff --git a/src/main/java/com/seong/shoutlink/domain/link/controller/LinkController.java b/src/main/java/com/seong/shoutlink/domain/link/controller/LinkController.java index 8291547..4720333 100644 --- a/src/main/java/com/seong/shoutlink/domain/link/controller/LinkController.java +++ b/src/main/java/com/seong/shoutlink/domain/link/controller/LinkController.java @@ -7,6 +7,7 @@ import com.seong.shoutlink.domain.link.service.LinkUseCase; import com.seong.shoutlink.domain.link.service.request.CreateHubLinkCommand; import com.seong.shoutlink.domain.link.service.request.CreateLinkCommand; +import com.seong.shoutlink.domain.link.service.request.DeleteHubLinkCommand; import com.seong.shoutlink.domain.link.service.request.DeleteLinkCommand; import com.seong.shoutlink.domain.link.service.request.FindHubLinksCommand; import com.seong.shoutlink.domain.link.service.request.FindLinksCommand; @@ -94,4 +95,14 @@ public ResponseEntity deleteLink( new DeleteLinkCommand(memberId, linkId)); return ResponseEntity.ok(deleteLinkResponse); } + + @DeleteMapping("/hubs/{hubId}/links/{linkId}") + public ResponseEntity deleteHubLink( + @LoginUser Long memberId, + @PathVariable("hubId") Long hubId, + @PathVariable("linkId") Long linkId) { + DeleteLinkResponse response = linkUseCase.deleteHubLink( + new DeleteHubLinkCommand(linkId, memberId, hubId)); + return ResponseEntity.ok(response); + } } \ No newline at end of file diff --git a/src/main/resources/static/docs/index.html b/src/main/resources/static/docs/index.html index 8462859..9681533 100644 --- a/src/main/resources/static/docs/index.html +++ b/src/main/resources/static/docs/index.html @@ -471,6 +471,7 @@

API 문서

  • 허브 링크 생성
  • 허브 링크 목록 조회
  • 회원 링크 삭제
  • +
  • 허브 링크 삭제
  • 허브 @@ -651,7 +652,7 @@
    POST /api/link-bundles HTTP/1.1
     Content-Type: application/json;charset=UTF-8
    -Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ0ZXN0IiwiaWF0IjoxNzEzNjk3MDc5LCJzdWIiOiIxIiwiZXhwIjoxNzEzNzAwNjc5LCJyb2xlIjoiUk9MRV9VU0VSIn0.dgA78BnrQKybFlhoStHl0TT8R5DvM-3RK8nUniPZqPc
    +Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ0ZXN0IiwiaWF0IjoxNzEzNzAxNjI5LCJzdWIiOiIxIiwiZXhwIjoxNzEzNzA1MjI5LCJyb2xlIjoiUk9MRV9VU0VSIn0.CAkcmImII9LETdcR0Q0FFXv4vf4gjYIyKUvLZA5nhSo
     Content-Length: 57
     Host: localhost:8080
     
    @@ -767,7 +768,7 @@ 
    GET /api/link-bundles HTTP/1.1
    -Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ0ZXN0IiwiaWF0IjoxNzEzNjk3MDc5LCJzdWIiOiIxIiwiZXhwIjoxNzEzNzAwNjc5LCJyb2xlIjoiUk9MRV9VU0VSIn0.dgA78BnrQKybFlhoStHl0TT8R5DvM-3RK8nUniPZqPc
    +Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ0ZXN0IiwiaWF0IjoxNzEzNzAxNjI5LCJzdWIiOiIxIiwiZXhwIjoxNzEzNzA1MjI5LCJyb2xlIjoiUk9MRV9VU0VSIn0.CAkcmImII9LETdcR0Q0FFXv4vf4gjYIyKUvLZA5nhSo
     Host: localhost:8080
    @@ -872,7 +873,7 @@
    POST /api/hubs/1/link-bundles HTTP/1.1
     Content-Type: application/json;charset=UTF-8
    -Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ0ZXN0IiwiaWF0IjoxNzEzNjk3MDc5LCJzdWIiOiIxIiwiZXhwIjoxNzEzNzAwNjc5LCJyb2xlIjoiUk9MRV9VU0VSIn0.dgA78BnrQKybFlhoStHl0TT8R5DvM-3RK8nUniPZqPc
    +Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ0ZXN0IiwiaWF0IjoxNzEzNzAxNjI5LCJzdWIiOiIxIiwiZXhwIjoxNzEzNzA1MjI5LCJyb2xlIjoiUk9MRV9VU0VSIn0.CAkcmImII9LETdcR0Q0FFXv4vf4gjYIyKUvLZA5nhSo
     Content-Length: 53
     Host: localhost:8080
     
    @@ -1010,7 +1011,7 @@ 
    GET /api/hubs/1/link-bundles HTTP/1.1
    -Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ0ZXN0IiwiaWF0IjoxNzEzNjk3MDc5LCJzdWIiOiIxIiwiZXhwIjoxNzEzNzAwNjc5LCJyb2xlIjoiUk9MRV9VU0VSIn0.dgA78BnrQKybFlhoStHl0TT8R5DvM-3RK8nUniPZqPc
    +Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ0ZXN0IiwiaWF0IjoxNzEzNzAxNjI5LCJzdWIiOiIxIiwiZXhwIjoxNzEzNzA1MjI5LCJyb2xlIjoiUk9MRV9VU0VSIn0.CAkcmImII9LETdcR0Q0FFXv4vf4gjYIyKUvLZA5nhSo
     Host: localhost:8080
    @@ -1138,7 +1139,7 @@
    POST /api/links HTTP/1.1
     Content-Type: application/json;charset=UTF-8
    -Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ0ZXN0IiwiaWF0IjoxNzEzNjk3MDc5LCJzdWIiOiIxIiwiZXhwIjoxNzEzNzAwNjc5LCJyb2xlIjoiUk9MRV9VU0VSIn0.dgA78BnrQKybFlhoStHl0TT8R5DvM-3RK8nUniPZqPc
    +Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ0ZXN0IiwiaWF0IjoxNzEzNzAxNjI5LCJzdWIiOiIxIiwiZXhwIjoxNzEzNzA1MjI5LCJyb2xlIjoiUk9MRV9VU0VSIn0.CAkcmImII9LETdcR0Q0FFXv4vf4gjYIyKUvLZA5nhSo
     Content-Length: 100
     Host: localhost:8080
     
    @@ -1260,7 +1261,7 @@ 
    GET /api/links?linkBundleId=1&page=0&size=10 HTTP/1.1
    -Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ0ZXN0IiwiaWF0IjoxNzEzNjk3MDc5LCJzdWIiOiIxIiwiZXhwIjoxNzEzNzAwNjc5LCJyb2xlIjoiUk9MRV9VU0VSIn0.dgA78BnrQKybFlhoStHl0TT8R5DvM-3RK8nUniPZqPc
    +Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ0ZXN0IiwiaWF0IjoxNzEzNzAxNjI5LCJzdWIiOiIxIiwiZXhwIjoxNzEzNzA1MjI5LCJyb2xlIjoiUk9MRV9VU0VSIn0.CAkcmImII9LETdcR0Q0FFXv4vf4gjYIyKUvLZA5nhSo
     Host: localhost:8080
    @@ -1327,7 +1328,7 @@
    POST /api/hubs/1/links HTTP/1.1
     Content-Type: application/json;charset=UTF-8
    -Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ0ZXN0IiwiaWF0IjoxNzEzNjk3MDc5LCJzdWIiOiIxIiwiZXhwIjoxNzEzNzAwNjc5LCJyb2xlIjoiUk9MRV9VU0VSIn0.dgA78BnrQKybFlhoStHl0TT8R5DvM-3RK8nUniPZqPc
    +Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ0ZXN0IiwiaWF0IjoxNzEzNzAxNjI5LCJzdWIiOiIxIiwiZXhwIjoxNzEzNzA1MjI5LCJyb2xlIjoiUk9MRV9VU0VSIn0.CAkcmImII9LETdcR0Q0FFXv4vf4gjYIyKUvLZA5nhSo
     Content-Length: 69
     Host: localhost:8080
     
    @@ -1471,7 +1472,7 @@ 
    GET /api/hubs/1/links?linkBundleId=1&page=0&size=20 HTTP/1.1
    -Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ0ZXN0IiwiaWF0IjoxNzEzNjk3MDc5LCJzdWIiOiIxIiwiZXhwIjoxNzEzNzAwNjc5LCJyb2xlIjoiUk9MRV9VU0VSIn0.dgA78BnrQKybFlhoStHl0TT8R5DvM-3RK8nUniPZqPc
    +Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ0ZXN0IiwiaWF0IjoxNzEzNzAxNjI5LCJzdWIiOiIxIiwiZXhwIjoxNzEzNzA1MjI5LCJyb2xlIjoiUk9MRV9VU0VSIn0.CAkcmImII9LETdcR0Q0FFXv4vf4gjYIyKUvLZA5nhSo
     Host: localhost:8080
    @@ -1634,7 +1635,7 @@
    DELETE /api/links/1 HTTP/1.1
    -Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ0ZXN0IiwiaWF0IjoxNzEzNjk3MDc5LCJzdWIiOiIxIiwiZXhwIjoxNzEzNzAwNjc5LCJyb2xlIjoiUk9MRV9VU0VSIn0.dgA78BnrQKybFlhoStHl0TT8R5DvM-3RK8nUniPZqPc
    +Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ0ZXN0IiwiaWF0IjoxNzEzNzAxNjI5LCJzdWIiOiIxIiwiZXhwIjoxNzEzNzA1MjI5LCJyb2xlIjoiUk9MRV9VU0VSIn0.CAkcmImII9LETdcR0Q0FFXv4vf4gjYIyKUvLZA5nhSo
     Host: localhost:8080
    @@ -1728,6 +1729,113 @@
    +

    허브 링크 삭제

    +
    +

    request

    +
    +
    HTTP request
    +
    +
    +
    DELETE /api/hubs/1/links/1 HTTP/1.1
    +Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ0ZXN0IiwiaWF0IjoxNzEzNzAxNjI5LCJzdWIiOiIxIiwiZXhwIjoxNzEzNzA1MjI5LCJyb2xlIjoiUk9MRV9VU0VSIn0.CAkcmImII9LETdcR0Q0FFXv4vf4gjYIyKUvLZA5nhSo
    +Host: localhost:8080
    +
    +
    +
    +
    +
    Request headers
    + ++++ + + + + + + + + + + + + +
    NameDescription

    Authorization

    액세스 토큰

    +
    +
    +
    Path parameters
    + + ++++ + + + + + + + + + + + + + + + + +
    Table 1. /api/hubs/{hubId}/links/{linkId}
    ParameterDescription

    hubId

    허브 ID

    linkId

    링크 ID

    +
    +
    +
    +

    response

    +
    +
    HTTP response
    +
    +
    +
    HTTP/1.1 200 OK
    +Vary: Origin
    +Vary: Access-Control-Request-Method
    +Vary: Access-Control-Request-Headers
    +Content-Type: application/json;charset=UTF-8
    +Content-Length: 18
    +
    +{
    +  "linkId" : 1
    +}
    +
    +
    +
    +
    +
    Response fields
    + +++++ + + + + + + + + + + + + + + +
    PathTypeDescription

    linkId

    Number

    삭제된 링크 ID

    +
    +
    +
    @@ -1736,14 +1844,14 @@

    허브

    허브 생성

    -

    request

    +

    request

    -
    HTTP request
    +
    HTTP request
    POST /api/hubs HTTP/1.1
     Content-Type: application/json;charset=UTF-8
    -Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ0ZXN0IiwiaWF0IjoxNzEzNjk3MDc4LCJzdWIiOiIxIiwiZXhwIjoxNzEzNzAwNjc4LCJyb2xlIjoiUk9MRV9VU0VSIn0.Pn2wYf3T95eJ9FjqTb5DW31x4OPEUerPYySHMLNQrV0
    +Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ0ZXN0IiwiaWF0IjoxNzEzNzAxNjI5LCJzdWIiOiIxIiwiZXhwIjoxNzEzNzA1MjI5LCJyb2xlIjoiUk9MRV9VU0VSIn0.CAkcmImII9LETdcR0Q0FFXv4vf4gjYIyKUvLZA5nhSo
     Content-Length: 88
     Host: localhost:8080
     
    @@ -1756,7 +1864,7 @@ 
    -
    Request headers
    +
    Request headers
    @@ -1777,7 +1885,7 @@
    -
    Request fields
    +
    Request fields
    @@ -1812,9 +1920,9 @@
    -

    response

    +

    response

    -
    HTTP response
    +
    HTTP response
    HTTP/1.1 201 Created
    @@ -1831,7 +1939,7 @@ 
    -
    Response fields
    +
    Response fields
    @@ -1859,9 +1967,9 @@

    허브 목록 조회

    -

    request

    +

    request

    -
    HTTP request
    +
    HTTP request
    GET /api/hubs?page=0&size=0 HTTP/1.1
    @@ -1870,7 +1978,7 @@ 
    -
    Path parameters
    +
    Path parameters
    @@ -1897,9 +2005,9 @@
    -

    response

    +

    response

    -
    HTTP response
    +
    HTTP response
    HTTP/1.1 200 OK
    @@ -1928,7 +2036,7 @@ 
    -
    Response fields
    +
    Response fields
    Table 1. /api/hubs
    @@ -2006,9 +2114,9 @@

    허브 조회

    -

    request

    +

    request

    -
    HTTP request
    +
    HTTP request
    GET /api/hubs/1 HTTP/1.1
    @@ -2017,7 +2125,7 @@ 
    -
    Path parameters
    +
    Path parameters
    @@ -2040,9 +2148,9 @@
    -

    response

    +

    response

    -
    HTTP response
    +
    HTTP response
    HTTP/1.1 200 OK
    @@ -2068,19 +2176,19 @@ 

    사용자의 허브 목록 조회

    -

    request

    +

    request

    -
    HTTP request
    +
    HTTP request
    GET /api/hubs/me?page=0&size=10 HTTP/1.1
    -Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ0ZXN0IiwiaWF0IjoxNzEzNjk3MDc4LCJzdWIiOiIxIiwiZXhwIjoxNzEzNzAwNjc4LCJyb2xlIjoiUk9MRV9VU0VSIn0.Pn2wYf3T95eJ9FjqTb5DW31x4OPEUerPYySHMLNQrV0
    +Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ0ZXN0IiwiaWF0IjoxNzEzNzAxNjI5LCJzdWIiOiIxIiwiZXhwIjoxNzEzNzA1MjI5LCJyb2xlIjoiUk9MRV9VU0VSIn0.CAkcmImII9LETdcR0Q0FFXv4vf4gjYIyKUvLZA5nhSo
     Host: localhost:8080
    Table 1. /api/hubs/{hubId}
    @@ -2101,7 +2209,7 @@
    -
    Query parameters
    +
    Query parameters
    @@ -2127,9 +2235,9 @@
    -

    response

    +

    response

    -
    HTTP response
    +
    HTTP response
    HTTP/1.1 200 OK
    @@ -2158,7 +2266,7 @@ 
    -
    Response fields
    +
    Response fields
    @@ -2241,9 +2349,9 @@

    도메인

    루트 도메인 목록 조회

    -

    request

    +

    request

    -
    HTTP request
    +
    HTTP request
    GET /api/domains/search?keyword=searchKeyword&size=20 HTTP/1.1
    @@ -2252,7 +2360,7 @@ 
    -
    Query parameters
    +
    Query parameters
    @@ -2278,9 +2386,9 @@
    -

    response

    +

    response

    -
    HTTP response
    +
    HTTP response
    HTTP/1.1 200 OK
    @@ -2297,7 +2405,7 @@ 
    -
    Response fields
    +
    Response fields
    @@ -2325,9 +2433,9 @@

    도메인 목록 조회

    -

    request

    +

    request

    -
    HTTP request
    +
    HTTP request
    GET /api/domains?keyword=searchKeyword&page=0&size=10 HTTP/1.1
    @@ -2336,7 +2444,7 @@ 
    -
    Query parameters
    +
    Query parameters
    @@ -2366,9 +2474,9 @@
    -

    response

    +

    response

    -
    HTTP response
    +
    HTTP response
    HTTP/1.1 200 OK
    @@ -2390,7 +2498,7 @@ 
    -
    Response fields
    +
    Response fields
    @@ -2438,9 +2546,9 @@

    도메인 단건 조회

    -

    request

    +

    request

    -
    HTTP request
    +
    HTTP request
    GET /api/domains/1 HTTP/1.1
    @@ -2449,7 +2557,7 @@ 
    -
    Path parameters
    +
    Path parameters
    @@ -2472,9 +2580,9 @@
    -

    response

    +

    response

    -
    HTTP response
    +
    HTTP response
    HTTP/1.1 200 OK
    @@ -2492,7 +2600,7 @@ 
    -
    Response fields
    +
    Response fields
    Table 1. /api/domains/{domainId}
    @@ -2525,9 +2633,9 @@

    도메인 링크 목록 조회

    -

    request

    +

    request

    -
    HTTP request
    +
    HTTP request
    GET /api/domains/1/links?page=0&size=10 HTTP/1.1
    @@ -2536,7 +2644,7 @@ 
    -
    Path parameters
    +
    Path parameters
    @@ -2558,7 +2666,7 @@
    -
    Query parameters
    +
    Query parameters
    Table 1. /api/domains/{domainId}/links
    @@ -2584,9 +2692,9 @@
    -

    response

    +

    response

    -
    HTTP response
    +
    HTTP response
    HTTP/1.1 200 OK
    @@ -2609,7 +2717,7 @@ 
    -
    Response fields
    +
    Response fields
    @@ -2665,7 +2773,7 @@
    diff --git a/src/test/java/com/seong/shoutlink/domain/link/controller/LinkControllerTest.java b/src/test/java/com/seong/shoutlink/domain/link/controller/LinkControllerTest.java index 0277dc6..ab06b84 100644 --- a/src/test/java/com/seong/shoutlink/domain/link/controller/LinkControllerTest.java +++ b/src/test/java/com/seong/shoutlink/domain/link/controller/LinkControllerTest.java @@ -216,4 +216,31 @@ void deleteLink() throws Exception { ) )); } + + @Test + @DisplayName("성공: 허브 링크 삭제 api 호출 시") + void deleteHubLink() throws Exception { + //given + given(linkService.deleteHubLink(any())).willReturn(new DeleteLinkResponse(1L)); + + //when + ResultActions resultActions = mockMvc.perform( + delete("/api/hubs/{hubId}/links/{linkId}", 1L, 1L) + .header(AUTHORIZATION, bearerAccessToken)); + + //then + resultActions.andExpect(status().isOk()) + .andDo(restDocs.document( + requestHeaders( + headerWithName(AUTHORIZATION).description("액세스 토큰") + ), + pathParameters( + parameterWithName("hubId").description("허브 ID"), + parameterWithName("linkId").description("링크 ID") + ), + responseFields( + fieldWithPath("linkId").description("삭제된 링크 ID") + ) + )); + } } \ No newline at end of file