Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added .DS_Store
Binary file not shown.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -35,3 +35,5 @@ out/

### VS Code ###
.vscode/

.env
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
# backend-study-sns
강지원
25 changes: 24 additions & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,34 @@ repositories {
}

dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-web'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
implementation 'com.mysql:mysql-connector-j:9.0.0'
implementation 'me.paulschwarz:spring-dotenv:4.0.0'

testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'

// lombok
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testCompileOnly 'org.projectlombok:lombok'
testAnnotationProcessor 'org.projectlombok:lombok'

// test
testImplementation 'org.springframework.boot:spring-boot-starter-test'

}
test{
useJUnitPlatform()
}

configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
tasks.named('test') {
useJUnitPlatform()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.example.devSns.controller;

import com.example.devSns.dto.CommentResponse;
import com.example.devSns.dto.CommentUpdateRequest;
import com.example.devSns.entity.Comment;
import com.example.devSns.service.CommentService;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/comments")
public class CommentActionController {
private final CommentService commentService;

public CommentActionController(CommentService commentService){
this.commentService = commentService;
}
@DeleteMapping("/{commentId}")
public void deleteComment(@PathVariable Long commentId) {
commentService.deleteComment(commentId);
}

@PatchMapping("/{commentId}")
public ResponseEntity<CommentResponse> updateComment(
@PathVariable Long commentId,
@RequestBody CommentUpdateRequest request
) {
Comment updated = commentService.updateComment(commentId, request.getContent());
return ResponseEntity.ok(new CommentResponse(updated));
}
}
36 changes: 36 additions & 0 deletions src/main/java/com/example/devSns/controller/CommentController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package com.example.devSns.controller;

import com.example.devSns.dto.CommentCreateRequest;
import com.example.devSns.dto.CommentResponse;
import com.example.devSns.dto.CommentUpdateRequest;
import com.example.devSns.entity.Comment;
import com.example.devSns.service.CommentService;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;

@RestController
@RequestMapping("/posts/{postId}/comments")
public class CommentController {
private final CommentService commentService;

public CommentController(CommentService commentService) {
this.commentService = commentService;
}

@GetMapping
public List<CommentResponse> getComments(@PathVariable Long postId) {
return commentService.getCommentByPost(postId).stream()
.map(CommentResponse::new)
.toList();
}

@PostMapping
public CommentResponse createComment(@PathVariable Long postId, @RequestBody CommentCreateRequest request) {
Comment created = commentService.addComment(postId, request);
return new CommentResponse(created);
}


}
29 changes: 29 additions & 0 deletions src/main/java/com/example/devSns/controller/LikeController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.example.devSns.controller;

import com.example.devSns.dto.LikeResponse;
import com.example.devSns.dto.LikeToggleRequest;
import com.example.devSns.service.LikeService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

@RestController
@RequiredArgsConstructor
@RequestMapping("/likes")
public class LikeController {
private final LikeService likeService;

@PostMapping("/toggle")
public ResponseEntity<LikeResponse> toggleLike(@RequestBody LikeToggleRequest request){
likeService.toggleLike(request.getMemberId(), request.getPostId());
long count = likeService.getLikeCount(request.getPostId());
return ResponseEntity.ok(new LikeResponse(request.getPostId(),count,true));
}

@GetMapping("/count/{postId}")
public ResponseEntity<Long> getLikeCount(@PathVariable Long postId){
long count = likeService.getLikeCount(postId);
return ResponseEntity.ok(count);
}

}
52 changes: 52 additions & 0 deletions src/main/java/com/example/devSns/controller/MemberController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package com.example.devSns.controller;

import com.example.devSns.dto.CommentResponse;
import com.example.devSns.dto.MemberJoinRequest;
import com.example.devSns.dto.MemberResponse;
import com.example.devSns.dto.PostResponse;
import com.example.devSns.entity.Member;
import com.example.devSns.service.MemberService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequiredArgsConstructor
@RequestMapping("/members")
public class MemberController {
private final MemberService memberService;

@GetMapping("/{id}")
public MemberResponse getMember(@PathVariable Long id) {
Member member = memberService.findMemberById(id);
return new MemberResponse(member);
}

@GetMapping("/search")
public List<MemberResponse> search(@RequestParam String keyword) {
return memberService.searchMembers(keyword).stream().map(MemberResponse::new).toList();
}

@GetMapping("/{id}/posts")
public List<PostResponse> getMemberPosts(@PathVariable Long id) {
return memberService.getPostsByMember(id);
}

@GetMapping("/{id}/comments")
public List<CommentResponse> getMemberComments(@PathVariable Long id) {
return memberService.getCommentsByMember(id);
}

@GetMapping("/{id}/likes")
public List<PostResponse> getMemberLikes(@PathVariable Long id) {
return memberService.getLikedPosts(id);
}

@PostMapping
public MemberResponse createMember(@RequestBody MemberJoinRequest request){
Member member = memberService.join(request.toEntity());
return new MemberResponse(member);
}

}
52 changes: 52 additions & 0 deletions src/main/java/com/example/devSns/controller/PostController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package com.example.devSns.controller;

import com.example.devSns.dto.PostCreateRequest;
import com.example.devSns.dto.PostResponse;
import com.example.devSns.dto.PostUpdateRequest;
import com.example.devSns.entity.Post;
import com.example.devSns.service.PostService;
import jakarta.persistence.PostUpdate;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;

@RestController
@RequestMapping("/post")
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

posts로 복수형으로 변경해서 통일시키는게 나을 거 같습니다!

public class PostController {
private final PostService postService;

public PostController(PostService postService) {
this.postService = postService;
}

@GetMapping
public List<PostResponse> getAllPosts(){
return postService.findAll().stream().map(PostResponse::new).toList();
}

@GetMapping("/{id}")
public ResponseEntity<PostResponse> getPostById(@PathVariable Long id){
Post post = postService.findById(id);
return ResponseEntity.ok(new PostResponse(post));
}

@PostMapping
public PostResponse createPost(@RequestBody PostCreateRequest request){
Post created = postService.createPost(request);
return new PostResponse(created);
}

@PatchMapping("/{id}")
public PostResponse updatePost(@PathVariable Long id, @RequestBody PostUpdateRequest request){
Post updated = postService.updatePost(id, request);
return new PostResponse(updated);
}

@DeleteMapping("/{id}")
public void deletePost(@PathVariable Long id){
postService.delete(id);
}
}
12 changes: 12 additions & 0 deletions src/main/java/com/example/devSns/dto/CommentCreateRequest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.example.devSns.dto;

import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@NoArgsConstructor
public class CommentCreateRequest {
private String content;
private String username;
private Long memberId;
Comment on lines +9 to +11
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

DTO 내에 Validation을 적용해보는 것도 좋을 거 같습니다 음수나 빈 제목 등을 사전에 검증해 입력되는 걸 방지할 수 있습니다..!

}
21 changes: 21 additions & 0 deletions src/main/java/com/example/devSns/dto/CommentResponse.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.example.devSns.dto;

import com.example.devSns.entity.Comment;

import java.time.LocalDateTime;

public record CommentResponse(
Long id,
String content,
String username,
LocalDateTime createdAt
){
public CommentResponse(Comment comment){
this(
comment.getId(),
comment.getContent(),
comment.getUsername(),
comment.getCreatedAt()
);
}
}
10 changes: 10 additions & 0 deletions src/main/java/com/example/devSns/dto/CommentUpdateRequest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.example.devSns.dto;

import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@NoArgsConstructor
public class CommentUpdateRequest {
private String content;
}
12 changes: 12 additions & 0 deletions src/main/java/com/example/devSns/dto/LikeResponse.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.example.devSns.dto;

import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public class LikeResponse {
private Long PostId;
private long likeCount;
private boolean liked;
}
11 changes: 11 additions & 0 deletions src/main/java/com/example/devSns/dto/LikeToggleRequest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.example.devSns.dto;

import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@NoArgsConstructor
public class LikeToggleRequest {
private Long memberId;
private Long postId;
}
17 changes: 17 additions & 0 deletions src/main/java/com/example/devSns/dto/MemberJoinRequest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.example.devSns.dto;

import com.example.devSns.entity.Member;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@NoArgsConstructor
public class MemberJoinRequest {
private String username;
private String email;
private String password;

public Member toEntity(){
return Member.create(username, email, password);
}
}
17 changes: 17 additions & 0 deletions src/main/java/com/example/devSns/dto/MemberResponse.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.example.devSns.dto;

import com.example.devSns.entity.Member;
import lombok.Getter;

@Getter
public class MemberResponse {
private Long id;
private String username;
private String email;

public MemberResponse(Member member){
this.id = member.getId();
this.username = member.getUsername();
this.email = member.getEmail();
}
}
11 changes: 11 additions & 0 deletions src/main/java/com/example/devSns/dto/PostCreateRequest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.example.devSns.dto;

import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@NoArgsConstructor
public class PostCreateRequest {
private String content;
private Long memberId;
}
Loading