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

[Main] 20240812.01 #91

Merged
merged 23 commits into from
Aug 12, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
8b6a2d7
Feature: 소켓 연결 시 기존 세션 종료 기능 구현 (#52)
Youthhing Jul 6, 2024
24cb549
Feature: 회원 전화번호 수정 기능 구현 (#56)
gikhoon Jul 8, 2024
8c43c99
Feature: 분산락을 활용한 정답 제출 로직 구현 (#55)
Youthhing Jul 8, 2024
d43be68
Feature: 사진 저장 시 파일 확장자 추가 (#43)
gikhoon Jul 8, 2024
ff35c50
Feature: 세션 사진 수 증가 (#47)
gikhoon Jul 9, 2024
1489dd5
Merge pull request #57 from IT-Cotato/develop
gikhoon Jul 9, 2024
a9f0adf
Feature: 기존 회원 정책 조회 및 체크 API 구현 (#60)
Youthhing Jul 17, 2024
20daf8e
Refactor: 세션 사진 관련 변수 명 변경 (#63)
gikhoon Jul 17, 2024
a88612e
Feature: 멤버 프로필 항목 추가 (#61)
gikhoon Jul 17, 2024
ee51fff
Feature: 세션 업데이트 API 컨텐츠 타입 수정 (#64)
gikhoon Jul 17, 2024
168734c
Merge pull request #65 from IT-Cotato/develop
Youthhing Jul 17, 2024
918828e
Chore: QA 도메인 스웨거 설정 추가 (#66)
Youthhing Jul 17, 2024
1813f3b
Merge pull request #67 from IT-Cotato/develop
Youthhing Jul 17, 2024
070f910
Chore: QA 도메인 CORS 설정 추가 (#68)
Youthhing Jul 17, 2024
e5abcc8
Merge pull request #69 from IT-Cotato/develop
Youthhing Jul 17, 2024
8b344be
chore: QA서버 http CORS 설정 추가
Youthhing Jul 18, 2024
ea4c3af
chore: QA서버 http CORS 설정 추가
Youthhing Jul 18, 2024
2350ef3
Feature: 이메일 인증 시 인증 요청 이메일 확인 기능 구현 (#71)
Youthhing Jul 29, 2024
91b8127
Merge pull request #72 from IT-Cotato/develop
Youthhing Jul 29, 2024
061235d
Fix: 세션 사진 순서 변경 기능 오류 수정 (#73)
gikhoon Jul 29, 2024
82a5db9
[Release]: 세션 사진 순서 변경 기능 오류 수정
gikhoon Jul 29, 2024
7bb52c9
Merge branch 'main' into release
Youthhing Aug 12, 2024
871134f
fix: solve conflict
Youthhing Aug 12, 2024
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 @@ -8,11 +8,15 @@
import org.cotato.csquiz.api.member.dto.MemberMyPageInfoResponse;
import org.cotato.csquiz.api.member.dto.UpdatePasswordRequest;
import org.cotato.csquiz.api.member.dto.UpdatePhoneNumberRequest;
import org.cotato.csquiz.api.member.dto.UpdateProfileImageRequest;
import org.cotato.csquiz.common.config.jwt.JwtTokenProvider;
import org.cotato.csquiz.common.error.exception.ImageException;
import org.cotato.csquiz.domain.auth.service.MemberService;
import org.springframework.context.annotation.Description;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PatchMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
Expand Down Expand Up @@ -41,17 +45,36 @@ public ResponseEntity<MemberInfoResponse> findMemberInfo(
public ResponseEntity<Void> updatePassword(@RequestHeader("Authorization") String authorizationHeader,
@RequestBody @Valid UpdatePasswordRequest request) {
String accessToken = jwtTokenProvider.getBearer(authorizationHeader);
memberService.updatePassword(accessToken, request.password());
Long memberId = jwtTokenProvider.getMemberId(accessToken);
memberService.updatePassword(memberId, request.password());
return ResponseEntity.noContent().build();
}

@Operation(summary = "멤버 전화번호 수정", description = "멤버 전화번호 수정하기")
@Operation(summary = "멤버 전화번호 수정 API")
@PatchMapping("/phone-number")
public ResponseEntity<Void> updatePhoneNumber(
@RequestHeader("Authorization") String authorizationHeader,
public ResponseEntity<Void> updatePhoneNumber(@RequestHeader("Authorization") String authorizationHeader,
@RequestBody @Valid UpdatePhoneNumberRequest request) {
String accessToken = jwtTokenProvider.getBearer(authorizationHeader);
memberService.updatePhoneNumber(accessToken,request.phoneNumber());
memberService.updatePhoneNumber(accessToken, request.phoneNumber());
return ResponseEntity.noContent().build();
}

@Operation(summary = "멤버 프로필 사진 수정 API")
@PatchMapping(value = "/profile-image", consumes = "multipart/form-data")
public ResponseEntity<Void> updateProfileImage(
@RequestHeader("Authorization") String authorizationHeader,
@ModelAttribute @Valid UpdateProfileImageRequest request) throws ImageException {
String accessToken = jwtTokenProvider.getBearer(authorizationHeader);
memberService.updateMemberProfileImage(accessToken, request.image());
return ResponseEntity.noContent().build();
}

@Operation(summary = "멤버 프로필 사진 삭제 API")
@DeleteMapping("/profile-image")
public ResponseEntity<Void> deleteProfileImage(
@RequestHeader("Authorization") String authorizationHeader) {
String accessToken = jwtTokenProvider.getBearer(authorizationHeader);
memberService.deleteMemberProfileImage(accessToken);
return ResponseEntity.noContent().build();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@ public record MemberMyPageInfoResponse(
String name,
Integer generationNumber,
MemberPosition memberPosition,
String phoneNumber
String phoneNumber,
String profileImage
) {
public static MemberMyPageInfoResponse of(Member member, String originPhoneNumber) {
return new MemberMyPageInfoResponse(
Expand All @@ -18,7 +19,8 @@ public static MemberMyPageInfoResponse of(Member member, String originPhoneNumbe
member.getName(),
member.getPassedGenerationNumber(),
member.getPosition(),
originPhoneNumber
originPhoneNumber,
member.getProfileImage() != null ? member.getProfileImage().getUrl() : null
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package org.cotato.csquiz.api.member.dto;

import jakarta.validation.constraints.NotNull;
import org.springframework.web.multipart.MultipartFile;

public record UpdateProfileImageRequest(
@NotNull
MultipartFile image
) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import org.cotato.csquiz.api.mypage.dto.HallOfFameResponse;
import org.cotato.csquiz.common.config.jwt.JwtTokenProvider;
import org.cotato.csquiz.api.mypage.dto.MyPageMemberInfoResponse;
import org.cotato.csquiz.domain.education.service.MyPageService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
Expand All @@ -29,12 +28,4 @@ public ResponseEntity<HallOfFameResponse> findHallOfFame(@RequestParam("generati

return ResponseEntity.ok(myPageService.findHallOfFame(generationId, jwtTokenProvider.getMemberId(accessToken)));
}

@GetMapping("/info")
public ResponseEntity<MyPageMemberInfoResponse> findUserInfo(
@RequestHeader("Authorization") String authorizationHeader) {
String accessToken = jwtTokenProvider.getBearer(authorizationHeader);

return ResponseEntity.ok(myPageService.findMemberInfo(jwtTokenProvider.getMemberId(accessToken)));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package org.cotato.csquiz.api.policy.controller;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.cotato.csquiz.api.policy.dto.CheckMemberPoliciesRequest;
import org.cotato.csquiz.api.policy.dto.FindMemberPolicyResponse;
import org.cotato.csquiz.domain.auth.service.PolicyService;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@Tag(name = "회원 정책 API")
@RestController
@RequiredArgsConstructor
@RequestMapping("/v2/api/policies")
public class PolicyController {

private final PolicyService policyService;

@Operation(summary = "체크하지 않은 정책 조회 API")
@GetMapping("/essential")
public ResponseEntity<FindMemberPolicyResponse> getUnCheckedPolicies(@RequestParam(value = "member-id") Long memberId) {
return ResponseEntity.ok().body(policyService.findUnCheckedPolicies(memberId));
}

@Operation(summary = "특정 정책에 대해 동의 여부 체크 API")
@PostMapping("/check")
public ResponseEntity<Void> checkPolicies(@RequestBody @Valid CheckMemberPoliciesRequest request){
policyService.checkPolicies(request);
return ResponseEntity.noContent().build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package org.cotato.csquiz.api.policy.dto;

import jakarta.validation.Valid;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import java.util.List;

public record CheckMemberPoliciesRequest(
@NotNull(message = "체크할 회원의 id는 필수 입니다.")
Long memberId,
@NotEmpty(message = "체크할 정책을 입력해주세요")
@Valid
List<CheckPolicyRequest> policies
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package org.cotato.csquiz.api.policy.dto;

import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;

public record CheckPolicyRequest(
@Schema(description = "체크할 정책 PK")
@NotNull(message = "체크할 정책의 id를 입력해주세요.")
Long policyId,
@Schema(description = "정책 동의 여부")
@NotNull(message = "정책 동의 여부를 입력해주세요.")
Boolean isChecked
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package org.cotato.csquiz.api.policy.dto;

import io.swagger.v3.oas.annotations.media.Schema;
import java.util.List;

public record FindMemberPolicyResponse(
Long memberId,
@Schema(description = "회원이 체크하지 않은 필수 정책 목록")
List<PolicyInfoResponse> essentialPolicies,
@Schema(description = "회원이 체크하지 않은 선택 정책 목록")
List<PolicyInfoResponse> optionalPolicies
) {
public static FindMemberPolicyResponse of(Long memberId, List<PolicyInfoResponse> essentialPolicies,
List<PolicyInfoResponse> optionalPolicies) {
return new FindMemberPolicyResponse(memberId, essentialPolicies, optionalPolicies);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package org.cotato.csquiz.api.policy.dto;

import io.swagger.v3.oas.annotations.media.Schema;
import org.cotato.csquiz.domain.auth.entity.Policy;
import org.cotato.csquiz.domain.auth.enums.PolicyType;

public record PolicyInfoResponse(
@Schema(description = "정책 PK")
Long policyId,
@Schema(description = "필수 동의 항목 여부")
PolicyType type,
@Schema(description = "정책 타이틀")
String title,
@Schema(description = "정책 내용 게시글")
String content
) {
public static PolicyInfoResponse from(Policy policy){
return new PolicyInfoResponse(
policy.getId(),
policy.getPolicyType(),
policy.getTitle(),
policy.getContent()
);
}
}
Original file line number Diff line number Diff line change
@@ -1,21 +1,25 @@
package org.cotato.csquiz.api.session.controller;

import io.swagger.v3.oas.annotations.Operation;
import jakarta.validation.Valid;
import java.util.List;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.cotato.csquiz.api.session.dto.AddSessionImageRequest;
import org.cotato.csquiz.api.session.dto.AddSessionImageResponse;
import org.cotato.csquiz.api.session.dto.AddSessionRequest;
import org.cotato.csquiz.api.session.dto.AddSessionResponse;
import org.cotato.csquiz.api.session.dto.CsEducationOnSessionNumberResponse;
import org.cotato.csquiz.api.session.dto.DeleteSessionImageRequest;
import org.cotato.csquiz.api.session.dto.SessionListResponse;
import org.cotato.csquiz.api.session.dto.UpdateSessionDescriptionRequest;
import org.cotato.csquiz.api.session.dto.UpdateSessionNumberRequest;
import org.cotato.csquiz.api.session.dto.UpdateSessionPhotoRequest;
import org.cotato.csquiz.api.session.dto.UpdateSessionImageOrderRequest;
import org.cotato.csquiz.api.session.dto.UpdateSessionRequest;
import org.cotato.csquiz.domain.generation.service.SessionService;
import org.cotato.csquiz.common.error.exception.ImageException;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PatchMapping;
Expand All @@ -33,20 +37,21 @@ public class SessionController {

private final SessionService sessionService;

@Operation(summary = "Session 리스트 정보 얻기", description = "Get Session Infos")
@GetMapping("")
public ResponseEntity<List<SessionListResponse>> findSessionsByGenerationId(@RequestParam Long generationId) {
return ResponseEntity.status(HttpStatus.OK).body(sessionService.findSessionsByGenerationId(generationId));
}

@Operation(summary = "Session 추가하기", description = "세션 추가하기")
@PostMapping(value = "/add", consumes = "multipart/form-data")
public ResponseEntity<AddSessionResponse> addSession(@ModelAttribute @Valid AddSessionRequest request)
throws ImageException {
return ResponseEntity.status(HttpStatus.CREATED).body(sessionService.addSession(request));
}

@PatchMapping(value = "/update", consumes = "multipart/form-data")
public ResponseEntity<Void> updateSession(@ModelAttribute @Valid UpdateSessionRequest request)
throws ImageException {
@PatchMapping(value = "/update")
public ResponseEntity<Void> updateSession(@RequestBody @Valid UpdateSessionRequest request) {
sessionService.updateSession(request);
return ResponseEntity.noContent().build();
}
Expand All @@ -57,16 +62,24 @@ public ResponseEntity<Void> updateSessionNumber(@RequestBody @Valid UpdateSessio
return ResponseEntity.noContent().build();
}

@PatchMapping("/description")
public ResponseEntity<Void> updateSessionDescription(@RequestBody @Valid UpdateSessionDescriptionRequest request) {
sessionService.updateSessionDescription(request);
@Operation(summary = "Session 수정 - 사진 순서", description = "세션 사진 순서 바꾸기")
@PatchMapping("/image/order")
public ResponseEntity<Void> updateSessionImageOrder(@RequestBody UpdateSessionImageOrderRequest request) {
sessionService.updateSessionImageOrder(request);
return ResponseEntity.noContent().build();
}

@PatchMapping(value = "/update/photo", consumes = "multipart/form-data")
public ResponseEntity<Void> updateSessionPhoto(@ModelAttribute @Valid UpdateSessionPhotoRequest request)
@Operation(summary = "Session 수정 - 사진 추가하기", description = "세션 수정 시 사진 추가하기, photoId 반환")
@PostMapping(value = "/image", consumes = "multipart/form-data")
public ResponseEntity<AddSessionImageResponse> additionalSessionImage(@ModelAttribute @Valid AddSessionImageRequest request)
throws ImageException {
sessionService.updateSessionPhoto(request);
return ResponseEntity.status(HttpStatus.CREATED).body(sessionService.additionalSessionImage(request));
}

@Operation(summary = "Session 수정 - 사진 삭제하기", description = "사진 삭제하기")
@DeleteMapping(value = "/image")
public ResponseEntity<Void> deleteSessionImage(@RequestBody DeleteSessionImageRequest request) {
sessionService.deleteSessionImage(request);
return ResponseEntity.noContent().build();
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package org.cotato.csquiz.api.session.dto;

import jakarta.validation.constraints.NotNull;
import org.springframework.web.multipart.MultipartFile;

public record AddSessionImageRequest(

@NotNull
Long sessionId,
@NotNull
MultipartFile image
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package org.cotato.csquiz.api.session.dto;

import org.cotato.csquiz.domain.generation.entity.SessionImage;

public record AddSessionImageResponse(
Long imageId,
String imageUrl,
Integer order
) {
public static AddSessionImageResponse from(SessionImage sessionImage) {
return new AddSessionImageResponse(sessionImage.getId(),
sessionImage.getS3Info().getUrl(),
sessionImage.getOrder());
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package org.cotato.csquiz.api.session.dto;

import java.util.List;
import org.cotato.csquiz.domain.generation.enums.CSEducation;
import org.cotato.csquiz.domain.generation.enums.DevTalk;
import org.cotato.csquiz.domain.generation.enums.ItIssue;
Expand All @@ -10,7 +11,7 @@
public record AddSessionRequest(
@NotNull
Long generationId,
MultipartFile sessionImage,
List<MultipartFile> images,
@NotNull
String title,
@NotNull
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package org.cotato.csquiz.api.session.dto;

import jakarta.validation.constraints.NotNull;

public record DeleteSessionImageRequest(
@NotNull
Long imageId
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package org.cotato.csquiz.api.session.dto;

import java.util.List;
import org.cotato.csquiz.domain.generation.entity.SessionImage;

public record SessionListImageInfoResponse(
Long imageId,
String imageUrl,
Integer order
) {
public static SessionListImageInfoResponse from(SessionImage sessionImage) {
return new SessionListImageInfoResponse(sessionImage.getId(),
sessionImage.getS3Info().getUrl(),
sessionImage.getOrder());
}
}
Loading
Loading