Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package org.example.siljeun.domain.concert.service;

import java.time.Duration;
import java.util.List;
import java.util.Set;
import lombok.RequiredArgsConstructor;
Expand All @@ -18,6 +19,12 @@ public class ConcertCacheService {

public void increaseViewCount(Long concertId) {
redisTemplate.opsForZSet().incrementScore(RANK_KEY, concertId, 1);

redisTemplate.opsForZSet().incrementScore("ranking:daily", concertId, 1);
ensureTtl("ranking:daily", Duration.ofDays(1));

redisTemplate.opsForZSet().incrementScore("ranking:weekly", concertId, 1);
ensureTtl("ranking:weekly", Duration.ofDays(7));
}

public List<Long> getTopConcertIds(int limit) {
Expand All @@ -35,4 +42,11 @@ public List<Long> getTopConcertIds(String key, int limit) {
return ids.stream().map(id -> Long.valueOf(id.toString())).toList();
}

private void ensureTtl(String key, Duration ttl) {
Long expire = redisTemplate.getExpire(key);
if (expire == null || expire < 0) {
redisTemplate.expire(key, ttl);
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,8 @@ public class ConcertServiceImpl implements ConcertService {
@Override
@Transactional
public Long createConcert(ConcertCreateRequest request, Long userId) {
Venue venue = venueRepository.findById(request.venuId())
.orElseThrow(() -> new EntityNotFoundException("존재하지 않는 공연장입니다."));
Venue venue = venueRepository.findByIdAndDeletedAtIsNull(request.venuId())
.orElseThrow(() -> new EntityNotFoundException("존재하지 않거나 삭제된 공연장입니다."));

Concert concert = Concert.builder()
.title(request.title())
Expand All @@ -56,8 +56,8 @@ public void updateConcert(Long concertId, ConcertUpdateRequest request) {
Concert concert = concertRepository.findById(concertId)
.orElseThrow(() -> new EntityNotFoundException("해당 공연이 존재하지 않습니다."));

Venue venue = venueRepository.findById(request.venueId())
.orElseThrow(() -> new EntityNotFoundException("존재하지 않는 공연장입니다."));
Venue venue = venueRepository.findByIdAndDeletedAtIsNull(request.venueId())
.orElseThrow(() -> new EntityNotFoundException("존재하지 않거나 삭제된 공연장입니다."));

concert.update(
request.title(),
Expand Down Expand Up @@ -94,6 +94,11 @@ public ConcertDetailResponse getConcertDetail(Long concertId) {
Concert concert = concertRepository.findById(concertId)
.orElseThrow(() -> new EntityNotFoundException("해당 공연이 존재하지 않습니다."));

Venue venue = concert.getVenue();
if (venue.isDeleted()) {
throw new IllegalStateException("해당 공연장은 삭제되어 공연 상세 정보를 조회할 수 없습니다.");
}

VenueSimpleResponse venueResponse = new VenueSimpleResponse(
concert.getVenue().getId(),
concert.getVenue().getName(),
Expand Down
11 changes: 11 additions & 0 deletions src/main/java/org/example/siljeun/domain/venue/entity/Venue.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import java.time.LocalDate;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.example.siljeun.global.entity.BaseEntity;
Expand All @@ -29,6 +30,8 @@ public class Venue extends BaseEntity {
@Column(nullable = false)
private Integer seatCapacity;

private LocalDate deletedAt;

public Venue(String name, String location, int seatCapacity) {
this.name = name;
this.location = location;
Expand All @@ -40,4 +43,12 @@ public void update(String name, String location, int seatCapacity) {
this.location = location;
this.seatCapacity = seatCapacity;
}

public void softDelete() {
this.deletedAt = LocalDate.now();
}

public boolean isDeleted() {
return this.deletedAt != null;
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,13 @@
package org.example.siljeun.domain.venue.repository;

import java.util.List;
import java.util.Optional;
import org.example.siljeun.domain.venue.entity.Venue;
import org.springframework.data.jpa.repository.JpaRepository;

public interface VenueRepository extends JpaRepository<Venue, Long> {


List<Venue> findAllByDeletedAtIsNull();

Optional<Venue> findByIdAndDeletedAtIsNull(Long id);
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,14 @@ public void updateVenue(Long venueId, VenueUpdateRequest request) {

@Override
public void deleteVenue(Long venueId) {
venueRepository.deleteById(venueId);
Venue venue = venueRepository.findById(venueId)
.orElseThrow(() -> new EntityNotFoundException("해당 공연장을 찾을 수 없습니다."));

if (venue.isDeleted()) {
throw new IllegalStateException("이미 삭제된 공연장입니다.");
}

venue.softDelete();
}

}