rest controller practice : send mail - mail template(board_reply)
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -1,12 +1,13 @@
|
||||
package com.example.restcontroller.board.controller;
|
||||
|
||||
import com.example.restcontroller.board.entity.BoardReport;
|
||||
import com.example.restcontroller.board.model.BoardReplyInput;
|
||||
import com.example.restcontroller.board.model.ServiceResult;
|
||||
import com.example.restcontroller.board.service.BoardService;
|
||||
import com.example.restcontroller.common.model.ResponseResult;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@@ -20,4 +21,12 @@ public class ApiAdminBoardController {
|
||||
List<BoardReport> list = boardService.boardReportList();
|
||||
return ResponseResult.success(list);
|
||||
}
|
||||
|
||||
@PostMapping("/api/admin/board/{id}/reply")
|
||||
public ResponseEntity<?> chapter5_5(@PathVariable Long id,
|
||||
@RequestBody BoardReplyInput boardReplyInput) {
|
||||
|
||||
ServiceResult result = boardService.replyBoard(id, boardReplyInput);
|
||||
return ResponseResult.result(result);
|
||||
}
|
||||
}
|
||||
@@ -23,6 +23,21 @@ public class Board {
|
||||
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||
private Long id;
|
||||
|
||||
private String title;
|
||||
|
||||
@Lob
|
||||
private String content;
|
||||
|
||||
private boolean topYn;
|
||||
|
||||
@Lob
|
||||
private String replyContents;
|
||||
|
||||
private LocalDateTime regDate;
|
||||
|
||||
private LocalDate publishStartDate;
|
||||
private LocalDate publishEndDate;
|
||||
|
||||
@ManyToOne
|
||||
@JoinColumn
|
||||
private User user;
|
||||
@@ -43,17 +58,6 @@ public class Board {
|
||||
@OneToMany(mappedBy = "board")
|
||||
List<BoardComment> boardCommentList = new ArrayList<>();
|
||||
|
||||
private String title;
|
||||
|
||||
private String content;
|
||||
|
||||
private boolean topYn;
|
||||
|
||||
private LocalDateTime regDate;
|
||||
|
||||
private LocalDate publishStartDate;
|
||||
private LocalDate publishEndDate;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Board{" +
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
package com.example.restcontroller.board.exception;
|
||||
|
||||
public class BoardNotFoundException extends RuntimeException {
|
||||
public BoardNotFoundException(String s) {
|
||||
super(s);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
package com.example.restcontroller.board.model;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
@Data
|
||||
@Builder
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
public class BoardReplyInput {
|
||||
|
||||
private String replyContents;
|
||||
}
|
||||
@@ -53,4 +53,6 @@ public interface BoardService {
|
||||
List<Board> list();
|
||||
|
||||
ServiceResult add(String email, BoardInput boardInput);
|
||||
|
||||
ServiceResult replyBoard(Long id, BoardReplyInput boardReplyInput);
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package com.example.restcontroller.board.service;
|
||||
|
||||
import com.example.restcontroller.board.entity.*;
|
||||
import com.example.restcontroller.board.exception.BoardNotFoundException;
|
||||
import com.example.restcontroller.board.exception.BoardTypeNotFoundException;
|
||||
import com.example.restcontroller.board.model.*;
|
||||
import com.example.restcontroller.board.repository.*;
|
||||
@@ -424,4 +425,29 @@ public class BoardServiceImpl implements BoardService {
|
||||
|
||||
return ServiceResult.success();
|
||||
}
|
||||
|
||||
@Transactional
|
||||
@Override
|
||||
public ServiceResult replyBoard(Long id, BoardReplyInput boardReplyInput) {
|
||||
Board boardEntity = boardRepository.findById(id).
|
||||
orElseThrow(() -> new BoardNotFoundException("게시글이 존재하지 않습니다."));
|
||||
|
||||
boardEntity.setReplyContents(boardReplyInput.getReplyContents());
|
||||
|
||||
// 메일전송
|
||||
Optional<MailTemplate> optionalMailTemplate = mailTemplateRepository.findByTemplateId("BOARD_REPLY");
|
||||
optionalMailTemplate.ifPresent((e) -> {
|
||||
String fromEmail = e.getSendEmail();
|
||||
String fromUserName = e.getSendUserName();
|
||||
String title = e.getTitle().replaceAll("\\{USER_NAME\\}", boardEntity.getUser().getUserName());
|
||||
String contents = e.getContents().replaceAll("\\{BOARD_TITLE\\}", boardEntity.getTitle())
|
||||
.replaceAll("\\{BOARD_CONTENTS\\}", boardEntity.getContent())
|
||||
.replaceAll("\\{BOARD_REPLY_CONTENTS\\}", boardEntity.getReplyContents());
|
||||
|
||||
mailComponent.send(fromEmail, fromUserName,
|
||||
boardEntity.getUser().getEmail(), boardEntity.getUser().getUserName(), title, contents);
|
||||
});
|
||||
|
||||
return ServiceResult.success();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package com.example.restcontroller.common;
|
||||
|
||||
import com.example.restcontroller.board.exception.BoardNotFoundException;
|
||||
import com.example.restcontroller.board.exception.BoardTypeNotFoundException;
|
||||
import com.example.restcontroller.common.exception.AuthFailException;
|
||||
import com.example.restcontroller.common.exception.BizException;
|
||||
@@ -29,7 +30,8 @@ public class GlobalExceptionHandler {
|
||||
PasswordNotMatchException.class,
|
||||
BoardTypeNotFoundException.class,
|
||||
BizException.class,
|
||||
AuthFailException.class})
|
||||
AuthFailException.class,
|
||||
BoardNotFoundException.class })
|
||||
public ResponseEntity<?> badRequest(RuntimeException e) {
|
||||
log.info(e.getClass().getName() + e.getMessage());
|
||||
return ResponseResult.fail(e.getMessage());
|
||||
|
||||
@@ -30,13 +30,15 @@ public class CommonInterceptor implements HandlerInterceptor {
|
||||
|
||||
private boolean validJWT(HttpServletRequest request) {
|
||||
|
||||
String token = request.getHeader("TOKEN");
|
||||
|
||||
String email = "";
|
||||
try {
|
||||
String token = request.getHeader("TOKEN");
|
||||
email = JWTUtils.getIssuer(token);
|
||||
} catch (JWTVerificationException e) {
|
||||
return false;
|
||||
} catch (Exception e) {
|
||||
log.info(e.getMessage());
|
||||
return false;
|
||||
}
|
||||
request.setAttribute("email", email);
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@ public class WebMvcConfiguration implements WebMvcConfigurer {
|
||||
@Override
|
||||
public void addInterceptors(InterceptorRegistry registry) {
|
||||
registry.addInterceptor(new CommonInterceptor())
|
||||
.addPathPatterns("/api/*")
|
||||
.addPathPatterns("/api/**")
|
||||
.excludePathPatterns("/api/public/*");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
|
||||
insert into user(email, password, phone, reg_date, user_name, status, lock_yn)
|
||||
values
|
||||
('test11@naver.com', '$2a$10$2ElPbt2mwiAc9IYH3rgJz.YZInXlUd363utdyU0TWfne6Y3vKh8h6', '010-1234-1234', '2021-02-20 00:50:11.000000', 'kim', 'USING', 0),
|
||||
('haerong22@gmail.com', '$2a$10$2ElPbt2mwiAc9IYH3rgJz.YZInXlUd363utdyU0TWfne6Y3vKh8h6', '010-1234-1234', '2021-02-20 00:50:11.000000', 'kim', 'USING', 0),
|
||||
('test22@gmail.com', '$2a$10$2ElPbt2mwiAc9IYH3rgJz.YZInXlUd363utdyU0TWfne6Y3vKh8h6', '010-4321-1111', '2021-02-25 12:33:16.000000', 'lee', 'USING', 0),
|
||||
('test33@naver.com', '$2a$10$2ElPbt2mwiAc9IYH3rgJz.YZInXlUd363utdyU0TWfne6Y3vKh8h6', '010-5555-3333', now(), 'hong', 'USING', 0),
|
||||
('test44@gmail.com', '$2a$10$2ElPbt2mwiAc9IYH3rgJz.YZInXlUd363utdyU0TWfne6Y3vKh8h6', '010-4343-2546', now(), 'park', 'STOP', 0);
|
||||
@@ -37,8 +37,9 @@ values
|
||||
insert into board_type (board_name, reg_date, using_yn)
|
||||
values
|
||||
('게시판1', now(), 1),
|
||||
('게시판2', now(), 0),
|
||||
('게시판3', now(), 1);
|
||||
('게시판2', now(), 1),
|
||||
('게시판3', now(), 0),
|
||||
('문의게시판', now(), 1);
|
||||
|
||||
insert into board (board_type_id, user_id, title, content, reg_date, top_yn)
|
||||
values
|
||||
@@ -48,7 +49,8 @@ values
|
||||
(2, 1, '게시글4', '게시글 내용4', now(), 0),
|
||||
(2, 2, '게시글5', '게시글 내용5', now(), 0),
|
||||
(3, 1, '게시글6', '게시글 내용6', now(), 0),
|
||||
(3, 3, '게시글7', '게시글 내용7', now(), 0);
|
||||
(3, 3, '게시글7', '게시글 내용7', now(), 0),
|
||||
(4, 1, '문의제목1', '문의 내용1', now(), 0);
|
||||
|
||||
insert into board_comment (comments, reg_date, board_id, user_id)
|
||||
values
|
||||
@@ -59,11 +61,17 @@ values
|
||||
|
||||
INSERT INTO MAIL_TEMPLATE(TEMPLATE_ID, TITLE, CONTENTS, SEND_EMAIL, SEND_USER_NAME, REG_DATE)
|
||||
VALUES
|
||||
('USER_RESET_PASSWORD',
|
||||
'{USER_NAME}님의 비밀번호 초기화 요청입니다.',
|
||||
'<div><p>{USER_NAME}님 안녕하세요.</p><p>아래 링크를 클릭하여, 비밀번호를 초기화해 주세요.</p><p><a href="{SERVER_URL}/reset?key={RESET_PASSWORD_KEY}">초기화</a></p></div>',
|
||||
'test.email.12588@gmail.com', '관리자', now()),
|
||||
('BOARD_ADD',
|
||||
'{USER_NAME}님이 글을 게시하였습니다.',
|
||||
'<div><p>제목: {BOARD_TITLE}</p><p>내용</p><div>{BOARD_CONTENTS}</div></div>',
|
||||
'test.email.12588@gmail.com', '관리자', now());
|
||||
('USER_RESET_PASSWORD',
|
||||
'{USER_NAME}님의 비밀번호 초기화 요청입니다.',
|
||||
'<div><p>{USER_NAME}님 안녕하세요.</p><p>아래 링크를 클릭하여, 비밀번호를 초기화해 주세요.</p><p><a href="{SERVER_URL}/reset?key={RESET_PASSWORD_KEY}">초기화</a></p></div>',
|
||||
'test.email.12588@gmail.com', '관리자', now()),
|
||||
('BOARD_ADD',
|
||||
'{USER_NAME}님이 글을 게시하였습니다.',
|
||||
'<div><p>제목: {BOARD_TITLE}</p><p>내용</p><div>{BOARD_CONTENTS}</div></div>',
|
||||
'test.email.12588@gmail.com', '관리자', now()),
|
||||
('BOARD_REPLY',
|
||||
'{USER_NAME}님이 글에 답변이 작성되었습니다.',
|
||||
'<div><p>제목: {BOARD_TITLE}</p><p>내용</p><div>{BOARD_CONTENTS}</div><p>답변</p><div>{BOARD_REPLY_CONTENTS}</div></div>',
|
||||
'test.email.12588@gmail.com', '관리자', now());
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>{USER_NAME}님이 글에 답변이 작성되었습니다.</title>
|
||||
</head>
|
||||
<body>
|
||||
<div>
|
||||
<p>제목: {BOARD_TITLE}</p>
|
||||
<p>내용</p>
|
||||
<div>
|
||||
{BOARD_CONTENTS}
|
||||
</div>
|
||||
<p>답변</p>
|
||||
<div>
|
||||
{BOARD_REPLY_CONTENTS}
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user