From 16471e99624976b62e7b171ca84b3fbd7f8740b4 Mon Sep 17 00:00:00 2001 From: Takiguchi Date: Sat, 18 Jan 2020 15:01:55 +0100 Subject: [PATCH] Big code cleaning. --- .../java/org/codiki/CodikiApplication.java | 1 - .../org/codiki/account/AccountController.java | 6 +- .../org/codiki/account/AccountService.java | 62 +++----- .../codiki/categories/CategoryController.java | 43 ++--- .../core/config/CustomErrorController.java | 58 ------- .../codiki/core/config/JpaConfiguration.java | 18 +-- .../core/config/RobotsTxtController.java | 1 - .../org/codiki/core/entities/dto/View.java | 1 + .../core/entities/persistence/Category.java | 9 +- .../core/entities/persistence/Comment.java | 3 + .../entities/persistence/CommentHistory.java | 3 + .../core/entities/persistence/Image.java | 3 + .../core/entities/persistence/Post.java | 2 + .../entities/persistence/PostHistory.java | 3 + .../core/entities/persistence/Role.java | 2 + .../entities/persistence/SubCategory.java | 15 ++ .../core/entities/persistence/User.java | 2 + .../core/entities/persistence/Version.java | 3 + .../entities/persistence/VersionRevision.java | 3 + .../core/repositories/CategoryRepository.java | 7 +- .../org/codiki/core/security/CorsFilter.java | 3 +- .../CustomAuthenticationProvider.java | 9 +- .../RestAuthenticationEntryPoint.java | 10 +- .../core/security/SecurityConfiguration.java | 6 +- .../core/services/FileUploadService.java | 36 +++-- .../codiki/core/services/ParserService.java | 23 ++- .../org/codiki/core/services/UserService.java | 13 +- .../java/org/codiki/core/utils/DateUtils.java | 4 +- .../org/codiki/images/ImageController.java | 4 +- .../java/org/codiki/images/ImageService.java | 6 +- .../java/org/codiki/posts/PostController.java | 27 ++-- .../java/org/codiki/posts/PostService.java | 149 ++++++++---------- .../VersionRevisionController.java | 14 +- src/main/resources/application.yml | 3 +- src/main/sql/update_1.2.0.sql | 3 +- .../ts/src/assets/doc/codiki_user_manual.pdf | Bin 606895 -> 606822 bytes 36 files changed, 245 insertions(+), 310 deletions(-) delete mode 100644 src/main/java/org/codiki/core/config/CustomErrorController.java diff --git a/src/main/java/org/codiki/CodikiApplication.java b/src/main/java/org/codiki/CodikiApplication.java index c81769e..06c643f 100755 --- a/src/main/java/org/codiki/CodikiApplication.java +++ b/src/main/java/org/codiki/CodikiApplication.java @@ -8,7 +8,6 @@ import org.springframework.context.annotation.ComponentScan; @SpringBootApplication @EnableAutoConfiguration public class CodikiApplication { - public static void main(String[] args) { SpringApplication.run(CodikiApplication.class, args); } diff --git a/src/main/java/org/codiki/account/AccountController.java b/src/main/java/org/codiki/account/AccountController.java index c44870c..e716d05 100755 --- a/src/main/java/org/codiki/account/AccountController.java +++ b/src/main/java/org/codiki/account/AccountController.java @@ -101,8 +101,8 @@ public class AccountController { } @PutMapping("/") - public void update(@RequestBody final UserDTO pUser, final HttpServletRequest pRequest, - final HttpServletResponse pResponse, final Principal pPrincipal) throws IOException { - accountService.updateUser(pUser, pRequest, pResponse, pPrincipal); + public void update(@RequestBody UserDTO pUser, HttpServletResponse pResponse, Principal pPrincipal) + throws IOException { + accountService.updateUser(pUser, pResponse, pPrincipal); } } diff --git a/src/main/java/org/codiki/account/AccountService.java b/src/main/java/org/codiki/account/AccountService.java index e178dc9..43996c0 100755 --- a/src/main/java/org/codiki/account/AccountService.java +++ b/src/main/java/org/codiki/account/AccountService.java @@ -1,17 +1,5 @@ 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; -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.dto.PasswordWrapperDTO; import org.codiki.core.entities.dto.UserDTO; @@ -22,38 +10,30 @@ 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; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; 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.LinkedList; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + @Service public class AccountService { - /** Logger. */ - private static final Logger LOG = LoggerFactory.getLogger(FileUploadService.class); + private final CustomAuthenticationProvider authenticationProvider; + private final UserService userService; + private final UserRepository userRepository; + private final FileUploadService fileUploadService; + private final ImageRepository imageRepository; - private CustomAuthenticationProvider authenticationProvider; - - private UserService userService; - - private UserRepository userRepository; - - private FileUploadService fileUploadService; - - private ImageRepository imageRepository; - - /** - * Constructor. - * @param authenticationProvider - * @param userService - * @param userRepository - * @param fileUploadService - * @param imageRepository - */ + /** Constructor. */ public AccountService(CustomAuthenticationProvider authenticationProvider, UserService userService, UserRepository userRepository, @@ -93,8 +73,8 @@ public class AccountService { return resultCode; } - public String uploadFile(final MultipartFile pFile, final HttpServletRequest pRequest, - final HttpServletResponse pResponse, final Principal pPrincipal) throws IOException { + public String uploadFile(MultipartFile pFile, HttpServletResponse pResponse, Principal pPrincipal) + throws IOException { final String avatarFileName = fileUploadService.uploadProfileImage(pFile); final Optional connectedUser = userService.getUserByPrincipal(pPrincipal); @@ -117,8 +97,7 @@ public class AccountService { return fileUploadService.loadAvatar(pAvatarFileName); } - public List getUserImages(final HttpServletRequest pRequest, final HttpServletResponse pResponse, - final Principal pPrincipal) throws IOException { + public List getUserImages(HttpServletResponse pResponse, Principal pPrincipal) throws IOException { List result = new LinkedList<>(); final Optional connectedUser = userService.getUserByPrincipal(pPrincipal); @@ -132,7 +111,7 @@ public class AccountService { return result; } - public void signin(final User pUser, final HttpServletResponse pResponse) throws IOException { + public void signin(User pUser, HttpServletResponse pResponse) throws IOException { if(pUser.getName() == null || pUser.getEmail() == null || pUser.getPassword() == null || "".equals(pUser.getPassword().trim())) { pResponse.sendError(HttpServletResponse.SC_BAD_REQUEST); } else if(userRepository.findByEmail(pUser.getEmail()).isPresent()) { @@ -148,8 +127,7 @@ public class AccountService { } } - public void updateUser(final UserDTO pUser, final HttpServletRequest pRequest, - final HttpServletResponse pResponse, final Principal pPrincipal) throws IOException { + public void updateUser(UserDTO pUser, HttpServletResponse pResponse, Principal pPrincipal) throws IOException { final Optional connectedUserOpt = userService.getUserByPrincipal(pPrincipal); if(connectedUserOpt.isPresent()) { final User connectedUser = connectedUserOpt.get(); diff --git a/src/main/java/org/codiki/categories/CategoryController.java b/src/main/java/org/codiki/categories/CategoryController.java index 719735c..474038d 100755 --- a/src/main/java/org/codiki/categories/CategoryController.java +++ b/src/main/java/org/codiki/categories/CategoryController.java @@ -1,11 +1,7 @@ package org.codiki.categories; -import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; -import java.util.stream.StreamSupport; - -import org.codiki.core.entities.dto.CategoryDTO; +import com.fasterxml.jackson.annotation.JsonView; +import org.codiki.core.entities.dto.View; import org.codiki.core.entities.persistence.Category; import org.codiki.core.repositories.CategoryRepository; import org.springframework.beans.factory.annotation.Autowired; @@ -14,22 +10,33 @@ import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import javax.servlet.http.HttpServletResponse; +import java.util.List; + @RestController @RequestMapping("/api/categories") public class CategoryController { - - @Autowired - private CategoryRepository categoryRepository; - - @GetMapping("/{id}") - public CategoryDTO findById(@PathVariable("id") final Long pId) { - final Optional result = categoryRepository.findById(pId); - return result.isPresent() ? new CategoryDTO(result.get()) : null; + private final CategoryRepository categoryRepository; + + /** Constructor. */ + public CategoryController(CategoryRepository categoryRepository) { + this.categoryRepository = categoryRepository; } - + + @JsonView(View.CategoryDTO.class) + @GetMapping("/{id}") + public Category findById(@PathVariable("id") final Long pId, + HttpServletResponse response) { + return categoryRepository.findByIdWithSubCategories(pId) + .orElseGet(() -> { + response.setStatus(HttpServletResponse.SC_NOT_FOUND); + return null; + }); + } + + @JsonView(View.CategoryDTO.class) @GetMapping("/") - public List getAll() { - return StreamSupport.stream(categoryRepository.findAll().spliterator(), false) - .map(CategoryDTO::new).collect(Collectors.toList()); + public List getAll() { + return categoryRepository.findAllWithSubCategories(); } } diff --git a/src/main/java/org/codiki/core/config/CustomErrorController.java b/src/main/java/org/codiki/core/config/CustomErrorController.java deleted file mode 100644 index f5119c2..0000000 --- a/src/main/java/org/codiki/core/config/CustomErrorController.java +++ /dev/null @@ -1,58 +0,0 @@ -package org.codiki.core.config; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.web.servlet.error.ErrorAttributes; -import org.springframework.boot.web.servlet.error.ErrorController; -import org.springframework.util.Assert; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.context.request.RequestAttributes; -import org.springframework.web.context.request.ServletRequestAttributes; -import org.springframework.web.context.request.ServletWebRequest; - -import javax.servlet.http.HttpServletRequest; -import java.util.Map; - -/** - * Controller that catch errors from spring rest or spring security and others, and transform them to JSON response. - */ -@RestController -@RequestMapping("/error") -public class CustomErrorController implements ErrorController { - - private final ErrorAttributes errorAttributes; - - @Autowired - public CustomErrorController(ErrorAttributes errorAttributes) { - Assert.notNull(errorAttributes, "ErrorAttributes must not be null"); - this.errorAttributes = errorAttributes; - } - - @Override - public String getErrorPath() { - return "/error"; - } - - @RequestMapping - public Map error(HttpServletRequest request){ - Map body = getErrorAttributes(request, getTraceParameter(request)); - String trace = (String) body.get("trace"); - if(trace != null){ - String[] lines = trace.split("\n\t"); - body.put("trace", lines); - } - return body; - } - - private boolean getTraceParameter(HttpServletRequest request) { - String parameter = request.getParameter("trace"); - if (parameter == null) { - return false; - } - return !"false".equals(parameter.toLowerCase()); - } - - private Map getErrorAttributes(HttpServletRequest request, boolean includeStackTrace) { - return errorAttributes.getErrorAttributes(new ServletWebRequest(request), includeStackTrace); - } -} \ No newline at end of file diff --git a/src/main/java/org/codiki/core/config/JpaConfiguration.java b/src/main/java/org/codiki/core/config/JpaConfiguration.java index 631435d..6c11b28 100755 --- a/src/main/java/org/codiki/core/config/JpaConfiguration.java +++ b/src/main/java/org/codiki/core/config/JpaConfiguration.java @@ -17,21 +17,11 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; @EnableJpaRepositories("org.codiki.core.repositories") @PropertySource("classpath:application.yml") public class JpaConfiguration { - - @Value("${spring.jpa.datasource.driverClassName}") - private String driverClassName; - - @Value("${spring.jpa.datasource.url}") - private String url; - - @Value("${spring.jpa.datasource.username}") - private String username; - - @Value("${spring.jpa.datasource.password}") - private String password; - @Bean(name = "dataSource") - public DataSource getDataSource() { + public DataSource getDataSource(@Value("${spring.jpa.datasource.driverClassName}") String driverClassName, + @Value("${spring.jpa.datasource.url}") String url, + @Value("${spring.jpa.datasource.username}") String username, + @Value("${spring.jpa.datasource.password}") String password) { return DataSourceBuilder.create() .username(username) .password(password) diff --git a/src/main/java/org/codiki/core/config/RobotsTxtController.java b/src/main/java/org/codiki/core/config/RobotsTxtController.java index 2475f9b..c88530c 100644 --- a/src/main/java/org/codiki/core/config/RobotsTxtController.java +++ b/src/main/java/org/codiki/core/config/RobotsTxtController.java @@ -10,7 +10,6 @@ import java.io.IOException; @RestController public class RobotsTxtController { - private static final Logger LOG = LoggerFactory.getLogger(RobotsTxtController.class); @RequestMapping(value = "/robots.txt") diff --git a/src/main/java/org/codiki/core/entities/dto/View.java b/src/main/java/org/codiki/core/entities/dto/View.java index 44dcb9b..6598d2b 100755 --- a/src/main/java/org/codiki/core/entities/dto/View.java +++ b/src/main/java/org/codiki/core/entities/dto/View.java @@ -3,4 +3,5 @@ package org.codiki.core.entities.dto; public class View { public interface UserDTO {} public interface PostDTO {} + public interface CategoryDTO {} } diff --git a/src/main/java/org/codiki/core/entities/persistence/Category.java b/src/main/java/org/codiki/core/entities/persistence/Category.java index a8dd173..edf20c4 100755 --- a/src/main/java/org/codiki/core/entities/persistence/Category.java +++ b/src/main/java/org/codiki/core/entities/persistence/Category.java @@ -20,10 +20,12 @@ import org.codiki.core.entities.dto.CategoryDTO; import org.codiki.core.entities.dto.View; import com.fasterxml.jackson.annotation.JsonView; +import org.hibernate.annotations.Proxy; @Entity @Table(name="category") @Inheritance(strategy = InheritanceType.JOINED) +@Proxy(lazy = false) public class Category implements Serializable { private static final long serialVersionUID = 1L; @@ -32,10 +34,10 @@ public class Category implements Serializable { /* ******************* */ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - @JsonView(View.PostDTO.class) + @JsonView({View.PostDTO.class, View.CategoryDTO.class}) private Long id; - @JsonView(View.PostDTO.class) + @JsonView({View.PostDTO.class, View.CategoryDTO.class}) private String name; /* ******************* */ @@ -44,7 +46,8 @@ public class Category implements Serializable { @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "creator_id") protected User creator; - + + @JsonView({View.CategoryDTO.class}) @OneToMany(mappedBy = "mainCategory") private List listSubCategories; diff --git a/src/main/java/org/codiki/core/entities/persistence/Comment.java b/src/main/java/org/codiki/core/entities/persistence/Comment.java index de6bb23..65d23a7 100755 --- a/src/main/java/org/codiki/core/entities/persistence/Comment.java +++ b/src/main/java/org/codiki/core/entities/persistence/Comment.java @@ -1,5 +1,7 @@ package org.codiki.core.entities.persistence; +import org.hibernate.annotations.Proxy; + import java.io.Serializable; import java.util.Date; import java.util.List; @@ -19,6 +21,7 @@ import javax.persistence.TemporalType; @Entity @Table(name="comment") +@Proxy(lazy = false) public class Comment implements Serializable { private static final long serialVersionUID = 1L; diff --git a/src/main/java/org/codiki/core/entities/persistence/CommentHistory.java b/src/main/java/org/codiki/core/entities/persistence/CommentHistory.java index 8f314fd..224ced2 100755 --- a/src/main/java/org/codiki/core/entities/persistence/CommentHistory.java +++ b/src/main/java/org/codiki/core/entities/persistence/CommentHistory.java @@ -1,5 +1,7 @@ package org.codiki.core.entities.persistence; +import org.hibernate.annotations.Proxy; + import java.io.Serializable; import java.util.Date; @@ -17,6 +19,7 @@ import javax.persistence.TemporalType; @Entity @Table(name="comment_history") +@Proxy(lazy = false) public class CommentHistory implements Serializable { private static final long serialVersionUID = 1L; diff --git a/src/main/java/org/codiki/core/entities/persistence/Image.java b/src/main/java/org/codiki/core/entities/persistence/Image.java index 4de9f84..1677319 100755 --- a/src/main/java/org/codiki/core/entities/persistence/Image.java +++ b/src/main/java/org/codiki/core/entities/persistence/Image.java @@ -1,5 +1,7 @@ package org.codiki.core.entities.persistence; +import org.hibernate.annotations.Proxy; + import java.io.Serializable; import java.util.Date; @@ -16,6 +18,7 @@ import javax.persistence.TemporalType; @Entity @Table(name="image") +@Proxy(lazy = false) public class Image implements Serializable { private static final long serialVersionUID = 1L; diff --git a/src/main/java/org/codiki/core/entities/persistence/Post.java b/src/main/java/org/codiki/core/entities/persistence/Post.java index 173cc1b..1b9e3a8 100755 --- a/src/main/java/org/codiki/core/entities/persistence/Post.java +++ b/src/main/java/org/codiki/core/entities/persistence/Post.java @@ -25,9 +25,11 @@ import org.hibernate.annotations.Generated; import org.hibernate.annotations.GenerationTime; import com.fasterxml.jackson.annotation.JsonView; +import org.hibernate.annotations.Proxy; @Entity @Table(name="post") +@Proxy(lazy = false) public class Post implements Serializable { private static final long serialVersionUID = 1L; diff --git a/src/main/java/org/codiki/core/entities/persistence/PostHistory.java b/src/main/java/org/codiki/core/entities/persistence/PostHistory.java index 7af97b5..9121956 100755 --- a/src/main/java/org/codiki/core/entities/persistence/PostHistory.java +++ b/src/main/java/org/codiki/core/entities/persistence/PostHistory.java @@ -1,5 +1,7 @@ package org.codiki.core.entities.persistence; +import org.hibernate.annotations.Proxy; + import java.io.Serializable; import java.util.Date; @@ -17,6 +19,7 @@ import javax.persistence.TemporalType; @Entity @Table(name="post_history") +@Proxy(lazy = false) public class PostHistory implements Serializable { private static final long serialVersionUID = 1L; diff --git a/src/main/java/org/codiki/core/entities/persistence/Role.java b/src/main/java/org/codiki/core/entities/persistence/Role.java index 0140581..e2749a9 100755 --- a/src/main/java/org/codiki/core/entities/persistence/Role.java +++ b/src/main/java/org/codiki/core/entities/persistence/Role.java @@ -11,9 +11,11 @@ import javax.persistence.Table; import org.codiki.core.entities.dto.View; import com.fasterxml.jackson.annotation.JsonView; +import org.hibernate.annotations.Proxy; @Entity @Table(name="role") +@Proxy(lazy = false) public class Role implements Serializable { private static final long serialVersionUID = 1L; diff --git a/src/main/java/org/codiki/core/entities/persistence/SubCategory.java b/src/main/java/org/codiki/core/entities/persistence/SubCategory.java index d3d81b7..974fa91 100755 --- a/src/main/java/org/codiki/core/entities/persistence/SubCategory.java +++ b/src/main/java/org/codiki/core/entities/persistence/SubCategory.java @@ -1,5 +1,8 @@ package org.codiki.core.entities.persistence; +import com.fasterxml.jackson.annotation.JsonView; +import org.hibernate.annotations.Proxy; + import java.util.List; import javax.persistence.Entity; @@ -10,6 +13,7 @@ import javax.persistence.Table; @Entity @Table(name = "sub_category") +@Proxy(lazy = false) public class SubCategory extends Category { private static final long serialVersionUID = 1L; @@ -34,4 +38,15 @@ public class SubCategory extends Category { public List getListPosts() { return listPosts; } + + /** + * {@inheritDoc Category#getListSubCategories}. + * + * This getter is overrided to set {@link JsonView} annotation to avoid Lazy initialization for subcategories. + */ + @JsonView() + @Override + public List getListSubCategories() { + return super.getListSubCategories(); + } } diff --git a/src/main/java/org/codiki/core/entities/persistence/User.java b/src/main/java/org/codiki/core/entities/persistence/User.java index 3a26310..b252861 100755 --- a/src/main/java/org/codiki/core/entities/persistence/User.java +++ b/src/main/java/org/codiki/core/entities/persistence/User.java @@ -25,9 +25,11 @@ import org.hibernate.annotations.Generated; import org.hibernate.annotations.GenerationTime; import com.fasterxml.jackson.annotation.JsonView; +import org.hibernate.annotations.Proxy; @Entity @Table(name="`user`") +@Proxy(lazy = false) public class User implements Serializable { private static final long serialVersionUID = 1L; diff --git a/src/main/java/org/codiki/core/entities/persistence/Version.java b/src/main/java/org/codiki/core/entities/persistence/Version.java index d2230e0..27abd67 100755 --- a/src/main/java/org/codiki/core/entities/persistence/Version.java +++ b/src/main/java/org/codiki/core/entities/persistence/Version.java @@ -1,5 +1,7 @@ package org.codiki.core.entities.persistence; +import org.hibernate.annotations.Proxy; + import java.io.Serializable; import javax.persistence.Entity; @@ -16,6 +18,7 @@ import javax.persistence.Table; */ @Entity @Table(name="version") +@Proxy(lazy = false) public class Version implements Serializable { private static final long serialVersionUID = -8803744005903941330L; diff --git a/src/main/java/org/codiki/core/entities/persistence/VersionRevision.java b/src/main/java/org/codiki/core/entities/persistence/VersionRevision.java index c3230a9..6389c46 100755 --- a/src/main/java/org/codiki/core/entities/persistence/VersionRevision.java +++ b/src/main/java/org/codiki/core/entities/persistence/VersionRevision.java @@ -1,5 +1,7 @@ package org.codiki.core.entities.persistence; +import org.hibernate.annotations.Proxy; + import java.io.Serializable; import javax.persistence.Entity; @@ -13,6 +15,7 @@ import javax.persistence.Table; @Entity @Table(name="version_revision") +@Proxy(lazy = false) public class VersionRevision implements Serializable { private static final long serialVersionUID = 1837590467941917225L; diff --git a/src/main/java/org/codiki/core/repositories/CategoryRepository.java b/src/main/java/org/codiki/core/repositories/CategoryRepository.java index b6fc9a4..bbfb64b 100755 --- a/src/main/java/org/codiki/core/repositories/CategoryRepository.java +++ b/src/main/java/org/codiki/core/repositories/CategoryRepository.java @@ -1,14 +1,19 @@ package org.codiki.core.repositories; import java.util.List; +import java.util.Optional; import org.codiki.core.entities.persistence.Category; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; @Repository public interface CategoryRepository extends CrudRepository { - @Query("SELECT c FROM Category c JOIN FETCH c.listSubCategories") + @Query("SELECT c FROM Category c LEFT JOIN FETCH c.listSubCategories WHERE c.id = :id") + Optional findByIdWithSubCategories(@Param("id") Long id); + + @Query("SELECT DISTINCT(c) FROM Category c LEFT JOIN FETCH c.listSubCategories ORDER BY c.name") List findAllWithSubCategories(); } diff --git a/src/main/java/org/codiki/core/security/CorsFilter.java b/src/main/java/org/codiki/core/security/CorsFilter.java index 091a1ee..8b772bb 100755 --- a/src/main/java/org/codiki/core/security/CorsFilter.java +++ b/src/main/java/org/codiki/core/security/CorsFilter.java @@ -19,7 +19,7 @@ import org.springframework.stereotype.Component; public class CorsFilter implements Filter { @Override - public void init(FilterConfig filterConfig) throws ServletException { + public void init(FilterConfig filterConfig) { // Do nothing } @@ -40,5 +40,4 @@ public class CorsFilter implements Filter { public void destroy() { // Do nothing } - } diff --git a/src/main/java/org/codiki/core/security/CustomAuthenticationProvider.java b/src/main/java/org/codiki/core/security/CustomAuthenticationProvider.java index e0fb2ab..ec12585 100755 --- a/src/main/java/org/codiki/core/security/CustomAuthenticationProvider.java +++ b/src/main/java/org/codiki/core/security/CustomAuthenticationProvider.java @@ -1,23 +1,21 @@ package org.codiki.core.security; -import java.util.ArrayList; - import org.springframework.security.authentication.AuthenticationProvider; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.AuthenticationException; -import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Component; +import java.util.ArrayList; + @Component public class CustomAuthenticationProvider implements AuthenticationProvider { - @Override public Authentication authenticate(Authentication authentication) throws AuthenticationException { // Creation of the authentication bean with its roles Authentication auth = new UsernamePasswordAuthenticationToken(authentication.getName(), - authentication.getCredentials(), new ArrayList()); + authentication.getCredentials(), new ArrayList<>()); // Set the auth bean in spring security context SecurityContextHolder.getContext().setAuthentication(auth); @@ -29,5 +27,4 @@ public class CustomAuthenticationProvider implements AuthenticationProvider { public boolean supports(Class authentication) { return authentication.equals(UsernamePasswordAuthenticationToken.class); } - } diff --git a/src/main/java/org/codiki/core/security/RestAuthenticationEntryPoint.java b/src/main/java/org/codiki/core/security/RestAuthenticationEntryPoint.java index 65248cb..05d2ccc 100755 --- a/src/main/java/org/codiki/core/security/RestAuthenticationEntryPoint.java +++ b/src/main/java/org/codiki/core/security/RestAuthenticationEntryPoint.java @@ -1,15 +1,13 @@ package org.codiki.core.security; -import java.io.IOException; - -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - import org.springframework.security.core.AuthenticationException; import org.springframework.security.web.AuthenticationEntryPoint; import org.springframework.stereotype.Component; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + /** * Authentication entry point configured in * {@link SecurityConfiguration#configure(org.springframework.security.config.annotation.web.builders.HttpSecurity)} diff --git a/src/main/java/org/codiki/core/security/SecurityConfiguration.java b/src/main/java/org/codiki/core/security/SecurityConfiguration.java index 49dcc0b..d9cb2c7 100755 --- a/src/main/java/org/codiki/core/security/SecurityConfiguration.java +++ b/src/main/java/org/codiki/core/security/SecurityConfiguration.java @@ -26,11 +26,7 @@ public class SecurityConfiguration extends WebSecurityConfigurerAdapter { private CustomAuthenticationProvider authenticationProvider; private RestAuthenticationEntryPoint authenticationEntryPoint; - /** - * Constructor. - * @param authenticationProvider - * @param authenticationEntryPoint - */ + /** Constructor. */ public SecurityConfiguration(CustomAuthenticationProvider authenticationProvider, RestAuthenticationEntryPoint authenticationEntryPoint) { this.authenticationProvider = authenticationProvider; diff --git a/src/main/java/org/codiki/core/services/FileUploadService.java b/src/main/java/org/codiki/core/services/FileUploadService.java index fd9c2a1..49d19e0 100755 --- a/src/main/java/org/codiki/core/services/FileUploadService.java +++ b/src/main/java/org/codiki/core/services/FileUploadService.java @@ -1,15 +1,6 @@ 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; @@ -18,20 +9,31 @@ import org.springframework.core.io.UrlResource; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Optional; + @Service public class FileUploadService { /** Logger. */ private static final Logger LOG = LoggerFactory.getLogger(FileUploadService.class); /** Length of uploaded file names. */ private static final int DESTINATION_IMAGE_NAME_LENGTH = 30; - - @Value("${codiki.files.upload}") - private String folderUpload; - @Value("${codiki.files.profile-images}") - private String folderProfileImages; - @Value("${codiki.files.images}") - private String folderImages; - + + private final String folderUpload; + private final String folderProfileImages; + private final String folderImages; + + public FileUploadService(@Value("${codiki.files.upload}") String folderUpload, + @Value("${codiki.files.profile-images}") String folderProfileImages, + @Value("${codiki.files.images}")String folderImages) { + this.folderUpload = folderUpload; + this.folderProfileImages = folderProfileImages; + this.folderImages = folderImages; + } + /** * Builds the destination file name, which is a random string with 30 char * length. diff --git a/src/main/java/org/codiki/core/services/ParserService.java b/src/main/java/org/codiki/core/services/ParserService.java index 1533971..e9dbcbf 100755 --- a/src/main/java/org/codiki/core/services/ParserService.java +++ b/src/main/java/org/codiki/core/services/ParserService.java @@ -9,7 +9,6 @@ import org.springframework.stereotype.Service; @Service public class ParserService { - private static final String REG_CODE = "\\[code lg="([a-z]+)"\\](.*)\\[\\/code\\]\\n"; private static final String REG_CODE_REPLACE = "
\\2
"; private static final String REG_IMAGES = "\\[img src="([^\"| ]+)"( alt="([^\"| ]+)")? \\/\\]"; @@ -17,12 +16,12 @@ public class ParserService { private static final String REG_LINKS = "\\[link href="([^\"| ]+)" txt="([^\"| ]+)" \\/\\]"; private static final String REG_LINKS_REPLACE = "\\2"; - static final Pattern PATTERN_CODE; - static final Pattern PATTERN_CODE_REPLACE; - static final Pattern PATTERN_IMAGES; - static final Pattern PATTERN_IMAGES_REPLACE; - static final Pattern PATTERN_LINKS; - static final Pattern PATTERN_LINKS_REPLACE; + private static final Pattern PATTERN_CODE; + private static final Pattern PATTERN_CODE_REPLACE; + private static final Pattern PATTERN_IMAGES; + private static final Pattern PATTERN_IMAGES_REPLACE; + private static final Pattern PATTERN_LINKS; + private static final Pattern PATTERN_LINKS_REPLACE; static { PATTERN_CODE = Pattern.compile(REG_CODE); @@ -45,7 +44,7 @@ public class ParserService { return pSource.replace("£ø", "$"); } - protected String parseHeaders(final String pSource) { + String parseHeaders(final String pSource) { String result = pSource; for(int i = 1 ; i <= 3 ; i++) { result = parseHeadersHX(result, i); @@ -53,7 +52,7 @@ public class ParserService { return result; } - protected String parseHeadersHX(final String pSource, final int pNumHeader) { + String parseHeadersHX(final String pSource, final int pNumHeader) { String result = pSource; // (.*)(\[hX\](.*)\[\/hX\])+(.*) @@ -73,11 +72,11 @@ public class ParserService { return result; } - protected String parseBackSpaces(final String pSource) { + String parseBackSpaces(final String pSource) { return pSource.replaceAll("\r?\n", "
").replaceAll("\\[\\/code\\]", "[/code]\n"); } - protected String parseImages(final String pSource) { + String parseImages(final String pSource) { String result = pSource; Matcher matcher = PATTERN_IMAGES.matcher(result); @@ -96,7 +95,7 @@ public class ParserService { return result; } - protected String parseLinks(final String pSource) { + String parseLinks(final String pSource) { String result = pSource; Matcher matcher = PATTERN_LINKS.matcher(result); diff --git a/src/main/java/org/codiki/core/services/UserService.java b/src/main/java/org/codiki/core/services/UserService.java index c0a57e6..6a1fbb7 100755 --- a/src/main/java/org/codiki/core/services/UserService.java +++ b/src/main/java/org/codiki/core/services/UserService.java @@ -16,16 +16,19 @@ import javax.swing.text.html.Option; @Service public class UserService { private static final String MSG_BAD_CREDENTIALS = "Adresse email ou mot de passe incorrect."; - - @Autowired - private UserRepository userRepository; - + + private final UserRepository userRepository; + + public UserService(UserRepository userRepository) { + this.userRepository = userRepository; + } + public User checkCredentials(final String email, final String password) throws BadCredentialsException { final Optional optUser = userRepository.findByEmail(email); // If no user exists with the given email of if the given password doesn't match // to the user password, we throw an exception. - if(!optUser.isPresent() || !StringUtils.compareHash(password, optUser.get().getPassword())) { + if(optUser.isEmpty() || !StringUtils.compareHash(password, optUser.get().getPassword())) { throw new BadCredentialsException(MSG_BAD_CREDENTIALS); } diff --git a/src/main/java/org/codiki/core/utils/DateUtils.java b/src/main/java/org/codiki/core/utils/DateUtils.java index 794df71..754cf3a 100755 --- a/src/main/java/org/codiki/core/utils/DateUtils.java +++ b/src/main/java/org/codiki/core/utils/DateUtils.java @@ -7,7 +7,7 @@ import java.util.Date; import java.util.Locale; public class DateUtils { - public static final String FORMAT_DEFAULT = "dd/MM/yyyy HH:mm:ss"; + private static final String FORMAT_DEFAULT = "dd/MM/yyyy HH:mm:ss"; public static Date parseDate(String pSource, String pPattern) throws ParseException { Date result = null; @@ -27,7 +27,7 @@ public class DateUtils { return getSimpleDateFormat(FORMAT_DEFAULT).format(pDate); } - public static SimpleDateFormat getSimpleDateFormat(String pPattern) { + private static SimpleDateFormat getSimpleDateFormat(String pPattern) { SimpleDateFormat result = new SimpleDateFormat(pPattern, Locale.FRENCH); result.setLenient(false); return result; diff --git a/src/main/java/org/codiki/images/ImageController.java b/src/main/java/org/codiki/images/ImageController.java index ceb441a..6c3cbb7 100755 --- a/src/main/java/org/codiki/images/ImageController.java +++ b/src/main/java/org/codiki/images/ImageController.java @@ -52,9 +52,7 @@ public class ImageController { } @PostMapping - public ResponseEntity uploadImage(@RequestParam("file") MultipartFile pFile, - final HttpServletResponse pResponse, - final Principal pPrincipal) throws IOException { + public ResponseEntity uploadImage(@RequestParam("file") MultipartFile pFile, final Principal pPrincipal) { ResponseEntity result; try { result = ResponseEntity.status(HttpStatus.OK) diff --git a/src/main/java/org/codiki/images/ImageService.java b/src/main/java/org/codiki/images/ImageService.java index 39e7d81..afb5ea1 100755 --- a/src/main/java/org/codiki/images/ImageService.java +++ b/src/main/java/org/codiki/images/ImageService.java @@ -37,7 +37,7 @@ public class ImageService { * @param fileUploadService File upload service. * @param imageRepository Image repository. */ - public ImageService(UserService userService, + ImageService(UserService userService, UserRepository userRepository, FileUploadService fileUploadService, ImageRepository imageRepository) { @@ -86,11 +86,11 @@ public class ImageService { return fileUploadService.loadAvatar(pAvatarFileName); } - public Optional loadImage(final String pImageLink) { + Optional loadImage(final String pImageLink) { return fileUploadService.loadImage(pImageLink); } - public List getUserImages(final Principal pPrincipal) { + List getUserImages(final Principal pPrincipal) { return imageRepository.getByUserId(userService.getUserByPrincipal(pPrincipal) .map(User::getId) .orElseThrow(NoSuchElementException::new)) diff --git a/src/main/java/org/codiki/posts/PostController.java b/src/main/java/org/codiki/posts/PostController.java index 6110cef..04481f1 100755 --- a/src/main/java/org/codiki/posts/PostController.java +++ b/src/main/java/org/codiki/posts/PostController.java @@ -8,7 +8,6 @@ import java.util.Optional; import java.util.stream.Collectors; import java.util.stream.StreamSupport; -import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.codiki.core.entities.dto.PostDTO; @@ -19,7 +18,6 @@ import org.codiki.core.repositories.PostRepository; import org.codiki.core.services.ParserService; import org.codiki.core.services.UserService; import org.codiki.core.utils.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.PageRequest; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; @@ -35,7 +33,6 @@ import com.fasterxml.jackson.annotation.JsonView; @RestController @RequestMapping("/api/posts") public class PostController { - private static final int LIMIT_POSTS_HOME = 20; /** Service to parse post content. */ private ParserService parserService; @@ -112,14 +109,11 @@ public class PostController { @JsonView(View.PostDTO.class) @GetMapping("/myPosts") - public List getMyPosts(final HttpServletRequest pRequest, final HttpServletResponse pResponse, - final Principal pPrincipal) throws IOException { + public List getMyPosts(final HttpServletResponse pResponse, final Principal pPrincipal) throws IOException { List result = new LinkedList<>(); final Optional connectedUser = userService.getUserByPrincipal(pPrincipal); if(connectedUser.isPresent()) { -// result = postRepository.getByCreator(connectedUser.get().getId()) -// .stream().map(PostDTO::new).collect(Collectors.toList()); result = postRepository.getByCreator(connectedUser.get().getId()); } else { pResponse.sendError(HttpServletResponse.SC_UNAUTHORIZED); @@ -142,20 +136,21 @@ public class PostController { @JsonView(View.PostDTO.class) @PostMapping("/") - public Post insert(@RequestBody final PostDTO pPost, final HttpServletRequest pRequest, - final HttpServletResponse pResponse, final Principal pPrincipal) { - return postService.insert(pPost, pRequest, pResponse, pPrincipal).orElse(null); + public Post insert(@RequestBody final Post pPost, + final HttpServletResponse pResponse, + final Principal pPrincipal) { + pResponse.setStatus(postService.insert(pPost, pPrincipal)); + return pPost; } @PutMapping("/") - public void update(@RequestBody final Post pPost, final HttpServletRequest pRequest, - final HttpServletResponse pResponse, final Principal pPrincipal) throws IOException { - postService.update(pPost, pRequest, pResponse, pPrincipal); + public void update(@RequestBody final Post pPost, + final HttpServletResponse pResponse, final Principal pPrincipal) throws IOException { + postService.update(pPost, pResponse, pPrincipal); } @DeleteMapping("/{postKey}") - public void delete(@PathVariable("postKey") final String pPostKey, final HttpServletRequest pRequest, - final HttpServletResponse pResponse, final Principal pPrincipal) throws IOException { - postService.delete(pPostKey, pRequest, pResponse, pPrincipal); + public void delete(@PathVariable("postKey") final String pPostKey, final Principal pPrincipal) { + postService.delete(pPostKey, pPrincipal); } } diff --git a/src/main/java/org/codiki/posts/PostService.java b/src/main/java/org/codiki/posts/PostService.java index 1c67f49..0a19081 100755 --- a/src/main/java/org/codiki/posts/PostService.java +++ b/src/main/java/org/codiki/posts/PostService.java @@ -1,72 +1,59 @@ package org.codiki.posts; -import java.io.IOException; -import java.security.Principal; -import java.util.Collections; -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.apache.commons.lang3.StringUtils; import org.codiki.core.entities.business.SearchEntity; -import org.codiki.core.entities.dto.PostDTO; import org.codiki.core.entities.persistence.Category; import org.codiki.core.entities.persistence.Post; import org.codiki.core.entities.persistence.User; import org.codiki.core.repositories.CategoryRepository; import org.codiki.core.repositories.PostRepository; +import org.codiki.core.services.IllegalAccessException; import org.codiki.core.services.UserService; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.security.Principal; +import java.util.*; +import java.util.stream.Collectors; + @Service public class PostService { - static final int SCORE_TITLE = 50; - - static final int SCORE_DESCRIPTION = 5; - - static final int SCORE_TEXT = 1; - - static final int SCORE_CATEGORY = 30; - - static final int SCORE_AUTHOR_NAME = 40; - - static final int SCORE_AUTHOR_EMAIL = 40; + private static final int SCORE_TITLE = 50; + private static final int SCORE_DESCRIPTION = 5; + private static final int SCORE_TEXT = 1; + private static final int SCORE_CATEGORY = 30; + private static final int SCORE_AUTHOR_NAME = 40; + private static final int SCORE_AUTHOR_EMAIL = 40; - @Autowired - private PostRepository postRepository; - - @Autowired - private CategoryRepository categoryRepository; - - @Autowired - private UserService userService; - - public Optional insert(final PostDTO pPost, final HttpServletRequest pRequest, - final HttpServletResponse pResponse, final Principal pPrincipal) { - Optional result = Optional.empty(); - - final Optional user = userService.getUserByPrincipal(pPrincipal); - - if(user.isPresent()) { - final Post postToSave = new Post(pPost); - postToSave.setAuthor(user.get()); - postRepository.save(postToSave); - result = Optional.of(postToSave); - } else { - pResponse.setStatus(HttpServletResponse.SC_UNAUTHORIZED); - } - - return result; + private final PostRepository postRepository; + + private final CategoryRepository categoryRepository; + + private final UserService userService; + + /** Constructor. */ + public PostService(PostRepository postRepository, + CategoryRepository categoryRepository, + UserService userService) { + this.postRepository = postRepository; + this.categoryRepository = categoryRepository; + this.userService = userService; + } + + public int insert(final Post pPost, final Principal pPrincipal) { + return userService.getUserByPrincipal(pPrincipal) + .map(user -> { + pPost.setCreationDate(new Date()); + pPost.setAuthor(user); + postRepository.save(pPost); + return HttpServletResponse.SC_OK; + }) + .orElse(HttpServletResponse.SC_UNAUTHORIZED); } - public void update(final Post pPost, final HttpServletRequest pRequest, - final HttpServletResponse pResponse, final Principal pPrincipal) throws IOException { + public void update(final Post pPost, final HttpServletResponse pResponse, final Principal pPrincipal) + throws IOException { final Optional connectedUser = userService.getUserByPrincipal(pPrincipal); if(connectedUser.isPresent() && connectedUser.get().getKey().equals(pPost.getAuthor().getKey())) { @@ -96,23 +83,19 @@ public class PostService { } } - public void delete(final String pPostKey, final HttpServletRequest pRequest, - final HttpServletResponse pResponse, final Principal pPrincipal) throws IOException { - final Optional postToDelete = postRepository.getByKey(pPostKey); - if(postToDelete.isPresent()) { - final Optional connectedUser = userService.getUserByPrincipal(pPrincipal); - if(connectedUser.isPresent()) { - if(connectedUser.get().getKey().equals(postToDelete.get().getAuthor().getKey())) { - postRepository.delete(postToDelete.get()); - } else { - pResponse.sendError(HttpServletResponse.SC_FORBIDDEN); - } - } else { - pResponse.sendError(HttpServletResponse.SC_UNAUTHORIZED); - } - } else { - pResponse.sendError(HttpServletResponse.SC_NOT_FOUND); + public void delete(final String pPostKey, final Principal pPrincipal){ + String userKey = userService.getUserByPrincipal(pPrincipal) + .map(User::getKey) + .orElseThrow(NoSuchElementException::new); + + Post postToDelete = postRepository.getByKey(pPostKey) + .orElseThrow(NoSuchElementException::new); + + if(postToDelete.getAuthor() == null || !postToDelete.getAuthor().getKey().equals(userKey)) { + throw new IllegalAccessException(); } + + postRepository.delete(postToDelete); } public List search(String pSearchCriteria) { @@ -123,12 +106,12 @@ public class PostService { calculateScore(e, criteriasArray); listSearchEntities.add(e); }); - Collections.sort(listSearchEntities, (e1, e2) -> e2.getScore() - e1.getScore()); + listSearchEntities.sort((e1, e2) -> e2.getScore() - e1.getScore()); return listSearchEntities.stream().map(SearchEntity::getPost).collect(Collectors.toList()); } - void calculateScore(final SearchEntity searchPost, final String[] pCriteriasArray) { + private void calculateScore(final SearchEntity searchPost, final String[] pCriteriasArray) { for(final String criteria : pCriteriasArray) { String formattedCriteria = formatForComp(criteria); @@ -141,41 +124,41 @@ public class PostService { } } - String formatForComp(final String pElem) { + private String formatForComp(final String pElem) { return StringUtils.stripAccents(pElem.toLowerCase()); } - - void calculateScoreForTitle(final SearchEntity pSearchPost, final String pCriteria) { + + private void calculateScoreForTitle(final SearchEntity pSearchPost, final String pCriteria) { if(formatForComp(pSearchPost.getPost().getTitle()).contains(pCriteria)) { pSearchPost.increaseScore(SCORE_TITLE); } } - - void calculateScoreForDescription(final SearchEntity pSearchPost, final String pCriteria) { + + private void calculateScoreForDescription(final SearchEntity pSearchPost, final String pCriteria) { final int criteriaOccurence = StringUtils.countMatches(formatForComp(pSearchPost.getPost().getDescription()), pCriteria); pSearchPost.increaseScore(criteriaOccurence * SCORE_DESCRIPTION); } - - void calculateScoreForText(final SearchEntity pSearchPost, final String pCriteria) { + + private void calculateScoreForText(final SearchEntity pSearchPost, final String pCriteria) { final int criteriaOccurence = StringUtils.countMatches(formatForComp(pSearchPost.getPost().getText()), pCriteria); pSearchPost.increaseScore(criteriaOccurence * SCORE_TEXT); } - - void calculateScoreForCategory(final SearchEntity pSearchPost, final String pCriteria) { + + private void calculateScoreForCategory(final SearchEntity pSearchPost, final String pCriteria) { if(formatForComp(pSearchPost.getPost().getCategory().getName()).contains(pCriteria)) { pSearchPost.increaseScore(SCORE_CATEGORY); } } - - void calculateScoreForAuthorName(final SearchEntity pSearchPost, final String pCriteria) { + + private void calculateScoreForAuthorName(final SearchEntity pSearchPost, final String pCriteria) { if(formatForComp(pSearchPost.getPost().getAuthor().getName()).contains(pCriteria)) { pSearchPost.increaseScore(SCORE_AUTHOR_NAME); } } - - void calculateScoreForAuthorEmail(final SearchEntity pSearchPost, final String pCriteria) { + + private void calculateScoreForAuthorEmail(final SearchEntity pSearchPost, final String pCriteria) { if(formatForComp(pSearchPost.getPost().getAuthor().getEmail()).contains(pCriteria)) { pSearchPost.increaseScore(SCORE_AUTHOR_EMAIL); } diff --git a/src/main/java/org/codiki/versionrevisions/VersionRevisionController.java b/src/main/java/org/codiki/versionrevisions/VersionRevisionController.java index a8bea5f..4d3f948 100755 --- a/src/main/java/org/codiki/versionrevisions/VersionRevisionController.java +++ b/src/main/java/org/codiki/versionrevisions/VersionRevisionController.java @@ -13,13 +13,15 @@ import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/api/versionrevisions") public class VersionRevisionController { + private final VersionRevisionRepository repository; + private final VersionRepository versionRepository; + + public VersionRevisionController(VersionRevisionRepository repository, + VersionRepository versionRepository) { + this.repository = repository; + this.versionRepository = versionRepository; + } - @Autowired - private VersionRevisionRepository repository; - - @Autowired - private VersionRepository versionRepository; - @GetMapping("/versions") public Iterable getVersions() { return versionRepository.findAllOrderByNumber(); diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 0dd5724..dc61dfe 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -40,8 +40,7 @@ spring: url: jdbc:postgresql://localhost:5432/codiki username: codiki password: P@ssword - # TODO: Delete all Lazy relationships and set following property to false -# open-in-view: false + open-in-view: false # 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. diff --git a/src/main/sql/update_1.2.0.sql b/src/main/sql/update_1.2.0.sql index ced5465..a2b4cef 100755 --- a/src/main/sql/update_1.2.0.sql +++ b/src/main/sql/update_1.2.0.sql @@ -3,4 +3,5 @@ INSERT INTO version (number) VALUES ('1.2.0'); INSERT INTO version_revision (version_id, text, bugfix) VALUES (4, 'Migration vers Angular 8.2.', FALSE), (4, 'Migration vers Java 11.', FALSE), -(4, 'Corrections mineures et améliorations de code.', TRUE); +(4, 'Corrections mineures et améliorations de code.', TRUE), +(4, 'Ajout d''un gestionnaire de notifications pop-ups.', FALSE); diff --git a/src/main/ts/src/assets/doc/codiki_user_manual.pdf b/src/main/ts/src/assets/doc/codiki_user_manual.pdf index 618cc8521e93e6ae5cd795f234c58c62a93bd8da..bea669283ba4db3aaf7296ef32a160722a8cda03 100644 GIT binary patch delta 45106 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