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: Techstack 추가 기능 개발 #93

Merged
merged 2 commits into from
Aug 5, 2024
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
19 changes: 19 additions & 0 deletions src/main/java/com/codiary/backend/global/config/WebConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.codiary.backend.global.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(final CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("http://localhost:3000")
.allowedMethods("GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS") // 허용할 HTTP 메소드
.allowedHeaders("*") // 허용할 헤더
.allowCredentials(true); // 자격 증명 허용
}
}


Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import com.codiary.backend.global.domain.entity.Follow;
import com.codiary.backend.global.domain.entity.Member;
import com.codiary.backend.global.domain.entity.mapping.MemberCategory;
import com.codiary.backend.global.web.dto.Bookmark.BookmarkResponseDTO;
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;
Expand Down Expand Up @@ -36,6 +36,16 @@ public MemberSumResponseDto toFollowResponseDto(Member member) {
.build();
}

public MemberResponseDTO.TechStacksDTO toTechStacksResponseDto(Member member) {
return MemberResponseDTO.TechStacksDTO.builder()
.memberId(member.getMemberId())
.techStackList(member.getTechStackList()
.stream()
.map(TechStacks::getName)
.collect(Collectors.toList()))
.build();
}



// 회원별 북마크 리스트 조회
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.codiary.backend.global.domain.entity.mapping;

import com.codiary.backend.global.domain.entity.Member;
import com.codiary.backend.global.domain.entity.Post;
import com.codiary.backend.global.domain.enums.TechStack;
import jakarta.persistence.*;
import lombok.AccessLevel;
import lombok.Getter;
Expand All @@ -16,11 +16,17 @@ public class TechStacks {
@Column(name = "tech_stack_id", nullable = false, columnDefinition = "bigint")
private Long techStackId;

//우선 String으로 설정, techStack 나오면 enum으로 변경 필요
@Enumerated(EnumType.STRING)
@Column(name = "name", nullable = false, columnDefinition = "varchar(50)")
private String name;
private TechStack name;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "member_id")
private Member member;

// 생성자 추가
public TechStacks(TechStack name, Member member) {
this.name = name;
this.member = member;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.codiary.backend.global.domain.enums;

public enum TechStack {
JAVA,
SPRING,
JAVA_SCRIPT,
REACT,
CSS,
HTML,
NODE_JS,
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,9 @@ public interface MemberRepository extends JpaRepository<Member, Long> {

@Query("SELECT m FROM Member m LEFT JOIN FETCH m.followers WHERE m.memberId = :toId")
Optional<Member> findByToIdWithFollowers(@Param("toId") long id);

@Query("SELECT m FROM Member m LEFT JOIN FETCH m.techStackList WHERE m.memberId = :memberId")
Member findMemberWithTechStacks(@Param("memberId") Long memberId);


}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.codiary.backend.global.apiPayload.ApiResponse;
import com.codiary.backend.global.domain.entity.Member;
import com.codiary.backend.global.domain.entity.mapping.MemberCategory;
import com.codiary.backend.global.domain.enums.TechStack;
import com.codiary.backend.global.web.dto.Member.MemberRequestDTO;
import com.codiary.backend.global.web.dto.Member.MemberResponseDTO;

Expand All @@ -21,4 +22,5 @@ public interface MemberCommandService {

public ApiResponse<MemberResponseDTO.MemberImageDTO> setProfileImage(Member member, MemberRequestDTO.MemberProfileImageRequestDTO request);

public Member setTechStacks(Long memberId, TechStack techstack);
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,12 @@
import com.codiary.backend.global.apiPayload.code.status.SuccessStatus;
import com.codiary.backend.global.apiPayload.exception.GeneralException;
import com.codiary.backend.global.apiPayload.exception.handler.MemberHandler;
import com.codiary.backend.global.converter.PostFileConverter;
import com.codiary.backend.global.domain.entity.Member;
import com.codiary.backend.global.domain.entity.MemberImage;
import com.codiary.backend.global.domain.entity.PostFile;
import com.codiary.backend.global.domain.entity.Uuid;
import com.codiary.backend.global.domain.entity.mapping.MemberCategory;
import com.codiary.backend.global.domain.entity.mapping.TechStacks;
import com.codiary.backend.global.domain.enums.TechStack;
import com.codiary.backend.global.jwt.JwtTokenProvider;
import com.codiary.backend.global.jwt.SecurityUtil;
import com.codiary.backend.global.jwt.TokenInfo;
Expand All @@ -29,6 +29,7 @@
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

Expand Down Expand Up @@ -134,4 +135,22 @@ public ApiResponse<MemberResponseDTO.MemberImageDTO> setProfileImage(Member memb
return ApiResponse.onSuccess(SuccessStatus.MEMBER_OK, response);
}

@Override
public Member setTechStacks(Long memberId, TechStack techstack) {
Member member = memberRepository.findMemberWithTechStacks(memberId);

List<TechStacks> techStackList = member.getTechStackList();
if (techStackList == null) {
techStackList = new ArrayList<>();
}

TechStacks newTechStack = new TechStacks(techstack, member);
techStackList.add(newTechStack);

member.setTechStackList(techStackList);

memberRepository.save(member);

return member;
}
}
Original file line number Diff line number Diff line change
@@ -1,17 +1,15 @@
package com.codiary.backend.global.web.controller;

import com.codiary.backend.global.apiPayload.ApiResponse;
import com.codiary.backend.global.converter.BookmarkConverter;
import com.codiary.backend.global.converter.MemberConverter;
import com.codiary.backend.global.converter.PostConverter;
import com.codiary.backend.global.domain.entity.Member;
import com.codiary.backend.global.domain.entity.Post;
import com.codiary.backend.global.domain.entity.Bookmark;
import com.codiary.backend.global.domain.entity.mapping.MemberCategory;
import com.codiary.backend.global.domain.enums.TechStack;
import com.codiary.backend.global.service.MemberService.MemberCommandService;
import com.codiary.backend.global.service.MemberService.MemberCommandServiceImpl;
import com.codiary.backend.global.service.MemberService.MemberQueryService;
import com.codiary.backend.global.web.dto.Bookmark.BookmarkResponseDTO;
import com.codiary.backend.global.web.dto.Member.MemberRequestDTO;
import com.codiary.backend.global.web.dto.Member.MemberResponseDTO;
import com.codiary.backend.global.web.dto.Post.PostResponseDTO;
Expand Down Expand Up @@ -44,6 +42,7 @@ public class MemberController {
private final MemberCommandService memberCommandService;
private final FollowService followService;
private final MemberQueryService memberQueryService;
private final MemberConverter memberConverter;

@PostMapping("/sign-up")
@Operation(
Expand Down Expand Up @@ -183,4 +182,12 @@ public ApiResponse<MemberResponseDTO.UserProfileDTO> getUserProfile(@PathVariabl
Member member = memberCommandService.getRequester();
return ApiResponse.onSuccess(SuccessStatus.MEMBER_OK, memberQueryService.getUserProfile(userId, member));
}

@PostMapping(path = "/techstacks")
@Operation(summary = "기술 스택 추가하기", description = "기술 스택 하나씩 추가")
public ApiResponse<MemberResponseDTO.TechStacksDTO> setTechStacks(@RequestParam(value = "techstack") TechStack techstack) {
Member member = memberCommandService.getRequester();
member = memberCommandService.setTechStacks(member.getMemberId(), techstack);
return ApiResponse.onSuccess(SuccessStatus.MEMBER_OK, memberConverter.toTechStacksResponseDto(member));
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.codiary.backend.global.web.dto.Member;

import com.codiary.backend.global.domain.enums.TechStack;
import com.codiary.backend.global.jwt.TokenInfo;
import lombok.*;

Expand All @@ -20,7 +21,6 @@ public static class MemberTokenResponseDTO {
}



// 회원별 북마크 리스트 조회
@Builder
@Getter
Expand Down Expand Up @@ -94,9 +94,18 @@ public static class UserProfileDTO {
String linkedinUrl;
String discordUrl;
String introduction;
List<String> techStacksList;
List<TechStack> techStacksList;
List<String> teamList;
Boolean myPage;
}

@Builder
@AllArgsConstructor
@NoArgsConstructor // 기본 생성자 추가
@Getter
@Setter
public static class TechStacksDTO {
private Long memberId;
private List<TechStack> techStackList;
}
}
Loading