diff --git a/dodam-application/dodam-rest-api/src/main/java/b1nd/dodam/restapi/auth/infrastructure/security/SecurityConfig.java b/dodam-application/dodam-rest-api/src/main/java/b1nd/dodam/restapi/auth/infrastructure/security/SecurityConfig.java index ed9b8ff9..bf2d305f 100644 --- a/dodam-application/dodam-rest-api/src/main/java/b1nd/dodam/restapi/auth/infrastructure/security/SecurityConfig.java +++ b/dodam-application/dodam-rest-api/src/main/java/b1nd/dodam/restapi/auth/infrastructure/security/SecurityConfig.java @@ -27,6 +27,7 @@ class SecurityConfig { private static final String STUDENT = "STUDENT"; private static final String TEACHER = "TEACHER"; + private static final String PARENT = "PARENT"; private static final String ADMIN = "ADMIN"; private final TokenFilter tokenFilter; diff --git a/dodam-application/dodam-rest-api/src/main/java/b1nd/dodam/restapi/member/application/MemberCommandUseCase.java b/dodam-application/dodam-rest-api/src/main/java/b1nd/dodam/restapi/member/application/MemberCommandUseCase.java index 011c95cf..5e9f35ba 100644 --- a/dodam-application/dodam-rest-api/src/main/java/b1nd/dodam/restapi/member/application/MemberCommandUseCase.java +++ b/dodam-application/dodam-rest-api/src/main/java/b1nd/dodam/restapi/member/application/MemberCommandUseCase.java @@ -1,16 +1,14 @@ package b1nd.dodam.restapi.member.application; import b1nd.dodam.domain.rds.member.entity.Member; +import b1nd.dodam.domain.rds.member.entity.Parent; import b1nd.dodam.domain.rds.member.entity.Student; import b1nd.dodam.domain.rds.member.entity.Teacher; import b1nd.dodam.domain.rds.member.enumeration.ActiveStatus; import b1nd.dodam.domain.rds.member.event.StudentRegisteredEvent; import b1nd.dodam.domain.rds.member.exception.BroadcastClubMemberDuplicateException; import b1nd.dodam.domain.rds.member.exception.MemberDuplicateException; -import b1nd.dodam.domain.rds.member.repository.BroadcastClubMemberRepository; -import b1nd.dodam.domain.rds.member.repository.MemberRepository; -import b1nd.dodam.domain.rds.member.repository.StudentRepository; -import b1nd.dodam.domain.rds.member.repository.TeacherRepository; +import b1nd.dodam.domain.rds.member.repository.*; import b1nd.dodam.restapi.auth.infrastructure.security.support.MemberAuthenticationHolder; import b1nd.dodam.restapi.member.application.data.req.*; import b1nd.dodam.restapi.support.data.Response; @@ -32,6 +30,7 @@ public class MemberCommandUseCase { private final MemberRepository memberRepository; private final StudentRepository studentRepository; private final TeacherRepository teacherRepository; + private final ParentRepository parentRepository; private final BroadcastClubMemberRepository broadcastClubMemberRepository; private final MemberAuthenticationHolder memberAuthenticationHolder; private final ApplicationEventPublisher eventPublisher; @@ -55,6 +54,13 @@ public Response join(JoinTeacherReq req) { return Response.created("선생님 회원가입 성공"); } + public Response join(JoinParentReq req) { + checkIfIdIsDuplicate(req.id()); + Member member = memberRepository.save(req.mapToMember(encodePw(req.pw()))); + parentRepository.save(req.mapToParent(member)); + return Response.created("학부모 회원가입 성공"); + } + private void checkIfIdIsDuplicate(String id) { if(memberRepository.existsById(id)) { throw new MemberDuplicateException(); diff --git a/dodam-application/dodam-rest-api/src/main/java/b1nd/dodam/restapi/member/application/data/req/JoinParentReq.java b/dodam-application/dodam-rest-api/src/main/java/b1nd/dodam/restapi/member/application/data/req/JoinParentReq.java new file mode 100644 index 00000000..b3f4b31c --- /dev/null +++ b/dodam-application/dodam-rest-api/src/main/java/b1nd/dodam/restapi/member/application/data/req/JoinParentReq.java @@ -0,0 +1,32 @@ +package b1nd.dodam.restapi.member.application.data.req; + +import b1nd.dodam.domain.rds.member.entity.Member; +import b1nd.dodam.domain.rds.member.entity.Parent; +import b1nd.dodam.domain.rds.member.entity.Teacher; +import b1nd.dodam.domain.rds.member.enumeration.ActiveStatus; +import b1nd.dodam.domain.rds.member.enumeration.MemberRole; +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotEmpty; + +public record JoinParentReq(@NotEmpty String id, @NotEmpty String pw, @NotEmpty String name, @NotEmpty @Email String email, + @NotEmpty String relation, @NotEmpty String phone) { + public Parent mapToParent(Member member) { + return Parent.builder() + .member(member) + .relation(relation) + .build(); + } + + public Member mapToMember(String encodedPw) { + return Member.builder() + .id(id) + .pw(encodedPw) + .email(email) + .name(name) + .role(MemberRole.PARENT) + .phone(phone) + .status(ActiveStatus.PENDING) + .build(); + } + +} diff --git a/dodam-application/dodam-rest-api/src/main/java/b1nd/dodam/restapi/member/presentation/MemberController.java b/dodam-application/dodam-rest-api/src/main/java/b1nd/dodam/restapi/member/presentation/MemberController.java index a371fc7d..c8106a7c 100644 --- a/dodam-application/dodam-rest-api/src/main/java/b1nd/dodam/restapi/member/presentation/MemberController.java +++ b/dodam-application/dodam-rest-api/src/main/java/b1nd/dodam/restapi/member/presentation/MemberController.java @@ -31,6 +31,11 @@ public Response join(@RequestBody @Valid JoinTeacherReq req) { return commandUseCase.join(req); } + @PostMapping("/join-parent") + public Response join(@RequestBody @Valid JoinParentReq req) { + return commandUseCase.join(req); + } + @PostMapping("/broadcast-club-member") public Response apply(@RequestBody @Valid ApplyBroadcastClubMemberReq req) { return commandUseCase.apply(req); diff --git a/dodam-application/dodam-rest-api/src/main/java/b1nd/dodam/restapi/nightstudy/application/data/req/ApplyNightStudyReq.java b/dodam-application/dodam-rest-api/src/main/java/b1nd/dodam/restapi/nightstudy/application/data/req/ApplyNightStudyReq.java index ff22ff16..05530f46 100644 --- a/dodam-application/dodam-rest-api/src/main/java/b1nd/dodam/restapi/nightstudy/application/data/req/ApplyNightStudyReq.java +++ b/dodam-application/dodam-rest-api/src/main/java/b1nd/dodam/restapi/nightstudy/application/data/req/ApplyNightStudyReq.java @@ -2,20 +2,17 @@ import b1nd.dodam.domain.rds.member.entity.Student; import b1nd.dodam.domain.rds.nightstudy.entity.NightStudy; -import b1nd.dodam.domain.rds.support.enumeration.SchoolPlace; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Size; import java.time.LocalDate; public record ApplyNightStudyReq(@NotNull @Size(min = 10, max = 250) String content, - @NotNull String place, @NotNull Boolean doNeedPhone, String reasonForPhone, @NotNull LocalDate startAt, @NotNull LocalDate endAt) { public NightStudy toEntity(Student student) { return NightStudy.builder() .content(content) - .place(SchoolPlace.of(place)) .doNeedPhone(doNeedPhone) .reasonForPhone(reasonForPhone) .student(student) diff --git a/dodam-application/dodam-rest-api/src/main/java/b1nd/dodam/restapi/nightstudy/application/data/res/NightStudyRes.java b/dodam-application/dodam-rest-api/src/main/java/b1nd/dodam/restapi/nightstudy/application/data/res/NightStudyRes.java index 3befbb8a..874ffa29 100644 --- a/dodam-application/dodam-rest-api/src/main/java/b1nd/dodam/restapi/nightstudy/application/data/res/NightStudyRes.java +++ b/dodam-application/dodam-rest-api/src/main/java/b1nd/dodam/restapi/nightstudy/application/data/res/NightStudyRes.java @@ -13,7 +13,6 @@ public record NightStudyRes(Long id, ApprovalStatus status, Boolean doNeedPhone, String reasonForPhone, StudentRes student, - String place, String rejectReason, LocalDate startAt, LocalDate endAt, LocalDateTime createdAt, LocalDateTime modifiedAt) { @@ -30,7 +29,6 @@ public static NightStudyRes of(NightStudy nightStudy) { nightStudy.getStatus(), nightStudy.getDoNeedPhone(), nightStudy.getReasonForPhone(), StudentRes.of(nightStudy.getStudent()), - nightStudy.getPlace().getPlace(), nightStudy.getRejectReason(), nightStudy.getStartAt(), nightStudy.getEndAt(), nightStudy.getCreatedAt(), nightStudy.getModifiedAt() diff --git a/dodam-application/dodam-rest-api/src/main/java/b1nd/dodam/restapi/support/exception/ErrorNoticeSender.java b/dodam-application/dodam-rest-api/src/main/java/b1nd/dodam/restapi/support/exception/ErrorNoticeSender.java index c552eb2e..467836b8 100644 --- a/dodam-application/dodam-rest-api/src/main/java/b1nd/dodam/restapi/support/exception/ErrorNoticeSender.java +++ b/dodam-application/dodam-rest-api/src/main/java/b1nd/dodam/restapi/support/exception/ErrorNoticeSender.java @@ -2,12 +2,14 @@ import b1nd.dodam.discord.webhook.client.DiscordWebhookClient; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; import java.time.LocalDateTime; import java.util.Arrays; +@Slf4j @Component @RequiredArgsConstructor public class ErrorNoticeSender { @@ -33,6 +35,7 @@ public void send(Exception e, RequestInfo request) { + "```\n" + getStackTrace(e) + "\n```"; + discordWebHookClient.notice("", title, description); } diff --git a/dodam-system-domain/dodam-domain-rds/src/main/java/b1nd/dodam/domain/rds/member/entity/Parent.java b/dodam-system-domain/dodam-domain-rds/src/main/java/b1nd/dodam/domain/rds/member/entity/Parent.java new file mode 100644 index 00000000..af62ec9e --- /dev/null +++ b/dodam-system-domain/dodam-domain-rds/src/main/java/b1nd/dodam/domain/rds/member/entity/Parent.java @@ -0,0 +1,33 @@ +package b1nd.dodam.domain.rds.member.entity; + +import jakarta.persistence.*; +import jakarta.validation.constraints.NotNull; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.apache.commons.lang3.StringUtils; + +@Getter +@Entity(name = "parent") +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class Parent { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int id; + + @NotNull + private String relation; + + @OneToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "fk_member_id", nullable = false) + private Member member; + + @Builder + public Parent(int id, String relation, Member member) { + this.id = id; + this.relation = relation; + this.member = member; + } +} diff --git a/dodam-system-domain/dodam-domain-rds/src/main/java/b1nd/dodam/domain/rds/member/entity/StudentCode.java b/dodam-system-domain/dodam-domain-rds/src/main/java/b1nd/dodam/domain/rds/member/entity/StudentCode.java new file mode 100644 index 00000000..3dedf29f --- /dev/null +++ b/dodam-system-domain/dodam-domain-rds/src/main/java/b1nd/dodam/domain/rds/member/entity/StudentCode.java @@ -0,0 +1,25 @@ +package b1nd.dodam.domain.rds.member.entity; + +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@Entity(name = "student_code") +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class StudentCode { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private String studentCode; + + @OneToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "fk_student_id", nullable = false) + private Student student; + + @OneToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "fk_parent_id", nullable = false) + private Parent parent; + +} diff --git a/dodam-system-domain/dodam-domain-rds/src/main/java/b1nd/dodam/domain/rds/member/repository/ParentRepository.java b/dodam-system-domain/dodam-domain-rds/src/main/java/b1nd/dodam/domain/rds/member/repository/ParentRepository.java new file mode 100644 index 00000000..e5944355 --- /dev/null +++ b/dodam-system-domain/dodam-domain-rds/src/main/java/b1nd/dodam/domain/rds/member/repository/ParentRepository.java @@ -0,0 +1,8 @@ +package b1nd.dodam.domain.rds.member.repository; + +import b1nd.dodam.domain.rds.member.entity.Parent; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ParentRepository extends JpaRepository { + +} diff --git a/dodam-system-domain/dodam-domain-rds/src/main/java/b1nd/dodam/domain/rds/nightstudy/entity/NightStudy.java b/dodam-system-domain/dodam-domain-rds/src/main/java/b1nd/dodam/domain/rds/nightstudy/entity/NightStudy.java index ca6e28aa..d5637758 100644 --- a/dodam-system-domain/dodam-domain-rds/src/main/java/b1nd/dodam/domain/rds/nightstudy/entity/NightStudy.java +++ b/dodam-system-domain/dodam-domain-rds/src/main/java/b1nd/dodam/domain/rds/nightstudy/entity/NightStudy.java @@ -8,7 +8,6 @@ import b1nd.dodam.domain.rds.nightstudy.exception.ReasonForPhoneMissingException; import b1nd.dodam.domain.rds.support.entity.BaseEntity; import b1nd.dodam.domain.rds.support.enumeration.ApprovalStatus; -import b1nd.dodam.domain.rds.support.enumeration.SchoolPlace; import jakarta.persistence.*; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Size; @@ -38,10 +37,6 @@ public class NightStudy extends BaseEntity { private String reasonForPhone; - @NotNull - @Enumerated(value = EnumType.STRING) - private SchoolPlace place; - @NotNull @Enumerated(value = EnumType.STRING) private ApprovalStatus status; @@ -63,7 +58,7 @@ public class NightStudy extends BaseEntity { private LocalDate endAt; @Builder - public NightStudy(String content, boolean doNeedPhone, String reasonForPhone, SchoolPlace place, Student student, + public NightStudy(String content, boolean doNeedPhone, String reasonForPhone, Student student, LocalDate startAt, LocalDate endAt) { isApplicationDuration(); isInvalidStudyPeriod(startAt, endAt); @@ -72,7 +67,6 @@ public NightStudy(String content, boolean doNeedPhone, String reasonForPhone, Sc this.content = content; this.doNeedPhone = doNeedPhone; this.reasonForPhone = reasonForPhone; - this.place = place; this.status = ApprovalStatus.PENDING; this.student = student; this.startAt = startAt; diff --git a/dodam-system-domain/dodam-domain-rds/src/main/java/b1nd/dodam/domain/rds/support/enumeration/SchoolPlace.java b/dodam-system-domain/dodam-domain-rds/src/main/java/b1nd/dodam/domain/rds/support/enumeration/SchoolPlace.java index 3f33e88c..10d99d03 100644 --- a/dodam-system-domain/dodam-domain-rds/src/main/java/b1nd/dodam/domain/rds/support/enumeration/SchoolPlace.java +++ b/dodam-system-domain/dodam-domain-rds/src/main/java/b1nd/dodam/domain/rds/support/enumeration/SchoolPlace.java @@ -11,12 +11,6 @@ @RequiredArgsConstructor public enum SchoolPlace { - PROGRAMMING_1("프로그래밍1실"), - PROGRAMMING_2("프로그래밍2실"), - PROGRAMMING_3("프로그래밍3실"), - KOREAN("국어실"), - MATH("수학실"), - SOCIETY("사회실"), HALL("강당"), AUDIOVISUAL_ROOM("시청각실"), NONE("장소 없음"),