Skip to content
Merged
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
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,10 @@
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Index;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import jakarta.validation.constraints.NotNull;
import lombok.Builder;
import lombok.Getter;
Expand All @@ -25,6 +27,12 @@
@Getter
@NoArgsConstructor
@DynamicUpdate
@Table(
name = "group_member",
indexes = {
@Index(name = "idx_gm_user_visible_grp", columnList = "user_id,is_visible,study_group_id")
}
)
public class GroupMember {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,10 @@
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Index;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
Expand All @@ -23,6 +25,12 @@
@Getter
@NoArgsConstructor
@SQLDelete(sql = "UPDATE problem SET deleted_at = CURRENT_TIMESTAMP WHERE id = ?")
@Table(
name = "problem",
indexes = {
@Index(name = "idx_problem_group", columnList = "study_group_id")
}
)
public class Problem {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,10 @@
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Index;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
Expand All @@ -23,6 +25,12 @@
@Getter
@NoArgsConstructor
@SQLDelete(sql = "UPDATE solution SET deleted_at = CURRENT_TIMESTAMP WHERE id = ?")
@Table(
name = "solution",
indexes = {
@Index(name = "idx_solution_problem", columnList = "problem_id")
}
)
public class Solution {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,10 @@

import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.Index;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
Expand All @@ -17,6 +19,12 @@
@Getter
@NoArgsConstructor
@DynamicUpdate
@Table(
name = "solution_comment",
indexes = {
@Index(name = "idx_comment_solution_created", columnList = "solution_id,created_at")
}
)
public class SolutionComment extends Comment {

@ManyToOne(fetch = FetchType.LAZY)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import com.gamzabat.algohub.feature.solution.domain.Solution;
import com.gamzabat.algohub.feature.solution.repository.querydsl.CustomSolutionRepository;
import com.gamzabat.algohub.feature.user.domain.User;
import com.gamzabat.algohub.feature.user.dto.GetSolutionCommentActivity;

public interface SolutionRepository extends JpaRepository<Solution, Long>, CustomSolutionRepository {
@Query("SELECT s FROM Solution s "
Expand Down Expand Up @@ -67,4 +68,16 @@ Long countDistinctCorrectSolutionsByUserAndGroup(User user, StudyGroup group,
+ "AND s.user = :user "
+ "AND s.problem = :problem")
List<Solution> findAllByUserAndProblem(User user, Problem problem);

@Query("""
select distinct new com.gamzabat.algohub.feature.user.dto.GetSolutionCommentActivity(s.id, g.id)
from GroupMember gm
join gm.studyGroup g
join Problem p on p.studyGroup = g
join Solution s on s.problem = p
where gm.user = :user
and gm.isVisible = true
and exists (select 1 from SolutionComment c where c.solution = s)
""")
List<GetSolutionCommentActivity> findFeedSolutionsByUserOrdered(User user);
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import com.gamzabat.algohub.feature.user.dto.CheckEmailRequest;
import com.gamzabat.algohub.feature.user.dto.DeleteUserRequest;
import com.gamzabat.algohub.feature.user.dto.EditUserPasswordRequest;
import com.gamzabat.algohub.feature.user.dto.GetSolutionCommentActivityList;
import com.gamzabat.algohub.feature.user.dto.RegisterBjNickNameRequest;
import com.gamzabat.algohub.feature.user.dto.RegisterRequest;
import com.gamzabat.algohub.feature.user.dto.ResetPasswordRequest;
Expand Down Expand Up @@ -151,6 +152,13 @@ public ResponseEntity<Void> deleteUser(@AuthedUser User user, @Valid @RequestBod
return ResponseEntity.ok().build();
}

@GetMapping(value = "/users/me/feed")
@Operation(summary = "내 피드 조회 API")
public ResponseEntity<GetSolutionCommentActivityList> getMyFeed(@AuthedUser User user) {
GetSolutionCommentActivityList response = userService.getSolutionCommentActivity(user);
return ResponseEntity.ok().body(response);
}

@DeleteMapping("/auth/sign-out")
@Operation(summary = "로그아웃 API")
public ResponseEntity<Void> logout(HttpServletRequest request) {
Expand Down Expand Up @@ -216,4 +224,5 @@ public ResponseEntity<Void> checkPasswordToken(@RequestParam String token) {
userService.validateResetPasswordToken(token);
return ResponseEntity.ok().build();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package com.gamzabat.algohub.feature.user.dto;

public record GetSolutionCommentActivity(Long solutionId, Long groupId) {
}
Comment on lines +3 to +4
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

오잉 생각보다 정보가 덜 필요하군요!
solutionId랑 groupId 주면 프론트가 댓글 목록이랑 풀이 모두 조회해서 사용하는걸까요??
처음엔 관련된 정보(ex: 댓글 작성자, 댓글 내용, 풀이 내용, soltuionId 등..)를 DTO에 다 담아서 모두 주는걸로 생각했었거든요!

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

기존에 있던 API를 재사용하실 것 같더라구요! 그래서 solutionId와 groupId만 반환해달라고 요청받았습니다!

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

오호 프론트가 API 재사용을 야무지게 하나보네요 굿입니다 👍

Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.gamzabat.algohub.feature.user.dto;

import java.util.List;

import lombok.Builder;

@Builder
public record GetSolutionCommentActivityList(List<GetSolutionCommentActivity> solutionCommentActivityList) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import java.time.Duration;
import java.time.LocalDateTime;
import java.util.Base64;
import java.util.List;
import java.util.regex.Pattern;

import org.springframework.http.HttpEntity;
Expand All @@ -21,6 +22,7 @@
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.client.HttpClientErrorException;
import org.springframework.web.client.HttpServerErrorException;
import org.springframework.web.client.RestClient;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.multipart.MultipartFile;

Expand All @@ -35,10 +37,13 @@
import com.gamzabat.algohub.exception.UserValidationException;
import com.gamzabat.algohub.feature.group.studygroup.exception.CannotFoundUserException;
import com.gamzabat.algohub.feature.image.service.ImageService;
import com.gamzabat.algohub.feature.solution.repository.SolutionRepository;
import com.gamzabat.algohub.feature.user.domain.ResetPassword;
import com.gamzabat.algohub.feature.user.domain.User;
import com.gamzabat.algohub.feature.user.dto.DeleteUserRequest;
import com.gamzabat.algohub.feature.user.dto.EditUserPasswordRequest;
import com.gamzabat.algohub.feature.user.dto.GetSolutionCommentActivity;
import com.gamzabat.algohub.feature.user.dto.GetSolutionCommentActivityList;
import com.gamzabat.algohub.feature.user.dto.RegisterBjNickNameRequest;
import com.gamzabat.algohub.feature.user.dto.RegisterRequest;
import com.gamzabat.algohub.feature.user.dto.ResetPasswordRequest;
Expand Down Expand Up @@ -76,6 +81,8 @@ public class UserService {
private final ResetPasswordRepository resetPasswordRepository;
private final EmailService emailService;
private final DiscordWebhookService webhookService;
private final SolutionRepository solutionRepository;
private final RestClient.Builder builder;

@Transactional
public void register(RegisterRequest request, MultipartFile profileImage, String token) {
Expand Down Expand Up @@ -337,6 +344,13 @@ public void resetPassword(ResetPasswordRequest request) {
log.info("success to reset password.");
}

@Transactional
public GetSolutionCommentActivityList getSolutionCommentActivity(User user) {
List<GetSolutionCommentActivity> solutionCommentActivityList = solutionRepository.findFeedSolutionsByUserOrdered(user);
GetSolutionCommentActivityList response = GetSolutionCommentActivityList.builder().solutionCommentActivityList(solutionCommentActivityList).build();
return response;
}

public void validateResetPasswordToken(String token) {
this.getValidatedResetPassword(token);
}
Expand Down
Loading