Skip to content

Commit

Permalink
BfProfilePicture - update or replace. Correct database.
Browse files Browse the repository at this point in the history
  • Loading branch information
Karelin committed Jan 4, 2022
1 parent bcbf8cd commit 188a833
Show file tree
Hide file tree
Showing 10 changed files with 52 additions and 12 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ TODO:
13. Compare Partnership and Investment entities. For example Language enum should be already added!
14. Limit for proposals: 50. Smart value should be included I think.
15. After updating proposals we also need to approve it in Admin panel. Let's just set "NEW" or "UPDATED" status in entities.
16. Create BfUserDetails entity.

Mobile app:

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ public void run(ApplicationArguments args) throws Exception {

private void createDirectoriesForLocalProfilePictures() {
try {
// TODO. We can also initialize default picture which will be copied from /resources folder.
Files.createDirectories(Paths.get(profilePictureUploadPath));
} catch (IOException e) {
throw new RuntimeException("Could not create upload folder! Error: " + e);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,4 +55,8 @@ public boolean isEnabled() {
public Long getCurrentUserId() {
return entity.getId();
}

public String getCurrentUserUuid() {
return entity.getUuid();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import com.business.finder.user.application.validator.UploadUserProfilePictureValidator;
import com.business.finder.user.db.BfProfilePictureRepository;
import com.business.finder.user.domain.BfProfilePicture;
import com.business.finder.user.domain.type.ProfilePictureExtension;
import com.business.finder.user.domain.type.ProfilePictureStatus;
import com.business.finder.user.domain.type.ProfilePictureStorage;
import lombok.RequiredArgsConstructor;
Expand Down Expand Up @@ -33,29 +34,38 @@ public class UploadUserProfilePictureService implements UploadUserProfilePicture
@Override
@Transactional
public UploadUserProfilePictureResponse upload(UploadUserProfilePictureCommand command) {
final String fileName = command.getUserId().toString();
final String fileExtension = getFileExtensionFrom(command.getFile());
final String fileName = command.getUserUuid();
final ProfilePictureExtension fileExtension = getFileExtensionFrom(command.getFile());

List<ErrorCode> errors = validator.validate(fileExtension);

if (!errors.isEmpty()) {
return UploadUserProfilePictureResponse.errors(errors);
}

BfProfilePicture entity = new BfProfilePicture(fileName, command.getUserId(), ProfilePictureStorage.LOCAL);
BfProfilePicture savedEntity = profilePictureRepository.save(entity);
BfProfilePicture entity = getOrCreateBfProfilePicture(command.getUserId());
entity.setFileName(fileName);
entity.setPictureStorage(ProfilePictureStorage.LOCAL);
entity.setExtension(fileExtension);

LocalPictureUploadedResponse response = localPictureUploaderUseCase.uploadAndReplace(command.getFile(), fileName, userProfilePictureFolder);

if (response.isSuccess()) {
savedEntity.setStatus(ProfilePictureStatus.PICTURE_UPLOADED);
entity.setStatus(ProfilePictureStatus.PICTURE_UPLOADED);
}

log.info("Added profile picture for user: " + command.getUserId());
return UploadUserProfilePictureResponse.OK;
}

private String getFileExtensionFrom(MultipartFile file) {
return StringUtils.getFilenameExtension(file.getOriginalFilename());
private ProfilePictureExtension getFileExtensionFrom(MultipartFile file) {
String fileExtension = StringUtils.getFilenameExtension(file.getOriginalFilename());
return ProfilePictureExtension.valueOf(fileExtension.toUpperCase());
}

private BfProfilePicture getOrCreateBfProfilePicture(Long userId) {
return profilePictureRepository
.findByUserId(userId)
.orElseGet(() -> profilePictureRepository.save(new BfProfilePicture(userId)));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ public static UploadUserProfilePictureResponse errors(List<ErrorCode> errors) {
class UploadUserProfilePictureCommand {
@NotNull MultipartFile file;
@NotNull Long userId;
@NotNull String userUuid;
}

enum ErrorCode {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.business.finder.user.application.validator;

import com.business.finder.user.application.port.UploadUserProfilePictureUseCase.ErrorCode;
import com.business.finder.user.domain.type.ProfilePictureExtension;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

Expand All @@ -13,15 +14,15 @@ public class UploadUserProfilePictureValidator {
@Value("${bf.user.profile.picture.allowed-extensions}")
private List<String> allowedProfilePictureExtensions;

public List<ErrorCode> validate(String pictureExtension) {
public List<ErrorCode> validate(ProfilePictureExtension pictureExtension) {
List<ErrorCode> errors = new ArrayList<>();
boolean isAllowed = allowedProfilePictureExtensions
.stream()
.anyMatch(allowedExtension -> allowedExtension.equals(pictureExtension));
.map(allowedExtension -> ProfilePictureExtension.valueOf(allowedExtension.toUpperCase()))
.anyMatch(pictureExtension::equals);
if (!isAllowed) {
errors.add(ErrorCode.NOT_ALLOWED_EXTENSION);
}
return errors;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,8 @@
import com.business.finder.user.domain.BfProfilePicture;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.Optional;

public interface BfProfilePictureRepository extends JpaRepository<BfProfilePicture, Long> {
Optional<BfProfilePicture> findByUserId(Long userId);
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.business.finder.user.domain;

import com.business.finder.jpa.BaseEntity;
import com.business.finder.user.domain.type.ProfilePictureExtension;
import com.business.finder.user.domain.type.ProfilePictureStatus;
import com.business.finder.user.domain.type.ProfilePictureStorage;
import lombok.Getter;
Expand All @@ -10,6 +11,7 @@
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import javax.persistence.*;
import javax.validation.constraints.NotNull;
import java.time.LocalDateTime;

@Table(name = "BF_PROFILE_PICTURE")
Expand All @@ -31,14 +33,24 @@ public class BfProfilePicture extends BaseEntity {
@Enumerated(EnumType.STRING)
private ProfilePictureStorage pictureStorage;

@Enumerated(EnumType.STRING)
private ProfilePictureStatus status;

@Enumerated(EnumType.STRING)
private ProfilePictureExtension extension;

@NotNull
private Long userId;

public BfProfilePicture(String fileName, Long userId, ProfilePictureStorage storage) {
public BfProfilePicture(String fileName, Long userId, ProfilePictureStorage storage, ProfilePictureExtension extension) {
this.fileName = fileName;
this.userId = userId;
this.pictureStorage = storage;
this.extension = extension;
this.status = ProfilePictureStatus.NEW;
}

public BfProfilePicture(Long userId) {
this.userId = userId;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.business.finder.user.domain.type;

public enum ProfilePictureExtension {
PNG, JPG
}
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,9 @@ public ResponseEntity<UpdateUserResponse> updateUser(@Valid @RequestBody RestUpd

@PutMapping("/profile-picture")
public ResponseEntity<UploadUserProfilePictureResponse> uploadUserProfilePicture(@RequestParam MultipartFile file, @AuthenticationPrincipal UserEntityDetails userDetails) {
UploadUserProfilePictureResponse response = uploadUserProfilePictureUseCase.upload(new UploadUserProfilePictureCommand(file, userDetails.getCurrentUserId()));
UploadUserProfilePictureResponse response = uploadUserProfilePictureUseCase.upload(new UploadUserProfilePictureCommand(file,
userDetails.getCurrentUserId(),
userDetails.getCurrentUserUuid()));
if (response.isSuccess()) {
return ResponseEntity.ok(response);
} else {
Expand Down

0 comments on commit 188a833

Please sign in to comment.