@@ -25,19 +25,35 @@
data() {
return {
title: '',
- content: ''
+ content: '',
+ isEdit: false
}
},
async beforeCreate() {
try {
authentication.bind(this)();
- } catch (e) {
+ } catch (err) {
alert('토큰이 존재하지 않거나 유효하지 않은 토큰입니다.');
await this.$router.replace('/');
+ return;
+ }
+
+ const id = this.$route.query.id;
+
+ if (id) {
+ try {
+ const result = await articleApi.getArticle.bind(this)(id);
+ const {title, content} = result.data;
+ this.title = title;
+ this.content = content;
+ this.isEdit = true;
+ } catch (err) {
+ console.log(err);
+ }
}
},
methods: {
- submit: async function(evt) {
+ create: async function(evt) {
evt.preventDefault();
const {title, content} = this;
@@ -55,6 +71,25 @@
console.log(err);
}
+ },
+ async update(evt) {
+ evt.preventDefault();
+
+ const id = this.$route.query.id;
+
+ const {title, content} = this;
+ const data = {
+ title,
+ content
+ };
+
+ try {
+ await articleApi.updateArticle.bind(this)(id, data);
+ await this.$router.push('/articles');
+ } catch (err) {
+ alert('문제가 발생하였습니다.');
+ console.log(err);
+ }
}
}
}
diff --git a/src/front/src/routes/index.js b/src/front/src/routes/index.js
index a94e0a5..3fe1591 100644
--- a/src/front/src/routes/index.js
+++ b/src/front/src/routes/index.js
@@ -31,6 +31,7 @@ export const router = new VueRouter({
},
{
path: '/articles/write',
+ name: 'WriteArticle',
component: WriteArticle
},
{
diff --git a/src/main/java/com/example/vue/domain/article/Article.java b/src/main/java/com/example/vue/domain/article/Article.java
index 26957d2..5c2de48 100644
--- a/src/main/java/com/example/vue/domain/article/Article.java
+++ b/src/main/java/com/example/vue/domain/article/Article.java
@@ -39,6 +39,13 @@ public class Article {
this.user = user;
}
+ public Article(Long id, ArticleRequestDto articleRequestDto, User user) {
+ this.id = id;
+ this.title = articleRequestDto.getTitle();
+ this.content = articleRequestDto.getContent();
+ this.user = user;
+ }
+
@PrePersist
private void prePersist() {
this.createdAt = LocalDateTime.now();
@@ -49,6 +56,12 @@ public class Article {
this.updatedAt = LocalDateTime.now();
}
+ public void update(ArticleRequestDto articleRequestDto) {
+ this.title = articleRequestDto.getTitle();
+ this.content = articleRequestDto.getContent();
+ this.updatedAt = LocalDateTime.now();
+ }
+
public boolean compareUser(User user) {
return compareUser(user.getId());
}
@@ -56,4 +69,8 @@ public class Article {
public boolean compareUser(Long id) {
return this.user.getId().equals(id);
}
+
+ public boolean doesUserHasThis(User user) {
+ return this.compareUser(user);
+ }
}
diff --git a/src/main/java/com/example/vue/domain/article/ArticleController.java b/src/main/java/com/example/vue/domain/article/ArticleController.java
index 33f7a51..c911017 100644
--- a/src/main/java/com/example/vue/domain/article/ArticleController.java
+++ b/src/main/java/com/example/vue/domain/article/ArticleController.java
@@ -31,6 +31,16 @@ public class ArticleController {
return articleService.findById(articleId, user);
}
+ @ResponseStatus(HttpStatus.OK)
+ @PutMapping(value = "/{articleId}")
+ @Transactional
+ public ArticleResponseDto updateArticle(@PathVariable Long articleId,
+ @RequestBody @Valid ArticleRequestDto articleRequestDto,
+ @AuthenticationPrincipal User user) {
+
+ return articleService.update(articleId, articleRequestDto, user);
+ }
+
@ResponseStatus(HttpStatus.CREATED)
@PostMapping
@Transactional
diff --git a/src/main/java/com/example/vue/domain/article/ArticleService.java b/src/main/java/com/example/vue/domain/article/ArticleService.java
index 7e84723..79a71fa 100644
--- a/src/main/java/com/example/vue/domain/article/ArticleService.java
+++ b/src/main/java/com/example/vue/domain/article/ArticleService.java
@@ -21,6 +21,17 @@ public class ArticleService {
return new ArticleResponseDto(article, user);
}
+ public ArticleResponseDto update(Long articleId, ArticleRequestDto articleRequestDto, User user) {
+ Article article = articleRepository.findById(articleId).orElseThrow(ArticleException.passNoExistException(articleId));
+ if (!article.doesUserHasThis(user)) {
+ throw new ArticleException.AccessNotOwned(articleId);
+ }
+
+ article.update(articleRequestDto);
+
+ return new ArticleResponseDto(articleRepository.save(article), user);
+ }
+
public List
findAll(Pageable pageable, User user) {
return articleRepository.findAll(pageable)
.stream()
@@ -36,4 +47,11 @@ public class ArticleService {
public void delete(Long id, User user) {
articleRepository.deleteById(id, user);
}
+
+ private void doesUserHasThisArticle(Long articleId, User user) {
+ Article article = articleRepository.findById(articleId).orElseThrow(ArticleException.passNoExistException(articleId));
+ if (!article.compareUser(user)) {
+ throw new ArticleException.AccessNotOwned(articleId);
+ }
+ }
}