diff --git a/src/main/java/org/sopt/seonyakServer/domain/appointment/controller/.gitkeep b/src/main/java/org/sopt/seonyakServer/domain/appointment/controller/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/main/java/org/sopt/seonyakServer/domain/appointment/dto/.gitkeep b/src/main/java/org/sopt/seonyakServer/domain/appointment/dto/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/main/java/org/sopt/seonyakServer/domain/appointment/model/Appointment.java b/src/main/java/org/sopt/seonyakServer/domain/appointment/model/Appointment.java new file mode 100644 index 0000000..420fd2d --- /dev/null +++ b/src/main/java/org/sopt/seonyakServer/domain/appointment/model/Appointment.java @@ -0,0 +1,90 @@ +package org.sopt.seonyakServer.domain.appointment.model; + +import jakarta.persistence.Column; +import jakarta.persistence.Convert; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; +import java.util.Map; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.sopt.seonyakServer.domain.member.model.Member; +import org.sopt.seonyakServer.domain.senior.model.Senior; +import org.sopt.seonyakServer.domain.util.JsonConverter; + + +@Entity +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Table(name = "appointment") +public class Appointment { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "appointment_id") + private Long appointmentId; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn(name = "member_id", referencedColumnName = "member_id", nullable = false) + private Member member; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn(name = "senior_id", referencedColumnName = "senior_id", nullable = false) + private Senior senior; + + @Enumerated(EnumType.STRING) + @Column(name = "appointment_status", nullable = false) + private AppointmentStatus appointmentStatus; + + @Column(name = "time_list", columnDefinition = "jsonb", nullable = false) + @Convert(converter = JsonConverter.class) + private Map timeList; + + @Column(name = "topic", length = 255) + private String topic; + + @Column(name = "personal_topic", length = 255) + private String personalTopic; + + @Column(name = "reject_reason", length = 255) + private String rejectReason; + + @Column(name = "google_meet_link", length = 255) + private String googleMeetLink; + + @Builder(access = AccessLevel.PRIVATE) + private Appointment( + Member member, + Senior senior, + AppointmentStatus appointmentStatus, + Map timeList + ) { + this.member = member; + this.senior = senior; + this.appointmentStatus = appointmentStatus; + this.timeList = timeList; + } + + public static Appointment createAppointment( + Member member, + Senior senior, + AppointmentStatus appointmentStatus, + Map timeList + ) { + return Appointment.builder() + .member(member) + .senior(senior) + .appointmentStatus(appointmentStatus) + .timeList(timeList) + .build(); + } +} diff --git a/src/main/java/org/sopt/seonyakServer/domain/appointment/model/AppointmentStatus.java b/src/main/java/org/sopt/seonyakServer/domain/appointment/model/AppointmentStatus.java new file mode 100644 index 0000000..2ed851f --- /dev/null +++ b/src/main/java/org/sopt/seonyakServer/domain/appointment/model/AppointmentStatus.java @@ -0,0 +1,17 @@ +package org.sopt.seonyakServer.domain.appointment.model; + +import lombok.AccessLevel; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor(access = AccessLevel.PRIVATE) +public enum AppointmentStatus { + + PENDING("PENDING"), + SCHEDULED("SCHEDULED"), + PAST("PAST"), + REJECTED("REJECTED"); + + private final String appointmentStatus; +} diff --git a/src/main/java/org/sopt/seonyakServer/domain/appointment/repository/.gitkeep b/src/main/java/org/sopt/seonyakServer/domain/appointment/repository/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/main/java/org/sopt/seonyakServer/domain/appointment/service/.gitkeep b/src/main/java/org/sopt/seonyakServer/domain/appointment/service/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/main/java/org/sopt/seonyakServer/domain/member/model/Member.java b/src/main/java/org/sopt/seonyakServer/domain/member/model/Member.java index 354e650..f172b05 100644 --- a/src/main/java/org/sopt/seonyakServer/domain/member/model/Member.java +++ b/src/main/java/org/sopt/seonyakServer/domain/member/model/Member.java @@ -1,36 +1,79 @@ package org.sopt.seonyakServer.domain.member.model; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.EnumType; import jakarta.persistence.Enumerated; +import jakarta.persistence.FetchType; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; +import jakarta.persistence.OneToOne; +import jakarta.persistence.Table; import lombok.AccessLevel; -import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; +import org.sopt.seonyakServer.domain.senior.model.Senior; @Entity @Getter -@Builder -@NoArgsConstructor -@AllArgsConstructor(access = AccessLevel.PRIVATE) +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Table(name = "member") public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; + @Column(name = "member_id") + private Long memberId; @Enumerated(EnumType.STRING) + @Column(name = "social_type", nullable = false) private SocialType socialType; + @Column(name = "social_id", nullable = false, length = 255) private String socialId; + @Column(name = "email", nullable = false, length = 255) private String email; - public static Member of( + @Column(name = "is_subscribed") + private Boolean isSubscribed; + + @Column(name = "nickname", length = 20) + private String nickname; + + @Column(name = "image", length = 255) + private String image; + + @Column(name = "phone_number", length = 255) + private String phoneNumber; + + @Column(name = "univ_name", length = 255) + private String univName; + + @Column(name = "field", length = 255) + private String field; + + @Column(name = "department", length = 255) + private String department; + + @OneToOne(mappedBy = "member", fetch = FetchType.LAZY, cascade = CascadeType.ALL) + private Senior senior; + + @Builder(access = AccessLevel.PRIVATE) + private Member( + final SocialType socialType, + final String socialId, + final String email + ) { + this.socialType = socialType; + this.socialId = socialId; + this.email = email; + } + + public static Member createMember( final SocialType socialType, final String socialId, final String email diff --git a/src/main/java/org/sopt/seonyakServer/domain/member/service/MemberManagementService.java b/src/main/java/org/sopt/seonyakServer/domain/member/service/MemberManagementService.java index 4e3ca35..8864e17 100644 --- a/src/main/java/org/sopt/seonyakServer/domain/member/service/MemberManagementService.java +++ b/src/main/java/org/sopt/seonyakServer/domain/member/service/MemberManagementService.java @@ -16,12 +16,12 @@ public class MemberManagementService { @Transactional public Long createMember(final MemberInfoResponse memberInfoResponse) { - Member member = Member.of( + Member member = Member.createMember( memberInfoResponse.socialType(), memberInfoResponse.socialId(), memberInfoResponse.email() ); - return memberRepository.save(member).getId(); + return memberRepository.save(member).getMemberId(); } } diff --git a/src/main/java/org/sopt/seonyakServer/domain/member/service/MemberService.java b/src/main/java/org/sopt/seonyakServer/domain/member/service/MemberService.java index fdcf52c..19e7cf2 100644 --- a/src/main/java/org/sopt/seonyakServer/domain/member/service/MemberService.java +++ b/src/main/java/org/sopt/seonyakServer/domain/member/service/MemberService.java @@ -79,7 +79,7 @@ public Long getMemberIdBySocialId( () -> new CustomException(ErrorType.NOT_FOUND_MEMBER_ERROR) ); - return member.getId(); + return member.getMemberId(); } public LoginSuccessResponse getTokenByMemberId(final Long id) { diff --git a/src/main/java/org/sopt/seonyakServer/domain/senior/controller/.gitkeep b/src/main/java/org/sopt/seonyakServer/domain/senior/controller/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/main/java/org/sopt/seonyakServer/domain/senior/dto/.gitkeep b/src/main/java/org/sopt/seonyakServer/domain/senior/dto/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/main/java/org/sopt/seonyakServer/domain/senior/model/Senior.java b/src/main/java/org/sopt/seonyakServer/domain/senior/model/Senior.java new file mode 100644 index 0000000..47999f3 --- /dev/null +++ b/src/main/java/org/sopt/seonyakServer/domain/senior/model/Senior.java @@ -0,0 +1,92 @@ +package org.sopt.seonyakServer.domain.senior.model; + +import jakarta.persistence.Column; +import jakarta.persistence.Convert; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.OneToOne; +import jakarta.persistence.Table; +import java.util.Map; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.sopt.seonyakServer.domain.member.model.Member; +import org.sopt.seonyakServer.domain.util.JsonConverter; + +@Entity +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Table(name = "senior") +public class Senior { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "senior_id") + private Long seniorId; + + @OneToOne(optional = false) + @JoinColumn(name = "member_id", referencedColumnName = "member_id", nullable = false) + private Member member; + + @Column(name = "business_card", nullable = false, length = 255) + private String businessCard; + + @Column(name = "company", length = 255) + private String company; + + @Column(name = "position", length = 255) + private String position; + + @Column(name = "detail_position", nullable = false, length = 255) + private String detailPosition; + + @Column(name = "level", nullable = false) + private Integer level; + + @Column(name = "catchphrase", length = 255) + private String catchphrase; + + @Column(name = "career", length = 255) + private String career; + + @Column(name = "award", length = 255) + private String award; + + @Column(name = "story", length = 255) + private String story; + + @Column(name = "preffered_time_list", columnDefinition = "jsonb") + @Convert(converter = JsonConverter.class) + private Map prefferedTimeList; + + @Builder(access = AccessLevel.PRIVATE) + private Senior( + Member member, + String businessCard, + String detailPosition, + Integer level + ) { + this.member = member; + this.businessCard = businessCard; + this.detailPosition = detailPosition; + this.level = level; + } + + public static Senior createSenior( + Member member, + String businessCard, + String detailPosition, + Integer level + ) { + return Senior.builder() + .member(member) + .businessCard(businessCard) + .detailPosition(detailPosition) + .level(level) + .build(); + } +} diff --git a/src/main/java/org/sopt/seonyakServer/domain/senior/repository/.gitkeep b/src/main/java/org/sopt/seonyakServer/domain/senior/repository/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/main/java/org/sopt/seonyakServer/domain/senior/service/.gitkeep b/src/main/java/org/sopt/seonyakServer/domain/senior/service/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/main/java/org/sopt/seonyakServer/domain/university/controller/.gitkeep b/src/main/java/org/sopt/seonyakServer/domain/university/controller/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/main/java/org/sopt/seonyakServer/domain/university/dto/.gitkeep b/src/main/java/org/sopt/seonyakServer/domain/university/dto/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/main/java/org/sopt/seonyakServer/domain/university/model/Department.java b/src/main/java/org/sopt/seonyakServer/domain/university/model/Department.java new file mode 100644 index 0000000..541f401 --- /dev/null +++ b/src/main/java/org/sopt/seonyakServer/domain/university/model/Department.java @@ -0,0 +1,60 @@ +package org.sopt.seonyakServer.domain.university.model; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Table(name = "department") +public class Department { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "dept_id") + private Long deptId; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn(name = "univ_id", referencedColumnName = "univ_id", nullable = false) + private University university; + + @Column(name = "dept_name", nullable = false, length = 20) + private String deptName; + + @Column(name = "is_closed", nullable = false) + private Boolean isClosed; + + @Builder(access = AccessLevel.PRIVATE) + private Department( + final University university, + final String deptName, + final Boolean isClosed + ) { + this.university = university; + this.deptName = deptName; + this.isClosed = isClosed; + } + + public static Department createDepartment( + final University university, + final String deptName, + final Boolean isClosed + ) { + return Department.builder() + .university(university) + .deptName(deptName) + .isClosed(isClosed) + .build(); + } +} diff --git a/src/main/java/org/sopt/seonyakServer/domain/university/model/University.java b/src/main/java/org/sopt/seonyakServer/domain/university/model/University.java new file mode 100644 index 0000000..12f7f66 --- /dev/null +++ b/src/main/java/org/sopt/seonyakServer/domain/university/model/University.java @@ -0,0 +1,49 @@ +package org.sopt.seonyakServer.domain.university.model; + +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.OneToMany; +import jakarta.persistence.Table; +import java.util.List; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Table(name = "university") +public class University { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "univ_id") + private Long univId; + + @Column(name = "univ_name", nullable = false, length = 255) + private String univName; + + @OneToMany(mappedBy = "university", fetch = FetchType.LAZY, cascade = CascadeType.ALL) + private List departmentList; + + @Builder(access = AccessLevel.PRIVATE) + private University( + final String univName + ) { + this.univName = univName; + } + + public static University createUniversity( + final String univName + ) { + return University.builder() + .univName(univName) + .build(); + } +} diff --git a/src/main/java/org/sopt/seonyakServer/domain/university/repository/.gitkeep b/src/main/java/org/sopt/seonyakServer/domain/university/repository/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/main/java/org/sopt/seonyakServer/domain/university/service/.gitkeep b/src/main/java/org/sopt/seonyakServer/domain/university/service/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/main/java/org/sopt/seonyakServer/domain/util/JsonConverter.java b/src/main/java/org/sopt/seonyakServer/domain/util/JsonConverter.java new file mode 100644 index 0000000..76195cf --- /dev/null +++ b/src/main/java/org/sopt/seonyakServer/domain/util/JsonConverter.java @@ -0,0 +1,33 @@ +package org.sopt.seonyakServer.domain.util; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.persistence.AttributeConverter; +import jakarta.persistence.Converter; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +@Converter +public class JsonConverter implements AttributeConverter, String> { + + private final ObjectMapper objectMapper = new ObjectMapper(); + + @Override + public String convertToDatabaseColumn(Map attribute) { + try { + return objectMapper.writeValueAsString(attribute); + } catch (JsonProcessingException e) { + throw new RuntimeException("Error converting map to JSON string.", e); + } + } + + @Override + public Map convertToEntityAttribute(String dbData) { + try { + return objectMapper.readValue(dbData, HashMap.class); + } catch (IOException e) { + throw new RuntimeException("Error converting JSON string to map.", e); + } + } +} diff --git a/src/main/java/org/sopt/seonyakServer/global/auth/filter/JwtAuthenticationFilter.java b/src/main/java/org/sopt/seonyakServer/global/auth/filter/JwtAuthenticationFilter.java index dcfb42c..28a0033 100644 --- a/src/main/java/org/sopt/seonyakServer/global/auth/filter/JwtAuthenticationFilter.java +++ b/src/main/java/org/sopt/seonyakServer/global/auth/filter/JwtAuthenticationFilter.java @@ -58,7 +58,9 @@ protected void doFilterInternal(@NonNull HttpServletRequest request, private String getJwtFromRequest(HttpServletRequest request) { String bearerToken = request.getHeader("Authorization"); - if (StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer ")) { + if (!StringUtils.hasText(bearerToken)) { + throw new CustomException(ErrorType.UN_LOGIN_ERROR); + } else if (StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer ")) { return bearerToken.substring("Bearer ".length()); } else if (StringUtils.hasText(bearerToken) && !bearerToken.startsWith("Bearer ")) { throw new CustomException(ErrorType.BEARER_LOST_ERROR); diff --git a/src/main/java/org/sopt/seonyakServer/global/config/WebConfig.java b/src/main/java/org/sopt/seonyakServer/global/config/WebConfig.java index e578e44..9963170 100644 --- a/src/main/java/org/sopt/seonyakServer/global/config/WebConfig.java +++ b/src/main/java/org/sopt/seonyakServer/global/config/WebConfig.java @@ -14,6 +14,6 @@ public void addCorsMappings(CorsRegistry registry) { .allowedMethods("GET", "POST", "PUT", "DELETE") .allowedHeaders("*") .allowCredentials(true) - .maxAge(3000); + .maxAge(3600); } }