Skip to content

Commit

Permalink
feat: Add endpoint PUT /user/photo to UserController
Browse files Browse the repository at this point in the history
  • Loading branch information
shorinami committed Jan 12, 2024
1 parent fe40eda commit d2a8b53
Show file tree
Hide file tree
Showing 8 changed files with 62 additions and 28 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ public AdvertisementDAO getAdvertisement(Long id) {
}

@Transactional
public AdvertisementDAO createAdvertisement(AdvertisementDTO advertisementDTO, List<MultipartFile> files) throws IOException {
public AdvertisementDAO createAdvertisement(AdvertisementDTO advertisementDTO, List<MultipartFile> files) {
UserDAO user = userService.getUserFromSecurityContextHolder();
AdvertisementDAO advertisement = advertisementMapper.toDAO(advertisementDTO);
advertisement.setUser(user);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,8 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
HttpMethod.PUT,
"/advertisement/{id}",
"/user/me",
"/user/password"
"/user/password",
"/user/me/photo"
)
.authenticated()
.requestMatchers(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ public ResponseEntity<?> downloadImage(@PathVariable Long id) {
@ApiResponse(responseCode = "201", description = "Created"),
@ApiResponse(responseCode = "400", description = "Bad request")
})
public ResponseEntity<?> uploadImage(@RequestPart MultipartFile image) throws IOException {
public ResponseEntity<?> uploadImage(@RequestPart MultipartFile image) {
if (image.isEmpty()) {
return ResponseUtil.error("Image should not be empty.", HttpStatus.BAD_REQUEST);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,8 @@ public interface ImageService {
*
* @param multipartFile The MultipartFile representing the image file.
* @return The created Image entity.
* @throws IOException If an I/O error occurs while reading the file.
*/
ImageDAO createImage(MultipartFile multipartFile) throws IOException;
ImageDAO createImage(MultipartFile multipartFile);

/**
* Retrieves an Image entity by its unique identifier.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.sellbycar.marketplace.image;

import com.sellbycar.marketplace.util.exception.RequestException;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
Expand All @@ -17,12 +18,16 @@ public class ImageServiceImpl implements ImageService {
private final ImageRepository imageRepository;

@Override
public ImageDAO createImage(MultipartFile multipartFile) throws IOException {
public ImageDAO createImage(MultipartFile multipartFile) {
ImageDAO image = new ImageDAO();
image.setName(multipartFile.getName());
image.setContentType(multipartFile.getContentType());
image.setSize(multipartFile.getSize());
image.setContent(multipartFile.getBytes());
try {
image.setContent(multipartFile.getBytes());
} catch (IOException e) {
throw RequestException.bad("Could not read image file.");
}
image.setCreatedTimestamp(Instant.now());
return imageRepository.save(image);
}
Expand Down
55 changes: 36 additions & 19 deletions src/main/java/com/sellbycar/marketplace/user/UserController.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.sellbycar.marketplace.auth.JwtUtils;
import com.sellbycar.marketplace.auth.LoginRequest;
import com.sellbycar.marketplace.web.ResponseBody;
import com.sellbycar.marketplace.web.ResponseUtil;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.Content;
Expand All @@ -18,6 +19,7 @@
import org.springframework.web.bind.annotation.*;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.multipart.MultipartFile;

import java.util.Objects;

Expand All @@ -33,6 +35,40 @@ public class UserController {
private final UserService userService;
private final JwtUtils jwtUtils;

@PutMapping("/me")
@SecurityRequirement(name = "Bearer Authentication")
@Operation(summary = "Update current user")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(responseCode = "401", description = "UNAUTHORIZED"),
@ApiResponse(responseCode = "403", description = "FORBIDDEN"),
@ApiResponse(responseCode = "404", description = "User not found")
})
public ResponseEntity<?> updateUser(@RequestBody UserDTO updatedUser) {
String token = getTokenFromRequest();
String emailOfUser = jwtUtils.getEmailFromJwtToken(token);

UserDAO user = userService.updateUser(updatedUser, emailOfUser);
UserDTO userDTO = userMapper.toDTO(user);

return ResponseEntity.ok(userDTO);
}

@PutMapping(value = "/me/photo", consumes = {"multipart/form-data"})
@SecurityRequirement(name = "Bearer Authentication")
@Operation(summary = "Update current user's photo", tags = {"User Library"})
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "User's photo updated successfully"),
@ApiResponse(responseCode = "400", description = "Bad Request")
})
public ResponseEntity<ResponseBody<UserDTO>> putUserPhoto(@RequestPart("image") MultipartFile image) {
String userToken = getTokenFromRequest();
String userEmail = jwtUtils.getEmailFromJwtToken(userToken);
UserDAO userDAO = userService.findUserByEmailOrThrow(userEmail);
UserDAO updatedUser = userService.updatePhoto(userDAO, image);
return ResponseUtil.ok(userMapper.toDTO(updatedUser));
}

@GetMapping("/me")
@SecurityRequirement(name = "Bearer Authentication")
@Operation(summary = "Get current user", tags = {"User Library"})
Expand All @@ -56,25 +92,6 @@ public ResponseEntity<?> getUser() {
}
}

@PutMapping("/me")
@SecurityRequirement(name = "Bearer Authentication")
@Operation(summary = "Update current user")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(responseCode = "401", description = "UNAUTHORIZED"),
@ApiResponse(responseCode = "403", description = "FORBIDDEN"),
@ApiResponse(responseCode = "404", description = "User not found")
})
public ResponseEntity<?> updateUser(@RequestBody UserDTO updatedUser) {
String token = getTokenFromRequest();
String emailOfUser = jwtUtils.getEmailFromJwtToken(token);

UserDAO user = userService.updateUser(updatedUser, emailOfUser);
UserDTO userDTO = userMapper.toDTO(user);

return ResponseEntity.ok(userDTO);
}

@DeleteMapping("/me")
@SecurityRequirement(name = "Bearer Authentication")
@Operation(summary = "Delete current user.", tags = {"User Library"})
Expand Down
5 changes: 3 additions & 2 deletions src/main/java/com/sellbycar/marketplace/user/UserService.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,18 @@
import com.sellbycar.marketplace.auth.SignupRequest;
import jakarta.mail.MessagingException;
import org.springframework.security.core.Authentication;
import org.springframework.web.multipart.MultipartFile;

public interface UserService {

UserDAO updatePhoto(UserDAO user, MultipartFile newPhoto);

/**
* Registers a new user in the system.
*
* @param signUpRequest DTO containing all required data for user registration.
* @return true if the registration is successful, false otherwise.
* @throws UserDataException if there is an issue during the registration process.
*/

void createNewUser(SignupRequest signUpRequest) throws MessagingException;

/**
Expand Down
11 changes: 11 additions & 0 deletions src/main/java/com/sellbycar/marketplace/user/UserServiceImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

import com.sellbycar.marketplace.auth.LoginRequest;
import com.sellbycar.marketplace.auth.SignupRequest;
import com.sellbycar.marketplace.image.ImageDAO;
import com.sellbycar.marketplace.image.ImageService;
import com.sellbycar.marketplace.mail.MailService;
import com.sellbycar.marketplace.util.exception.RequestException;
import jakarta.mail.MessagingException;
Expand All @@ -13,6 +15,7 @@
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.time.Instant;
import java.util.*;
Expand All @@ -28,6 +31,14 @@ public class UserServiceImpl implements UserService {
private final MailService mailService;
private final UserRequestValidator userRequestValidator;
private final UserMapper userMapper;
private final ImageService imageService;

@Override
public UserDAO updatePhoto(UserDAO userDAO, MultipartFile newPhoto) {
ImageDAO imageDAO = imageService.createImage(newPhoto);
userDAO.setPhoto(imageDAO);
return userRepository.save(userDAO);
}

public void createNewUser(SignupRequest signUpRequest) throws MessagingException {
userRequestValidator.throwIfSignupRequestNotValid(signUpRequest);
Expand Down

0 comments on commit d2a8b53

Please sign in to comment.