Skip to content

Commit

Permalink
[MERGE/#76] 약속 신청 구현
Browse files Browse the repository at this point in the history
[FEAT] #76 - 약속 신청 구현
  • Loading branch information
seokbeom00 authored Jul 13, 2024
2 parents 261cd51 + 9f6b45b commit 5951db2
Show file tree
Hide file tree
Showing 13 changed files with 130 additions and 6 deletions.
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package org.sopt.seonyakServer.domain.appointment.controller;


import lombok.RequiredArgsConstructor;
import org.sopt.seonyakServer.domain.appointment.dto.AppointmentRequest;
import org.sopt.seonyakServer.domain.appointment.service.AppointmentService;
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;

@RestController
@RequiredArgsConstructor
@RequestMapping("/api/v1/appoinment")
public class AppointmentController {

private final AppointmentService appointmentService;

@PostMapping("")
public ResponseEntity<Void> postAppointment(
@RequestBody final AppointmentRequest appointmentRequest
) {
appointmentService.postAppointment(appointmentRequest);
return ResponseEntity.ok().build();
}
}
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package org.sopt.seonyakServer.domain.appointment.dto;

import java.util.List;
import org.sopt.seonyakServer.domain.appointment.model.DataTimeRange;

public record AppointmentRequest(
Long seniorId,
List<String> topic,
String personalTopic,
List<DataTimeRange> timeList
) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import java.util.Map;
import java.util.List;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
Expand Down Expand Up @@ -43,10 +43,11 @@ public class Appointment {

@Column(name = "time_list", columnDefinition = "jsonb", nullable = false)
@JdbcTypeCode(SqlTypes.JSON)
private Map<String, Object> timeList;
private List<DataTimeRange> timeList;

@Column(name = "topic")
private String topic;
@JdbcTypeCode(SqlTypes.JSON)
private List<String> topic;

@Column(name = "personal_topic")
private String personalTopic;
Expand All @@ -69,25 +70,33 @@ private Appointment(
Member member,
Senior senior,
AppointmentStatus appointmentStatus,
Map<String, Object> timeList
List<DataTimeRange> timeList,
List<String> topic,
String personalTopic
) {
this.member = member;
this.senior = senior;
this.appointmentStatus = appointmentStatus;
this.timeList = timeList;
this.topic = topic;
this.personalTopic = personalTopic;
}

public static Appointment createAppointment(
Member member,
Senior senior,
AppointmentStatus appointmentStatus,
Map<String, Object> timeList
List<DataTimeRange> timeList,
List<String> topic,
String personalTopic
) {
return Appointment.builder()
.member(member)
.senior(senior)
.appointmentStatus(appointmentStatus)
.timeList(timeList)
.topic(topic)
.personalTopic(personalTopic)
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package org.sopt.seonyakServer.domain.appointment.model;

import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Getter
@Setter
@NoArgsConstructor
public class DataTimeRange {
private String date;
private String startTime;
private String endTime;
}
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package org.sopt.seonyakServer.domain.appointment.repository;

import org.sopt.seonyakServer.domain.appointment.model.Appointment;
import org.springframework.data.jpa.repository.JpaRepository;

public interface AppointmentRepository extends JpaRepository<Appointment, Long> {
}
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package org.sopt.seonyakServer.domain.appointment.service;

import lombok.RequiredArgsConstructor;
import org.sopt.seonyakServer.domain.appointment.dto.AppointmentRequest;
import org.sopt.seonyakServer.domain.appointment.model.Appointment;
import org.sopt.seonyakServer.domain.appointment.model.AppointmentStatus;
import org.sopt.seonyakServer.domain.appointment.repository.AppointmentRepository;
import org.sopt.seonyakServer.domain.member.model.Member;
import org.sopt.seonyakServer.domain.member.repository.MemberRepository;
import org.sopt.seonyakServer.domain.senior.model.Senior;
import org.sopt.seonyakServer.domain.senior.repository.SeniorRepository;
import org.sopt.seonyakServer.global.auth.PrincipalHandler;
import org.sopt.seonyakServer.global.exception.enums.ErrorType;
import org.sopt.seonyakServer.global.exception.model.CustomException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@RequiredArgsConstructor
public class AppointmentService {

private final AppointmentRepository appointmentRepository;
private final SeniorRepository seniorRepository;
private final MemberRepository memberRepository;
private final PrincipalHandler principalHandler;

@Transactional
public void postAppointment(AppointmentRequest appointmentRequest) {
Member member = memberRepository.findMemberByIdOrThrow(principalHandler.getUserIdFromPrincipal());
Senior senior = seniorRepository.findSeniorByIdOrThrow(appointmentRequest.seniorId());
if (member.getId().equals(senior.getId())) {
throw new CustomException(ErrorType.SAME_MEMBER_APPOINTMENT_ERROR);
}
Appointment appointment = Appointment.createAppointment(
member,
senior,
AppointmentStatus.PENDING,
appointmentRequest.timeList(),
appointmentRequest.topic(),
appointmentRequest.personalTopic()
);
appointmentRepository.save(appointment);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,21 @@
import java.util.Optional;
import org.sopt.seonyakServer.domain.member.model.Member;
import org.sopt.seonyakServer.domain.member.model.SocialType;
import org.sopt.seonyakServer.global.exception.enums.ErrorType;
import org.sopt.seonyakServer.global.exception.model.CustomException;
import org.springframework.data.jpa.repository.JpaRepository;

public interface MemberRepository extends JpaRepository<Member, Long> {
Optional<Member> findBySocialTypeAndSocialId(SocialType socialType, String socialId);

Optional<Member> findMemberById(Long id);

boolean existsByNickname(String nickname);

boolean existsByPhoneNumber(String phoneNumber);

default Member findMemberByIdOrThrow(Long id) {
return findMemberById(id)
.orElseThrow(() -> new CustomException(ErrorType.NOT_FOUND_MEMBER_ERROR));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,6 @@ public interface SeniorRepository extends JpaRepository<Senior, Long>, SeniorRep

default Senior findSeniorByIdOrThrow(Long id) {
return findSeniorById(id)
.orElseThrow(() -> new CustomException(ErrorType.NOT_FOUND_MEMBER_ERROR));
.orElseThrow(() -> new CustomException(ErrorType.NOT_FOUND_SENIOR_ERROR));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ public enum ErrorType {
MAP_TO_JSON_ERROR(HttpStatus.BAD_REQUEST, "40016", "Map을 JSON 문자열로 변환하는 중 오류가 발생했습니다."),
JSON_TO_MAP_ERROR(HttpStatus.BAD_REQUEST, "40017", "JSON 문자열을 Map으로 변환하는 중 오류가 발생했습니다."),
UNIV_CERT_REQUEST_ERROR(HttpStatus.BAD_REQUEST, "40018", "이미 인증이 완료 이메일입니다."),
SAME_MEMBER_APPOINTMENT_ERROR(HttpStatus.BAD_REQUEST, "40019", "자기 자신에게는 약속을 신청할 수 없습니다."),

// S3 관련 오류
IMAGE_EXTENSION_ERROR(HttpStatus.BAD_REQUEST, "40051", "이미지 확장자는 jpg, png, webp만 가능합니다."),
Expand Down Expand Up @@ -60,6 +61,7 @@ public enum ErrorType {
NOT_FOUND_REFRESH_TOKEN_ERROR(HttpStatus.NOT_FOUND, "40402", "존재하지 않는 리프레시 토큰입니다."),
NOT_FOUND_CREDENTIALS_JSON_ERROR(HttpStatus.NOT_FOUND, "40403", "구글미트 Credentials Json 파일을 찾을 수 없습니다."),
NOT_FOUND_SENIOR_BY_MEMBER(HttpStatus.NOT_FOUND, "40404", "해당 ID를 가진 멤버와 매핑된 선배를 찾을 수 없습니다."),
NOT_FOUND_SENIOR_ERROR(HttpStatus.NOT_FOUND, "40405", "존재하지 않는 선배입니다."),

/**
* 409 CONFLICT
Expand Down

0 comments on commit 5951db2

Please sign in to comment.