diff --git a/build.gradle b/build.gradle deleted file mode 100644 index 0352f7f..0000000 --- a/build.gradle +++ /dev/null @@ -1,79 +0,0 @@ -buildscript { - ext { - springBootVersion = '2.7.0' - dependencyManagementVersion = '1.0.11.RELEASE' - kotlinVersion = '1.6.21' - flywayVersion = '7.15.0' - } - repositories { - mavenCentral() - } - dependencies { - classpath "org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}" - classpath "io.spring.gradle:dependency-management-plugin:${dependencyManagementVersion}" - - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${kotlinVersion}" - classpath "org.jetbrains.kotlin:kotlin-noarg:${kotlinVersion}" - classpath "org.jetbrains.kotlin:kotlin-allopen:${kotlinVersion}" - } -} - -apply plugin: 'kotlin' -apply plugin: 'kotlin-spring' -apply plugin: "kotlin-jpa" -apply plugin: "kotlin-noarg" -apply plugin: "kotlin-allopen" -apply plugin: 'java' -apply plugin: 'org.springframework.boot' -apply plugin: 'io.spring.dependency-management' - -group = 'io.beaniejoy.dongecafe' -version = '0.0.1-SNAPSHOT' -sourceCompatibility = '17' - -repositories { - mavenCentral() -} - -allOpen { - annotation("javax.persistence.Entity") - annotation("javax.persistence.MappedSuperclass") - annotation("javax.persistence.Embeddable") -} - -dependencies { - implementation("org.jetbrains.kotlin:kotlin-stdlib:${kotlinVersion}") - implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:${kotlinVersion}") - implementation("org.jetbrains.kotlin:kotlin-reflect:${kotlinVersion}") - implementation("com.fasterxml.jackson.module:jackson-module-kotlin") - - implementation('io.github.microutils:kotlin-logging:2.1.21') - - implementation 'org.springframework.boot:spring-boot-starter-data-jpa' - implementation 'org.springframework.boot:spring-boot-starter-validation' - implementation 'org.springframework.boot:spring-boot-starter-web' - - // log4j2 -// implementation 'org.springframework.boot:spring-boot-starter-log4j2' -// testImplementation 'org.springframework.boot:spring-boot-starter-log4j2' - - developmentOnly 'org.springframework.boot:spring-boot-devtools' - - runtimeOnly 'mysql:mysql-connector-java' // MySQL - runtimeOnly 'com.h2database:h2' // H2 - - implementation "org.flywaydb:flyway-core:${flywayVersion}" // flyway - - testImplementation 'org.springframework.boot:spring-boot-starter-test' -} - -//configurations { -// all { -// // log4j2 적용을 위해 기존 spring boot에서 제공하는 logging exclude -// exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging' -// } -//} - -test { - useJUnitPlatform() -} diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000..2bb7774 --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,89 @@ +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + +buildscript { + repositories { + mavenCentral() + } +} + +plugins { + id("org.springframework.boot") version "2.7.0" + id("io.spring.dependency-management") version "1.0.11.RELEASE" + kotlin("jvm") version "1.6.21" + kotlin("plugin.spring") version "1.6.21" apply false // TODO: apply false what? + kotlin("plugin.jpa") version "1.6.21" apply false +} + +java.sourceCompatibility = JavaVersion.VERSION_17 + +allprojects { + group = "io.beaniejoy.dongecafe" + version = "0.0.1-SNAPSHOT" + + repositories { + mavenCentral() + } +} + +subprojects { + apply(plugin = "java") + + apply(plugin = "io.spring.dependency-management") + apply(plugin = "org.springframework.boot") + apply(plugin = "org.jetbrains.kotlin.plugin.spring") + + apply(plugin = "kotlin") + apply(plugin = "kotlin-spring") + apply(plugin = "kotlin-jpa") + + repositories { + mavenCentral() + } + +// configurations { +// all { +// // log4j2 적용을 위해 기존 spring boot에서 제공하는 logging exclude +// exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging' +// } +// } + + dependencies { + // Spring Boot Project + implementation("org.springframework.boot:spring-boot-starter-data-jpa") + implementation("org.springframework.boot:spring-boot-starter-web") + implementation("org.springframework.boot:spring-boot-starter-validation") + implementation("org.springframework.boot:spring-boot-starter-security") + implementation("com.fasterxml.jackson.module:jackson-module-kotlin") + developmentOnly("org.springframework.boot:spring-boot-devtools") + + //kotlin + implementation("org.jetbrains.kotlin:kotlin-reflect") + implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8") + + // DB + runtimeOnly("mysql:mysql-connector-java") // MySQL + runtimeOnly("com.h2database:h2") // H2 + implementation("org.flywaydb:flyway-core:7.15.0") // flyway + + // Logging + // log4j2 + // implementation("org.springframework.boot:spring-boot-starter-log4j2") + // testImplementation("org.springframework.boot:spring-boot-starter-log4j2") + implementation("io.github.microutils:kotlin-logging:2.1.21") + + // Test + testImplementation("org.springframework.boot:spring-boot-starter-test") + testImplementation("org.springframework.security:spring-security-test") + } + + tasks.withType { + kotlinOptions { + freeCompilerArgs = listOf("-Xjsr305=strict") + jvmTarget = "17" + } + } + + tasks.withType { + useJUnitPlatform() + } +} \ No newline at end of file diff --git a/dongne-account-api/build.gradle.kts b/dongne-account-api/build.gradle.kts new file mode 100644 index 0000000..ea96773 --- /dev/null +++ b/dongne-account-api/build.gradle.kts @@ -0,0 +1,3 @@ +dependencies { + implementation(project(":dongne-common")) +} \ No newline at end of file diff --git a/src/main/java/io/beaniejoy/dongnecafe/DongneCafeApiApplication.kt b/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/DongneAccountApiApplication.kt similarity index 69% rename from src/main/java/io/beaniejoy/dongnecafe/DongneCafeApiApplication.kt rename to dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/DongneAccountApiApplication.kt index afefa48..a79a862 100644 --- a/src/main/java/io/beaniejoy/dongnecafe/DongneCafeApiApplication.kt +++ b/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/DongneAccountApiApplication.kt @@ -4,8 +4,8 @@ import org.springframework.boot.autoconfigure.SpringBootApplication import org.springframework.boot.runApplication @SpringBootApplication -class DongneCafeApiApplication +class DongneAccountApiApplication fun main(args: Array) { - runApplication(*args) + runApplication(*args) } \ No newline at end of file diff --git a/src/main/java/io/beaniejoy/dongnecafe/common/config/AuditingConfig.kt b/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/config/AuditingConfig.kt similarity index 100% rename from src/main/java/io/beaniejoy/dongnecafe/common/config/AuditingConfig.kt rename to dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/config/AuditingConfig.kt diff --git a/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/config/SecurityConfig.kt b/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/config/SecurityConfig.kt new file mode 100644 index 0000000..4f6b177 --- /dev/null +++ b/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/config/SecurityConfig.kt @@ -0,0 +1,73 @@ +package io.beaniejoy.dongnecafe.common.config + +import io.beaniejoy.dongnecafe.common.security.ApiAuthenticationFilter +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.boot.autoconfigure.security.servlet.PathRequest +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Configuration +import org.springframework.http.HttpMethod +import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration +import org.springframework.security.config.annotation.web.builders.HttpSecurity +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity +import org.springframework.security.config.annotation.web.configuration.WebSecurityCustomizer +import org.springframework.security.core.userdetails.UserDetailsService +import org.springframework.security.crypto.factory.PasswordEncoderFactories +import org.springframework.security.crypto.password.PasswordEncoder +import org.springframework.security.web.SecurityFilterChain +import org.springframework.security.web.authentication.AuthenticationFailureHandler +import org.springframework.security.web.authentication.AuthenticationSuccessHandler +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter +import org.springframework.security.web.util.matcher.AntPathRequestMatcher + +@Configuration +@EnableWebSecurity +class SecurityConfig { + @Autowired + lateinit var authenticationConfiguration: AuthenticationConfiguration + + @Autowired + lateinit var apiAuthenticationSuccessHandler: AuthenticationSuccessHandler + + @Autowired + lateinit var apiAuthenticationFailureHandler: AuthenticationFailureHandler + + @Bean + fun filterChain(http: HttpSecurity): SecurityFilterChain { + return http + .csrf().disable() + .formLogin().disable() + + .authorizeRequests() + .antMatchers("/auth/members/sign-up").permitAll() + .antMatchers("/test").hasRole("USER") // 임시 인가 테스트용 + .anyRequest().authenticated() + .and() + .addFilterBefore(apiAuthenticationFilter(), UsernamePasswordAuthenticationFilter::class.java) + + .build() + } + + @Bean + fun webSecurityCustomizer(): WebSecurityCustomizer { + return WebSecurityCustomizer { web -> + web.ignoring().requestMatchers(PathRequest.toStaticResources().atCommonLocations()) + web.ignoring().antMatchers("/error") + } + } + + @Bean + fun passwordEncoder(): PasswordEncoder { + return PasswordEncoderFactories.createDelegatingPasswordEncoder() + } + + @Bean + fun apiAuthenticationFilter(): ApiAuthenticationFilter { + return ApiAuthenticationFilter( + AntPathRequestMatcher("/auth/authenticate", HttpMethod.POST.name) + ).apply { + this.setAuthenticationManager(authenticationConfiguration.authenticationManager) + this.setAuthenticationSuccessHandler(apiAuthenticationSuccessHandler) + this.setAuthenticationFailureHandler(apiAuthenticationFailureHandler) + } + } +} \ No newline at end of file diff --git a/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/entity/BaseEntityAuditorAware.kt b/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/entity/BaseEntityAuditorAware.kt new file mode 100644 index 0000000..4d14bb9 --- /dev/null +++ b/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/entity/BaseEntityAuditorAware.kt @@ -0,0 +1,12 @@ +package io.beaniejoy.dongnecafe.common.entity + +import org.springframework.data.domain.AuditorAware +import org.springframework.stereotype.Component +import java.util.* + +@Component +class BaseEntityAuditorAware: AuditorAware { + override fun getCurrentAuditor(): Optional { + return Optional.of("system") + } +} \ No newline at end of file diff --git a/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/security/ApiAuthenticationFilter.kt b/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/security/ApiAuthenticationFilter.kt new file mode 100644 index 0000000..a44a00b --- /dev/null +++ b/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/security/ApiAuthenticationFilter.kt @@ -0,0 +1,53 @@ +package io.beaniejoy.dongnecafe.common.security + +import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper +import io.beaniejoy.dongnecafe.domain.member.model.request.SignInRequest +import org.springframework.http.HttpMethod +import org.springframework.http.MediaType +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken +import org.springframework.security.core.Authentication +import org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter +import org.springframework.security.web.util.matcher.AntPathRequestMatcher +import org.springframework.util.StringUtils +import javax.servlet.http.HttpServletRequest +import javax.servlet.http.HttpServletResponse + +class ApiAuthenticationFilter(requestMatcher: AntPathRequestMatcher) : + AbstractAuthenticationProcessingFilter(requestMatcher) { + + private val objectMapper = jacksonObjectMapper() + + override fun attemptAuthentication( + request: HttpServletRequest, + response: HttpServletResponse, + ): Authentication { + if (isValidRequest(request).not()) { + throw IllegalStateException("request is not supported. check request method and content-type") + } + + val signInRequest = objectMapper.readValue(request.reader, SignInRequest::class.java) + request.setAttribute("email", signInRequest.email) + + val token = signInRequest.let { + if (StringUtils.hasText(it.email).not() || StringUtils.hasText(it.password).not()) { + throw IllegalArgumentException("Email & Password are not empty!!") + } + + UsernamePasswordAuthenticationToken(it.email, it.password) + } + + return authenticationManager.authenticate(token) + } + + private fun isValidRequest(request: HttpServletRequest): Boolean { + if (request.method != HttpMethod.POST.name) { + return false + } + + if (request.contentType != MediaType.APPLICATION_JSON_VALUE) { + return false + } + + return true + } +} \ No newline at end of file diff --git a/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/security/ApiAuthenticationProvider.kt b/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/security/ApiAuthenticationProvider.kt new file mode 100644 index 0000000..0a87acf --- /dev/null +++ b/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/security/ApiAuthenticationProvider.kt @@ -0,0 +1,43 @@ +package io.beaniejoy.dongnecafe.common.security + +import mu.KLogging +import org.springframework.security.authentication.AuthenticationProvider +import org.springframework.security.authentication.BadCredentialsException +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken +import org.springframework.security.core.Authentication +import org.springframework.security.core.userdetails.UserDetailsService +import org.springframework.security.crypto.password.PasswordEncoder +import org.springframework.stereotype.Component + +/** + * 실제 인증 절차 수행 + * @property userDetailsService email로 계정 찾기 + */ +@Component +class ApiAuthenticationProvider( + private val userDetailsService: UserDetailsService, + private val passwordEncoder: PasswordEncoder +) : AuthenticationProvider { + companion object: KLogging() + + override fun authenticate(authentication: Authentication): Authentication { + logger.info { "start authentication" } + + val email = authentication.name + val password = authentication.credentials as String? + + val user = userDetailsService.loadUserByUsername(email) + if (!passwordEncoder.matches(password, user.password)) { + throw BadCredentialsException("Input password does not match stored password") + } + + logger.info { "User password ${user.password}" } + + // password null로 반환 + return UsernamePasswordAuthenticationToken(user, null, user.authorities) + } + + override fun supports(authentication: Class<*>): Boolean { + return UsernamePasswordAuthenticationToken::class.java.isAssignableFrom(authentication) + } +} \ No newline at end of file diff --git a/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/security/handler/ApiAuthenticationFailureHandler.kt b/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/security/handler/ApiAuthenticationFailureHandler.kt new file mode 100644 index 0000000..a129ac0 --- /dev/null +++ b/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/security/handler/ApiAuthenticationFailureHandler.kt @@ -0,0 +1,42 @@ +package io.beaniejoy.dongnecafe.common.security.handler + +import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper +import io.beaniejoy.dongnecafe.common.security.model.AuthenticationResult +import io.beaniejoy.dongnecafe.domain.member.model.request.SignInRequest +import mu.KLogging +import org.springframework.http.HttpStatus +import org.springframework.http.MediaType +import org.springframework.security.core.AuthenticationException +import org.springframework.security.web.authentication.AuthenticationFailureHandler +import org.springframework.stereotype.Component +import javax.servlet.http.HttpServletRequest +import javax.servlet.http.HttpServletResponse + +@Component +class ApiAuthenticationFailureHandler : AuthenticationFailureHandler { + private val objectMapper = jacksonObjectMapper() + + companion object : KLogging() + + override fun onAuthenticationFailure( + request: HttpServletRequest, + response: HttpServletResponse, + exception: AuthenticationException, + ) { + val email = request.getAttribute("email") as String + logger.error { "[AUTH FAILED] $email" } + + response.apply { + this.status = HttpStatus.UNAUTHORIZED.value() + this.contentType = MediaType.APPLICATION_JSON_VALUE + } + + objectMapper.writeValue( + response.writer, + AuthenticationResult( + email = email, + msg = "authentication failed" + ) + ) + } +} \ No newline at end of file diff --git a/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/security/handler/ApiAuthenticationSuccessHandler.kt b/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/security/handler/ApiAuthenticationSuccessHandler.kt new file mode 100644 index 0000000..b57fc47 --- /dev/null +++ b/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/security/handler/ApiAuthenticationSuccessHandler.kt @@ -0,0 +1,43 @@ +package io.beaniejoy.dongnecafe.common.security.handler + +import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper +import io.beaniejoy.dongnecafe.common.security.model.AuthenticationResult +import mu.KLogging +import org.springframework.http.HttpStatus +import org.springframework.http.MediaType +import org.springframework.security.core.Authentication +import org.springframework.security.core.userdetails.User +import org.springframework.security.web.authentication.AuthenticationSuccessHandler +import org.springframework.stereotype.Component +import javax.servlet.http.HttpServletRequest +import javax.servlet.http.HttpServletResponse + +@Component +class ApiAuthenticationSuccessHandler :AuthenticationSuccessHandler { + private val objectMapper = jacksonObjectMapper() + + companion object: KLogging() + + override fun onAuthenticationSuccess( + request: HttpServletRequest, + response: HttpServletResponse, + authentication: Authentication, + ) { + val user = authentication.principal as User + logger.info { "[AUTH SUCCESS] email: ${user.username}, authorities: ${user.authorities}" } + + response.apply { + this.status = HttpStatus.OK.value() + this.contentType = MediaType.APPLICATION_JSON_VALUE + } + + objectMapper.writeValue( + response.writer, + AuthenticationResult( + email = user.username, + authorities = user.authorities, + msg = "authentication success" + ) + ) + } +} \ No newline at end of file diff --git a/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/security/model/AuthenticationResult.kt b/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/security/model/AuthenticationResult.kt new file mode 100644 index 0000000..b5498f1 --- /dev/null +++ b/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/security/model/AuthenticationResult.kt @@ -0,0 +1,11 @@ +package io.beaniejoy.dongnecafe.common.security.model + +import com.fasterxml.jackson.annotation.JsonInclude +import org.springframework.security.core.GrantedAuthority + +data class AuthenticationResult( + val email: String, + @JsonInclude(JsonInclude.Include.NON_EMPTY) + val authorities: Collection = listOf(), + val msg: String +) \ No newline at end of file diff --git a/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/controller/AuthController.kt b/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/controller/AuthController.kt new file mode 100644 index 0000000..29ffd60 --- /dev/null +++ b/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/controller/AuthController.kt @@ -0,0 +1,23 @@ +package io.beaniejoy.dongnecafe.controller + +import io.beaniejoy.dongnecafe.domain.member.model.request.SignInRequest +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder +import org.springframework.web.bind.annotation.PostMapping +import org.springframework.web.bind.annotation.RequestBody +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RestController + +@RestController +@RequestMapping("/auth") +class AuthController( + private val authenticationManagerBuilder: AuthenticationManagerBuilder +) { +// @PostMapping("/authenticate") +// fun signIn(@RequestBody signInRequest: SignInRequest) { +// val authenticationToken = +// UsernamePasswordAuthenticationToken(signInRequest.email, signInRequest.password) +// +// val authenticate = authenticationManagerBuilder.`object`.authenticate(authenticationToken) +// } +} \ No newline at end of file diff --git a/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/controller/MemberController.kt b/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/controller/MemberController.kt new file mode 100644 index 0000000..c367131 --- /dev/null +++ b/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/controller/MemberController.kt @@ -0,0 +1,19 @@ +package io.beaniejoy.dongnecafe.controller + +import io.beaniejoy.dongnecafe.domain.member.model.request.MemberRegisterRequest +import io.beaniejoy.dongnecafe.service.MemberService +import org.springframework.web.bind.annotation.PostMapping +import org.springframework.web.bind.annotation.RequestBody +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RestController + +@RestController +@RequestMapping("/auth/members") +class MemberController( + private val memberService: MemberService +) { + @PostMapping("/sign-up") + fun signUp(@RequestBody resource: MemberRegisterRequest): Long { + return memberService.registerMember(resource) + } +} \ No newline at end of file diff --git a/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/controller/TestController.kt b/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/controller/TestController.kt new file mode 100644 index 0000000..b171393 --- /dev/null +++ b/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/controller/TestController.kt @@ -0,0 +1,13 @@ +package io.beaniejoy.dongnecafe.controller + +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.RestController + +@RestController +class TestController { + + @GetMapping("/test") + fun test(): String { + return "authorize OK!" + } +} \ No newline at end of file diff --git a/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/error/MemberExistedException.kt b/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/error/MemberExistedException.kt new file mode 100644 index 0000000..31d58e1 --- /dev/null +++ b/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/error/MemberExistedException.kt @@ -0,0 +1,3 @@ +package io.beaniejoy.dongnecafe.error + +class MemberExistedException(email: String): RuntimeException("Member[$email] is already existed") \ No newline at end of file diff --git a/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/error/MemberNotActivatedException.kt b/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/error/MemberNotActivatedException.kt new file mode 100644 index 0000000..97bedd5 --- /dev/null +++ b/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/error/MemberNotActivatedException.kt @@ -0,0 +1,3 @@ +package io.beaniejoy.dongnecafe.error + +class MemberDeactivatedException(email: String): RuntimeException("Member[$email] is deactivated") \ No newline at end of file diff --git a/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/service/MemberService.kt b/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/service/MemberService.kt new file mode 100644 index 0000000..f4e11d7 --- /dev/null +++ b/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/service/MemberService.kt @@ -0,0 +1,33 @@ +package io.beaniejoy.dongnecafe.service + +import io.beaniejoy.dongnecafe.domain.member.entity.Member +import io.beaniejoy.dongnecafe.domain.member.model.request.MemberRegisterRequest +import io.beaniejoy.dongnecafe.domain.member.repository.MemberRepository +import io.beaniejoy.dongnecafe.error.MemberExistedException +import org.springframework.security.crypto.password.PasswordEncoder +import org.springframework.stereotype.Service +import org.springframework.transaction.annotation.Transactional + +@Service +@Transactional +class MemberService( + private val memberRepository: MemberRepository, + private val passwordEncoder: PasswordEncoder +) { + fun registerMember(resource: MemberRegisterRequest): Long { + memberRepository.findByEmail(resource.email!!)?.also { + throw MemberExistedException(resource.email!!) + } + + val registeredMember = memberRepository.save( + Member.createMember( + email = resource.email!!, + password = passwordEncoder.encode(resource.password!!), + address = resource.address!!, + phoneNumber = resource.phoneNumber!! + ) + ) + + return registeredMember.id + } +} \ No newline at end of file diff --git a/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/service/UserDetailsServiceImpl.kt b/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/service/UserDetailsServiceImpl.kt new file mode 100644 index 0000000..ac293f9 --- /dev/null +++ b/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/service/UserDetailsServiceImpl.kt @@ -0,0 +1,38 @@ +package io.beaniejoy.dongnecafe.service + +import io.beaniejoy.dongnecafe.domain.member.entity.Member +import io.beaniejoy.dongnecafe.domain.member.repository.MemberRepository +import io.beaniejoy.dongnecafe.error.MemberDeactivatedException +import mu.KLogging +import org.springframework.security.core.authority.SimpleGrantedAuthority +import org.springframework.security.core.userdetails.User +import org.springframework.security.core.userdetails.UserDetails +import org.springframework.security.core.userdetails.UserDetailsService +import org.springframework.security.core.userdetails.UsernameNotFoundException +import org.springframework.stereotype.Component + +@Component("userDetailsService") +class UserDetailsServiceImpl( + private val memberRepository: MemberRepository +) : UserDetailsService { + companion object: KLogging() + + override fun loadUserByUsername(email: String): UserDetails { + return memberRepository.findByEmail(email)?.let { + logger.info { "[LOAD MEMBER] email: ${it.email}, role: ${it.roleType}, activated: ${it.activated}" } + createSecurityUser(it) + } ?: throw UsernameNotFoundException(email) + } + + private fun createSecurityUser(member: Member): User { + if (member.activated.not()) { + throw MemberDeactivatedException(member.email) + } + + return User( + /* username = */ member.email, + /* password = */ member.password, + /* authorities = */ listOf(SimpleGrantedAuthority(member.roleType.name)) + ) + } +} \ No newline at end of file diff --git a/src/main/resources/application-local.yml b/dongne-account-api/src/main/resources/application-local.yml similarity index 100% rename from src/main/resources/application-local.yml rename to dongne-account-api/src/main/resources/application-local.yml diff --git a/dongne-account-api/src/main/resources/application.yml b/dongne-account-api/src/main/resources/application.yml new file mode 100644 index 0000000..91aa6e4 --- /dev/null +++ b/dongne-account-api/src/main/resources/application.yml @@ -0,0 +1,27 @@ +spring: + profiles: + active: local + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + jpa: + hibernate: + ddl-auto: none # use [service-api] flyway migration + properties: + hibernate: + dialect: org.hibernate.dialect.MySQL5InnoDBDialect + format_sql: true + show-sql: false + open-in-view: + flyway: + enabled: false + devtools: + livereload: + enabled: false # no use devtools' LiveReload Server + +server: + port: 9090 + +logging: + level: + org.hibernate.SQL: debug # logger 통해 로깅 + # org.hibernate.type: trace \ No newline at end of file diff --git a/src/test/java/io/beaniejoy/dongnecafe/DongneCafeSirenOrderApplicationTests.kt b/dongne-account-api/src/test/kotlin/io/beaniejoy/dongnecafe/DongneAccountApiApplicationTests.kt similarity index 77% rename from src/test/java/io/beaniejoy/dongnecafe/DongneCafeSirenOrderApplicationTests.kt rename to dongne-account-api/src/test/kotlin/io/beaniejoy/dongnecafe/DongneAccountApiApplicationTests.kt index 7196f01..d80294f 100644 --- a/src/test/java/io/beaniejoy/dongnecafe/DongneCafeSirenOrderApplicationTests.kt +++ b/dongne-account-api/src/test/kotlin/io/beaniejoy/dongnecafe/DongneAccountApiApplicationTests.kt @@ -4,7 +4,7 @@ import org.junit.jupiter.api.Test import org.springframework.boot.test.context.SpringBootTest @SpringBootTest -internal class DongneCafeSirenOrderApplicationTests { +internal class DongneAccountApiApplicationTests { @Test fun contextLoads() { diff --git a/dongne-common/build.gradle.kts b/dongne-common/build.gradle.kts new file mode 100644 index 0000000..8324f5a --- /dev/null +++ b/dongne-common/build.gradle.kts @@ -0,0 +1,19 @@ +import org.springframework.boot.gradle.tasks.bundling.BootJar + +val jar: Jar by tasks +val bootJar: BootJar by tasks + +bootJar.enabled = false +jar.enabled = true + +allOpen { + annotation("javax.persistence.Entity") + annotation("javax.persistence.Embeddable") + annotation("javax.persistence.MappedSuperclass") +} + +noArg { + annotation("javax.persistence.Entity") + annotation("javax.persistence.Embeddable") + annotation("javax.persistence.MappedSuperclass") +} \ No newline at end of file diff --git a/src/main/java/io/beaniejoy/dongnecafe/common/entity/BaseTimeEntity.kt b/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/common/BaseTimeEntity.kt similarity index 94% rename from src/main/java/io/beaniejoy/dongnecafe/common/entity/BaseTimeEntity.kt rename to dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/common/BaseTimeEntity.kt index bc366e1..b5c4ab1 100644 --- a/src/main/java/io/beaniejoy/dongnecafe/common/entity/BaseTimeEntity.kt +++ b/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/common/BaseTimeEntity.kt @@ -1,4 +1,4 @@ -package io.beaniejoy.dongnecafe.common.entity +package io.beaniejoy.dongnecafe.common import org.springframework.data.annotation.CreatedBy import org.springframework.data.annotation.CreatedDate diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/Cafe.kt b/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/entity/Cafe.kt similarity index 97% rename from src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/Cafe.kt rename to dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/entity/Cafe.kt index c3a11b2..7196bfe 100644 --- a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/Cafe.kt +++ b/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/entity/Cafe.kt @@ -1,6 +1,6 @@ package io.beaniejoy.dongnecafe.domain.cafe.entity -import io.beaniejoy.dongnecafe.common.entity.BaseTimeEntity +import io.beaniejoy.dongnecafe.common.BaseTimeEntity import io.beaniejoy.dongnecafe.domain.cafe.model.request.CafeMenuRegisterRequest import javax.persistence.* diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/CafeImage.kt b/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/entity/CafeImage.kt similarity index 88% rename from src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/CafeImage.kt rename to dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/entity/CafeImage.kt index e90c349..22a0a8c 100644 --- a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/CafeImage.kt +++ b/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/entity/CafeImage.kt @@ -1,6 +1,6 @@ package io.beaniejoy.dongnecafe.domain.cafe.entity -import io.beaniejoy.dongnecafe.common.entity.BaseTimeEntity +import io.beaniejoy.dongnecafe.common.BaseTimeEntity import javax.persistence.* @Entity diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/CafeMenu.kt b/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/entity/CafeMenu.kt similarity index 97% rename from src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/CafeMenu.kt rename to dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/entity/CafeMenu.kt index 92b8299..d2b4bcb 100644 --- a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/CafeMenu.kt +++ b/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/entity/CafeMenu.kt @@ -1,6 +1,6 @@ package io.beaniejoy.dongnecafe.domain.cafe.entity -import io.beaniejoy.dongnecafe.common.entity.BaseTimeEntity +import io.beaniejoy.dongnecafe.common.BaseTimeEntity import io.beaniejoy.dongnecafe.domain.cafe.model.request.MenuOptionRegisterRequest import java.math.BigDecimal import javax.persistence.* diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/MenuOption.kt b/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/entity/MenuOption.kt similarity index 96% rename from src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/MenuOption.kt rename to dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/entity/MenuOption.kt index e63795a..8072dbd 100644 --- a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/MenuOption.kt +++ b/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/entity/MenuOption.kt @@ -1,6 +1,6 @@ package io.beaniejoy.dongnecafe.domain.cafe.entity -import io.beaniejoy.dongnecafe.common.entity.BaseTimeEntity +import io.beaniejoy.dongnecafe.common.BaseTimeEntity import io.beaniejoy.dongnecafe.domain.cafe.model.request.OptionDetailRegisterRequest import javax.persistence.* diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/OptionDetail.kt b/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/entity/OptionDetail.kt similarity index 95% rename from src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/OptionDetail.kt rename to dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/entity/OptionDetail.kt index 6bf8b70..a97c7c4 100644 --- a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/OptionDetail.kt +++ b/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/entity/OptionDetail.kt @@ -1,6 +1,6 @@ package io.beaniejoy.dongnecafe.domain.cafe.entity -import io.beaniejoy.dongnecafe.common.entity.BaseTimeEntity +import io.beaniejoy.dongnecafe.common.BaseTimeEntity import java.math.BigDecimal import javax.persistence.* diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/request/CafeMenuBulkDeleteRequest.kt b/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/model/request/CafeMenuBulkDeleteRequest.kt similarity index 100% rename from src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/request/CafeMenuBulkDeleteRequest.kt rename to dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/model/request/CafeMenuBulkDeleteRequest.kt diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/request/CafeMenuRegisterRequest.kt b/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/model/request/CafeMenuRegisterRequest.kt similarity index 100% rename from src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/request/CafeMenuRegisterRequest.kt rename to dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/model/request/CafeMenuRegisterRequest.kt diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/request/CafeMenuUpdateRequest.kt b/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/model/request/CafeMenuUpdateRequest.kt similarity index 100% rename from src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/request/CafeMenuUpdateRequest.kt rename to dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/model/request/CafeMenuUpdateRequest.kt diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/request/CafeRegisterRequest.kt b/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/model/request/CafeRegisterRequest.kt similarity index 100% rename from src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/request/CafeRegisterRequest.kt rename to dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/model/request/CafeRegisterRequest.kt diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/request/CafeUpdateRequest.kt b/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/model/request/CafeUpdateRequest.kt similarity index 100% rename from src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/request/CafeUpdateRequest.kt rename to dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/model/request/CafeUpdateRequest.kt diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/request/MenuOptionRegisterRequest.kt b/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/model/request/MenuOptionRegisterRequest.kt similarity index 100% rename from src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/request/MenuOptionRegisterRequest.kt rename to dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/model/request/MenuOptionRegisterRequest.kt diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/request/MenuOptionUpdateRequest.kt b/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/model/request/MenuOptionUpdateRequest.kt similarity index 100% rename from src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/request/MenuOptionUpdateRequest.kt rename to dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/model/request/MenuOptionUpdateRequest.kt diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/response/CafeDetailedInfo.kt b/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/model/response/CafeDetailedInfo.kt similarity index 100% rename from src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/response/CafeDetailedInfo.kt rename to dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/model/response/CafeDetailedInfo.kt diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/response/CafeImageInfo.kt b/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/model/response/CafeImageInfo.kt similarity index 100% rename from src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/response/CafeImageInfo.kt rename to dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/model/response/CafeImageInfo.kt diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/response/CafeMenuDetailedInfo.kt b/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/model/response/CafeMenuDetailedInfo.kt similarity index 100% rename from src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/response/CafeMenuDetailedInfo.kt rename to dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/model/response/CafeMenuDetailedInfo.kt diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/response/CafeMenuInfo.kt b/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/model/response/CafeMenuInfo.kt similarity index 100% rename from src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/response/CafeMenuInfo.kt rename to dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/model/response/CafeMenuInfo.kt diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/response/CafeSearchInfo.kt b/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/model/response/CafeSearchInfo.kt similarity index 100% rename from src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/response/CafeSearchInfo.kt rename to dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/model/response/CafeSearchInfo.kt diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/response/MenuOptionInfo.kt b/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/model/response/MenuOptionInfo.kt similarity index 100% rename from src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/response/MenuOptionInfo.kt rename to dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/model/response/MenuOptionInfo.kt diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/response/OptionDetailInfo.kt b/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/model/response/OptionDetailInfo.kt similarity index 100% rename from src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/response/OptionDetailInfo.kt rename to dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/model/response/OptionDetailInfo.kt diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/repository/CafeMenuRepository.kt b/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/repository/CafeMenuRepository.kt similarity index 100% rename from src/main/java/io/beaniejoy/dongnecafe/domain/cafe/repository/CafeMenuRepository.kt rename to dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/repository/CafeMenuRepository.kt diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/repository/CafeRepository.kt b/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/repository/CafeRepository.kt similarity index 100% rename from src/main/java/io/beaniejoy/dongnecafe/domain/cafe/repository/CafeRepository.kt rename to dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/repository/CafeRepository.kt diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/repository/MenuOptionRepository.kt b/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/repository/MenuOptionRepository.kt similarity index 100% rename from src/main/java/io/beaniejoy/dongnecafe/domain/cafe/repository/MenuOptionRepository.kt rename to dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/repository/MenuOptionRepository.kt diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/repository/OptionDetailRepository.kt b/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/repository/OptionDetailRepository.kt similarity index 100% rename from src/main/java/io/beaniejoy/dongnecafe/domain/cafe/repository/OptionDetailRepository.kt rename to dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/repository/OptionDetailRepository.kt diff --git a/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/member/constant/RoleType.kt b/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/member/constant/RoleType.kt new file mode 100644 index 0000000..4130db2 --- /dev/null +++ b/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/member/constant/RoleType.kt @@ -0,0 +1,8 @@ +package io.beaniejoy.dongnecafe.domain.member.constant + +enum class RoleType(val value: String) { + ROLE_ADMIN("어드민 관리자"), + ROLE_USER("일반 사용자"), + ROLE_OWNER("카페 관리자"); + ; +} \ No newline at end of file diff --git a/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/member/entity/Member.kt b/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/member/entity/Member.kt new file mode 100644 index 0000000..4c4f235 --- /dev/null +++ b/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/member/entity/Member.kt @@ -0,0 +1,60 @@ +package io.beaniejoy.dongnecafe.domain.member.entity + +import io.beaniejoy.dongnecafe.common.BaseTimeEntity +import io.beaniejoy.dongnecafe.domain.member.constant.RoleType +import javax.persistence.* + +@Entity +@Table(name = "member") +class Member( + email: String, + password: String, + address: String, + phoneNumber: String +): BaseTimeEntity() { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "member_id", nullable = false) + val id: Long = 0L + + @Column(name = "email", nullable = false) + var email: String = email + protected set + + @Column(name = "password", nullable = false) + var password: String = password + protected set + + @Column(name = "address", nullable = false) + var address: String = address + protected set + + @Column(name = "phone_number", nullable = false) + var phoneNumber: String = phoneNumber + protected set + + @Enumerated(EnumType.STRING) + @Column(name = "role_type", nullable = false) + var roleType: RoleType = RoleType.ROLE_USER + protected set + + @Column(name = "activated", nullable = false) + var activated: Boolean = true + protected set + + companion object { + fun createMember( + email: String, + password: String, + address: String, + phoneNumber: String + ): Member { + return Member( + email = email, + password = password, + address = address, + phoneNumber = phoneNumber + ) + } + } +} \ No newline at end of file diff --git a/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/member/model/request/MemberRegisterRequest.kt b/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/member/model/request/MemberRegisterRequest.kt new file mode 100644 index 0000000..4563621 --- /dev/null +++ b/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/member/model/request/MemberRegisterRequest.kt @@ -0,0 +1,8 @@ +package io.beaniejoy.dongnecafe.domain.member.model.request + +class MemberRegisterRequest( + val email: String? = null, + val password: String? = null, + val address: String? = null, + val phoneNumber: String? = null +) \ No newline at end of file diff --git a/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/member/model/request/SignInRequest.kt b/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/member/model/request/SignInRequest.kt new file mode 100644 index 0000000..c81a07e --- /dev/null +++ b/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/member/model/request/SignInRequest.kt @@ -0,0 +1,6 @@ +package io.beaniejoy.dongnecafe.domain.member.model.request + +data class SignInRequest( + val email: String, + val password: String +) \ No newline at end of file diff --git a/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/member/repository/MemberRepository.kt b/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/member/repository/MemberRepository.kt new file mode 100644 index 0000000..911dcb3 --- /dev/null +++ b/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/domain/member/repository/MemberRepository.kt @@ -0,0 +1,8 @@ +package io.beaniejoy.dongnecafe.domain.member.repository + +import io.beaniejoy.dongnecafe.domain.member.entity.Member +import org.springframework.data.jpa.repository.JpaRepository + +interface MemberRepository : JpaRepository { + fun findByEmail(email: String): Member? +} \ No newline at end of file diff --git a/dongne-service-api/build.gradle.kts b/dongne-service-api/build.gradle.kts new file mode 100644 index 0000000..ea96773 --- /dev/null +++ b/dongne-service-api/build.gradle.kts @@ -0,0 +1,3 @@ +dependencies { + implementation(project(":dongne-common")) +} \ No newline at end of file diff --git a/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/DongneServiceApiApplication.kt b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/DongneServiceApiApplication.kt new file mode 100644 index 0000000..19d2072 --- /dev/null +++ b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/DongneServiceApiApplication.kt @@ -0,0 +1,11 @@ +package io.beaniejoy.dongnecafe + +import org.springframework.boot.autoconfigure.SpringBootApplication +import org.springframework.boot.runApplication + +@SpringBootApplication +class DongneServiceApiApplication + +fun main(args: Array) { + runApplication(*args) +} \ No newline at end of file diff --git a/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/config/AuditingConfig.kt b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/config/AuditingConfig.kt new file mode 100644 index 0000000..9adc473 --- /dev/null +++ b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/config/AuditingConfig.kt @@ -0,0 +1,8 @@ +package io.beaniejoy.dongnecafe.common.config + +import org.springframework.context.annotation.Configuration +import org.springframework.data.jpa.repository.config.EnableJpaAuditing + +@Configuration +@EnableJpaAuditing +class AuditingConfig \ No newline at end of file diff --git a/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/config/SecurityConfig.kt b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/config/SecurityConfig.kt new file mode 100644 index 0000000..9dcf6be --- /dev/null +++ b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/config/SecurityConfig.kt @@ -0,0 +1,34 @@ +package io.beaniejoy.dongnecafe.common.config + +import org.springframework.boot.autoconfigure.security.servlet.PathRequest +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Configuration +import org.springframework.security.config.annotation.web.builders.HttpSecurity +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity +import org.springframework.security.config.annotation.web.configuration.WebSecurityCustomizer +import org.springframework.security.web.SecurityFilterChain + +@Configuration +@EnableWebSecurity +class SecurityConfig { + @Bean + fun filterChain(http: HttpSecurity): SecurityFilterChain { + return http + .csrf().disable() + .formLogin().disable() + + .authorizeRequests() + .anyRequest().authenticated() // 임시 허용 + + .and() + .build() + } + + @Bean + fun webSecurityCustomizer(): WebSecurityCustomizer { + return WebSecurityCustomizer { web -> + web.ignoring().requestMatchers(PathRequest.toStaticResources().atCommonLocations()) + web.ignoring().antMatchers("/error") + } + } +} \ No newline at end of file diff --git a/src/main/java/io/beaniejoy/dongnecafe/common/entity/BaseEntityAuditorAware.kt b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/entity/BaseEntityAuditorAware.kt similarity index 100% rename from src/main/java/io/beaniejoy/dongnecafe/common/entity/BaseEntityAuditorAware.kt rename to dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/entity/BaseEntityAuditorAware.kt diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/controller/CafeController.kt b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/controller/CafeController.kt similarity index 98% rename from src/main/java/io/beaniejoy/dongnecafe/domain/cafe/controller/CafeController.kt rename to dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/controller/CafeController.kt index 8f12999..f9b9bc1 100644 --- a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/controller/CafeController.kt +++ b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/controller/CafeController.kt @@ -12,7 +12,7 @@ import org.springframework.data.web.PageableDefault import org.springframework.web.bind.annotation.* @RestController -@RequestMapping("/cafes") +@RequestMapping("/api/cafes") class CafeController( private val cafeService: CafeService ) { diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/controller/CafeMenuController.kt b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/controller/CafeMenuController.kt similarity index 98% rename from src/main/java/io/beaniejoy/dongnecafe/domain/cafe/controller/CafeMenuController.kt rename to dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/controller/CafeMenuController.kt index 7603af0..4e41697 100644 --- a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/controller/CafeMenuController.kt +++ b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/controller/CafeMenuController.kt @@ -13,7 +13,7 @@ import org.springframework.web.bind.annotation.RequestMapping import org.springframework.web.bind.annotation.RestController @RestController -@RequestMapping("/cafes/{cafeId}/menus") +@RequestMapping("/api/cafes/{cafeId}/menus") class CafeMenuController( private val cafeMenuService: CafeMenuService ) { diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/error/CafeExceptionHandler.kt b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/error/CafeExceptionHandler.kt similarity index 100% rename from src/main/java/io/beaniejoy/dongnecafe/domain/cafe/error/CafeExceptionHandler.kt rename to dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/error/CafeExceptionHandler.kt diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/error/CafeExistedException.kt b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/error/CafeExistedException.kt similarity index 100% rename from src/main/java/io/beaniejoy/dongnecafe/domain/cafe/error/CafeExistedException.kt rename to dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/error/CafeExistedException.kt diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/error/CafeMenuNotFoundException.kt b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/error/CafeMenuNotFoundException.kt similarity index 100% rename from src/main/java/io/beaniejoy/dongnecafe/domain/cafe/error/CafeMenuNotFoundException.kt rename to dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/error/CafeMenuNotFoundException.kt diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/error/CafeNotFoundException.kt b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/error/CafeNotFoundException.kt similarity index 100% rename from src/main/java/io/beaniejoy/dongnecafe/domain/cafe/error/CafeNotFoundException.kt rename to dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/error/CafeNotFoundException.kt diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/error/MenuOptionNotFoundException.kt b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/error/MenuOptionNotFoundException.kt similarity index 100% rename from src/main/java/io/beaniejoy/dongnecafe/domain/cafe/error/MenuOptionNotFoundException.kt rename to dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/error/MenuOptionNotFoundException.kt diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/error/OptionDetailNotFoundException.kt b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/error/OptionDetailNotFoundException.kt similarity index 100% rename from src/main/java/io/beaniejoy/dongnecafe/domain/cafe/error/OptionDetailNotFoundException.kt rename to dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/error/OptionDetailNotFoundException.kt diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeMenuService.kt b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/CafeMenuService.kt similarity index 100% rename from src/main/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeMenuService.kt rename to dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/CafeMenuService.kt diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeService.kt b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/CafeService.kt similarity index 100% rename from src/main/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeService.kt rename to dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/CafeService.kt diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/service/MenuOptionService.kt b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/MenuOptionService.kt similarity index 100% rename from src/main/java/io/beaniejoy/dongnecafe/domain/cafe/service/MenuOptionService.kt rename to dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/MenuOptionService.kt diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/service/OptionDetailService.kt b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/OptionDetailService.kt similarity index 100% rename from src/main/java/io/beaniejoy/dongnecafe/domain/cafe/service/OptionDetailService.kt rename to dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/OptionDetailService.kt diff --git a/dongne-service-api/src/main/resources/application-local.yml b/dongne-service-api/src/main/resources/application-local.yml new file mode 100644 index 0000000..0a4ee95 --- /dev/null +++ b/dongne-service-api/src/main/resources/application-local.yml @@ -0,0 +1,5 @@ +spring: + datasource: + url: jdbc:mysql://localhost:3306/dongne?autoreconnect=true&characterEncoding=utf8&serverTimezone=Asia/Seoul + username: root + password: beaniejoy # TODO 추후 보안에 대해 생각해보기 diff --git a/src/main/resources/application.yml b/dongne-service-api/src/main/resources/application.yml similarity index 81% rename from src/main/resources/application.yml rename to dongne-service-api/src/main/resources/application.yml index 436480a..eea384a 100644 --- a/src/main/resources/application.yml +++ b/dongne-service-api/src/main/resources/application.yml @@ -13,8 +13,11 @@ spring: show-sql: false flyway: baseline-on-migrate: true - baseline-version: 0 + baseline-version: "000" locations: classpath:db/migration,classpath:db/seed + devtools: + livereload: + enabled: false # no use devtools' LiveReload Server logging: level: diff --git a/src/main/resources/db/migration/V1__Delete_all_tables_if_exists.sql b/dongne-service-api/src/main/resources/db/migration/V001__Delete_all_tables_if_exists.sql similarity index 100% rename from src/main/resources/db/migration/V1__Delete_all_tables_if_exists.sql rename to dongne-service-api/src/main/resources/db/migration/V001__Delete_all_tables_if_exists.sql diff --git a/src/main/resources/db/migration/V2__Create_cafe.sql b/dongne-service-api/src/main/resources/db/migration/V002__Create_cafe.sql similarity index 100% rename from src/main/resources/db/migration/V2__Create_cafe.sql rename to dongne-service-api/src/main/resources/db/migration/V002__Create_cafe.sql diff --git a/src/main/resources/db/migration/V3__Create_cafe_menu.sql b/dongne-service-api/src/main/resources/db/migration/V003__Create_cafe_menu.sql similarity index 100% rename from src/main/resources/db/migration/V3__Create_cafe_menu.sql rename to dongne-service-api/src/main/resources/db/migration/V003__Create_cafe_menu.sql diff --git a/src/main/resources/db/migration/V4__Create_cafe_image.sql b/dongne-service-api/src/main/resources/db/migration/V004__Create_cafe_image.sql similarity index 100% rename from src/main/resources/db/migration/V4__Create_cafe_image.sql rename to dongne-service-api/src/main/resources/db/migration/V004__Create_cafe_image.sql diff --git a/src/main/resources/db/migration/V5__Create_menu_option.sql b/dongne-service-api/src/main/resources/db/migration/V005__Create_menu_option.sql similarity index 100% rename from src/main/resources/db/migration/V5__Create_menu_option.sql rename to dongne-service-api/src/main/resources/db/migration/V005__Create_menu_option.sql diff --git a/src/main/resources/db/migration/V6__Create_option_detail.sql b/dongne-service-api/src/main/resources/db/migration/V006__Create_option_detail.sql similarity index 100% rename from src/main/resources/db/migration/V6__Create_option_detail.sql rename to dongne-service-api/src/main/resources/db/migration/V006__Create_option_detail.sql diff --git a/src/main/resources/db/migration/V7__Alter_all_tables_pk_fk.sql b/dongne-service-api/src/main/resources/db/migration/V007__Alter_all_tables_pk_fk.sql similarity index 100% rename from src/main/resources/db/migration/V7__Alter_all_tables_pk_fk.sql rename to dongne-service-api/src/main/resources/db/migration/V007__Alter_all_tables_pk_fk.sql diff --git a/dongne-service-api/src/main/resources/db/migration/V008__Create_member.sql b/dongne-service-api/src/main/resources/db/migration/V008__Create_member.sql new file mode 100644 index 0000000..e3fad2f --- /dev/null +++ b/dongne-service-api/src/main/resources/db/migration/V008__Create_member.sql @@ -0,0 +1,14 @@ +CREATE TABLE `member` ( + `member_id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '회원 ID', + `email` varchar(20) NOT NULL COMMENT '계정 이메일', + `password` varchar(255) NOT NULL COMMENT '비밀번호', + `address` varchar(100) NOT NULL COMMENT '회원 주소', + `phone_number` varchar(11) NOT NULL COMMENT '회원 전화번호', + `role_type` varchar(20) COMMENT '회원 권한', + `activated` tinyint(1) NOT NULL COMMENT '계정 활성화 여부', + `created_at` datetime NOT NULL COMMENT '회원 등록날짜', + `created_by` varchar(20) NOT NULL COMMENT '회원 등록자', + `updated_at` datetime NULL COMMENT '회원 변경날짜', + `updated_by` varchar(20) NULL COMMENT '회원 변경자', + PRIMARY KEY (`member_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; \ No newline at end of file diff --git a/src/main/resources/db/seed/R__Insert_Seed_cafe.sql b/dongne-service-api/src/main/resources/db/seed/R__Insert_Seed_cafe.sql similarity index 100% rename from src/main/resources/db/seed/R__Insert_Seed_cafe.sql rename to dongne-service-api/src/main/resources/db/seed/R__Insert_Seed_cafe.sql diff --git a/src/main/resources/db/seed/R__Insert_Seed_cafe_image.sql b/dongne-service-api/src/main/resources/db/seed/R__Insert_Seed_cafe_image.sql similarity index 100% rename from src/main/resources/db/seed/R__Insert_Seed_cafe_image.sql rename to dongne-service-api/src/main/resources/db/seed/R__Insert_Seed_cafe_image.sql diff --git a/src/main/resources/db/seed/R__Insert_Seed_cafe_menu.sql b/dongne-service-api/src/main/resources/db/seed/R__Insert_Seed_cafe_menu.sql similarity index 100% rename from src/main/resources/db/seed/R__Insert_Seed_cafe_menu.sql rename to dongne-service-api/src/main/resources/db/seed/R__Insert_Seed_cafe_menu.sql diff --git a/src/main/resources/db/seed/R__Insert_Seed_menu_option.sql b/dongne-service-api/src/main/resources/db/seed/R__Insert_Seed_menu_option.sql similarity index 100% rename from src/main/resources/db/seed/R__Insert_Seed_menu_option.sql rename to dongne-service-api/src/main/resources/db/seed/R__Insert_Seed_menu_option.sql diff --git a/src/main/resources/db/seed/R__Insert_Seed_option_detail.sql b/dongne-service-api/src/main/resources/db/seed/R__Insert_Seed_option_detail.sql similarity index 100% rename from src/main/resources/db/seed/R__Insert_Seed_option_detail.sql rename to dongne-service-api/src/main/resources/db/seed/R__Insert_Seed_option_detail.sql diff --git a/dongne-service-api/src/test/kotlin/io/beaniejoy/dongnecafe/DongneServiceApiApplicationTests.kt b/dongne-service-api/src/test/kotlin/io/beaniejoy/dongnecafe/DongneServiceApiApplicationTests.kt new file mode 100644 index 0000000..1a4ce70 --- /dev/null +++ b/dongne-service-api/src/test/kotlin/io/beaniejoy/dongnecafe/DongneServiceApiApplicationTests.kt @@ -0,0 +1,12 @@ +package io.beaniejoy.dongnecafe + +import org.junit.jupiter.api.Test +import org.springframework.boot.test.context.SpringBootTest + +@SpringBootTest +internal class DongneServiceApiApplicationTests { + + @Test + fun contextLoads() { + } +} \ No newline at end of file diff --git a/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/entity/CafeTest.kt b/dongne-service-api/src/test/kotlin/io/beaniejoy/dongnecafe/domain/cafe/entity/CafeTest.kt similarity index 100% rename from src/test/java/io/beaniejoy/dongnecafe/domain/cafe/entity/CafeTest.kt rename to dongne-service-api/src/test/kotlin/io/beaniejoy/dongnecafe/domain/cafe/entity/CafeTest.kt diff --git a/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/repository/CafeRepositoryTest.kt b/dongne-service-api/src/test/kotlin/io/beaniejoy/dongnecafe/domain/cafe/repository/CafeRepositoryTest.kt similarity index 100% rename from src/test/java/io/beaniejoy/dongnecafe/domain/cafe/repository/CafeRepositoryTest.kt rename to dongne-service-api/src/test/kotlin/io/beaniejoy/dongnecafe/domain/cafe/repository/CafeRepositoryTest.kt diff --git a/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeMenuServiceIntegratedTest.kt b/dongne-service-api/src/test/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/CafeMenuServiceIntegratedTest.kt similarity index 90% rename from src/test/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeMenuServiceIntegratedTest.kt rename to dongne-service-api/src/test/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/CafeMenuServiceIntegratedTest.kt index 59b9b89..5746790 100644 --- a/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeMenuServiceIntegratedTest.kt +++ b/dongne-service-api/src/test/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/CafeMenuServiceIntegratedTest.kt @@ -1,6 +1,8 @@ package io.beaniejoy.dongnecafe.domain.cafe.service -import io.beaniejoy.dongnecafe.domain.cafe.model.request.* +import io.beaniejoy.dongnecafe.domain.cafe.model.request.CafeMenuUpdateRequest +import io.beaniejoy.dongnecafe.domain.cafe.model.request.MenuOptionUpdateRequest +import io.beaniejoy.dongnecafe.domain.cafe.model.request.OptionDetailUpdateRequest import io.beaniejoy.dongnecafe.domain.cafe.utils.CafeTestUtils import org.junit.jupiter.api.Test import org.springframework.beans.factory.annotation.Autowired diff --git a/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeMenuServiceTest.kt b/dongne-service-api/src/test/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/CafeMenuServiceTest.kt similarity index 100% rename from src/test/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeMenuServiceTest.kt rename to dongne-service-api/src/test/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/CafeMenuServiceTest.kt diff --git a/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeServiceTest.kt b/dongne-service-api/src/test/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/CafeServiceTest.kt similarity index 97% rename from src/test/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeServiceTest.kt rename to dongne-service-api/src/test/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/CafeServiceTest.kt index 6855a8c..5e5247d 100644 --- a/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeServiceTest.kt +++ b/dongne-service-api/src/test/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/CafeServiceTest.kt @@ -98,7 +98,7 @@ internal class CafeServiceTest { // TODO 'findByIdOrNull'은 kotlin test 라이브러리 필요한 듯 val mockCafe = mock(Cafe::class.java) - doReturn(Optional.of(cafe)).`when`(mockCafeRepository.findById(eq(cafeId))) + `when`(mockCafeRepository.findById(cafeId)).thenReturn(Optional.of(mockCafe)) doNothing().`when`(mockCafe).updateInfo( name = anyString(), @@ -109,7 +109,7 @@ internal class CafeServiceTest { // when mockCafeService.updateInfo( - id = eq(cafeId), + id = cafeId, name = "updated_name", address = "updated_address", phoneNumber = "updated_phoneNumber", diff --git a/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/utils/CafeMenuTestUtils.kt b/dongne-service-api/src/test/kotlin/io/beaniejoy/dongnecafe/domain/cafe/utils/CafeMenuTestUtils.kt similarity index 100% rename from src/test/java/io/beaniejoy/dongnecafe/domain/cafe/utils/CafeMenuTestUtils.kt rename to dongne-service-api/src/test/kotlin/io/beaniejoy/dongnecafe/domain/cafe/utils/CafeMenuTestUtils.kt diff --git a/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/utils/CafeTestUtils.kt b/dongne-service-api/src/test/kotlin/io/beaniejoy/dongnecafe/domain/cafe/utils/CafeTestUtils.kt similarity index 78% rename from src/test/java/io/beaniejoy/dongnecafe/domain/cafe/utils/CafeTestUtils.kt rename to dongne-service-api/src/test/kotlin/io/beaniejoy/dongnecafe/domain/cafe/utils/CafeTestUtils.kt index 66d3d2a..449b7d2 100644 --- a/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/utils/CafeTestUtils.kt +++ b/dongne-service-api/src/test/kotlin/io/beaniejoy/dongnecafe/domain/cafe/utils/CafeTestUtils.kt @@ -1,15 +1,8 @@ package io.beaniejoy.dongnecafe.domain.cafe.utils import io.beaniejoy.dongnecafe.domain.cafe.model.request.CafeRegisterRequest -import io.beaniejoy.dongnecafe.domain.cafe.model.request.CafeMenuRegisterRequest -import io.beaniejoy.dongnecafe.domain.cafe.model.request.MenuOptionRegisterRequest -import io.beaniejoy.dongnecafe.domain.cafe.model.request.OptionDetailRegisterRequest import io.beaniejoy.dongnecafe.domain.cafe.entity.Cafe -import io.beaniejoy.dongnecafe.domain.cafe.entity.CafeMenu -import io.beaniejoy.dongnecafe.domain.cafe.entity.MenuOption -import io.beaniejoy.dongnecafe.domain.cafe.entity.OptionDetail import org.junit.jupiter.api.Assertions.* -import java.math.BigDecimal import javax.persistence.GeneratedValue class CafeTestUtils { diff --git a/src/test/resources/application.yml b/dongne-service-api/src/test/resources/application.yml similarity index 100% rename from src/test/resources/application.yml rename to dongne-service-api/src/test/resources/application.yml diff --git a/settings.gradle b/settings.gradle deleted file mode 100644 index b005d83..0000000 --- a/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -rootProject.name = 'dongne-cafe-api' diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 0000000..a1387d1 --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,4 @@ +rootProject.name = "dongne-cafe-api" +include("dongne-common") +include("dongne-service-api") +include("dongne-account-api")