Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat/#26/new memo api #36

Open
wants to merge 5 commits into
base: develop
Choose a base branch
from
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
126 changes: 126 additions & 0 deletions src/main/java/com/bestoctopus/dearme/controller/MemoController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
package com.bestoctopus.dearme.controller;


import com.bestoctopus.dearme.domain.Memo;
import com.bestoctopus.dearme.dto.GetMemoDto;
import com.bestoctopus.dearme.dto.MemoDto;
import com.bestoctopus.dearme.dto.PutMemoDto;
import com.bestoctopus.dearme.service.MemoService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Slice;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDate;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.Stream;

@RestController
@RequestMapping("/memo")
@RequiredArgsConstructor
public class MemoController {

private final MemoService memoService;


@GetMapping("")
public ResponseEntity<?> getMemoList(@RequestParam(required = false, defaultValue = "0", value = "page") int page) {

Slice<GetMemoDto> memoList = memoService.getAllMemoList(page);

return new ResponseEntity<>(memoList, HttpStatus.OK);
}


@GetMapping("/{memo_id}")
public ResponseEntity<?> getMemo(@PathVariable("memo_id") Long memo_id) {

Optional<Memo> memo = memoService.getMemo(memo_id);
Memo memo2 = memo.orElseThrow();
MemoDto memoDto = MemoDto.fromEntity(memo2);

return ResponseEntity.ok(memoDto);
}

@GetMapping("/tag")
public ResponseEntity<?> getMemoTagList(@RequestParam("tags") String tags,
@RequestParam(required = false, defaultValue = "0", value = "page") Integer page) {

int[] tagList = Arrays.stream(tags.split(",")).mapToInt(Integer::parseInt).toArray();

Slice<GetMemoDto> memoList = memoService.getMemoTagList(tagList, page);

return new ResponseEntity<>(memoList, HttpStatus.OK);
}

@GetMapping("/best")
public ResponseEntity<?> getBestMemo() {

Stream<GetMemoDto> memoList = memoService.getBestMemo();

return new ResponseEntity<>(memoList, HttpStatus.OK);
}

@GetMapping("/like")
public ResponseEntity<?> getLikesMemo(int page) {

Slice<GetMemoDto> memoList = memoService.getMemoSortedByLikes(page);

return new ResponseEntity<>(memoList, HttpStatus.OK);
}

@PostMapping("")
public ResponseEntity<?> postMemo(@RequestBody @Valid MemoDto memoDto) {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();

String userId = (String)authentication.getPrincipal();

memoService.postMemo(memoDto, userId);

return new ResponseEntity<>(HttpStatus.OK);
}

@PutMapping("/{memo_id}")
public ResponseEntity<?> putMemo(@PathVariable("memo_id") Long memoId,
@RequestBody @Valid PutMemoDto putMemoDto) {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();

String userId = (String)authentication.getPrincipal();

boolean updated = memoService.putMemo(memoId, userId, putMemoDto);

if (updated) {
return new ResponseEntity<>(HttpStatus.OK);
} else {
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
}


@DeleteMapping("/{memo_id}")
public ResponseEntity<?> deleteMemo(@PathVariable("memo_id") Long memoId) {

Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
String userId = (String)authentication.getPrincipal();

boolean deleted = memoService.deleteMemo(memoId, userId);

if (deleted) {
return new ResponseEntity<>(HttpStatus.OK);
} else {
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
}

// 좋아요 개발
}
47 changes: 39 additions & 8 deletions src/main/java/com/bestoctopus/dearme/domain/Memo.java
Original file line number Diff line number Diff line change
@@ -1,15 +1,18 @@
package com.bestoctopus.dearme.domain;

import com.bestoctopus.dearme.domain.relation.MemoLikeRelation;
import com.bestoctopus.dearme.domain.relation.MemoTagRelation;
import com.bestoctopus.dearme.dto.PutMemoDto;
import jakarta.persistence.*;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

@Entity
@Table(name = "memo")
Expand All @@ -18,25 +21,53 @@
public class Memo {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private Long id;

@ManyToOne
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id", nullable = false)
private User user;

//종류 넣기
@Column(nullable = false)
private MemoType type;

@Column(nullable = false)
private String content;

//질문 넣기
@ElementCollection
@CollectionTable(name = "answers", joinColumns = @JoinColumn(name = "memo_id"))
@Column(nullable = false)
private List<String> answers;

//좋아요
@OneToMany(mappedBy = "memo")
private Set<MemoLikeRelation> likes;

@Column(nullable = false)
private LocalDate date;

@Column(nullable = false)
private Status status;

@OneToMany(mappedBy = "memo",fetch = FetchType.LAZY)
private final List<MemoTagRelation> tags = new ArrayList<>();
}
@OneToMany(mappedBy = "memo")
private Set<MemoTagRelation> tags;

@Builder
public Memo(MemoType memoType, Status status, LocalDate date, String content, List<String> answers, User user) {
this.type = memoType;
this.status = status;
this.date = date;
this.content = content;
this.answers = answers;
this.user = user;
}


public void update(PutMemoDto putMemoDto) {
this.content = putMemoDto.getContent();
this.status = putMemoDto.getStatus();
}

public Set<String> getTagNameSet(){
return getTags().stream().map(tagRel->tagRel.getTag().getName()).collect(Collectors.toSet());
}
}
5 changes: 5 additions & 0 deletions src/main/java/com/bestoctopus/dearme/domain/MemoType.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.bestoctopus.dearme.domain;

public enum MemoType {
PRAISE, ANXIETY, DAILY
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.bestoctopus.dearme.domain.relation;

import com.bestoctopus.dearme.domain.Memo;
import com.bestoctopus.dearme.domain.User;
import jakarta.persistence.*;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Entity
@Table(name = "memo_like_relation")
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class MemoLikeRelation {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id", nullable = false)
private User user;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="memo_id",nullable = false)
private Memo memo;
}
42 changes: 42 additions & 0 deletions src/main/java/com/bestoctopus/dearme/dto/GetMemoDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package com.bestoctopus.dearme.dto;

import com.bestoctopus.dearme.domain.Memo;
import com.bestoctopus.dearme.domain.MemoType;
import com.bestoctopus.dearme.domain.Status;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;

import java.time.LocalDate;
import java.util.Set;

@Getter
@Setter
@Builder
@AllArgsConstructor
public class GetMemoDto {

private Long id;

private MemoType memoType;

private Status status;

private LocalDate date;

private int likes;

private Set<String> tags;

public static GetMemoDto fromEntity(Memo memo) {
return GetMemoDto.builder()
.id(memo.getId())
.memoType(memo.getType())
.status(memo.getStatus())
.date(memo.getDate())
.likes(memo.getLikes().size())
.tags(memo.getTagNameSet())
.build();
}
}
55 changes: 55 additions & 0 deletions src/main/java/com/bestoctopus/dearme/dto/MemoDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package com.bestoctopus.dearme.dto;


import com.bestoctopus.dearme.domain.Memo;
import com.bestoctopus.dearme.domain.MemoType;
import com.bestoctopus.dearme.domain.Status;
import com.bestoctopus.dearme.domain.User;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;

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

@Getter
@Setter
@Builder
@AllArgsConstructor
public class MemoDto {

private MemoType memoType;

private Status status;

private LocalDate date;

private String content;

private List<String> answers;

private Set<String> tags;

public Memo toEntity(User user){
return Memo.builder()
.memoType(this.memoType)
.status(this.status)
.date(this.date)
.content(this.content)
.answers(this.answers)
.user(user)
.build();
}

public static MemoDto fromEntity(Memo memo){
return MemoDto.builder()
.memoType(memo.getType())
.status(memo.getStatus())
.date(memo.getDate())
.content(memo.getContent())
.answers(memo.getAnswers())
.build();
}
}
15 changes: 15 additions & 0 deletions src/main/java/com/bestoctopus/dearme/dto/PutMemoDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.bestoctopus.dearme.dto;

import com.bestoctopus.dearme.domain.Status;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Getter
@Setter
@NoArgsConstructor
public class PutMemoDto {
private String content;

private Status status;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.bestoctopus.dearme.repository;

import com.bestoctopus.dearme.domain.Memo;
import io.lettuce.core.dynamic.annotation.Param;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Slice;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;

import java.time.LocalDate;
import java.util.List;
@Repository
public interface MemoRepository extends JpaRepository<Memo, Long> {

@Query("SELECT m FROM Memo m LEFT JOIN m.likes l GROUP BY m.id ORDER BY COUNT(l) DESC")
Page<Memo> findMemosWithLikes(Pageable pageable);

@Query("select distinct m from Memo m " +
"join fetch m.user " +
"left join fetch m.tags r " +
"join m.tags t " +
"where t.id in :tags")
Slice<Memo> findSliceByTag(@Param("tags") int[] tags, Pageable pageable);
}
Loading