diff --git a/src/main/java/com/blog/domain/comment/Comment.java b/src/main/java/com/blog/domain/comment/Comment.java deleted file mode 100644 index 70367cc9..00000000 --- a/src/main/java/com/blog/domain/comment/Comment.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.blog.domain.comment; - -public class Comment { - -} diff --git a/src/main/java/com/blog/domain/comment/controller/CommentController.java b/src/main/java/com/blog/domain/comment/controller/CommentController.java new file mode 100644 index 00000000..b3cdd8f6 --- /dev/null +++ b/src/main/java/com/blog/domain/comment/controller/CommentController.java @@ -0,0 +1,56 @@ +package com.blog.domain.comment.controller; + +import com.blog.domain.comment.dto.CommentRequest; +import com.blog.domain.comment.dto.CommentResponse; +import com.blog.domain.comment.service.CommentService; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +@RestController +@RequestMapping("/comments") +public class CommentController { + private final CommentService commentService; + + public CommentController(CommentService commentService) { + this.commentService = commentService; + } + + @PostMapping + public ResponseEntity> createComment(@RequestBody CommentRequest request) { + commentService.createComment(request); + Map response = new HashMap<>(); + response.put("message", "댓글 생성 성공"); + return ResponseEntity.ok(response); + } + + @GetMapping("/{id}") + public ResponseEntity getComment(@PathVariable UUID id) { + return ResponseEntity.ok(commentService.getComment(id)); + } + + @GetMapping("/post/{postId}") + public ResponseEntity> getCommentsByPostId(@PathVariable UUID postId) { + return ResponseEntity.ok(commentService.getCommentsByPostId(postId)); + } + + @PutMapping("/{id}") + public ResponseEntity> updateComment(@PathVariable UUID id, @RequestBody CommentRequest request) { + commentService.updateComment(id, request); + Map response = new HashMap<>(); + response.put("message", "댓글 수정 성공"); + return ResponseEntity.ok(response); + } + + @DeleteMapping("/{id}") + public ResponseEntity> deleteComment(@PathVariable UUID id) { + commentService.deleteComment(id); + Map response = new HashMap<>(); + response.put("message", "댓글 삭제 성공"); + return ResponseEntity.ok(response); + } +} diff --git a/src/main/java/com/blog/domain/comment/domain/Comment.java b/src/main/java/com/blog/domain/comment/domain/Comment.java new file mode 100644 index 00000000..852f2f6c --- /dev/null +++ b/src/main/java/com/blog/domain/comment/domain/Comment.java @@ -0,0 +1,51 @@ +package com.blog.domain.comment.domain; + +import java.time.LocalDateTime; +import java.util.UUID; + +public class Comment { + private UUID id; + private String content; + private UUID authorId; + private UUID postId; + private LocalDateTime createdAt; + private LocalDateTime updatedAt; + + public Comment(UUID id, String content, UUID authorId, UUID postId, LocalDateTime createdAt, LocalDateTime updatedAt) { + this.id = id; + this.content = content; + this.authorId = authorId; + this.postId = postId; + this.createdAt = createdAt; + this.updatedAt = updatedAt; + } + + public UUID getId() { + return id; + } + + public String getContent() { + return content; + } + + public UUID getAuthorId() { + return authorId; + } + + public UUID getPostId() { + return postId; + } + + public LocalDateTime getCreatedAt() { + return createdAt; + } + + public LocalDateTime getUpdatedAt() { + return updatedAt; + } + + public void updateContent(String content) { + this.content = content; + this.updatedAt = LocalDateTime.now(); + } +} diff --git a/src/main/java/com/blog/domain/comment/dto/CommentRequest.java b/src/main/java/com/blog/domain/comment/dto/CommentRequest.java new file mode 100644 index 00000000..368c0d5f --- /dev/null +++ b/src/main/java/com/blog/domain/comment/dto/CommentRequest.java @@ -0,0 +1,21 @@ +package com.blog.domain.comment.dto; + +import java.util.UUID; + +public class CommentRequest { + private String content; + private UUID postId; + private UUID authorId; + + public String getContent() { + return content; + } + + public UUID getPostId() { + return postId; + } + + public UUID getAuthorId() { + return authorId; + } +} diff --git a/src/main/java/com/blog/domain/comment/dto/CommentResponse.java b/src/main/java/com/blog/domain/comment/dto/CommentResponse.java new file mode 100644 index 00000000..9a6c766f --- /dev/null +++ b/src/main/java/com/blog/domain/comment/dto/CommentResponse.java @@ -0,0 +1,58 @@ +package com.blog.domain.comment.dto; + +import com.blog.domain.comment.domain.Comment; +import java.time.LocalDateTime; +import java.util.UUID; + +public class CommentResponse { + private UUID id; + private String content; + private UUID authorId; + private UUID postId; + private LocalDateTime createdAt; + private LocalDateTime updatedAt; + + public CommentResponse(UUID id, String content, UUID authorId, UUID postId, LocalDateTime createdAt, LocalDateTime updatedAt) { + this.id = id; + this.content = content; + this.authorId = authorId; + this.postId = postId; + this.createdAt = createdAt; + this.updatedAt = updatedAt; + } + + public static CommentResponse from(Comment comment) { + return new CommentResponse( + comment.getId(), + comment.getContent(), + comment.getAuthorId(), + comment.getPostId(), + comment.getCreatedAt(), + comment.getUpdatedAt() + ); + } + + public UUID getId() { + return id; + } + + public String getContent() { + return content; + } + + public UUID getAuthorId() { + return authorId; + } + + public UUID getPostId() { + return postId; + } + + public LocalDateTime getCreatedAt() { + return createdAt; + } + + public LocalDateTime getUpdatedAt() { + return updatedAt; + } +} diff --git a/src/main/java/com/blog/domain/comment/repository/CommentRepository.java b/src/main/java/com/blog/domain/comment/repository/CommentRepository.java new file mode 100644 index 00000000..fcebe34d --- /dev/null +++ b/src/main/java/com/blog/domain/comment/repository/CommentRepository.java @@ -0,0 +1,75 @@ +package com.blog.domain.comment.repository; + +import com.blog.domain.comment.domain.Comment; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Repository; + +import java.sql.Timestamp; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +@Repository +public class CommentRepository { + private final JdbcTemplate jdbcTemplate; + + public CommentRepository(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } + + public void save(Comment comment) { + String sql = "INSERT INTO comment (id, content, author_id, post_id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?)"; + jdbcTemplate.update(sql, + comment.getId().toString(), + comment.getContent(), + comment.getAuthorId().toString(), + comment.getPostId().toString(), + Timestamp.valueOf(comment.getCreatedAt()), + Timestamp.valueOf(comment.getUpdatedAt()) + ); + } + + public Optional findById(UUID id) { + String sql = "SELECT * FROM comment WHERE id = ?"; + List result = jdbcTemplate.query(sql, commentRowMapper(), id.toString()); + return result.stream().findFirst(); + } + + public List findByPostId(UUID postId) { + String sql = "SELECT * FROM comment WHERE post_id = ?"; + return jdbcTemplate.query(sql, commentRowMapper(), postId.toString()); + } + + public void update(Comment comment) { + String sql = "UPDATE comment SET content = ?, updated_at = ? WHERE id = ?"; + jdbcTemplate.update(sql, + comment.getContent(), + Timestamp.valueOf(comment.getUpdatedAt()), + comment.getId().toString() + ); + } + + public void deleteById(UUID id) { + String sql = "DELETE FROM comment WHERE id = ?"; + jdbcTemplate.update(sql, id.toString()); + } + + private RowMapper commentRowMapper() { + return (rs, rowNum) -> new Comment( + UUID.fromString(rs.getString("id")), + rs.getString("content"), + UUID.fromString(rs.getString("author_id")), + UUID.fromString(rs.getString("post_id")), + rs.getTimestamp("created_at").toLocalDateTime(), + rs.getTimestamp("updated_at").toLocalDateTime() + ); + } + + public List findByAuthorId(UUID authorId) { + String sql = "SELECT * FROM comment WHERE author_id = ?"; + return jdbcTemplate.query(sql, commentRowMapper(), authorId.toString()); + } + +} diff --git a/src/main/java/com/blog/domain/comment/service/CommentService.java b/src/main/java/com/blog/domain/comment/service/CommentService.java new file mode 100644 index 00000000..f4de874a --- /dev/null +++ b/src/main/java/com/blog/domain/comment/service/CommentService.java @@ -0,0 +1,65 @@ +package com.blog.domain.comment.service; + +import com.blog.domain.comment.domain.Comment; +import com.blog.domain.comment.dto.CommentRequest; +import com.blog.domain.comment.dto.CommentResponse; +import com.blog.domain.comment.repository.CommentRepository; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.UUID; +import java.util.stream.Collectors; + +@Service +public class CommentService { + private final CommentRepository commentRepository; + + public CommentService(CommentRepository commentRepository) { + this.commentRepository = commentRepository; + } + + public void createComment(CommentRequest request) { + Comment comment = new Comment( + UUID.randomUUID(), + request.getContent(), + request.getAuthorId(), + request.getPostId(), + LocalDateTime.now(), + LocalDateTime.now() + ); + commentRepository.save(comment); + } + + public CommentResponse getComment(UUID id) { + Comment comment = commentRepository.findById(id) + .orElseThrow(() -> new RuntimeException("댓글을 찾을 수 없습니다.")); + return CommentResponse.from(comment); + } + + public List getCommentsByPostId(UUID postId) { + return commentRepository.findByPostId(postId) + .stream() + .map(CommentResponse::from) + .collect(Collectors.toList()); + } + + public void updateComment(UUID id, CommentRequest request) { + Comment comment = commentRepository.findById(id) + .orElseThrow(() -> new RuntimeException("댓글을 찾을 수 없습니다.")); + comment.updateContent(request.getContent()); + commentRepository.update(comment); + } + + public void deleteComment(UUID id) { + commentRepository.deleteById(id); + } + + public List getCommentsByAuthor(UUID authorId) { + return commentRepository.findByAuthorId(authorId) + .stream() + .map(CommentResponse::from) + .collect(Collectors.toList()); + } + +} diff --git a/src/main/java/com/blog/domain/image/Image.java b/src/main/java/com/blog/domain/image/Image.java deleted file mode 100644 index 0da3b162..00000000 --- a/src/main/java/com/blog/domain/image/Image.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.blog.domain.image; - -public class Image { - -} diff --git a/src/main/java/com/blog/domain/image/controller/ImageController.java b/src/main/java/com/blog/domain/image/controller/ImageController.java new file mode 100644 index 00000000..ada6b212 --- /dev/null +++ b/src/main/java/com/blog/domain/image/controller/ImageController.java @@ -0,0 +1,23 @@ +package com.blog.domain.image.controller; + +import com.blog.domain.image.dto.ImageResponse; +import com.blog.domain.image.service.ImageService; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +@RestController +@RequestMapping("/images") +public class ImageController { + private final ImageService imageService; + + public ImageController(ImageService imageService) { + this.imageService = imageService; + } + + @PostMapping("/upload") + public ResponseEntity upload(@RequestParam("file") MultipartFile file) { + ImageResponse response = imageService.upload(file); + return ResponseEntity.ok(response); + } +} diff --git a/src/main/java/com/blog/domain/image/domain/Image.java b/src/main/java/com/blog/domain/image/domain/Image.java new file mode 100644 index 00000000..edcf2aa7 --- /dev/null +++ b/src/main/java/com/blog/domain/image/domain/Image.java @@ -0,0 +1,40 @@ +package com.blog.domain.image.domain; + +import java.time.LocalDateTime; +import java.util.UUID; + +public class Image { + private UUID id; + private String originalName; + private String storedName; + private String url; + private LocalDateTime createdAt; + + public Image(UUID id, String originalName, String storedName, String url, LocalDateTime createdAt) { + this.id = id; + this.originalName = originalName; + this.storedName = storedName; + this.url = url; + this.createdAt = createdAt; + } + + public UUID getId() { + return id; + } + + public String getOriginalName() { + return originalName; + } + + public String getStoredName() { + return storedName; + } + + public String getUrl() { + return url; + } + + public LocalDateTime getCreatedAt() { + return createdAt; + } +} diff --git a/src/main/java/com/blog/domain/image/dto/ImageResponse.java b/src/main/java/com/blog/domain/image/dto/ImageResponse.java new file mode 100644 index 00000000..f4566e9c --- /dev/null +++ b/src/main/java/com/blog/domain/image/dto/ImageResponse.java @@ -0,0 +1,27 @@ +package com.blog.domain.image.dto; + +import com.blog.domain.image.domain.Image; + +import java.util.UUID; + +public class ImageResponse { + private UUID id; + private String url; + + public ImageResponse(UUID id, String url) { + this.id = id; + this.url = url; + } + + public static ImageResponse from(Image image) { + return new ImageResponse(image.getId(), image.getUrl()); + } + + public UUID getId() { + return id; + } + + public String getUrl() { + return url; + } +} diff --git a/src/main/java/com/blog/domain/image/repository/ImageRepository.java b/src/main/java/com/blog/domain/image/repository/ImageRepository.java new file mode 100644 index 00000000..ba133b9d --- /dev/null +++ b/src/main/java/com/blog/domain/image/repository/ImageRepository.java @@ -0,0 +1,45 @@ +package com.blog.domain.image.repository; + +import com.blog.domain.image.domain.Image; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Repository; + +import java.sql.Timestamp; +import java.util.Optional; +import java.util.UUID; + +@Repository +public class ImageRepository { + private final JdbcTemplate jdbcTemplate; + + public ImageRepository(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } + + public void save(Image image) { + String sql = "INSERT INTO image (id, original_name, stored_name, url, created_at) VALUES (?, ?, ?, ?, ?)"; + jdbcTemplate.update(sql, + image.getId().toString(), + image.getOriginalName(), + image.getStoredName(), + image.getUrl(), + Timestamp.valueOf(image.getCreatedAt())); + } + + public Optional findById(UUID id) { + String sql = "SELECT * FROM image WHERE id = ?"; + return jdbcTemplate.query(sql, rowMapper(), id.toString()) + .stream().findFirst(); + } + + private RowMapper rowMapper() { + return (rs, rowNum) -> new Image( + UUID.fromString(rs.getString("id")), + rs.getString("original_name"), + rs.getString("stored_name"), + rs.getString("url"), + rs.getTimestamp("created_at").toLocalDateTime() + ); + } +} diff --git a/src/main/java/com/blog/domain/image/service/ImageService.java b/src/main/java/com/blog/domain/image/service/ImageService.java new file mode 100644 index 00000000..f98fbea7 --- /dev/null +++ b/src/main/java/com/blog/domain/image/service/ImageService.java @@ -0,0 +1,49 @@ +package com.blog.domain.image.service; + +import com.blog.domain.image.domain.Image; +import com.blog.domain.image.dto.ImageResponse; +import com.blog.domain.image.repository.ImageRepository; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.nio.file.Files; +import java.nio.file.Path; +import java.time.LocalDateTime; +import java.util.UUID; + +@Service +public class ImageService { + private static final String UPLOAD_DIR = System.getProperty("user.dir") + "/uploads/"; + private final ImageRepository imageRepository; + + public ImageService(ImageRepository imageRepository) { + this.imageRepository = imageRepository; + } + public ImageResponse upload(MultipartFile file) { + try { + String originalName = file.getOriginalFilename(); + String ext = originalName.substring(originalName.lastIndexOf(".")); + String storedName = UUID.randomUUID() + ext; + Path storedPath = Path.of(UPLOAD_DIR + storedName); + + Files.createDirectories(storedPath.getParent()); // 디렉토리 없으면 생성 + file.transferTo(storedPath.toFile()); + + String url = "/images/" + storedName; + + Image image = new Image( + UUID.randomUUID(), + originalName, + storedName, + url, + LocalDateTime.now() + ); + + imageRepository.save(image); + return ImageResponse.from(image); + } catch (Exception e) { + throw new RuntimeException("이미지 저장 실패", e); + } + } +} diff --git a/src/main/java/com/blog/domain/post/Post.java b/src/main/java/com/blog/domain/post/Post.java deleted file mode 100644 index 9166c51d..00000000 --- a/src/main/java/com/blog/domain/post/Post.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.blog.domain.post; - -public class Post { - -} diff --git a/src/main/java/com/blog/domain/post/repository/PostRepository.java b/src/main/java/com/blog/domain/post/repository/PostRepository.java index f3f90bc3..eaae4eda 100644 --- a/src/main/java/com/blog/domain/post/repository/PostRepository.java +++ b/src/main/java/com/blog/domain/post/repository/PostRepository.java @@ -67,4 +67,10 @@ private RowMapper postRowMapper() { rs.getTimestamp("updated_at").toLocalDateTime() ); } + + public List findByAuthorId(String authorId) { + String sql = "SELECT * FROM post WHERE author_id = ?"; + return jdbcTemplate.query(sql, postRowMapper(), authorId); + } + } diff --git a/src/main/java/com/blog/domain/post/service/PostService.java b/src/main/java/com/blog/domain/post/service/PostService.java index 044d8313..eef4b079 100644 --- a/src/main/java/com/blog/domain/post/service/PostService.java +++ b/src/main/java/com/blog/domain/post/service/PostService.java @@ -64,4 +64,12 @@ public void updatePost(UUID id, PostRequest request) { public void deletePost(UUID id) { postRepository.deleteById(id); } + + public List getPostsByAuthor(UUID authorId) { + return postRepository.findByAuthorId(authorId.toString()) + .stream() + .map(PostResponse::from) + .collect(Collectors.toList()); + } + } diff --git a/src/main/java/com/blog/domain/user/controller/UserController.java b/src/main/java/com/blog/domain/user/controller/UserController.java index 52eefa15..c1d43d76 100644 --- a/src/main/java/com/blog/domain/user/controller/UserController.java +++ b/src/main/java/com/blog/domain/user/controller/UserController.java @@ -1,18 +1,33 @@ package com.blog.domain.user.controller; +import com.blog.domain.comment.dto.CommentResponse; +import com.blog.domain.comment.service.CommentService; +import com.blog.domain.post.dto.PostResponse; +import com.blog.domain.post.service.PostService; import com.blog.domain.user.domain.User; +import com.blog.domain.user.dto.UpdateProfileImageRequest; +import com.blog.domain.user.dto.UserProfileResponse; +import com.blog.domain.user.service.UserService; import com.blog.global.auth.service.AuthService; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestHeader; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; @RestController public class UserController { private final AuthService authService; + private final UserService userService; + private final PostService postService; + private final CommentService commentService; - public UserController(AuthService authService) { + public UserController(AuthService authService, UserService userService , PostService postService , CommentService commentService) { this.authService = authService; + this.userService = userService; + this.postService = postService; + this.commentService = commentService; } @GetMapping("/protected-resource") @@ -21,5 +36,58 @@ public ResponseEntity getProtectedResource( User user = authService.getUserInfoFromToken(token); return ResponseEntity.ok(user); } -} + @GetMapping("/me") + public ResponseEntity getMyInfo( + @RequestHeader("Authorization") String token) { + User user = getUserFromToken(token); + return ResponseEntity.ok(UserProfileResponse.from(user)); + } + + @DeleteMapping("/me") + public ResponseEntity> deleteMyAccount( + @RequestHeader("Authorization") String token) { + User user = getUserFromToken(token); + userService.deleteByEmail(user.getEmail()); + + Map response = Map.of("message", "회원 탈퇴가 완료되었습니다."); + return ResponseEntity.ok(response); + } + + @PatchMapping("/me/profile-image") + public ResponseEntity> updateProfileImage( + @RequestHeader("Authorization") String token, + @RequestBody UpdateProfileImageRequest request) { + User user = getUserFromToken(token); + userService.updateProfileImage(user.getEmail(), request.getProfileImageUrl()); + + Map response = new HashMap<>(); + response.put("message", "프로필 이미지가 성공적으로 변경되었습니다."); + response.put("profileImageUrl", request.getProfileImageUrl()); + + return ResponseEntity.ok(response); + } + + private User getUserFromToken(String token) { + User decoded = authService.getUserInfoFromToken(token); + return userService.findUserByEmail(decoded.getEmail()) + .orElseThrow(() -> new RuntimeException("User not found")); + } + + @GetMapping("/me/posts") + public ResponseEntity> getMyPosts( + @RequestHeader("Authorization") String token) { + User user = getUserFromToken(token); + List posts = postService.getPostsByAuthor(user.getId()); + return ResponseEntity.ok(posts); + } + + @GetMapping("/me/comments") + public ResponseEntity> getMyComments( + @RequestHeader("Authorization") String token) { + User user = getUserFromToken(token); + List comments = commentService.getCommentsByAuthor(user.getId()); + return ResponseEntity.ok(comments); + } + +} diff --git a/src/main/java/com/blog/domain/user/dto/UpdateProfileImageRequest.java b/src/main/java/com/blog/domain/user/dto/UpdateProfileImageRequest.java new file mode 100644 index 00000000..c8f1aeb7 --- /dev/null +++ b/src/main/java/com/blog/domain/user/dto/UpdateProfileImageRequest.java @@ -0,0 +1,9 @@ +package com.blog.domain.user.dto; + +public class UpdateProfileImageRequest { + private String profileImageUrl; + + public String getProfileImageUrl() { + return profileImageUrl; + } +} diff --git a/src/main/java/com/blog/domain/user/dto/UserProfileResponse.java b/src/main/java/com/blog/domain/user/dto/UserProfileResponse.java new file mode 100644 index 00000000..962a6362 --- /dev/null +++ b/src/main/java/com/blog/domain/user/dto/UserProfileResponse.java @@ -0,0 +1,51 @@ +package com.blog.domain.user.dto; + +import com.blog.domain.user.domain.User; +import java.time.LocalDateTime; +import java.util.UUID; + +public class UserProfileResponse { + private UUID id; + private String nickname; + private String email; + private String profileImageUrl; + private LocalDateTime createdAt; + + public UserProfileResponse(UUID id, String nickname, String email, String profileImageUrl, LocalDateTime createdAt) { + this.id = id; + this.nickname = nickname; + this.email = email; + this.profileImageUrl = profileImageUrl; + this.createdAt = createdAt; + } + + public static UserProfileResponse from(User user) { + return new UserProfileResponse( + user.getId(), + user.getNickname(), + user.getEmail(), + user.getProfileImageUrl(), + user.getCreatedAt() + ); + } + + public UUID getId() { + return id; + } + + public String getNickname() { + return nickname; + } + + public String getEmail() { + return email; + } + + public String getProfileImageUrl() { + return profileImageUrl; + } + + public LocalDateTime getCreatedAt() { + return createdAt; + } +} diff --git a/src/main/java/com/blog/domain/user/repository/UserRepository.java b/src/main/java/com/blog/domain/user/repository/UserRepository.java index 40f372fb..ccc8486f 100644 --- a/src/main/java/com/blog/domain/user/repository/UserRepository.java +++ b/src/main/java/com/blog/domain/user/repository/UserRepository.java @@ -45,6 +45,12 @@ public Optional findById(String id) { return users.stream().findFirst(); } + public void deleteByEmail(String email) { + String sql = "DELETE FROM user WHERE email = ?"; + jdbcTemplate.update(sql, email); + } + + private RowMapper userRowMapper() { return (rs, rowNum) -> new User( UUID.fromString(rs.getString("id")), diff --git a/src/main/java/com/blog/domain/user/service/UserService.java b/src/main/java/com/blog/domain/user/service/UserService.java index 73de8675..1e86e5dd 100644 --- a/src/main/java/com/blog/domain/user/service/UserService.java +++ b/src/main/java/com/blog/domain/user/service/UserService.java @@ -11,15 +11,18 @@ import java.util.Base64; import java.util.Optional; import java.util.UUID; +import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Service; @Service public class UserService { private final UserRepository userRepository; + private final JdbcTemplate jdbcTemplate; private static final String SALT = "random_salt_value"; - public UserService(UserRepository userRepository) { + public UserService(UserRepository userRepository, JdbcTemplate jdbcTemplate) { this.userRepository = userRepository; + this.jdbcTemplate = jdbcTemplate; } public void registerUser(String nickname, String password, String email, String profileImageUrl) { @@ -42,4 +45,14 @@ private String hashPassword(String password) { public Optional findUserByEmail(String email) { return userRepository.findByEmail(email); } + + public void deleteByEmail(String email) { + userRepository.deleteByEmail(email); + } + + public void updateProfileImage(String email, String imageUrl) { + String sql = "UPDATE user SET profile_image_url = ?, updated_at = ? WHERE email = ?"; + jdbcTemplate.update(sql, imageUrl, LocalDateTime.now(), email); + } + }