이제 우리 새끼손 프로젝트에서 가장 중요한 약속을 만들어보도록 하겠다.
약속을 만드는 과정에서 가장 중요하게 생각하는 것은 방장이 방을 만들고 사람들이 참여하며, 정보표시, 인원조정, 강퇴, 수정을 중점으로 로직을 작성해보았다.
@ResponseBody
@PostMapping("/{user_id}")
// 약속 만들기
public ResponseForm create(
@PathVariable("user_id") Long user_id,
Appoint appoint,
Integer typeInteger,
String date,
String time) {
return appointService.createAppoint(user_id, appoint, typeInteger, date, time);
}
user_id를 기준으로 방을 만들며, 사람들과의 약속인지 나 혼자만의 약속여부인지, 날짜와 시간을 매개변수로 받는다.
public ResponseForm createAppoint(Long user_id, Appoint appoint, Integer typeInteger,
String date, String time) {
ResponseForm res = new ResponseForm();
// title이 비어있다면 에러
if (appoint.getTitle() == null || appoint.getTitle().trim().equals(""))
return res.setError("제목이 비어있습니다");
// d-day가 비어있다면 에러
if (date == null || "".equals(date) || time == null || "".equals(time))
return res.setError("날짜와 시간이 비어있습니다");
// content가 null 이면 content를 빈 문자열로 초기화
if (appoint.getContent() == null) appoint.setContent("");
// head_cnt를 1로 세팅 (최초 생성이기 때문)
appoint.setHeadCnt(1);
// 나만의 약속이라면 maxCnt 1, isPublic null로 세팅
if (typeInteger == 2) {
appoint.setMaxCnt(1);
appoint.setIsPublic(null);
}
// dday 세팅
appoint.setDday(makeDateTime(date, time));
// type 세팅
C.appointType type;
if (typeInteger == 0) type = C.appointType.FTF;
else if (typeInteger == 1) type = C.appointType.NFTF;
else type = C.appointType.SOLO;
appoint.setType(type);
// appoint 저장
appoint = appointRepository.save(appoint);
// myAppoint 세팅
MyAppoint myAppoint = MyAppoint.builder()
.userId(user_id)
.appointId(appoint.getId())
.isMaster(true).build();
// myAppoint 저장
myAppointRepository.save(myAppoint);
setHeadCnt(appoint.getId());
return res.setSuccess(appoint.getId());
}
private LocalDateTime makeDateTime(String date, String time) {
String[] dates = date.split("\\.");
String[] times = time.split(":");
Integer y = Integer.parseInt(dates[0]);
Integer m = Integer.parseInt(dates[1]);
Integer d = Integer.parseInt(dates[2]);
Integer hh = Integer.parseInt(times[0]);
Integer mm = Integer.parseInt(times[1]);
return LocalDateTime.of(y, m, d, hh, mm, 00);
}
기본적인 유효성 검사부터 시작하여 type과 방장여부를 통해 myAppoint에 내 약속을 저장하면서 생성해주었다.
public class C {
public enum appointType {
FTF, NFTF, SOLO
}
}
여기서 type이란 약속의 종류를 분류하는데 쓰이는데, common 패키지에 enum으로 만들어 주었다. java에서의 enum은 형변환이 되지 않기 때문에 따로 지정해주었다.
FTF(0) : Face TO Face, 만남을 목적으로 하는 약속
NFTF(1) : Not Face TO Face, 온라인 상에서의 약속
SOLO(2) : SOLO, 나 자신과의 약속
이러한 기본 구조를 통해 수정, 삭제, 약속 가져오는 기능을 구현해주었고, 새부적으로 약속멤버별명 가져오기, 약속멤버 강퇴, 약속 인원조정 등의 기능을 만들어주었다.
처음 프로젝트를 기획했을떄는 친구끼리만 약속을 할 수 있는 기능만 구현하려고 하였지만, 친구가 아니어도 방을 검색해서 참여할 수 있는 플랫폼적인 성격을 갖게 되는 것도 구현하고 싶어 검색 기능을 추가하였다.
@ResponseBody
@GetMapping("/search/{is_public}/{is_recruit}/{is_ftf}/{page}")
// 약속 검색
public ResponseForm searchAppointList(
String search,
@PathVariable("is_public") Integer is_public,
@PathVariable("is_recruit") Integer is_recruit,
@PathVariable("is_ftf") Integer is_ftf,
@PathVariable("page") Integer page) {
return appointService.getSearchAppointList(search, is_public, is_recruit, is_ftf, page);
}
@PathVariable 어노테이션을 통해 공개방여부, 모집중인지, 대면만남여부, 페이지를 매개변수로 받아 리스트로 출력한다.
public ResponseForm getSearchAppointList(String search, Integer isPublic, Integer isRecruit, Integer isFtf, Integer page) {
ResponseForm res = new ResponseForm();
Boolean is_public = isPublic == 1 ? true : false;
Boolean is_recruit = isRecruit == 1 ? true : false;
C.appointType is_ftf = isFtf == 1 ? C.appointType.FTF : C.appointType.NFTF;
// 페이징 설정
int pageSize = 10;
Pageable pageable = PageRequest.of(page, pageSize, Sort.by("id").descending());
// 조건에 맞는 appoint리스트 생성
Page<Appoint> appointList =
appointRepository.findByIsPublicAndIsRecruitAndTypeAndTitleContainsAndDdayAfter(
is_public, is_recruit, is_ftf, search, LocalDateTime.now() ,pageable);
// 불러올 약속이 없으면 에러
if (appointList.getContent().size() == 0) return res.setError("더이상 약속이 없습니다");
// 방장 이름 세팅
for(Appoint a : appointList.getContent()) {
List<MyAppoint> ma = myAppointRepository.findByAppointIdAndIsMaster(a.getId(), true);
if (ma == null || ma.size() == 0) {
a.setMemo("0&unknown");
continue;
}
User u = userRepository.findById(ma.get(0).getUserId()).orElse(null);
if (u == null) {
a.setMemo("0&unknown");
continue;
}
a.setMemo(u.getId() + "&" + u.getName());
}
return res.setSuccess(appointList.getContent());
}
공개여부 1: 공개, 0: 비공개
모집여부 1: 모집중, 0: 모집완료
만남여부 1: 만남, 0: 온라인