summaryrefslogtreecommitdiffhomepage
path: root/backend/src/main/java/com
diff options
context:
space:
mode:
authorrealtradam <[email protected]>2024-07-27 20:20:29 -0400
committerrealtradam <[email protected]>2024-07-27 20:20:29 -0400
commitc366e70e95156d2637f82116312770e12a9aad32 (patch)
treef1724ea1945f492e73cc1e98606d86c61c98f0be /backend/src/main/java/com
parent9148f894e02bf43775e18fc873a9deab5c36220c (diff)
downloadspring-blog-c366e70e95156d2637f82116312770e12a9aad32.tar.gz
spring-blog-c366e70e95156d2637f82116312770e12a9aad32.zip
implement delete functionality
Diffstat (limited to 'backend/src/main/java/com')
-rw-r--r--backend/src/main/java/com/blog/web/controllers/ArticleController.java41
-rw-r--r--backend/src/main/java/com/blog/web/controllers/AuthController.java2
-rw-r--r--backend/src/main/java/com/blog/web/models/UserEntity.java19
-rw-r--r--backend/src/main/java/com/blog/web/repository/ArticleRepository.java3
-rw-r--r--backend/src/main/java/com/blog/web/security/CorsConfig.java1
-rw-r--r--backend/src/main/java/com/blog/web/services/ArticleService.java7
-rw-r--r--backend/src/main/java/com/blog/web/services/impl/ArticleServiceImpl.java52
-rw-r--r--backend/src/main/java/com/blog/web/services/impl/UserServiceImpl.java22
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;
}