Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

v20240425.0 버전 적용 #152

Merged
merged 48 commits into from
Apr 25, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
8e516d1
Update validateEmailDomain teacher doamil
tlsgmltjd Apr 16, 2024
bcf0c7d
Update tracher role board
tlsgmltjd Apr 16, 2024
9419c2e
Add QueryUserIsTeacherUsecase
tlsgmltjd Apr 16, 2024
7039119
Add queryUserIsTeacher impl
tlsgmltjd Apr 16, 2024
c47837a
Add queryUserIsTeacher controller
tlsgmltjd Apr 16, 2024
9f9fc80
refactor blank
tlsgmltjd Apr 16, 2024
c295a2a
Update board list response dto
tlsgmltjd Apr 16, 2024
66d0c43
Update board save response BoardListDto
tlsgmltjd Apr 16, 2024
e43c4fb
Update queryBoardList query repository
tlsgmltjd Apr 16, 2024
88d61e7
Merge pull request #139 from themoment-team/fix/commentUserCascadeDev…
tlsgmltjd Apr 17, 2024
ba23163
Update GSM_TEACHER_EMAIL env
tlsgmltjd Apr 17, 2024
bccb2f5
Update is teacher controller url
tlsgmltjd Apr 17, 2024
943b9e4
Merge pull request #140 from themoment-team/feature/teacherRole
tlsgmltjd Apr 17, 2024
5c9b5ff
Merge pull request #141 from themoment-team/feature/boardListResponse
tlsgmltjd Apr 17, 2024
050128e
Update user defaultImgNumber 0~5
tlsgmltjd Apr 17, 2024
cdfe1df
Add UpdateUserProfileNumberUseCase interface
tlsgmltjd Apr 17, 2024
6d4a7ef
Add updateUserProfileNumber impl
tlsgmltjd Apr 17, 2024
079af36
Add updateProfileNumber controller
tlsgmltjd Apr 17, 2024
b57dc9a
Update updateProfileNumber validation
tlsgmltjd Apr 17, 2024
320f4be
refactor blank line
tlsgmltjd Apr 17, 2024
a8ec126
Update MenteeInfoDto
tlsgmltjd Apr 17, 2024
8980e07
Update MenteeInfoDto defaultImgNumber column
tlsgmltjd Apr 17, 2024
da68e46
Merge pull request #142 from themoment-team/feature/profileDefaultNumber
tlsgmltjd Apr 17, 2024
913ebdb
Update file upload authority temp user
tlsgmltjd Apr 17, 2024
c016989
Update profile url authority temp user
tlsgmltjd Apr 17, 2024
0590d99
Merge pull request #143 from themoment-team/fix/myMenteeDto
tlsgmltjd Apr 17, 2024
4132a1a
Update is-teacher request authority
tlsgmltjd Apr 18, 2024
b552541
Update is-teacher mvcMatchers
tlsgmltjd Apr 18, 2024
29a592a
Update profile-url mvcMatchers
tlsgmltjd Apr 18, 2024
5480d25
Merge pull request #146 from themoment-team/fix/is-teacherAuthority
tlsgmltjd Apr 18, 2024
a19d8be
Merge branch 'develop' into feature/fileUploadRole
tlsgmltjd Apr 18, 2024
5e2ab06
Merge pull request #144 from themoment-team/feature/fileUploadRole
tlsgmltjd Apr 18, 2024
043e16f
Update teacher role name
tlsgmltjd Apr 18, 2024
7fdd604
Merge pull request #147 from themoment-team/fix/teacherRole
tlsgmltjd Apr 18, 2024
f775584
Update MenteeInfoDto profileUrl field
tlsgmltjd Apr 18, 2024
342ea19
Merge pull request #148 from themoment-team/feature/myMenteeProfileUrl
tlsgmltjd Apr 18, 2024
aeb78f2
modify :: if-else state to when-is (#145)
BLoHny Apr 19, 2024
d15473a
광야 토큰 발급시 Authority 추가 (#149)
hajeu Apr 19, 2024
5620fdc
Like 도메인 추가
tlsgmltjd Apr 24, 2024
4786e54
Add SaveLikeUseCase interface
tlsgmltjd Apr 24, 2024
4e4e6f9
Add ToggleLikeUseCaseImpl
tlsgmltjd Apr 24, 2024
844b0ba
Add LikeController
tlsgmltjd Apr 24, 2024
9b0d06f
Update board response dto
tlsgmltjd Apr 24, 2024
f9edbf8
Update like response dto
tlsgmltjd Apr 24, 2024
357d524
Delte blacnk line
tlsgmltjd Apr 24, 2024
5c559c4
Update toggleLike controller body -> param
tlsgmltjd Apr 24, 2024
d3ac32e
Update like entity name
tlsgmltjd Apr 24, 2024
c45499f
Merge pull request #150 from themoment-team/feature/like
tlsgmltjd Apr 24, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@ enum class Authority(
UNAUTHENTICATED("ROLE_UNAUTHENTICATED"),
TEMP_USER("ROLE_TEMP_USER"),
USER("ROLE_USER"),
ADMIN("ROLE_ADMIN")
ADMIN("ROLE_ADMIN"),
TEACHER("ROLE_TEACHER")
;

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package team.themoment.gsmNetworking.domain.board.domain

import team.themoment.gsmNetworking.common.domain.BaseIdTimestampEntity
import team.themoment.gsmNetworking.domain.comment.domain.Comment
import team.themoment.gsmNetworking.domain.like.domain.Like
import team.themoment.gsmNetworking.domain.user.domain.User
import javax.persistence.*
import javax.persistence.FetchType.*
Expand All @@ -24,5 +25,8 @@ class Board (
val author: User,

@OneToMany(mappedBy = "board", fetch = LAZY, cascade = [CascadeType.ALL], orphanRemoval = true)
val comments: MutableList<Comment> = ArrayList()
val comments: MutableList<Comment> = ArrayList(),

@OneToMany(mappedBy = "board", fetch = LAZY, cascade = [CascadeType.ALL], orphanRemoval = true)
val likes: MutableList<Like> = ArrayList()
): BaseIdTimestampEntity();
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,6 @@ data class BoardInfoDto (
val author: AuthorDto,
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss")
val createdAt: LocalDateTime,
val comments: List<CommentListDto>
val comments: List<CommentListDto>,
val likeCount: Int
)
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,16 @@ package team.themoment.gsmNetworking.domain.board.dto

import com.fasterxml.jackson.annotation.JsonFormat
import team.themoment.gsmNetworking.domain.board.domain.BoardCategory
import team.themoment.gsmNetworking.domain.comment.dto.AuthorDto
import java.time.LocalDateTime

data class BoardListDto (
val id: Long,
val title: String,
val boardCategory: BoardCategory,
val authorName: String,
val author: AuthorDto,
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss")
val createdAt: LocalDateTime
val createdAt: LocalDateTime,
val commentCount: Int,
val likeCount: Int
)
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import com.querydsl.jpa.impl.JPAQueryFactory
import team.themoment.gsmNetworking.domain.board.domain.BoardCategory
import team.themoment.gsmNetworking.domain.board.domain.QBoard.board
import team.themoment.gsmNetworking.domain.board.dto.BoardListDto
import team.themoment.gsmNetworking.domain.comment.dto.AuthorDto

class BoardCustomRepositoryImpl (
private val queryFactory: JPAQueryFactory
Expand All @@ -15,11 +16,19 @@ class BoardCustomRepositoryImpl (
return queryFactory.select(
Projections.constructor(
BoardListDto::class.java,
board.id,
board.title,
board.boardCategory,
board.author.name,
board.createdAt
board.id,
board.title,
board.boardCategory,
Projections.constructor(
AuthorDto::class.java,
board.author.name,
board.author.generation,
board.author.profileUrl,
board.author.defaultImgNumber
),
board.createdAt,
board.comments.size(),
board.likes.size()
)
)
.from(board)
Expand All @@ -31,13 +40,21 @@ class BoardCustomRepositoryImpl (

override fun findPageWithRecentBoard(pageSize: Long, boardCategory: BoardCategory?): List<BoardListDto> {
return queryFactory.select(
Projections.constructor(
BoardListDto::class.java,
board.id,
board.title,
board.boardCategory,
board.author.name,
board.createdAt
Projections.constructor(
BoardListDto::class.java,
board.id,
board.title,
board.boardCategory,
Projections.constructor(
AuthorDto::class.java,
board.author.name,
board.author.generation,
board.author.profileUrl,
board.author.defaultImgNumber
),
board.createdAt,
board.comments.size(),
board.likes.size()
)
)
.from(board)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ import org.springframework.http.HttpStatus
import org.springframework.stereotype.Service
import org.springframework.transaction.annotation.Transactional
import team.themoment.gsmNetworking.common.exception.ExpectedException
import team.themoment.gsmNetworking.domain.auth.domain.Authority
import team.themoment.gsmNetworking.domain.auth.repository.AuthenticationRepository
import team.themoment.gsmNetworking.domain.board.domain.BoardCategory
import team.themoment.gsmNetworking.domain.board.domain.Board
import team.themoment.gsmNetworking.domain.board.dto.BoardInfoDto
Expand All @@ -25,7 +27,8 @@ import team.themoment.gsmNetworking.domain.user.repository.UserRepository
class BoardService (
private val boardRepository: BoardRepository,
private val userRepository: UserRepository,
private val commentRepository: CommentRepository
private val commentRepository: CommentRepository,
private val authenticationRepository: AuthenticationRepository
) : SaveBoardUseCase,
QueryBoardListUseCase,
QueryBoardInfoUseCase {
Expand All @@ -35,6 +38,14 @@ class BoardService (
val currentUser = userRepository.findByAuthenticationId(authenticationId)
?: throw ExpectedException("유저를 찾을 수 없습니다.", HttpStatus.NOT_FOUND)

val authentication = authenticationRepository.findById(authenticationId)
.orElseThrow { throw ExpectedException("유저의 권한 정보를 찾을 수 없습니다.", HttpStatus.NOT_FOUND) }

if (boardSaveDto.boardCategory == BoardCategory.TEACHER
&& authentication.authority != Authority.TEACHER) {
throw ExpectedException("선생님이 아닌 유저는 선생님 카테고리를 이용할 수 없습니다.", HttpStatus.NOT_FOUND)
}

val newBoard = Board(
title = boardSaveDto.title,
content = boardSaveDto.content,
Expand All @@ -48,8 +59,15 @@ class BoardService (
id = savedBoard.id,
title = savedBoard.title,
boardCategory = savedBoard.boardCategory,
authorName = savedBoard.author.name,
createdAt = savedBoard.createdAt
author = AuthorDto(
name = savedBoard.author.name,
generation = savedBoard.author.generation,
profileUrl = savedBoard.author.profileUrl,
defaultImgNumber = savedBoard.author.defaultImgNumber
),
createdAt = savedBoard.createdAt,
commentCount = 0,
likeCount = 0
)

}
Expand Down Expand Up @@ -80,7 +98,8 @@ class BoardService (
defaultImgNumber = currentBoard.author.defaultImgNumber
),
createdAt = currentBoard.createdAt,
comments = getFindComments(findComments)
comments = getFindComments(findComments),
likeCount = currentBoard.likes.size
)
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package team.themoment.gsmNetworking.domain.like.controller

import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.*
import team.themoment.gsmNetworking.common.manager.AuthenticatedUserManager
import team.themoment.gsmNetworking.domain.like.dto.LikeStatusDto
import team.themoment.gsmNetworking.domain.like.service.ToggleLikeUseCase
import javax.validation.Valid

@RestController
@RequestMapping("/api/v1/like")
class LikeController (
private val toggleLikeUseCase: ToggleLikeUseCase,
private val authenticatedUserManager: AuthenticatedUserManager
) {
@PostMapping("/{boardId}")
fun toggleLike(@PathVariable boardId: Long): ResponseEntity<LikeStatusDto> {
val authenticationId = authenticatedUserManager.getName()
return ResponseEntity.ok(toggleLikeUseCase.likeToggle(boardId, authenticationId))
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package team.themoment.gsmNetworking.domain.like.domain

import team.themoment.gsmNetworking.common.domain.BaseIdTimestampEntity
import team.themoment.gsmNetworking.domain.board.domain.Board
import team.themoment.gsmNetworking.domain.user.domain.User
import javax.persistence.*


@Entity
@Table(name = "board_like")
class Like (
@ManyToOne
@JoinColumn(name = "user_id")
val user: User,

@ManyToOne
@JoinColumn(name = "feed_id")
val board: Board,
): BaseIdTimestampEntity()
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package team.themoment.gsmNetworking.domain.like.dto

data class LikeStatusDto (
val currentStatus: Boolean
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package team.themoment.gsmNetworking.domain.like.repository

import org.springframework.data.jpa.repository.JpaRepository
import team.themoment.gsmNetworking.domain.board.domain.Board
import team.themoment.gsmNetworking.domain.like.domain.Like
import team.themoment.gsmNetworking.domain.user.domain.User

interface LikeRepository : JpaRepository<Like, Long> {
fun findByUserAndBoard(user: User, board: Board): Like?
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package team.themoment.gsmNetworking.domain.like.service

import team.themoment.gsmNetworking.domain.like.dto.LikeStatusDto

interface ToggleLikeUseCase {
fun likeToggle(boardId: Long, authenticationId: Long): LikeStatusDto
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package team.themoment.gsmNetworking.domain.like.service.impl

import org.springframework.http.HttpStatus
import org.springframework.stereotype.Service
import org.springframework.transaction.annotation.Transactional
import team.themoment.gsmNetworking.common.exception.ExpectedException
import team.themoment.gsmNetworking.domain.board.repository.BoardRepository
import team.themoment.gsmNetworking.domain.like.domain.Like
import team.themoment.gsmNetworking.domain.like.dto.LikeStatusDto
import team.themoment.gsmNetworking.domain.like.repository.LikeRepository
import team.themoment.gsmNetworking.domain.like.service.ToggleLikeUseCase
import team.themoment.gsmNetworking.domain.user.repository.UserRepository

@Service
class ToggleLikeUseCaseImpl (
private val likeRepository: LikeRepository,
private val boardRepository: BoardRepository,
private val userRepository: UserRepository
) : ToggleLikeUseCase {

@Transactional
override fun likeToggle(boardId: Long, authenticationId: Long): LikeStatusDto {
val currentUser = userRepository.findByAuthenticationId(authenticationId)
?: throw ExpectedException("유저를 찾을 수 없습니다.", HttpStatus.NOT_FOUND)

val board = boardRepository.findById(boardId)
.orElseThrow { ExpectedException("게시글을 찾을 수 없습니다.", HttpStatus.NOT_FOUND) }

val like = likeRepository.findByUserAndBoard(
user = currentUser,
board = board
)

if (like != null) {
likeRepository.delete(like)
return LikeStatusDto(currentStatus = false)
} else {
likeRepository.save(Like(user = currentUser, board = board))
return LikeStatusDto(currentStatus = true)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,9 @@ data class MenteeInfoDto (

val phoneNumber: String,

val generation: Int
val generation: Int,

val defaultImgNumber: Int,

val profileUrl: String?
)
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,9 @@ class MenteeService(
name = userInfoDto.name,
email = userInfoDto.email,
phoneNumber = userInfoDto.phoneNumber,
generation = userInfoDto.generation
generation = userInfoDto.generation,
defaultImgNumber = userInfoDto.defaultImgNumber,
profileUrl = userInfoDto.profileUrl
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,26 +3,26 @@ package team.themoment.gsmNetworking.domain.user.controller
import org.springframework.http.HttpStatus
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.PatchMapping
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RequestParam
import org.springframework.web.bind.annotation.RestController
import team.themoment.gsmNetworking.common.manager.AuthenticatedUserManager
import team.themoment.gsmNetworking.domain.user.dto.ProfileUrlRegistrationDto
import team.themoment.gsmNetworking.domain.user.dto.UserIdDto
import team.themoment.gsmNetworking.domain.user.dto.UserSimpleInfoDto
import team.themoment.gsmNetworking.domain.user.service.GenerateProfileUrlUseCase
import team.themoment.gsmNetworking.domain.user.service.QueryEmailByUserIdUseCase
import team.themoment.gsmNetworking.domain.user.service.QueryUserInfoByUserIdUseCase
import team.themoment.gsmNetworking.domain.user.dto.*
import team.themoment.gsmNetworking.domain.user.service.*
import javax.validation.Valid

@RestController
@RequestMapping("/api/v1/user")
class UserController(
private val authenticatedUserManager: AuthenticatedUserManager,
private val generateProfileUrlUseCase: GenerateProfileUrlUseCase,
private val queryUserInfoByUserIdUseCase: QueryUserInfoByUserIdUseCase,
private val queryEmailByUserIdUseCase: QueryEmailByUserIdUseCase
private val queryEmailByUserIdUseCase: QueryEmailByUserIdUseCase,
private val queryUserIsTeacherUsecase: QueryUserIsTeacherUsecase,
private val updateUserProfileNumberUseCase: UpdateUserProfileNumberUseCase
) {

@PostMapping("/profile-url")
Expand All @@ -42,4 +42,17 @@ class UserController(
return ResponseEntity.ok(queryEmailByUserIdUseCase.queryEmailByUserId(email))
}

@GetMapping("/is-teacher")
fun queryIsTeacher(): ResponseEntity<UserIsTeacherDto> {
val authenticationId = authenticatedUserManager.getName()
return ResponseEntity.ok(queryUserIsTeacherUsecase.queryUserIsTeacher(authenticationId))
}

@PatchMapping("/profile-number")
fun updateProfileNumber(@RequestBody @Valid userProfileNumberDto: UserProfileNumberDto): ResponseEntity<Void> {
val authenticationId = authenticatedUserManager.getName()
updateUserProfileNumberUseCase.updateUserProfileNumber(userProfileNumberDto, authenticationId)
return ResponseEntity.ok().build()
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package team.themoment.gsmNetworking.domain.user.domain
import team.themoment.gsmNetworking.common.domain.BaseIdTimestampEntity
import team.themoment.gsmNetworking.domain.board.domain.Board
import team.themoment.gsmNetworking.domain.comment.domain.Comment
import team.themoment.gsmNetworking.domain.like.domain.Like
import team.themoment.gsmNetworking.domain.mentor.domain.Mentor
import team.themoment.gsmNetworking.domain.user.converter.EncryptConverter
import javax.persistence.*
Expand Down Expand Up @@ -45,7 +46,10 @@ class User(
val boards: MutableList<Board> = ArrayList(),

@OneToMany(mappedBy = "author", cascade = [CascadeType.ALL], orphanRemoval = true)
val comments: MutableList<Comment> = ArrayList()
val comments: MutableList<Comment> = ArrayList(),

@OneToMany(mappedBy = "user", cascade = [CascadeType.ALL], orphanRemoval = true)
val likes: MutableList<Like> = ArrayList()

) : BaseIdTimestampEntity() {

Expand All @@ -55,7 +59,12 @@ class User(

companion object {
private fun generateRandomNumber(): Int {
return Random.nextInt(0, 5)
return Random.nextInt(0, 6)
}
}

fun updateProfileNumber(defaultImgNumber: Int) {
this.defaultImgNumber = defaultImgNumber
}

}
Loading
Loading