diff --git a/.gitignore b/.gitignore index d21dc654..c75e42ac 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ build/ !**/src/test/**/build/ .gitignore db/be-java-cafe.mv.db +db/be-java-cafe.trace.db ### STS ### .apt_generated diff --git a/src/main/.DS_Store b/src/main/.DS_Store deleted file mode 100644 index 90d39627..00000000 Binary files a/src/main/.DS_Store and /dev/null differ diff --git a/src/main/java/kr/codesqaud/cafe/config/CafeConfig.java b/src/main/java/kr/codesqaud/cafe/config/CafeConfig.java index d104201b..8a7e5afc 100644 --- a/src/main/java/kr/codesqaud/cafe/config/CafeConfig.java +++ b/src/main/java/kr/codesqaud/cafe/config/CafeConfig.java @@ -36,7 +36,6 @@ public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/user/login").setViewName("user/login"); registry.addViewController("/user/form").setViewName("user/form"); registry.addViewController("/qna/show").setViewName("qna/show"); - registry.addViewController("/qna/article").setViewName("qna/form"); registry.addViewController("/login_fail").setViewName("user/login_fail"); } } diff --git a/src/main/java/kr/codesqaud/cafe/controller/ArticleController.java b/src/main/java/kr/codesqaud/cafe/controller/ArticleController.java index a5a481f8..5a928c2b 100644 --- a/src/main/java/kr/codesqaud/cafe/controller/ArticleController.java +++ b/src/main/java/kr/codesqaud/cafe/controller/ArticleController.java @@ -1,11 +1,15 @@ package kr.codesqaud.cafe.controller; import kr.codesqaud.cafe.domain.Article; +import kr.codesqaud.cafe.domain.Member; import kr.codesqaud.cafe.service.ArticleService; +import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; +import javax.servlet.http.HttpSession; + @Controller public class ArticleController { @@ -16,12 +20,30 @@ public ArticleController(ArticleService articleService) { this.articleService = articleService; } + @GetMapping("/qna/article") + public String askQuestion(HttpSession httpSession) { + Member member = (Member) httpSession.getAttribute("sessionedUser"); + if (member == null) { + return "redirect:/user/login"; + } + return "qna/form"; + } + @PostMapping("/qna/ask") - public String registerArticle(Article article) { + public String registerArticle(Article article, HttpSession httpSession) { + Member loginMember = (Member) httpSession.getAttribute("sessionedUser"); + article.setWriter(loginMember.getNickName()); articleService.writeArticle(article); return "redirect:/"; } + @PostMapping("/qna/{articleId}/update") + public String updateArticle(@PathVariable long articleId, Article article) { + article.setArticleId(articleId); + articleService.updateArticle(article); + return "redirect:/"; + } + @GetMapping("/") public String printArticleList(Model model) { model.addAttribute("article", articleService.findArticles()); @@ -30,9 +52,34 @@ public String printArticleList(Model model) { } @GetMapping("/qna/{articleId}") - public String printDetailArticle(@PathVariable int articleId, Model model) { + public String printDetailArticle(@PathVariable int articleId, HttpSession httpSession, Model model) { + if (httpSession.getAttribute("sessionedUser") == null) { + return "redirect:/user/login"; + }; Article article = articleService.findOneArticleById(articleId).get(); model.addAttribute("article", article); return "qna/show"; } + + @GetMapping("/article/{articleId}/edite") + public String editeArticle(@PathVariable long articleId, HttpSession httpSession, Model model) { + Article writedArticle = articleService.findOneArticleById(articleId).orElseThrow(() -> new EmptyResultDataAccessException(1)); + Member loginMember = (Member) httpSession.getAttribute("sessionedUser"); + if (loginMember.getNickName().equals(writedArticle.getWriter())) { + model.addAttribute("article", writedArticle); + return "qna/updateForm"; + } + return "qna/edite_fail"; + } + + @DeleteMapping("/article/{articleId}/delete") + public String deleteArticle(@PathVariable long articleId, HttpSession httpSession) { + Article writedArticle = articleService.findOneArticleById(articleId).orElseThrow(() -> new EmptyResultDataAccessException(1)); + Member loginMember = (Member) httpSession.getAttribute("sessionedUser"); + if (loginMember.getNickName().equals(writedArticle.getWriter())) { + articleService.deleteArticle(articleId); + return "redirect:/"; + } + return "qna/delete_fail"; + } } diff --git a/src/main/java/kr/codesqaud/cafe/controller/LoginController.java b/src/main/java/kr/codesqaud/cafe/controller/LoginController.java index 0b15abb5..cd473506 100644 --- a/src/main/java/kr/codesqaud/cafe/controller/LoginController.java +++ b/src/main/java/kr/codesqaud/cafe/controller/LoginController.java @@ -3,6 +3,7 @@ import kr.codesqaud.cafe.domain.Member; import kr.codesqaud.cafe.service.MemberService; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PostMapping; @@ -19,7 +20,7 @@ public LoginController(MemberService memberService) { @PostMapping("/login") public String login(Member member, HttpSession httpSession) { - Member loginMember = memberService.findOneMemberByEmail(member.getEmail()).orElse(null); + Member loginMember = memberService.findOneMemberByEmail(member.getEmail()).orElseThrow(() -> new EmptyResultDataAccessException(1)); if (loginMember != null && memberService.checkMember(loginMember, member)) { httpSession.setAttribute("sessionedUser", loginMember); return "redirect:/"; diff --git a/src/main/java/kr/codesqaud/cafe/controller/UserController.java b/src/main/java/kr/codesqaud/cafe/controller/UserController.java index 447aaaba..9c7ec70d 100644 --- a/src/main/java/kr/codesqaud/cafe/controller/UserController.java +++ b/src/main/java/kr/codesqaud/cafe/controller/UserController.java @@ -5,6 +5,7 @@ import kr.codesqaud.cafe.service.MemberService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; @@ -36,7 +37,7 @@ public String showList(Model model) { @GetMapping("/profile/{nickName}") public String showProfile(@PathVariable String nickName, Model model) { model.addAttribute("nickName", nickName); - String email = memberService.findOneMemberByNickname(nickName).orElse(null).getEmail(); + String email = memberService.findOneMemberByNickname(nickName).orElseThrow(() -> new EmptyResultDataAccessException(1)).getEmail(); model.addAttribute("email", email); return "user/profile"; } diff --git a/src/main/java/kr/codesqaud/cafe/domain/Article.java b/src/main/java/kr/codesqaud/cafe/domain/Article.java index cf1984ad..be6c0a54 100644 --- a/src/main/java/kr/codesqaud/cafe/domain/Article.java +++ b/src/main/java/kr/codesqaud/cafe/domain/Article.java @@ -33,7 +33,7 @@ public void setWriter(String author) { this.writer = author; } - public void setArticleId(int id) { + public void setArticleId(long id) { articleId = id; } @@ -81,4 +81,4 @@ public String toString() { ", formattedRegistrationDate='" + formattedRegistrationDate + '\'' + '}'; } -} \ No newline at end of file +} diff --git a/src/main/java/kr/codesqaud/cafe/domain/Member.java b/src/main/java/kr/codesqaud/cafe/domain/Member.java index a9db62e3..513be843 100644 --- a/src/main/java/kr/codesqaud/cafe/domain/Member.java +++ b/src/main/java/kr/codesqaud/cafe/domain/Member.java @@ -7,7 +7,7 @@ public class Member { - private long id; + private long userId; private String email; private String nickName; private String password; @@ -26,7 +26,7 @@ public Member(String email, String nickName, String password) { } public long getId() { - return id; + return userId; } public String getEmail() { @@ -64,5 +64,8 @@ public void setSignUpDate(LocalDateTime signUpDate) { public String getFormattedSignUpDate() { return formattedSignUpDate; } -} + public void setUserId(long userId) { + this.userId = userId; + } +} diff --git a/src/main/java/kr/codesqaud/cafe/repository/ArticleRepository.java b/src/main/java/kr/codesqaud/cafe/repository/ArticleRepository.java index 4b8588f3..85e57c61 100644 --- a/src/main/java/kr/codesqaud/cafe/repository/ArticleRepository.java +++ b/src/main/java/kr/codesqaud/cafe/repository/ArticleRepository.java @@ -8,8 +8,9 @@ public interface ArticleRepository { void saveArticle(Article article); - Optional
findOneArticleById(int id); + Optional
findOneArticleById(long id); List
getArticles(); - void deleteArticle(Member member); + void deleteArticle(long articleId); int getSize(); + void updateArticle(Article article); } diff --git a/src/main/java/kr/codesqaud/cafe/repository/JdbcTemplateArticleRepository.java b/src/main/java/kr/codesqaud/cafe/repository/JdbcTemplateArticleRepository.java index 20b09b0b..fc8243db 100644 --- a/src/main/java/kr/codesqaud/cafe/repository/JdbcTemplateArticleRepository.java +++ b/src/main/java/kr/codesqaud/cafe/repository/JdbcTemplateArticleRepository.java @@ -1,7 +1,6 @@ package kr.codesqaud.cafe.repository; import kr.codesqaud.cafe.domain.Article; -import kr.codesqaud.cafe.domain.Member; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; @@ -36,8 +35,7 @@ public void saveArticle(Article article) { } @Override - public Optional
findOneArticleById(int id) { - System.out.println(id); + public Optional
findOneArticleById(long id) { return Optional.ofNullable(jdbcTemplate.queryForObject("select * from article where articleId = ?", articleRowMapper(), id)); } @@ -47,8 +45,9 @@ public List
getArticles() { } @Override - public void deleteArticle(Member member) { - + public void deleteArticle(long articleId) { + String sql = "delete from article where articleId = ?"; + jdbcTemplate.update(sql, articleId); } @Override @@ -56,6 +55,12 @@ public int getSize() { return jdbcTemplate.queryForObject("select count(*) from article", Integer.class); } + @Override + public void updateArticle(Article article) { + String sql = "update article set title = ?, contents = ? where articleId = ?"; + jdbcTemplate.update(sql, article.getTitle(), article.getContents(), article.getId()); + } + private RowMapper
articleRowMapper() { return (rs, rowNum) -> { Article article = new Article(); diff --git a/src/main/java/kr/codesqaud/cafe/repository/JdbcTemplateMemberRepository.java b/src/main/java/kr/codesqaud/cafe/repository/JdbcTemplateMemberRepository.java index fc531b28..0312cbf9 100644 --- a/src/main/java/kr/codesqaud/cafe/repository/JdbcTemplateMemberRepository.java +++ b/src/main/java/kr/codesqaud/cafe/repository/JdbcTemplateMemberRepository.java @@ -23,7 +23,7 @@ public JdbcTemplateMemberRepository(DataSource datasource) { } @Override - public Member saveMember(Member member) { + public void saveMember(Member member) { SimpleJdbcInsert jdbcInsert = new SimpleJdbcInsert(jdbcTemplate); jdbcInsert.withTableName("member").usingGeneratedKeyColumns("id"); @@ -34,7 +34,6 @@ public Member saveMember(Member member) { parameters.put("signUpDate", Timestamp.valueOf(member.getSignUpDate().format(DateTimeFormatter.ofPattern("yyy-MM-dd")) + " 00:00:00")); jdbcInsert.execute(new MapSqlParameterSource(parameters)); - return member; } @Override @@ -61,7 +60,6 @@ public int getSize() { @Override public void editeMember(Member member) { jdbcTemplate.update("UPDATE member SET nickName = ? WHERE email = ?", member.getNickName(), member.getEmail()); - } private RowMapper memberRowMapper() { diff --git a/src/main/java/kr/codesqaud/cafe/repository/MemberRepository.java b/src/main/java/kr/codesqaud/cafe/repository/MemberRepository.java index 12162aeb..07795f08 100644 --- a/src/main/java/kr/codesqaud/cafe/repository/MemberRepository.java +++ b/src/main/java/kr/codesqaud/cafe/repository/MemberRepository.java @@ -6,7 +6,7 @@ import java.util.Optional; public interface MemberRepository { - Member saveMember(Member member); + void saveMember(Member member); Optional findOneMemberbyEmail(String email); diff --git a/src/main/java/kr/codesqaud/cafe/repository/MemoryArticleRepository.java b/src/main/java/kr/codesqaud/cafe/repository/MemoryArticleRepository.java index b3e3c912..4dac58bf 100644 --- a/src/main/java/kr/codesqaud/cafe/repository/MemoryArticleRepository.java +++ b/src/main/java/kr/codesqaud/cafe/repository/MemoryArticleRepository.java @@ -22,7 +22,7 @@ public void saveArticle(Article article) { } @Override - public Optional
findOneArticleById(int id) { + public Optional
findOneArticleById(long id) { return articlesRepository.stream() .filter(article -> article.getId() == id) .findAny(); @@ -39,7 +39,12 @@ public int getSize() { } @Override - public void deleteArticle(Member member) { + public void updateArticle(Article article) { + + } + + @Override + public void deleteArticle(long articleId) { } diff --git a/src/main/java/kr/codesqaud/cafe/repository/MemoryMemberRepository.java b/src/main/java/kr/codesqaud/cafe/repository/MemoryMemberRepository.java index 083d5564..463f36dd 100644 --- a/src/main/java/kr/codesqaud/cafe/repository/MemoryMemberRepository.java +++ b/src/main/java/kr/codesqaud/cafe/repository/MemoryMemberRepository.java @@ -13,9 +13,8 @@ public MemoryMemberRepository() { } @Override - public Member saveMember(Member member) { + public void saveMember(Member member) { repository.put(member.getEmail(), member); - return member; } @Override diff --git a/src/main/java/kr/codesqaud/cafe/service/ArticleService.java b/src/main/java/kr/codesqaud/cafe/service/ArticleService.java index 618760ae..4f6c88b7 100644 --- a/src/main/java/kr/codesqaud/cafe/service/ArticleService.java +++ b/src/main/java/kr/codesqaud/cafe/service/ArticleService.java @@ -19,7 +19,7 @@ public void writeArticle(Article article) { articleRepository.saveArticle(article); } - public Optional
findOneArticleById(int id) { + public Optional
findOneArticleById(long id) { return articleRepository.findOneArticleById(id); } @@ -30,4 +30,12 @@ public List
findArticles() { public int getTotalNumberOfArticles() { return articleRepository.getSize(); } + + public void updateArticle(Article article) { + articleRepository.updateArticle(article); + } + + public void deleteArticle(long articleId) { + articleRepository.deleteArticle(articleId); + } } diff --git a/src/main/resources/templates/data.sql b/src/main/resources/templates/data.sql index 1eaf93f5..544e85db 100644 --- a/src/main/resources/templates/data.sql +++ b/src/main/resources/templates/data.sql @@ -5,4 +5,7 @@ insert into member (email, nickname, password) values ('kim@naver.com', 'kim', '123'); insert into article (writer, title, contents) -values ('manju', 'hi', 'hello'); +values ('manju', '가입인사 드립니다.', '등업해주세요!'); + +insert into article (writer, title, contents) +values ('core', '자바 질문', '스트림에 대해서 질문합니다.'); diff --git a/src/main/resources/templates/qna/delete_fail.html b/src/main/resources/templates/qna/delete_fail.html new file mode 100644 index 00000000..314e0b56 --- /dev/null +++ b/src/main/resources/templates/qna/delete_fail.html @@ -0,0 +1,13 @@ +{{>user/header}} + + + +
+
+

다른 사람의 글을 삭제할 수 없습니다!

+
+ 홈으로 +
+ + + diff --git a/src/main/resources/templates/qna/edite_fail.html b/src/main/resources/templates/qna/edite_fail.html new file mode 100644 index 00000000..54c9cc79 --- /dev/null +++ b/src/main/resources/templates/qna/edite_fail.html @@ -0,0 +1,13 @@ +{{>user/header}} + + + +
+
+

다른 사람의 글을 수정할 수 없습니다!

+
+ 홈으로 +
+ + + diff --git a/src/main/resources/templates/qna/form.html b/src/main/resources/templates/qna/form.html index 92df1af8..2e50eb48 100644 --- a/src/main/resources/templates/qna/form.html +++ b/src/main/resources/templates/qna/form.html @@ -77,10 +77,6 @@
-
- - -
diff --git a/src/main/resources/templates/qna/show.html b/src/main/resources/templates/qna/show.html index 5eb5b6aa..7df98569 100644 --- a/src/main/resources/templates/qna/show.html +++ b/src/main/resources/templates/qna/show.html @@ -100,10 +100,10 @@

{{title}}

  • - 수정 + 수정
  • - +
  • diff --git a/src/main/resources/templates/qna/updateForm.html b/src/main/resources/templates/qna/updateForm.html new file mode 100644 index 00000000..4a303b8d --- /dev/null +++ b/src/main/resources/templates/qna/updateForm.html @@ -0,0 +1,102 @@ + + + + + + SLiPP Java Web Programming + + + + + + + + + +
    +
    +
    + {{#article}} +
    +
    + + +
    +
    + + +
    + +
    + + {{/article}} +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/src/main/resources/templates/schema.sql b/src/main/resources/templates/schema.sql index d32ff0ce..3ce88f5e 100644 --- a/src/main/resources/templates/schema.sql +++ b/src/main/resources/templates/schema.sql @@ -14,6 +14,8 @@ create table article ( writer varchar(255), title varchar(255), contents varchar(255), - registrationDate DateTime default now() + registrationDate DateTime default now(), + userId bigint, + FOREIGN KEY (userId) references member (id) ); diff --git a/src/main/resources/templates/user/header.html b/src/main/resources/templates/user/header.html index 8446b0af..a296c4a5 100644 --- a/src/main/resources/templates/user/header.html +++ b/src/main/resources/templates/user/header.html @@ -30,7 +30,7 @@ {{/sessionedUser}} {{#sessionedUser}}