diff --git a/src/main/java/com/rest/api/SpringRestApiApplication.java b/src/main/java/com/rest/api/SpringRestApiApplication.java index 46e02cc..43edbbd 100644 --- a/src/main/java/com/rest/api/SpringRestApiApplication.java +++ b/src/main/java/com/rest/api/SpringRestApiApplication.java @@ -6,10 +6,12 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory; import org.springframework.context.annotation.Bean; +import org.springframework.data.jpa.repository.config.EnableJpaAuditing; import org.springframework.security.crypto.factory.PasswordEncoderFactories; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.web.client.RestTemplate; +@EnableJpaAuditing @SpringBootApplication public class SpringRestApiApplication { public static void main(String[] args) { diff --git a/src/main/java/com/rest/api/advice/ExceptionAdvice.java b/src/main/java/com/rest/api/advice/ExceptionAdvice.java index 8ff576d..3ff7860 100644 --- a/src/main/java/com/rest/api/advice/ExceptionAdvice.java +++ b/src/main/java/com/rest/api/advice/ExceptionAdvice.java @@ -26,7 +26,7 @@ public class ExceptionAdvice { @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) protected CommonResult defaultException(HttpServletRequest request, Exception e) { // 예외 처리의 메시지를 MessageSource에서 가져오도록 수정 - return responseService.getFailResult(Integer.valueOf(getMessage("unKnown.code")), getMessage("unKnown.msg")); + return responseService.getFailResult(Integer.valueOf(getMessage("unKnown.code")), getMessage("unKnown.msg") + "(" + e.getMessage() + ")"); } @ExceptionHandler(CUserNotFoundException.class) @@ -48,7 +48,7 @@ public class ExceptionAdvice { } @ExceptionHandler(AccessDeniedException.class) - @ResponseStatus(HttpStatus.UNAUTHORIZED) + @ResponseStatus(HttpStatus.FORBIDDEN) public CommonResult accessDeniedException(HttpServletRequest request, AccessDeniedException e) { return responseService.getFailResult(Integer.valueOf(getMessage("accessDenied.code")), getMessage("accessDenied.msg")); } @@ -65,10 +65,23 @@ public class ExceptionAdvice { return responseService.getFailResult(Integer.valueOf(getMessage("existingUser.code")), getMessage("existingUser.msg")); } + @ExceptionHandler(CNotOwnerException.class) + @ResponseStatus(HttpStatus.NON_AUTHORITATIVE_INFORMATION) + public CommonResult notOwnerException(HttpServletRequest request, CNotOwnerException e) { + return responseService.getFailResult(Integer.valueOf(getMessage("notOwner.code")), getMessage("notOwner.msg")); + } + + @ExceptionHandler(CResourceNotExistException.class) + @ResponseStatus(HttpStatus.NOT_FOUND) + public CommonResult resourceNotExistException(HttpServletRequest request, CResourceNotExistException e) { + return responseService.getFailResult(Integer.valueOf(getMessage("resourceNotExist.code")), getMessage("resourceNotExist.msg")); + } + // code정보에 해당하는 메시지를 조회합니다. private String getMessage(String code) { return getMessage(code, null); } + // code정보, 추가 argument로 현재 locale에 맞는 메시지를 조회합니다. private String getMessage(String code, Object[] args) { return messageSource.getMessage(code, args, LocaleContextHolder.getLocale()); diff --git a/src/main/java/com/rest/api/advice/exception/CNotOwnerException.java b/src/main/java/com/rest/api/advice/exception/CNotOwnerException.java new file mode 100644 index 0000000..34ecccb --- /dev/null +++ b/src/main/java/com/rest/api/advice/exception/CNotOwnerException.java @@ -0,0 +1,18 @@ +package com.rest.api.advice.exception; + +public class CNotOwnerException extends RuntimeException { + + private static final long serialVersionUID = 2241549550934267615L; + + public CNotOwnerException(String msg, Throwable t) { + super(msg, t); + } + + public CNotOwnerException(String msg) { + super(msg); + } + + public CNotOwnerException() { + super(); + } +} diff --git a/src/main/java/com/rest/api/advice/exception/CResourceNotExistException.java b/src/main/java/com/rest/api/advice/exception/CResourceNotExistException.java new file mode 100644 index 0000000..1cd44ee --- /dev/null +++ b/src/main/java/com/rest/api/advice/exception/CResourceNotExistException.java @@ -0,0 +1,15 @@ +package com.rest.api.advice.exception; + +public class CResourceNotExistException extends RuntimeException { + public CResourceNotExistException(String msg, Throwable t) { + super(msg, t); + } + + public CResourceNotExistException(String msg) { + super(msg); + } + + public CResourceNotExistException() { + super(); + } +} diff --git a/src/main/java/com/rest/api/config/security/CustomAccessDeniedHandler.java b/src/main/java/com/rest/api/config/security/CustomAccessDeniedHandler.java index b39dbd4..e1cdff0 100644 --- a/src/main/java/com/rest/api/config/security/CustomAccessDeniedHandler.java +++ b/src/main/java/com/rest/api/config/security/CustomAccessDeniedHandler.java @@ -17,4 +17,4 @@ public class CustomAccessDeniedHandler implements AccessDeniedHandler { public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException exception) throws IOException { response.sendRedirect("/exception/accessdenied"); } -} +} \ No newline at end of file diff --git a/src/main/java/com/rest/api/config/security/CustomAuthenticationEntryPoint.java b/src/main/java/com/rest/api/config/security/CustomAuthenticationEntryPoint.java index 5d96f7c..1e898b5 100644 --- a/src/main/java/com/rest/api/config/security/CustomAuthenticationEntryPoint.java +++ b/src/main/java/com/rest/api/config/security/CustomAuthenticationEntryPoint.java @@ -5,8 +5,6 @@ import org.springframework.security.core.AuthenticationException; import org.springframework.security.web.AuthenticationEntryPoint; import org.springframework.stereotype.Component; -import javax.servlet.RequestDispatcher; -import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @@ -14,10 +12,8 @@ import java.io.IOException; @Slf4j @Component public class CustomAuthenticationEntryPoint implements AuthenticationEntryPoint { - @Override - public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException ex) throws IOException, - ServletException { + public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException ex) throws IOException { response.sendRedirect("/exception/entrypoint"); } -} +} \ No newline at end of file diff --git a/src/main/java/com/rest/api/config/security/SecurityConfiguration.java b/src/main/java/com/rest/api/config/security/SecurityConfiguration.java index 3880c9a..fb46575 100644 --- a/src/main/java/com/rest/api/config/security/SecurityConfiguration.java +++ b/src/main/java/com/rest/api/config/security/SecurityConfiguration.java @@ -32,8 +32,7 @@ public class SecurityConfiguration extends WebSecurityConfigurerAdapter { .and() .authorizeRequests() // 다음 리퀘스트에 대한 사용권한 체크 .antMatchers("/*/signin", "/*/signin/**", "/*/signup", "/*/signup/**", "/social/**").permitAll() // 가입 및 인증 주소는 누구나 접근가능 - .antMatchers(HttpMethod.GET, "/exception/**","/helloworld/**").permitAll() // hellowworld로 시작하는 GET요청 리소스는 누구나 접근가능 - .antMatchers(HttpMethod.GET, "/helloworld/**","/actuator/health").permitAll() // hellowworld로 시작하는 GET요청 리소스는 누구나 접근가능 + .antMatchers(HttpMethod.GET, "/exception/**", "/helloworld/**","/actuator/health", "/v1/board/**").permitAll() // hellowworld로 시작하는 GET요청 리소스는 누구나 접근가능 .anyRequest().hasRole("USER") // 그외 나머지 요청은 모두 인증된 회원만 접근 가능 .and() .exceptionHandling().accessDeniedHandler(new CustomAccessDeniedHandler()) diff --git a/src/main/java/com/rest/api/controller/HelloController.java b/src/main/java/com/rest/api/controller/HelloController.java index b9a8b7c..ed5538d 100644 --- a/src/main/java/com/rest/api/controller/HelloController.java +++ b/src/main/java/com/rest/api/controller/HelloController.java @@ -5,7 +5,6 @@ import lombok.Setter; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; @Slf4j diff --git a/src/main/java/com/rest/api/controller/v1/UserController.java b/src/main/java/com/rest/api/controller/v1/UserController.java index c5c4541..cf1f437 100644 --- a/src/main/java/com/rest/api/controller/v1/UserController.java +++ b/src/main/java/com/rest/api/controller/v1/UserController.java @@ -51,12 +51,12 @@ public class UserController { @ApiOperation(value = "회원 수정", notes = "회원정보를 수정한다") @PutMapping(value = "/user") public SingleResult modify( - @ApiParam(value = "회원번호", required = true) @RequestParam long msrl, @ApiParam(value = "회원이름", required = true) @RequestParam String name) { - User user = User.builder() - .msrl(msrl) - .name(name) - .build(); + + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + String id = authentication.getName(); + User user = userJpaRepo.findByUid(id).orElseThrow(CUserNotFoundException::new); + user.setName(name); return responseService.getSingleResult(userJpaRepo.save(user)); } diff --git a/src/main/java/com/rest/api/controller/v1/board/BoardController.java b/src/main/java/com/rest/api/controller/v1/board/BoardController.java new file mode 100644 index 0000000..86fde1c --- /dev/null +++ b/src/main/java/com/rest/api/controller/v1/board/BoardController.java @@ -0,0 +1,82 @@ +package com.rest.api.controller.v1.board; + +import com.rest.api.entity.board.Board; +import com.rest.api.entity.board.Post; +import com.rest.api.model.board.ParamsPost; +import com.rest.api.model.response.CommonResult; +import com.rest.api.model.response.ListResult; +import com.rest.api.model.response.SingleResult; +import com.rest.api.service.ResponseService; +import com.rest.api.service.board.BoardService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; + +@Api(tags = {"3. Board"}) +@RequiredArgsConstructor +@RestController +@RequestMapping(value = "/v1/board") +public class BoardController { + + private final BoardService boardService; + private final ResponseService responseService; + + @ApiOperation(value = "게시판 정보 조회", notes = "게시판 정보를 조회한다.") + @GetMapping(value = "/{boardName}") + public SingleResult boardInfo(@PathVariable String boardName) { + return responseService.getSingleResult(boardService.findBoard(boardName)); + } + + @ApiOperation(value = "게시글 리스트", notes = "게시글 리스트를 조회한다.") + @GetMapping(value = "/{boardName}/posts") + public ListResult posts(@PathVariable String boardName) { + return responseService.getListResult(boardService.findPosts(boardName)); + } + + @ApiImplicitParams({ + @ApiImplicitParam(name = "X-AUTH-TOKEN", value = "로그인 성공 후 access_token", required = true, dataType = "String", paramType = "header") + }) + @ApiOperation(value = "게시글 작성", notes = "게시글을 작성한다.") + @PostMapping(value = "/{boardName}") + public SingleResult post(@PathVariable String boardName, @Valid @ModelAttribute ParamsPost post) { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + String uid = authentication.getName(); + return responseService.getSingleResult(boardService.writePost(uid, boardName, post)); + } + + @ApiOperation(value = "게시글 상세", notes = "게시글 상세정보를 조회한다.") + @GetMapping(value = "/post/{postId}") + public SingleResult post(@PathVariable long postId) { + return responseService.getSingleResult(boardService.getPost(postId)); + } + + @ApiImplicitParams({ + @ApiImplicitParam(name = "X-AUTH-TOKEN", value = "로그인 성공 후 access_token", required = true, dataType = "String", paramType = "header") + }) + @ApiOperation(value = "게시글 수정", notes = "게시판의 글을 수정한다.") + @PutMapping(value = "/post/{postId}") + public SingleResult post(@PathVariable long postId, @Valid @ModelAttribute ParamsPost post) { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + String uid = authentication.getName(); + return responseService.getSingleResult(boardService.updatePost(postId, uid, post)); + } + + @ApiImplicitParams({ + @ApiImplicitParam(name = "X-AUTH-TOKEN", value = "로그인 성공 후 access_token", required = true, dataType = "String", paramType = "header") + }) + @ApiOperation(value = "게시글 삭제", notes = "게시글을 삭제한다.") + @DeleteMapping(value = "/post/{postId}") + public CommonResult deletePost(@PathVariable long postId) { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + String uid = authentication.getName(); + boardService.deletePost(postId, uid); + return responseService.getSuccessResult(); + } +} diff --git a/src/main/java/com/rest/api/entity/User.java b/src/main/java/com/rest/api/entity/User.java index 5156ad8..307cd35 100644 --- a/src/main/java/com/rest/api/entity/User.java +++ b/src/main/java/com/rest/api/entity/User.java @@ -1,6 +1,8 @@ package com.rest.api.entity; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; +import com.rest.api.entity.common.CommonDateEntity; import lombok.*; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; @@ -15,13 +17,15 @@ import java.util.stream.Collectors; @Builder // builder를 사용할수 있게 합니다. @Entity // jpa entity임을 알립니다. @Getter // user 필드값의 getter를 자동으로 생성합니다. +@Setter @NoArgsConstructor // 인자없는 생성자를 자동으로 생성합니다. @AllArgsConstructor // 인자를 모두 갖춘 생성자를 자동으로 생성합니다. @Table(name = "user") // 'user' 테이블과 매핑됨을 명시 -public class User implements UserDetails { +@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}) // Post Entity에서 User와의 관계를 Json으로 변환시 오류 방지를 위한 코드 +public class User extends CommonDateEntity implements UserDetails { @Id // pk @GeneratedValue(strategy = GenerationType.IDENTITY) - private long msrl; + private Long msrl; @Column(nullable = false, unique = true, length = 50) private String uid; @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) diff --git a/src/main/java/com/rest/api/entity/board/Board.java b/src/main/java/com/rest/api/entity/board/Board.java new file mode 100644 index 0000000..f090b81 --- /dev/null +++ b/src/main/java/com/rest/api/entity/board/Board.java @@ -0,0 +1,18 @@ +package com.rest.api.entity.board; + +import com.rest.api.entity.common.CommonDateEntity; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import javax.persistence.*; + +@Entity +@Getter +@NoArgsConstructor +public class Board extends CommonDateEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long boardId; + @Column(nullable = false, length = 100) + private String name; +} diff --git a/src/main/java/com/rest/api/entity/board/Post.java b/src/main/java/com/rest/api/entity/board/Post.java new file mode 100644 index 0000000..538cc6f --- /dev/null +++ b/src/main/java/com/rest/api/entity/board/Post.java @@ -0,0 +1,54 @@ +package com.rest.api.entity.board; + +import com.rest.api.entity.User; +import com.rest.api.entity.common.CommonDateEntity; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import javax.persistence.*; + +@Entity +@Getter +@NoArgsConstructor +public class Post extends CommonDateEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long postId; + @Column(nullable = false, length = 50) + private String author; + @Column(nullable = false, length = 100) + private String title; + @Column(length = 500) + private String content; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "board_id") + private Board board; // 게시글 - 게시판의 관계 - N:1 + + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "msrl") + private User user; // 게시글 - 회원의 관계 - N:1 + + // Join 테이블이 Json결과에 표시되지 않도록 처리. + protected Board getBoard() { + return board; + } + + // 생성자 + public Post(User user, Board board, String author, String title, String content) { + this.user = user; + this.board = board; + this.author = author; + this.title = title; + this.content = content; + } + + // 수정시 데이터 처리 + public Post setUpdate(String author, String title, String content) { + this.author = author; + this.title = title; + this.content = content; + return this; + } +} diff --git a/src/main/java/com/rest/api/entity/common/CommonDateEntity.java b/src/main/java/com/rest/api/entity/common/CommonDateEntity.java new file mode 100644 index 0000000..3fb2ec8 --- /dev/null +++ b/src/main/java/com/rest/api/entity/common/CommonDateEntity.java @@ -0,0 +1,20 @@ +package com.rest.api.entity.common; + +import lombok.Getter; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +import javax.persistence.EntityListeners; +import javax.persistence.MappedSuperclass; +import java.time.LocalDateTime; + +@Getter +@MappedSuperclass +@EntityListeners(AuditingEntityListener.class) +public abstract class CommonDateEntity { + @CreatedDate + private LocalDateTime createdAt; + @LastModifiedDate + private LocalDateTime modifiedAt; +} diff --git a/src/main/java/com/rest/api/model/board/ParamsPost.java b/src/main/java/com/rest/api/model/board/ParamsPost.java new file mode 100644 index 0000000..8e76407 --- /dev/null +++ b/src/main/java/com/rest/api/model/board/ParamsPost.java @@ -0,0 +1,26 @@ +package com.rest.api.model.board; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import javax.validation.constraints.Max; +import javax.validation.constraints.NotEmpty; + +@Getter +@Setter +@NoArgsConstructor +public class ParamsPost { + @NotEmpty + @Max(50) + @ApiModelProperty(value = "작성자명", required = true) + private String author; + @NotEmpty + @Max(100) + @ApiModelProperty(value = "제목", required = true) + private String title; + @Max(500) + @ApiModelProperty(value = "내용", required = true) + private String content; +} diff --git a/src/main/java/com/rest/api/repo/board/BoardJpaRepo.java b/src/main/java/com/rest/api/repo/board/BoardJpaRepo.java new file mode 100644 index 0000000..7c26a5a --- /dev/null +++ b/src/main/java/com/rest/api/repo/board/BoardJpaRepo.java @@ -0,0 +1,8 @@ +package com.rest.api.repo.board; + +import com.rest.api.entity.board.Board; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface BoardJpaRepo extends JpaRepository { + Board findByName(String name); +} diff --git a/src/main/java/com/rest/api/repo/board/PostJpaRepo.java b/src/main/java/com/rest/api/repo/board/PostJpaRepo.java new file mode 100644 index 0000000..11fefe8 --- /dev/null +++ b/src/main/java/com/rest/api/repo/board/PostJpaRepo.java @@ -0,0 +1,11 @@ +package com.rest.api.repo.board; + +import com.rest.api.entity.board.Board; +import com.rest.api.entity.board.Post; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +public interface PostJpaRepo extends JpaRepository { + List findByBoard(Board board); +} \ No newline at end of file diff --git a/src/main/java/com/rest/api/service/board/BoardService.java b/src/main/java/com/rest/api/service/board/BoardService.java new file mode 100644 index 0000000..47ea2ab --- /dev/null +++ b/src/main/java/com/rest/api/service/board/BoardService.java @@ -0,0 +1,71 @@ +package com.rest.api.service.board; + +import com.rest.api.advice.exception.CNotOwnerException; +import com.rest.api.advice.exception.CResourceNotExistException; +import com.rest.api.advice.exception.CUserNotFoundException; +import com.rest.api.entity.User; +import com.rest.api.entity.board.Board; +import com.rest.api.entity.board.Post; +import com.rest.api.model.board.ParamsPost; +import com.rest.api.repo.UserJpaRepo; +import com.rest.api.repo.board.BoardJpaRepo; +import com.rest.api.repo.board.PostJpaRepo; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import javax.transaction.Transactional; +import java.util.List; +import java.util.Optional; + +@Service +@Transactional +@RequiredArgsConstructor +public class BoardService { + + private final BoardJpaRepo boardJpaRepo; + private final PostJpaRepo postJpaRepo; + private final UserJpaRepo userJpaRepo; + + // 게시판 이름으로 게시판을 조회. 없을경우 CResourceNotExistException 처리 + public Board findBoard(String boardName) { + return Optional.ofNullable(boardJpaRepo.findByName(boardName)).orElseThrow(CResourceNotExistException::new); + } + + // 게시판 이름으로 게시물 리스트 조회. + public List findPosts(String boardName) { + return postJpaRepo.findByBoard(findBoard(boardName)); + } + + // 게시물ID로 게시물 단건 조회. 없을경우 CResourceNotExistException 처리 + public Post getPost(long postId) { + return postJpaRepo.findById(postId).orElseThrow(CResourceNotExistException::new); + } + + // 게시물을 등록합니다. 게시물의 회원UID가 조회되지 않으면 CUserNotFoundException 처리합니다. + public Post writePost(String uid, String boardName, ParamsPost paramsPost) { + Board board = findBoard(boardName); + Post post = new Post(userJpaRepo.findByUid(uid).orElseThrow(CUserNotFoundException::new), board, paramsPost.getAuthor(), paramsPost.getTitle(), paramsPost.getContent()); + return postJpaRepo.save(post); + } + + // 게시물을 수정합니다. 게시물 등록자와 로그인 회원정보가 틀리면 CNotOwnerException 처리합니다. + public Post updatePost(long postId, String uid, ParamsPost paramsPost) { + Post post = getPost(postId); + User user = post.getUser(); + if (!uid.equals(user.getUid())) + throw new CNotOwnerException(); + + post.setUpdate(paramsPost.getAuthor(), paramsPost.getTitle(), paramsPost.getContent()); + return postJpaRepo.save(post); + } + + // 게시물을 삭제합니다. 게시물 등록자와 로그인 회원정보가 틀리면 CNotOwnerException 처리합니다. + public boolean deletePost(long postId, String uid) { + Post post = getPost(postId); + User user = post.getUser(); + if (!uid.equals(user.getUid())) + throw new CNotOwnerException(); + postJpaRepo.delete(post); + return true; + } +} diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml index 3b3316c..00008ac 100644 --- a/src/main/resources/application-local.yml +++ b/src/main/resources/application-local.yml @@ -1,6 +1,6 @@ logging: level: - root: warn + root: info com.rest.api: debug spring: diff --git a/src/main/resources/i18n/exception_en.yml b/src/main/resources/i18n/exception_en.yml index ff111c2..11fc40f 100644 --- a/src/main/resources/i18n/exception_en.yml +++ b/src/main/resources/i18n/exception_en.yml @@ -18,4 +18,10 @@ communicationError: msg: "An error occurred during communication." existingUser: code: "-1005" - msg: "You are an existing member." \ No newline at end of file + msg: "You are an existing member." +notOwner: + code: "-1006" + msg: "You are not the owner of this resource." +resourceNotExist: + code: "-1007" + msg: "This resource does not exist." \ No newline at end of file diff --git a/src/main/resources/i18n/exception_ko.yml b/src/main/resources/i18n/exception_ko.yml index e09b6dd..a1537c8 100644 --- a/src/main/resources/i18n/exception_ko.yml +++ b/src/main/resources/i18n/exception_ko.yml @@ -1,6 +1,6 @@ unKnown: code: "-9999" - msg: "알수 없는 오류가 발생하였습니다." + msg: "알수없는 오류가 발생하였습니다." userNotFound: code: "-1000" msg: "존재하지 않는 회원입니다." @@ -18,4 +18,10 @@ communicationError: msg: "통신 중 오류가 발생하였습니다." existingUser: code: "-1005" - msg: "이미 가입한 회원입니다. 로그인을 해주십시오." \ No newline at end of file + msg: "이미 가입한 회원입니다. 로그인을 해주십시오." +notOwner: + code: "-1006" + msg: "해당 자원의 소유자가 아닙니다." +resourceNotExist: + code: "-1007" + msg: "요청한 자원이 존재 하지 않습니다." \ No newline at end of file diff --git a/src/test/java/com/rest/api/controller/v1/UserControllerTest.java b/src/test/java/com/rest/api/controller/v1/UserControllerTest.java index a4d410a..9cc4908 100644 --- a/src/test/java/com/rest/api/controller/v1/UserControllerTest.java +++ b/src/test/java/com/rest/api/controller/v1/UserControllerTest.java @@ -47,7 +47,7 @@ public class UserControllerTest { @Before public void setUp() throws Exception { - userJpaRepo.save(User.builder().uid("happydaddy@naver.com").name("happydaddy").password(passwordEncoder.encode("1234")).roles(Collections.singletonList("ROLE_USER")).build()); + //userJpaRepo.save(User.builder().uid("happydaddy@naver.com").name("happydaddy").password(passwordEncoder.encode("1234")).roles(Collections.singletonList("ROLE_USER")).build()); MultiValueMap params = new LinkedMultiValueMap<>(); params.add("id", "happydaddy@naver.com"); params.add("password", "1234"); @@ -75,8 +75,8 @@ public class UserControllerTest { .get("/v1/users") .header("X-AUTH-TOKEN", "XXXXXXXXXX")) .andDo(print()) - .andExpect(status().isOk()) - .andExpect(forwardedUrl("/exception/entrypoint")); + .andExpect(status().is3xxRedirection()) + .andExpect(redirectedUrl("/exception/entrypoint")); } @Test @@ -86,8 +86,8 @@ public class UserControllerTest { .get("/v1/users")) //.header("X-AUTH-TOKEN", token)) .andDo(print()) - .andExpect(status().isOk()) - .andExpect(forwardedUrl("/exception/accessdenied")); + .andExpect(status().is3xxRedirection()) + .andExpect(redirectedUrl("/exception/accessdenied")); } @Test @@ -115,7 +115,7 @@ public class UserControllerTest { @Test public void modify() throws Exception { MultiValueMap params = new LinkedMultiValueMap<>(); - params.add("msrl", "1"); + params.add("uid", "happydaddy@naver.com"); params.add("name", "행복전도사"); mockMvc.perform(MockMvcRequestBuilders .put("/v1/user") @@ -123,7 +123,8 @@ public class UserControllerTest { .params(params)) .andDo(print()) .andExpect(status().isOk()) - .andExpect(jsonPath("$.success").value(true)); + .andExpect(jsonPath("$.success").value(true)) + .andExpect(jsonPath("$.data.name").value("행복전도사")); } @Test