Skip to content

Commit

Permalink
Merge pull request #201 from GSM-MSG/refac/modify-student-usecase
Browse files Browse the repository at this point in the history
🔀 :: Refac/modify student usecase
  • Loading branch information
louis7308 authored Aug 24, 2023
2 parents 4cbe2c2 + bf5fc53 commit 40af73d
Show file tree
Hide file tree
Showing 25 changed files with 209 additions and 124 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package team.msg.sms.domain.file.exception

import team.msg.sms.common.error.SmsException
import team.msg.sms.domain.file.exception.error.FileErrorCode

object ImageNotFoundException : SmsException(
FileErrorCode.IMAGE_NOT_FOUND
)
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ enum class FileErrorCode(
) : ErrorProperty {
IMAGE_INVALID_EXTENSION(ErrorStatus.BAD_REQUEST, "Allowed Extension : jpg(JPG), jpeg(JPEG), png(PNG), heic(HEIC)"),
FILE_INVALID_EXTENSION(ErrorStatus.BAD_REQUEST, "Allowed Extension : hwp(HWP)"),
IMAGE_NOT_FOUND(ErrorStatus.NOT_FOUND, "Image is not found Exception"),
IO_INTERRUPTED(ErrorStatus.INTERNAL_SERVER_ERROR, "Interrupted File IO");

override fun status(): Int = status
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,5 @@ import team.msg.sms.domain.file.model.Image

interface GetImageService {
fun getAllByProjectId(projectId: Long): List<Image>
fun getByImageUrlAndProjectId(imageUrl: String, projectId: Long): Image?
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,7 @@ class GetImageServiceImpl(
) : GetImageService {
override fun getAllByProjectId(projectId: Long): List<Image> =
imagePort.queryAllByProjectId(projectId)

override fun getByImageUrlAndProjectId(imageUrl: String, projectId: Long): Image? =
imagePort.queryByImageUrlAndProjectId(imageUrl, projectId)
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,5 @@ import team.msg.sms.domain.file.model.Image

interface QueryImagePort {
fun queryAllByProjectId(projectId: Long): List<Image>
fun queryByImageUrlAndProjectId(imageUrl: String, projectId: Long): Image?
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,6 @@ package team.msg.sms.domain.project.service
import team.msg.sms.domain.project.model.Project

interface CheckProjectService {
fun checkAddedProject(projects: List<Project>, modifyProject: Project): Project?
fun checkAddedProject(projects: List<Project>, modifyProject: Project): Project
fun checkRemovedProject(projects: List<Project>, modifyProjects: List<Project>): List<Project>
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import team.msg.sms.domain.student.model.Student

interface CommandProjectService {
fun save(project: Project): Project
fun saveOrUpdateProject(student: Student, project: Project): Project
fun deleteAllByStudent(student: Student)
fun deleteByProject(project: Project, student: Student)
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,21 +8,17 @@ import team.msg.sms.domain.project.service.CheckProjectService
class CheckProjectServiceImpl(

) : CheckProjectService {
override fun checkAddedProject(projects: List<Project>, modifyProject: Project): Project? {
return if (projects.none { existingProject ->
existingProject.run {
title == modifyProject.title &&
description == modifyProject.description &&
projectIconUrl == modifyProject.projectIconUrl &&
myActivity == modifyProject.myActivity &&
startDate == modifyProject.startDate &&
endDate == modifyProject.endDate
}
}) {
modifyProject
} else {
null
}
override fun checkAddedProject(projects: List<Project>, modifyProject: Project): Project {
return projects.find { existingProject ->
existingProject.run {
title == modifyProject.title &&
description == modifyProject.description &&
projectIconUrl == modifyProject.projectIconUrl &&
myActivity == modifyProject.myActivity &&
startDate == modifyProject.startDate &&
endDate == modifyProject.endDate
}
} ?: modifyProject
}

override fun checkRemovedProject(projects: List<Project>, modifyProjects: List<Project>): List<Project> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,23 @@ class CommandProjectServiceImpl(
override fun save(project: Project): Project =
projectPort.save(project)

override fun saveOrUpdateProject(student: Student, project: Project): Project {
if (project.id != 0L) {
val existingProject = projectPort.queryOneByProject(project)
val updatedProject = existingProject.copy(
title = project.title,
description = project.description,
projectIconUrl = project.projectIconUrl,
myActivity = project.myActivity,
startDate = project.startDate,
endDate = project.endDate
)
return projectPort.save(updatedProject)
}

return projectPort.save(project)
}

override fun deleteAllByStudent(student: Student) =
projectPort.deleteAllByStudent(student)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,6 @@ import java.util.UUID

interface QueryProjectPort {
fun queryAllProjectByStudentId(studentId: UUID) : List<Project>

fun queryOneByProject(project: Project): Project
}
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,6 @@ class ModifyStudentInfoUseCase(
val languageCertificates =
languageCertificateService.getLanguageCertificateByStudentUuid(student.id)
val prizes = prizeService.getAllPrizeByStudentId(student.id)
val projects = projectService.getAllProjectByStudentId(student.id)

val modifyStudentInfoDataModel = toStudentModel(modifyStudentInfoData, user)

Expand Down Expand Up @@ -95,14 +94,15 @@ class ModifyStudentInfoUseCase(
updateStudentTechStacks(techStacks.toMutableList(), addedTechStacks, student.id)
}

// 근무 지역 추가 수정
// 근무 지역 지우기 수정
val removedRegions = regionService.checkRemovedRegion(regions, modifyStudentInfoData.regions)
if (removedRegions.isNotEmpty()) {
removedRegions.forEach {
regionService.deleteByRegion(it, student)
}
}

// 근무 지역 추가 수정
val addedRegions = regionService.checkAddedRegion(regions, modifyStudentInfoData.regions)
if (addedRegions.isNotEmpty()) {
val regions = addedRegions.map { toRegionModel(it, student.id) }
Expand All @@ -117,6 +117,7 @@ class ModifyStudentInfoUseCase(
certificateService.saveAll(certificates)
}

// 자격증 삭제 수정
val removedCertificate =
certificateService.checkRemovedCertificate(certificates, modifyStudentInfoData.certificates)
if (removedCertificate.isNotEmpty()) {
Expand All @@ -134,7 +135,7 @@ class ModifyStudentInfoUseCase(
languageCertificateService.saveAll(addedLanguageCertificate)
}

// 외국어 추가 수정
// 외국어 삭제 수정
val removedLanguageCertificate = languageCertificateService.checkRemovedLanguageCertificate(
languageCertificates,
modifyStudentInfoData.languageCertificates.map { toLanguageCertificateModel(it, student.id) }
Expand All @@ -154,6 +155,7 @@ class ModifyStudentInfoUseCase(
prizeService.saveAll(addedPrize)
}

// 상 삭제 수정
val removedPrize = prizeService.checkRemovedPrize(
prizes,
modifyStudentInfoData.prizes.map { toPrizeModel(it, student.id) }
Expand All @@ -164,106 +166,95 @@ class ModifyStudentInfoUseCase(
}
}

// 프로젝트 예외 Case1
// 프로젝트 추가 수정
val currentProjects = projectService.getAllProjectByStudentId(student.id)
val removedProjects = projectService.checkRemovedProject(
currentProjects,
modifyStudentInfoData.projects.map { toProjectModel(it, student.id) }
)

if (modifyStudentInfoData.projects.isEmpty()) {
projectLinkService.deleteAllByProjects(projects)
projectTechStackService.deleteAllByProjects(projects)
imageService.deleteAllByProjects(projects)
projectService.deleteAllByStudent(student)
} else {
val checkRemovedProjects = projectService.checkRemovedProject(
projects,
modifyStudentInfoData.projects.map { toProjectModel(it, student.id) }
deleteAllProjectRelatedEntities(currentProjects, student)
} else { // 비어 있지 않다면
deleteAllProjectRelatedEntities(removedProjects, student)
updateProjects(student, modifyStudentInfoData.projects, techStacks, currentProjects)
}

}

private fun deleteAllProjectRelatedEntities(projects: List<Project>, student: Student) {
projectLinkService.deleteAllByProjects(projects)
projectTechStackService.deleteAllByProjects(projects)
imageService.deleteAllByProjects(projects)
projects.forEach { project ->
projectService.deleteByProject(project, student)
}
}

private fun updateProjects(student: Student, projectsToUpdate: List<ProjectRequestData>, techStacks: List<TechStack>, currentProjects: List<Project>) {
projectsToUpdate.forEach { modifyProject ->
val projectModify = toProjectModel(modifyProject, student.id)
val addedProject = projectService.checkAddedProject(
currentProjects,
projectModify
)
if(checkRemovedProjects.isNotEmpty()) {
projectLinkService.deleteAllByProjects(checkRemovedProjects)
projectTechStackService.deleteAllByProjects(checkRemovedProjects)
imageService.deleteAllByProjects(checkRemovedProjects)
checkRemovedProjects.forEach {
projectService.deleteByProject(it, student)
}
}
modifyStudentInfoData.projects.forEach { modifyProject ->
val projectModify = toProjectModel(modifyProject, student.id)
var projectModifyId = 0L
val isAddedProject = projectService.checkAddedProject(
projects,
projectModify
)
// 프로젝트가 존재하면 null임
if (isAddedProject != null) {
projectModifyId = projectService.save(projectModify).id
} else {
projectModifyId = projectService.getMatchingProject(projects, projectModify).id
}
val projectModifyId = projectService.saveOrUpdateProject(student, addedProject).id

// 프로젝트 TechStack 추가 수정 부분
val projectTechStacks = projectTechStackService.getAllByProjectId(projectModifyId)
val addedProjectTechStack =
projectTechStackService.checkAddedProjectTechStack(projectTechStacks, modifyProject.techStacks)
if (addedProjectTechStack.isNotEmpty()) {
updateProjectTechStack(techStacks.toMutableList(), addedProjectTechStack, projectModifyId)
}
val projectTechStacks = projectTechStackService.getAllByProjectId(projectModifyId)
val addedProjectTechStacks = projectTechStackService.checkAddedProjectTechStack(
projectTechStacks,
modifyProject.techStacks
)
updateProjectTechStack(techStacks.toMutableList(), addedProjectTechStacks, projectModifyId)

val checkRemovedProjectTechStack =
projectTechStackService.checkRemovedProjectTechStack(projectTechStacks, modifyProject.techStacks)
if (checkRemovedProjectTechStack.isNotEmpty()) {
checkRemovedProjectTechStack.forEach {
val findTechStackModel = findTechStackModel(techStacks, it)
val count = findTechStackModel.count - 1
projectTechStackService.deleteByProjectIdAndTechStack(projectModifyId, findTechStackModel)
if (count == -1) {
techStackService.deleteByTechStack(findTechStackModel)
} else {
techStackService.save(findTechStackModel.copy(count = count))
}
}
}
val removedProjectTechStacks = projectTechStackService.checkRemovedProjectTechStack(
projectTechStacks,
modifyProject.techStacks
)
removeProjectTechStacks(techStacks, removedProjectTechStacks, projectModifyId)

// 프로젝트 링크 추가 수정
val projectLinks = projectLinkService.getAllByProjectId(projectModifyId)
val checkAddedProjectLink = projectLinkService.checkAddedProjectLink(
projectLinks,
modifyProject.links.map { toProjectLinkModel(it, projectModifyId) }
)
if (checkAddedProjectLink.isNotEmpty()) {
projectLinkService.saveAll(checkAddedProjectLink)
}
val projectLinks = projectLinkService.getAllByProjectId(projectModifyId)
val checkAddedProjectLinks = projectLinkService.checkAddedProjectLink(
projectLinks,
modifyProject.links.map { toProjectLinkModel(it, projectModifyId) }
)
projectLinkService.saveAll(checkAddedProjectLinks)

val checkRemovedProjectLink = projectLinkService.checkRemovedProjectLink(
projectLinks,
modifyProject.links.map { toProjectLinkModel(it, projectModifyId) }
)
if (checkRemovedProjectLink.isNotEmpty()) {
checkRemovedProjectLink.forEach {
projectLinkService.deleteByProjectLink(it, projectModify)
}
}
val checkRemovedProjectLinks = projectLinkService.checkRemovedProjectLink(
projectLinks,
modifyProject.links.map { toProjectLinkModel(it, projectModifyId) }
)
checkRemovedProjectLinks.forEach { projectLinkService.deleteByProjectLink(it, projectModify) }

val images = imageService.getAllByProjectId(projectModifyId)
val checkAddedImage = imageService.checkAddedImage(
images,
modifyProject.previewImages
)
if (checkAddedImage.isNotEmpty()) {
val imageModels = checkAddedImage.map { toImage(it, projectModifyId) }
imageService.saveAll(imageModels)
val images = imageService.getAllByProjectId(projectModifyId)
val checkAddedImages = imageService.checkAddedImage(images, modifyProject.previewImages)
saveProjectImages(checkAddedImages, projectModifyId)

}
val checkRemovedImages = imageService.checkRemovedImage(images, modifyProject.previewImages)
deleteProjectImages(checkRemovedImages, projectModify)
}
}

val checkRemovedImage = imageService.checkRemovedImage(
images,
modifyProject.previewImages
)
if (checkAddedImage.isNotEmpty()) {
checkRemovedImage.forEach {
imageService.deleteByImage(it, projectModify)
}
}
}
private fun removeProjectTechStacks(techStacks: List<TechStack>, removedTechStacks: List<String>, projectId: Long) {
removedTechStacks.forEach { stackName ->
val techStackModel = techStackService.getTechStackByStack(stackName)
projectTechStackService.deleteByProjectIdAndTechStack(projectId, techStackModel)
techStackService.decrementTechStackCount(techStackModel)
}
}

private fun saveProjectImages(images: List<String>, projectId: Long) {
if(images.isNotEmpty()) {
val imageModels = images.map { toImage(it, projectId) }
imageService.saveAll(imageModels)
}
}

private fun deleteProjectImages(images: List<Image>, project: Project) {
images.forEach { image ->
val projectImage = imageService.getByImageUrlAndProjectId(image.imageUrl, project.id)
projectImage?.let { imageService.deleteByImage(it, project) }
}
}

private fun toStudentModel(modifyStudentInfoData: ModifyStudentInfoRequestData, user: User): Student =
Expand Down Expand Up @@ -333,15 +324,19 @@ class ModifyStudentInfoUseCase(
) {
for (stackItem in projectTechStacks) {
val techStackData = stack.find { it.stack == stackItem }
if (techStackData == null) {
val techStack = techStackService.save(toStackModel(stackItem))
stack.add(0, techStack)
projectTechStackService.save(toProjectTechStackModel(projectId, techStack.id))
val isNewStack = techStackData == null

val techStack = if (isNewStack) {
techStackService.save(toStackModel(stackItem))
} else {
val techStack = techStackService.save(techStackData.copy(count = techStackData.count + 1))
stack.add(0, techStack)
projectTechStackService.save(toProjectTechStackModel(projectId, techStack.id))
techStackData?.let {
techStackService.save(it.copy(count = techStackData.count + 1))
}
}

techStack?.let {
stack.add(0, it)
projectTechStackService.save(toProjectTechStackModel(projectId, it.id))
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package team.msg.sms.domain.techstack.exception

import team.msg.sms.common.error.SmsException
import team.msg.sms.domain.techstack.exception.error.TechStackErrorCode

object TechStackNotFoundException : SmsException(
TechStackErrorCode.TECH_STACK_NOT_FOUND
)
Loading

0 comments on commit 40af73d

Please sign in to comment.