Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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 @@ -45,7 +45,7 @@ class ApplicationController(
return createApplication.execute(authDetails, request)
}

@Operation(summary = "(유저) 지원서 수정", description = "지원서를 수정합니다.")
@Operation(summary = "(유저) 지원서 수정 (미사용)", description = "지원서를 수정합니다. (미사용)")
@ApiResponses(
ApiResponse(responseCode = "200"),
ApiResponse(responseCode = "400", content = [Content(schema = Schema(implementation = ErrorResponse::class))]),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ package land.leets.domain.application.type

enum class Position(val statusKo: String) {
DEV("개발"),
FRONTEND("프론트엔드"),
BACKEND("백엔드"),
DESIGN("디자인"),
BX_BI("BX/BI"),
UX_UI("UX/UI"),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import land.leets.domain.application.exception.ApplicationAlreadyExistsException
import land.leets.domain.application.presentation.dto.ApplicationRequest
import land.leets.domain.application.type.SubmitStatus
import land.leets.domain.auth.AuthDetails
import land.leets.domain.temporaryApplication.domain.repository.TemporaryApplicationRepository
import land.leets.domain.user.domain.User
import land.leets.domain.user.domain.repository.UserRepository
import land.leets.domain.user.exception.UserNotFoundException
Expand All @@ -15,7 +16,8 @@ import java.time.LocalDateTime
@Service
class CreateApplicationImpl(
private val applicationRepository: ApplicationRepository,
private val userRepository: UserRepository
private val userRepository: UserRepository,
private val temporaryApplicationRepository: TemporaryApplicationRepository
) : CreateApplication {

override fun execute(authDetails: AuthDetails, request: ApplicationRequest): Application {
Expand Down Expand Up @@ -48,6 +50,12 @@ class CreateApplicationImpl(
submitStatus = request.submitStatus,
appliedAt = if (request.submitStatus == SubmitStatus.SUBMIT) LocalDateTime.now() else null
)
return applicationRepository.save(application)
val savedApplication = applicationRepository.save(application)

temporaryApplicationRepository.findByUser_Id(user.id)?.let {
temporaryApplicationRepository.delete(it)
}

return savedApplication
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import land.leets.domain.application.domain.Application
import land.leets.domain.application.presentation.dto.ApplicationRequest
import land.leets.domain.auth.AuthDetails

@Deprecated("임시 저장 테이블 분리에 따른 미사용")
interface UpdateApplication {
fun execute(authDetails: AuthDetails, request: ApplicationRequest): Application
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import org.springframework.transaction.annotation.Transactional
import java.time.LocalDateTime

@Service
@Deprecated("임시 저장 테이블 분리에 따른 미사용")
class UpdateApplicationImpl(
private val applicationRepository: ApplicationRepository,
private val updateUser: UpdateUser
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
package land.leets.domain.temporaryApplication.domain

import jakarta.persistence.*
import land.leets.domain.application.type.Position
import land.leets.domain.shared.BaseTimeEntity
import land.leets.domain.temporaryApplication.presentation.dto.TemporaryApplicationRequest
import land.leets.domain.user.domain.User

@Entity(name = "temporary_applications")
class TemporaryApplication(

@OneToOne
@JoinColumn(name = "user_id")
var user: User,

@Column
var name: String? = null,

@Column
var phone: String? = null,

@Column
var major: String? = null,

@Column
var grade: String? = null,

@Column
var project: String? = null,

@Column
var algorithm: String? = null,

@Column
var portfolio: String? = null,

@Column(columnDefinition = "char(10)")
@Enumerated(EnumType.STRING)
var position: Position,

@Column
var career: String? = null,

@Column
var interviewDay: String? = null,

@Column
var interviewTime: String? = null,

@Column(columnDefinition = "text(600)")
var motive: String? = null,

@Column(columnDefinition = "text(600)")
var expectation: String? = null,

@Column(columnDefinition = "text(600)")
var capability: String? = null,

@Column(columnDefinition = "text(600)")
var conflict: String? = null,

@Column(columnDefinition = "text(600)")
var passion: String? = null,

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
val id: Long? = null
) : BaseTimeEntity() {

fun updateContent(request: TemporaryApplicationRequest) {
name = request.name
phone = request.phone
major = request.major
grade = request.grade
project = request.project
algorithm = request.algorithm
portfolio = request.portfolio
position = request.position
career = request.career
interviewDay = request.interviewDay
interviewTime = request.interviewTime
motive = request.motive
expectation = request.expectation
capability = request.capability
conflict = request.conflict
passion = request.passion
}

companion object {
fun of(user: User, request: TemporaryApplicationRequest): TemporaryApplication {
return TemporaryApplication(
user = user,
name = request.name,
phone = request.phone,
major = request.major,
grade = request.grade,
project = request.project,
algorithm = request.algorithm,
portfolio = request.portfolio,
position = request.position,
career = request.career,
interviewDay = request.interviewDay,
interviewTime = request.interviewTime,
motive = request.motive,
expectation = request.expectation,
capability = request.capability,
conflict = request.conflict,
passion = request.passion
)
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package land.leets.domain.temporaryApplication.domain.repository

import land.leets.domain.temporaryApplication.domain.TemporaryApplication
import org.springframework.data.jpa.repository.JpaRepository
import java.util.*

interface TemporaryApplicationRepository : JpaRepository<TemporaryApplication, Long> {
fun findByUser_Id(id: UUID): TemporaryApplication?
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package land.leets.domain.temporaryApplication.presentation

import io.swagger.v3.oas.annotations.Operation
import io.swagger.v3.oas.annotations.media.Content
import io.swagger.v3.oas.annotations.media.Schema
import io.swagger.v3.oas.annotations.responses.ApiResponse
import io.swagger.v3.oas.annotations.responses.ApiResponses
import land.leets.domain.auth.AuthDetails
import land.leets.domain.temporaryApplication.presentation.dto.TemporaryApplicationRequest
import land.leets.domain.temporaryApplication.presentation.dto.TemporaryApplicationResponse
import land.leets.domain.temporaryApplication.usecase.GetTemporaryApplication
import land.leets.domain.temporaryApplication.usecase.SaveTemporaryApplication
import land.leets.global.error.ErrorResponse
import org.springframework.security.core.annotation.AuthenticationPrincipal
import org.springframework.web.bind.annotation.*

@RestController
@RequestMapping("/temporary-application")
class TemporaryApplicationController(
private val getTemporaryApplication: GetTemporaryApplication,
private val saveTemporaryApplication: SaveTemporaryApplication
) {

@Operation(summary = "(유저) 임시저장 지원서 조회", description = "임시 저장한 지원서를 호출합니다.")
@ApiResponses(
ApiResponse(responseCode = "200"),
ApiResponse(responseCode = "400", content = [Content(schema = Schema(implementation = ErrorResponse::class))]),
ApiResponse(responseCode = "403", content = [Content(schema = Schema(implementation = ErrorResponse::class))]),
ApiResponse(responseCode = "404", content = [Content(schema = Schema(implementation = ErrorResponse::class))]),
ApiResponse(responseCode = "500", content = [Content(schema = Schema(implementation = ErrorResponse::class))])
)
@GetMapping
fun get(
@AuthenticationPrincipal authDetails: AuthDetails
): TemporaryApplicationResponse? =
getTemporaryApplication.execute(authDetails)

@Operation(summary = "(유저) 지원서 임시 저장", description = "지원서를 작성합니다.")
@ApiResponses(
ApiResponse(responseCode = "200"),
ApiResponse(responseCode = "400", content = [Content(schema = Schema(implementation = ErrorResponse::class))]),
ApiResponse(responseCode = "403", content = [Content(schema = Schema(implementation = ErrorResponse::class))]),
ApiResponse(responseCode = "404", content = [Content(schema = Schema(implementation = ErrorResponse::class))]),
ApiResponse(responseCode = "500", content = [Content(schema = Schema(implementation = ErrorResponse::class))])
)
@PutMapping
fun save(
@AuthenticationPrincipal authDetails: AuthDetails,
@RequestBody request: TemporaryApplicationRequest
): TemporaryApplicationResponse =
saveTemporaryApplication.execute(authDetails, request)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package land.leets.domain.temporaryApplication.presentation.dto

import land.leets.domain.application.type.Position

data class TemporaryApplicationRequest(
val name: String?,
val sid: String?,
val phone: String?,
val major: String?,
val grade: String?,
val project: String?,
val algorithm: String?,
val portfolio: String?,
val position: Position,
val career: String?,
val interviewDay: String?,
val interviewTime: String?,
val motive: String?,
val expectation: String?,
val capability: String?,
val conflict: String?,
val passion: String?
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package land.leets.domain.temporaryApplication.presentation.dto

import land.leets.domain.application.type.Position
import land.leets.domain.temporaryApplication.domain.TemporaryApplication

data class TemporaryApplicationResponse(
val name: String?,
val phone: String?,
val major: String?,
val grade: String?,
val project: String?,
val algorithm: String?,
val portfolio: String?,
val position: Position,
val career: String?,
val interviewDay: String?,
val interviewTime: String?,
val motive: String?,
val expectation: String?,
val capability: String?,
val conflict: String?,
val passion: String?
) {
companion object {
fun from(temporaryApplication: TemporaryApplication): TemporaryApplicationResponse {
return TemporaryApplicationResponse(
name = temporaryApplication.name,
phone = temporaryApplication.phone,
major = temporaryApplication.major,
grade = temporaryApplication.grade,
project = temporaryApplication.project,
algorithm = temporaryApplication.algorithm,
portfolio = temporaryApplication.portfolio,
position = temporaryApplication.position,
career = temporaryApplication.career,
interviewDay = temporaryApplication.interviewDay,
interviewTime = temporaryApplication.interviewTime,
motive = temporaryApplication.motive,
expectation = temporaryApplication.expectation,
capability = temporaryApplication.capability,
conflict = temporaryApplication.conflict,
passion = temporaryApplication.passion
)
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package land.leets.domain.temporaryApplication.usecase

import land.leets.domain.auth.AuthDetails
import land.leets.domain.temporaryApplication.presentation.dto.TemporaryApplicationResponse

interface GetTemporaryApplication {
fun execute(authDetails: AuthDetails): TemporaryApplicationResponse?
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package land.leets.domain.temporaryApplication.usecase

import land.leets.domain.auth.AuthDetails
import land.leets.domain.temporaryApplication.domain.repository.TemporaryApplicationRepository
import land.leets.domain.temporaryApplication.presentation.dto.TemporaryApplicationResponse
import org.springframework.stereotype.Service

@Service
class GetTemporaryApplicationImpl(
private val temporaryApplicationRepository: TemporaryApplicationRepository
) : GetTemporaryApplication {

override fun execute(authDetails: AuthDetails): TemporaryApplicationResponse? {
return temporaryApplicationRepository.findByUser_Id(authDetails.uid)
?.let { TemporaryApplicationResponse.from(it) }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package land.leets.domain.temporaryApplication.usecase

import land.leets.domain.auth.AuthDetails
import land.leets.domain.temporaryApplication.presentation.dto.TemporaryApplicationRequest
import land.leets.domain.temporaryApplication.presentation.dto.TemporaryApplicationResponse

interface SaveTemporaryApplication {
fun execute(authDetails: AuthDetails, request: TemporaryApplicationRequest): TemporaryApplicationResponse
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package land.leets.domain.temporaryApplication.usecase

import land.leets.domain.auth.AuthDetails
import land.leets.domain.temporaryApplication.domain.TemporaryApplication
import land.leets.domain.temporaryApplication.domain.repository.TemporaryApplicationRepository
import land.leets.domain.temporaryApplication.presentation.dto.TemporaryApplicationRequest
import land.leets.domain.temporaryApplication.presentation.dto.TemporaryApplicationResponse
import land.leets.domain.user.domain.repository.UserRepository
import land.leets.domain.user.exception.UserNotFoundException
import org.springframework.stereotype.Service

@Service
class SaveTemporaryApplicationImpl(
private val temporaryApplicationRepository: TemporaryApplicationRepository,
private val userRepository: UserRepository,
) : SaveTemporaryApplication {

override fun execute(authDetails: AuthDetails, request: TemporaryApplicationRequest): TemporaryApplicationResponse {
val user = userRepository.findById(authDetails.uid).orElseThrow { UserNotFoundException() }

val temporaryApplication = temporaryApplicationRepository.findByUser_Id(user.id!!)
?.also { it.updateContent(request) }
?: TemporaryApplication.of(user, request)

request.phone?.let { phone ->
user.updateUserInfo(request.sid, phone)
userRepository.save(user)
}

return TemporaryApplicationResponse.from(
temporaryApplicationRepository.save(temporaryApplication)
)
}
}
4 changes: 4 additions & 0 deletions src/main/kotlin/land/leets/global/config/SecurityConfig.kt
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,10 @@ class SecurityConfig(
authorize(HttpMethod.GET, "/application/{id}", hasAuthority(AuthRole.ROLE_ADMIN.role))
authorize(HttpMethod.PATCH, "/application/{id}", hasAuthority(AuthRole.ROLE_ADMIN.role))

// temporary applications
authorize(HttpMethod.GET, "/temporary-application", hasAuthority(AuthRole.ROLE_USER.role))
authorize(HttpMethod.PUT, "/temporary-application", hasAuthority(AuthRole.ROLE_USER.role))

// interviews
authorize(HttpMethod.PATCH, "/interview", hasAuthority(AuthRole.ROLE_USER.role))
authorize(HttpMethod.POST, "/interview/{id}", hasAuthority(AuthRole.ROLE_ADMIN.role))
Expand Down
Loading