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

[FO-898] 모집 등록,수정 API 리팩토링 #399

Merged
merged 1 commit into from
Feb 4, 2024
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 @@ -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
Loading