Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
13 commits
Select commit Hold shift + click to select a range
ea9b4ba
feat : ν•˜μ΄λΌμ΄νŠΈ 선택 μΊ˜λ¦°λ” 쑰회 DTO κ΅¬ν˜„ #225
tkv00 Nov 17, 2025
a0be82e
feat : μœ μ €μ˜ ν•˜μ΄λΌμ΄νŠΈ 쑰회 κ΅¬ν˜„ #225
tkv00 Nov 17, 2025
cb8b5df
feat : λ…„ μ›” κΈ°κ°„ λ‚΄ μƒμ„±λœ ν•˜μ΄λΌμ΄νŠΈ μ˜μƒ λͺ©λ‘ 쑰회 및 κ·Έλ£Ήν•‘ λΉ„μ¦ˆλ‹ˆμŠ€ 둜직 κ΅¬ν˜„ #224
tkv00 Nov 17, 2025
17d98c0
feat : μ‹œμž‘/λ§ˆμ§€λ§‰ 일 계산 λ©”μ„œλ“œ κ΅¬ν˜„ #224
tkv00 Nov 17, 2025
c250ac9
refact : λ‚’μ§œ λ²”μœ„ 계산 DateTimeRange record λ°˜ν™˜μœΌλ‘œ λ³€κ²½ #224
tkv00 Nov 17, 2025
8227be5
feat : λ…„ μ›” κΈ°κ°„ λ‚΄ μƒμ„±λœ ν•˜μ΄λΌμ΄νŠΈ μ˜μƒ μΊ˜λ¦°λ”ν˜• λͺ©λ‘ 쑰회 λΉ„μ¦ˆλ‹ˆμŠ€ 둜직 κ΅¬ν˜„ #224
tkv00 Nov 17, 2025
9f657d4
refact : highlight 생성 λ‚ μ§œ ν•„λ“œ μΆ”κ°€
tkv00 Nov 17, 2025
2b09252
refact : highlight video 선택 λΉ„μ¦ˆλ‹ˆμŠ€ 둜직 μ‚­μ œ
tkv00 Nov 17, 2025
94da6fa
refact : Highlight entity is_selected ν•„λ“œ μ‚­μ œ
tkv00 Nov 17, 2025
7dee147
refact : HashTag BLOCKING μΆ”κ°€
tkv00 Nov 17, 2025
116b45f
refact : κΈ°κ°„ λ‚΄ 눌린 μ’‹μ•„μš” κΈ°μ€€ 인기 ν•˜μ΄λΌμ΄νŠΈ 쑰회 GROUP BY μΆ”κ°€
tkv00 Nov 17, 2025
6be5ceb
refact : HighlightFactory μˆ˜μ •
tkv00 Nov 17, 2025
b11a833
chore : logback-color μ˜μ‘΄μ„± 제거
tkv00 Nov 18, 2025
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
2 changes: 2 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,8 @@ dependencies {
testCompileOnly 'org.projectlombok:lombok'
testAnnotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.junit.jupiter:junit-jupiter:5.10.0'
implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.9.0'


//redisson
implementation 'org.redisson:redisson-spring-boot-starter:3.18.0'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,6 @@ private PagingQueryProvider pagingQueryProvider(){

/**
* 1. μ‹œκ°„ 쑰건
* + is_selected = true
* + is_aggregation_agreed = true
*/
queryProvider.setSelectClause("""
Expand All @@ -103,7 +102,6 @@ private PagingQueryProvider pagingQueryProvider(){
queryProvider.setWhereClause("""
WHERE
m.is_aggregation_agreed = true
AND h.is_selected = true
AND h.created_at BETWEEN :begin AND :end
""");

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,9 @@
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDate;
import java.util.List;
import java.util.TreeMap;
import java.util.UUID;

@Component
Expand All @@ -31,36 +33,6 @@ public class HighlightManager {
private final HighlightFactory factory;
private final MemberHelper memberHelper;

/*==========================
*
*HighlightManager
* μ—¬λŸ¬κ°œμ˜ ν•˜μ΄λΌμ΄νŠΈ μ˜μƒ 쀑 μœ μ €κ°€ μ„ νƒν•˜λŠ” λ©”μ„œλ“œ
* @parm request : μš”μ²­ dto memberId : 멀버 Id
* @return μ„ νƒλœ ν•˜μ΄λΌμ΄νŠΈ μ˜μƒ Id 리슀트
* @author kimdoyeon
* @version 1.0.0
* @date 25. 10. 7.
*
==========================**/
@Transactional
@CustomLog
public HighlightSelectResponse selectHighlight(HighlightSelectRequest request, Member member){
List<UUID> selectedIds=request.getSelectedHighlightIds();
/**
* 1. μœ μ €κ°€ 선택 μš”μ²­ν•œ ν•˜μ΄λΌμ΄νŠΈ Id 리슀트 -> μ—”ν‹°ν‹°λ‘œ κ°€μ Έμ˜€κΈ°
*/
List<HighlightEntity> highlights = selectedIds.stream()
.map(highlightHelper::findHighlightByHighlightId)
.toList();

/*
* 2. 선택 μˆ˜ν–‰
*/
highlights.forEach(entity -> entity.select(member));

return mapper.entityToResponse(selectedIds);
}

/*==========================
*
*HighlightManager
Expand Down Expand Up @@ -89,7 +61,7 @@ public void saveHighlights(HighlightRequest request, UUID memberId) {
/*
* 2. ν•˜μ΄λΌμ΄νŠΈ μ—”ν‹°ν‹° 생성
*/
List<HighlightEntity> entities=factory.createHighlightEntities(request.getHighlightUrls(),request.getHighlightIdentifier(),member,backNumber);
List<HighlightEntity> entities=factory.createHighlightEntities(request.getHighlightUrls(),request.getHighlightIdentifier(),member,backNumber,request.getCreatedAt());

/*
3. DB μ €μž₯
Expand Down Expand Up @@ -118,4 +90,28 @@ public List<PeriodHighlightResponse> fetchAllMembersHighlights(String period){
PeriodType convertedType=PeriodType.valueOf(period);
return highlightHelper.fetchAllMembersHighlights(convertedType);
}

public HighlightCalendarResponse fetchCalendar(int year, int month,UUID memberId) {
/**
* 1. year,month μž…λ ₯ κ°’ 검증
*/
highlightHelper.isValidDateRange(year,month);

/**
* 2.λ…„ μ›” κΈ°κ°„ λ‚΄ μƒμ„±λœ ν•˜μ΄λΌμ΄νŠΈ μ˜μƒ 쑰회 - flat data 쑰회
*/
List<HighlightInfoResponse> flatHighlightList=highlightHelper.fetchFlatHighlightList(year,month,memberId);

/**
* 3. flat data κ·Έλ£Ήν•‘ν•œ 데이터 쑰회
*/
TreeMap<LocalDate,List<HighlightInfoResponse>> groupingHighlights=highlightHelper.groupingHighlights(flatHighlightList);

/**
* 4.date와 λ§€ν•‘λœ 데이터 λ°˜ν™˜
*/
List<HighlightCalendarDaysResponse> daysResponses=mapper.groupingHighlightToDaysResponse(groupingHighlights);

return new HighlightCalendarResponse(year,month,daysResponses);
}
}
Original file line number Diff line number Diff line change
@@ -1,15 +1,9 @@
package com.midas.shootpointer.domain.highlight.business.command;

import com.midas.shootpointer.domain.highlight.dto.HighlightRequest;
import com.midas.shootpointer.domain.highlight.dto.HighlightSelectRequest;
import com.midas.shootpointer.domain.highlight.dto.HighlightSelectResponse;
import com.midas.shootpointer.domain.member.entity.Member;

import java.util.UUID;

public interface HighlightCommandService {
HighlightSelectResponse selectHighlight(HighlightSelectRequest request, Member member);

void uploadHighlights(HighlightRequest highlights, UUID memberId);
}
////
Original file line number Diff line number Diff line change
Expand Up @@ -16,21 +16,6 @@
@Slf4j
public class HighlightCommandServiceImpl implements HighlightCommandService {
private final HighlightManager manager;
/*==========================
*
*HighlightCommandServiceImpl
*
* @parm HighlightSelectRequest : ν•˜μ΄λΌμ΄νŠΈ 선택 μš”μ²­ Dto , token : JWT
* @return ν•˜μ΄λΌμ΄νŠΈ 선택 성곡 μ‹œ μ„ νƒν•œ ν•˜μ΄λΌμ΄νŠΈ id λ°˜ν™˜ dto
* @author kimdoyeon
* @version 1.0.0
* @date 6/23/25
*
==========================**/
@Override
public HighlightSelectResponse selectHighlight(HighlightSelectRequest request, Member member) {
return manager.selectHighlight(request,member);
}

/*==========================
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,7 @@

import com.midas.shootpointer.domain.highlight.business.command.HighlightCommandService;
import com.midas.shootpointer.domain.highlight.dto.HighlightRequest;
import com.midas.shootpointer.domain.highlight.dto.HighlightSelectRequest;
import com.midas.shootpointer.domain.highlight.dto.HighlightSelectResponse;
import com.midas.shootpointer.domain.member.entity.Member;
import com.midas.shootpointer.global.dto.ApiResponse;
import com.midas.shootpointer.global.security.SecurityUtils;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
Expand All @@ -24,15 +20,6 @@
public class HighlightCommandController {
private final HighlightCommandService highlightCommandService;

@PostMapping("/select")
public ResponseEntity<ApiResponse<HighlightSelectResponse>> selectHighlight(
@RequestBody HighlightSelectRequest request
) {
Member member = SecurityUtils.getCurrentMember();

return ResponseEntity.ok(ApiResponse.ok(highlightCommandService.selectHighlight(request, member)));
}

@Operation(
summary = "ν•˜μ΄λΌμ΄νŠΈ URL 전솑 API (OpenCV μ—μ„œ μ‚¬μš©) - [λ‹΄λ‹Ήμž : 김도연]",
responses = {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.midas.shootpointer.domain.highlight.controller;

import com.midas.shootpointer.domain.highlight.business.HighlightManager;
import com.midas.shootpointer.domain.highlight.dto.HighlightCalendarResponse;
import com.midas.shootpointer.domain.highlight.dto.HighlightInfoResponse;
import com.midas.shootpointer.domain.highlight.dto.PeriodHighlightResponse;
import com.midas.shootpointer.global.dto.ApiResponse;
Expand Down Expand Up @@ -31,8 +32,26 @@ public ResponseEntity<ApiResponse<Page<HighlightInfoResponse>>> highlightList(
return ResponseEntity.ok(ApiResponse.ok( manager.listByPaging(page,size,memberId)));
}

/**
* @param period WEEKLY : 이번 μ£Ό / MONTHLY : 이번 달
* @return 이번 μ£Ό / 이번 달 인기 ν•˜μ΄λΌμ΄νŠΈ 쑰회
*/
@GetMapping
public ResponseEntity<ApiResponse<List<PeriodHighlightResponse>>> periodHighlight(@RequestParam(value = "period")String period){
return ResponseEntity.ok(ApiResponse.ok(manager.fetchAllMembersHighlights(period)));
}

/**
* @param year 쑰회 연도
* @param month 쑰회 달
* @return μΊ˜λ¦°λ”ν˜• μœ μ €μ˜ λ‚ μ§œλ³„ ν•˜μ΄λΌμ΄νŠΈ μ˜μƒ 리슀트 쑰회
*/
@GetMapping("/calendar")
public ResponseEntity<ApiResponse<HighlightCalendarResponse>> fetchCalendar(
@RequestParam(value = "year") int year,
@RequestParam(value = "month")int month
){
UUID memberId=SecurityUtils.getCurrentMemberId();
return ResponseEntity.ok(ApiResponse.ok(manager.fetchCalendar(year,month,memberId)));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.midas.shootpointer.domain.highlight.dto;

import java.time.LocalDateTime;

public record DateTimeRange(LocalDateTime start,LocalDateTime end) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.midas.shootpointer.domain.highlight.dto;

import jakarta.validation.constraints.NotNull;

import java.time.LocalDate;
import java.util.List;

public record HighlightCalendarDaysResponse(
@NotNull LocalDate date,
@NotNull Integer count,
@NotNull List<HighlightInfoResponse> highlights
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.midas.shootpointer.domain.highlight.dto;

import jakarta.validation.constraints.NotNull;

import java.util.List;

public record HighlightCalendarResponse(
@NotNull Integer year,
@NotNull Integer month,
@NotNull List<HighlightCalendarDaysResponse> days
) {
}

Original file line number Diff line number Diff line change
@@ -1,14 +1,12 @@
package com.midas.shootpointer.domain.highlight.dto;

import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.Size;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.util.List;
import java.util.UUID;

@AllArgsConstructor
Expand All @@ -18,9 +16,8 @@
@Schema(description = "ν•˜μ΄λΌμ΄νŠΈ 선택 μš”μ²­ DTO μž…λ‹ˆλ‹€.")
public class HighlightSelectRequest {
/**
* 3κ°€μ§€ 쀑 2개 선택
* κ²Œμ‹œλ¬Ό - 3κ°€μ§€ 쀑 1개 선택
*/
@NotEmpty
@Size(min = 2,max = 2,message = "ν•˜μ΄λΌμ΄νŠΈλ₯Ό μ •ν™•νžˆ 2개λ₯Ό μ„ νƒν•΄μ£Όμ„Έμš”.")
private List<UUID> selectedHighlightIds;
@NotNull
private UUID selectedHighlightIds;
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,7 @@

import com.midas.shootpointer.domain.backnumber.entity.BackNumberEntity;
import com.midas.shootpointer.domain.member.entity.Member;
import com.midas.shootpointer.global.common.ErrorCode;
import com.midas.shootpointer.global.entity.BaseEntity;
import com.midas.shootpointer.global.exception.CustomException;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
Expand All @@ -13,6 +11,7 @@
import lombok.extern.slf4j.Slf4j;
import org.hibernate.annotations.UuidGenerator;

import java.time.LocalDateTime;
import java.util.UUID;

@Entity
Expand All @@ -34,10 +33,6 @@ public class HighlightEntity extends BaseEntity {
@Column(name = "highlight_key",nullable = false,columnDefinition = "uuid")
private UUID highlightKey;

@Column(name = "is_selected")
@Builder.Default
private Boolean isSelected=false;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "member_id",nullable = false, columnDefinition = "uuid")
private Member member;
Expand All @@ -55,20 +50,12 @@ public class HighlightEntity extends BaseEntity {
@Builder.Default
private Integer threePointCount=0;

@Column(name = "video_created_at")
private LocalDateTime videoCreatedAt;

/*
=========== [ 도메인-ν–‰μœ„ ] ==============
*/
public void select(Member actor){
//μœ μ €μ˜ ν•˜μ΄λΌμ΄νŠΈ μ˜μƒμ΄ μ•„λ‹Œκ²½μš°
if (!actor.getMemberId().equals(member.getMemberId())){
throw new CustomException(ErrorCode.IS_NOT_CORRECT_MEMBERS_HIGHLIGHT_ID);
}
//이미 μ„ νƒλœ ν•˜μ΄λΌμ΄νŠΈ μ˜μƒμΈ 경우
if (Boolean.TRUE.equals(this.isSelected)){
throw new CustomException(ErrorCode.EXISTED_SELECTED);
}
this.isSelected=true;
}

//2점 μŠ› 계산
public int totalTwoPoint(){
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.midas.shootpointer.domain.highlight.helper;

import com.midas.shootpointer.domain.highlight.dto.DateTimeRange;
import com.midas.shootpointer.domain.highlight.dto.HighlightInfoResponse;
import com.midas.shootpointer.domain.highlight.dto.PeriodHighlightResponse;
import com.midas.shootpointer.domain.highlight.dto.PeriodType;
import com.midas.shootpointer.domain.highlight.entity.HighlightEntity;
Expand All @@ -9,8 +11,10 @@
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
import java.util.TreeMap;
import java.util.UUID;

@Component
Expand Down Expand Up @@ -44,13 +48,23 @@ public List<PeriodHighlightResponse> fetchAllMembersHighlights(PeriodType period
}

@Override
public LocalDateTime calculateStartDate(PeriodType type, LocalDateTime now) {
return highlightUtil.calculateStartDate(type,now);
public DateTimeRange calculateDateTimeRange(PeriodType type, LocalDateTime now) {
return highlightUtil.calculateDateTimeRange(type,now);
}

@Override
public LocalDateTime calculateEndDate(PeriodType type, LocalDateTime now) {
return highlightUtil.calculateEndDate(type,now);
public TreeMap<LocalDate, List<HighlightInfoResponse>> groupingHighlights(List<HighlightInfoResponse> flatHighlightList) {
return highlightUtil.groupingHighlights(flatHighlightList);
}

@Override
public List<HighlightInfoResponse> fetchFlatHighlightList(int year, int month, UUID memberId) {
return highlightUtil.fetchFlatHighlightList(year,month,memberId);
}

@Override
public DateTimeRange getMonthDateTimeRange(int year, int month) {
return highlightUtil.getMonthDateTimeRange(year,month);
}

@Override
Expand Down Expand Up @@ -87,4 +101,9 @@ public boolean isExistDirectory(String directory) {
public void areValidFiles(List<MultipartFile> files) {
highlightValidator.areValidFiles(files);
}

@Override
public void isValidDateRange(int year, int month) {
highlightValidator.isValidDateRange(year,month);
}
}
Loading