diff options
| author | realtradam <[email protected]> | 2024-07-27 20:20:29 -0400 |
|---|---|---|
| committer | realtradam <[email protected]> | 2024-07-27 20:20:29 -0400 |
| commit | c366e70e95156d2637f82116312770e12a9aad32 (patch) | |
| tree | f1724ea1945f492e73cc1e98606d86c61c98f0be /backend/src/main/java | |
| parent | 9148f894e02bf43775e18fc873a9deab5c36220c (diff) | |
| download | spring-blog-c366e70e95156d2637f82116312770e12a9aad32.tar.gz spring-blog-c366e70e95156d2637f82116312770e12a9aad32.zip | |
implement delete functionality
Diffstat (limited to 'backend/src/main/java')
8 files changed, 65 insertions, 82 deletions
diff --git a/backend/src/main/java/com/blog/web/controllers/ArticleController.java b/backend/src/main/java/com/blog/web/controllers/ArticleController.java index 0429084..b321cd2 100644 --- a/backend/src/main/java/com/blog/web/controllers/ArticleController.java +++ b/backend/src/main/java/com/blog/web/controllers/ArticleController.java @@ -12,7 +12,8 @@ import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; import java.time.LocalDateTime; -import java.util.HashSet; +import java.util.List; +import java.util.Optional; @CrossOrigin(origins = "http://localhost:5173", allowCredentials = "true", allowedHeaders = "*") @RestController @@ -40,12 +41,12 @@ public class ArticleController { } @GetMapping("/articles") - public HashSet<ArticlePublicDto> listArticles(@RequestParam(value = "search", required = false) String search) { - HashSet<ArticlePublicDto> articles; - if (search != null) { - articles = articleService.searchPublicArticles(search); + public List<ArticlePublicDto> listArticles(@RequestParam(value = "search", required = false) Optional<String> search) { + final List<ArticlePublicDto> articles; + if (search.isPresent()) { + articles = articleService.searchPublicArticles(search.get()); } else { - articles = new HashSet<ArticlePublicDto>(articleService.findAllArticles()); + articles = articleService.findAllArticles(); } return articles; } @@ -53,26 +54,15 @@ public class ArticleController { @GetMapping("/article/{articleId}") public ArticlePublicDto showArticle(@PathVariable("articleId") long articleId, Model model) { ArticlePublicDto articlePublicDto = articleService.findArticlePublicById(articleId); - //model.addAttribute("article", articlePublicDto); - //UserEntity user = userService.getLoggedInUser().orElse(new UserEntity()); - //model.addAttribute("user", user); - //return "articles/show"; return articlePublicDto; } - /*@GetMapping("/articles/new") - public String createArticleForm(Model model) { - model.addAttribute("user", userService.getLoggedInUser().orElse(new UserEntity())); - model.addAttribute("article", new Article()); - return "articles/new"; - }*/ - @PostMapping("/article/new") public String saveArticle(@Valid @ModelAttribute("article") ArticleDto articleDto, BindingResult result) { // if non-authenticated in user tries to create an article // redirect them to login page - UserEntity user = userService.getLoggedInUser().orElse(null); - if (user == null) { + Optional<UserEntity> user = userService.getLoggedInUser(); + if (user.isEmpty()) { return "redirect:/login"; } else if (!result.hasErrors()) { articleService.saveArticle(articleDto); @@ -84,18 +74,7 @@ public class ArticleController { @GetMapping("/articles/delete/{articleId}") public String deleteArticle(@PathVariable("articleId") Long articleId) { articleService.delete(articleId); - return "redirect:/articles"; - } - - @GetMapping("/articles/edit/{articleId}") - public String editArticleForm(@PathVariable("articleId") long articleId, Model model) { - UserEntity user = userService.getLoggedInUser().orElse(null); - if (user != null) { - model.addAttribute("user", user); - ArticleDto articleDto = articleService.findArticleById(articleId); - model.addAttribute("article", articleDto); - } - return "articles/edit"; + return ""; } @PostMapping("/articles/edit/{articleId}") diff --git a/backend/src/main/java/com/blog/web/controllers/AuthController.java b/backend/src/main/java/com/blog/web/controllers/AuthController.java index 4da346b..039393c 100644 --- a/backend/src/main/java/com/blog/web/controllers/AuthController.java +++ b/backend/src/main/java/com/blog/web/controllers/AuthController.java @@ -40,7 +40,7 @@ public class AuthController { @GetMapping("/profile") public UserPublicDto profile() { - final UserEntity user = userService.getLoggedInUser().orElse(null); + final UserEntity user = userService.getLoggedInUser().orElse(new UserEntity()); return new UserPublicDto(user); } } diff --git a/backend/src/main/java/com/blog/web/models/UserEntity.java b/backend/src/main/java/com/blog/web/models/UserEntity.java index bf45b21..089b8bc 100644 --- a/backend/src/main/java/com/blog/web/models/UserEntity.java +++ b/backend/src/main/java/com/blog/web/models/UserEntity.java @@ -5,7 +5,9 @@ import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.userdetails.User; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; import java.util.stream.Collectors; @Entity(name = "users") @@ -19,7 +21,18 @@ public class UserEntity { private String password; @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL) @JoinTable(name = "user_roles", joinColumns = {@JoinColumn(name = "user_id", referencedColumnName = "id")}, inverseJoinColumns = {@JoinColumn(name = "role_id", referencedColumnName = "id")}) - private final List<Role> roles = new ArrayList<>(); + private Set<Role> roles = new HashSet<>(); + + public UserEntity(String username, String email, String password, HashSet<Role> roles) { + this.username = username; + this.email = email; + this.password = password; + setRoles(roles); + } + + public UserEntity() { + + } public boolean equals(UserEntity user) { return this.id == user.getId(); @@ -61,11 +74,11 @@ public class UserEntity { this.password = password; } - public List<Role> getRoles() { + public Set<Role> getRoles() { return roles; } - public void setRoles(List<Role> roles) { + public void setRoles(Set<Role> roles) { this.roles.clear(); this.roles.addAll(roles); } diff --git a/backend/src/main/java/com/blog/web/repository/ArticleRepository.java b/backend/src/main/java/com/blog/web/repository/ArticleRepository.java index f40eada..e48f156 100644 --- a/backend/src/main/java/com/blog/web/repository/ArticleRepository.java +++ b/backend/src/main/java/com/blog/web/repository/ArticleRepository.java @@ -5,8 +5,9 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import java.util.HashSet; +import java.util.List; public interface ArticleRepository extends JpaRepository<Article, Long> { @Query("SELECT a from Article a WHERE a.title LIKE CONCAT('%', :search, '%')") - HashSet<Article> searchArticles(String search); + List<Article> searchArticles(String search); } diff --git a/backend/src/main/java/com/blog/web/security/CorsConfig.java b/backend/src/main/java/com/blog/web/security/CorsConfig.java index 55db15a..19b20f5 100644 --- a/backend/src/main/java/com/blog/web/security/CorsConfig.java +++ b/backend/src/main/java/com/blog/web/security/CorsConfig.java @@ -8,7 +8,6 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class CorsConfig { - // Configures CORS for the application @Bean public WebMvcConfigurer corsConfigurer() { return new WebMvcConfigurer() { diff --git a/backend/src/main/java/com/blog/web/services/ArticleService.java b/backend/src/main/java/com/blog/web/services/ArticleService.java index 1e50df0..4bf3028 100644 --- a/backend/src/main/java/com/blog/web/services/ArticleService.java +++ b/backend/src/main/java/com/blog/web/services/ArticleService.java @@ -4,7 +4,6 @@ import com.blog.web.dto.ArticleDto; import com.blog.web.dto.ArticlePublicDto; import com.blog.web.models.Article; -import java.util.HashSet; import java.util.List; import java.util.Optional; @@ -13,15 +12,15 @@ public interface ArticleService { Optional<Article> saveArticle(ArticleDto article); - ArticleDto findArticleById(long articleId); + Optional<ArticleDto> findArticleById(long articleId); void updateArticle(ArticleDto articleDto); - boolean delete(Long articleId); + boolean delete(long articleId); //List<ArticleDto> searchArticles(String search); ArticlePublicDto findArticlePublicById(long articleId); - HashSet<ArticlePublicDto> searchPublicArticles(String search); + List<ArticlePublicDto> searchPublicArticles(String search); } diff --git a/backend/src/main/java/com/blog/web/services/impl/ArticleServiceImpl.java b/backend/src/main/java/com/blog/web/services/impl/ArticleServiceImpl.java index aaf1044..2f9de6c 100644 --- a/backend/src/main/java/com/blog/web/services/impl/ArticleServiceImpl.java +++ b/backend/src/main/java/com/blog/web/services/impl/ArticleServiceImpl.java @@ -12,7 +12,6 @@ import com.blog.web.services.ArticleService; import com.blog.web.services.UserService; import org.springframework.stereotype.Service; -import java.util.HashSet; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; @@ -51,54 +50,55 @@ public class ArticleServiceImpl implements ArticleService { } @Override - public ArticleDto findArticleById(long articleId) { - Article article = articleRepository.findById(articleId).get(); - return mapToArticleDto(article); + public Optional<ArticleDto> findArticleById(long articleId) { + final Optional<Article> otpArticle = articleRepository.findById(articleId); + if(otpArticle.isEmpty()) { + return Optional.empty(); + } + else { + return Optional.of(mapToArticleDto(otpArticle.get())); + } } @Override public void updateArticle(ArticleDto articleDto) { - String username = SecurityUtil.getSessionUser(); - UserEntity user = userRepository.findByUsername(username).orElse(null); + final String username = SecurityUtil.getSessionUser(); + final UserEntity user = userRepository.findByUsername(username).orElse(null); if (user == null) { return; } - Article article = mapToArticle(articleDto); + final Article article = mapToArticle(articleDto); article.setCreatedBy(user); articleRepository.save(article); } @Override - public boolean delete(Long articleId) { - final UserEntity user = userService.getLoggedInUser().orElse(null); - if (user == null) { - return false; - } - String userId = user.getUsername(); - ArticleDto article = this.findArticleById(articleId); + public boolean delete(long articleId) { + final Optional<ArticleDto> optArticle = this.findArticleById(articleId); + if(optArticle.isEmpty()) { return false; } // cant find article, give up + final ArticleDto article = optArticle.get(); String ownerId = article.getUsername(); - if (ownerId.equals(userId)) { + + final Optional<UserEntity> optUser = userService.getLoggedInUser(); + if (optUser.isEmpty()) { return false; } // not logged in, not allowed to delete + final UserEntity user = optUser.get(); + String userId = user.getUsername(); + + if (!ownerId.equals(userId)) { return false; } // logged in a different user, not allowed to delete + else { articleRepository.deleteById(articleId); return true; - } else { - return false; } } - //@Override - //public List<ArticleDto> searchArticles(String search) { - // List<Article> articles = articleRepository.searchArticles(search); - // return articles.stream().map(article -> mapToArticleDto(article)).collect(Collectors.toList()); - //} - @Override public ArticlePublicDto findArticlePublicById(long articleId) { return new ArticlePublicDto(articleRepository.findById(articleId).get()); } @Override - public HashSet<ArticlePublicDto> searchPublicArticles(String search) { - HashSet<Article> articles = articleRepository.searchArticles(search); - return articles.stream().map(article -> mapToArticlePublicDto(article)).collect(Collectors.toCollection(HashSet::new)); + public List<ArticlePublicDto> searchPublicArticles(String search) { + List<Article> articles = articleRepository.searchArticles(search); + return articles.stream().map(article -> mapToArticlePublicDto(article)).collect(Collectors.toList()); } } diff --git a/backend/src/main/java/com/blog/web/services/impl/UserServiceImpl.java b/backend/src/main/java/com/blog/web/services/impl/UserServiceImpl.java index 9c3eaa8..b39d15e 100644 --- a/backend/src/main/java/com/blog/web/services/impl/UserServiceImpl.java +++ b/backend/src/main/java/com/blog/web/services/impl/UserServiceImpl.java @@ -10,9 +10,7 @@ import com.blog.web.services.UserService; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; -import java.util.Arrays; -import java.util.List; -import java.util.Optional; +import java.util.*; @Service public class UserServiceImpl implements UserService { @@ -28,14 +26,8 @@ public class UserServiceImpl implements UserService { @Override public void saveUser(RegistrationDto registrationDto) { - UserEntity user = new UserEntity(); - user.setUsername(registrationDto.getUsername()); - user.setEmail(registrationDto.getEmail()); - user.setPassword(passwordEncoder.encode(registrationDto.getPassword())); - - final Role role = roleRepository.findByName("User").orElse(new Role()); - user.setRoles(List.of(role)); - userRepository.save(user); + final HashSet<Role> roles = (HashSet<Role>) Set.of(roleRepository.findByName("User").orElse(new Role())); + userRepository.save(new UserEntity(registrationDto.getUsername(), registrationDto.getEmail(), passwordEncoder.encode(registrationDto.getPassword()), roles)); } @Override @@ -50,11 +42,11 @@ public class UserServiceImpl implements UserService { public Optional<UserEntity> getLoggedInUser() { final Optional<UserEntity> user; - String username = SecurityUtil.getSessionUser(); - if (username != null) { - user = this.findByUsername(username); + Optional<String> optUsername = Optional.ofNullable(SecurityUtil.getSessionUser()); + if(optUsername.isPresent()) { + user = this.findByUsername(optUsername.get()); } else { - user = Optional.of(new UserEntity()); + user = Optional.empty(); } return user; } |
