Skip to content

Commit 5774632

Browse files
authored
Merge pull request #71 from billilge/develop
release: 0.1.0 배포
2 parents edf6ab0 + d947354 commit 5774632

33 files changed

+850
-9
lines changed

.github/workflows/ci-cd.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,12 @@ jobs:
1919
java-version: '17'
2020
distribution: 'temurin'
2121

22+
- name: Create Firebase Config Directory
23+
run: |
24+
mkdir -p src/main/resources/firebase
25+
echo "${{ secrets.FIREBASE_SERVICE_KEY }}" | base64 --decode > src/main/resources/firebase/firebaseServiceKey.json
26+
shell: bash
27+
2228
- name: Setup Gradle
2329
uses: gradle/actions/setup-gradle@af1da67850ed9a4cedd57bfd976089dd991e2582 # v4.0.0
2430

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,4 +41,5 @@ out/
4141

4242
application-local.yml
4343

44-
.DS_Store
44+
.DS_Store
45+
/src/main/resources/firebase

build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ dependencies {
5959

6060
implementation("io.github.oshai:kotlin-logging-jvm:7.0.3")
6161

62+
implementation("com.google.firebase:firebase-admin:9.4.3")
63+
6264
compileOnly("org.projectlombok:lombok")
6365
runtimeOnly("com.h2database:h2")
6466
runtimeOnly("com.mysql:mysql-connector-j")
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package site.billilge.api.backend.domain.item.controller
2+
3+
import io.swagger.v3.oas.annotations.Operation
4+
import io.swagger.v3.oas.annotations.responses.ApiResponse
5+
import io.swagger.v3.oas.annotations.responses.ApiResponses
6+
import io.swagger.v3.oas.annotations.tags.Tag
7+
import org.springframework.http.ResponseEntity
8+
import org.springframework.web.bind.annotation.GetMapping
9+
import org.springframework.web.bind.annotation.ModelAttribute
10+
import site.billilge.api.backend.domain.item.dto.response.ItemFindAllResponse
11+
import site.billilge.api.backend.global.dto.SearchCondition
12+
13+
@Tag(name = "Item", description = "대여 물품 조회 API")
14+
interface ItemApi {
15+
16+
@Operation(
17+
summary = "대여 물품 목록 조회",
18+
description = "검색어에 따라 물품 이름에 포함된 단어를 기반으로 대여 물품 목록을 조회합니다."
19+
)
20+
@ApiResponses(
21+
value = [
22+
ApiResponse(
23+
responseCode = "200",
24+
description = "대여 물품 목록 조회 성공"
25+
)
26+
]
27+
)
28+
@GetMapping
29+
fun getItems(
30+
@ModelAttribute searchCondition: SearchCondition
31+
): ResponseEntity<ItemFindAllResponse>
32+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package site.billilge.api.backend.domain.item.controller
2+
3+
import org.springframework.http.ResponseEntity
4+
import org.springframework.web.bind.annotation.GetMapping
5+
import org.springframework.web.bind.annotation.ModelAttribute
6+
import org.springframework.web.bind.annotation.RequestMapping
7+
import org.springframework.web.bind.annotation.RestController
8+
import site.billilge.api.backend.domain.item.dto.response.ItemFindAllResponse
9+
import site.billilge.api.backend.domain.item.service.ItemService
10+
import site.billilge.api.backend.global.dto.SearchCondition
11+
12+
@RestController
13+
@RequestMapping("/items")
14+
class ItemController(
15+
private val itemService: ItemService
16+
) : ItemApi {
17+
@GetMapping
18+
override fun getItems(
19+
@ModelAttribute searchCondition: SearchCondition
20+
): ResponseEntity<ItemFindAllResponse> {
21+
val response = itemService.searchItems(searchCondition)
22+
return ResponseEntity.ok(response)
23+
}
24+
}

src/main/kotlin/site/billilge/api/backend/domain/item/dto/response/ItemDetail.kt

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@ package site.billilge.api.backend.domain.item.dto.response
33
import io.swagger.v3.oas.annotations.media.Schema
44
import site.billilge.api.backend.domain.item.entity.Item
55
import site.billilge.api.backend.domain.item.enums.ItemType
6-
import site.billilge.api.backend.domain.item.exception.ItemErrorCode
7-
import site.billilge.api.backend.global.exception.ApiException
86

97
@Schema
108
data class ItemDetail(
@@ -23,8 +21,7 @@ data class ItemDetail(
2321
@JvmStatic
2422
fun from(item: Item): ItemDetail {
2523
return ItemDetail(
26-
itemId = item.id
27-
?: throw ApiException(ItemErrorCode.ITEM_ID_IS_NULL),
24+
itemId = item.id!!,
2825
itemName = item.name,
2926
itemType = item.type,
3027
count = item.count,
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
package site.billilge.api.backend.domain.item.repository
22

33
import org.springframework.data.jpa.repository.JpaRepository
4+
import org.springframework.data.jpa.repository.Query
5+
import org.springframework.data.repository.query.Param
46
import site.billilge.api.backend.domain.item.entity.Item
57
import java.util.*
68

79
interface ItemRepository: JpaRepository<Item, Long>, ItemRepositoryCustom {
810
override fun findById(id: Long): Optional<Item>
911
fun existsByName(name: String): Boolean
12+
13+
@Query("SELECT i FROM Item i WHERE i.name LIKE CONCAT('%', :search, '%')")
14+
fun findByItemName(@Param("search") search: String): List<Item>
1015
}

src/main/kotlin/site/billilge/api/backend/domain/item/service/ItemService.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,4 +117,10 @@ class ItemService(
117117
if (image.contentType != "image/svg+xml")
118118
throw ApiException(ItemErrorCode.IMAGE_IS_NOT_SVG)
119119
}
120+
121+
fun searchItems(searchCondition: SearchCondition): ItemFindAllResponse {
122+
val items = itemRepository.findByItemName(searchCondition.search)
123+
124+
return ItemFindAllResponse(items.map { ItemDetail.from(it) })
125+
}
120126
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package site.billilge.api.backend.domain.member.controller
2+
3+
import io.swagger.v3.oas.annotations.Operation
4+
import io.swagger.v3.oas.annotations.responses.ApiResponse
5+
import io.swagger.v3.oas.annotations.responses.ApiResponses
6+
import io.swagger.v3.oas.annotations.tags.Tag
7+
import org.springframework.http.ResponseEntity
8+
import org.springframework.security.core.annotation.AuthenticationPrincipal
9+
import org.springframework.web.bind.annotation.RequestBody
10+
import site.billilge.api.backend.domain.member.dto.request.MemberFCMTokenRequest
11+
import site.billilge.api.backend.global.security.oauth2.UserAuthInfo
12+
13+
@Tag(name = "Member", description = "회원 API")
14+
interface MemberApi {
15+
@Operation(
16+
summary = "FCM 토큰 전송",
17+
description = "서버 측으로 회원 기기의 FCM 토큰을 전송하는 API"
18+
)
19+
@ApiResponses(
20+
value = [
21+
ApiResponse(
22+
responseCode = "200",
23+
description = "FCM 토큰 전송 성공"
24+
)
25+
]
26+
)
27+
fun setFCMToken(
28+
@AuthenticationPrincipal userAuthInfo: UserAuthInfo,
29+
@RequestBody request: MemberFCMTokenRequest
30+
): ResponseEntity<Void>
31+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package site.billilge.api.backend.domain.member.controller
2+
3+
import org.springframework.http.ResponseEntity
4+
import org.springframework.security.core.annotation.AuthenticationPrincipal
5+
import org.springframework.web.bind.annotation.PostMapping
6+
import org.springframework.web.bind.annotation.RequestBody
7+
import org.springframework.web.bind.annotation.RequestMapping
8+
import org.springframework.web.bind.annotation.RestController
9+
import site.billilge.api.backend.domain.member.dto.request.MemberFCMTokenRequest
10+
import site.billilge.api.backend.domain.member.service.MemberService
11+
import site.billilge.api.backend.global.security.oauth2.UserAuthInfo
12+
13+
@RestController
14+
@RequestMapping("/members")
15+
class MemberController(
16+
private val memberService: MemberService,
17+
) : MemberApi {
18+
@PostMapping("/me/fcm-token")
19+
override fun setFCMToken(
20+
@AuthenticationPrincipal userAuthInfo: UserAuthInfo,
21+
@RequestBody request: MemberFCMTokenRequest
22+
): ResponseEntity<Void> {
23+
memberService.setMemberFCMToken(userAuthInfo.memberId, request)
24+
return ResponseEntity.ok().build()
25+
}
26+
}

0 commit comments

Comments
 (0)