Skip to content

Commit 1d705a9

Browse files
authored
Merge pull request #146 from ItRecode/develop
version 0.1.1 배포
2 parents ad975cf + c5f8807 commit 1d705a9

11 files changed

Lines changed: 336 additions & 3 deletions

File tree

src/main/java/com/recordit/server/controller/RecordController.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,16 @@
1919
import org.springframework.web.multipart.MultipartFile;
2020

2121
import com.recordit.server.dto.record.ModifyRecordRequestDto;
22+
import com.recordit.server.dto.record.RandomRecordRequestDto;
23+
import com.recordit.server.dto.record.RandomRecordResponseDto;
2224
import com.recordit.server.dto.record.RecordByDateRequestDto;
2325
import com.recordit.server.dto.record.RecordByDateResponseDto;
2426
import com.recordit.server.dto.record.RecordDetailResponseDto;
2527
import com.recordit.server.dto.record.WriteRecordRequestDto;
2628
import com.recordit.server.dto.record.WriteRecordResponseDto;
2729
import com.recordit.server.dto.record.memory.MemoryRecordRequestDto;
2830
import com.recordit.server.dto.record.memory.MemoryRecordResponseDto;
31+
import com.recordit.server.dto.record.mix.MixRecordResponseDto;
2932
import com.recordit.server.exception.ErrorMessage;
3033
import com.recordit.server.service.RecordService;
3134

@@ -171,4 +174,31 @@ public ResponseEntity<Long> modifyRecord(
171174
) {
172175
return ResponseEntity.ok().body(recordService.modifyRecord(recordId, modifyRecordRequestDto, attachments));
173176
}
177+
178+
@ApiOperation(
179+
value = "레코드 랜덤 조회",
180+
notes = "레코드를 랜덤으로 조회합니다."
181+
)
182+
@ApiResponses({
183+
@ApiResponse(
184+
code = 200, message = "레코드 랜덤 조회 성공",
185+
response = RandomRecordResponseDto.class
186+
),
187+
@ApiResponse(
188+
code = 400,
189+
message = "잘못 된 요청",
190+
response = ErrorMessage.class
191+
)
192+
})
193+
@GetMapping("/random")
194+
public ResponseEntity<List<RandomRecordResponseDto>> getRandomRecord(
195+
@ModelAttribute @Valid RandomRecordRequestDto randomRecordRequestDto
196+
) {
197+
return ResponseEntity.ok(recordService.getRandomRecord(randomRecordRequestDto));
198+
}
199+
200+
@GetMapping("/mix")
201+
public ResponseEntity<MixRecordResponseDto> getMixRecords() {
202+
return ResponseEntity.ok().body(recordService.getMixRecords());
203+
}
174204
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.recordit.server.dto.record;
2+
3+
import javax.validation.constraints.NotNull;
4+
5+
import io.swagger.annotations.ApiModel;
6+
import io.swagger.annotations.ApiParam;
7+
import lombok.AccessLevel;
8+
import lombok.AllArgsConstructor;
9+
import lombok.Builder;
10+
import lombok.Getter;
11+
import lombok.ToString;
12+
13+
@Getter
14+
@ToString
15+
@ApiModel
16+
@AllArgsConstructor(access = AccessLevel.PROTECTED)
17+
@Builder
18+
public class RandomRecordRequestDto {
19+
@ApiParam(value = "카테고리 ID", required = true, example = "1")
20+
@NotNull
21+
private Long recordCategoryId;
22+
23+
@ApiParam(value = "댓글 리스트의 사이즈", required = true, example = "5")
24+
@NotNull
25+
private Integer size;
26+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package com.recordit.server.dto.record;
2+
3+
import com.recordit.server.domain.Record;
4+
5+
import io.swagger.annotations.ApiParam;
6+
import lombok.Getter;
7+
import lombok.Setter;
8+
import lombok.ToString;
9+
10+
@Getter
11+
@Setter
12+
@ToString
13+
public class RandomRecordResponseDto {
14+
@ApiParam(value = "레코드 ID", required = true)
15+
private Long recordId;
16+
17+
@ApiParam(value = "레코드 제목", required = true)
18+
private String title;
19+
20+
@ApiParam(value = "레코드 컬러명", required = true)
21+
private String colorName;
22+
23+
@ApiParam(value = "레코드 아이콘명", required = true)
24+
private String iconName;
25+
26+
@ApiParam(value = "댓글 개수", required = true)
27+
private Long commentCount;
28+
29+
private RandomRecordResponseDto(Long recordId, String title, String colorName, String iconName, Long commentCount) {
30+
this.recordId = recordId;
31+
this.title = title;
32+
this.colorName = colorName;
33+
this.iconName = iconName;
34+
this.commentCount = commentCount;
35+
}
36+
37+
public static RandomRecordResponseDto of(
38+
Record record,
39+
Long commentCount
40+
) {
41+
return new RandomRecordResponseDto(
42+
record.getId(),
43+
record.getTitle(),
44+
record.getRecordColor().getName(),
45+
record.getRecordIcon().getName(),
46+
commentCount
47+
);
48+
}
49+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package com.recordit.server.dto.record.mix;
2+
3+
import io.swagger.annotations.ApiModel;
4+
import io.swagger.annotations.ApiModelProperty;
5+
import lombok.AccessLevel;
6+
import lombok.Builder;
7+
import lombok.Getter;
8+
import lombok.NoArgsConstructor;
9+
import lombok.ToString;
10+
11+
@Getter
12+
@ToString
13+
@ApiModel
14+
@NoArgsConstructor(access = AccessLevel.PROTECTED)
15+
public class MixRecordDto {
16+
@ApiModelProperty(notes = "믹스 레코드 아이디")
17+
private Long recordId;
18+
19+
@ApiModelProperty(notes = "믹스 레코드 색상이름")
20+
private String colorName;
21+
22+
@ApiModelProperty(notes = "믹스 레코드 아이콘이름")
23+
private String iconName;
24+
25+
@ApiModelProperty(notes = "믹스 레코드 댓글 아이디")
26+
private Long commentId;
27+
28+
@ApiModelProperty(notes = "믹스 레코드 댓글 내용")
29+
private String commentContent;
30+
31+
@Builder
32+
public MixRecordDto(
33+
Long recordId,
34+
String colorName,
35+
String iconName,
36+
Long commentId,
37+
String commentContent
38+
) {
39+
this.recordId = recordId;
40+
this.colorName = colorName;
41+
this.iconName = iconName;
42+
this.commentId = commentId;
43+
this.commentContent = commentContent;
44+
}
45+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.recordit.server.dto.record.mix;
2+
3+
import java.util.List;
4+
5+
import io.swagger.annotations.ApiModel;
6+
import io.swagger.annotations.ApiModelProperty;
7+
import lombok.AccessLevel;
8+
import lombok.Builder;
9+
import lombok.Getter;
10+
import lombok.NoArgsConstructor;
11+
import lombok.ToString;
12+
13+
@Getter
14+
@ToString
15+
@ApiModel
16+
@NoArgsConstructor(access = AccessLevel.PROTECTED)
17+
public class MixRecordResponseDto {
18+
@ApiModelProperty(notes = "믹스레코드 리스트")
19+
private List<MixRecordDto> mixRecordDto;
20+
21+
@Builder
22+
public MixRecordResponseDto(List<MixRecordDto> mixRecordDto) {
23+
this.mixRecordDto = mixRecordDto;
24+
}
25+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.recordit.server.exception.record;
2+
3+
public class FixRecordNotExistException extends RuntimeException {
4+
public FixRecordNotExistException(String message) {
5+
super(message);
6+
}
7+
}

src/main/java/com/recordit/server/exception/record/RecordExceptionHandler.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,4 +56,11 @@ public ResponseEntity<ErrorMessage> handleInvalidPageParameterException(
5656
return ResponseEntity.badRequest()
5757
.body(ErrorMessage.of(exception, HttpStatus.BAD_REQUEST));
5858
}
59+
60+
@ExceptionHandler(FixRecordNotExistException.class)
61+
public ResponseEntity<ErrorMessage> handleFixRecordNotExistException(
62+
FixRecordNotExistException exception) {
63+
return ResponseEntity.badRequest()
64+
.body(ErrorMessage.of(exception, HttpStatus.BAD_REQUEST));
65+
}
5966
}

src/main/java/com/recordit/server/repository/CommentRepository.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,5 +25,10 @@ public interface CommentRepository extends JpaRepository<Comment, Long> {
2525

2626
Long countAllByParentComment(Comment parentComment);
2727

28-
List<Comment> findAllByRecord(Record record, Pageable pageable);
28+
List<Comment> findAllByRecordAndParentCommentIsNull(Record record, Pageable pageable);
29+
30+
Long countByRecordId(Long recordId);
31+
32+
@EntityGraph(attributePaths = {"record", "record.recordColor", "record.recordIcon"})
33+
List<Comment> findByRecord(Record fixRecord);
2934
}

src/main/java/com/recordit/server/repository/RecordRepository.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.recordit.server.repository;
22

33
import java.time.LocalDateTime;
4+
import java.util.List;
45
import java.util.Optional;
56

67
import org.springframework.data.domain.Page;
@@ -52,4 +53,13 @@ Page<Record> findAllByWriterAndCreatedAtBetweenOrderByCreatedAtDesc(
5253

5354
@Query("select r from RECORD r join fetch r.writer where r.id = :id")
5455
Optional<Record> findByIdFetchWriter(Long id);
56+
57+
@Query(value = "select * from RECORD r "
58+
+ "where r.DELETED_AT is null "
59+
+ "and r.RECORD_CATEGORY_ID IN ("
60+
+ "select c.RECORD_CATEGORY_ID "
61+
+ "from RECORD_CATEGORY c where c.PARENT_RECORD_CATEGORY_ID = :categoryId"
62+
+ ") "
63+
+ "order by RAND() limit :size", nativeQuery = true)
64+
List<Record> findRandomRecordByRecordCategoryId(Integer size, Long categoryId);
5565
}

src/main/java/com/recordit/server/service/RecordService.java

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package com.recordit.server.service;
22

3+
import java.util.ArrayList;
34
import java.util.LinkedHashMap;
45
import java.util.List;
56
import java.util.Map;
7+
import java.util.Random;
68
import java.util.stream.Collectors;
79

810
import org.springframework.data.domain.Page;
@@ -21,14 +23,19 @@
2123
import com.recordit.server.domain.RecordColor;
2224
import com.recordit.server.domain.RecordIcon;
2325
import com.recordit.server.dto.record.ModifyRecordRequestDto;
26+
import com.recordit.server.dto.record.RandomRecordRequestDto;
27+
import com.recordit.server.dto.record.RandomRecordResponseDto;
2428
import com.recordit.server.dto.record.RecordByDateRequestDto;
2529
import com.recordit.server.dto.record.RecordByDateResponseDto;
2630
import com.recordit.server.dto.record.RecordDetailResponseDto;
2731
import com.recordit.server.dto.record.WriteRecordRequestDto;
2832
import com.recordit.server.dto.record.WriteRecordResponseDto;
2933
import com.recordit.server.dto.record.memory.MemoryRecordRequestDto;
3034
import com.recordit.server.dto.record.memory.MemoryRecordResponseDto;
35+
import com.recordit.server.dto.record.mix.MixRecordDto;
36+
import com.recordit.server.dto.record.mix.MixRecordResponseDto;
3137
import com.recordit.server.exception.member.MemberNotFoundException;
38+
import com.recordit.server.exception.record.FixRecordNotExistException;
3239
import com.recordit.server.exception.record.NotMatchLoginUserWithRecordWriterException;
3340
import com.recordit.server.exception.record.RecordColorNotFoundException;
3441
import com.recordit.server.exception.record.RecordIconNotFoundException;
@@ -52,6 +59,8 @@
5259
@RequiredArgsConstructor
5360
public class RecordService {
5461

62+
private final int MIX_RECORD_COMMENT_SIZE = 10;
63+
private final long FIX_RECORD_PK_VALUE = 31L;
5564
private final int FIRST_PAGE = 0;
5665

5766
private final ImageFileRepository imageFileRepository;
@@ -192,7 +201,7 @@ public MemoryRecordResponseDto getMemoryRecords(MemoryRecordRequestDto memoryRec
192201
// key
193202
findRecord,
194203
// value
195-
commentRepository.findAllByRecord(
204+
commentRepository.findAllByRecordAndParentCommentIsNull(
196205
findRecord,
197206
PageRequest.of(
198207
FIRST_PAGE,
@@ -268,4 +277,53 @@ public Long modifyRecord(
268277

269278
return record.modify(modifyRecordRequestDto, recordColor, recordIcon);
270279
}
280+
281+
@Transactional
282+
public List<RandomRecordResponseDto> getRandomRecord(
283+
RandomRecordRequestDto randomRecordRequestDto
284+
) {
285+
if (!recordRepository.existsById(randomRecordRequestDto.getRecordCategoryId())) {
286+
throw new RecordCategoryNotFoundException("카테고리 정보를 찾을 수 없습니다.");
287+
}
288+
289+
List<Record> recordList = recordRepository.findRandomRecordByRecordCategoryId(
290+
randomRecordRequestDto.getSize(),
291+
randomRecordRequestDto.getRecordCategoryId()
292+
);
293+
294+
return recordList.stream()
295+
.map(record -> RandomRecordResponseDto.of(
296+
record,
297+
commentRepository.countByRecordId(record.getId())
298+
)).collect(Collectors.toList());
299+
}
300+
301+
@Transactional(readOnly = true)
302+
public MixRecordResponseDto getMixRecords() {
303+
Record fixRecord = recordRepository.findById(FIX_RECORD_PK_VALUE)
304+
.orElseThrow(() -> new FixRecordNotExistException("서버에 고정 레코드가 존재하지 않습니다."));
305+
306+
List<MixRecordDto> commentList = commentRepository.findByRecord(fixRecord).stream()
307+
.map(comment -> MixRecordDto.builder()
308+
.commentId(comment.getId())
309+
.colorName(comment.getRecord().getRecordColor().getName())
310+
.iconName(comment.getRecord().getRecordIcon().getName())
311+
.commentContent(comment.getContent())
312+
.recordId(comment.getRecord().getId())
313+
.build()
314+
).collect(Collectors.toList());
315+
316+
Random random = new Random();
317+
List<MixRecordDto> randomCommentList = new ArrayList<>();
318+
319+
if (commentList.size() != 0) {
320+
for (int i = 0; i < MIX_RECORD_COMMENT_SIZE; i++) {
321+
randomCommentList.add(commentList.get(random.nextInt(commentList.size())));
322+
}
323+
}
324+
325+
return MixRecordResponseDto.builder()
326+
.mixRecordDto(randomCommentList)
327+
.build();
328+
}
271329
}

0 commit comments

Comments
 (0)