Skip to content

Commit d8e48fc

Browse files
authored
Merge pull request #80 from NameOfTeam/features/swagger-url
swagger production server url
2 parents 92cfcf3 + fcaefdd commit d8e48fc

9 files changed

Lines changed: 414 additions & 35 deletions

File tree

build.gradle.kts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ dependencies {
2929
implementation("com.sksamuel.scrimage:scrimage-webp:4.2.0")
3030
runtimeOnly("io.netty:netty-resolver-dns-native-macos:4.1.116.Final")
3131

32+
implementation("org.flywaydb:flyway-core")
33+
implementation("org.flywaydb:flyway-mysql")
34+
3235
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0")
3336
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-reactor:1.9.0")
3437

src/main/kotlin/com/solve/domain/problem/controller/ProblemCodeController.kt

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package com.solve.domain.problem.controller
22

33
import com.solve.domain.problem.dto.request.ProblemCodeCreateRequest
44
import com.solve.domain.problem.service.ProblemCodeService
5+
import com.solve.global.common.dto.BaseResponse
6+
import com.solve.global.common.enums.ProgrammingLanguage
57
import io.swagger.v3.oas.annotations.Operation
68
import io.swagger.v3.oas.annotations.tags.Tag
79
import org.springframework.web.bind.annotation.*
@@ -14,14 +16,14 @@ class ProblemCodeController(
1416
) {
1517
@Operation(summary = "코드 저장", description = "작성 중인 코드를 저장합니다.")
1618
@PostMapping
17-
fun saveCode(@PathVariable problemId: Long, request: ProblemCodeCreateRequest) =
18-
problemCodeService.saveCode(problemId, request)
19+
fun saveCode(@PathVariable problemId: Long, @RequestParam language: ProgrammingLanguage, @RequestBody request: ProblemCodeCreateRequest) =
20+
BaseResponse.of(problemCodeService.saveCode(problemId, language, request))
1921

2022
@Operation(summary = "코드 불러오기", description = "저장된 코드를 불러옵니다.")
2123
@GetMapping
22-
fun getCode(@PathVariable problemId: Long) = problemCodeService.getCode(problemId)
24+
fun getCode(@PathVariable problemId: Long, @RequestParam language: ProgrammingLanguage) = BaseResponse.of(problemCodeService.getCode(problemId, language))
2325

2426
@Operation(summary = "코드 초기화", description = "저장된 코드를 삭제합니다.")
2527
@DeleteMapping
26-
fun deleteCode(@PathVariable problemId: Long) = problemCodeService.deleteCode(problemId)
28+
fun deleteCode(@PathVariable problemId: Long, @RequestParam language: ProgrammingLanguage) = BaseResponse.of(problemCodeService.deleteCode(problemId, language))
2729
}
Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
package com.solve.domain.problem.dto.request
22

3-
import com.solve.global.common.enums.ProgrammingLanguage
4-
53
data class ProblemCodeCreateRequest(
64
val code: String,
7-
val language: ProgrammingLanguage
85
)

src/main/kotlin/com/solve/domain/problem/repository/ProblemCodeRepository.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@ package com.solve.domain.problem.repository
33
import com.solve.domain.problem.domain.entity.Problem
44
import com.solve.domain.problem.domain.entity.ProblemCode
55
import com.solve.domain.user.domain.entity.User
6+
import com.solve.global.common.enums.ProgrammingLanguage
67
import org.springframework.data.jpa.repository.JpaRepository
78

89
interface ProblemCodeRepository : JpaRepository<ProblemCode, Long> {
9-
fun findByProblemAndUser(problem: Problem, user: User): ProblemCode?
10+
fun findByProblemAndUserAndLanguage(problem: Problem, user: User, language: ProgrammingLanguage): ProblemCode?
1011
}

src/main/kotlin/com/solve/domain/problem/service/ProblemCodeService.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@ package com.solve.domain.problem.service
22

33
import com.solve.domain.problem.dto.request.ProblemCodeCreateRequest
44
import com.solve.domain.problem.dto.response.ProblemCodeResponse
5+
import com.solve.global.common.enums.ProgrammingLanguage
56

67
interface ProblemCodeService {
7-
fun saveCode(problemId: Long, request: ProblemCodeCreateRequest)
8-
fun getCode(problemId: Long): ProblemCodeResponse
9-
fun deleteCode(problemId: Long)
8+
fun saveCode(problemId: Long, language: ProgrammingLanguage, request: ProblemCodeCreateRequest)
9+
fun getCode(problemId: Long, language: ProgrammingLanguage): ProblemCodeResponse
10+
fun deleteCode(problemId: Long, language: ProgrammingLanguage)
1011
}

src/main/kotlin/com/solve/domain/problem/service/impl/ProblemCodeServiceImpl.kt

Lines changed: 16 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@ package com.solve.domain.problem.service.impl
33
import com.solve.domain.problem.domain.entity.ProblemCode
44
import com.solve.domain.problem.dto.request.ProblemCodeCreateRequest
55
import com.solve.domain.problem.dto.response.ProblemCodeResponse
6+
import com.solve.domain.problem.error.ProblemCodeError
67
import com.solve.domain.problem.error.ProblemError
78
import com.solve.domain.problem.repository.ProblemCodeRepository
89
import com.solve.domain.problem.repository.ProblemRepository
910
import com.solve.domain.problem.service.ProblemCodeService
11+
import com.solve.global.common.enums.ProgrammingLanguage
1012
import com.solve.global.error.CustomException
1113
import com.solve.global.security.holder.SecurityHolder
1214
import org.springframework.data.repository.findByIdOrNull
@@ -20,64 +22,55 @@ class ProblemCodeServiceImpl(
2022
private val securityHolder: SecurityHolder
2123
) : ProblemCodeService {
2224
@Transactional
23-
override fun saveCode(problemId: Long, request: ProblemCodeCreateRequest) {
25+
override fun saveCode(problemId: Long, language: ProgrammingLanguage, request: ProblemCodeCreateRequest) {
2426
val problem =
2527
problemRepository.findByIdOrNull(problemId) ?: throw CustomException(
2628
ProblemError.PROBLEM_NOT_FOUND,
2729
problemId
2830
)
29-
3031
val user = securityHolder.user
32+
val code = problemCodeRepository.findByProblemAndUserAndLanguage(problem, user, language)
3133

32-
val problemCode = problemCodeRepository.findByProblemAndUser(problem, user)
33-
34-
if (problemCode != null) {
35-
problemCode.code = request.code
36-
problemCode.language = request.language
34+
if (code != null) {
35+
code.code = request.code
3736

38-
problemCodeRepository.save(problemCode)
37+
problemCodeRepository.save(code)
3938
} else {
40-
val code = ProblemCode(
39+
problemCodeRepository.save(ProblemCode(
4140
code = request.code,
42-
language = request.language,
41+
language = language,
4342
problem = problem,
4443
user = user
45-
)
46-
47-
problemCodeRepository.save(code)
44+
))
4845
}
4946
}
5047

5148
@Transactional(readOnly = true)
52-
override fun getCode(problemId: Long): ProblemCodeResponse {
49+
override fun getCode(problemId: Long, language: ProgrammingLanguage): ProblemCodeResponse {
5350
val problem =
5451
problemRepository.findByIdOrNull(problemId) ?: throw CustomException(
5552
ProblemError.PROBLEM_NOT_FOUND,
5653
problemId
5754
)
58-
5955
val user = securityHolder.user
60-
6156
val code =
62-
problemCodeRepository.findByProblemAndUser(problem, user)
63-
?: throw CustomException(ProblemError.PROBLEM_NOT_FOUND)
57+
problemCodeRepository.findByProblemAndUserAndLanguage(problem, user, language)
58+
?: throw CustomException(ProblemCodeError.PROBLEM_CODE_NOT_FOUND)
6459

6560
return ProblemCodeResponse.of(code)
6661
}
6762

6863
@Transactional
69-
override fun deleteCode(problemId: Long) {
64+
override fun deleteCode(problemId: Long, language: ProgrammingLanguage) {
7065
val problem =
7166
problemRepository.findByIdOrNull(problemId) ?: throw CustomException(
7267
ProblemError.PROBLEM_NOT_FOUND,
7368
problemId
7469
)
75-
7670
val user = securityHolder.user
77-
7871
val code =
79-
problemCodeRepository.findByProblemAndUser(problem, user)
80-
?: throw CustomException(ProblemError.PROBLEM_NOT_FOUND)
72+
problemCodeRepository.findByProblemAndUserAndLanguage(problem, user, language)
73+
?: throw CustomException(ProblemCodeError.PROBLEM_CODE_NOT_FOUND)
8174

8275
problemCodeRepository.delete(code)
8376
}

src/main/kotlin/com/solve/global/config/swagger/SwaggerConfig.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ class SwaggerConfig {
1818
.addSecurityItem(SecurityRequirement().addList("Authorization"))
1919
.servers(
2020
listOf(
21-
Server().url("http://api.solve.jmino.me").description("Production Server"),
21+
Server().url("http://solveapi.jmino.me").description("Production Server"),
2222
Server().url("http://localhost:8080").description("Development Server"),
2323
)
2424
)

src/main/resources/application.yml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,30 @@ spring:
44
username: ${DATABASE_USERNAME}
55
password: ${DATABASE_PASSWORD}
66
driver-class-name: com.mysql.cj.jdbc.Driver
7+
78
jpa:
89
hibernate:
910
ddl-auto: ${JPA_HIBERNATE_DDL_AUTO}
1011
open-in-view: false
12+
13+
flyway:
14+
baseline-on-migrate: true
15+
enabled: true
16+
locations: classpath:db/migration
17+
1118
jwt:
1219
issuer: ${JWT_ISSUER}
1320
prefix: ${JWT_PREFIX}
1421
header: ${JWT_HEADER}
1522
secret-key: ${JWT_SECRET_KEY}
1623
access-token-expiration: ${JWT_ACCESS_TOKEN_EXPIRATION}
1724
refresh-token-expiration: ${JWT_REFRESH_TOKEN_EXPIRATION}
25+
1826
data:
1927
redis:
2028
host: ${REDIS_HOST}
2129
port: ${REDIS_PORT}
30+
2231
mail:
2332
host: ${MAIL_HOST}
2433
port: ${MAIL_PORT}
@@ -31,22 +40,29 @@ spring:
3140
enable: true
3241
required: true
3342
auth: true
43+
3444
frontend:
3545
url: ${FRONTEND_URL}
46+
3647
admin:
3748
key: ${ADMIN_KEY}
49+
3850
jackson:
3951
time-zone: Asia/Seoul
52+
4053
file:
4154
path: ${FILE_PATH}
55+
4256
servlet:
4357
multipart:
4458
max-file-size: 500MB
4559
max-request-size: 500MB
60+
4661
discord:
4762
webhook:
4863
exception:
4964
url: ${DISCORD_WEBHOOK_EXCEPTION_URL}
65+
5066
management:
5167
endpoints:
5268
enabled-by-default: false
@@ -56,6 +72,7 @@ management:
5672
include: health,info
5773
web:
5874
base-path: /actuator
75+
5976
endpoint:
6077
health:
6178
enabled: true

0 commit comments

Comments
 (0)