Skip to content

Commit

Permalink
Merge pull request #55 from TrainingDiary/feature/trainee-info-edit-i…
Browse files Browse the repository at this point in the history
…nbody-record

�트레이너의 트레이니 정보 조회, 수정, 인바디 기록 API, 회원가입 인증코드 버그 수정
  • Loading branch information
kyoo0115 authored Jul 17, 2024
2 parents c9c0027 + eeb229a commit b4ab383
Show file tree
Hide file tree
Showing 27 changed files with 1,227 additions and 116 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,56 @@
package com.project.trainingdiary.controller;

import com.project.trainingdiary.dto.request.AddInBodyInfoRequestDto;
import com.project.trainingdiary.dto.request.EditTraineeInfoRequestDto;
import com.project.trainingdiary.dto.response.AddInBodyInfoResponseDto;
import com.project.trainingdiary.dto.response.EditTraineeInfoResponseDto;
import com.project.trainingdiary.dto.response.TraineeInfoResponseDto;
import com.project.trainingdiary.service.TrainerService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequiredArgsConstructor
@RequestMapping("api/trainers")
public class TrainerController {

private final TrainerService trainerService;

@PreAuthorize("hasRole('TRAINER')")
@GetMapping("/trainees/{id}")
public ResponseEntity<TraineeInfoResponseDto> getTraineeInfo(
@PathVariable Long id
) {

TraineeInfoResponseDto traineeInfo = trainerService.getTraineeInfo(id);
return ResponseEntity.ok(traineeInfo);
}

@PreAuthorize("hasRole('TRAINER')")
@PutMapping("/trainees/")
public ResponseEntity<EditTraineeInfoResponseDto> editTraineeInfo(
@RequestBody @Valid EditTraineeInfoRequestDto dto
) {
EditTraineeInfoResponseDto editTraineeInfo = trainerService.editTraineeInfo(dto);
return ResponseEntity.ok(editTraineeInfo);
}

@PreAuthorize("hasRole('TRAINER')")
@PostMapping("/trainees/")
public ResponseEntity<AddInBodyInfoResponseDto> addInBodyRecord(
@RequestBody @Valid AddInBodyInfoRequestDto dto
) {

AddInBodyInfoResponseDto addInBodyInfo = trainerService.addInBodyRecord(dto);
return ResponseEntity.ok(addInBodyInfo);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,15 @@
import com.project.trainingdiary.dto.request.SignInRequestDto;
import com.project.trainingdiary.dto.request.SignUpRequestDto;
import com.project.trainingdiary.dto.request.VerifyCodeRequestDto;
import com.project.trainingdiary.dto.response.CustomResponse;
import com.project.trainingdiary.dto.response.MemberInfoResponseDto;
import com.project.trainingdiary.dto.response.SignInResponseDto;
import com.project.trainingdiary.model.SuccessMessage;
import com.project.trainingdiary.service.UserService;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
Expand All @@ -29,50 +26,48 @@ public class UserController {
private final UserService userService;

@PostMapping("/check-duplicate-and-send-verification")
public CustomResponse<?> checkDuplicateAndSendVerification(
public ResponseEntity<Void> checkDuplicateAndSendVerification(
@RequestBody @Valid SendVerificationAndCheckDuplicateRequestDto dto
) {
userService.checkDuplicateEmailAndSendVerification(dto);
return CustomResponse.success(SuccessMessage.SENT_VERIFICATION_SUCCESS);
return ResponseEntity.ok().build();
}

@PostMapping("/check-verification-code")
public CustomResponse<?> verifyCode(
public ResponseEntity<Void> verifyCode(
@RequestBody @Valid VerifyCodeRequestDto dto
) {
userService.checkVerificationCode(dto);
return CustomResponse.success(SuccessMessage.VERIFICATION_SUCCESS);
return ResponseEntity.ok().build();
}

@PostMapping("/sign-up")
public CustomResponse<?> signUp(
public ResponseEntity<Void> signUp(
@RequestBody @Valid SignUpRequestDto dto, HttpServletResponse response
) {
userService.signUp(dto, response);
return CustomResponse.success(SuccessMessage.SIGN_UP_SUCCESS);
return ResponseEntity.ok().build();
}

@PostMapping("/sign-in")
public CustomResponse<SignInResponseDto> signIn(
public ResponseEntity<SignInResponseDto> signIn(
@RequestBody @Valid SignInRequestDto dto, HttpServletResponse response
) {
SignInResponseDto signInResponse = userService.signIn(dto, response);
return CustomResponse.success(signInResponse, SuccessMessage.SIGN_IN_SUCCESS);
return ResponseEntity.ok(signInResponse);
}

@PostMapping("/sign-out")
public CustomResponse<?> signOut(
public ResponseEntity<Void> signOut(
HttpServletRequest request, HttpServletResponse response
) {
userService.signOut(request, response);
return CustomResponse.success(SuccessMessage.SIGN_OUT_SUCCESS);
return ResponseEntity.ok().build();
}

@GetMapping("/{id}")
public ResponseEntity<MemberInfoResponseDto> viewUserInfo(
@PathVariable Long id
) {
MemberInfoResponseDto user = userService.memberInfo(id);
@GetMapping("/info")
public ResponseEntity<MemberInfoResponseDto> userInfo() {
MemberInfoResponseDto user = userService.memberInfo();
return ResponseEntity.ok(user);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package com.project.trainingdiary.dto.request;

import com.project.trainingdiary.entity.InBodyRecordHistoryEntity;
import com.project.trainingdiary.entity.TraineeEntity;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Positive;
import jakarta.validation.constraints.PositiveOrZero;
import java.time.LocalDate;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Getter
@Setter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class AddInBodyInfoRequestDto {

@NotNull(message = "traineeId 값은 null이 안됩니다.")
@Positive(message = "traineeId는 양수여야 합니다.")
private Long traineeId;

@PositiveOrZero(message = "weight는 0 이상이어야 합니다.")
private double weight;

@PositiveOrZero(message = "bodyFatPercentage는 0 이상이어야 합니다.")
private double bodyFatPercentage;

@PositiveOrZero(message = "skeletalMuscleMass는 0 이상이어야 합니다.")
private double skeletalMuscleMass;

@NotNull(message = "addedDate 값은 null이 안됩니다.")
private LocalDate addedDate;

public static InBodyRecordHistoryEntity toEntity(AddInBodyInfoRequestDto dto,
TraineeEntity trainee) {
return InBodyRecordHistoryEntity
.builder()
.trainee(trainee)
.weight(dto.getWeight())
.addedDate(dto.getAddedDate())
.bodyFatPercentage(dto.getBodyFatPercentage())
.skeletalMuscleMass(dto.getSkeletalMuscleMass())
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package com.project.trainingdiary.dto.request;

import com.project.trainingdiary.model.GenderType;
import com.project.trainingdiary.model.TargetType;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Positive;
import jakarta.validation.constraints.Size;
import java.time.LocalDate;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class EditTraineeInfoRequestDto {

@NotNull(message = "traineeId 값은 null이 될 수 없습니다.")
private Long traineeId;

@NotNull(message = "birthDate 값은 null이 될 수 없습니다.")
private LocalDate birthDate;

@NotNull(message = "gender 값은 null이 될 수 없습니다.")
private GenderType gender;

@Positive(message = "height 값은 양수이어야 합니다.")
private double height;

@Positive(message = "remainingSessions 값은 양수이어야 합니다.")
private int remainingSessions;

@NotNull(message = "targetType 값은 null이 될 수 없습니다.")
private TargetType targetType;

@Positive(message = "targetValue 값은 양수이어야 합니다.")
private double targetValue;

@NotNull(message = "targetReward 값은 null이 될 수 없습니다.")
@Size(min = 1, max = 255, message = "targetReward 값은 비어있을 수 없으며 255자를 초과할 수 없습니다.")
private String targetReward;
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
package com.project.trainingdiary.dto.request;

import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Pattern;
import lombok.Getter;
import lombok.Setter;
Expand All @@ -10,11 +11,12 @@
@Setter
public class SignInRequestDto {

@NotBlank(message = "email은 필수 입력 값입니다.")
@Schema(example = "[email protected]")
@NotNull(message = "email은 필수 입력 값입니다.")
@Email(message = "email 형식에 맞지 않습니다.")
private String email;

@NotBlank(message = "password은 필수 입력 값입니다.")
@NotNull(message = "password은 필수 입력 값입니다.")
@Pattern(regexp = "^(?=.*[a-zA-Z])(?=.*\\d)(?=.*[@$!%*?&])[A-Za-z\\d@$!%*?&]{8,15}$", message = "비밀번호 형식이 잘못 되었습니다.")
private String password;
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
import jakarta.validation.constraints.Pattern;
import lombok.Getter;
import lombok.Setter;
import org.hibernate.validator.constraints.Length;

@Getter
@Setter
Expand All @@ -17,10 +16,6 @@ public class SignUpRequestDto {
@Email(message = "email 형식에 맞지 않습니다.")
private String email;

@NotBlank(message = "인증 번호는 필수 입력 값입니다.")
@Length(min = 6, max = 6, message = "인증 번호는 6개의 숫자로 만듭니다.")
private String verificationCode;

@NotBlank(message = "password은 필수 입력 값입니다.")
@Pattern(regexp = "^(?=.*[a-zA-Z])(?=.*\\d)(?=.*[@$!%*?&])[A-Za-z\\d@$!%*?&]{8,15}$", message = "비밀번호 형식이 잘못 되었습니다.")
private String password;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.project.trainingdiary.dto.response;

import com.project.trainingdiary.entity.InBodyRecordHistoryEntity;
import java.time.LocalDate;
import lombok.Builder;
import lombok.Getter;

@Getter
@Builder
public class AddInBodyInfoResponseDto {

private long id;
private double weight;
private double bodyFatPercentage;
private double skeletalMuscleMass;
private LocalDate addedDate;

public static AddInBodyInfoResponseDto fromEntity(InBodyRecordHistoryEntity entity) {
return AddInBodyInfoResponseDto.builder()
.id(entity.getId())
.weight(entity.getWeight())
.bodyFatPercentage(entity.getBodyFatPercentage())
.skeletalMuscleMass(entity.getSkeletalMuscleMass())
.addedDate(entity.getAddedDate())
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.project.trainingdiary.dto.response;

import com.project.trainingdiary.entity.TraineeEntity;
import com.project.trainingdiary.model.GenderType;
import com.project.trainingdiary.model.TargetType;
import java.time.LocalDate;
import lombok.Builder;
import lombok.Getter;

@Getter
@Builder
public class EditTraineeInfoResponseDto {

private Long traineeId;
private LocalDate birthDate;
private GenderType gender;
private double height;
private int remainingSessions;
private TargetType targetType;
private double targetValue;
private String targetReward;

public static EditTraineeInfoResponseDto fromEntity(TraineeEntity trainee) {
return EditTraineeInfoResponseDto.builder()
.traineeId(trainee.getId())
.birthDate(trainee.getBirthDate())
.gender(trainee.getGender())
.height(trainee.getHeight())
.targetType(trainee.getTargetType())
.targetValue(trainee.getTargetValue())
.targetReward(trainee.getTargetReward())
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,6 @@
@NoArgsConstructor
public class SignInResponseDto {

private String accessToken;
private String refreshToken;
private String email;
private String role;
}
Loading

0 comments on commit b4ab383

Please sign in to comment.