Skip to content

Commit

Permalink
[FO-898] 모집 등록,수정 API 리팩토링 (#399)
Browse files Browse the repository at this point in the history
  • Loading branch information
sinkyoungdeok authored Feb 4, 2024
1 parent c537bc8 commit b40d8d1
Show file tree
Hide file tree
Showing 23 changed files with 454 additions and 502 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,24 +8,24 @@ import org.springframework.stereotype.Service
class ValidateJobOpeningFacade(
private val validateJobOpeningService: ValidateJobOpeningService,
) {
suspend fun validateContactPage(request: ValidateJobOpeningDto.ContactPageValidation) =
suspend fun validateContactPage(request: ValidateJobOpeningDto.FirstPage) =
validateJobOpeningService.validateContactPage(request)

suspend fun validateTitlePage(request: ValidateJobOpeningDto.TitlePageValidation) =
suspend fun validateTitlePage(request: ValidateJobOpeningDto.SecondPage) =
validateJobOpeningService.validateTitlePage(request)

suspend fun validateRolePage(request: ValidateJobOpeningDto.RolePageValidation) =
suspend fun validateRolePage(request: ValidateJobOpeningDto.ThirdPage) =
validateJobOpeningService.validateRolePage(request)

suspend fun validateProjectPage(request: ValidateJobOpeningDto.ProjectPageValidation) =
suspend fun validateProjectPage(request: ValidateJobOpeningDto.FourthPage) =
validateJobOpeningService.validateProjectPage(request)

suspend fun validateProjectDetailsPage(request: ValidateJobOpeningDto.ProjectDetailsPageValidation) =
suspend fun validateProjectDetailsPage(request: ValidateJobOpeningDto.FifthPage) =
validateJobOpeningService.validateProjectDetailsPage(request)

suspend fun validateSummaryPage(request: ValidateJobOpeningDto.SummaryPageValidation) =
suspend fun validateSummaryPage(request: ValidateJobOpeningDto.SixthPage) =
validateJobOpeningService.validateSummaryPage(request)

suspend fun validateManagerPage(request: ValidateJobOpeningDto.ManagerInfoValidation) =
suspend fun validateManagerPage(request: ValidateJobOpeningDto.SeventhPage) =
validateJobOpeningService.validateManagerPage(request)
}
144 changes: 106 additions & 38 deletions server/src/main/kotlin/com/fone/jobOpening/domain/entity/JobOpening.kt
Original file line number Diff line number Diff line change
@@ -1,15 +1,17 @@
package com.fone.jobOpening.domain.entity

import com.fone.common.converter.SeparatorConverter
import com.fone.common.entity.BaseEntity
import com.fone.common.entity.Career
import com.fone.common.entity.ContactMethod
import com.fone.common.entity.Gender
import com.fone.common.entity.Salary
import com.fone.common.entity.Type
import com.fone.jobOpening.infrastructure.toLocation
import com.fone.jobOpening.presentation.dto.RegisterJobOpeningDto.RegisterJobOpeningRequest
import java.time.LocalDate
import javax.persistence.CascadeType
import javax.persistence.Column
import javax.persistence.Embedded
import javax.persistence.Convert
import javax.persistence.Entity
import javax.persistence.EnumType
import javax.persistence.Enumerated
Expand All @@ -27,66 +29,132 @@ data class JobOpening(
@Column
@GeneratedValue(strategy = GenerationType.IDENTITY)
var id: Long? = null,

// page1
@Enumerated(EnumType.STRING) var contactMethod: ContactMethod,
@Column(length = 300) var contact: String,

// page2
@Column var title: String,
@Column var recruitmentStartDate: LocalDate?,
@Column var recruitmentEndDate: LocalDate?,
@OneToMany(mappedBy = "jobOpening", cascade = [CascadeType.PERSIST, CascadeType.MERGE], orphanRemoval = true)
var imageUrls: MutableList<JobOpeningImage> = mutableListOf(),
@Column(length = 300) var representativeImageUrl: String,

// page3
@Column(length = 50) var casting: String?,
@Column var numberOfRecruits: Int,
@Enumerated(EnumType.STRING) var gender: Gender,
@Column var ageMax: Int,
@Column var ageMin: Int,
@Enumerated(EnumType.STRING) var career: Career,
@Convert(converter = SeparatorConverter::class)
var careers: List<String> = listOf(),

// page4
@Column(length = 20) var produce: String,
@Column(length = 20) var workTitle: String,
@Column(length = 20) var director: String,
@Convert(converter = SeparatorConverter::class)
var genres: List<String> = listOf(),
@Column var logline: String?,

// page5
@OneToOne
var location: Location,
@Column var workingStartDate: LocalDate?,
@Column var workingEndDate: LocalDate?,
@Convert(converter = SeparatorConverter::class)
var selectedDays: List<String> = listOf(),
@Column var workingStartTime: String?,
@Column var workingEndTime: String?,
@Enumerated(EnumType.STRING) var salaryType: Salary,
@Column var salary: Int,

// page6
@Column(length = 500) var details: String,

// page7
@Column(length = 10) var manager: String,
@Column var email: String,

// etc
@Enumerated(EnumType.STRING) var type: Type,
@Column var userId: Long,
@Column var viewCount: Long,
@Column var scrapCount: Long,
@Column var viewCount: Long = 0,
@Column var scrapCount: Long = 0,
@Column var isDeleted: Boolean = false,
@Embedded var work: Work,
@Column var recruitmentStartDate: LocalDate?,
@Column var recruitmentEndDate: LocalDate?,
@Column(length = 300) var representativeImageUrl: String?,
@OneToMany(mappedBy = "jobOpening", cascade = [CascadeType.PERSIST, CascadeType.MERGE], orphanRemoval = true)
var images: MutableList<JobOpeningImage> = mutableListOf(),
@OneToOne
var location: Location? = null,
) : BaseEntity() {
fun view() {
viewCount += 1
}

suspend fun put(request: RegisterJobOpeningRequest) {
title = request.title
casting = request.casting
numberOfRecruits = request.numberOfRecruits
gender = request.gender
ageMax = request.ageMax
ageMin = request.ageMin
career = request.career
type = request.type
work = request.work.toEntity()
recruitmentStartDate = request.recruitmentStartDate
recruitmentEndDate = request.recruitmentEndDate
representativeImageUrl = request.representativeImageUrl
location = request.work.toLocation()
contactMethod = request.firstPage.contactMethod
contact = request.firstPage.contact

title = request.secondPage.title
recruitmentStartDate = request.secondPage.recruitmentStartDate
recruitmentEndDate = request.secondPage.recruitmentEndDate
representativeImageUrl = request.secondPage.representativeImageUrl

casting = request.thirdPage.casting
numberOfRecruits = request.thirdPage.numberOfRecruits
gender = request.thirdPage.gender
ageMax = request.thirdPage.ageMax ?: 200
ageMin = request.thirdPage.ageMin ?: 0
careers = request.thirdPage.careers.map { it.toString() }

produce = request.fourthPage.produce
workTitle = request.fourthPage.workTitle
director = request.fourthPage.director
genres = request.fourthPage.genres.map { it.toString() }
logline = request.fourthPage.logline

location = request.fifthPage.toLocation()
workingStartDate = request.fifthPage.workingStartDate
workingEndDate = request.fifthPage.workingEndDate
selectedDays = request.fifthPage.selectedDays.map { it.toString() }
workingStartTime = request.fifthPage.workingStartTime
workingEndTime = request.fifthPage.workingEndTime
salaryType = request.fifthPage.salaryType
salary = request.fifthPage.salary

details = request.sixthPage.details

manager = request.seventhPage.manager
email = request.seventhPage.email
}

fun delete() {
work.delete()
casting = ""
numberOfRecruits = 0
gender = Gender.IRRELEVANT
ageMax = 0
ageMin = 0
career = Career.IRRELEVANT
type = Type.ACTOR
isDeleted = true
location = null
contact = ""
title = ""
recruitmentStartDate = null
recruitmentEndDate = null
representativeImageUrl = null
representativeImageUrl = ""
casting = ""
numberOfRecruits = -1
careers = listOf()
produce = ""
workTitle = ""
director = ""
genres = listOf()
logline = ""
workingStartDate = null
workingEndDate = null
selectedDays = listOf()
workingStartTime = ""
workingEndTime = ""
salary = -1
details = ""
manager = ""
email = ""
isDeleted = true
}

// 연관관계 메서드
fun addJobOpeningImage(jobOpeningImage: JobOpeningImage) {
this.images.add(jobOpeningImage)
this.imageUrls.add(jobOpeningImage)
jobOpeningImage.addJobOpening(this)
}
}
41 changes: 0 additions & 41 deletions server/src/main/kotlin/com/fone/jobOpening/domain/entity/Work.kt

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ class PutJobOpeningService(
}

jobOpeningDomainRepository.deleteByJobOpeningId(jobOpening.id!!)
val jobOpeningDomains = request.domains?.map {
val jobOpeningDomains = request.thirdPage.domains?.map {
com.fone.jobOpening.domain.entity.JobOpeningDomain(
jobOpening.id!!,
it
Expand All @@ -43,7 +43,7 @@ class PutJobOpeningService(
jobOpeningDomainRepository.saveAll(jobOpeningDomains)

jobOpeningCategoryRepository.deleteByJobOpeningId(jobOpening.id!!)
val jobOpeningCategories = request.categories.map {
val jobOpeningCategories = request.secondPage.categories.map {
com.fone.jobOpening.domain.entity.JobOpeningCategory(
jobOpening.id!!,
it
Expand All @@ -61,8 +61,8 @@ class PutJobOpeningService(
return RegisterJobOpeningResponse(
jobOpening,
userJobOpeningScraps,
request.domains,
request.categories,
request.thirdPage.domains,
request.secondPage.categories,
jobOpeningUser?.nickname ?: "",
jobOpeningUser?.profileUrl ?: "",
jobOpeningUser?.job ?: Job.ACTOR,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ class RegisterJobOpeningService(
val user = userRepository.findByNicknameOrEmail(null, email) ?: throw NotFoundUserException()
return with(request) {
val jobOpening = toEntity(user.id!!)
imageUrls.forEach {
secondPage.imageUrls.forEach {
jobOpening.addJobOpeningImage(
JobOpeningImage(
it
Expand All @@ -41,14 +41,14 @@ class RegisterJobOpeningService(
jobOpeningRepository.save(jobOpening)

val jobOpeningDomains =
domains?.map {
thirdPage.domains?.map {
com.fone.jobOpening.domain.entity.JobOpeningDomain(
jobOpening.id!!,
it
)
}
val jobOpeningCategories =
categories.map {
secondPage.categories.map {
com.fone.jobOpening.domain.entity.JobOpeningCategory(
jobOpening.id!!,
it
Expand All @@ -62,8 +62,8 @@ class RegisterJobOpeningService(
RegisterJobOpeningResponse(
jobOpening,
scraps,
domains,
categories,
thirdPage.domains,
secondPage.categories,
jobOpeningUser?.nickname ?: "",
jobOpeningUser?.profileUrl ?: "",
jobOpeningUser?.job ?: Job.ACTOR,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ class ValidateJobOpeningService(
) {
private val emailRegex = Regex("^[a-zA-Z0-9_!#$%&'*+/=?`{|}~^.-]+@[a-zA-Z0-9.-]+$")

suspend fun validateContactPage(request: ValidateJobOpeningDto.ContactPageValidation) {
suspend fun validateContactPage(request: ValidateJobOpeningDto.FirstPage) {
if (request.contactMethod == ContactMethod.EMAIL) {
if (!emailRegex.matches(request.contact)) {
throw RequestValidationException("올바른 이메일 주소를 입력해 주세요.")
Expand All @@ -29,7 +29,7 @@ class ValidateJobOpeningService(
}
}

suspend fun validateTitlePage(request: ValidateJobOpeningDto.TitlePageValidation) {
suspend fun validateTitlePage(request: ValidateJobOpeningDto.SecondPage) {
if (request.title.length < 2) {
throw RequestValidationException("최소 2자 이상의 모집 제목을 입력해주세요.")
}
Expand All @@ -41,7 +41,7 @@ class ValidateJobOpeningService(
validateDate(request.recruitmentStartDate, request.recruitmentEndDate)
}

suspend fun validateRolePage(request: ValidateJobOpeningDto.RolePageValidation) {
suspend fun validateRolePage(request: ValidateJobOpeningDto.ThirdPage) {
if (request.casting != null) {
if (request.casting.isBlank()) {
throw RequestValidationException("모집 배역을 입력해 주세요.")
Expand Down Expand Up @@ -88,7 +88,7 @@ class ValidateJobOpeningService(
}
}

suspend fun validateProjectPage(request: ValidateJobOpeningDto.ProjectPageValidation) {
suspend fun validateProjectPage(request: ValidateJobOpeningDto.FourthPage) {
if (request.produce.isBlank()) {
throw RequestValidationException("제작 주체를 입력해 주세요.")
}
Expand All @@ -103,7 +103,7 @@ class ValidateJobOpeningService(
}
}

suspend fun validateProjectDetailsPage(request: ValidateJobOpeningDto.ProjectDetailsPageValidation) {
suspend fun validateProjectDetailsPage(request: ValidateJobOpeningDto.FifthPage) {
locationRepository.findLocation(request.workingCity, request.workingDistrict)
?: throw RequestValidationException("'시', '구'가 유효하지 않습니다.")

Expand All @@ -126,13 +126,13 @@ class ValidateJobOpeningService(
}
}

suspend fun validateSummaryPage(request: ValidateJobOpeningDto.SummaryPageValidation) {
suspend fun validateSummaryPage(request: ValidateJobOpeningDto.SixthPage) {
if (request.details.length < 8) {
throw RequestValidationException("최소 8자 이상의 상세 요강을 입력해주세요.")
}
}

suspend fun validateManagerPage(request: ValidateJobOpeningDto.ManagerInfoValidation) {
suspend fun validateManagerPage(request: ValidateJobOpeningDto.SeventhPage) {
if (request.manager.isBlank()) {
throw RequestValidationException("담당자의 이름을 입력해 주세요.")
}
Expand Down
Loading

0 comments on commit b40d8d1

Please sign in to comment.