Skip to content

Commit

Permalink
Merge pull request #152 from themoment-team/develop
Browse files Browse the repository at this point in the history
v20240425.0 버전 적용
  • Loading branch information
tlsgmltjd committed Apr 25, 2024
2 parents 3f10b53 + c45499f commit 4742e89
Show file tree
Hide file tree
Showing 27 changed files with 314 additions and 52 deletions.
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

0 comments on commit 4742e89

Please sign in to comment.