Skip to content
Open
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
10 changes: 10 additions & 0 deletions src/main/java/gg/agit/konect/domain/event/controller/EventApi.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

import gg.agit.konect.domain.event.dto.EventBoothMapResponse;
import gg.agit.konect.domain.event.dto.EventBoothsResponse;
import gg.agit.konect.domain.event.dto.EventMiniEventsResponse;
import gg.agit.konect.domain.event.dto.EventProgramsResponse;
import gg.agit.konect.domain.event.enums.EventProgramType;
import gg.agit.konect.global.auth.annotation.UserId;
Expand Down Expand Up @@ -44,4 +45,13 @@ ResponseEntity<EventBoothsResponse> getEventBooths(
ResponseEntity<EventBoothMapResponse> getEventBoothMap(
@PathVariable Integer eventId
);

@Operation(summary = "행사 미니 이벤트 목록을 조회한다.")
@GetMapping("/{eventId}/mini-events")
ResponseEntity<EventMiniEventsResponse> getEventMiniEvents(
@PathVariable Integer eventId,
@RequestParam(defaultValue = "1") @Min(1) Integer page,
@RequestParam(defaultValue = "20") @Min(1) Integer limit,
@UserId Integer userId
);
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

import gg.agit.konect.domain.event.dto.EventBoothMapResponse;
import gg.agit.konect.domain.event.dto.EventBoothsResponse;
import gg.agit.konect.domain.event.dto.EventMiniEventsResponse;
import gg.agit.konect.domain.event.dto.EventProgramsResponse;
import gg.agit.konect.domain.event.enums.EventProgramType;
import gg.agit.konect.domain.event.service.EventService;
Expand Down Expand Up @@ -35,4 +36,10 @@ public ResponseEntity<EventBoothsResponse> getEventBooths(Integer eventId, Strin
public ResponseEntity<EventBoothMapResponse> getEventBoothMap(Integer eventId) {
return ResponseEntity.ok(eventService.getEventBoothMap(eventId));
}

@Override
public ResponseEntity<EventMiniEventsResponse> getEventMiniEvents(Integer eventId, Integer page, Integer limit,
Integer userId) {
return ResponseEntity.ok(eventService.getEventMiniEvents(eventId, page, limit, userId));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package gg.agit.konect.domain.event.dto;

public record EventMiniEventSummaryResponse(
Integer miniEventId,
String title,
String thumbnailUrl,
String description,
String reward,
String status,
boolean joined
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package gg.agit.konect.domain.event.dto;

import java.util.List;

public record EventMiniEventsResponse(
Long totalCount,
Integer currentCount,
Integer totalPage,
Integer currentPage,
List<EventMiniEventSummaryResponse> miniEvents
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package gg.agit.konect.domain.event.model;

import static jakarta.persistence.EnumType.STRING;
import static jakarta.persistence.FetchType.LAZY;
import static jakarta.persistence.GenerationType.IDENTITY;
import static lombok.AccessLevel.PROTECTED;

import gg.agit.konect.domain.event.enums.EventProgressStatus;
import gg.agit.konect.global.model.BaseEntity;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Enumerated;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@Entity
@Table(name = "event_mini_event")
@NoArgsConstructor(access = PROTECTED)
public class EventMiniEvent extends BaseEntity {

@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "id", nullable = false, updatable = false, unique = true)
private Integer id;

@ManyToOne(fetch = LAZY)
@JoinColumn(name = "event_id", nullable = false, updatable = false)
private Event event;

@Column(name = "title", nullable = false, length = 100)
private String title;

@Column(name = "description", nullable = false, length = 255)
private String description;

@Column(name = "thumbnail_url", length = 255)
private String thumbnailUrl;

@Column(name = "reward_label", length = 100)
private String rewardLabel;

@Enumerated(STRING)
@Column(name = "status", nullable = false, length = 20)
private EventProgressStatus status;

@Column(name = "display_order", nullable = false)
private Integer displayOrder;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package gg.agit.konect.domain.event.repository;

import java.util.List;

import org.springframework.data.repository.Repository;

import gg.agit.konect.domain.event.model.EventMiniEvent;

public interface EventMiniEventRepository extends Repository<EventMiniEvent, Integer> {

List<EventMiniEvent> findAllByEventIdOrderByDisplayOrderAscIdAsc(Integer eventId);

int countByEventId(Integer eventId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,16 +10,20 @@
import gg.agit.konect.domain.event.dto.EventBoothMapResponse;
import gg.agit.konect.domain.event.dto.EventBoothSummaryResponse;
import gg.agit.konect.domain.event.dto.EventBoothsResponse;
import gg.agit.konect.domain.event.dto.EventMiniEventSummaryResponse;
import gg.agit.konect.domain.event.dto.EventMiniEventsResponse;
import gg.agit.konect.domain.event.dto.EventProgramSummaryResponse;
import gg.agit.konect.domain.event.dto.EventProgramsResponse;
import gg.agit.konect.domain.event.enums.EventProgramType;
import gg.agit.konect.domain.event.model.EventBooth;
import gg.agit.konect.domain.event.model.EventBoothMap;
import gg.agit.konect.domain.event.model.EventBoothMapItem;
import gg.agit.konect.domain.event.model.EventMiniEvent;
import gg.agit.konect.domain.event.model.EventProgram;
import gg.agit.konect.domain.event.repository.EventBoothMapItemRepository;
import gg.agit.konect.domain.event.repository.EventBoothMapRepository;
import gg.agit.konect.domain.event.repository.EventBoothRepository;
import gg.agit.konect.domain.event.repository.EventMiniEventRepository;
import gg.agit.konect.domain.event.repository.EventProgramRepository;
import gg.agit.konect.domain.event.repository.EventRepository;
import gg.agit.konect.global.exception.CustomException;
Expand All @@ -35,6 +39,7 @@ public class EventService {
private final EventBoothRepository eventBoothRepository;
private final EventBoothMapRepository eventBoothMapRepository;
private final EventBoothMapItemRepository eventBoothMapItemRepository;
private final EventMiniEventRepository eventMiniEventRepository;

public EventProgramsResponse getEventPrograms(Integer eventId, EventProgramType type, Integer page, Integer limit,
Integer userId) {
Expand Down Expand Up @@ -108,6 +113,24 @@ public EventBoothMapResponse getEventBoothMap(Integer eventId) {
);
}

public EventMiniEventsResponse getEventMiniEvents(Integer eventId, Integer page, Integer limit, Integer userId) {
getEvent(eventId);

List<EventMiniEvent> miniEvents = eventMiniEventRepository.findAllByEventIdOrderByDisplayOrderAscIdAsc(eventId);
PagedResult<EventMiniEvent> pagedMiniEvents = paginate(miniEvents, page, limit);
List<EventMiniEventSummaryResponse> miniEventResponses = pagedMiniEvents.items().stream()
.map(this::toEventMiniEventSummaryResponse)
.toList();

return new EventMiniEventsResponse(
(long)pagedMiniEvents.totalCount(),
miniEventResponses.size(),
pagedMiniEvents.totalPage(),
page,
miniEventResponses
);
}

private void getEvent(Integer eventId) {
eventRepository.findById(eventId)
.orElseThrow(() -> CustomException.of(NOT_FOUND_EVENT));
Expand Down Expand Up @@ -161,6 +184,18 @@ private EventBoothMapResponse.BoothMapItemResponse toEventBoothMapItemResponse(E
);
}

private EventMiniEventSummaryResponse toEventMiniEventSummaryResponse(EventMiniEvent miniEvent) {
return new EventMiniEventSummaryResponse(
miniEvent.getId(),
miniEvent.getTitle(),
miniEvent.getThumbnailUrl(),
miniEvent.getDescription(),
miniEvent.getRewardLabel(),
miniEvent.getStatus().name(),
false
);
}

private record PagedResult<T>(List<T> items, int totalCount, int totalPage) {
}
}
16 changes: 16 additions & 0 deletions src/main/resources/db/migration/V70__add_event_tables.sql
Original file line number Diff line number Diff line change
Expand Up @@ -78,3 +78,19 @@ CREATE TABLE IF NOT EXISTS event_booth_map_item
FOREIGN KEY (event_booth_id) REFERENCES event_booth (id) ON DELETE CASCADE,
CONSTRAINT uq_event_booth_map_item_booth_id UNIQUE (event_booth_id)
);

CREATE TABLE IF NOT EXISTS event_mini_event
(
id INT AUTO_INCREMENT PRIMARY KEY,
event_id INT NOT NULL,
title VARCHAR(100) NOT NULL,
description VARCHAR(255) NOT NULL,
thumbnail_url VARCHAR(255),
reward_label VARCHAR(100),
status ENUM ('UPCOMING', 'ONGOING', 'ENDED') NOT NULL,
display_order INT NOT NULL DEFAULT 0,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP NOT NULL,

FOREIGN KEY (event_id) REFERENCES event (id) ON DELETE CASCADE
);
Loading