Skip to content

Commit f405247

Browse files
authored
Merge pull request #349 from ODOICHON/qa
Qa반영 릴리즈
2 parents c692591 + 240a241 commit f405247

File tree

67 files changed

+6403
-5095
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

67 files changed

+6403
-5095
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -40,3 +40,4 @@ out/
4040
src/main/resources/application-secret.yml
4141
src/test/resources/application-test.yml
4242
src/main/resources/logback-spring.xml
43+
*.log

build.gradle.kts

+5
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ dependencies {
5656
// Database
5757
runtimeOnly("com.mysql:mysql-connector-j")
5858
implementation("org.springframework.boot:spring-boot-starter-data-redis")
59+
implementation ("com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.9.0")
5960
// Jwt
6061
implementation("io.jsonwebtoken:jjwt-api:0.11.2")
6162
runtimeOnly("io.jsonwebtoken:jjwt-impl:0.11.2")
@@ -81,6 +82,10 @@ dependencies {
8182
implementation("net.sf.ehcache:ehcache:2.10.6")
8283
implementation("javax.cache:cache-api:1.1.0")
8384
implementation ("com.fasterxml.jackson.core:jackson-databind")
85+
// implementation("com.slack.api:slack-api-client:1.8.1")
86+
if(project.hasProperty("dev") || project.hasProperty("local")) {
87+
implementation("com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.9.0")
88+
}
8489
}
8590

8691
tasks.withType<KotlinCompile> {

src/docs/asciidoc/user.adoc

+52-1
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,30 @@ include::{snippets}/update-user/http-request.adoc[]
169169
===== Response
170170
include::{snippets}/update-user/http-response.adoc[]
171171

172+
*회원탈퇴 시, 사용되는 enum*
173+
174+
|===
175+
|enum 값|Description
176+
177+
|ROW_USE
178+
|이용빈도 낮음
179+
180+
|RE_JOIN
181+
|재가입
182+
183+
|INSUFFICIENT_CONTENT
184+
|콘텐츠 및 정보 부족
185+
186+
|PERSONAL_PROTECTION
187+
|개인 정보 보호
188+
189+
|ETC
190+
|기타
191+
192+
|===
193+
194+
위의 표에 나와 있는 description을 사용자가 선택하게 됩니다. 그 description을 그대로 복붙해서 요청 body에 넣어주시면 됩니다.
195+
172196
=== 13. 유저 탈퇴
173197
===== Request
174198
include::{snippets}/withdrawal/http-request.adoc[]
@@ -202,4 +226,31 @@ include::{snippets}/check-email/http-response.adoc[]
202226
===== Request
203227
include::{snippets}/userName-check/http-request.adoc[]
204228
===== Response
205-
include::{snippets}/userName-check/http-response.adoc[]
229+
include::{snippets}/userName-check/http-response.adoc[]
230+
231+
=== 17. 이메일 수정
232+
233+
이메일 수정 시, 이메일 인증을 거쳐야 합니다.
234+
235+
===== Request
236+
include::{snippets}/update-email/http-request.adoc[]
237+
===== Response
238+
include::{snippets}/update-email/http-response.adoc[]
239+
240+
241+
=== 18. 전화번호 수정
242+
243+
전화번호 수정 시, 전화번호 인증을 거쳐야 합니다.
244+
245+
===== Request
246+
include::{snippets}/update-phone-num/http-request.adoc[]
247+
include::{snippets}/update-phone-num/request-fields.adoc[]
248+
===== Response
249+
include::{snippets}/update-phone-num/http-response.adoc[]
250+
251+
=== 19. 비밀번호 확인
252+
253+
===== Request
254+
include::{snippets}/password-check/http-request.adoc[]
255+
===== Response
256+
include::{snippets}/password-check/http-response.adoc[]

src/main/kotlin/com/example/jhouse_server/admin/user/controller/AdminUserController.kt

+18
Original file line numberDiff line numberDiff line change
@@ -148,4 +148,22 @@ class AdminUserController(
148148

149149
return "user/withdrawalDetail"
150150
}
151+
152+
@GetMapping("/manage")
153+
fun getUserManage(
154+
@ModelAttribute("searchForm") adminUserSearch: AdminUserWithdrawalSearch,
155+
model: Model,
156+
@PageableDefault(size=10, page=0) pageable: Pageable
157+
): String {
158+
// 승인 요청된 게시글 목록 데이터
159+
val result = adminUserService.getUserWithSearchForm(adminUserSearch, pageable)
160+
model.addAttribute("userList", result)
161+
162+
// 페이징 데이터
163+
val pageCom = pageable.pageNumber / 5
164+
model.addAttribute("pageCom", pageCom)
165+
model.addAttribute("filterList", UserSearchFilter.values())
166+
167+
return "user/userManager"
168+
}
151169
}

src/main/kotlin/com/example/jhouse_server/admin/user/dto/AdminUserDto.kt

+46-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
11
package com.example.jhouse_server.admin.user.dto
22

3+
import com.example.jhouse_server.domain.user.entity.Age
4+
import com.example.jhouse_server.domain.user.entity.JoinPath
5+
import com.example.jhouse_server.domain.user.entity.Term
6+
import com.example.jhouse_server.domain.user.entity.UserType
7+
import com.querydsl.core.annotations.QueryProjection
8+
import org.springframework.format.annotation.DateTimeFormat
9+
import java.time.LocalDateTime
10+
311
/**
412
* ============================================================================================
513
* AdminAgentSearch -- 공인중개사 검색 조건
@@ -54,5 +62,42 @@ enum class AgentSearchFilter(val value: String) {
5462
}
5563

5664
enum class UserSearchFilter(val value: String){
57-
NICKNAME("이름")
65+
NICKNAME("닉네임")
66+
}
67+
68+
data class AdminUserList @QueryProjection constructor(
69+
val id: Long,
70+
val nickName: String,
71+
val email: String,
72+
val userType: UserType,
73+
val phoneNum : String,
74+
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
75+
// @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul")
76+
val createdAt : LocalDateTime,
77+
val age: String,
78+
val joinPath: Set<String>,
79+
val term : Set<String>,
80+
){
81+
fun getAgeValues() : String{
82+
return Age.valueOf(age).value ?: ""
83+
}
84+
fun getJoinPathValues(): Set<String> {
85+
return joinPath.map { JoinPath.valueOf(it)?.value }.toSet() as Set<String>
86+
}
87+
88+
fun getTermValues(): Set<String> {
89+
return term.map { Term.valueOf(it)?.value }.toSet() as Set<String>
90+
}
91+
5892
}
93+
data class AdminUserQueryResult(
94+
val id: Long,
95+
val nickName: String,
96+
val email: String,
97+
val userType: UserType,
98+
val phoneNum : String,
99+
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
100+
// @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul")
101+
val createdAt : LocalDateTime,
102+
val age: String,
103+
)

src/main/kotlin/com/example/jhouse_server/admin/user/service/AdminUserService.kt

+11
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,14 @@ package com.example.jhouse_server.admin.user.service
22

33

44
import com.example.jhouse_server.admin.user.dto.AdminJoinAgentList
5+
import com.example.jhouse_server.admin.user.dto.AdminUserList
6+
import com.example.jhouse_server.admin.user.dto.AdminUserWithdrawalSearch
57
import com.example.jhouse_server.admin.user.dto.AdminWithdrawalList
68
import com.example.jhouse_server.domain.user.entity.agent.AgentStatus
79
import com.example.jhouse_server.domain.user.repository.AgentRepository
810
import com.example.jhouse_server.domain.user.repository.UserRepository
11+
import org.springframework.data.domain.Page
12+
import org.springframework.data.domain.Pageable
913
import org.springframework.stereotype.Service
1014
import org.springframework.transaction.annotation.Transactional
1115

@@ -39,4 +43,11 @@ class AdminUserService(
3943
findUsers?.forEach { u -> u.withdrawalUser() }
4044
}
4145

46+
fun getUserWithSearchForm(
47+
adminUserSearch: AdminUserWithdrawalSearch,
48+
pageable: Pageable
49+
): Page<AdminUserList> {
50+
return userRepository.getUserWithSearchForm(adminUserSearch, pageable)
51+
}
52+
4253
}

src/main/kotlin/com/example/jhouse_server/domain/board/controller/BoardController.kt

+2-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.example.jhouse_server.domain.board.controller
33
import com.example.jhouse_server.domain.board.*
44
import com.example.jhouse_server.domain.board.dto.BoardMyPageResDto
55
import com.example.jhouse_server.domain.board.dto.BoardResDto
6+
import com.example.jhouse_server.domain.board.dto.CommentMyPageResDto
67
import com.example.jhouse_server.domain.board.service.BoardService
78
import com.example.jhouse_server.domain.user.entity.User
89
import com.example.jhouse_server.global.annotation.Auth
@@ -147,7 +148,7 @@ class BoardController(
147148
fun getUserCommentAll(
148149
@AuthUser user: User,
149150
@PageableDefault(size=10, page=0) pageable: Pageable
150-
): ApplicationResponse<Page<BoardMyPageResDto>> {
151+
): ApplicationResponse<Page<CommentMyPageResDto>> {
151152
return ApplicationResponse.ok(boardService.getUserCommentAll(user, pageable))
152153
}
153154
/**

src/main/kotlin/com/example/jhouse_server/domain/board/dto/BoardResDto.kt

+13-2
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,14 @@ class BoardResDto() {
6464
}
6565
}
6666

67+
data class CommentMyPageResDto @QueryProjection constructor(
68+
var commentId: Long,
69+
var boardId: Long ,
70+
var title : String,
71+
var commentContent: String
72+
)
73+
74+
6775
class BoardMyPageResDto() {
6876
var boardId: Long = 0
6977
lateinit var title: String
@@ -72,6 +80,7 @@ class BoardMyPageResDto() {
7280
var imageUrl: String? = null
7381
lateinit var category: String
7482
lateinit var prefixCategory: String
83+
var commentCnt: Long = 0
7584

7685
constructor(boardId: Long,
7786
title: String,
@@ -80,6 +89,7 @@ class BoardMyPageResDto() {
8089
imageUrl: String?,
8190
category: String,
8291
prefixCategory: String,
92+
commentCnt: Long
8393
) : this() {
8494
this.boardId = boardId
8595
this.title = title
@@ -88,6 +98,7 @@ class BoardMyPageResDto() {
8898
this.imageUrl = imageUrl
8999
this.category = category
90100
this.prefixCategory = prefixCategory
101+
this.commentCnt = commentCnt
91102
}
92103
}
93104

@@ -99,7 +110,7 @@ class BoardMyPageResDto() {
99110
fun toMyPageListDto(board : Board) : BoardMyPageResDto {
100111
val oneLineContent = sliceContentWithRegex(board.content)
101112
if (board.imageUrls.isEmpty()) {
102-
return BoardMyPageResDto(board.id, board.title, oneLineContent, Timestamp.valueOf(board.createdAt), null, board.category.name, board.prefixCategory.name)
113+
return BoardMyPageResDto(board.id, board.title, oneLineContent, Timestamp.valueOf(board.createdAt), null, board.category.name, board.prefixCategory.name, board.comment.size.toLong())
103114
}
104-
return BoardMyPageResDto(board.id, board.title, oneLineContent, Timestamp.valueOf(board.createdAt), board.imageUrls[0], board.category.name, board.prefixCategory.name)
115+
return BoardMyPageResDto(board.id, board.title, oneLineContent, Timestamp.valueOf(board.createdAt), board.imageUrls[0], board.category.name, board.prefixCategory.name, board.comment.size.toLong())
105116
}

src/main/kotlin/com/example/jhouse_server/domain/board/repository/BoardRepositoryCustom.kt

+2-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import com.example.jhouse_server.domain.board.BoardListDto
55
import com.example.jhouse_server.domain.board.BoardPreviewListDto
66
import com.example.jhouse_server.domain.board.dto.BoardMyPageResDto
77
import com.example.jhouse_server.domain.board.dto.BoardResultDto
8+
import com.example.jhouse_server.domain.board.dto.CommentMyPageResDto
89
import com.example.jhouse_server.domain.board.entity.Board
910
import com.example.jhouse_server.domain.user.entity.User
1011
import org.springframework.data.domain.Page
@@ -16,6 +17,6 @@ interface BoardRepositoryCustom {
1617
fun getBoardAll(boardListDto: BoardListDto, pageable: Pageable): Page<BoardResultDto>
1718
fun getBoardPreviewAll(boardPreviewListDto: BoardPreviewListDto): List<BoardResultDto>
1819
fun getUserBoardAll(user: User, pageable: Pageable): Page<BoardMyPageResDto>
19-
fun getUserCommentAll(user: User, pageable: Pageable): Page<BoardMyPageResDto>
20+
fun getUserCommentAll(user: User, pageable: Pageable): Page<CommentMyPageResDto>
2021
fun getUserLoveAll(user: User, pageable: Pageable): Page<BoardMyPageResDto>
2122
}

src/main/kotlin/com/example/jhouse_server/domain/board/repository/BoardRepositoryImpl.kt

+16-10
Original file line numberDiff line numberDiff line change
@@ -118,12 +118,12 @@ class BoardRepositoryImpl(
118118
searchWithKeyword(boardListDto.search)
119119
)
120120
.groupBy(board.id)
121-
.orderBy(board.fixed.desc(), searchWithOrder(boardListDto.order))
121+
.orderBy(board.fixed.desc(), searchWithOrder(boardListDto.order), board.createdAt.desc())
122122
.limit(pageable.pageSize.toLong())
123123
.offset(pageable.offset)
124124
.fetch()
125125
val countQuery = jpaQueryFactory
126-
.select(board.count())
126+
.select(board)
127127
.from(board)
128128
.join(board.boardCode, boardCode)
129129
.join(board.user, user)
@@ -185,7 +185,7 @@ class BoardRepositoryImpl(
185185
board.user.eq(user),
186186
board.useYn.eq(true),
187187
)
188-
.orderBy(board.fixed.desc())
188+
.orderBy(board.createdAt.desc())
189189
.limit(pageable.pageSize.toLong())
190190
.offset(pageable.offset)
191191
.fetch()
@@ -204,27 +204,33 @@ class BoardRepositoryImpl(
204204
* 자신이 작성한 댓글의 게시글 목록 조회 -- 마이페이지
205205
* =============================================================================================
206206
* */
207-
override fun getUserCommentAll(user: User, pageable: Pageable): Page<BoardMyPageResDto> {
207+
override fun getUserCommentAll(user: User, pageable: Pageable): Page<CommentMyPageResDto> {
208208
val result = jpaQueryFactory
209-
.selectFrom(board).distinct()
210-
.join(board.comment, comment).fetchJoin()
209+
.select(QCommentMyPageResDto(
210+
comment.id.`as`("commentId"),
211+
board.id.`as`("boardId"),
212+
board.title,
213+
comment.content
214+
))
215+
.from(board)
216+
.join(comment).on(comment.board.eq(board))
211217
.where(
212218
comment.user.eq(user),
213219
board.useYn.eq(true),
214220
)
215-
.orderBy(board.fixed.desc())
221+
.orderBy(comment.createdAt.desc())
216222
.limit(pageable.pageSize.toLong())
217223
.offset(pageable.offset)
218224
.fetch()
219225
val countQuery = jpaQueryFactory
220-
.selectFrom(board).distinct()
221-
.join(board.comment, comment)
226+
.selectFrom(board)
227+
.join(comment).on(comment.board.eq(board))
222228
.where(
223229
comment.user.eq(user),
224230
board.useYn.eq(true),
225231
)
226232

227-
return PageableExecutionUtils.getPage(result, pageable) {countQuery.fetch().size.toLong()}.map { toMyPageListDto(it) }
233+
return PageableExecutionUtils.getPage(result, pageable) {countQuery.fetch().size.toLong()}
228234
}
229235

230236
/**

src/main/kotlin/com/example/jhouse_server/domain/board/service/BoardService.kt

+2-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.example.jhouse_server.domain.board.service
33
import com.example.jhouse_server.domain.board.*
44
import com.example.jhouse_server.domain.board.dto.BoardMyPageResDto
55
import com.example.jhouse_server.domain.board.dto.BoardResDto
6+
import com.example.jhouse_server.domain.board.dto.CommentMyPageResDto
67
import com.example.jhouse_server.domain.user.entity.User
78
import org.springframework.data.domain.Page
89
import org.springframework.data.domain.Pageable
@@ -16,6 +17,6 @@ interface BoardService {
1617
fun deleteBoard(boardId: Long, user: User)
1718
fun getCategory(name: String): List<CodeResDto>
1819
fun getUserBoardAll(user: User, pageable: Pageable): Page<BoardMyPageResDto>
19-
fun getUserCommentAll(user: User, pageable: Pageable): Page<BoardMyPageResDto>
20+
fun getUserCommentAll(user: User, pageable: Pageable): Page<CommentMyPageResDto>
2021
fun getUserLoveAll(user: User, pageable: Pageable): Page<BoardMyPageResDto>
2122
}

0 commit comments

Comments
 (0)