Igloo-Club / Igloo-Club-BE

1 stars 1 forks source link

Feat/#17 #23

Closed ryuseunghan closed 8 months ago

ryuseunghan commented 8 months ago

๐Ÿ”ฅ Related Issues

๐Ÿ’œ ์ž‘์—… ๋‚ด์šฉ

โœ… PR Point

- ๋ˆˆ๊ธธ ๋งค์นญ ๊ธฐ๋Šฅ์€ nungilId๋ฅผ param์œผ๋กœ ๋ฐ›์•„์˜ค๋ฉฐ
- ์‚ฌ์šฉ์ž์˜ RECEIVED ์ƒํƒœ์˜ ๋ˆˆ๊ธธ์„ MATCHED ์ƒํƒœ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ 
- ๋ˆˆ๊ธธ์„ ๋ณด๋‚ธ ์ƒ๋Œ€๋ฐฉ์˜ ๋ˆˆ๊ธธ์„ SENT ์ƒํƒœ์—์„œ MATCHED ์ƒํƒœ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค
- ๋ˆˆ๊ธธ์ด ์ž˜๋ชป๋œ ์ƒํƒœ์ผ ์‹œ ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.
public void matchNungil(Long nungilId){

    Nungil receivedNungil = nungilRepository.findById(nungilId)
            .orElseThrow(()->new GeneralException(NungilErrorResult.NUNGIL_NOT_FOUND));
    //๋ˆˆ๊ธธ์ด ์ž˜๋ชป๋œ ์ƒํƒœ์ผ ์‹œ ์—๋Ÿฌ ๋ฐœ์ƒ
    if(!receivedNungil.getStatus().equals(NungilStatus.RECEIVED)){
        throw new GeneralException(NungilErrorResult.NUNGIL_WRONG_STATUS);
    }

    //์‚ฌ์šฉ์ž์˜ ๋ˆˆ๊ธธ์„ MATCHED ์ƒํƒœ๋กœ ๋ณ€๊ฒฝ
    receivedNungil.setStatus(NungilStatus.MATCHED);
    receivedNungil.setExpiredAtNull();

    //์ˆ˜์ทจ์ž์˜ ๋ˆˆ๊ธธ ์กฐํšŒ ํ›„ MATCHED ์ƒํƒœ๋กœ ๋ณ€๊ฒฝ
    Member member = receivedNungil.getMember();
    Member sender = receivedNungil.getReceiver();
    Optional<Nungil> optionalNungil = nungilRepository.findFirstByMemberAndReceiver(sender, member);
    if(optionalNungil.isEmpty()){
        throw new GeneralException(NungilErrorResult.NUNGIL_NOT_FOUND);
    }
    Nungil sentNungil = optionalNungil.get();
    sentNungil.setStatus(NungilStatus.MATCHED);
    receivedNungil.setExpiredAtNull();

    String marker = null;
    String time = null;
    if(!findCommonMarkers(member, sender).isEmpty()){
        marker = findCommonMarkers(member, sender).get(0).toString();
    }
    if(!findCommonAvailableTimes(member, sender).isEmpty()){
        time = findCommonAvailableTimes(member, sender).get(0).toString();
    }
    receivedNungil.update(marker, time);
}
- ๋งค์นญ๋œ ๋ˆˆ๊ธธ ์ƒ์„ธ ์กฐํšŒ๋Š” ๋งค์นญ ์ดํ›„์— "๋งค์นญ์ด ์„ฑ์‚ฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค" ํŽ˜์ด์ง€๋ฅผ ์—ผ๋‘ํ•˜์—ฌ ๊ธฐ๋Šฅ์„ ์„ค๊ณ„ํ–ˆ์Šต๋‹ˆ๋‹ค
- ์š”์ผ์€ ๊ฒน์น˜๋Š” ์š”์ผ ์ค‘ ๊ฐ€์žฅ ๋น ๋ฅธ ์š”์ผ๋กœ ์„ ์ •ํ•ฉ๋‹ˆ๋‹ค
- ๋งˆ์ปค์™€ ์‹œ๊ฐ„์€ ๊ฒน์น˜๋Š” ์š”์†Œ ์ค‘ ์ฒซ๋ฒˆ์งธ ์š”์†Œ๋กœ ์„ ์ •ํ•ฉ๋‹ˆ๋‹ค
- ๊ฒน์น˜์ง€ ์•Š๋Š” ์š”์†Œ๋Š” null์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค

//๋‘ ์‚ฌ์šฉ์ž์˜ ๊ณตํ†ต ์‹œ๊ฐ„์„ ์ถ”์ถœ public List findCommonAvailableTimes(Member member1, Member member2) { List list1 = member1.getAvailableTimeAllocationList(); List list2 = member2.getAvailableTimeAllocationList();

    Set<AvailableTime> timesSet1 = list1.stream()
            .map(AvailableTimeAllocation::getAvailableTime)
            .collect(Collectors.toSet());

    Set<AvailableTime> timesSet2 = list2.stream()
            .map(AvailableTimeAllocation::getAvailableTime)
            .collect(Collectors.toSet());

    // ๊ต์ง‘ํ•ฉ ์ฐพ๊ธฐ
    timesSet1.retainAll(timesSet2);

    return new ArrayList<>(timesSet1);
}
//๋‘ ์‚ฌ์šฉ์ž์˜ ๊ณตํ†ต ๋งˆ์ปค๋ฅผ ์ถ”์ถœ
public List<Marker> findCommonMarkers(Member member1, Member member2) {
    Set<Marker> markerSet1 = member1.getMarkerAllocationList().stream()
            .map(MarkerAllocation::getMarker)
            .collect(Collectors.toSet());

    Set<Marker> markerSet2 = member2.getMarkerAllocationList().stream()
            .map(MarkerAllocation::getMarker)
            .collect(Collectors.toSet());

    // ๊ต์ง‘ํ•ฉ ์ฐพ๊ธฐ
    markerSet1.retainAll(markerSet2);

    return new ArrayList<>(markerSet1);
}

public Yoil findCommonYoil(Member member1, Member member2) {
    List<Yoil> list1 = member1.getYoilList();
    List<Yoil> list2 = member2.getYoilList();
    Set<DayOfWeek> set1 = EnumSet.noneOf(DayOfWeek.class);
    for (Yoil yoil : list1) {
        set1.add(yoil.getDayOfWeek());
    }

    LocalDateTime now = LocalDateTime.now();
    boolean isAfter11AM = now.getHour() >= 11;

    for (Yoil yoil : list2) {
        if (set1.contains(yoil.getDayOfWeek())) {
            if (isAfter11AM) {
                return findNextYoil(yoil, now);
            } else {
                return yoil;
            }
        }
    }

    return null;
}

private Yoil findNextYoil(Yoil yoil, LocalDateTime now) {
    DayOfWeek today = now.getDayOfWeek();
    int daysUntilNext = (7 + yoil.getDayOfWeek().getValue() - today.getValue()) % 7;
    if (daysUntilNext == 0) {
        daysUntilNext = 7;
    }
    return Yoil.values()[(today.getValue() + daysUntilNext - 1) % 7];
}
public NungilMatchResponse getMatchedNungil(Long nungilId){
    Member member = nungilRepository.findById(nungilId).get().getMember();
    Member receiver = nungilRepository.findById(nungilId).get().getReceiver();
    Optional<Nungil> optionalNungil = nungilRepository.findById(nungilId);
    Nungil nungil = optionalNungil.get();
    NungilMatchResponse response = NungilMatchResponse.builder()
            .yoil(findCommonYoil(member, receiver))
            .marker(nungil.getMatchedMarkers())
            .time(nungil.getMatchedAvailableTimes())
            .build();
    return response;
}
- ๋ˆˆ๊ธธ์„ ์‚ญ์ œํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค
- ๊ธฐํš์— ๋”ฐ๋ผ ์˜ค์ „ 11์‹œ์— ๋ชจ๋“  RECOMMENDED ์ƒํƒœ์˜ ๋ˆˆ๊ธธ์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค
- ๋งค ์‹œ๊ฐ„ expiredAt์ด ๋„˜์–ด๊ฐ„ ๋ˆˆ๊ธธ์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค
@Scheduled(cron = "0 0 * * * *") // ๋งค์‹œ ์ •๊ฐ์— ์‹คํ–‰
@Transactional
public void deleteExpiredNungils() {
    LocalDateTime now = LocalDateTime.now();
    List<Nungil> expiredNungils = nungilRepository.findByExpiredAtBefore(now);
    for (Nungil nungil : expiredNungils) {
        nungilRepository.delete(nungil);
    }
}

@Scheduled(cron = "0 0 11 * * *") // ๋งค์ผ ์˜ค์ „ 11์‹œ์— ์‹คํ–‰
@Transactional
public void deleteRecommendedNungils() {
    LocalDateTime now = LocalDateTime.now();
    List<Nungil> recommendedNungils = nungilRepository.findByStatus(NungilStatus.RECOMMENDED);
    for (Nungil nungil : recommendedNungils) {
        nungilRepository.delete(nungil);
    }
}


## ๐Ÿ˜ก Trouble Shooting

- ์–ด๋–ค ์–ด๋ ค์›€์ด ์žˆ์—ˆ๊ณ  ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ–ˆ๋Š”์ง€

## โ˜€ ์Šคํฌ๋ฆฐ์ƒท / GIF / ํ™”๋ฉด ๋…นํ™”

## ๐Ÿ“š Reference

- ๊ตฌํ˜„์— ์ฐธ๊ณ ํ•œ ๋งํฌ (ํ•„์š”ํ•œ ๊ฒฝ์šฐ๋งŒ ์ž‘์„ฑํ•˜๊ณ  ์—†์œผ๋ฉด ์ง€์šฐ๊ธฐ)