Skip to content

Commit debf5b1

Browse files
committed
feat: leave guild api를 추가한다
1 parent 673caa8 commit debf5b1

File tree

4 files changed

+50
-0
lines changed

4 files changed

+50
-0
lines changed
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package org.gitanimals.guild.app
2+
3+
import org.gitanimals.guild.domain.GuildService
4+
import org.springframework.stereotype.Component
5+
6+
@Component
7+
class LeaveGuildFacade(
8+
private val identityApi: IdentityApi,
9+
private val guildService: GuildService,
10+
) {
11+
12+
fun leave(token: String, guildId: Long) {
13+
val user = identityApi.getUserByToken(token)
14+
15+
guildService.leave(guildId, user.id.toLong())
16+
}
17+
}

src/main/kotlin/org/gitanimals/guild/controller/GuildController.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ class GuildController(
2626
private val joinedGuildFacade: GetJoinedGuildFacade,
2727
private val searchGuildFacade: SearchGuildFacade,
2828
private val changeMainPersonaFacade: ChangeMainPersonaFacade,
29+
private val leaveGuildFacade: LeaveGuildFacade,
2930
) {
3031

3132
@ResponseStatus(HttpStatus.OK)
@@ -128,4 +129,10 @@ class GuildController(
128129
guildId = guildId,
129130
personaId = personaId,
130131
)
132+
133+
@DeleteMapping("/guilds/{guildId}/leave")
134+
fun leaveGuild(
135+
@RequestHeader(HttpHeaders.AUTHORIZATION) token: String,
136+
@PathVariable("guildId") guildId: Long,
137+
) = leaveGuildFacade.leave(token, guildId)
131138
}

src/main/kotlin/org/gitanimals/guild/domain/Guild.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,14 @@ class Guild(
202202
}
203203
}
204204

205+
fun leave(userId: Long) {
206+
require(userId != leader.userId) {
207+
"Leader cannot leave guild guildId: \"$id\", userId: \"$userId\""
208+
}
209+
210+
members.removeIf { it.userId == userId }
211+
}
212+
205213
companion object {
206214

207215
fun create(

src/main/kotlin/org/gitanimals/guild/domain/GuildService.kt

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import org.hibernate.Hibernate
66
import org.springframework.data.domain.Page
77
import org.springframework.data.domain.Pageable
88
import org.springframework.data.repository.findByIdOrNull
9+
import org.springframework.orm.ObjectOptimisticLockingFailureException
10+
import org.springframework.retry.annotation.Retryable
911
import org.springframework.stereotype.Service
1012
import org.springframework.transaction.annotation.Transactional
1113

@@ -43,6 +45,7 @@ class GuildService(
4345
}
4446

4547
@Transactional
48+
@Retryable(ObjectOptimisticLockingFailureException::class)
4649
fun joinGuild(
4750
guildId: Long,
4851
memberUserId: Long,
@@ -63,6 +66,7 @@ class GuildService(
6366
}
6467

6568
@Transactional
69+
@Retryable(ObjectOptimisticLockingFailureException::class)
6670
fun acceptJoin(acceptorId: Long, guildId: Long, acceptUserId: Long) {
6771
val guild = guildRepository.findGuildByIdAndLeaderId(guildId, acceptorId)
6872
?: throw IllegalArgumentException("Cannot accept join cause your not a leader.")
@@ -71,6 +75,7 @@ class GuildService(
7175
}
7276

7377
@Transactional
78+
@Retryable(ObjectOptimisticLockingFailureException::class)
7479
fun denyJoin(denierId: Long, guildId: Long, denyUserId: Long) {
7580
val guild = guildRepository.findGuildByIdAndLeaderId(guildId, denierId)
7681
?: throw IllegalArgumentException("Cannot deny join cause your not a leader.")
@@ -79,6 +84,7 @@ class GuildService(
7984
}
8085

8186
@Transactional
87+
@Retryable(ObjectOptimisticLockingFailureException::class)
8288
fun kickMember(kickerId: Long, guildId: Long, kickUserId: Long) {
8389
val guild = guildRepository.findGuildByIdAndLeaderId(guildId, kickerId)
8490
?: throw IllegalArgumentException("Cannot kick member cause your not a leader.")
@@ -87,6 +93,7 @@ class GuildService(
8793
}
8894

8995
@Transactional
96+
@Retryable(ObjectOptimisticLockingFailureException::class)
9097
fun changeGuild(changeRequesterId: Long, guildId: Long, request: ChangeGuildRequest) {
9198
val guild = guildRepository.findGuildByIdAndLeaderId(guildId, changeRequesterId)
9299
?: throw IllegalArgumentException("Cannot kick member cause your not a leader.")
@@ -95,12 +102,21 @@ class GuildService(
95102
}
96103

97104
@Transactional
105+
@Retryable(ObjectOptimisticLockingFailureException::class)
98106
fun changeMainPersona(guildId: Long, userId: Long, personaId: Long, personaType: String) {
99107
val guild = getGuildById(guildId)
100108

101109
guild.changeMainPersona(userId, personaId, personaType)
102110
}
103111

112+
@Transactional
113+
@Retryable(ObjectOptimisticLockingFailureException::class)
114+
fun leave(guildId: Long, userId: Long) {
115+
val guild = getGuildById(guildId)
116+
117+
guild.leave(userId)
118+
}
119+
104120
fun getGuildById(id: Long, vararg lazyLoading: (Guild) -> Unit): Guild {
105121
val guild = guildRepository.findByIdOrNull(id)
106122
?: throw IllegalArgumentException("Cannot fint guild by id \"$id\"")
@@ -110,6 +126,7 @@ class GuildService(
110126
}
111127

112128
@Transactional
129+
@Retryable(ObjectOptimisticLockingFailureException::class)
113130
fun updateContribution(username: String, contributions: Long) {
114131
val guilds = guildRepository.findAllGuildByUsernameWithMembers(username)
115132

@@ -138,6 +155,7 @@ class GuildService(
138155
}
139156

140157
@Transactional
158+
@Retryable(ObjectOptimisticLockingFailureException::class)
141159
fun deletePersonaSync(
142160
userId: Long,
143161
deletedPersonaId: Long,

0 commit comments

Comments
 (0)