added image for post
This commit is contained in:
@@ -1,58 +1,75 @@
|
||||
package com.krylov.refound.service;
|
||||
|
||||
import com.krylov.refound.dto.PostFilter;
|
||||
import com.krylov.refound.dto.PostRequest;
|
||||
import com.krylov.refound.dto.PostResponse;
|
||||
import com.krylov.refound.entity.Image;
|
||||
import com.krylov.refound.entity.Post;
|
||||
import com.krylov.refound.entity.User;
|
||||
import com.krylov.refound.enums.ErrorCode;
|
||||
import com.krylov.refound.enums.PostStatus;
|
||||
import com.krylov.refound.exception.ApiException;
|
||||
import com.krylov.refound.mapper.PostMapper;
|
||||
import com.krylov.refound.repository.FavoriteRepository;
|
||||
import com.krylov.refound.repository.ImageRepository;
|
||||
import com.krylov.refound.repository.PostRepository;
|
||||
import com.krylov.refound.util.PostSpecification;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.cache.annotation.CacheEvict;
|
||||
import org.springframework.cache.annotation.Cacheable;
|
||||
import org.springframework.data.domain.Page;
|
||||
import org.springframework.data.domain.Pageable;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
@Slf4j
|
||||
public class PostService {
|
||||
|
||||
private final PostRepository repository;
|
||||
private final ImageRepository imageRepository;
|
||||
private final FileStorageService storageService;
|
||||
private final PostMapper mapper;
|
||||
private final UserService userService;
|
||||
private final FavoriteRepository favoriteRepository;
|
||||
private final ImageRepository imageRepository;
|
||||
|
||||
@CacheEvict(value = "posts", allEntries = true)
|
||||
public PostRequest create(PostRequest request) {
|
||||
public PostRequest create(PostRequest request, MultipartFile image) {
|
||||
|
||||
Post post = mapper.toEntity(request);
|
||||
post.setCreatedAt(LocalDateTime.now());
|
||||
post.setStatus(PostStatus.ACTIVE);
|
||||
repository.save(post); // сначала сохраняем post, чтобы получить id
|
||||
|
||||
repository.save(post);
|
||||
if (image != null && !image.isEmpty()) {
|
||||
String filename = UUID.randomUUID() + "_" + image.getOriginalFilename();
|
||||
Path uploadDir = Paths.get("uploads");
|
||||
|
||||
try {
|
||||
Files.createDirectories(uploadDir);
|
||||
Files.copy(image.getInputStream(), uploadDir.resolve(filename));
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException("Не удалось сохранить файл: " + filename, e);
|
||||
}
|
||||
|
||||
Image img = new Image();
|
||||
img.setUrl("/uploads/" + filename);
|
||||
img.setPost(post);
|
||||
imageRepository.save(img);
|
||||
}
|
||||
|
||||
return request;
|
||||
}
|
||||
|
||||
public List<Post> getFeed() {
|
||||
List<Post> postList = repository.findAll();
|
||||
return postList;
|
||||
public List<PostResponse> getFeed() {
|
||||
return repository.findAll().stream()
|
||||
.map(post -> {
|
||||
PostResponse response = mapper.toResponse(post);
|
||||
log.info("Post {}: images = {}, phone = {}", post.getId(), response.getImages()); // ← сюда
|
||||
return response;
|
||||
}).toList();
|
||||
|
||||
}
|
||||
|
||||
@Cacheable(value = "post", key = "#id")
|
||||
@@ -64,7 +81,7 @@ public class PostService {
|
||||
}
|
||||
|
||||
@CacheEvict(value = {"posts", "post"}, allEntries = true)
|
||||
public PostResponse update(Long id, PostRequest request) {
|
||||
public PostResponse update(Long id, PostRequest request, MultipartFile image) {
|
||||
|
||||
Post post = repository.findById(id)
|
||||
.orElseThrow(() -> new ApiException(
|
||||
@@ -79,8 +96,35 @@ public class PostService {
|
||||
post.setPhone(request.getPhone());
|
||||
post.setType(request.getType());
|
||||
|
||||
Post updated = repository.save(post);
|
||||
if (image != null && !image.isEmpty()) {
|
||||
// удаляем старые картинки с диска
|
||||
post.getImages().forEach(img -> {
|
||||
try {
|
||||
Files.deleteIfExists(Paths.get("." + img.getUrl()));
|
||||
} catch (IOException e) {
|
||||
log.warn("Не удалось удалить файл: {}", img.getUrl());
|
||||
}
|
||||
});
|
||||
// очищаем список (orphanRemoval = true удалит из БД)
|
||||
post.getImages().clear();
|
||||
|
||||
// сохраняем новую картинку
|
||||
String filename = UUID.randomUUID() + "_" + image.getOriginalFilename();
|
||||
Path uploadDir = Paths.get("uploads");
|
||||
try {
|
||||
Files.createDirectories(uploadDir);
|
||||
Files.copy(image.getInputStream(), uploadDir.resolve(filename));
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException("Не удалось сохранить файл: " + filename, e);
|
||||
}
|
||||
|
||||
Image img = new Image();
|
||||
img.setUrl("/uploads/" + filename);
|
||||
img.setPost(post);
|
||||
post.getImages().add(img);
|
||||
}
|
||||
|
||||
Post updated = repository.save(post);
|
||||
return mapper.toResponse(updated);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user