Skip to content

Commit 49bcb8f

Browse files
committed
feat: created FileStorageService to store files in localhost
1 parent a25d311 commit 49bcb8f

File tree

5 files changed

+75
-4
lines changed

5 files changed

+75
-4
lines changed
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.joaov1ct0r.restful_api_users_java.modules.domain.services;
2+
3+
import org.springframework.stereotype.Service;
4+
import org.springframework.util.StringUtils;
5+
import org.springframework.web.multipart.MultipartFile;
6+
import java.io.IOException;
7+
import java.nio.file.Files;
8+
import java.nio.file.Path;
9+
import java.nio.file.Paths;
10+
import java.nio.file.StandardCopyOption;
11+
import java.util.UUID;
12+
13+
@Service
14+
public class FileStorageService {
15+
private final Path fileStorageLocation = Paths.get("uploads").toAbsolutePath().normalize();
16+
17+
public FileStorageService() throws IOException {
18+
Files.createDirectories(this.fileStorageLocation);
19+
}
20+
21+
public String storeFile(MultipartFile file) throws IOException {
22+
String fileName = StringUtils.cleanPath(file.getOriginalFilename());
23+
24+
if (fileName.contains("..")) {
25+
throw new IOException("Sorry! Filename contains invalid path sequence " + fileName);
26+
}
27+
28+
String newFileName = UUID.randomUUID().toString() + "_" + fileName;
29+
30+
Path targetLocation = this.fileStorageLocation.resolve(newFileName);
31+
Files.copy(file.getInputStream(), targetLocation, StandardCopyOption.REPLACE_EXISTING);
32+
33+
return "http://localhost:8080/uploads/" + newFileName;
34+
}
35+
}

src/main/java/com/joaov1ct0r/restful_api_users_java/modules/users/services/CreateUserService.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.joaov1ct0r.restful_api_users_java.modules.users.services;
22

33
import com.joaov1ct0r.restful_api_users_java.modules.domain.services.BaseService;
4+
import com.joaov1ct0r.restful_api_users_java.modules.domain.services.FileStorageService;
45
import com.joaov1ct0r.restful_api_users_java.modules.domain.services.S3Service;
56
import com.joaov1ct0r.restful_api_users_java.modules.users.dtos.CreateUserDTO;
67
import com.joaov1ct0r.restful_api_users_java.modules.users.dtos.UserDTO;
@@ -9,12 +10,16 @@
910
import com.joaov1ct0r.restful_api_users_java.modules.users.repositories.UserRepository;
1011
import jakarta.annotation.Nullable;
1112
import org.springframework.beans.factory.annotation.Autowired;
13+
import org.springframework.beans.factory.annotation.Value;
1214
import org.springframework.stereotype.Service;
1315
import org.springframework.security.crypto.password.PasswordEncoder;
1416
import org.springframework.web.multipart.MultipartFile;
1517

1618
@Service
1719
public class CreateUserService extends BaseService {
20+
@Value("${SPRING_PROFILES_ACTIVE:prod}")
21+
private String env;
22+
1823
@Autowired
1924
private UserRepository userRepository;
2025

@@ -24,6 +29,9 @@ public class CreateUserService extends BaseService {
2429
@Autowired
2530
private S3Service s3Service;
2631

32+
@Autowired
33+
private FileStorageService fileStorageService;
34+
2735
public UserDTO execute(CreateUserDTO user, @Nullable MultipartFile file) throws Exception {
2836
boolean nameIsInUseByOtherUser = this.userRepository.findByUsername(user.getUsername()).isPresent();
2937

@@ -54,11 +62,16 @@ public UserDTO execute(CreateUserDTO user, @Nullable MultipartFile file) throws
5462

5563
boolean fileIsPresent = file != null;
5664

57-
if (fileIsPresent) {
65+
if (fileIsPresent && this.env.equals("prod")) {
5866
String fileName = this.s3Service.uploadFile(file);
5967
user.setPhotoUrl(fileName);
6068
}
6169

70+
if (fileIsPresent && this.env.equals("dev")) {
71+
String fileName = this.fileStorageService.storeFile(file);
72+
user.setPhotoUrl(fileName);
73+
}
74+
6275
UserEntity userDTO = UserMapper.toPersistence(user);
6376

6477
UserEntity createdUser = this.userRepository.save(userDTO);

src/main/java/com/joaov1ct0r/restful_api_users_java/modules/users/services/UpdateUserService.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.joaov1ct0r.restful_api_users_java.modules.users.services;
22

33
import com.joaov1ct0r.restful_api_users_java.modules.domain.services.BaseService;
4+
import com.joaov1ct0r.restful_api_users_java.modules.domain.services.FileStorageService;
45
import com.joaov1ct0r.restful_api_users_java.modules.domain.services.S3Service;
56
import com.joaov1ct0r.restful_api_users_java.modules.users.dtos.UpdateUserDTO;
67
import com.joaov1ct0r.restful_api_users_java.modules.users.dtos.UserDTO;
@@ -9,6 +10,7 @@
910
import com.joaov1ct0r.restful_api_users_java.modules.users.repositories.UserRepository;
1011
import jakarta.annotation.Nullable;
1112
import org.springframework.beans.factory.annotation.Autowired;
13+
import org.springframework.beans.factory.annotation.Value;
1214
import org.springframework.security.crypto.password.PasswordEncoder;
1315
import org.springframework.stereotype.Service;
1416
import org.springframework.web.multipart.MultipartFile;
@@ -18,6 +20,9 @@
1820

1921
@Service
2022
public class UpdateUserService extends BaseService {
23+
@Value("${SPRING_PROFILES_ACTIVE:prod}")
24+
private String env;
25+
2126
@Autowired
2227
private UserRepository userRepository;
2328

@@ -27,7 +32,10 @@ public class UpdateUserService extends BaseService {
2732
@Autowired
2833
private S3Service s3Service;
2934

30-
public UserDTO execute(UpdateUserDTO userDTO, String tokenUserId, @Nullable MultipartFile file) {
35+
@Autowired
36+
private FileStorageService fileStorageService;
37+
38+
public UserDTO execute(UpdateUserDTO userDTO, String tokenUserId, @Nullable MultipartFile file) throws Exception {
3139
var isUserRegistered = this.userRepository.findById(UUID.fromString(tokenUserId));
3240

3341
var userWasntFound = isUserRegistered.isEmpty();
@@ -82,11 +90,16 @@ public UserDTO execute(UpdateUserDTO userDTO, String tokenUserId, @Nullable Mult
8290

8391
boolean fileIsPresent = file != null;
8492

85-
if (fileIsPresent) {
93+
if (fileIsPresent && this.env.equals("prod")) {
8694
String fileName = this.s3Service.uploadFile(file);
8795
userToUpdate.setPhotoUrl(fileName);
8896
}
8997

98+
if (fileIsPresent && this.env.equals("dev")) {
99+
String fileName = this.fileStorageService.storeFile(file);
100+
userToUpdate.setPhotoUrl(fileName);
101+
}
102+
90103
userToUpdate.setName(userDTO.getName());
91104
userToUpdate.setEmail(userDTO.getEmail());
92105
userToUpdate.setUsername(userDTO.getUsername());

src/test/java/com/joaov1ct0r/restful_api_users_java/modules/users/services/CreateUserServiceTest.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.joaov1ct0r.restful_api_users_java.modules.domain.exceptions.BadRequestException;
44
import com.joaov1ct0r.restful_api_users_java.modules.domain.entities.ErrorLogEntity;
5+
import com.joaov1ct0r.restful_api_users_java.modules.domain.services.FileStorageService;
56
import com.joaov1ct0r.restful_api_users_java.modules.users.dtos.CreateUserDTO;
67
import com.joaov1ct0r.restful_api_users_java.modules.users.entities.UserEntity;
78
import com.joaov1ct0r.restful_api_users_java.modules.domain.repositories.ErrorLogsRepository;
@@ -42,11 +43,15 @@ public class CreateUserServiceTest {
4243
@Mock
4344
private PasswordEncoder passwordEncoder;
4445

46+
@Mock
47+
private FileStorageService fileStorageService;
48+
4549
@BeforeEach
4650
public void beforeEachSetUp() {
4751
Mockito.reset(this.userRepository);
4852
Mockito.reset(this.passwordEncoder);
4953
Mockito.reset(this.errorLogsRepository);
54+
Mockito.reset(this.fileStorageService);
5055

5156
when(this.errorLogsRepository.save(any())).thenReturn(
5257
new ErrorLogEntity(

src/test/java/com/joaov1ct0r/restful_api_users_java/modules/users/services/UpdateUserServiceTest.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.joaov1ct0r.restful_api_users_java.modules.domain.exceptions.BadRequestException;
55
import com.joaov1ct0r.restful_api_users_java.modules.domain.exceptions.ForbiddenException;
66
import com.joaov1ct0r.restful_api_users_java.modules.domain.repositories.ErrorLogsRepository;
7+
import com.joaov1ct0r.restful_api_users_java.modules.domain.services.FileStorageService;
78
import com.joaov1ct0r.restful_api_users_java.modules.users.dtos.UpdateUserDTO;
89
import com.joaov1ct0r.restful_api_users_java.modules.users.entities.UserEntity;
910
import com.joaov1ct0r.restful_api_users_java.modules.users.repositories.UserRepository;
@@ -42,11 +43,15 @@ public class UpdateUserServiceTest {
4243
@Mock
4344
private PasswordEncoder passwordEncoder;
4445

46+
@Mock
47+
private FileStorageService fileStorageService;
48+
4549
@BeforeEach
4650
public void beforeEachSetUp() {
4751
Mockito.reset(this.userRepository);
4852
Mockito.reset(this.errorLogsRepository);
4953
Mockito.reset(this.passwordEncoder);
54+
Mockito.reset(this.fileStorageService);
5055

5156
when(
5257
this.errorLogsRepository.save(
@@ -172,7 +177,7 @@ public void shouldNotBeAbleToUpdateUserWithUnavailableEmail() {
172177

173178
@Test
174179
@DisplayName("Should be able to update user")
175-
public void shouldBeAbleToUpdateUser() {
180+
public void shouldBeAbleToUpdateUser() throws Exception {
176181
var userDTO = new UpdateUserDTO(
177182
UUID.randomUUID().toString(),
178183
"any_username",

0 commit comments

Comments
 (0)