Skip to content

Commit

Permalink
fix: ViewpointReactionEntity storage implementation
Browse files Browse the repository at this point in the history
  • Loading branch information
kiki0518 committed Nov 27, 2024
1 parent 17a6d1f commit 6332bf1
Show file tree
Hide file tree
Showing 13 changed files with 179 additions and 69 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ public interface UserRepository extends CrudRepository<UserEntity, Long> {

Optional<FullUserEntity> findUserEntityByUsername(String username);

Optional<FullUserEntity> findUserEntityById(Long id);

SimpleUserEntity findIdByEmail(String email);

@Modifying
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,15 @@
package tw.commonground.backend.service.viewpoint;

import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.security.oauth2.core.user.DefaultOAuth2User;
import org.springframework.web.bind.annotation.*;
//import tw.commonground.backend.service.fact.entity.FactEntity;
import tw.commonground.backend.service.viewpoint.dto.ViewpointMapper;
import tw.commonground.backend.service.viewpoint.dto.ViewpointReactionResponse;
import tw.commonground.backend.service.viewpoint.dto.ViewpointResponse;
import tw.commonground.backend.service.viewpoint.dto.ViewpointUpdateRequest;
import tw.commonground.backend.service.viewpoint.entity.ViewpointEntity;
import tw.commonground.backend.service.viewpoint.entity.ViewpointReaction;
import tw.commonground.backend.service.user.entity.FullUserEntity;
import tw.commonground.backend.service.viewpoint.dto.*;
import tw.commonground.backend.service.viewpoint.entity.ViewpointReactionEntity;

import java.util.UUID;

Expand Down Expand Up @@ -62,11 +61,15 @@ public ResponseEntity<Void> deleteViewPoint(@PathVariable @NotNull UUID id) {
return ResponseEntity.noContent().build();
}


@PreAuthorize("isAuthenticated()")
@PostMapping("/viewpoint/{id}/reaction/me")
public ResponseEntity<ViewpointResponse> reactToViewPoint(
public ResponseEntity<ViewpointReactionResponse> reactToViewPoint(
@AuthenticationPrincipal DefaultOAuth2User user,
@PathVariable @NotNull UUID id,
@RequestBody ViewpointReaction reaction) {
ViewpointResponse response = ViewpointMapper.toResponse(viewpointService.reactToViewpoint(id, reaction));
@RequestBody ViewpointReactionRequest reactionRequest) {
Long userId = user.getAttribute("id");
ViewpointReactionResponse response = ViewpointMapper.toReactionResponse(viewpointService.reactToViewpoint(userId, id, reactionRequest.getReaction()));
return ResponseEntity.ok(response);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package tw.commonground.backend.service.viewpoint;

import org.springframework.data.jpa.repository.JpaRepository;
import tw.commonground.backend.service.viewpoint.entity.Reaction;
import tw.commonground.backend.service.viewpoint.entity.ViewpointReactionEntity;
import tw.commonground.backend.service.viewpoint.entity.ViewpointReactionId;

import java.util.Optional;

public interface ViewpointReactionRepository extends JpaRepository<ViewpointReactionEntity, ViewpointReactionId> {
Optional<ViewpointReactionEntity> findById(ViewpointReactionId id);

// need to query who liked the viewpoint



}
Original file line number Diff line number Diff line change
@@ -1,33 +1,37 @@
package tw.commonground.backend.service.viewpoint;

import jakarta.persistence.Column;
import org.springframework.stereotype.Service;
import tw.commonground.backend.exception.EntityNotFoundException;
//import tw.commonground.backend.service.fact.entity.FactEntity;
//import tw.commonground.backend.service.fact.entity.FactRepository;
import tw.commonground.backend.service.user.entity.UserEntity;
import tw.commonground.backend.service.user.entity.UserRepository;
import tw.commonground.backend.service.viewpoint.dto.ViewpointMapper;
import tw.commonground.backend.service.viewpoint.dto.ViewpointResponse;
import tw.commonground.backend.service.viewpoint.dto.ViewpointUpdateRequest;
import tw.commonground.backend.service.viewpoint.entity.Reaction;
import tw.commonground.backend.service.viewpoint.entity.ViewpointEntity;
import tw.commonground.backend.service.viewpoint.entity.ViewpointReaction;
import tw.commonground.backend.service.viewpoint.entity.ViewpointReactionEntity;
import tw.commonground.backend.service.viewpoint.entity.ViewpointReactionId;

import java.net.URI;
import java.time.LocalDateTime;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;

import java.util.Optional;
import static java.lang.String.valueOf;
import static tw.commonground.backend.service.viewpoint.entity.Reaction.*;

@Service
public class ViewpointService {
private final ViewpointRepository viewpointRepository;
// private final FactRepository factRepository;
private final UserRepository userRepository;

private final ViewpointMapper viewpointMapper = new ViewpointMapper();
private final ViewpointReactionRepository viewpointReactionRepository;

public ViewpointService(ViewpointRepository viewpointRepository) {
public ViewpointService(ViewpointRepository viewpointRepository, ViewpointReactionRepository viewpointReactionRepository, UserRepository userRepository) {
this.viewpointRepository = viewpointRepository;
this.viewpointReactionRepository = viewpointReactionRepository;
this.userRepository = userRepository;
}

// public ViewpointService(ViewpointRepository viewpointRepository, FactRepository factRepository) {
Expand All @@ -50,13 +54,66 @@ public void deleteViewpoint(UUID id) {
viewpointRepository.flush();
}

public ViewpointEntity reactToViewpoint(UUID id, ViewpointReaction reaction) {
ViewpointEntity viewpointEntity = viewpointRepository.findViewpointEntityById(id).orElseThrow(
() -> new EntityNotFoundException("Viewpoint", "id", id.toString()));
viewpointEntity.setUserReaction(reaction);
public ViewpointReactionEntity reactToViewpoint(Long userId, UUID viewpointId, String reaction) {
ViewpointReactionId viewpointReactionId = new ViewpointReactionId(userId, viewpointId);
// check if the user and viewpoint exist in the database
UserEntity userEntity = userRepository.findById(userId).orElseThrow(
() -> new EntityNotFoundException("User", "id", valueOf(userId)));
ViewpointEntity viewpointEntity = viewpointRepository.findViewpointEntityById(viewpointId).orElseThrow(
() -> new EntityNotFoundException("Viewpoint", "id", viewpointId.toString()));

// check if the viewpointReactionEntity exists in the database, if not means the user has not reacted to the viewpoint
ViewpointReactionEntity viewpointReactionEntity = viewpointReactionRepository.findById(viewpointReactionId).orElseGet(() -> {
ViewpointReactionEntity newViewpointReactionEntity = new ViewpointReactionEntity();
// create a new ViewpointReactionEntity with the given userId and viewpointId
newViewpointReactionEntity.setId(viewpointReactionId);
newViewpointReactionEntity.setReaction(Reaction.NONE);
return newViewpointReactionEntity;
});

Reaction previousReaction = viewpointReactionEntity.getReaction();
switch (previousReaction) {
case NONE:
break;
case LIKE:
viewpointEntity.setLikeCount(viewpointEntity.getLikeCount() - 1);
break;
case REASONABLE:
viewpointEntity.setReasonableCount(viewpointEntity.getReasonableCount() - 1);
break;
case DISLIKE:
viewpointEntity.setDislikeCount(viewpointEntity.getDislikeCount() - 1);
break;
default:
throw new IllegalArgumentException("Invalid reaction: " + previousReaction);
}

viewpointReactionEntity.setReaction(Reaction.valueOf(reaction));
switch (Reaction.valueOf(reaction)) {
case NONE: // delete the viewpointReactionEntity if the reaction is NONE
viewpointReactionRepository.delete(viewpointReactionEntity);
viewpointRepository.flush();
break;
case LIKE:
viewpointReactionEntity.setReaction(LIKE);
viewpointEntity.setLikeCount(viewpointEntity.getLikeCount() + 1);
viewpointReactionRepository.save(viewpointReactionEntity);
break;
case REASONABLE:
viewpointReactionEntity.setReaction(REASONABLE);
viewpointEntity.setReasonableCount(viewpointEntity.getReasonableCount() + 1);
viewpointReactionRepository.save(viewpointReactionEntity);
break;
case DISLIKE:
viewpointReactionEntity.setReaction(DISLIKE);
viewpointEntity.setDislikeCount(viewpointEntity.getDislikeCount() + 1);
viewpointReactionRepository.save(viewpointReactionEntity);
break;
default:
throw new IllegalArgumentException("Invalid reaction: " + reaction);
}
viewpointRepository.save(viewpointEntity);

return viewpointEntity;
return viewpointReactionEntity;
}

// public ViewpointEntity addFactToViewpoint(UUID id, UUID factId) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package tw.commonground.backend.service.viewpoint.dto;


import tw.commonground.backend.service.viewpoint.entity.ViewpointReaction;
import tw.commonground.backend.service.viewpoint.entity.ViewpointEntity;
import tw.commonground.backend.service.viewpoint.entity.ViewpointReactionEntity;

import java.util.List;

Expand All @@ -12,8 +12,8 @@ public ViewpointMapper() {
// hide the constructor
}

public static ViewpointReactionResponse toReactionResponse(ViewpointReaction viewpointReaction) {
return new ViewpointReactionResponse(viewpointReaction.getReaction().name());
public static ViewpointReactionResponse toReactionResponse(ViewpointReactionEntity viewpointReactionEntity) {
return new ViewpointReactionResponse(viewpointReactionEntity.getReaction().name());
}

public static ViewpointResponse toResponse(ViewpointEntity viewpointEntity) {
Expand All @@ -26,7 +26,7 @@ public static ViewpointResponse toResponse(ViewpointEntity viewpointEntity) {
.authorId(viewpointEntity.getAuthorId())
.authorName(viewpointEntity.getAuthorName())
.authorAvatar(viewpointEntity.getAuthorAvatar())
.userReaction(viewpointEntity.getUserReaction())
// .userReaction(viewpointEntity.getUserReaction())
.likeCount(viewpointEntity.getLikeCount())
.reasonableCount(viewpointEntity.getReasonableCount())
.dislikeCount(viewpointEntity.getDislikeCount())
Expand All @@ -46,7 +46,7 @@ public static List<ViewpointResponse> toResponses(List<ViewpointEntity> viewpoin
.authorId(viewpointEntity.getAuthorId())
.authorName(viewpointEntity.getAuthorName())
.authorAvatar(viewpointEntity.getAuthorAvatar())
.userReaction(viewpointEntity.getUserReaction())
// .userReaction(viewpointEntity.getUserReaction())
.likeCount(viewpointEntity.getLikeCount())
.reasonableCount(viewpointEntity.getReasonableCount())
.dislikeCount(viewpointEntity.getDislikeCount())
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@

package tw.commonground.backend.service.viewpoint.dto;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class ViewpointReactionBase {
private String reaction;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package tw.commonground.backend.service.viewpoint.dto;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class ViewpointReactionRequest extends ViewpointReactionBase {
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@

@Getter
@Setter
@AllArgsConstructor
public class ViewpointReactionResponse {
private String reaction;
}
public class ViewpointReactionResponse extends ViewpointReactionBase {
public ViewpointReactionResponse(String reaction) {
this.setReaction(reaction);
}
}
Original file line number Diff line number Diff line change
@@ -1,15 +1,13 @@
package tw.commonground.backend.service.viewpoint.dto;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import tw.commonground.backend.service.viewpoint.entity.ViewpointReactionEntity;
//import tw.commonground.backend.service.fact.entity.FactEntity;
import tw.commonground.backend.service.viewpoint.entity.ViewpointReaction;

import java.net.URI;
import java.time.LocalDateTime;
import java.util.List;
import java.util.UUID;


Expand All @@ -25,7 +23,7 @@ public class ViewpointResponse {
private UUID authorId;
private String authorName;
private URI authorAvatar;
private ViewpointReaction userReaction;
private ViewpointReactionEntity userReaction;
private Integer likeCount;
private Integer reasonableCount;
private Integer dislikeCount;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,8 @@ public class ViewpointEntity {
@GeneratedValue(strategy = GenerationType.AUTO)
private UUID id;

// @Column(nullable = false)
private LocalDateTime createdAt;

// @Column(nullable = false)
private LocalDateTime updatedAt;

@Column(nullable = false)
Expand All @@ -31,29 +29,20 @@ public class ViewpointEntity {
@Column
private String content;

// @Column(nullable = false)
private UUID authorId;

// @Column(nullable = false)
private String authorName;

// @Column(nullable = false)
private URI authorAvatar;

@Embedded
private ViewpointReaction userReaction = new ViewpointReaction();

// @Column(nullable = false)
@ColumnDefault("0")
private Integer likeCount;

// Don't use integer default 0 in columnDefinition

// @Column(nullable = false, columnDefinition = "integer default 0")
@ColumnDefault("0")
private Integer reasonableCount;

// @Column(nullable = false, columnDefinition = "integer default 0")
@ColumnDefault("0")
private Integer dislikeCount;

Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package tw.commonground.backend.service.viewpoint.entity;

import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;

import java.util.UUID;

@Getter
@Setter
@Entity
public class ViewpointReactionEntity {

@EmbeddedId
private ViewpointReactionId id;

@Enumerated(EnumType.STRING)
private Reaction reaction;

public ViewpointReactionEntity() {
this.reaction = Reaction.NONE;
}
}
Loading

0 comments on commit 6332bf1

Please sign in to comment.