Skip to content

Commit 25326e6

Browse files
committed
[#108] Article에서 userid를 username으로 변경
Principal을 사용해서 user 검증
1 parent a9242e9 commit 25326e6

File tree

6 files changed

+81
-24
lines changed

6 files changed

+81
-24
lines changed

community-backend/app/app-monolith/src/main/java/org/kiworkshop/community/article/api/ArticleController.java

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
import org.springframework.http.ResponseEntity;
88
import org.springframework.web.bind.annotation.*;
99

10+
import java.security.Principal;
11+
1012
@RestController
1113
@RequestMapping("/article")
1214
@RequiredArgsConstructor
@@ -19,19 +21,19 @@ public ResponseEntity<ArticleResponseDto> read(@PathVariable Long id) {
1921
}
2022

2123
@PostMapping
22-
public ResponseEntity<Long> create(@RequestBody ArticleRequestDto articleRequestDto) {
23-
return ResponseEntity.ok(articleService.create(articleRequestDto));
24+
public ResponseEntity<Long> create(@RequestBody ArticleRequestDto articleRequestDto, Principal principal) {
25+
return ResponseEntity.ok(articleService.create(articleRequestDto, principal));
2426
}
2527

2628
@DeleteMapping("/{id}")
27-
public ResponseEntity<Void> delete(@PathVariable Long id) {
28-
articleService.delete(id);
29+
public ResponseEntity<Void> delete(@PathVariable Long id, Principal principal) {
30+
articleService.delete(id, principal);
2931
return ResponseEntity.ok().build();
3032
}
3133

3234
@PutMapping("/{id}")
33-
public ResponseEntity<Void> update(@PathVariable Long id, @RequestBody ArticleRequestDto articleRequestDto) {
34-
articleService.update(id, articleRequestDto);
35+
public ResponseEntity<Void> update(@PathVariable Long id, @RequestBody ArticleRequestDto articleRequestDto, Principal principal) {
36+
articleService.update(id, articleRequestDto, principal);
3537
return ResponseEntity.ok().build();
3638
}
3739
}

community-backend/app/app-monolith/src/main/java/org/kiworkshop/community/article/api/dto/ArticleRequestDto.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,19 @@
99
@NoArgsConstructor
1010
public class ArticleRequestDto {
1111
private String title;
12+
private String content;
1213

1314
@Builder
1415
public ArticleRequestDto(String title, String content) {
1516
this.title = title;
1617
this.content = content;
1718
}
1819

19-
private String content;
20-
21-
public Article toEntity() {
20+
public Article toEntity(String username) {
2221
return Article.builder()
2322
.title(title)
2423
.content(content)
24+
.username(username)
2525
.build();
2626
}
2727
}

community-backend/app/app-monolith/src/main/java/org/kiworkshop/community/article/entity/Article.java

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,39 @@
33
import lombok.Builder;
44
import lombok.Getter;
55
import org.kiworkshop.community.common.domain.BaseEntity;
6+
import org.springframework.util.Assert;
67

8+
import javax.persistence.Column;
79
import javax.persistence.Entity;
810

911
@Entity
1012
@Getter
1113
public class Article extends BaseEntity {
14+
@Column(nullable = false)
1215
private String title;
16+
@Column(nullable = false)
1317
private String content;
14-
private Long userId;
18+
@Column(nullable = false)
19+
private String username;
1520

1621
@Builder
17-
public Article(String title, String content, Long userId) {
22+
private Article(String title, String content, String username) {
23+
Assert.hasLength(title, "title must have length.");
24+
Assert.hasLength(content, "content must have length.");
25+
Assert.hasLength(username, "username must have length.");
1826
this.title = title;
1927
this.content = content;
20-
this.userId = userId;
28+
this.username = username;
2129
}
2230

2331
public void update(Article article) {
32+
// TODO: 20. 8. 31. Error Code 가 400이 되어야 할지? 403이 되어야 할지 고민
33+
Assert.isTrue(this.username.equals(article.username), "unauthorized username");
2434
this.title = article.title;
2535
this.content = article.content;
2636
}
37+
38+
public boolean isAuthor(String name) {
39+
return this.username.equals(name);
40+
}
2741
}

community-backend/app/app-monolith/src/main/java/org/kiworkshop/community/article/service/ArticleService.java

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,15 @@
88
import org.kiworkshop.community.article.exception.ArticleException;
99
import org.springframework.stereotype.Service;
1010

11+
import java.security.Principal;
12+
1113
@Service
1214
@RequiredArgsConstructor
1315
public class ArticleService {
1416
private final ArticleRepository articleRepository;
1517

16-
public Long create(ArticleRequestDto articleRequestDto) {
17-
Article article = articleRepository.save(articleRequestDto.toEntity());
18+
public Long create(ArticleRequestDto articleRequestDto, Principal principal) {
19+
Article article = articleRepository.save(articleRequestDto.toEntity(principal.getName()));
1820
return article.getId();
1921
}
2022

@@ -23,13 +25,18 @@ public ArticleResponseDto read(Long id) {
2325
return ArticleResponseDto.from(article);
2426
}
2527

26-
public void update(Long id, ArticleRequestDto articleRequestDto) {
28+
public void update(Long id, ArticleRequestDto articleRequestDto, Principal principal) {
2729
Article article = findById(id);
28-
article.update(articleRequestDto.toEntity());
30+
article.update(articleRequestDto.toEntity(principal.getName()));
2931
}
3032

31-
public void delete(Long id) {
32-
articleRepository.deleteById(id);
33+
public void delete(Long id, Principal principal) {
34+
Article article = findById(id);
35+
// TODO: 20. 8. 31. soft delete를 할지? hard delete를 할지 고민
36+
if (!article.isAuthor(principal.getName())) {
37+
throw new IllegalArgumentException("unauthorized user");
38+
}
39+
articleRepository.delete(article);
3340
}
3441

3542
private Article findById(Long id) {

community-backend/app/app-monolith/src/test/java/org/kiworkshop/community/article/entity/ArticleTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
public class ArticleTest {
88
public static Article createArticleTestFixture() {
9-
Article article = Article.builder().title("title").content("content").build();
9+
Article article = Article.builder().title("title").content("content").username("username").build();
1010
ReflectionTestUtils.setField(article, "id", 1L);
1111
ReflectionTestUtils.setField(article, "updatedAt", ZonedDateTime.now());
1212
ReflectionTestUtils.setField(article, "createdAt", ZonedDateTime.now());

community-backend/app/app-monolith/src/test/java/org/kiworkshop/community/article/service/ArticleServiceTest.java

Lines changed: 39 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import org.mockito.Mock;
1212
import org.mockito.junit.jupiter.MockitoExtension;
1313

14+
import java.security.Principal;
1415
import java.util.Optional;
1516

1617
import static org.assertj.core.api.Assertions.assertThat;
@@ -26,6 +27,8 @@ class ArticleServiceTest {
2627
private ArticleService articleService;
2728
@Mock
2829
private ArticleRepository articleRepository;
30+
@Mock
31+
private Principal principal;
2932

3033
@BeforeEach
3134
void setUp() {
@@ -38,11 +41,13 @@ void create() {
3841
ArticleRequestDto articleRequestDto = ArticleRequestDto.builder().title("title").content("content").build();
3942
Article article = createArticleTestFixture();
4043
given(articleRepository.save(any(Article.class))).willReturn(article);
44+
given(principal.getName()).willReturn("username");
4145
//when
42-
Long id = articleService.create(articleRequestDto);
46+
Long id = articleService.create(articleRequestDto, principal);
4347
//then
4448
assertThat(id).isNotNull();
4549
then(articleRepository).should().save(any(Article.class));
50+
then(principal).should().getName();
4651
}
4752

4853
@Test
@@ -64,18 +69,47 @@ void update() {
6469
ArticleRequestDto articleRequestDto = ArticleRequestDto.builder().title("title1").content("content1").build();
6570
Article article = createArticleTestFixture();
6671
given(articleRepository.findById(anyLong())).willReturn(Optional.of(article));
72+
given(principal.getName()).willReturn("username");
6773
//when
68-
articleService.update(1L, articleRequestDto);
74+
articleService.update(1L, articleRequestDto, principal);
6975
//then
7076
then(articleRepository).should().findById(anyLong());
7177
}
7278

79+
@Test
80+
void update_throw_exception() {
81+
//given
82+
ArticleRequestDto articleRequestDto = ArticleRequestDto.builder().title("title1").content("content1").build();
83+
Article article = createArticleTestFixture();
84+
given(articleRepository.findById(anyLong())).willReturn(Optional.of(article));
85+
given(principal.getName()).willReturn("username1");
86+
//when & then
87+
assertThrows(IllegalArgumentException.class, () -> articleService.update(1L, articleRequestDto, principal));
88+
then(articleRepository).should().findById(anyLong());
89+
}
90+
7391
@Test
7492
void delete() {
93+
//given
94+
Article article = createArticleTestFixture();
95+
given(articleRepository.findById(anyLong())).willReturn(Optional.of(article));
96+
given(principal.getName()).willReturn("username");
7597
//when
76-
articleService.delete(1L);
98+
articleService.delete(1L, principal);
7799
//then
78-
then(articleRepository).should().deleteById(anyLong());
100+
then(articleRepository).should().findById(anyLong());
101+
then(articleRepository).should().delete(article);
102+
}
103+
104+
@Test
105+
void delete_throw_exception() {
106+
//given
107+
Article article = createArticleTestFixture();
108+
given(articleRepository.findById(anyLong())).willReturn(Optional.of(article));
109+
given(principal.getName()).willReturn("username1");
110+
//when
111+
assertThrows(IllegalArgumentException.class, () -> articleService.delete(1L, principal));
112+
then(articleRepository).should().findById(anyLong());
79113
}
80114

81115
@Test
@@ -84,6 +118,6 @@ void findByIdThrowsException() {
84118
ArticleRequestDto articleRequestDto = ArticleRequestDto.builder().title("title1").content("content1").build();
85119
//when & then
86120
assertThrows(ArticleException.class, () -> articleService.read(1L));
87-
assertThrows(ArticleException.class, () -> articleService.update(1L, articleRequestDto));
121+
assertThrows(ArticleException.class, () -> articleService.update(1L, articleRequestDto, principal));
88122
}
89123
}

0 commit comments

Comments
 (0)