diff --git a/pom.xml b/pom.xml
index ffb4614..e683c45 100755
--- a/pom.xml
+++ b/pom.xml
@@ -14,7 +14,7 @@
org.springframework.boot
spring-boot-starter-parent
- 2.0.0.RELEASE
+ 2.1.6.RELEASE
@@ -25,35 +25,40 @@
+
+
+
org.springframework.boot
spring-boot-starter-data-jpa
org.springframework.boot
- spring-boot-starter-web
+ spring-boot-starter-security
org.springframework.boot
- spring-boot-starter-security
+ spring-boot-starter-web
-
+
org.springframework.boot
spring-boot-devtools
runtime
+
org.springframework.boot
spring-boot-starter-test
test
-
-
- com.fasterxml.jackson.core
- jackson-annotations
-
-
+
+
+
+
+
+
+
org.mindrot
jbcrypt
diff --git a/src/main/java/org/codiki/CodikiApplication.java b/src/main/java/org/codiki/CodikiApplication.java
index 46bea92..c81769e 100755
--- a/src/main/java/org/codiki/CodikiApplication.java
+++ b/src/main/java/org/codiki/CodikiApplication.java
@@ -7,7 +7,6 @@ import org.springframework.context.annotation.ComponentScan;
@SpringBootApplication
@EnableAutoConfiguration
-@ComponentScan(basePackages = "org.codiki")
public class CodikiApplication {
public static void main(String[] args) {
diff --git a/src/main/java/org/codiki/account/AccountController.java b/src/main/java/org/codiki/account/AccountController.java
index 8f8eb28..15ed7e0 100755
--- a/src/main/java/org/codiki/account/AccountController.java
+++ b/src/main/java/org/codiki/account/AccountController.java
@@ -29,11 +29,21 @@ import com.fasterxml.jackson.annotation.JsonView;
@RestController
@RequestMapping("/api/account")
public class AccountController {
- @Autowired
+ /** Account service. */
private AccountService accountService;
- @Autowired
+ /** User service. */
private UserService userService;
+ /**
+ * Constructor.
+ * @param accountService Account service.
+ * @param userService User service.
+ */
+ public AccountController(AccountService accountService, UserService userService) {
+ this.accountService = accountService;
+ this.userService = userService;
+ }
+
@JsonView(View.UserDTO.class)
@PostMapping("/login")
public User login(@RequestBody final User pUser) throws BadCredentialsException {
@@ -54,8 +64,6 @@ public class AccountController {
* @param pPasswordWrapper
* The object which contains the old password for verification and
* the new password to set to the user.
- * @param pRequest
- * The request injected by Spring.
* @param pResponse
* The reponse injected by Spring.
* @throws IOException
@@ -64,15 +72,19 @@ public class AccountController {
*/
@PutMapping("/changePassword")
public void changePassword(@RequestBody final PasswordWrapperDTO pPasswordWrapper,
- final HttpServletRequest pRequest,
final HttpServletResponse pResponse,
- final Principal pPrincipal) throws IOException {
- final Optional connectedUser = userService.getUserByPrincipal(pPrincipal);
- if(connectedUser.isPresent()) {
- accountService.changePassword(connectedUser.get(), pPasswordWrapper, pResponse);
- } else {
- pResponse.sendError(HttpServletResponse.SC_UNAUTHORIZED);
- }
+ final Principal pPrincipal) {
+ int httpResponseCode = userService.getUserByPrincipal(pPrincipal)
+ .map(user -> {
+ try {
+ return accountService.changePassword(user, pPasswordWrapper);
+ } catch (IllegalArgumentException e) {
+ return HttpServletResponse.SC_BAD_REQUEST;
+ }
+ })
+ .orElse(HttpServletResponse.SC_UNAUTHORIZED);
+
+ pResponse.setStatus(httpResponseCode);
}
@PostMapping("/signin")
diff --git a/src/main/java/org/codiki/account/AccountService.java b/src/main/java/org/codiki/account/AccountService.java
index baff3d6..e178dc9 100755
--- a/src/main/java/org/codiki/account/AccountService.java
+++ b/src/main/java/org/codiki/account/AccountService.java
@@ -1,6 +1,7 @@
package org.codiki.account;
import java.io.IOException;
+import java.nio.file.NoSuchFileException;
import java.security.Principal;
import java.util.Date;
import java.util.LinkedList;
@@ -21,6 +22,8 @@ import org.codiki.core.security.CustomAuthenticationProvider;
import org.codiki.core.services.FileUploadService;
import org.codiki.core.services.UserService;
import org.codiki.core.utils.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.Resource;
import org.springframework.security.authentication.BadCredentialsException;
@@ -30,22 +33,39 @@ import org.springframework.web.multipart.MultipartFile;
@Service
public class AccountService {
+ /** Logger. */
+ private static final Logger LOG = LoggerFactory.getLogger(FileUploadService.class);
- @Autowired
private CustomAuthenticationProvider authenticationProvider;
- @Autowired
private UserService userService;
- @Autowired
private UserRepository userRepository;
- @Autowired
private FileUploadService fileUploadService;
- @Autowired
private ImageRepository imageRepository;
-
+
+ /**
+ * Constructor.
+ * @param authenticationProvider
+ * @param userService
+ * @param userRepository
+ * @param fileUploadService
+ * @param imageRepository
+ */
+ public AccountService(CustomAuthenticationProvider authenticationProvider,
+ UserService userService,
+ UserRepository userRepository,
+ FileUploadService fileUploadService,
+ ImageRepository imageRepository) {
+ this.authenticationProvider = authenticationProvider;
+ this.userService = userService;
+ this.userRepository = userRepository;
+ this.fileUploadService = fileUploadService;
+ this.imageRepository = imageRepository;
+ }
+
public User authenticate(final User pUser) throws BadCredentialsException {
final User user = userService.checkCredentials(pUser.getEmail(), pUser.getPassword());
@@ -54,23 +74,23 @@ public class AccountService {
return user;
}
- public void changePassword(final User pUser, final PasswordWrapperDTO pPasswordWrapper,
- final HttpServletResponse pResponse) throws IOException {
+ public int changePassword(final User pUser, final PasswordWrapperDTO pPasswordWrapper) throws IllegalArgumentException {
+ int resultCode = HttpServletResponse.SC_NO_CONTENT;
+
if(pPasswordWrapper.getNewPassword().equals(pPasswordWrapper.getConfirmPassword())) {
// We fetch the connected user from database to get his hashed password
- final Optional userFromDb = userRepository.findById(pUser.getId());
- if(userFromDb.isPresent() && StringUtils.compareHash(pPasswordWrapper.getOldPassword(),
- userFromDb.get().getPassword())) {
- userFromDb.get().setPassword(StringUtils.hashPassword(pPasswordWrapper.getNewPassword()));
- userRepository.save(userFromDb.get());
- } else {
- pResponse.sendError(HttpServletResponse.SC_FORBIDDEN,
- "Le mot de passe saisi ne correspond pas au votre.");
- }
+ User user = userRepository.findById(pUser.getId())
+ .filter(u -> StringUtils.compareHash(pPasswordWrapper.getOldPassword(),
+ u.getPassword()))
+ .orElseThrow(IllegalArgumentException::new);
+
+ user.setPassword(StringUtils.hashPassword(pPasswordWrapper.getNewPassword()));
+ userRepository.save(user);
} else {
- pResponse.sendError(HttpServletResponse.SC_BAD_REQUEST,
- "Le mot de passe saisi ne correspond pas au votre.");
+ resultCode = HttpServletResponse.SC_BAD_REQUEST;
}
+
+ return resultCode;
}
public String uploadFile(final MultipartFile pFile, final HttpServletRequest pRequest,
@@ -93,7 +113,7 @@ public class AccountService {
return avatarFileName;
}
- public Resource loadAvatar(final String pAvatarFileName) {
+ public Optional loadAvatar(final String pAvatarFileName) {
return fileUploadService.loadAvatar(pAvatarFileName);
}
diff --git a/src/main/java/org/codiki/core/config/JpaConfiguration.java b/src/main/java/org/codiki/core/config/JpaConfiguration.java
index ebe40d7..631435d 100755
--- a/src/main/java/org/codiki/core/config/JpaConfiguration.java
+++ b/src/main/java/org/codiki/core/config/JpaConfiguration.java
@@ -12,25 +12,25 @@ import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@Configuration
-@EntityScan("org.codiki")
+@EntityScan("org.codiki.core.entities.persistence")
@EnableTransactionManagement
-@EnableJpaRepositories("org.codiki")
-@PropertySource("classpath:application.properties")
+@EnableJpaRepositories("org.codiki.core.repositories")
+@PropertySource("classpath:application.yml")
public class JpaConfiguration {
- @Value("${spring.datasource.driverClassName}")
+ @Value("${spring.jpa.datasource.driverClassName}")
private String driverClassName;
- @Value("${spring.datasource.url}")
+ @Value("${spring.jpa.datasource.url}")
private String url;
- @Value("${spring.datasource.username}")
+ @Value("${spring.jpa.datasource.username}")
private String username;
- @Value("${spring.datasource.password}")
+ @Value("${spring.jpa.datasource.password}")
private String password;
- @Bean(name="dataSource")
+ @Bean(name = "dataSource")
public DataSource getDataSource() {
return DataSourceBuilder.create()
.username(username)
diff --git a/src/main/java/org/codiki/core/config/WebConfiguration.java b/src/main/java/org/codiki/core/config/WebConfiguration.java
index 4ba98d7..9a971cf 100644
--- a/src/main/java/org/codiki/core/config/WebConfiguration.java
+++ b/src/main/java/org/codiki/core/config/WebConfiguration.java
@@ -1,7 +1,5 @@
package org.codiki.core.config;
-import java.io.IOException;
-
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
@@ -9,6 +7,8 @@ import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.resource.PathResourceResolver;
+import java.io.IOException;
+
/**
* This configuration class serves Angular app if the url isn't available in sprint REST module.
*
diff --git a/src/main/java/org/codiki/core/security/RestAuthenticationEntryPoint.java b/src/main/java/org/codiki/core/security/RestAuthenticationEntryPoint.java
index e5df6af..de0d1e2 100755
--- a/src/main/java/org/codiki/core/security/RestAuthenticationEntryPoint.java
+++ b/src/main/java/org/codiki/core/security/RestAuthenticationEntryPoint.java
@@ -22,7 +22,7 @@ import org.springframework.stereotype.Component;
public class RestAuthenticationEntryPoint implements AuthenticationEntryPoint {
@Override
public void commence(HttpServletRequest request, HttpServletResponse response,
- AuthenticationException authException) throws IOException, ServletException {
+ AuthenticationException authException) throws IOException {
response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized");
}
}
diff --git a/src/main/java/org/codiki/core/security/SecurityConfiguration.java b/src/main/java/org/codiki/core/security/SecurityConfiguration.java
index babebde..7f27cd6 100755
--- a/src/main/java/org/codiki/core/security/SecurityConfiguration.java
+++ b/src/main/java/org/codiki/core/security/SecurityConfiguration.java
@@ -23,13 +23,22 @@ public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
private static final String XSRF_REPOSITORY_HEADER_NAME = "X-XSRF-TOKEN";
- @Autowired
private CustomAuthenticationProvider authenticationProvider;
- @Autowired
private RestAuthenticationEntryPoint authenticationEntryPoint;
-
+
+ /**
+ * Constructor.
+ * @param authenticationProvider
+ * @param authenticationEntryPoint
+ */
+ public SecurityConfiguration(CustomAuthenticationProvider authenticationProvider,
+ RestAuthenticationEntryPoint authenticationEntryPoint) {
+ this.authenticationProvider = authenticationProvider;
+ this.authenticationEntryPoint = authenticationEntryPoint;
+ }
+
@Override
- protected void configure(AuthenticationManagerBuilder auth) throws Exception {
+ protected void configure(AuthenticationManagerBuilder auth) {
auth.authenticationProvider(authenticationProvider);
}
@@ -44,7 +53,9 @@ public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
.antMatchers(
"/api/images/uploadAvatar",
"/api/images/myImages",
- "/api/posts/myPosts"
+ "/api/posts/myPosts",
+ "/api/account/changePassword",
+ "/api/account/"
).authenticated()
.antMatchers(
HttpMethod.GET,
diff --git a/src/main/java/org/codiki/core/services/FileUploadService.java b/src/main/java/org/codiki/core/services/FileUploadService.java
index abf74df..e74f799 100755
--- a/src/main/java/org/codiki/core/services/FileUploadService.java
+++ b/src/main/java/org/codiki/core/services/FileUploadService.java
@@ -1,11 +1,15 @@
package org.codiki.core.services;
+import java.io.FileNotFoundException;
+import java.io.IOException;
import java.net.MalformedURLException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
+import java.util.Optional;
import org.apache.commons.lang.RandomStringUtils;
+import org.codiki.core.utils.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
@@ -61,27 +65,41 @@ public class FileUploadService {
}
}
- public Resource loadAvatar(final String pAvatarFileName) {
- return loadImage(pAvatarFileName, folderProfileImages);
- }
-
- public Resource loadImage(final String pImageLink) {
- return loadImage(pImageLink, folderImages);
- }
-
- private Resource loadImage(final String pImageLink, final String pFilePath) {
+ public Optional loadAvatar(final String pAvatarFileName) {
+ Optional result = Optional.empty();
+
try {
- Path imageFile = Paths.get(pFilePath).resolve(pImageLink);
- Resource imageResource = new UrlResource(imageFile.toUri());
- if(imageResource.exists() || imageResource.isReadable()) {
- return imageResource;
- } else {
- // TODO : Refactor exception
- throw new RuntimeException();
- }
- } catch(final MalformedURLException pEx) {
- // TODO : Refactor exception
- throw new RuntimeException();
+ result = loadImage(pAvatarFileName, folderImages);
+ } catch(final IOException ex) {
+ LOG.error("Unable to load avatar file {}", pAvatarFileName, ex);
}
+
+ return result;
+ }
+
+ public Optional loadImage(final String pImageLink) {
+ Optional result = Optional.empty();
+
+ try {
+ result = loadImage(pImageLink, folderImages);
+ } catch(final IOException ex) {
+ LOG.error("Unable to load image file {}", pImageLink, ex);
+ }
+
+ return result;
+ }
+
+ private Optional loadImage(final String pImageLink, final String pFilePath) throws IOException {
+ Optional result = Optional.empty();
+
+ Path imageFile = Paths.get(pFilePath).resolve(pImageLink);
+ Resource imageResource = new UrlResource(imageFile.toUri());
+ if(imageResource.exists() || imageResource.isReadable()) {
+ result = Optional.of(imageResource);
+ } else {
+ LOG.warn("Unknown file {}", imageFile);
+ }
+
+ return result;
}
}
diff --git a/src/main/java/org/codiki/core/services/UserService.java b/src/main/java/org/codiki/core/services/UserService.java
index a4e784d..c0a57e6 100755
--- a/src/main/java/org/codiki/core/services/UserService.java
+++ b/src/main/java/org/codiki/core/services/UserService.java
@@ -11,6 +11,8 @@ import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Service;
+import javax.swing.text.html.Option;
+
@Service
public class UserService {
private static final String MSG_BAD_CREDENTIALS = "Adresse email ou mot de passe incorrect.";
@@ -31,7 +33,13 @@ public class UserService {
}
public Optional getUserByPrincipal(final Principal pPrincipal) {
- SecurityContextHolder.getContext().getAuthentication();
- return userRepository.findByEmail(pPrincipal.getName());
+ Optional result = Optional.empty();
+
+ if(pPrincipal != null) {
+ SecurityContextHolder.getContext().getAuthentication();
+ result = userRepository.findByEmail(pPrincipal.getName());
+ }
+
+ return result;
}
}
diff --git a/src/main/java/org/codiki/images/ImageController.java b/src/main/java/org/codiki/images/ImageController.java
index e61169c..a9071de 100755
--- a/src/main/java/org/codiki/images/ImageController.java
+++ b/src/main/java/org/codiki/images/ImageController.java
@@ -1,45 +1,48 @@
package org.codiki.images;
-import java.io.IOException;
-import java.security.Principal;
-import java.util.List;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
import org.codiki.core.entities.dto.ImageDTO;
import org.codiki.core.utils.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.Resource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.security.Principal;
+import java.util.Collections;
+import java.util.List;
+import java.util.NoSuchElementException;
+
@RestController
@RequestMapping("/api/images")
public class ImageController {
private static final Logger LOG = LoggerFactory.getLogger(ImageController.class);
-
- @Autowired
+ /** Image service. */
private ImageService imageService;
-
- @PostMapping("/uploadAvatar")
+
+ /**
+ * Constructor.
+ * @param imageService Image service.
+ */
+ public ImageController(ImageService imageService) {
+ this.imageService = imageService;
+ }
+
+ @PostMapping("/uploadAvatar")
public ResponseEntity uploadAvatar(@RequestParam("file") MultipartFile pFile,
- final HttpServletRequest pRequest, final HttpServletResponse pResponse, final Principal pPrincipal) {
+ final HttpServletRequest pRequest,
+ final HttpServletResponse pResponse,
+ final Principal pPrincipal) {
LOG.debug("Upload avatar.");
ResponseEntity result;
try {
- result = ResponseEntity.status(HttpStatus.OK)
- .body(imageService.uploadAvatar(pFile, pRequest, pResponse, pPrincipal));
+ result = ResponseEntity.ok(imageService.uploadAvatar(pFile, pResponse, pPrincipal));
} catch(final Exception pEx) {
LOG.error("Error during avatar upload.", pEx);
result = ResponseEntity.status(HttpStatus.EXPECTATION_FAILED)
@@ -50,11 +53,14 @@ public class ImageController {
@PostMapping
public ResponseEntity uploadImage(@RequestParam("file") MultipartFile pFile,
- final HttpServletRequest pRequest, final HttpServletResponse pResponse, final Principal pPrincipal) {
- ResponseEntity result;
+ final HttpServletResponse pResponse,
+ final Principal pPrincipal) throws IOException {
+ ResponseEntity result = null;
try {
result = ResponseEntity.status(HttpStatus.OK)
- .body(imageService.uploadImage(pFile, pRequest, pResponse, pPrincipal));
+ .body(imageService.uploadImage(pFile, pPrincipal));
+ } catch(NoSuchElementException pEx) {
+ pResponse.sendError(HttpServletResponse.SC_UNAUTHORIZED);
} catch(final Exception pEx) {
result = ResponseEntity.status(HttpStatus.EXPECTATION_FAILED)
.body(StringUtils.concat("Fail to upload ", pFile.getOriginalFilename() + "."));
@@ -64,12 +70,16 @@ public class ImageController {
@GetMapping("/loadAvatar/{avatarFileName}")
public ResponseEntity loadAvatar(@PathVariable("avatarFileName") final String pAvatarFileName) {
- return buildLoadImageResponse(imageService.loadAvatar(pAvatarFileName));
+ return imageService.loadAvatar(pAvatarFileName)
+ .map(this::buildLoadImageResponse)
+ .orElse(ResponseEntity.notFound().build());
}
@GetMapping("/{imageLink}")
public ResponseEntity loadImage(@PathVariable("imageLink") final String pImageLink) {
- return buildLoadImageResponse(imageService.loadImage(pImageLink));
+ return imageService.loadImage(pImageLink)
+ .map(this::buildLoadImageResponse)
+ .orElse(ResponseEntity.notFound().build());
}
private ResponseEntity buildLoadImageResponse(final Resource pImageFile) {
@@ -79,13 +89,18 @@ public class ImageController {
}
@GetMapping("/myImages")
- public List myImages(final HttpServletRequest pRequest, final HttpServletResponse pResponse,
- final Principal pPrincipal) throws IOException {
- return imageService.getUserImages(pRequest, pResponse, pPrincipal);
+ public List myImages(final HttpServletResponse pResponse, final Principal pPrincipal) throws IOException {
+ List result = Collections.emptyList();
+ try {
+ result = imageService.getUserImages(pPrincipal);
+ } catch (NoSuchElementException ex) {
+ pResponse.sendError(HttpServletResponse.SC_UNAUTHORIZED);
+ }
+ return result;
}
@GetMapping("/{imageLink}/details")
- public ImageDTO getImageDetails(@PathVariable("imageLink") final String pImageLink, final HttpServletResponse pResponse) throws IOException {
- return imageService.getImageDetails(pImageLink, pResponse);
+ public ResponseEntity getImageDetails(@PathVariable("imageLink") final String pImageLink) {
+ return ResponseEntity.of(imageService.getImageDetails(pImageLink));
}
}
diff --git a/src/main/java/org/codiki/images/ImageService.java b/src/main/java/org/codiki/images/ImageService.java
index 0b3aaf8..55547f2 100755
--- a/src/main/java/org/codiki/images/ImageService.java
+++ b/src/main/java/org/codiki/images/ImageService.java
@@ -1,16 +1,5 @@
package org.codiki.images;
-import java.io.IOException;
-import java.security.Principal;
-import java.util.Date;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Optional;
-import java.util.stream.Collectors;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
import org.codiki.core.entities.dto.ImageDTO;
import org.codiki.core.entities.persistence.Image;
import org.codiki.core.entities.persistence.User;
@@ -18,27 +7,50 @@ import org.codiki.core.repositories.ImageRepository;
import org.codiki.core.repositories.UserRepository;
import org.codiki.core.services.FileUploadService;
import org.codiki.core.services.UserService;
-import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.Resource;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.security.Principal;
+import java.util.Date;
+import java.util.List;
+import java.util.NoSuchElementException;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
@Service
public class ImageService {
- @Autowired
+ /** User service. */
private UserService userService;
-
- @Autowired
+ /** User repository. */
private UserRepository userRepository;
-
- @Autowired
+ /** File upload service. */
private FileUploadService fileUploadService;
-
- @Autowired
+ /** Image repository. */
private ImageRepository imageRepository;
- public String uploadAvatar(final MultipartFile pFile, final HttpServletRequest pRequest,
- final HttpServletResponse pResponse, final Principal pPrincipal) throws IOException {
+ /**
+ * Constructor.
+ * @param userService User service.
+ * @param userRepository User repository.
+ * @param fileUploadService File upload service.
+ * @param imageRepository Image repository.
+ */
+ public ImageService(UserService userService,
+ UserRepository userRepository,
+ FileUploadService fileUploadService,
+ ImageRepository imageRepository) {
+ this.userService = userService;
+ this.userRepository = userRepository;
+ this.fileUploadService = fileUploadService;
+ this.imageRepository = imageRepository;
+ }
+
+ public String uploadAvatar(final MultipartFile pFile,
+ final HttpServletResponse pResponse,
+ final Principal pPrincipal) throws IOException {
final String avatarFileName = fileUploadService.uploadProfileImage(pFile);
final Optional connectedUser = userService.getUserByPrincipal(pPrincipal);
@@ -57,62 +69,44 @@ public class ImageService {
return avatarFileName;
}
- public String uploadImage(final MultipartFile pFile, final HttpServletRequest pRequest,
- final HttpServletResponse pResponse, final Principal pPrincipal) throws IOException {
+ public String uploadImage(final MultipartFile pFile, final Principal pPrincipal) {
final String imageFileName = fileUploadService.uploadImage(pFile);
-
- final Optional connectedUser = userService.getUserByPrincipal(pPrincipal);
- if(connectedUser.isPresent()) {
- final Optional userFromDb = userRepository.findById(connectedUser.get().getId());
- if(userFromDb.isPresent()) {
- final Image image = new Image();
- image.setLink(imageFileName);
- image.setDate(new Date());
- image.setUser(userFromDb.get());
- imageRepository.save(image);
- } else {
- pResponse.sendError(HttpServletResponse.SC_UNAUTHORIZED);
- }
- } else {
- pResponse.sendError(HttpServletResponse.SC_UNAUTHORIZED);
- }
-
+
+ userService.getUserByPrincipal(pPrincipal)
+ .map(User::getId)
+ .map(userRepository::findById)
+ .orElseThrow(NoSuchElementException::new)
+ .ifPresent(user -> {
+ final Image image = new Image();
+ image.setLink(imageFileName);
+ image.setDate(new Date());
+ image.setUser(user);
+ imageRepository.save(image);
+ });
+
return imageFileName;
}
- public Resource loadAvatar(final String pAvatarFileName) {
+ public Optional loadAvatar(final String pAvatarFileName) {
return fileUploadService.loadAvatar(pAvatarFileName);
}
- public Resource loadImage(final String pImageLink) {
+ public Optional loadImage(final String pImageLink) {
return fileUploadService.loadImage(pImageLink);
}
- public List getUserImages(final HttpServletRequest pRequest, final HttpServletResponse pResponse,
- final Principal pPrincipal) throws IOException {
- List result = new LinkedList<>();
-
- final Optional connectedUser = userService.getUserByPrincipal(pPrincipal);
- if(connectedUser.isPresent()) {
- result = imageRepository.getByUserId(connectedUser.get().getId())
- .stream().map(ImageDTO::new).collect(Collectors.toList());
- } else {
- pResponse.sendError(HttpServletResponse.SC_UNAUTHORIZED);
- }
-
- return result;
+ public List getUserImages(final Principal pPrincipal) {
+ return userService.getUserByPrincipal(pPrincipal)
+ .map(User::getId)
+ .map(imageRepository::getByUserId)
+ .orElseThrow(NoSuchElementException::new)
+ .stream()
+ .map(ImageDTO::new)
+ .collect(Collectors.toList());
}
- public ImageDTO getImageDetails(final String pImageLink, final HttpServletResponse pResponse) throws IOException {
- ImageDTO result = null;
-
- final Optional imageFromDb = imageRepository.findByLink(pImageLink);
- if(imageFromDb.isPresent()) {
- result = new ImageDTO(imageFromDb.get());
- } else {
- pResponse.sendError(HttpServletResponse.SC_NOT_FOUND);
- }
-
- return result;
+ public Optional getImageDetails(final String pImageLink) {
+ return imageRepository.findByLink(pImageLink)
+ .map(ImageDTO::new);
}
}
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
deleted file mode 100755
index 241ac54..0000000
--- a/src/main/resources/application.properties
+++ /dev/null
@@ -1,23 +0,0 @@
-#server.error.whitelabel.enabled=false
-spring.datasource.driverClassName=org.postgresql.Driver
-spring.datasource.url=jdbc:postgresql://localhost:5432/codiki
-spring.datasource.username=codiki
-spring.datasource.password=P@ssword
-
-# Disable feature detection by this undocumented parameter. Check the org.hibernate.engine.jdbc.internal.JdbcServiceImpl.configure method for more details.
-spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults = false
-
-# Because detection is disabled you have to set correct dialect by hand.
-spring.jpa.database-platform=org.hibernate.dialect.PostgreSQL9Dialect
-
-#logging.level.org.hibernate=DEBUG
-
-spring.servlet.multipart.max-file-size=104857600
-
-codiki.files.upload=/opt/codiki/pictures/tmp
-codiki.files.profile-images=/opt/codiki/pictures/profiles
-codiki.files.images=/opt/codiki/pictures/posts
-logging.level.org.codiki=DEBUG
-logging.path=/opt/codiki/logs
-logging.file=codiki
-cors.enabled=false
\ No newline at end of file
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
new file mode 100644
index 0000000..654b71d
--- /dev/null
+++ b/src/main/resources/application.yml
@@ -0,0 +1,43 @@
+app:
+ name: Codiki
+ description: A wiki application.
+
+codiki:
+ files:
+ upload: /opt/codiki/pictures/tmp
+ profile-images: /opt/codiki/pictures/profiles
+ images: /opt/codiki/pictures/posts
+
+cors.enabled=false:
+
+logging:
+ file: codiki
+ level:
+ org.codiki: DEBUG
+# org.hibernate: DEBUG
+ path: /opt/codiki/logs
+
+server:
+# use-forward-headers=true
+ port: 8080
+# ssl:
+# key-store: /home/takiguchi/Developpement/Java/codiki/keystore.p12
+# key-store-password: aaSrTBqpyRbwLhLi7iVwat2QWHCFQr3e4B9UkBpBPoUxH5UGdJpwenWAKZNTXwgww227CtBYUHogXivRdKpeyHPu2UafsPkGNuKgnDyzZfceFN5r3CxT2eTt
+# keyStoreType: PKCS12
+# keyAlias: tomcat
+# whitelabel:
+# enabled: false
+
+spring:
+ jpa:
+ datasource:
+ driverClassName: org.postgresql.Driver
+ url: jdbc:postgresql://localhost:5432/codiki
+ username: codiki
+ password: P@ssword
+ # Because detection is disabled you have to set correct dialect by hand.
+ database-platform: org.hibernate.dialect.PostgreSQL9Dialect
+ # Disable feature detection by this undocumented parameter.
+ # Check the org.hibernate.engine.jdbc.internal.JdbcServiceImpl.configure method for more details.
+ properties.hibernate.temp.use_jdbc_metadata_defaults: false
+ servlet.multipart.max-file-size: 104857600
diff --git a/src/main/resources/logback-spring.xml b/src/main/resources/logback-spring.xml
index 7727266..93c6dd9 100755
--- a/src/main/resources/logback-spring.xml
+++ b/src/main/resources/logback-spring.xml
@@ -1,6 +1,6 @@
-
+
System.out