Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
…Codiary into feature/#146-social-login
  • Loading branch information
lee-haeseung committed Aug 20, 2024
2 parents 73004fe + 111921b commit 961e327
Show file tree
Hide file tree
Showing 19 changed files with 280 additions and 142 deletions.
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@
<br/>

## 🔧 Stack
- **Language** : Java
- **Library & Framework** : Spring Boot
- **Language** : Java 17
- **Library & Framework** : Spring Boot 3.3.1
- **Database** : MySQL
- **ORM** : JPA
- **Deploy & Cloud**: AWS EC2, Github Actions, AWS S3
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ public enum ErrorStatus implements BaseErrorCode {
TEAM_NAME_NOT_EXIST(HttpStatus.BAD_REQUEST, "TEAM_2002", "팀 이름입력은 필수 입니다."),
TEAM_ALREADY_EXISTS(HttpStatus.CONFLICT, "TEAM_2003", "이미 존재하는 팀입니다."),
TEAM_ADMIN_UNAUTHORIZED(HttpStatus.BAD_REQUEST, "TEAM_2004", "관리자 권한이 없습니다."),

TEAM_MEMBER_ALREADY_EXISTS(HttpStatus.CONFLICT, "TEAM_2005", "이미 존재하는 팀원입니다."),
// 포스트 관려 에러 3000
POST_CREATE_UNAUTHORIZED(HttpStatus.BAD_REQUEST, "POST_3001", "포스트 생성 권한이 없습니다."),
POST_UPDATE_UNAUTHORIZED(HttpStatus.BAD_REQUEST, "POST_3002", "포스트 수정 권한이 없습니다."),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti
.requestMatchers("/posts","/posts/{postId}", "/posts/visibility/{postId}", "/posts/coauthors/{postId}", "/posts/categories/{postId}").permitAll()
.requestMatchers("/posts/title/paging", "/posts/team/{teamId}/{postId}", "/posts/team/{teamId}/member/{memberId}/paging", "/posts/project/{projectId}/team/{teamId}/paging", "/posts/project/{projectId}/member/{memberId}/paging", "/posts/member/{memberId}/paging", "/posts/categories/paging", "/posts/{postId}/adjacent").permitAll()
.requestMatchers("/posts/poplular/list", "/posts/latest/list", "/posts/comments/list/{postId}", "/posts/search/title/body/member/project/categories").permitAll()
.requestMatchers("/categories/list", "/projects/list").permitAll()
.requestMatchers("/categories/list", "/projects/list", "/teams/list").permitAll()
// Comment 관련 접근
.requestMatchers("/comments/count/{postId}").permitAll()
// Bookmark 관련 접근
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@
import com.codiary.backend.global.domain.entity.Member;
import com.codiary.backend.global.domain.entity.Team;
import com.codiary.backend.global.domain.entity.mapping.MemberCategory;
import com.codiary.backend.global.domain.entity.mapping.TeamMember;
import com.codiary.backend.global.domain.entity.mapping.TechStacks;
import com.codiary.backend.global.web.dto.Member.FollowResponseDto;
import com.codiary.backend.global.web.dto.Member.MemberResponseDTO;
import com.codiary.backend.global.web.dto.Member.MemberSumResponseDto;
import com.codiary.backend.global.web.dto.Team.TeamResponseDTO;
import org.springframework.data.domain.Page;
import org.springframework.stereotype.Component;

Expand Down Expand Up @@ -174,8 +174,13 @@ public static MemberResponseDTO.UserProfileDTO toProfileResponseDto(Member membe
.map(TechStacks::getName)
.collect(Collectors.toList()))
.teamList(user.getTeamMemberList().stream()
.map(TeamMember::getTeam)
.map(Team::getName)
.map(teamMember -> {
Team team = teamMember.getTeam();
return TeamResponseDTO.TeamPreviewDTO.builder()
.teamId(team.getTeamId())
.teamName(team.getName())
.build();
})
.collect(Collectors.toList()))
.myPage(user.getMemberId().equals(member.getMemberId()))
.build();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,19 @@
package com.codiary.backend.global.converter;

import com.codiary.backend.global.domain.entity.Member;
import com.codiary.backend.global.domain.entity.Project;
import com.codiary.backend.global.domain.entity.Team;
import com.codiary.backend.global.domain.entity.TeamFollow;
import com.codiary.backend.global.web.dto.Project.ProjectResponseDTO;
import com.codiary.backend.global.web.dto.Team.TeamResponseDTO;
import com.codiary.backend.global.web.dto.Team.TeamSumResponseDTO;
import com.codiary.backend.global.web.dto.TeamMember.TeamMemberResponseDTO;

import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

import static com.codiary.backend.global.converter.ProjectConverter.toProjectPreviewDTO;

public class TeamConverter {
//팀생성
Expand All @@ -27,7 +32,7 @@ public static TeamResponseDTO.CreateTeamResponseDTO toCreateMemberDTO(Team team)
}

//팀 조회
public static TeamResponseDTO.TeamCheckResponseDTO toTeamCheckResponseDTO(Team team) {
public static TeamResponseDTO.TeamCheckResponseDTO toTeamCheckResponseDTO(Team team, boolean isAdmin) {
List<TeamMemberResponseDTO.TeamMemberDTO> members = team.getTeamMemberList().stream()
.map(TeamMemberConverter::toTeamMemberDTO)
.collect(Collectors.toList());
Expand All @@ -46,6 +51,7 @@ public static TeamResponseDTO.TeamCheckResponseDTO toTeamCheckResponseDTO(Team t
.email(team.getEmail())
.linkedIn(team.getLinkedin())
.members(members)
.isAdmin(isAdmin)
.build();
}

Expand Down Expand Up @@ -87,4 +93,23 @@ public static List<TeamSumResponseDTO> toTeamFollowerResponseDto(List<Member> me
(member.getImage() != null) ? member.getImage().getImageUrl() : ""))
.collect(Collectors.toList());
}



public static TeamResponseDTO.TeamPreviewDTO toTeamPreviewDTO(Team team) {
return TeamResponseDTO.TeamPreviewDTO.builder()
.teamId(team.getTeamId())
.teamName(team.getName())
.build();
}

public static TeamResponseDTO.TeamPreviewListDTO toTeamPreviewListDTO(List<Team> teamList) {
List<TeamResponseDTO.TeamPreviewDTO> teamPreviewDTOList = IntStream.range(0, teamList.size())
.mapToObj(i->toTeamPreviewDTO(teamList.get(i)))
.collect(Collectors.toList());
return TeamResponseDTO.TeamPreviewListDTO.builder()
.teams(teamPreviewDTOList)
.build();
}

}
12 changes: 6 additions & 6 deletions src/main/java/com/codiary/backend/global/domain/entity/Post.java
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ public class Post extends BaseEntity {
@Column(name = "post_title", nullable = false, columnDefinition = "varchar(500)")
private String postTitle;

@Column(name = "post_body", nullable = false, columnDefinition = "varchar(500)")
@Column(name = "post_body", nullable = false, columnDefinition = "varchar(3000)")
private String postBody;

@OneToOne
Expand All @@ -54,7 +54,7 @@ public class Post extends BaseEntity {
private Boolean postStatus;

@Builder.Default
@ManyToMany(fetch = FetchType.LAZY)
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(
name = "post_category",
joinColumns = @JoinColumn(name = "post_id"),
Expand All @@ -63,19 +63,19 @@ public class Post extends BaseEntity {
private List<Categories> categoriesList = new ArrayList<>();

@Builder.Default
@OneToMany(mappedBy = "post", cascade = CascadeType.ALL, orphanRemoval = true)//, fetch = FetchType.EAGER)
@OneToMany(mappedBy = "post", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER)
private List<PostFile> postFileList = new ArrayList<>();

@Builder.Default
@OneToMany(mappedBy = "post", cascade = CascadeType.ALL, orphanRemoval = true)//, fetch = FetchType.EAGER)
@OneToMany(mappedBy = "post", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER)
private List<Authors> authorsList = new ArrayList<>();

@Builder.Default
@OneToMany(mappedBy = "post", cascade = CascadeType.ALL, orphanRemoval = true)//, fetch = FetchType.EAGER)
@OneToMany(mappedBy = "post", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER)
private List<Comment> commentList = new ArrayList<>();


@OneToMany(mappedBy = "post", cascade = CascadeType.ALL, orphanRemoval = true)//, fetch = FetchType.EAGER)
@OneToMany(mappedBy = "post", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER)
private List<Bookmark> bookmarkList = new ArrayList<>();

public void setProject(Project project) { this.project = project;}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ public interface MemberRepository extends JpaRepository<Member, Long> {

Optional<Member> findByEmail(String email);

@Query("SELECT m FROM Member m LEFT JOIN m.followers LEFT JOIN m.followings WHERE m = :member")
Optional<Member> findByMemberWithAndFollowersAndFollowings(@Param("member")Member member);

@Query("SELECT m FROM Member m LEFT JOIN FETCH m.followings WHERE m.memberId = :toId")
Optional<Member> findByToIdWithFollowings(@Param("toId") long id);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,20 @@ public interface PostRepository extends JpaRepository<Post, Long> {
Optional<Post> findTopByPostIdLessThanOrderByCreatedAtDescPostIdDesc(Long postId);
Optional<Post> findTopByPostIdGreaterThanOrderByCreatedAtAscPostIdAsc(Long postId);

@Query("SELECT p.postId " +
"FROM Post p " +
"JOIN p.categoriesList c " +
"WHERE LOWER(c.name) LIKE LOWER(CONCAT('%', :categoryName, '%'))")
@Query("SELECT p.postId FROM Post p JOIN p.categoriesList c WHERE LOWER(c.name) LIKE LOWER(CONCAT('%', :categoryName, '%'))")
List<Long> findPostIdsByCategoryName(@Param("categoryName") String categoryName);
// @Query("SELECT p.postId " +
// "FROM Post p " +
// "JOIN p.categoriesList c " +
// "WHERE LOWER(c.name) LIKE LOWER(CONCAT('%', :categoryName, '%'))")
// List<Long> findPostIdsByCategoryName(@Param("categoryName") String categoryName);
// @Query("SELECT p FROM Post p " +
// "JOIN FETCH p.categoriesList c " +
// "WHERE LOWER(c.name) LIKE LOWER(CONCAT('%', :categoryName, '%'))")
// List<Post> findPostIdsByCategoryName(@Param("categoryName") String categoryName);
// @Query("SELECT p.postId FROM Post p JOIN FETCH p.categoriesList c WHERE LOWER(c.name) LIKE LOWER(CONCAT('%', :categoryName, '%'))")
// List<Long> findPostIdsByCategoryName(@Param("categoryName") String categoryName);


Page<Post> findByPostIdIn(List<Long> postIds, Pageable pageable);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,17 @@
package com.codiary.backend.global.repository;

import com.codiary.backend.global.domain.entity.Project;
import com.codiary.backend.global.domain.entity.Team;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

import java.util.List;
import java.util.Optional;

public interface TeamRepository extends JpaRepository<Team, Long> {
@Query("SELECT t FROM Team t LEFT JOIN FETCH t.followers WHERE t.teamId = :teamId")
Optional<Team> findByIdWithFollowers(@Param("teamId") Long teamId);

List<Team> findAllByOrderByTeamIdDesc();
}
Original file line number Diff line number Diff line change
@@ -1,112 +1,14 @@
package com.codiary.backend.global.service.MemberService;

import com.codiary.backend.global.apiPayload.code.status.ErrorStatus;
import com.codiary.backend.global.apiPayload.exception.GeneralException;
import com.codiary.backend.global.domain.entity.Follow;
import com.codiary.backend.global.domain.entity.Member;
import com.codiary.backend.global.repository.FollowRepository;
import com.codiary.backend.global.repository.MemberRepository;

import jakarta.transaction.Transactional;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.stream.Collectors;

@Service
@RequiredArgsConstructor
public class FollowService {
private final FollowRepository followRepository;
private final MemberRepository memberRepository;

@Transactional
public Follow follow(Long toId, Member fromMember) {
if (fromMember == null) {
throw new GeneralException(ErrorStatus.MEMBER_NOT_FOUND);
}
if (toId.equals(fromMember.getMemberId())) {
throw new GeneralException(ErrorStatus.MEMBER_SELF_FOLLOW);
}

fromMember = memberRepository.findByToIdWithFollowings(fromMember.getMemberId())
.orElseThrow(() -> new GeneralException(ErrorStatus.MEMBER_NOT_FOUND));
Member toMember = memberRepository.findByToIdWithFollowers(toId)
.orElseThrow(() -> new GeneralException(ErrorStatus.MEMBER_NOT_FOUND));

Follow follow = followRepository.findByFromMemberAndToMember(fromMember, toMember)
.orElse(null);

if (follow == null) {
follow = Follow.builder()
.fromMember(fromMember)
.toMember(toMember)
.followStatus(true)
.build();
fromMember.getFollowings().add(follow);
toMember.getFollowers().add(follow);
} else {
if (follow.getFollowStatus()) {
follow.update(false);
fromMember.getFollowings().remove(follow);
toMember.getFollowers().remove(follow);
} else {
follow.update(true);
fromMember.getFollowings().add(follow);
toMember.getFollowers().add(follow);
}
}
followRepository.save(follow);

return follow;
}

@Transactional
public Boolean isFollowing(Long toId, Member fromMember) {
if(fromMember == null){
throw new GeneralException(ErrorStatus.MEMBER_NOT_FOUND);
}
if (toId.equals(fromMember.getMemberId())) {
throw new GeneralException(ErrorStatus.MEMBER_SELF_FOLLOW);
}
Member toMember = memberRepository.findById(toId)
.orElseThrow(() -> new GeneralException(ErrorStatus.MEMBER_NOT_FOUND));

return followRepository.findByFromMemberAndToMember(fromMember, toMember)
.map(Follow::getFollowStatus)
.orElse(false);
}


@Transactional
public List<Member> getFollowings(Member member) {
if (member == null) {
throw new GeneralException(ErrorStatus.MEMBER_NOT_FOUND);
}

member = memberRepository.findByToIdWithFollowings(member.getMemberId())
.orElseThrow(() -> new GeneralException(ErrorStatus.MEMBER_NOT_FOUND));

List<Follow> followings = followRepository.findByFromMemberAndFollowStatusTrueOrderByUpdatedAt(member);

return followings.stream()
.map(Follow::getToMember)
.collect(Collectors.toList());
}

@Transactional
public List<Member> getFollowers(Member member) {
if (member == null) {
throw new GeneralException(ErrorStatus.MEMBER_NOT_FOUND);
}

member = memberRepository.findByToIdWithFollowers(member.getMemberId())
.orElseThrow(() -> new GeneralException(ErrorStatus.MEMBER_NOT_FOUND));

List<Follow> followers = followRepository.findByToMemberAndFollowStatusTrueOrderByUpdatedAt(member);
public interface FollowService {

return followers.stream()
.map(Follow::getFromMember)
.collect(Collectors.toList());
}
Follow follow(Long toId, Member fromMember);
Boolean isFollowing(Long toId, Member fromMember);
List<Member> getFollowings(Member member);
List<Member> getFollowers(Member member);
}
Loading

0 comments on commit 961e327

Please sign in to comment.