Skip to content

Commit

Permalink
feat: lanugage
Browse files Browse the repository at this point in the history
  • Loading branch information
jombidev committed May 8, 2024
1 parent 218184c commit 1b9e179
Show file tree
Hide file tree
Showing 14 changed files with 235 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ class InfoController(
fun getMyUserInfo() = ResponseData.ok("내 정보 조회 완료", infoService.getMyInfo())

@PatchMapping("/me")
fun patchMyInfo(@RequestBody data: EditUserInfoReq): Response {
fun editMyInfo(@RequestBody data: EditUserInfoReq): Response {
infoService.editInfo(data.bio, data.job)
return Response.ok("내 정보 수정 완료")
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.molohala.grow.api.language

import com.molohala.grow.api.response.Response
import com.molohala.grow.api.response.ResponseData
import com.molohala.grow.core.language.application.dto.req.EditLanguageReq
import com.molohala.grow.core.language.application.service.LanguageService
import org.springframework.web.bind.annotation.*

@RestController
@RequestMapping("/language")
class LanguageController(
private val languageService: LanguageService
) {
@GetMapping
fun getAll() = ResponseData.ok("언어 리스트 조회 완료", languageService.getAvailableLanguage())

@GetMapping("/me")
fun languages() = ResponseData.ok("사용하는 언어 조회 완료", languageService.getUsingLanguages())

@PatchMapping("/me")
fun editLanguage(@RequestBody data: EditLanguageReq): Response {
languageService.updateUsingLanguages(data.langs)
return Response.ok("사용하는 언어 갱신 완료")
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,7 @@ class InfoServiceImpl(
socialAccountJpaRepository.save(SocialAccount(name, SocialType.SOLVED_AC, member.id))
}

@Transactional(rollbackOn = [Exception::class])
override fun editInfo(bio: String?, job: String?) {
memberJpaRepository.save(
memberSessionHolder.current().apply { updateInfo(bio ?: this.bio, MemberJob.parse(job) ?: this.job) }
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.molohala.grow.core.language.application.dto.req

import com.fasterxml.jackson.annotation.JsonCreator

data class EditLanguageReq @JsonCreator constructor(
val langs: List<Long>
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package com.molohala.grow.core.language.application.runner

import com.molohala.grow.core.language.domain.entity.Language
import com.molohala.grow.core.language.repository.LanguageJpaRepository
import org.springframework.boot.ApplicationArguments
import org.springframework.boot.ApplicationRunner
import org.springframework.stereotype.Component

@Component
class LanguageLoader(
private val languageJpaRepository: LanguageJpaRepository
) : ApplicationRunner {
override fun run(args: ApplicationArguments?) {
val languages = languageJpaRepository.findAll()
val m = listOf(
"Python",
"HTML",
"CSS",
"JavaScript",
"TypeScript",
"C",
"C++",
"C#",
"Kotlin",
"Java",
"Swift",
"Dart",
"Go",
"Ruby",
"Rust",
"SQL",
"PHP",
"Scala",
"Lua",
)
val addLang = ArrayList<Language>()

for (s in m) if (languages.none { it.name.lowercase() == s.lowercase() }) addLang.add(Language(s))

languageJpaRepository.saveAll(addLang)
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.molohala.grow.core.language.application.service

import com.molohala.grow.core.language.domain.entity.Language

interface LanguageService {
fun updateUsingLanguages(langs: List<Long>)
fun getUsingLanguages(): List<Language>
fun getAvailableLanguage(): List<Language>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package com.molohala.grow.core.language.application.service

import com.molohala.grow.common.exception.custom.CustomException
import com.molohala.grow.core.language.domain.entity.Language
import com.molohala.grow.core.language.domain.entity.MemberAndLanguage
import com.molohala.grow.core.language.exception.LanguageExceptionCode
import com.molohala.grow.core.language.repository.LanguageJpaRepository
import com.molohala.grow.core.language.repository.MemberLanguageJpaRepository
import com.molohala.grow.core.language.repository.MemberLanguageQueryRepository
import com.molohala.grow.core.member.application.MemberSessionHolder
import jakarta.transaction.Transactional
import org.springframework.stereotype.Service

@Service
class LanguageServiceImpl(
private val memberSessionHolder: MemberSessionHolder,
private val languageJpaRepository: LanguageJpaRepository,
private val memberLanguageJpaRepository: MemberLanguageJpaRepository,
private val memberLanguageQueryRepository: MemberLanguageQueryRepository
) : LanguageService {
@Transactional(rollbackOn = [Exception::class])
override fun updateUsingLanguages(langs: List<Long>) {
val member = memberSessionHolder.current()
val dbLang = languageJpaRepository.findAll()

val owning =
memberLanguageJpaRepository
.findAllByMemberIdIs(member.id!!)

memberLanguageJpaRepository.deleteAllInBatch(owning.filter { it.languageId !in langs })

val toAdd = ArrayList<Language>()

for (lang in langs) {
val ent = dbLang.find { it.id == lang }
if (ent == null)
throw CustomException(LanguageExceptionCode.LANGUAGE_NOT_FOUND)
if (owning.none { it.languageId == lang }) toAdd.add(ent) // not owning
}

memberLanguageJpaRepository.saveAllAndFlush(
toAdd.map { MemberAndLanguage(member.id, it.id!!) }
)
}

override fun getUsingLanguages(): List<Language> {
val member = memberSessionHolder.current()
return memberLanguageQueryRepository.getLanguagesByMemberId(member.id!!)
}

override fun getAvailableLanguage(): List<Language> = languageJpaRepository.findAll()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.molohala.grow.core.language.domain.entity

import jakarta.persistence.*

@Entity(name = "tbl_langs")
data class Language(
val name: String,
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(updatable = false, nullable = false, name = "id")
val id: Long? = null
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.molohala.grow.core.language.domain.entity

import jakarta.persistence.Column
import jakarta.persistence.Entity
import jakarta.persistence.GeneratedValue
import jakarta.persistence.GenerationType
import jakarta.persistence.Id

@Entity(name = "tbl_many_member_language")
class MemberAndLanguage(
val memberId: Long,
val languageId: Long,

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(
name = "id",
nullable = false,
updatable = false
)
val id: Long? = null,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.molohala.grow.core.language.exception

import com.molohala.grow.common.exception.ExceptionCode
import org.springframework.http.HttpStatus

enum class LanguageExceptionCode(private val status: HttpStatus, private val message: String) : ExceptionCode {
LANGUAGE_NOT_FOUND(HttpStatus.BAD_REQUEST, "해당하는 언어를 찾을 수 없음"),
;

override fun getHttpStatus() = status
override fun getExceptionName() = name
override fun getMessage() = message
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.molohala.grow.core.language.repository

import com.molohala.grow.core.language.domain.entity.Language
import org.springframework.data.jpa.repository.JpaRepository

interface LanguageJpaRepository : JpaRepository<Language, Long>
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.molohala.grow.core.language.repository

import com.molohala.grow.core.language.domain.entity.MemberAndLanguage
import org.springframework.data.jpa.repository.JpaRepository

interface MemberLanguageJpaRepository : JpaRepository<MemberAndLanguage, Long> {
fun findAllByMemberIdIs(memberId: Long): List<MemberAndLanguage>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.molohala.grow.core.language.repository

import com.molohala.grow.core.language.domain.entity.Language
import com.molohala.grow.core.language.domain.entity.QLanguage.language
import com.molohala.grow.core.language.domain.entity.QMemberAndLanguage.memberAndLanguage
import com.querydsl.core.types.Projections
import com.querydsl.jpa.impl.JPAQueryFactory
import org.springframework.stereotype.Repository

@Repository
class MemberLanguageQueryDslRepository(
private val queryFactory: JPAQueryFactory
) : MemberLanguageQueryRepository {
override fun getLanguagesByMemberId(memberId: Long): List<Language> {
return queryFactory
.select(
Projections.constructor(
Language::class.java,
language.name,
language.id
)
)
.from(memberAndLanguage)
.where(memberAndLanguage.memberId.eq(memberId))
.innerJoin(language)
.on(memberAndLanguage.languageId.eq(language.id))
.fetch()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.molohala.grow.core.language.repository

import com.molohala.grow.core.language.domain.entity.Language

interface MemberLanguageQueryRepository {
fun getLanguagesByMemberId(memberId: Long): List<Language>
}

0 comments on commit 1b9e179

Please sign in to comment.