Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
54 commits
Select commit Hold shift + click to select a range
7038007
[FEAT] 노트 불러오기 컨트롤러 구현
paragon0107 Nov 5, 2024
1aa2e17
[FEAT] 노트 불러오기 DTO 추가
paragon0107 Nov 5, 2024
211629e
[FEAT] 노트 불러오기 성공 메세지 추가
paragon0107 Nov 5, 2024
fab33fb
[FEAT] NoteService 노트 불러오기 메서드 추가
paragon0107 Nov 5, 2024
c44ac9e
[FEAT] pull 반영
paragon0107 Nov 6, 2024
63e9e1d
[CHORE] ContentEncoder 생성, 기존 메서드를 분리
paragon0107 Nov 8, 2024
3fd6487
[CHORE] NoteController 삭제, 조회부분 구현
paragon0107 Nov 8, 2024
05c8278
[CHORE] 노트 삭제 서비스레이어 DTO 구현
paragon0107 Nov 8, 2024
b0cb30c
[CHORE] 노트 관련 매니저 Deleter 구현
paragon0107 Nov 8, 2024
d35de2c
[FEAT] 노트 Deleter 구현
paragon0107 Nov 8, 2024
d7a795e
[CHORE] 노트 엔티티 작성자 필드 추가
paragon0107 Nov 8, 2024
383cabf
[CHORE] 잘못 만든 Repository 삭제
paragon0107 Nov 8, 2024
1327b08
[CHORE] Document, TimeBlock 어댑터 수정
paragon0107 Nov 8, 2024
ec4859c
[CHORE] 노트 관련 Manager Repository 구현
paragon0107 Nov 8, 2024
558ea7d
[FEAT] NoteService 삭제, 조회 메서드 구현
paragon0107 Nov 8, 2024
474bffa
[FEAT] NoteFinder 구현
paragon0107 Nov 8, 2024
d690324
[FEAT] Note 관련 Manager 어댑터 구현
paragon0107 Nov 8, 2024
f8ab31b
[FEAT] 노트 조회 DTO 구현
paragon0107 Nov 8, 2024
ed196ec
[FEAT] 노트 조회 과련 다른 도메인 DTO 구현
paragon0107 Nov 8, 2024
1cfb2db
[FEAT] TimeBlockFinder 메서드 수정 반영
paragon0107 Nov 8, 2024
dd6bec4
[FEAT] 노트 조회 성공 메세지 추가
paragon0107 Nov 8, 2024
04748be
Merge branch 'develop' of https://github.com/Team-Tiki/TIKI_SERVER in…
paragon0107 Nov 11, 2024
2a78c8c
[FEAT] 자유형식 노트 조회 메서드 구현
paragon0107 Nov 11, 2024
5c3eb37
[CHORE] 오용된 VO제거
paragon0107 Nov 11, 2024
c274a59
[CHORE] 오용된 VO제거
paragon0107 Nov 11, 2024
db625f8
[FEAT] ContentDecoder 추가
paragon0107 Nov 11, 2024
dc4cacf
[FEAT] 메서드 네이밍 수정
paragon0107 Nov 11, 2024
d054a70
[FEAT] 디테일 뷰 자유형식 DTO 구현
paragon0107 Nov 11, 2024
1409095
[CHORE] 쓸모없는 import문 제거
paragon0107 Nov 11, 2024
1e1bc29
[CHORE] 노트 디테일 반환타입 변경
paragon0107 Nov 11, 2024
8274c2c
[CHORE] 누락된 final 추가
paragon0107 Nov 11, 2024
156691e
[FEAT] 디테일 뷰 반환 DTO 추가
paragon0107 Nov 11, 2024
de0e335
[FEAT] 디테일 뷰 반환 DTO 분리
paragon0107 Nov 11, 2024
d35dc5c
[CHORE] 디테일 뷰 반환 DTO 분리
paragon0107 Nov 11, 2024
bb1e8a2
[FEAT] ContentDecoder 추가
paragon0107 Nov 11, 2024
d9c260d
[FEAT] 노트 조회, 페이지네이션을 위한 인자값 추가
paragon0107 Nov 11, 2024
f7f266d
[CHORE] INIT_NUM 상수 경로 변경
paragon0107 Nov 11, 2024
e9da487
[FEAT] 노트 조회 메서드 페이지네이션 적용
paragon0107 Nov 11, 2024
d7352ab
[FEAT] 정렬 기준 엔티티 추가
paragon0107 Nov 11, 2024
4477aef
[FEAT] NoteRepository 페이지네이션 메서드 추가
paragon0107 Nov 11, 2024
e343bad
[FEAT] NoteFinder 페이지네이션 메서드 추가
paragon0107 Nov 11, 2024
6e71c28
[CHORE] 노트 조회 반환타입 수정
paragon0107 Nov 11, 2024
acd4afe
[CHORE] 페이지네이션 크기 상수 추가
paragon0107 Nov 11, 2024
50ceb05
[CHORE] 컨벤션 적용
paragon0107 Nov 11, 2024
62303eb
[CHORE] 컨벤션 적용
paragon0107 Nov 11, 2024
2a6c161
[CHORE] DTO 네이밍 컨벤션 적용
paragon0107 Nov 11, 2024
b50bd38
[CHORE] 삭제 성공 메세지 삭제
paragon0107 Nov 11, 2024
d3119ef
[CHORE] DTO 네이밍 컨벤션 제거
paragon0107 Nov 11, 2024
0b1c614
[CHORE] 쓸모없는 DTO 삭제
paragon0107 Nov 11, 2024
ab6fffc
[CHORE] DTO 네이밍 변경
paragon0107 Nov 11, 2024
a56535a
[CHORE] NoteDetailReponseDTO에 노트 ID 추가
paragon0107 Nov 11, 2024
948d304
[CHORE] 로직 단순화
paragon0107 Nov 11, 2024
c05fc15
[CHORE] 컨벤션 적용
paragon0107 Nov 11, 2024
6d93b66
[CHORE] DTO 네이밍 수정
paragon0107 Nov 11, 2024
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
1 change: 1 addition & 0 deletions src/main/java/com/tiki/server/common/Constants.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,5 @@ public class Constants {
public static final String AUTHORIZATION = "Authorization";
public static final String BEARER = "Bearer ";
public static final String WRONG_INPUT = "잘못된 JSON 형식입니다.";
public static final int INIT_NUM = 0;
}
5 changes: 5 additions & 0 deletions src/main/java/com/tiki/server/common/entity/SortOrder.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.tiki.server.common.entity;

public enum SortOrder {
ASC, DESC
}
21 changes: 21 additions & 0 deletions src/main/java/com/tiki/server/common/util/ContentDecoder.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.tiki.server.common.util;

import java.util.Base64;
import java.util.List;

public class ContentDecoder {

public static List<String> decodeNoteTemplate(final String encodedData) {
String[] parts = encodedData.split("\\|");
String decodedActivity = new String(Base64.getDecoder().decode(parts[0]));
String decodedPrepare = new String(Base64.getDecoder().decode(parts[1]));
String decodedDisappointing = new String(Base64.getDecoder().decode(parts[2]));
String decodedComplement = new String(Base64.getDecoder().decode(parts[3]));
return List.of(decodedActivity, decodedPrepare, decodedDisappointing, decodedComplement);
}

public static String decodeNoteFree(final String encodeDate) {
byte[] decodedBytes = Base64.getDecoder().decode(encodeDate);
return new String(decodedBytes);
}
}
19 changes: 19 additions & 0 deletions src/main/java/com/tiki/server/common/util/ContentEncoder.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.tiki.server.common.util;

import java.util.Base64;

public class ContentEncoder {

public static String encodeNoteTemplate(final String activity, final String prepare, final String disappointing, final String complement) {
String encodedActivity = Base64.getEncoder().encodeToString(activity.getBytes());
String encodedPrepare = Base64.getEncoder().encodeToString(prepare.getBytes());
String encodedDisappointing = Base64.getEncoder().encodeToString(disappointing.getBytes());
String encodedComplement = Base64.getEncoder().encodeToString(complement.getBytes());

return String.join("|", encodedActivity, encodedPrepare, encodedDisappointing, encodedComplement);
}

public static String encodeNoteFree(final String contents) {
return Base64.getEncoder().encodeToString(contents.getBytes());
}
}
46 changes: 25 additions & 21 deletions src/main/java/com/tiki/server/document/adapter/DocumentFinder.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,25 +18,29 @@
@RequiredArgsConstructor
public class DocumentFinder {

private final DocumentRepository documentRepository;

public Document findByIdWithTimeBlock(long documentId) {
Document document = documentRepository.findByIdWithTimeBlock(documentId);
if (Objects.isNull(document)) {
throw new DocumentException(INVALID_DOCUMENT);
}
return document;
}

public List<DocumentVO> findAllByTimeBlockId(long timeBlockId) {
return documentRepository.findAllByTimeBlockId(timeBlockId).stream().map(DocumentVO::from).toList();
}

public List<Document> findAllByTeamIdAndAccessiblePosition(long teamId, Position accessiblePosition) {
return documentRepository.findAllByTeamIdAndAccessiblePosition(teamId, accessiblePosition);
}

public List<Document> findAllByTeamId(long teamId) {
return documentRepository.findAllByTeamId(teamId);
}
private final DocumentRepository documentRepository;

public Document findByIdOrElseThrow(final long documentId) {
return documentRepository.findById(documentId).orElseThrow(()-> new DocumentException(INVALID_DOCUMENT));
}

public Document findByIdWithTimeBlock(long documentId) {
Document document = documentRepository.findByIdWithTimeBlock(documentId);
if (Objects.isNull(document)) {
throw new DocumentException(INVALID_DOCUMENT);
}
return document;
}

public List<DocumentVO> findAllByTimeBlockId(long timeBlockId) {
return documentRepository.findAllByTimeBlockId(timeBlockId).stream().map(DocumentVO::from).toList();
}

public List<Document> findAllByTeamIdAndAccessiblePosition(long teamId, Position accessiblePosition) {
return documentRepository.findAllByTeamIdAndAccessiblePosition(teamId, accessiblePosition);
}

public List<Document> findAllByTeamId(long teamId) {
return documentRepository.findAllByTeamId(teamId);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.tiki.server.document.service.dto.response;

import com.tiki.server.document.entity.Document;

public record DocumentTagGetServiceResponse(
long id,
String fileName,
String fileUrl,
double capacity
) {

public static DocumentTagGetServiceResponse from(final Document document) {
return new DocumentTagGetServiceResponse(
document.getId(),
document.getFileName(),
document.getFileUrl(),
document.getCapacity());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ public class EmailConstants {
public static final String MAIL_FORMAT_EDU = ".edu";
public static final String MAIL_FORMAT_AC_KR = ".ac.kr";
public static final String TEMPLATE_NAME = "certification";
public static final int INIT_NUM = 0;
public static final int CODE_LENGTH = 6;
public static final int CODE_NUM_MAX_VALUE_PER_WORD = 10;
public static final String CERTIFICATION_PAGE_LOGO_IMAGE_VAR = "image";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import java.util.stream.Collectors;
import java.util.stream.IntStream;

import static com.tiki.server.common.Constants.INIT_NUM;
import static com.tiki.server.emailverification.constants.EmailConstants.*;
import static com.tiki.server.emailverification.message.ErrorCode.MESSAGE_HELPER_ERROR;

Expand Down
18 changes: 18 additions & 0 deletions src/main/java/com/tiki/server/note/adapter/NoteDeleter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.tiki.server.note.adapter;

import com.tiki.server.common.support.RepositoryAdapter;
import com.tiki.server.note.repository.NoteRepository;
import lombok.RequiredArgsConstructor;

import java.util.List;

@RepositoryAdapter
@RequiredArgsConstructor
public class NoteDeleter {

private final NoteRepository noteRepository;

public void deleteNoteByIds(final List<Long> noteIds){
noteIds.forEach(noteRepository::deleteById);
}
}
33 changes: 33 additions & 0 deletions src/main/java/com/tiki/server/note/adapter/NoteFinder.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.tiki.server.note.adapter;

import com.tiki.server.common.support.RepositoryAdapter;
import com.tiki.server.note.entity.Note;
import com.tiki.server.note.exception.NoteException;
import com.tiki.server.note.repository.NoteRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.PageRequest;

import java.time.LocalDateTime;
import java.util.List;

import static com.tiki.server.note.message.ErrorCode.INVALID_NOTE;

@RepositoryAdapter
@RequiredArgsConstructor
public class NoteFinder {

private final NoteRepository noteRepository;

public List<Note> findByModifiedAtBeforeOrderByModifiedAtDesc(final LocalDateTime lastUpdatedAt, final PageRequest pageRequest) {
return noteRepository.findByModifiedAtBeforeOrderByModifiedAtDesc(lastUpdatedAt, pageRequest);
}

public List<Note> findByModifiedAtAfterOrderByModifiedAtAsc(final LocalDateTime lastUpdatedAt, final PageRequest pageRequest) {
return noteRepository.findByModifiedAtAfterOrderByModifiedAtAsc(lastUpdatedAt, pageRequest);
}

public Note findById(final long noteId) {
return noteRepository.findById(noteId)
.orElseThrow(() -> new NoteException(INVALID_NOTE));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.tiki.server.note.constants;

public class NoteConstants {

public static final int PAGE_SIZE = 10;
}
67 changes: 53 additions & 14 deletions src/main/java/com/tiki/server/note/controller/NoteController.java
Original file line number Diff line number Diff line change
@@ -1,24 +1,26 @@
package com.tiki.server.note.controller;

import com.tiki.server.common.dto.SuccessResponse;
import com.tiki.server.common.entity.SortOrder;
import com.tiki.server.common.support.UriGenerator;
import com.tiki.server.note.controller.dto.request.NoteFreeCreateRequest;
import com.tiki.server.note.controller.dto.request.NoteTemplateCreateRequest;
import com.tiki.server.note.service.NoteService;
import com.tiki.server.note.service.dto.request.NoteFreeCreateDTO;
import com.tiki.server.note.service.dto.request.NoteTemplateCreateDTO;
import com.tiki.server.note.service.dto.response.NoteCreateResponseDTO;
import com.tiki.server.note.service.dto.request.NoteFreeCreateServiceRequest;
import com.tiki.server.note.service.dto.request.NoteTemplateCreateServiceRequest;
import com.tiki.server.note.service.dto.response.NoteCreateServiceResponse;
import com.tiki.server.note.service.dto.response.NoteDetailGetServiceResponse;
import com.tiki.server.note.service.dto.response.NoteListGetServiceResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;

import java.security.Principal;
import java.time.LocalDateTime;
import java.util.List;

import static com.tiki.server.common.dto.SuccessResponse.success;
import static com.tiki.server.note.message.SuccessMessage.CREATE_NOTE_FREE;
import static com.tiki.server.note.message.SuccessMessage.*;

@RestController
@RequiredArgsConstructor
Expand All @@ -28,26 +30,63 @@ public class NoteController {
private final NoteService noteService;

@PostMapping("/free")
public ResponseEntity<SuccessResponse<NoteCreateResponseDTO>> createNoteFree(
public ResponseEntity<SuccessResponse<NoteCreateServiceResponse>> createNoteFree(
final Principal principal,
@RequestBody final NoteFreeCreateRequest request
) {
long memberId = Long.parseLong(principal.getName());
NoteCreateResponseDTO response = noteService.createNoteFree(NoteFreeCreateDTO.of(request, memberId));
NoteCreateServiceResponse response = noteService.createNoteFree(NoteFreeCreateServiceRequest.of(request, memberId));
return ResponseEntity.created(
UriGenerator.getUri("/api/v1/notes" + response.noteId())
).body(success(CREATE_NOTE_FREE.getMessage(), response));
).body(success(CREATE_NOTE.getMessage(), response));
}

@PostMapping("/template")
public ResponseEntity<SuccessResponse<NoteCreateResponseDTO>> createNoteTemplate(
public ResponseEntity<SuccessResponse<NoteCreateServiceResponse>> createNoteTemplate(
final Principal principal,
@RequestBody final NoteTemplateCreateRequest request
) {
long memberId = Long.parseLong(principal.getName());
NoteCreateResponseDTO response = noteService.createNoteTemplate(NoteTemplateCreateDTO.of(request, memberId));
NoteCreateServiceResponse response = noteService.createNoteTemplate(NoteTemplateCreateServiceRequest.of(request, memberId));
return ResponseEntity.created(
UriGenerator.getUri("/api/v1/notes" + response.noteId())
).body(success(CREATE_NOTE_FREE.getMessage(), response));
).body(success(CREATE_NOTE.getMessage(), response));
}

@GetMapping("/{teamId}")
public ResponseEntity<SuccessResponse<NoteListGetServiceResponse>> getNote(
final Principal principal,
@PathVariable long teamId,
@RequestParam(required = false) LocalDateTime lastUpdatedAt,
@RequestParam(defaultValue = "DESC") SortOrder sortOrder
) {
long memberId = Long.parseLong(principal.getName());
if (lastUpdatedAt == null) {
lastUpdatedAt = (sortOrder == SortOrder.DESC) ? LocalDateTime.now() : LocalDateTime.of(1970, 1, 1, 0, 0);
}
NoteListGetServiceResponse response = noteService.getNote(teamId, memberId, lastUpdatedAt, sortOrder);
return ResponseEntity.ok().body(success(GET_NOTE.getMessage(), response));
}

@GetMapping("/{teamId}/{noteId}")
public ResponseEntity<SuccessResponse<NoteDetailGetServiceResponse>> getNoteDetail(
final Principal principal,
@PathVariable final long teamId,
@PathVariable final long noteId
) {
long memberId = Long.parseLong(principal.getName());
NoteDetailGetServiceResponse response = noteService.getNoteDetail(teamId, memberId, noteId);
return ResponseEntity.ok().body(success(GET_NOTE_DETAIL.getMessage(), response));
}

@DeleteMapping("/{teamId}")
public ResponseEntity<SuccessResponse<Void>> deleteNotes(
final Principal principal,
@PathVariable long teamId,
@RequestParam List<Long> noteIds
) {
long memberId = Long.parseLong(principal.getName());
noteService.deleteNotes(noteIds, teamId, memberId);
return ResponseEntity.noContent().build();
}
}
4 changes: 4 additions & 0 deletions src/main/java/com/tiki/server/note/entity/Note.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ public class Note extends BaseTime {

private String title;

private String author;

private boolean complete;

private LocalDate startDate;
Expand All @@ -43,6 +45,7 @@ public class Note extends BaseTime {

public static Note of(
final String title,
final String author,
final boolean complete,
final LocalDate startDate,
final LocalDate endDate,
Expand All @@ -53,6 +56,7 @@ public static Note of(
) {
return Note.builder()
.title(title)
.author(author)
.complete(complete)
.startDate(startDate)
.endDate(endDate)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@
@RequiredArgsConstructor
public enum SuccessMessage {

CREATE_NOTE_FREE("노트 생성 성공");
GET_NOTE("노트 조회 성공"),
GET_NOTE_DETAIL("노트 상세 조회 성공"),
CREATE_NOTE("노트 생성 성공");

private final String message;
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,19 @@
package com.tiki.server.note.repository;

import com.tiki.server.note.entity.Note;
import io.lettuce.core.dynamic.annotation.Param;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;

import java.time.LocalDateTime;
import java.util.List;

public interface NoteRepository extends JpaRepository<Note, Long> {

List<Note> findAllByTeamId(final long teamId);
@Query("SELECT n FROM Note n WHERE n.updatedAt < :lastModifiedAt ORDER BY n.updatedAt DESC")
List<Note> findByModifiedAtBeforeOrderByModifiedAtDesc(@Param("lastModifiedAt") LocalDateTime lastModifiedAt, Pageable pageable);

@Query("SELECT n FROM Note n WHERE n.updatedAt > :lastModifiedAt ORDER BY n.updatedAt ASC")
List<Note> findByModifiedAtAfterOrderByModifiedAtAsc(@Param("lastModifiedAt") LocalDateTime lastModifiedAt, Pageable pageable);
}
Loading
Loading