summaryrefslogtreecommitdiffhomepage
path: root/backend/src/main/java/com
diff options
context:
space:
mode:
Diffstat (limited to 'backend/src/main/java/com')
-rw-r--r--backend/src/main/java/com/blog/web/controllers/ArticleController.java6
-rw-r--r--backend/src/main/java/com/blog/web/models/Article.java18
-rw-r--r--backend/src/main/java/com/blog/web/models/UserEntity.java22
-rw-r--r--backend/src/main/java/com/blog/web/repository/ArticleRepository.java5
-rw-r--r--backend/src/main/java/com/blog/web/services/ArticleService.java8
-rw-r--r--backend/src/main/java/com/blog/web/services/impl/ArticleServiceImpl.java44
-rw-r--r--backend/src/main/java/com/blog/web/services/impl/UserServiceImpl.java9
7 files changed, 60 insertions, 52 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 e7890b0..fef8c63 100644
--- a/backend/src/main/java/com/blog/web/controllers/ArticleController.java
+++ b/backend/src/main/java/com/blog/web/controllers/ArticleController.java
@@ -12,8 +12,8 @@ import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;
import java.time.LocalDateTime;
-import java.util.List;
import java.util.Optional;
+import java.util.Set;
@CrossOrigin(origins = "http://localhost:5173", allowCredentials = "true", allowedHeaders = "*")
@RestController
@@ -41,8 +41,8 @@ public class ArticleController {
}
@GetMapping("/articles")
- public List<ArticlePublicDto> listArticles(@RequestParam(value = "search", required = false) Optional<String> search) {
- final List<ArticlePublicDto> articles;
+ public Set<ArticlePublicDto> listArticles(@RequestParam(value = "search", required = false) Optional<String> search) {
+ final Set<ArticlePublicDto> articles;
if (search.isPresent()) {
articles = articleService.searchPublicArticles(search.get());
} else {
diff --git a/backend/src/main/java/com/blog/web/models/Article.java b/backend/src/main/java/com/blog/web/models/Article.java
index ed4ac1c..58fcca3 100644
--- a/backend/src/main/java/com/blog/web/models/Article.java
+++ b/backend/src/main/java/com/blog/web/models/Article.java
@@ -6,12 +6,13 @@ import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;
import java.time.LocalDateTime;
+import java.util.Optional;
@Entity
public class Article {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
- private Long id;
+ private final long id;
private String title;
private String photoUrl;
private String content;
@@ -23,7 +24,7 @@ public class Article {
@JoinColumn(name = "created_by", nullable = false)
private UserEntity createdBy;
- public Article(Long id, String title, String photoUrl, String content, UserEntity createdBy, LocalDateTime createdOn, LocalDateTime updatedOn) {
+ public Article(long id, String title, String photoUrl, String content, UserEntity createdBy, LocalDateTime createdOn, LocalDateTime updatedOn) {
this.id = id;
this.title = title;
this.photoUrl = photoUrl;
@@ -33,11 +34,8 @@ public class Article {
this.updatedOn = updatedOn;
}
- public Article() {
- }
-
public Article(ArticleDto articleDto) {
- this.id = articleDto.getId();
+ this.id = Optional.ofNullable(articleDto.getId()).orElse(0L);
this.title = articleDto.getTitle();
this.photoUrl = articleDto.getPhotoUrl();
this.content = articleDto.getContent();
@@ -46,12 +44,12 @@ public class Article {
this.updatedOn = articleDto.getUpdatedOn();
}
- public Long getId() {
- return id;
+ public Article() {
+ this.id = 0;
}
- public void setId(Long id) {
- this.id = id;
+ public long getId() {
+ return id;
}
public String getTitle() {
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 089b8bc..f74308b 100644
--- a/backend/src/main/java/com/blog/web/models/UserEntity.java
+++ b/backend/src/main/java/com/blog/web/models/UserEntity.java
@@ -1,12 +1,11 @@
package com.blog.web.models;
import jakarta.persistence.*;
+import jakarta.validation.constraints.NotEmpty;
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;
@@ -15,13 +14,18 @@ import java.util.stream.Collectors;
public class UserEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
- private long id;
+ private final long id = 0;
+ @NotEmpty
+ @Column(unique = true)
private String username;
+ @NotEmpty
+ @Column(unique = true)
private String email;
+ @NotEmpty
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 Set<Role> roles = new HashSet<>();
+ private final Set<Role> roles = new HashSet<>();
public UserEntity(String username, String email, String password, HashSet<Role> roles) {
this.username = username;
@@ -39,17 +43,13 @@ public class UserEntity {
}
public User toSecurityUser() {
- return new User(this.getEmail(), this.getPassword(), this.getRoles().stream().map((role) -> new SimpleGrantedAuthority(role.getName())).collect(Collectors.toList()));
+ return new User(this.getEmail(), this.password, this.getRoles().stream().map((role) -> new SimpleGrantedAuthority(role.getName())).collect(Collectors.toList()));
}
public long getId() {
return id;
}
- public void setId(long id) {
- this.id = id;
- }
-
public String getUsername() {
return username;
}
@@ -66,10 +66,6 @@ public class UserEntity {
this.email = email;
}
- public String getPassword() {
- return password;
- }
-
public void setPassword(String password) {
this.password = password;
}
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 e48f156..1ddb394 100644
--- a/backend/src/main/java/com/blog/web/repository/ArticleRepository.java
+++ b/backend/src/main/java/com/blog/web/repository/ArticleRepository.java
@@ -4,10 +4,9 @@ import com.blog.web.models.Article;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
-import java.util.HashSet;
-import java.util.List;
+import java.util.Set;
public interface ArticleRepository extends JpaRepository<Article, Long> {
@Query("SELECT a from Article a WHERE a.title LIKE CONCAT('%', :search, '%')")
- List<Article> searchArticles(String search);
+ Set<Article> searchArticles(String search);
}
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 4bf3028..5ec0175 100644
--- a/backend/src/main/java/com/blog/web/services/ArticleService.java
+++ b/backend/src/main/java/com/blog/web/services/ArticleService.java
@@ -4,11 +4,11 @@ import com.blog.web.dto.ArticleDto;
import com.blog.web.dto.ArticlePublicDto;
import com.blog.web.models.Article;
-import java.util.List;
import java.util.Optional;
+import java.util.Set;
public interface ArticleService {
- List<ArticlePublicDto> findAllArticles();
+ Set<ArticlePublicDto> findAllArticles();
Optional<Article> saveArticle(ArticleDto article);
@@ -18,9 +18,7 @@ public interface ArticleService {
boolean delete(long articleId);
- //List<ArticleDto> searchArticles(String search);
-
ArticlePublicDto findArticlePublicById(long articleId);
- List<ArticlePublicDto> searchPublicArticles(String search);
+ Set<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 04cc8be..871a2bf 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
@@ -14,6 +14,7 @@ import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Optional;
+import java.util.Set;
import java.util.stream.Collectors;
import static com.blog.web.mappers.ArticleMapper.*;
@@ -32,9 +33,9 @@ public class ArticleServiceImpl implements ArticleService {
@Override
- public List<ArticlePublicDto> findAllArticles() {
+ public Set<ArticlePublicDto> findAllArticles() {
List<Article> articles = articleRepository.findAll();
- return articles.stream().map(ArticleMapper::mapToArticlePublicDto).collect(Collectors.toList());
+ return articles.stream().map(ArticleMapper::mapToArticlePublicDto).collect(Collectors.toSet());
}
@Override
@@ -52,28 +53,35 @@ public class ArticleServiceImpl implements ArticleService {
@Override
public Optional<ArticleDto> findArticleById(long articleId) {
final Optional<Article> otpArticle = articleRepository.findById(articleId);
- if(otpArticle.isEmpty()) {
+ if (otpArticle.isEmpty()) {
return Optional.empty();
- }
- else {
+ } else {
return Optional.of(mapToArticleDto(otpArticle.get()));
}
}
@Override
public void updateArticle(ArticleDto newArticle) {
- if(newArticle == null) { return; }
+ if (newArticle == null) {
+ return;
+ }
final Optional<ArticleDto> optExistingArticle = this.findArticleById(newArticle.getId());
- if(optExistingArticle.isEmpty()) { return; } // cant find article, give up
+ if (optExistingArticle.isEmpty()) {
+ return;
+ } // cant find article, give up
final ArticleDto existingArticle = optExistingArticle.get();
Long ownerId = existingArticle.getUserId();
final Optional<UserEntity> optUser = userService.getLoggedInUser();
- if (optUser.isEmpty()) { return; } // not logged in, not allowed to edit
+ if (optUser.isEmpty()) {
+ return;
+ } // not logged in, not allowed to edit
final UserEntity user = optUser.get();
Long userId = user.getId();
- if (!ownerId.equals(userId)) { return; } // logged in a different user, not allowed to edit
+ if (!ownerId.equals(userId)) {
+ return;
+ } // logged in a different user, not allowed to edit
final Article article = mapToArticle(newArticle);
article.setCreatedBy(user);
@@ -83,16 +91,22 @@ public class ArticleServiceImpl implements ArticleService {
@Override
public boolean delete(long articleId) {
final Optional<ArticleDto> optArticle = this.findArticleById(articleId);
- if(optArticle.isEmpty()) { return false; } // cant find article, give up
+ if (optArticle.isEmpty()) {
+ return false;
+ } // cant find article, give up
final ArticleDto article = optArticle.get();
String ownerId = article.getUsername();
final Optional<UserEntity> optUser = userService.getLoggedInUser();
- if (optUser.isEmpty()) { return false; } // not logged in, not allowed to delete
+ 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
+ if (!ownerId.equals(userId)) {
+ return false;
+ } // logged in a different user, not allowed to delete
else {
articleRepository.deleteById(articleId);
return true;
@@ -105,8 +119,8 @@ public class ArticleServiceImpl implements ArticleService {
}
@Override
- public List<ArticlePublicDto> searchPublicArticles(String search) {
- List<Article> articles = articleRepository.searchArticles(search);
- return articles.stream().map(article -> mapToArticlePublicDto(article)).collect(Collectors.toList());
+ public Set<ArticlePublicDto> searchPublicArticles(String search) {
+ Set<Article> articles = articleRepository.searchArticles(search);
+ return articles.stream().map(article -> mapToArticlePublicDto(article)).collect(Collectors.toSet());
}
}
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 b39d15e..9ca8b0b 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,7 +10,8 @@ import com.blog.web.services.UserService;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
-import java.util.*;
+import java.util.HashSet;
+import java.util.Optional;
@Service
public class UserServiceImpl implements UserService {
@@ -26,7 +27,9 @@ public class UserServiceImpl implements UserService {
@Override
public void saveUser(RegistrationDto registrationDto) {
- final HashSet<Role> roles = (HashSet<Role>) Set.of(roleRepository.findByName("User").orElse(new Role()));
+ final HashSet<Role> roles = new HashSet<Role>() {{
+ add(roleRepository.findByName("User").get());
+ }};
userRepository.save(new UserEntity(registrationDto.getUsername(), registrationDto.getEmail(), passwordEncoder.encode(registrationDto.getPassword()), roles));
}
@@ -43,7 +46,7 @@ public class UserServiceImpl implements UserService {
public Optional<UserEntity> getLoggedInUser() {
final Optional<UserEntity> user;
Optional<String> optUsername = Optional.ofNullable(SecurityUtil.getSessionUser());
- if(optUsername.isPresent()) {
+ if (optUsername.isPresent()) {
user = this.findByUsername(optUsername.get());
} else {
user = Optional.empty();