diff --git a/src/main/java/site/easystartup/easystartupcore/EasyStartupApplication.java b/src/main/java/site/easystartup/easystartupcore/EasyStartupApplication.java index 73b6d69..72b71fb 100644 --- a/src/main/java/site/easystartup/easystartupcore/EasyStartupApplication.java +++ b/src/main/java/site/easystartup/easystartupcore/EasyStartupApplication.java @@ -2,7 +2,14 @@ package site.easystartup.easystartupcore; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; +import java.util.Collections; +import java.util.Map; + +@RestController @SpringBootApplication public class EasyStartupApplication { diff --git a/src/main/java/site/easystartup/easystartupcore/config/WebSecurityConfig.java b/src/main/java/site/easystartup/easystartupcore/config/WebSecurityConfig.java index ff5810d..96fba26 100644 --- a/src/main/java/site/easystartup/easystartupcore/config/WebSecurityConfig.java +++ b/src/main/java/site/easystartup/easystartupcore/config/WebSecurityConfig.java @@ -31,7 +31,12 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { .permitAll() .and() .logout() - .permitAll(); + .permitAll() + .and() + .rememberMe().userDetailsService(this.userDetailsService()) + .rememberMeServices(null) + .tokenValiditySeconds(86400) + .useSecureCookie(true); } @Override @@ -39,7 +44,7 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { auth.jdbcAuthentication() .dataSource(dataSource) .passwordEncoder(passwordEncoder) - .usersByUsernameQuery("SELECT `username`, `password`, `active` FROM usr WHERE `username` = ?;") + .usersByUsernameQuery("SELECT username, password, active FROM usr WHERE username = ?;") .authoritiesByUsernameQuery("SELECT u.username, ur.roles FROM usr u INNER JOIN user_role ur ON u.id = ur.user_id WHERE username = ?;"); } } diff --git a/src/main/java/site/easystartup/easystartupcore/controller/ForumController.java b/src/main/java/site/easystartup/easystartupcore/controller/ForumController.java new file mode 100644 index 0000000..14eb716 --- /dev/null +++ b/src/main/java/site/easystartup/easystartupcore/controller/ForumController.java @@ -0,0 +1,22 @@ +package site.easystartup.easystartupcore.controller; + +import lombok.RequiredArgsConstructor; +import lombok.val; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import site.easystartup.easystartupcore.repos.forum.TopicRepo; + +@Controller +@RequiredArgsConstructor(onConstructor_ = @Autowired) +public class ForumController { + private final TopicRepo topicRepo; + + @GetMapping("/forum") + public String forumMain(Model model) { + val topic = topicRepo.findAll(); + model.addAttribute("topics", topic); + return "forum"; + } +} diff --git a/src/main/java/site/easystartup/easystartupcore/controller/MainController.java b/src/main/java/site/easystartup/easystartupcore/controller/MainController.java new file mode 100644 index 0000000..3569212 --- /dev/null +++ b/src/main/java/site/easystartup/easystartupcore/controller/MainController.java @@ -0,0 +1,18 @@ +package site.easystartup.easystartupcore.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; + +@Controller +public class MainController { + @GetMapping("/") + public String home() { + return "home"; + } + + @GetMapping("/about") + public String about() { + return "about"; + } +} diff --git a/src/main/java/site/easystartup/easystartupcore/domain/User.java b/src/main/java/site/easystartup/easystartupcore/domain/User.java index 6d8fd49..4b79ad7 100644 --- a/src/main/java/site/easystartup/easystartupcore/domain/User.java +++ b/src/main/java/site/easystartup/easystartupcore/domain/User.java @@ -1,11 +1,16 @@ package site.easystartup.easystartupcore.domain; import lombok.*; +import org.hibernate.Hibernate; import javax.persistence.*; +import java.util.Objects; import java.util.Set; -@Data +@Getter +@Setter +@ToString +@RequiredArgsConstructor @Entity @Table(name = "usr") public class User { @@ -15,10 +20,38 @@ public class User { private String username; private String password; private boolean active; + private String full_name; + private String status; + private String iconPath; + private String email; + + @ElementCollection(targetClass = String.class, fetch = FetchType.EAGER) + @CollectionTable(name = "user_tag", joinColumns = @JoinColumn(name = "user_id")) + private Set tags; + + @ElementCollection(targetClass = String.class, fetch = FetchType.EAGER) + @CollectionTable(name = "user_profession", joinColumns = @JoinColumn(name = "user_id")) + private Set professions; + + @ElementCollection(targetClass = Long.class, fetch = FetchType.EAGER) + @CollectionTable(name = "user_projects", joinColumns = @JoinColumn(name = "user_id")) + private Set projects; @ElementCollection(targetClass = Role.class, fetch = FetchType.EAGER) @CollectionTable(name = "user_role", joinColumns = @JoinColumn(name = "user_id")) @Enumerated(EnumType.STRING) private Set roles; + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || Hibernate.getClass(this) != Hibernate.getClass(o)) return false; + User user = (User) o; + return Objects.equals(id, user.id); + } + + @Override + public int hashCode() { + return getClass().hashCode(); + } } diff --git a/src/main/java/site/easystartup/easystartupcore/domain/forum/Discussion.java b/src/main/java/site/easystartup/easystartupcore/domain/forum/Discussion.java new file mode 100644 index 0000000..b492a07 --- /dev/null +++ b/src/main/java/site/easystartup/easystartupcore/domain/forum/Discussion.java @@ -0,0 +1,41 @@ +package site.easystartup.easystartupcore.domain.forum; + +import lombok.*; +import org.hibernate.Hibernate; + +import javax.persistence.*; +import java.util.Date; +import java.util.List; +import java.util.Objects; + +@Getter +@Setter +@ToString +@RequiredArgsConstructor +@Entity +public class Discussion { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private long id; + private String title; + private String author; + private Date date; + private Date last_update; + + @ElementCollection(targetClass = Long.class, fetch = FetchType.EAGER) + @CollectionTable(name = "discussion_messages", joinColumns = @JoinColumn(name = "discussion_id")) + private List messages; + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || Hibernate.getClass(this) != Hibernate.getClass(o)) return false; + Discussion that = (Discussion) o; + return Objects.equals(id, that.id); + } + + @Override + public int hashCode() { + return getClass().hashCode(); + } +} diff --git a/src/main/java/site/easystartup/easystartupcore/domain/forum/DiscussionMessage.java b/src/main/java/site/easystartup/easystartupcore/domain/forum/DiscussionMessage.java new file mode 100644 index 0000000..b82cc08 --- /dev/null +++ b/src/main/java/site/easystartup/easystartupcore/domain/forum/DiscussionMessage.java @@ -0,0 +1,37 @@ +package site.easystartup.easystartupcore.domain.forum; + +import lombok.*; +import org.hibernate.Hibernate; + +import javax.persistence.*; +import java.util.Date; +import java.util.Objects; + +@Getter +@Setter +@ToString +@RequiredArgsConstructor +@Entity +public class DiscussionMessage { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private long id; + @Column(columnDefinition="varchar(1024)") + private String text; + private String sender; + private Date date; + private boolean edited; + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || Hibernate.getClass(this) != Hibernate.getClass(o)) return false; + DiscussionMessage that = (DiscussionMessage) o; + return Objects.equals(id, that.id); + } + + @Override + public int hashCode() { + return getClass().hashCode(); + } +} \ No newline at end of file diff --git a/src/main/java/site/easystartup/easystartupcore/domain/forum/DiscussionStatus.java b/src/main/java/site/easystartup/easystartupcore/domain/forum/DiscussionStatus.java new file mode 100644 index 0000000..4aed8e7 --- /dev/null +++ b/src/main/java/site/easystartup/easystartupcore/domain/forum/DiscussionStatus.java @@ -0,0 +1,5 @@ +package site.easystartup.easystartupcore.domain.forum; + +public enum DiscussionStatus { + OPEN, CLOSED; +} diff --git a/src/main/java/site/easystartup/easystartupcore/domain/forum/Topic.java b/src/main/java/site/easystartup/easystartupcore/domain/forum/Topic.java new file mode 100644 index 0000000..d3a4967 --- /dev/null +++ b/src/main/java/site/easystartup/easystartupcore/domain/forum/Topic.java @@ -0,0 +1,39 @@ +package site.easystartup.easystartupcore.domain.forum; + +import lombok.*; +import org.hibernate.Hibernate; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import java.util.Date; +import java.util.Objects; + +@Getter +@Setter +@ToString +@RequiredArgsConstructor +@Entity +public class Topic { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private long id; + private String title; + private int size; + private String description; + private Date last_update; + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || Hibernate.getClass(this) != Hibernate.getClass(o)) return false; + Topic topic = (Topic) o; + return Objects.equals(id, topic.id); + } + + @Override + public int hashCode() { + return getClass().hashCode(); + } +} diff --git a/src/main/java/site/easystartup/easystartupcore/repos/forum/DiscussionMessageRepo.java b/src/main/java/site/easystartup/easystartupcore/repos/forum/DiscussionMessageRepo.java new file mode 100644 index 0000000..aae42de --- /dev/null +++ b/src/main/java/site/easystartup/easystartupcore/repos/forum/DiscussionMessageRepo.java @@ -0,0 +1,8 @@ +package site.easystartup.easystartupcore.repos.forum; + +import org.springframework.data.repository.CrudRepository; +import site.easystartup.easystartupcore.domain.forum.Discussion; +import site.easystartup.easystartupcore.domain.forum.DiscussionMessage; + +public interface DiscussionMessageRepo extends CrudRepository { +} diff --git a/src/main/java/site/easystartup/easystartupcore/repos/forum/DiscussionRepo.java b/src/main/java/site/easystartup/easystartupcore/repos/forum/DiscussionRepo.java new file mode 100644 index 0000000..51d7e63 --- /dev/null +++ b/src/main/java/site/easystartup/easystartupcore/repos/forum/DiscussionRepo.java @@ -0,0 +1,7 @@ +package site.easystartup.easystartupcore.repos.forum; + +import org.springframework.data.repository.CrudRepository; +import site.easystartup.easystartupcore.domain.forum.Discussion; + +public interface DiscussionRepo extends CrudRepository { +} diff --git a/src/main/java/site/easystartup/easystartupcore/repos/forum/TopicRepo.java b/src/main/java/site/easystartup/easystartupcore/repos/forum/TopicRepo.java new file mode 100644 index 0000000..b5fbcd5 --- /dev/null +++ b/src/main/java/site/easystartup/easystartupcore/repos/forum/TopicRepo.java @@ -0,0 +1,8 @@ +package site.easystartup.easystartupcore.repos.forum; + +import org.springframework.data.repository.CrudRepository; +import site.easystartup.easystartupcore.domain.forum.Discussion; +import site.easystartup.easystartupcore.domain.forum.Topic; + +public interface TopicRepo extends CrudRepository { +} diff --git a/src/main/resources/templates/about.html b/src/main/resources/templates/about.html new file mode 100644 index 0000000..4504833 --- /dev/null +++ b/src/main/resources/templates/about.html @@ -0,0 +1,14 @@ + + + + + О нас + + +
+

О нас

+
+ + + \ No newline at end of file diff --git a/src/main/resources/templates/forum.html b/src/main/resources/templates/forum.html new file mode 100644 index 0000000..36ca345 --- /dev/null +++ b/src/main/resources/templates/forum.html @@ -0,0 +1,14 @@ + + + + + Форум + + +
+

Форум

+
+ + + \ No newline at end of file diff --git a/src/main/resources/templates/home.html b/src/main/resources/templates/home.html new file mode 100644 index 0000000..7c34ac6 --- /dev/null +++ b/src/main/resources/templates/home.html @@ -0,0 +1,16 @@ + + + + + Главная + + +
+

Главня страница

+
+ Вход +
+ + + \ No newline at end of file diff --git a/src/main/resources/templates/login.html b/src/main/resources/templates/login.html index 5e73206..5a87c97 100644 --- a/src/main/resources/templates/login.html +++ b/src/main/resources/templates/login.html @@ -21,7 +21,7 @@ - +
@@ -39,7 +39,7 @@
diff --git a/src/test/java/site/easystartup/easystartupcore/FileUploadTests.java b/src/test/java/site/easystartup/easystartupcore/FileUploadTests.java index 9c7e87b..50399ab 100644 --- a/src/test/java/site/easystartup/easystartupcore/FileUploadTests.java +++ b/src/test/java/site/easystartup/easystartupcore/FileUploadTests.java @@ -1,52 +1,29 @@ package site.easystartup.easystartupcore; -import java.io.File; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.MediaType; +import org.springframework.mock.web.MockMultipartFile; +import org.springframework.test.web.servlet.MockMvc; +import site.easystartup.easystartupcore.storage.StorageFileNotFoundException; +import site.easystartup.easystartupcore.storage.StorageService; + import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.stream.Stream; -import lombok.SneakyThrows; -import org.aspectj.lang.annotation.After; -import org.hamcrest.Matchers; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.context.TestConfiguration; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Import; -import org.springframework.http.MediaType; -import org.springframework.mock.web.MockMultipartFile; -import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; -import org.springframework.security.crypto.password.PasswordEncoder; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.test.web.servlet.MockMvc; -import site.easystartup.easystartupcore.config.WebSecurityConfig; -import site.easystartup.easystartupcore.storage.StorageFileNotFoundException; -import site.easystartup.easystartupcore.storage.StorageService; - -import javax.sql.DataSource; - import static org.mockito.BDDMockito.given; import static org.mockito.BDDMockito.then; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.multipart; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.model; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -@EnableAutoConfiguration(exclude = { SecurityAutoConfiguration.class }) @AutoConfigureMockMvc(addFilters = false) @SpringBootTest public class FileUploadTests {