Skip to content

Commit 564371c

Browse files
authored
Merge pull request #173 from team-gogo/develop
v2025.4.23
2 parents 1b66b16 + bfe9a61 commit 564371c

File tree

17 files changed

+210
-6
lines changed

17 files changed

+210
-6
lines changed

build.gradle.kts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ repositories {
2525
extra["springCloudVersion"] = "2024.0.0-RC1"
2626

2727
dependencies {
28+
implementation("org.springframework.boot:spring-boot-starter-aop")
29+
implementation("org.springframework.cloud:spring-cloud-starter-circuitbreaker-resilience4j")
2830
implementation("com.fasterxml.jackson.datatype:jackson-datatype-jsr310")
2931
implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
3032
implementation("org.springframework.boot:spring-boot-starter-data-redis")
@@ -49,6 +51,7 @@ dependencies {
4951
testImplementation("org.springframework.security:spring-security-test")
5052
testRuntimeOnly("org.junit.platform:junit-platform-launcher")
5153
implementation("com.querydsl:querydsl-jpa:5.0.0:jakarta")
54+
implementation ("org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE")
5255
kapt("com.querydsl:querydsl-apt:5.0.0:jakarta")
5356
kapt("jakarta.annotation:jakarta.annotation-api")
5457
kapt("jakarta.persistence:jakarta.persistence-api")

src/main/kotlin/gogo/gogostage/domain/community/board/application/BoardProcessor.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ class BoardProcessor(
2626
commentCount = 0,
2727
likeCount = 0,
2828
isFiltered = false,
29-
createdAt = LocalDateTime.now()
29+
createdAt = LocalDateTime.now(),
30+
imageUrl = writeCommunityBoardDto.imageUrl,
3031
)
3132

3233
return boardRepository.save(board)

src/main/kotlin/gogo/gogostage/domain/community/board/persistence/Board.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,10 @@ class Board(
3535
var isFiltered: Boolean,
3636

3737
@Column(name = "created_at", nullable = false)
38-
val createdAt: LocalDateTime
38+
val createdAt: LocalDateTime,
39+
40+
@Column(name = "image_url", length = 800, nullable = true)
41+
val imageUrl: String?,
3942
) {
4043

4144
fun minusLikeCount() {

src/main/kotlin/gogo/gogostage/domain/community/root/application/dto/CommunityDto.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ data class WriteCommunityBoardDto(
1515
@Size(max = 1000)
1616
val content: String,
1717
@NotNull
18-
val gameCategory: GameCategory
18+
val gameCategory: GameCategory,
19+
val imageUrl: String?,
1920
)
2021

2122
data class GetCommunityBoardResDto(
@@ -48,6 +49,7 @@ data class GetCommunityBoardInfoResDto(
4849
val isLiked: Boolean,
4950
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss")
5051
val createdAt: LocalDateTime,
52+
val imageUrl: String?,
5153
val stage: StageDto,
5254
val commentCount: Int,
5355
val comment: List<CommentDto>

src/main/kotlin/gogo/gogostage/domain/community/root/persistence/CommunityCustomRepositoryImpl.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,8 @@ class CommunityCustomRepositoryImpl(
123123
createdAt = board.createdAt,
124124
stage = stageDto,
125125
commentCount = board.commentCount,
126-
comment = commentDto
126+
comment = commentDto,
127+
imageUrl = board.imageUrl
127128
)
128129

129130
return response
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package gogo.gogostage.domain.image.application
2+
3+
import gogo.gogostage.domain.image.application.dto.ImageUploadResDto
4+
import org.springframework.stereotype.Component
5+
6+
@Component
7+
class ImageMapper {
8+
9+
fun mapUpload(url: String): ImageUploadResDto =
10+
ImageUploadResDto(
11+
imageUrl = url
12+
)
13+
14+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package gogo.gogostage.domain.image.application
2+
3+
import gogo.gogostage.domain.image.application.dto.ImageUploadResDto
4+
import org.springframework.web.multipart.MultipartFile
5+
6+
interface ImageService {
7+
fun upload(image: MultipartFile): ImageUploadResDto
8+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package gogo.gogostage.domain.image.application
2+
3+
import gogo.gogostage.domain.image.application.dto.ImageUploadResDto
4+
import gogo.gogostage.global.aws.s3.S3Uploader
5+
import org.springframework.stereotype.Service
6+
import org.springframework.web.multipart.MultipartFile
7+
8+
@Service
9+
class ImageServiceImpl(
10+
private val s3Uploader: S3Uploader,
11+
private val imageMapper: ImageMapper,
12+
private val imageValidator: ImageValidator
13+
): ImageService {
14+
15+
override fun upload(image: MultipartFile): ImageUploadResDto {
16+
imageValidator.validImage(image)
17+
val url = s3Uploader.upload(image)
18+
return imageMapper.mapUpload(url)
19+
}
20+
21+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package gogo.gogostage.domain.image.application
2+
3+
import gogo.gogostage.global.error.StageException
4+
import org.springframework.stereotype.Component
5+
import org.springframework.web.multipart.MultipartFile
6+
7+
@Component
8+
class ImageValidator {
9+
10+
fun validImage(image: MultipartFile) {
11+
val list = listOf("jpg", "png", "gif")
12+
val splitFile = image.originalFilename.toString().split(".")
13+
14+
if(splitFile.size != 2)
15+
throw StageException("Image Extension Invalid", 400)
16+
17+
val extension = splitFile[1].lowercase()
18+
19+
if(list.none { it == extension })
20+
throw StageException("Image Extension Invalid", 400)
21+
}
22+
23+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package gogo.gogostage.domain.image.application.dto
2+
3+
data class ImageUploadResDto(
4+
val imageUrl: String
5+
)

0 commit comments

Comments
 (0)