summaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com')
-rw-r--r--src/main/java/com/blog/web/controllers/ArticleController.java6
-rw-r--r--src/main/java/com/blog/web/controllers/AuthController.java64
-rw-r--r--src/main/java/com/blog/web/dto/RegistrationDto.java18
-rw-r--r--src/main/java/com/blog/web/models/Role.java26
-rw-r--r--src/main/java/com/blog/web/models/UserEntity.java32
-rw-r--r--src/main/java/com/blog/web/repository/RoleRepository.java8
-rw-r--r--src/main/java/com/blog/web/repository/UserRepository.java9
-rw-r--r--src/main/java/com/blog/web/services/ArticleService.java1
-rw-r--r--src/main/java/com/blog/web/services/UserService.java13
-rw-r--r--src/main/java/com/blog/web/services/impl/UserServiceImpl.java46
10 files changed, 220 insertions, 3 deletions
diff --git a/src/main/java/com/blog/web/controllers/ArticleController.java b/src/main/java/com/blog/web/controllers/ArticleController.java
index 0cdff15..fc18dd7 100644
--- a/src/main/java/com/blog/web/controllers/ArticleController.java
+++ b/src/main/java/com/blog/web/controllers/ArticleController.java
@@ -20,7 +20,7 @@ public class ArticleController {
this.articleService = articleService;
}
- @GetMapping("/")
+ @GetMapping("/articles")
public String listArticles(Model model) {
List<ArticleDto> articles = articleService.findAllArticles();
model.addAttribute("articles", articles);
@@ -85,8 +85,8 @@ public class ArticleController {
return "index";
}
- @GetMapping("/articles")
+ @GetMapping("/")
public String getArticles() {
- return "redirect:/";
+ return "redirect:/articles";
}
}
diff --git a/src/main/java/com/blog/web/controllers/AuthController.java b/src/main/java/com/blog/web/controllers/AuthController.java
new file mode 100644
index 0000000..bb7cb0d
--- /dev/null
+++ b/src/main/java/com/blog/web/controllers/AuthController.java
@@ -0,0 +1,64 @@
+package com.blog.web.controllers;
+
+import com.blog.web.dto.RegistrationDto;
+import com.blog.web.models.UserEntity;
+import com.blog.web.services.UserService;
+import jakarta.validation.Valid;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.PostMapping;
+
+@Controller
+public class AuthController {
+ private UserService userService;
+
+ public AuthController(UserService userService) {
+ this.userService = userService;
+ }
+
+ @GetMapping("/login")
+ public String loginPage() {
+ return "auth/login";
+ }
+
+ @GetMapping("/register")
+ public String getRegisterForm(Model model) {
+ RegistrationDto user = new RegistrationDto();
+ model.addAttribute("user", user);
+ return "auth/register";
+ }
+
+ @PostMapping("/register/save")
+ public String register(@Valid @ModelAttribute("user")RegistrationDto user,
+ BindingResult result,
+ Model model) {
+ UserEntity existingUserEmail = userService.findByEmail(user.getEmail());
+ if(
+ existingUserEmail != null &&
+ existingUserEmail.getEmail() != null &&
+ !existingUserEmail.getEmail().isEmpty()
+ ) {
+ result.rejectValue("email", "There is already a user with this email");
+ }
+
+ UserEntity existingUsername = userService.findByUsername(user.getUsername());
+ if(
+ existingUsername != null &&
+ existingUsername.getUsername() != null &&
+ !existingUsername.getUsername().isEmpty()
+ )
+ {
+ result.rejectValue("username", "There is already a user with this username");
+ }
+
+ if(result.hasErrors()) {
+ model.addAttribute("user", user);
+ return "register";
+ }
+ userService.saveUser(user);
+ return "redirect:/articles?success";
+ }
+}
diff --git a/src/main/java/com/blog/web/dto/RegistrationDto.java b/src/main/java/com/blog/web/dto/RegistrationDto.java
new file mode 100644
index 0000000..1682c5c
--- /dev/null
+++ b/src/main/java/com/blog/web/dto/RegistrationDto.java
@@ -0,0 +1,18 @@
+package com.blog.web.dto;
+
+import jakarta.validation.constraints.Min;
+import jakarta.validation.constraints.NotEmpty;
+import lombok.Builder;
+import lombok.Data;
+import lombok.Getter;
+
+@Data
+public class RegistrationDto {
+ private Long id;
+ @NotEmpty
+ private String username;
+ @NotEmpty
+ private String email;
+ @NotEmpty
+ private String password;
+}
diff --git a/src/main/java/com/blog/web/models/Role.java b/src/main/java/com/blog/web/models/Role.java
new file mode 100644
index 0000000..b04c9d8
--- /dev/null
+++ b/src/main/java/com/blog/web/models/Role.java
@@ -0,0 +1,26 @@
+package com.blog.web.models;
+
+import jakarta.persistence.*;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import org.apache.catalina.User;
+
+import java.sql.Array;
+import java.util.ArrayList;
+import java.util.List;
+
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+@Entity(name = "roles")
+public class Role {
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long id;
+ private String name;
+ @ManyToMany(mappedBy = "roles")
+ private List<UserEntity> users = new ArrayList<>();
+}
diff --git a/src/main/java/com/blog/web/models/UserEntity.java b/src/main/java/com/blog/web/models/UserEntity.java
new file mode 100644
index 0000000..2dfb036
--- /dev/null
+++ b/src/main/java/com/blog/web/models/UserEntity.java
@@ -0,0 +1,32 @@
+package com.blog.web.models;
+
+import jakarta.persistence.*;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+@Entity(name = "users")
+// Named UserEntity to prevent conflicts with Java User object
+public class UserEntity {
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long id;
+ private String username;
+ private String email;
+ 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 List<Role> roles = new ArrayList<>();
+}
diff --git a/src/main/java/com/blog/web/repository/RoleRepository.java b/src/main/java/com/blog/web/repository/RoleRepository.java
new file mode 100644
index 0000000..08c9ef4
--- /dev/null
+++ b/src/main/java/com/blog/web/repository/RoleRepository.java
@@ -0,0 +1,8 @@
+package com.blog.web.repository;
+
+import com.blog.web.models.Role;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface RoleRepository extends JpaRepository<Role, Long> {
+ Role findByName(String name);
+}
diff --git a/src/main/java/com/blog/web/repository/UserRepository.java b/src/main/java/com/blog/web/repository/UserRepository.java
new file mode 100644
index 0000000..af67f58
--- /dev/null
+++ b/src/main/java/com/blog/web/repository/UserRepository.java
@@ -0,0 +1,9 @@
+package com.blog.web.repository;
+
+import com.blog.web.models.UserEntity;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface UserRepository extends JpaRepository<UserEntity, Long> {
+ UserEntity findByEmail(String email);
+ UserEntity findByUsername(String username);
+}
diff --git a/src/main/java/com/blog/web/services/ArticleService.java b/src/main/java/com/blog/web/services/ArticleService.java
index 9cab70b..2c1e9f4 100644
--- a/src/main/java/com/blog/web/services/ArticleService.java
+++ b/src/main/java/com/blog/web/services/ArticleService.java
@@ -5,6 +5,7 @@ import com.blog.web.models.Article;
import java.util.List;
+
public interface ArticleService {
List<ArticleDto> findAllArticles();
diff --git a/src/main/java/com/blog/web/services/UserService.java b/src/main/java/com/blog/web/services/UserService.java
new file mode 100644
index 0000000..8515cb1
--- /dev/null
+++ b/src/main/java/com/blog/web/services/UserService.java
@@ -0,0 +1,13 @@
+package com.blog.web.services;
+
+import com.blog.web.dto.RegistrationDto;
+import com.blog.web.models.UserEntity;
+
+
+public interface UserService {
+ void saveUser(RegistrationDto registrationDto);
+
+ UserEntity findByEmail(String email);
+
+ UserEntity findByUsername(String username);
+}
diff --git a/src/main/java/com/blog/web/services/impl/UserServiceImpl.java b/src/main/java/com/blog/web/services/impl/UserServiceImpl.java
new file mode 100644
index 0000000..06dbc22
--- /dev/null
+++ b/src/main/java/com/blog/web/services/impl/UserServiceImpl.java
@@ -0,0 +1,46 @@
+package com.blog.web.services.impl;
+
+import com.blog.web.dto.RegistrationDto;
+import com.blog.web.models.Role;
+import com.blog.web.models.UserEntity;
+import com.blog.web.repository.RoleRepository;
+import com.blog.web.repository.UserRepository;
+import com.blog.web.services.UserService;
+import org.springframework.stereotype.Service;
+
+import java.util.Arrays;
+
+@Service
+public class UserServiceImpl implements UserService {
+ private UserRepository userRepository;
+ private RoleRepository roleRepository;
+
+ public UserServiceImpl(UserRepository userRepository, RoleRepository roleRepository) {
+ this.userRepository = userRepository;
+ this.roleRepository = roleRepository;
+ }
+
+ @Override
+ public void saveUser(RegistrationDto registrationDto) {
+ UserEntity user = new UserEntity();
+ user.setUsername(registrationDto.getUsername());
+ user.setEmail(registrationDto.getEmail());
+ // this is an unsafe way to store passwords in production
+ // it is left this way only because this is a practice project
+ user.setPassword(registrationDto.getPassword());
+
+ Role role = roleRepository.findByName("User");
+ user.setRoles(Arrays.asList(role));
+ userRepository.save(user);
+ }
+
+ @Override
+ public UserEntity findByEmail(String email) {
+ return userRepository.findByEmail(email);
+ }
+
+ @Override
+ public UserEntity findByUsername(String username) {
+ return userRepository.findByUsername(username);
+ }
+}