Skip to content

Commit a1f37bf

Browse files
authored
Merge pull request #38 from Nexters/change/proposal-api
Change/proposal api
2 parents 4993764 + c6853db commit a1f37bf

33 files changed

+795
-647
lines changed

docker/init.sql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ CREATE TABLE IF NOT EXISTS gathering_member
4747
CREATE TABLE IF NOT EXISTS proposal
4848
(
4949
id BIGINT AUTO_INCREMENT PRIMARY KEY,
50-
gathering_id BIGINT NOT NULL,
50+
gathering_id BIGINT,
5151
member_id BIGINT NOT NULL,
5252
purpose VARCHAR(255) NOT NULL,
5353
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,

tuk-api/src/main/kotlin/nexters/tuk/application/auth/dto/response/AuthResponse.kt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,14 @@
11
package nexters.tuk.application.auth.dto.response
22

3-
import io.swagger.v3.oas.annotations.media.Schema
43

54
class AuthResponse {
6-
@Schema(name = "LoginResponse")
75
data class Login(
86
val memberId: Long,
97
val accessToken: String,
108
val refreshToken: String,
119
val isFirstLogin: Boolean,
1210
)
1311

14-
@Schema(name = "RefreshResponse")
1512
data class Refresh(
1613
val accessToken: String,
1714
val refreshToken: String,
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package nexters.tuk.application.gathering
2+
3+
import nexters.tuk.application.gathering.dto.request.GatheringProposalCommand
4+
import nexters.tuk.application.proposal.ProposalMemberService
5+
import nexters.tuk.application.proposal.ProposalService
6+
import nexters.tuk.application.push.PushService
7+
import nexters.tuk.application.push.dto.request.PushCommand
8+
import nexters.tuk.contract.push.PushType
9+
import org.springframework.stereotype.Service
10+
import org.springframework.transaction.annotation.Transactional
11+
12+
@Service
13+
class GatheringProposalService(
14+
private val proposalService: ProposalService,
15+
private val gatheringMemberService: GatheringMemberService,
16+
private val proposalMemberService: ProposalMemberService,
17+
private val pushService: PushService,
18+
) {
19+
@Transactional
20+
fun addProposal(command: GatheringProposalCommand.AddProposal) {
21+
gatheringMemberService.verifyGatheringAccess(
22+
memberId = command.memberId,
23+
gatheringId = command.gatheringId
24+
)
25+
proposalService.addGathering(
26+
proposalId = command.proposalId,
27+
gatheringId = command.gatheringId
28+
)
29+
30+
val gatheringMembers = gatheringMemberService.getGatheringMemberIds(command.gatheringId)
31+
32+
proposalMemberService.publishGatheringMembers(
33+
proposalId = command.proposalId,
34+
memberIds = gatheringMembers
35+
)
36+
37+
pushService.sendPush(
38+
PushCommand.Push.Proposal(
39+
pushType = PushType.PROPOSAL,
40+
gatheringId = command.gatheringId
41+
)
42+
)
43+
}
44+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package nexters.tuk.application.gathering.dto.request
2+
3+
4+
class GatheringProposalCommand {
5+
data class AddProposal(
6+
val memberId: Long,
7+
val gatheringId: Long,
8+
val proposalId: Long,
9+
)
10+
}

tuk-api/src/main/kotlin/nexters/tuk/application/gathering/dto/response/GatheringMemberResponse.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
package nexters.tuk.application.gathering.dto.response
22

3-
import io.swagger.v3.oas.annotations.media.Schema
43
import java.time.LocalDateTime
54

65
class GatheringMemberResponse {
7-
@Schema(name = "JoinGatheringResponse")
86
data class JoinGathering(
97
val id: Long,
108
)

tuk-api/src/main/kotlin/nexters/tuk/application/gathering/dto/response/GatheringResponse.kt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import io.swagger.v3.oas.annotations.media.Schema
44
import nexters.tuk.application.gathering.vo.RelativeTime
55

66
class GatheringResponse {
7-
@Schema(name = "GenerateResponse")
87
data class Generate(
98
@Schema(description = "생성된 모임 id")
109
val gatheringId: Long,
@@ -16,7 +15,6 @@ class GatheringResponse {
1615
val intervalDays: Long,
1716
)
1817

19-
@Schema(name = "GatheringOverviewsResponse")
2018
data class GatheringOverviews(
2119
@Schema(description = "총 데이터 수")
2220
val totalCount: Int,
@@ -33,7 +31,6 @@ class GatheringResponse {
3331
)
3432
}
3533

36-
@Schema(name = "GatheringDetailResponse")
3734
data class GatheringDetail(
3835
@Schema(description = "모임 id")
3936
val gatheringId: Long,

tuk-api/src/main/kotlin/nexters/tuk/application/member/dto/response/MemberResponse.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ class MemberResponse {
1919
val memberName: String,
2020
)
2121

22-
@Schema(name = "OnboardingResponse")
2322
data class Onboarding(
2423
val memberId: Long,
2524
val name: String

tuk-api/src/main/kotlin/nexters/tuk/application/onboarding/dto/response/OnboardingResponse.kt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,12 @@
11
package nexters.tuk.application.onboarding.dto.response
22

3-
import io.swagger.v3.oas.annotations.media.Schema
43
import nexters.tuk.application.onboarding.OnboardingField
54

65
class OnboardingResponse {
7-
@Schema(name = "OnboardingInitResponse")
86
data class Init(
97
val memberId: Long
108
)
119

12-
@Schema(name = "OnboardingRequiredFields")
1310
data class RequiredFields(
1411
val fields: List<OnboardingField>
1512
)
Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,18 @@
11
package nexters.tuk.application.proposal
22

3-
import nexters.tuk.application.gathering.GatheringMemberService
43
import nexters.tuk.application.proposal.dto.request.ProposalCommand
54
import nexters.tuk.application.proposal.dto.response.ProposalResponse
6-
import nexters.tuk.application.push.PushService
7-
import nexters.tuk.application.push.dto.request.PushCommand
8-
import nexters.tuk.contract.push.PushType
95
import org.springframework.stereotype.Service
106
import org.springframework.transaction.annotation.Transactional
117

128
@Service
139
class ProposalCreateService(
1410
private val proposalService: ProposalService,
15-
private val proposalMemberService: ProposalMemberService,
16-
private val gatheringMemberService: GatheringMemberService,
17-
private val pushService: PushService,
1811
) {
1912
@Transactional
2013
fun propose(command: ProposalCommand.Propose): ProposalResponse.Propose {
21-
gatheringMemberService.verifyGatheringAccess(
22-
memberId = command.memberId,
23-
gatheringId = command.gatheringId
24-
)
2514
val proposal = proposalService.propose(command)
26-
val gatheringMembers = gatheringMemberService.getGatheringMemberIds(command.gatheringId)
2715

28-
proposalMemberService.publishGatheringMembers(
29-
proposalId = proposal.proposalId,
30-
memberIds = gatheringMembers
31-
)
32-
33-
pushService.sendPush(
34-
PushCommand.Push.Proposal(
35-
pushType = PushType.PROPOSAL,
36-
gatheringId = command.gatheringId
37-
)
38-
)
3916
return ProposalResponse.Propose(proposalId = proposal.proposalId)
4017
}
4118
}

tuk-api/src/main/kotlin/nexters/tuk/application/proposal/ProposalQueryService.kt

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import nexters.tuk.application.proposal.dto.request.ProposalQuery
55
import nexters.tuk.application.proposal.dto.response.ProposalResponse
66
import nexters.tuk.contract.BaseException
77
import nexters.tuk.contract.ErrorType
8+
import nexters.tuk.contract.SliceDto.SliceRequest
89
import nexters.tuk.contract.SliceDto.SliceResponse
910
import nexters.tuk.domain.proposal.ProposalQueryRepository
1011
import org.springframework.stereotype.Service
@@ -21,9 +22,15 @@ class ProposalQueryService(
2122
) {
2223
@Transactional(readOnly = true)
2324
fun getMemberProposals(query: ProposalQuery.MemberProposals): SliceResponse<ProposalResponse.ProposalOverview> {
25+
// 1-based pageNumber를 0-based로 변환
26+
val repositoryPage = SliceRequest(
27+
pageNumber = query.page.pageNumber - 1,
28+
pageSize = query.page.pageSize
29+
)
30+
2431
val memberProposals = proposalQueryRepository.findMemberProposals(
2532
memberId = query.memberId,
26-
page = query.page
33+
page = repositoryPage
2734
)
2835

2936
val proposalOverviews = memberProposals.map {
@@ -40,11 +47,17 @@ class ProposalQueryService(
4047

4148
@Transactional(readOnly = true)
4249
fun getGatheringProposals(query: ProposalQuery.GatheringProposals): SliceResponse<ProposalResponse.ProposalOverview> {
50+
// 1-based pageNumber를 0-based로 변환
51+
val repositoryPage = SliceRequest(
52+
pageNumber = query.page.pageNumber - 1,
53+
pageSize = query.page.pageSize
54+
)
55+
4356
val gatheringProposals = proposalQueryRepository.findGatheringProposals(
4457
query.memberId,
4558
query.gatheringId,
4659
query.type,
47-
query.page
60+
repositoryPage
4861
)
4962

5063
val proposalOverviews = gatheringProposals.map {

0 commit comments

Comments
 (0)