Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Refactor] Java -> Kotlin으로 전환한다 - Member Api Layer #177

Merged
merged 10 commits into from
Feb 26, 2024
Merged
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@ package com.koddy.server.admin.controller

import com.koddy.server.admin.service.DummyAccountLoginService
import com.koddy.server.admin.utils.NotProvidedInProduction
import com.koddy.server.auth.domain.model.AuthMember
import com.koddy.server.auth.domain.model.AuthToken
import com.koddy.server.auth.utils.TokenResponseWriter
import com.koddy.server.member.domain.model.Email
import jakarta.servlet.http.HttpServletResponse
import jakarta.validation.constraints.NotBlank
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.PostMapping
Expand All @@ -15,6 +17,7 @@ import org.springframework.web.bind.annotation.RestController
@RequestMapping("/api/auth/dummy/login")
class DummyAccountLoginApi(
private val dummyAccountLoginService: DummyAccountLoginService,
private val tokenResponseWriter: TokenResponseWriter,
) {
data class LoginRequest(
@field:NotBlank(message = "이메일은 필수입니다.")
Expand All @@ -28,8 +31,10 @@ class DummyAccountLoginApi(
@NotProvidedInProduction
fun login(
@RequestBody request: LoginRequest,
): ResponseEntity<AuthMember> {
val authMember: AuthMember = dummyAccountLoginService.invoke(Email.from(request.email), request.password)
return ResponseEntity.ok(authMember)
response: HttpServletResponse,
): ResponseEntity<Void> {
val authToken: AuthToken = dummyAccountLoginService.invoke(Email.from(request.email), request.password)
tokenResponseWriter.applyToken(response, authToken)
return ResponseEntity.ok().build()
}
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
package com.koddy.server.admin.service

import com.koddy.server.auth.domain.model.AuthMember
import com.koddy.server.auth.domain.model.AuthToken
import com.koddy.server.auth.domain.service.TokenIssuer
import com.koddy.server.global.annotation.UseCase
import com.koddy.server.member.domain.model.Email
import com.koddy.server.member.domain.model.Member
import com.koddy.server.member.domain.repository.MemberRepository
import com.koddy.server.member.exception.MemberException
import com.koddy.server.member.exception.MemberExceptionCode
import com.koddy.server.member.exception.MemberExceptionCode.MEMBER_NOT_FOUND
import org.springframework.beans.factory.annotation.Value

@UseCase
Expand All @@ -20,15 +19,14 @@ class DummyAccountLoginService(
fun invoke(
email: Email,
password: String,
): AuthMember {
): AuthToken {
val member: Member<*> = memberRepository.findByPlatformEmail(email)
.orElseThrow { MemberException(MemberExceptionCode.MEMBER_NOT_FOUND) }
.orElseThrow { MemberException(MEMBER_NOT_FOUND) }

if (dummyAccountPassword != password) {
throw MemberException(MemberExceptionCode.MEMBER_NOT_FOUND)
throw MemberException(MEMBER_NOT_FOUND)
}

val authToken: AuthToken = tokenIssuer.provideAuthorityToken(member.id, member.authority)
return AuthMember(member, authToken)
return tokenIssuer.provideAuthorityToken(member.id, member.authority)
}
}
20 changes: 20 additions & 0 deletions src/main/java/com/koddy/server/global/config/SchedulerConfig.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.koddy.server.global.config

import org.springframework.context.annotation.Configuration
import org.springframework.scheduling.annotation.EnableScheduling
import org.springframework.scheduling.annotation.SchedulingConfigurer
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler
import org.springframework.scheduling.config.ScheduledTaskRegistrar

@Configuration
@EnableScheduling
class SchedulerConfig : SchedulingConfigurer {
override fun configureTasks(taskRegistrar: ScheduledTaskRegistrar) {
val threadPool = ThreadPoolTaskScheduler().apply {
poolSize = 10
setThreadNamePrefix("Scheduler Thread-")
initialize()
}
taskRegistrar.setTaskScheduler(threadPool)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,6 @@ enum class UniversityInfo(
companion object {
private val log: Logger = logger()

@JvmStatic
fun validateDomain(
authenticated: Authenticated,
schoolMail: String,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,19 @@
import com.koddy.server.coffeechat.domain.repository.query.MentorReservedScheduleQueryRepository;
import com.koddy.server.global.annotation.KoddyReadOnlyTransactional;
import com.koddy.server.global.annotation.UseCase;
import com.koddy.server.member.application.usecase.query.GetReservedSchedule;
import com.koddy.server.member.application.usecase.query.response.ReservedSchedule;
import com.koddy.server.member.application.usecase.query.GetMentorReservedSchedule;
import com.koddy.server.member.application.usecase.query.response.MentorReservedSchedule;
import com.koddy.server.member.domain.model.mentor.Mentor;
import com.koddy.server.member.domain.repository.MentorRepository;

import java.util.List;

@UseCase
public class GetReservedScheduleUseCase {
public class GetMentorReservedScheduleUseCase {
private final MentorRepository mentorRepository;
private final MentorReservedScheduleQueryRepository mentorReservedScheduleQueryRepository;

public GetReservedScheduleUseCase(
public GetMentorReservedScheduleUseCase(
final MentorRepository mentorRepository,
final MentorReservedScheduleQueryRepository mentorReservedScheduleQueryRepository
) {
Expand All @@ -25,13 +25,13 @@ public GetReservedScheduleUseCase(
}

@KoddyReadOnlyTransactional
public ReservedSchedule invoke(final GetReservedSchedule query) {
public MentorReservedSchedule invoke(final GetMentorReservedSchedule query) {
final Mentor mentor = mentorRepository.getByIdWithSchedules(query.mentorId());
final List<CoffeeChat> reservedCoffeeChat = mentorReservedScheduleQueryRepository.fetchReservedCoffeeChat(
query.mentorId(),
query.year(),
query.month()
);
return ReservedSchedule.of(mentor, reservedCoffeeChat);
return MentorReservedSchedule.of(mentor, reservedCoffeeChat);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
import com.koddy.server.global.query.PageCreator;
import com.koddy.server.global.query.PageResponse;
import com.koddy.server.global.query.SliceResponse;
import com.koddy.server.member.application.usecase.query.GetMentorsByCondition;
import com.koddy.server.member.application.usecase.query.GetSuggestedMentors;
import com.koddy.server.member.application.usecase.query.LookAroundMentorsByConditionQuery;
import com.koddy.server.member.application.usecase.query.response.MentorSimpleSearchProfile;
import com.koddy.server.member.application.usecase.query.response.SuggestedCoffeeChatsByMentorResponse;
import com.koddy.server.member.domain.model.mentor.Mentor;
Expand Down Expand Up @@ -41,7 +41,9 @@ public PageResponse<List<SuggestedCoffeeChatsByMentorResponse>> getSuggestedMent
}

@KoddyReadOnlyTransactional
public SliceResponse<List<MentorSimpleSearchProfile>> getMentorsByCondition(final GetMentorsByCondition query) {
public SliceResponse<List<MentorSimpleSearchProfile>> lookAroundMentorsByCondition(
final LookAroundMentorsByConditionQuery query
) {
final SearchMentorCondition condition = query.toCondition();
final Pageable pageable = PageCreator.create(query.page());
final Slice<Mentor> result = menteeMainSearchRepository.fetchMentorsByCondition(condition, pageable);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import com.koddy.server.global.query.PageResponse;
import com.koddy.server.global.query.SliceResponse;
import com.koddy.server.member.application.usecase.query.GetAppliedMentees;
import com.koddy.server.member.application.usecase.query.GetMenteesByCondition;
import com.koddy.server.member.application.usecase.query.LookAroundMenteesByConditionQuery;
import com.koddy.server.member.application.usecase.query.response.AppliedCoffeeChatsByMenteeResponse;
import com.koddy.server.member.application.usecase.query.response.MenteeSimpleSearchProfile;
import com.koddy.server.member.domain.model.mentee.Mentee;
Expand Down Expand Up @@ -41,7 +41,9 @@ public PageResponse<List<AppliedCoffeeChatsByMenteeResponse>> getAppliedMentees(
}

@KoddyReadOnlyTransactional
public SliceResponse<List<MenteeSimpleSearchProfile>> getMenteesByCondition(final GetMenteesByCondition query) {
public SliceResponse<List<MenteeSimpleSearchProfile>> lookAroundMenteesByCondition(
final LookAroundMenteesByConditionQuery query
) {
final SearchMenteeCondition condition = query.toCondition();
final Pageable pageable = PageCreator.create(query.page());
final Slice<Mentee> result = mentorMainSearchRepository.fetchMenteesByCondition(condition, pageable);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.koddy.server.member.application.usecase.query;

public record GetReservedSchedule(
public record GetMentorReservedSchedule(
long mentorId,
int year,
int month
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

import java.util.List;

public record GetMenteesByCondition(
public record LookAroundMenteesByConditionQuery(
List<Nationality> nationalities,
List<Language.Category> languages,
int page
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

import java.util.List;

public record GetMentorsByCondition(
public record LookAroundMentorsByConditionQuery(
List<Language.Category> languages,
int page
) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import java.time.LocalDateTime;
import java.util.List;

public record ReservedSchedule(
public record MentorReservedSchedule(
MentoringPeriodResponse period,
List<ScheduleResponse> schedules,
Integer timeUnit,
Expand All @@ -24,16 +24,16 @@ public static Reserved from(final Reservation reservation) {
}
}

public static ReservedSchedule of(final Mentor mentor, final List<CoffeeChat> reservedCoffeeChat) {
return new ReservedSchedule(
public static MentorReservedSchedule of(final Mentor mentor, final List<CoffeeChat> reservedCoffeeChat) {
return new MentorReservedSchedule(
MentoringPeriodResponse.from(mentor.getMentoringPeriod()),
mentor.getSchedules()
.stream()
.map(it -> ScheduleResponse.from(it.getTimeline()))
.toList(),
mentor.getMentoringTimeUnit(),
reservedCoffeeChat.stream()
.map(it -> ReservedSchedule.Reserved.from(it.getReservation()))
.map(it -> MentorReservedSchedule.Reserved.from(it.getReservation()))
.toList()
);
}
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package com.koddy.server.member.presentation

import com.koddy.server.auth.domain.model.Authenticated
import com.koddy.server.global.annotation.Auth
import com.koddy.server.global.aop.AccessControl
import com.koddy.server.global.aop.DailyMailAuthLimit
import com.koddy.server.global.utils.UniversityInfo
import com.koddy.server.member.application.usecase.AuthenticationMentorUnivUseCase
import com.koddy.server.member.domain.model.Role
import com.koddy.server.member.presentation.request.AuthenticationConfirmWithMailRequest
import com.koddy.server.member.presentation.request.AuthenticationWithMailRequest
import com.koddy.server.member.presentation.request.AuthenticationWithProofDataRequest
import io.swagger.v3.oas.annotations.Operation
import io.swagger.v3.oas.annotations.tags.Tag
import jakarta.validation.Valid
import org.springframework.http.ResponseEntity
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

@Tag(name = "2-5. 멘토 학교 인증 API")
@RestController
@RequestMapping("/api/mentors/me/univ")
class AuthenticationMentorUnivApi(
private val authenticationMentorUnivUseCase: AuthenticationMentorUnivUseCase,
) {
@Operation(summary = "메일 인증 시도 Endpoint")
@PostMapping("/mail")
@AccessControl(role = Role.MENTOR)
@DailyMailAuthLimit
fun authWithMail(
@Auth authenticated: Authenticated,
@RequestBody @Valid request: AuthenticationWithMailRequest,
): ResponseEntity<Void> {
UniversityInfo.validateDomain(authenticated, request.schoolMail)
authenticationMentorUnivUseCase.authWithMail(request.toCommand(authenticated.id))
return ResponseEntity.noContent().build()
}

@Operation(summary = "메일 인증 확인 Endpoint")
@PostMapping("/mail/confirm")
@AccessControl(role = Role.MENTOR)
fun confirmMailAuthCode(
@Auth authenticated: Authenticated,
@RequestBody @Valid request: AuthenticationConfirmWithMailRequest,
): ResponseEntity<Void> {
UniversityInfo.validateDomain(authenticated, request.schoolMail)
authenticationMentorUnivUseCase.confirmMailAuthCode(request.toCommand(authenticated.id))
return ResponseEntity.noContent().build()
}

@Operation(summary = "증명자료 인증 시도 Endpoint")
@PostMapping("/proof-data")
@AccessControl(role = Role.MENTOR)
fun authWithProofData(
@Auth authenticated: Authenticated,
@RequestBody @Valid request: AuthenticationWithProofDataRequest,
): ResponseEntity<Void> {
authenticationMentorUnivUseCase.authWithProofData(request.toCommand(authenticated.id))
return ResponseEntity.noContent().build()
}
}
Loading
Loading