diff --git a/build.gradle b/build.gradle index 1e0c4e6..29c1b07 100644 --- a/build.gradle +++ b/build.gradle @@ -29,6 +29,7 @@ dependencies { //db implementation 'mysql:mysql-connector-java' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + //jwt implementation group: 'io.jsonwebtoken', name: 'jjwt-api', version: '0.11.5' runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-impl', version: '0.11.5' diff --git a/src/main/java/com/example/UnderTheSea_Server/config/BaseException.java b/src/main/java/com/example/UnderTheSea_Server/config/BaseException.java index d722592..c19f7ae 100644 --- a/src/main/java/com/example/UnderTheSea_Server/config/BaseException.java +++ b/src/main/java/com/example/UnderTheSea_Server/config/BaseException.java @@ -9,4 +9,5 @@ @AllArgsConstructor public class BaseException extends Exception { private BaseResponseStatus status; -} \ No newline at end of file +} + diff --git a/src/main/java/com/example/UnderTheSea_Server/config/BaseResponse.java b/src/main/java/com/example/UnderTheSea_Server/config/BaseResponse.java index bd3df85..e7914ab 100644 --- a/src/main/java/com/example/UnderTheSea_Server/config/BaseResponse.java +++ b/src/main/java/com/example/UnderTheSea_Server/config/BaseResponse.java @@ -32,4 +32,4 @@ public BaseResponse(BaseResponseStatus status) { this.message = status.getMessage(); this.code = status.getCode(); } -} \ No newline at end of file +} diff --git a/src/main/java/com/example/UnderTheSea_Server/config/BaseResponseStatus.java b/src/main/java/com/example/UnderTheSea_Server/config/BaseResponseStatus.java index 2bb22d3..cd9ed5d 100644 --- a/src/main/java/com/example/UnderTheSea_Server/config/BaseResponseStatus.java +++ b/src/main/java/com/example/UnderTheSea_Server/config/BaseResponseStatus.java @@ -8,14 +8,14 @@ @Getter public enum BaseResponseStatus { /** - * 1000: 요청 성공 + * 200: 요청 성공 */ - SUCCESS(true, 1000, "요청에 성공하였습니다."), + SUCCESS(true, 200, "요청에 성공하였습니다."), /** - * 2000: Request 오류 + * 400: Request 오류 */ - // [POST] /plans + // [POST] /plans / records POST_PLAN_EMPTY_USER(false, 400, "계획을 실천할 사용자를 입력해주세요"), POST_PLAN_EMPTY_FRIEND(false, 400, "함께할 친구를 입력해주세요"), POST_PLAN_WRONG_FRIEND(false, 400, "친구로 입력한 사용자가 존재하지 않습니다."), @@ -26,21 +26,33 @@ public enum BaseResponseStatus { GET_PLAN_EMPTY_DATE(false, 400, "날짜를 입력해주세요."), PUT_PLAN_EMPTY_ID(false, 400, "계획 식별자를 입력해주세요."), PUT_PLAN_WRONG_ID(false, 400, "존재하지 않는 계획 식별자입니다."), + PUT_CHARACTER_WRONG_ID(false, 400, "존재하지 않는 캐릭터 식별자입니다."), + PUT_CHARACTER_EMPTY_ID(false, 400, "캐릭터 식별자를 입력해주세요."), + PUT_CHARACTER_EMPTY_NAME(false, 400, "캐릭터 이름을 입력해주세요."), + PUT_CHARACTER_LENGTH_NAME(false, 400, "캐릭터 이름을 10자 이하로 입력해주세요."), + PUT_MILEAGE_EMPTY_COUNT(false, 400, "추가할 마일리지를 입력해주세요."), + PUT_MILEAGE_WRONG_COUNT(false, 400, "마일리지는 1 이상의 수로 입력해주세요."), + + POST_RECORD_EMPTY_IMGURL(false, 400, "기록의 이미지를 업로드해주세요."), + + POST_RECORD_EMPTY_CONTENT(false, 400, "기록의 내용을 입력해주세요"), + + POST_RECORD_EMPTY_SATISFACTION(false, 400, "만족도를 입력해주세요."), /** - * 3000: Response 오류 + * 400: Response 오류 */ - RESPONSE_ERROR(false, 3000, "값을 불러오는데 실패하였습니다."), + RESPONSE_ERROR(false, 400, "값을 불러오는데 실패하였습니다."), /** - * 4000: Database 오류 + * 400: Database 오류 */ - DATABASE_ERROR(false, 4000, "데이터베이스 연결에 실패하였습니다."), + DATABASE_ERROR(false, 400, "데이터베이스 연결에 실패하였습니다."), /** - * 5000: Server 오류 + * 400: Server 오류 */ - SERVER_ERROR(false, 5000, "서버 연결에 실패하였습니다."), + SERVER_ERROR(false, 400, "서버 연결에 실패하였습니다."), ; @@ -53,4 +65,5 @@ private BaseResponseStatus(boolean isSuccess, int code, String message) { this.code = code; this.message = message; } -} \ No newline at end of file + +} diff --git a/src/main/java/com/example/UnderTheSea_Server/controller/RecordController.java b/src/main/java/com/example/UnderTheSea_Server/controller/RecordController.java new file mode 100644 index 0000000..194be52 --- /dev/null +++ b/src/main/java/com/example/UnderTheSea_Server/controller/RecordController.java @@ -0,0 +1,50 @@ +package com.example.UnderTheSea_Server.controller; + + +import com.example.UnderTheSea_Server.config.BaseException; +import com.example.UnderTheSea_Server.config.BaseResponse; +import com.example.UnderTheSea_Server.domain.User; +import com.example.UnderTheSea_Server.model.PostRecordReq; +import com.example.UnderTheSea_Server.model.PostRecordRes; +import com.example.UnderTheSea_Server.service.RecordService; +import lombok.RequiredArgsConstructor; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import com.example.UnderTheSea_Server.jwt.JwtService; +import org.springframework.web.bind.annotation.RestController; + +import static com.example.UnderTheSea_Server.config.BaseResponseStatus.*; +@RestController +@RequiredArgsConstructor +public class RecordController { + + private final RecordService recordService; + private final JwtService jwtService; + + + //@ResponseBody + @PostMapping("/records") + public BaseResponse createRecord(@RequestBody PostRecordReq postRecordReq) { + if(postRecordReq.img_url == null){ + return new BaseResponse<>(POST_RECORD_EMPTY_IMGURL); + } + if(postRecordReq.content.isEmpty()){ + return new BaseResponse<>(POST_RECORD_EMPTY_CONTENT); + } + if(postRecordReq.satisfaction == null){ + return new BaseResponse<>(POST_RECORD_EMPTY_SATISFACTION); + } + + try{ + User userByJwt = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); + Long userIdByJwt = userByJwt.getUserId(); + + PostRecordRes postRecordRes = recordService.createRecord(postRecordReq, userByJwt); + return new BaseResponse<>(postRecordRes); + } catch(BaseException exception){ + return new BaseResponse<>((exception.getStatus())); + } + } + +} diff --git a/src/main/java/com/example/UnderTheSea_Server/controller/UserController.java b/src/main/java/com/example/UnderTheSea_Server/controller/UserController.java new file mode 100644 index 0000000..04f0319 --- /dev/null +++ b/src/main/java/com/example/UnderTheSea_Server/controller/UserController.java @@ -0,0 +1,82 @@ +package com.example.UnderTheSea_Server.controller; + +import com.example.UnderTheSea_Server.config.BaseException; +import com.example.UnderTheSea_Server.config.BaseResponse; +import com.example.UnderTheSea_Server.domain.User; +import com.example.UnderTheSea_Server.model.PutCharacterReq; +import com.example.UnderTheSea_Server.model.PutCharacterRes; +import com.example.UnderTheSea_Server.model.PutMileageReq; +import com.example.UnderTheSea_Server.model.PutMileageRes; +import com.example.UnderTheSea_Server.service.UserService; +import lombok.RequiredArgsConstructor; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.web.bind.annotation.*; + +import static com.example.UnderTheSea_Server.config.BaseResponseStatus.*; + +@RestController +@RequiredArgsConstructor +public class UserController { + private final UserService userService; + + /** + * Put Character API + * [PUT] /character + * @return BaseResponse + */ + //@ResponseBody + @PutMapping("/character") + public BaseResponse createCharacter(@RequestBody PutCharacterReq putCharacterReq) { + if(putCharacterReq.character_id == null){ + return new BaseResponse<>(PUT_CHARACTER_EMPTY_ID); + } + + if(putCharacterReq.character_id< 0){ + return new BaseResponse<>(PUT_CHARACTER_WRONG_ID); + } + + if(putCharacterReq.character_name.isEmpty()){ + return new BaseResponse<>(PUT_CHARACTER_EMPTY_NAME); + } + + if(putCharacterReq.character_name.length() > 10){ + return new BaseResponse<>(PUT_CHARACTER_LENGTH_NAME); + } + + try{ + User userByJwt = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); + + PutCharacterRes putCharacterRes = userService.createCharacter(userByJwt, putCharacterReq); + return new BaseResponse<>(putCharacterRes); + } catch(BaseException exception){ + return new BaseResponse<>((exception.getStatus())); + } + } + + /** + * Put Mileage API + * [PUT] /mileage + * @return BaseResponse + * 마일리지 update + */ + //@ResponseBody + @PutMapping("/mileage") + public BaseResponse updateMileage(@RequestBody PutMileageReq putMileageReq) { + if(putMileageReq.mileage == null){ + return new BaseResponse<>(PUT_MILEAGE_EMPTY_COUNT); + } + + if(putMileageReq.mileage <= 0){ + return new BaseResponse<>(PUT_MILEAGE_WRONG_COUNT); + } + + try{ + User userByJwt = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); + + PutMileageRes putMileageRes = userService.updateMileage(userByJwt, putMileageReq); + return new BaseResponse<>(putMileageRes); + } catch(BaseException exception){ + return new BaseResponse<>((exception.getStatus())); + } + } +} diff --git a/src/main/java/com/example/UnderTheSea_Server/domain/Record.java b/src/main/java/com/example/UnderTheSea_Server/domain/Record.java index aefaee1..910df46 100644 --- a/src/main/java/com/example/UnderTheSea_Server/domain/Record.java +++ b/src/main/java/com/example/UnderTheSea_Server/domain/Record.java @@ -1,16 +1,19 @@ package com.example.UnderTheSea_Server.domain; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.*; import org.hibernate.annotations.ColumnDefault; + import javax.persistence.*; +import java.time.LocalDate; import java.util.Date; @Entity +@Builder @Getter @Setter +@AllArgsConstructor @NoArgsConstructor @Table(name = "Record") public class Record { @@ -18,12 +21,19 @@ public class Record { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long record_id; + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id") + @JsonIgnore + private User user; + @Column(nullable = true) private String content; - @Enumerated(EnumType.STRING) - @ColumnDefault("'UNSATISFIED'") - private RecordSatisfaction satisfaction; + @Column(nullable = true) + private Integer satisfaction; + + @Column(nullable = false) + private LocalDate date; @Enumerated(EnumType.STRING) @ColumnDefault("'ACTIVE'") @@ -39,4 +49,5 @@ public class Record { @Temporal(value = TemporalType.TIMESTAMP) @Column(nullable = false) private Date updated_at; + } \ No newline at end of file diff --git a/src/main/java/com/example/UnderTheSea_Server/domain/RecordSatisfaction.java b/src/main/java/com/example/UnderTheSea_Server/domain/RecordSatisfaction.java deleted file mode 100644 index b6efef2..0000000 --- a/src/main/java/com/example/UnderTheSea_Server/domain/RecordSatisfaction.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.example.UnderTheSea_Server.domain; - -public enum RecordSatisfaction { - SATISFIED, UNSATISFIED -} diff --git a/src/main/java/com/example/UnderTheSea_Server/domain/User.java b/src/main/java/com/example/UnderTheSea_Server/domain/User.java index 7c38c4f..ca6a347 100644 --- a/src/main/java/com/example/UnderTheSea_Server/domain/User.java +++ b/src/main/java/com/example/UnderTheSea_Server/domain/User.java @@ -1,5 +1,10 @@ package com.example.UnderTheSea_Server.domain; +import io.swagger.annotations.Contact; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; import io.swagger.annotations.Contact; import lombok.*; import org.hibernate.annotations.ColumnDefault; @@ -21,7 +26,8 @@ @AllArgsConstructor @NoArgsConstructor @Table(name = "User") -public class User implements UserDetails{ + +public class User implements UserDetails { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "user_id") @@ -39,8 +45,11 @@ public class User implements UserDetails{ @Column(name = "character_id", nullable = true) private Long characterId; + @Column(name = "character_name", nullable = true) + private String characterName; + @Column(nullable = true) - private String character_name; + private Long mileage; @Enumerated(EnumType.STRING) @ColumnDefault("'ACTIVE'") @@ -55,13 +64,14 @@ public class User implements UserDetails{ private Date updated_at; @Builder - public User(Long user_id, String email, String nickname, String profileImgUrl, Long character_id, String character_name, UserStatus status, Date created_at, Date updated_at) { + public User(Long user_id, String email, String nickname, String profileImgUrl, Long character_id, String character_name, Long mileage, UserStatus status, Date created_at, Date updated_at) { this.userId = user_id; this.email = email; this.nickname = nickname; this.profileImgUrl = profileImgUrl; this.characterId = character_id; - this.character_name = character_name; + this.characterName = character_name; + this.mileage = mileage; this.status = status; this.created_at = created_at; this.updated_at = updated_at; @@ -70,7 +80,6 @@ public User(Long user_id, String email, String nickname, String profileImgUrl, L @ElementCollection(fetch = FetchType.EAGER) private List roles = new ArrayList<>(); - @Override public Collection getAuthorities() { return this.roles.stream() @@ -107,4 +116,5 @@ public boolean isCredentialsNonExpired() { public boolean isEnabled() { return true; } + } diff --git a/src/main/java/com/example/UnderTheSea_Server/dto/KakaoUserDto.java b/src/main/java/com/example/UnderTheSea_Server/dto/KakaoUserDto.java index 4075241..8d0ec65 100644 --- a/src/main/java/com/example/UnderTheSea_Server/dto/KakaoUserDto.java +++ b/src/main/java/com/example/UnderTheSea_Server/dto/KakaoUserDto.java @@ -1,6 +1,7 @@ package com.example.UnderTheSea_Server.dto; import com.example.UnderTheSea_Server.domain.User; +import com.example.UnderTheSea_Server.domain.UserStatus; import org.springframework.stereotype.Repository; import java.sql.Timestamp; @@ -16,6 +17,7 @@ public User insertUser(String email, String nickname, String profile) { .email(email) .nickname(nickname) .profileImgUrl(profile) + .status(UserStatus.ACTIVE) .created_at(created_at) .updated_at(updated_at) .build(); diff --git a/src/main/java/com/example/UnderTheSea_Server/dto/RecordDto.java b/src/main/java/com/example/UnderTheSea_Server/dto/RecordDto.java new file mode 100644 index 0000000..daeec2a --- /dev/null +++ b/src/main/java/com/example/UnderTheSea_Server/dto/RecordDto.java @@ -0,0 +1,28 @@ +package com.example.UnderTheSea_Server.dto; + +import com.example.UnderTheSea_Server.domain.Record; +import com.example.UnderTheSea_Server.domain.*; +import org.springframework.stereotype.Repository; + +import java.sql.Timestamp; +import java.util.Date; + +@Repository +public class RecordDto { + private Timestamp created_at = new Timestamp(new Date().getTime()); + private Timestamp updated_at = new Timestamp(new Date().getTime()); + + public Record insertRecord(String img_url, String content, int satisfaction, User user) { + com.example.UnderTheSea_Server.domain.Record recordEntity = Record.builder() + .img_url(img_url) + .user(user) + .content(content) + .satisfaction(satisfaction) + .status(RecordStatus.ACTIVE) + .created_at(created_at) + .updated_at(updated_at) + .build(); + return recordEntity; + } +} + diff --git a/src/main/java/com/example/UnderTheSea_Server/jwt/JwtTokenProvider.java b/src/main/java/com/example/UnderTheSea_Server/jwt/JwtTokenProvider.java index 64a3e25..6011221 100644 --- a/src/main/java/com/example/UnderTheSea_Server/jwt/JwtTokenProvider.java +++ b/src/main/java/com/example/UnderTheSea_Server/jwt/JwtTokenProvider.java @@ -28,8 +28,8 @@ public class JwtTokenProvider { private static String jwtSecretKey = "secretkeyforunderthesea1234567890"; //토큰 유효시간 - private static final long accessTokenValidTime = 30 * 60 * 1000L; - private static final long refreshTokenValidTime = 300 * 60 * 1000L; + private static final long accessTokenValidTime = 300 * 60 * 1000L; + private static final long refreshTokenValidTime = 3000 * 60 * 1000L; //jwt 토큰 생성 private final UserDetailsService userDetailsService; diff --git a/src/main/java/com/example/UnderTheSea_Server/model/GetPlansReq.java b/src/main/java/com/example/UnderTheSea_Server/model/GetPlansReq.java index 00aca4d..f93c0b4 100644 --- a/src/main/java/com/example/UnderTheSea_Server/model/GetPlansReq.java +++ b/src/main/java/com/example/UnderTheSea_Server/model/GetPlansReq.java @@ -5,6 +5,9 @@ import java.time.LocalDate; +//달력의 날짜를 누르면 그 날짜에 대한 계획들이 나오는 것 +//상세기록도 가져와야해서 더 받아와야할 듯 + @NoArgsConstructor @AllArgsConstructor public class GetPlansReq { diff --git a/src/main/java/com/example/UnderTheSea_Server/model/GetRecordReq.java b/src/main/java/com/example/UnderTheSea_Server/model/GetRecordReq.java new file mode 100644 index 0000000..e969687 --- /dev/null +++ b/src/main/java/com/example/UnderTheSea_Server/model/GetRecordReq.java @@ -0,0 +1,9 @@ +package com.example.UnderTheSea_Server.model; + +/* 프론트>서버 : record 정보 불러오기 / 뭘 집어넣어야할 지 모르겟음..*/ + +public class GetRecordReq { + + + +} diff --git a/src/main/java/com/example/UnderTheSea_Server/model/GetRecordRes.java b/src/main/java/com/example/UnderTheSea_Server/model/GetRecordRes.java new file mode 100644 index 0000000..af6cc30 --- /dev/null +++ b/src/main/java/com/example/UnderTheSea_Server/model/GetRecordRes.java @@ -0,0 +1,16 @@ +package com.example.UnderTheSea_Server.model; + +import com.example.UnderTheSea_Server.domain.Record; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; + +import java.util.List; + +@NoArgsConstructor +@AllArgsConstructor + +/* 서버>프론트 : 기록 정보 slect-list에 담아서 불러오기 */ + +public class GetRecordRes { + public List records; +} diff --git a/src/main/java/com/example/UnderTheSea_Server/model/PostRecordReq.java b/src/main/java/com/example/UnderTheSea_Server/model/PostRecordReq.java new file mode 100644 index 0000000..7d821bd --- /dev/null +++ b/src/main/java/com/example/UnderTheSea_Server/model/PostRecordReq.java @@ -0,0 +1,12 @@ +package com.example.UnderTheSea_Server.model; + +import com.example.UnderTheSea_Server.domain.User; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +@AllArgsConstructor +@NoArgsConstructor +public class PostRecordReq { + public String img_url; + public Integer satisfaction; + public String content; +} diff --git a/src/main/java/com/example/UnderTheSea_Server/model/PostRecordRes.java b/src/main/java/com/example/UnderTheSea_Server/model/PostRecordRes.java new file mode 100644 index 0000000..73776a8 --- /dev/null +++ b/src/main/java/com/example/UnderTheSea_Server/model/PostRecordRes.java @@ -0,0 +1,12 @@ +package com.example.UnderTheSea_Server.model; + +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; + +@AllArgsConstructor +@NoArgsConstructor + +public class PostRecordRes { + public Long record_id; + +} diff --git a/src/main/java/com/example/UnderTheSea_Server/model/PutCharacterReq.java b/src/main/java/com/example/UnderTheSea_Server/model/PutCharacterReq.java new file mode 100644 index 0000000..44e9db6 --- /dev/null +++ b/src/main/java/com/example/UnderTheSea_Server/model/PutCharacterReq.java @@ -0,0 +1,11 @@ +package com.example.UnderTheSea_Server.model; + +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +public class PutCharacterReq { + public Long character_id; + public String character_name; +} diff --git a/src/main/java/com/example/UnderTheSea_Server/model/PutCharacterRes.java b/src/main/java/com/example/UnderTheSea_Server/model/PutCharacterRes.java new file mode 100644 index 0000000..132d55d --- /dev/null +++ b/src/main/java/com/example/UnderTheSea_Server/model/PutCharacterRes.java @@ -0,0 +1,11 @@ +package com.example.UnderTheSea_Server.model; + +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +public class PutCharacterRes { + public long user_id; + public long character_id; +} diff --git a/src/main/java/com/example/UnderTheSea_Server/model/PutMileageReq.java b/src/main/java/com/example/UnderTheSea_Server/model/PutMileageReq.java new file mode 100644 index 0000000..d9c3404 --- /dev/null +++ b/src/main/java/com/example/UnderTheSea_Server/model/PutMileageReq.java @@ -0,0 +1,10 @@ +package com.example.UnderTheSea_Server.model; + +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +public class PutMileageReq { + public Long mileage; +} diff --git a/src/main/java/com/example/UnderTheSea_Server/model/PutMileageRes.java b/src/main/java/com/example/UnderTheSea_Server/model/PutMileageRes.java new file mode 100644 index 0000000..d2a0030 --- /dev/null +++ b/src/main/java/com/example/UnderTheSea_Server/model/PutMileageRes.java @@ -0,0 +1,10 @@ +package com.example.UnderTheSea_Server.model; + +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +public class PutMileageRes { + public Long mileage; +} diff --git a/src/main/java/com/example/UnderTheSea_Server/model/PutRecordReq.java b/src/main/java/com/example/UnderTheSea_Server/model/PutRecordReq.java new file mode 100644 index 0000000..afcc2e1 --- /dev/null +++ b/src/main/java/com/example/UnderTheSea_Server/model/PutRecordReq.java @@ -0,0 +1,16 @@ +package com.example.UnderTheSea_Server.model; + +/* PUT method : 기록 정보를 Update 클라이언트>서버 */ + +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; + +@AllArgsConstructor +@NoArgsConstructor + +public class PutRecordReq { + public Long record_id; + public String img_url; + public int satisfaction; + public String content; +} diff --git a/src/main/java/com/example/UnderTheSea_Server/model/PutRecordRes.java b/src/main/java/com/example/UnderTheSea_Server/model/PutRecordRes.java new file mode 100644 index 0000000..d8ee157 --- /dev/null +++ b/src/main/java/com/example/UnderTheSea_Server/model/PutRecordRes.java @@ -0,0 +1,11 @@ +package com.example.UnderTheSea_Server.model; + +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; + +@AllArgsConstructor +@NoArgsConstructor + +public class PutRecordRes { + public Long record_id; +} diff --git a/src/main/java/com/example/UnderTheSea_Server/repository/RecordRepository.java b/src/main/java/com/example/UnderTheSea_Server/repository/RecordRepository.java new file mode 100644 index 0000000..acb0e46 --- /dev/null +++ b/src/main/java/com/example/UnderTheSea_Server/repository/RecordRepository.java @@ -0,0 +1,33 @@ +package com.example.UnderTheSea_Server.repository; + +import com.example.UnderTheSea_Server.domain.Plan; +import com.example.UnderTheSea_Server.domain.Record; +import com.example.UnderTheSea_Server.domain.User; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDate; +import java.util.List; + +@Repository +public interface RecordRepository extends JpaRepository { + + List findByUserAndDate(User user, LocalDate date); + + //Record findByUserAndRecord_id(User user, Long record_id); + + @Modifying + @Transactional + @Query("UPDATE Record R set R.satisfaction = :satisfaction, R.content = :content, R.img_url = :img_url where R.record_id = :record_id and R.user = :user") + void updateImgAndContent(@Param("img_url") String img_url, + @Param("content") String content, + @Param("record_id") Long record_id, + @Param("satisfaction") Integer satisfaction, + @Param("user") User user + ); +} + diff --git a/src/main/java/com/example/UnderTheSea_Server/repository/UserRepository.java b/src/main/java/com/example/UnderTheSea_Server/repository/UserRepository.java index 80268c7..0898e7f 100644 --- a/src/main/java/com/example/UnderTheSea_Server/repository/UserRepository.java +++ b/src/main/java/com/example/UnderTheSea_Server/repository/UserRepository.java @@ -2,14 +2,34 @@ import com.example.UnderTheSea_Server.domain.User; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.transaction.annotation.Transactional; + +import java.sql.Timestamp; +import java.util.Date; public interface UserRepository extends JpaRepository{ - // Jpa Naming 전략 - // SELECT * FROM member WHERE id = ? - // Insert into member ( user_id, password, user_name, createdate, email, role) values ( 'hermeswing', '$2a$10$C4BZPH4raAlKGrvy9dtyyufBp56af2W6fge0hD1wLctWvNEjrK.AG', '홍길동', now(), 'hermeswing@test.com', 'ROLE_ADMIN') - // id:1, pw:1234 User findByUserId(Long userId); // JPA Query Method User findByEmail(String kakaoEmail); + + @Modifying + @Transactional + @Query("UPDATE User u set u.characterId = :character_id, characterName = :character_name, u.updated_at = :updated_at where u.userId = :user_id") + void updateCharacter(@Param("character_id") Long character_id, + @Param("character_name") String character_name, + @Param("updated_at") Timestamp updated_at, + @Param("user_id") Long user_id + ); + + @Modifying + @Transactional + @Query("UPDATE User u set u.mileage = :mileage, u.updated_at = :updated_at where u.userId = :user_id") + void updateMileage(@Param("mileage") Long mileage, + @Param("updated_at") Timestamp updated_at, + @Param("user_id") Long user_id + ); } diff --git a/src/main/java/com/example/UnderTheSea_Server/service/RecordService.java b/src/main/java/com/example/UnderTheSea_Server/service/RecordService.java new file mode 100644 index 0000000..57046fc --- /dev/null +++ b/src/main/java/com/example/UnderTheSea_Server/service/RecordService.java @@ -0,0 +1,63 @@ +package com.example.UnderTheSea_Server.service; + +import com.example.UnderTheSea_Server.domain.Record; +import com.example.UnderTheSea_Server.domain.User; +import com.example.UnderTheSea_Server.dto.RecordDto; +import com.example.UnderTheSea_Server.repository.RecordRepository; +import com.example.UnderTheSea_Server.config.BaseException; +import com.example.UnderTheSea_Server.model.PostRecordReq; +import com.example.UnderTheSea_Server.model.PostRecordRes; +import com.example.UnderTheSea_Server.repository.UserRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import javax.transaction.Transactional; + +import static com.example.UnderTheSea_Server.config.BaseResponseStatus.DATABASE_ERROR; + +@Service +@RequiredArgsConstructor +public class RecordService { + + public final RecordRepository RecordRepository; + public final RecordDto recordDto; + public final UserRepository userRepository; + + //기록 저장하기 + @Transactional + public PostRecordRes createRecord(PostRecordReq postRecordReq, User userbyjwt) throws BaseException { + try{ + //기록 db에 insert하기 + Record record = RecordRepository.save( + recordDto.insertRecord( + postRecordReq.img_url, + postRecordReq.content, + postRecordReq.satisfaction, + userbyjwt + + )); + + return new PostRecordRes(record.getRecord_id()); + } catch (Exception exception) { + throw new BaseException(DATABASE_ERROR); + } + } + + +// public PutRecordRes updateRecord(PutRecordReq putRecordReq) throws BaseException { +// try{ +// +// //계획 db에서 update하기 +// RecordRepository.updateImgAndContent( +// putRecordReq.img_url, +// putRecordReq.content, +// putRecordReq.record_id, +// putRecordReq.satisfaction +// ); +// +// return new PutRecordRes(putRecordReq.record_id); +// } catch (Exception exception) { +// throw new BaseException(DATABASE_ERROR); +// } +// } +} diff --git a/src/main/java/com/example/UnderTheSea_Server/service/UserService.java b/src/main/java/com/example/UnderTheSea_Server/service/UserService.java index 7f755d8..eeb9c7f 100644 --- a/src/main/java/com/example/UnderTheSea_Server/service/UserService.java +++ b/src/main/java/com/example/UnderTheSea_Server/service/UserService.java @@ -1,23 +1,55 @@ package com.example.UnderTheSea_Server.service; +import com.example.UnderTheSea_Server.config.BaseException; import com.example.UnderTheSea_Server.domain.User; +import com.example.UnderTheSea_Server.model.PutCharacterReq; +import com.example.UnderTheSea_Server.model.PutCharacterRes; +import com.example.UnderTheSea_Server.model.PutMileageReq; +import com.example.UnderTheSea_Server.model.PutMileageRes; import com.example.UnderTheSea_Server.repository.UserRepository; import lombok.RequiredArgsConstructor; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; -@RequiredArgsConstructor +import java.sql.Timestamp; +import java.util.Date; + +import static com.example.UnderTheSea_Server.config.BaseResponseStatus.DATABASE_ERROR; + + @Service +@RequiredArgsConstructor public class UserService implements UserDetailsService { private final UserRepository userRepository; + private Timestamp updated_at = new Timestamp(new Date().getTime()); @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException{ return userRepository.findByUserId(Long.parseLong(username)); //.orElseThrow(() -> new UsernameNotFoundException("사용자를 찾을 수 없습니다.")); } + + //@Transactional + public PutCharacterRes createCharacter(User userByJwt, PutCharacterReq putCharacterReq) throws BaseException{ + try{ + //user table에서 사용자의 캐릭터 정보 update하기 + userRepository.updateCharacter(putCharacterReq.character_id, putCharacterReq.character_name, updated_at, userByJwt.getUserId()); + + return new PutCharacterRes(userByJwt.getUserId(), putCharacterReq.character_id); + } catch (Exception exception) { + throw new BaseException(DATABASE_ERROR); + } + } + + public PutMileageRes updateMileage(User userByJwt, PutMileageReq putMileageReq) throws BaseException{ + try { + userRepository.updateMileage(putMileageReq.mileage, updated_at, userByJwt.getUserId()); + + return new PutMileageRes(putMileageReq.mileage); + } catch (Exception exception){ + throw new BaseException(DATABASE_ERROR); + } + } } \ No newline at end of file