diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..3d950a6 --- /dev/null +++ b/build.gradle @@ -0,0 +1,42 @@ +buildscript { + repositories { + mavenCentral() + } + dependencies { + classpath("org.springframework.boot:spring-boot-gradle-plugin:2.1.3.RELEASE") + } +} + +apply plugin: 'java' +apply plugin: 'idea' +apply plugin: 'org.springframework.boot' +apply plugin: 'io.spring.dependency-management' + +bootJar { + baseName = 'writer-fic' + version = '0.1.0' +} + +repositories { + mavenCentral() +} + +sourceCompatibility = 1.8 +targetCompatibility = 1.8 +compileJava.options.encoding = 'UTF-8' + +tasks.withType(JavaCompile) { + options.encoding = 'UTF-8' +} +dependencies { + compile("org.springframework.boot:spring-boot-starter-data-jpa") + compile("org.springframework.boot:spring-boot-starter-web") + compile("org.springframework.boot:spring-boot-starter-test") + compile("org.springframework.boot:spring-boot-starter-hateoas") + + compile("org.projectlombok:lombok") + compile("mysql:mysql-connector-java") + compile("com.h2database:h2") + + testCompile("junit:junit") +} \ No newline at end of file diff --git a/src/main/java/fic/writer/Application.java b/src/main/java/fic/writer/Application.java new file mode 100644 index 0000000..7da4aa1 --- /dev/null +++ b/src/main/java/fic/writer/Application.java @@ -0,0 +1,11 @@ +package fic.writer; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Application { + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } +} diff --git a/src/main/java/fic/writer/config/AuditConfig.java b/src/main/java/fic/writer/config/AuditConfig.java new file mode 100644 index 0000000..d052953 --- /dev/null +++ b/src/main/java/fic/writer/config/AuditConfig.java @@ -0,0 +1,9 @@ +package fic.writer.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.data.jpa.repository.config.EnableJpaAuditing; + +@Configuration +@EnableJpaAuditing +public class AuditConfig { +} diff --git a/src/main/java/fic/writer/domain/entity/Actor.java b/src/main/java/fic/writer/domain/entity/Actor.java new file mode 100644 index 0000000..8c88ef2 --- /dev/null +++ b/src/main/java/fic/writer/domain/entity/Actor.java @@ -0,0 +1,28 @@ +package fic.writer.domain.entity; + +import lombok.*; + +import javax.persistence.*; +import java.util.Set; + +@Entity +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class Actor { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(updatable = false) + private Long id; + private String name; + private String description; + @ManyToMany(fetch = FetchType.LAZY, mappedBy = "actors") + private Set books; + @OneToMany(cascade = {CascadeType.ALL}, + fetch = FetchType.LAZY, + orphanRemoval = true, + mappedBy = "actor") + private Set actorStates; +} \ No newline at end of file diff --git a/src/main/java/fic/writer/domain/entity/ActorState.java b/src/main/java/fic/writer/domain/entity/ActorState.java new file mode 100644 index 0000000..b3ef976 --- /dev/null +++ b/src/main/java/fic/writer/domain/entity/ActorState.java @@ -0,0 +1,25 @@ +package fic.writer.domain.entity; + +import lombok.*; + +import javax.persistence.*; + +@Entity +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Builder +@EqualsAndHashCode(of = "id") +public class ActorState { + @EmbeddedId + private ActorStateId id; + @MapsId("articleId") + @ManyToOne(fetch = FetchType.LAZY) + private Article article; + @MapsId("actorId") + @ManyToOne(fetch = FetchType.LAZY) + private Actor actor; + private String title; + private String content; +} \ No newline at end of file diff --git a/src/main/java/fic/writer/domain/entity/ActorStateId.java b/src/main/java/fic/writer/domain/entity/ActorStateId.java new file mode 100644 index 0000000..43425e0 --- /dev/null +++ b/src/main/java/fic/writer/domain/entity/ActorStateId.java @@ -0,0 +1,22 @@ +package fic.writer.domain.entity; + +import lombok.*; + +import javax.persistence.Column; +import javax.persistence.Embeddable; +import java.io.Serializable; + +@Embeddable +@NoArgsConstructor +@Getter +@Setter +@Builder +@AllArgsConstructor +@EqualsAndHashCode +public class ActorStateId implements Serializable { + @Column(name = "article_id") + private Long articleId; + @Column(name = "actor_id") + private Long actorId; + +} \ No newline at end of file diff --git a/src/main/java/fic/writer/domain/entity/Article.java b/src/main/java/fic/writer/domain/entity/Article.java new file mode 100644 index 0000000..5e1f6f1 --- /dev/null +++ b/src/main/java/fic/writer/domain/entity/Article.java @@ -0,0 +1,35 @@ +package fic.writer.domain.entity; + +import lombok.*; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +import javax.persistence.*; +import java.util.Date; +import java.util.Set; + +@Entity +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Builder +@EntityListeners(AuditingEntityListener.class) +public class Article { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + private String title; + @CreatedDate + private Date created; + @LastModifiedDate + private Date lastModify; + @Column(columnDefinition = "text") + private String content; + private String annotation; + @ManyToOne(fetch = FetchType.LAZY) + private Book book; + @OneToMany(cascade = CascadeType.REMOVE) + private Set actorStates; +} \ No newline at end of file diff --git a/src/main/java/fic/writer/domain/entity/Book.java b/src/main/java/fic/writer/domain/entity/Book.java new file mode 100644 index 0000000..d3ad3e8 --- /dev/null +++ b/src/main/java/fic/writer/domain/entity/Book.java @@ -0,0 +1,54 @@ +package fic.writer.domain.entity; + +import fic.writer.domain.entity.enums.Size; +import fic.writer.domain.entity.enums.State; +import lombok.*; + +import javax.persistence.*; +import java.util.Set; + +@Entity +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class Book { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + private String title; + @ManyToOne + private User author; + @ManyToMany(fetch = FetchType.LAZY) + @JoinTable(name = "book_subauthors", + joinColumns = {@JoinColumn(name = "book_id")}, + inverseJoinColumns = {@JoinColumn(name = "user_id")} + ) + @Singular("subAuthors") + private Set subAuthors; + @OneToMany(fetch = FetchType.EAGER) + @Singular("source") + private Set source; + private String description; + @Enumerated + private Size size; + @Enumerated + private State state; + @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true) + @Singular("articles") + private Set
articles; + @ManyToMany(fetch = FetchType.LAZY) + @JoinTable(name = "book_genres", + joinColumns = {@JoinColumn(name = "book_id")}, + inverseJoinColumns = {@JoinColumn(name = "genre_id")} + ) + private Set genres; + @ManyToMany(fetch = FetchType.LAZY) + @JoinTable(name = "book_actors", + joinColumns = {@JoinColumn(name = "book_id")}, + inverseJoinColumns = {@JoinColumn(name = "actor_id")} + ) + @Singular("actors") + private Set actors; +} diff --git a/src/main/java/fic/writer/domain/entity/Genre.java b/src/main/java/fic/writer/domain/entity/Genre.java new file mode 100644 index 0000000..9e14053 --- /dev/null +++ b/src/main/java/fic/writer/domain/entity/Genre.java @@ -0,0 +1,23 @@ +package fic.writer.domain.entity; + +import lombok.*; + +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.Id; +import javax.persistence.ManyToMany; +import java.util.Set; + +@Entity +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class Genre { + @Id + private Long id; + private String name; + @ManyToMany(mappedBy = "genres", fetch = FetchType.LAZY) + private Set book; +} diff --git a/src/main/java/fic/writer/domain/entity/User.java b/src/main/java/fic/writer/domain/entity/User.java new file mode 100644 index 0000000..d84375a --- /dev/null +++ b/src/main/java/fic/writer/domain/entity/User.java @@ -0,0 +1,27 @@ +package fic.writer.domain.entity; + +import lombok.*; + +import javax.persistence.*; +import java.util.Set; + +@Entity +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class User { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + private String username; + private String about; + private String information; + @ManyToMany(mappedBy = "subAuthors", fetch = FetchType.LAZY) + @Singular("booksAsSubAuthor") + private Set booksAsSubAuthor; + @OneToMany(fetch = FetchType.LAZY) + @Singular("booksAsAuthor") + private Set booksAsAuthor; +} diff --git a/src/main/java/fic/writer/domain/entity/auth/CustomUser.java b/src/main/java/fic/writer/domain/entity/auth/CustomUser.java new file mode 100644 index 0000000..22f2961 --- /dev/null +++ b/src/main/java/fic/writer/domain/entity/auth/CustomUser.java @@ -0,0 +1,22 @@ +package fic.writer.domain.entity.auth; + +import fic.writer.domain.entity.User; +import lombok.*; + +import javax.persistence.*; + +@Entity +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class CustomUser { + @Id + @GeneratedValue + private Long id; + @OneToOne(fetch = FetchType.EAGER) + private User profile; + private String email; + private String password; +} diff --git a/src/main/java/fic/writer/domain/entity/auth/OauthUser.java b/src/main/java/fic/writer/domain/entity/auth/OauthUser.java new file mode 100644 index 0000000..d9c38b4 --- /dev/null +++ b/src/main/java/fic/writer/domain/entity/auth/OauthUser.java @@ -0,0 +1,23 @@ +package fic.writer.domain.entity.auth; + +import fic.writer.domain.entity.User; +import lombok.*; + +import javax.persistence.*; +import java.util.Date; + +@Entity +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class OauthUser { + @Id + @GeneratedValue + private Long id; + @OneToOne(fetch = FetchType.EAGER) + private User profile; + private String token; + private Date expireDate; +} diff --git a/src/main/java/fic/writer/domain/entity/dto/ActorDto.java b/src/main/java/fic/writer/domain/entity/dto/ActorDto.java new file mode 100644 index 0000000..d8272e7 --- /dev/null +++ b/src/main/java/fic/writer/domain/entity/dto/ActorDto.java @@ -0,0 +1,24 @@ +package fic.writer.domain.entity.dto; + +import fic.writer.domain.entity.Actor; +import fic.writer.domain.entity.ActorState; +import lombok.Builder; +import lombok.Data; + +import java.util.Set; + +@Builder +@Data +public class ActorDto { + private String name; + private String description; + private Set actorStates; + + public static ActorDto of(Actor actor) { + return builder() + .name(actor.getName()) + .description(actor.getDescription()) + .actorStates(actor.getActorStates()) + .build(); + } +} \ No newline at end of file diff --git a/src/main/java/fic/writer/domain/entity/dto/ActorStateDto.java b/src/main/java/fic/writer/domain/entity/dto/ActorStateDto.java new file mode 100644 index 0000000..9c38538 --- /dev/null +++ b/src/main/java/fic/writer/domain/entity/dto/ActorStateDto.java @@ -0,0 +1,23 @@ +package fic.writer.domain.entity.dto; + +import fic.writer.domain.entity.ActorState; +import fic.writer.domain.entity.ActorStateId; +import lombok.Builder; +import lombok.Data; + +@Builder +@Data +public class ActorStateDto { + private ActorStateId id; + private String title; + private String content; + + + public static ActorStateDto of(ActorState actorState) { + return builder() + .id(actorState.getId()) + .title(actorState.getTitle()) + .content(actorState.getContent()) + .build(); + } +} diff --git a/src/main/java/fic/writer/domain/entity/dto/ArticleDto.java b/src/main/java/fic/writer/domain/entity/dto/ArticleDto.java new file mode 100644 index 0000000..4bb8458 --- /dev/null +++ b/src/main/java/fic/writer/domain/entity/dto/ArticleDto.java @@ -0,0 +1,23 @@ +package fic.writer.domain.entity.dto; + +import fic.writer.domain.entity.Article; +import lombok.*; + +@Builder +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class ArticleDto { + private String title; + private String content; + private String annotation; + + public static ArticleDto of(Article article) { + return builder() + .title(article.getTitle()) + .content(article.getContent()) + .annotation(article.getAnnotation()) + .build(); + } +} diff --git a/src/main/java/fic/writer/domain/entity/dto/BookDto.java b/src/main/java/fic/writer/domain/entity/dto/BookDto.java new file mode 100644 index 0000000..ba254c0 --- /dev/null +++ b/src/main/java/fic/writer/domain/entity/dto/BookDto.java @@ -0,0 +1,28 @@ +package fic.writer.domain.entity.dto; + +import fic.writer.domain.entity.Book; +import fic.writer.domain.entity.enums.Size; +import fic.writer.domain.entity.enums.State; +import lombok.*; + + +@Builder +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class BookDto { + private String title; + private String description; + private Size size; + private State state; + + public static BookDto of(Book book) { + return builder() + .title(book.getTitle()) + .description(book.getDescription()) + .size(book.getSize()) + .state(book.getState()) + .build(); + } +} diff --git a/src/main/java/fic/writer/domain/entity/dto/UserDto.java b/src/main/java/fic/writer/domain/entity/dto/UserDto.java new file mode 100644 index 0000000..716a430 --- /dev/null +++ b/src/main/java/fic/writer/domain/entity/dto/UserDto.java @@ -0,0 +1,23 @@ +package fic.writer.domain.entity.dto; + +import fic.writer.domain.entity.User; +import lombok.*; + +@Builder +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class UserDto { + private String username; + private String about; + private String information; + + public static UserDto of(User user) { + return builder() + .username(user.getUsername()) + .about(user.getAbout()) + .information(user.getInformation()) + .build(); + } +} diff --git a/src/main/java/fic/writer/domain/entity/enums/Size.java b/src/main/java/fic/writer/domain/entity/enums/Size.java new file mode 100644 index 0000000..1b3b0a0 --- /dev/null +++ b/src/main/java/fic/writer/domain/entity/enums/Size.java @@ -0,0 +1,5 @@ +package fic.writer.domain.entity.enums; + +public enum Size { + MINI, MEDIUM, LONG +} diff --git a/src/main/java/fic/writer/domain/entity/enums/State.java b/src/main/java/fic/writer/domain/entity/enums/State.java new file mode 100644 index 0000000..318ac06 --- /dev/null +++ b/src/main/java/fic/writer/domain/entity/enums/State.java @@ -0,0 +1,5 @@ +package fic.writer.domain.entity.enums; + +public enum State { + FROZEN, IN_PROGRESS, DONE +} diff --git a/src/main/java/fic/writer/domain/repository/ActorRepository.java b/src/main/java/fic/writer/domain/repository/ActorRepository.java new file mode 100644 index 0000000..3eb5d55 --- /dev/null +++ b/src/main/java/fic/writer/domain/repository/ActorRepository.java @@ -0,0 +1,7 @@ +package fic.writer.domain.repository; + +import fic.writer.domain.entity.Actor; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ActorRepository extends JpaRepository { +} diff --git a/src/main/java/fic/writer/domain/repository/ActorStateRepository.java b/src/main/java/fic/writer/domain/repository/ActorStateRepository.java new file mode 100644 index 0000000..10cb175 --- /dev/null +++ b/src/main/java/fic/writer/domain/repository/ActorStateRepository.java @@ -0,0 +1,15 @@ +package fic.writer.domain.repository; + +import fic.writer.domain.entity.ActorState; +import fic.writer.domain.entity.ActorStateId; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; + +public interface ActorStateRepository extends JpaRepository { + Page findAllByIdActorId(Long actorId, Pageable pageable); + + Optional findAByIdActorIdAndIdArticleId(Long actorId, Long articleId); +} diff --git a/src/main/java/fic/writer/domain/repository/ArticleRepository.java b/src/main/java/fic/writer/domain/repository/ArticleRepository.java new file mode 100644 index 0000000..0456388 --- /dev/null +++ b/src/main/java/fic/writer/domain/repository/ArticleRepository.java @@ -0,0 +1,10 @@ +package fic.writer.domain.repository; + +import fic.writer.domain.entity.Article; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +public interface ArticleRepository extends JpaRepository { + List
findAllByBookId(Long bookId); +} diff --git a/src/main/java/fic/writer/domain/repository/BookRepository.java b/src/main/java/fic/writer/domain/repository/BookRepository.java new file mode 100644 index 0000000..a769dfb --- /dev/null +++ b/src/main/java/fic/writer/domain/repository/BookRepository.java @@ -0,0 +1,7 @@ +package fic.writer.domain.repository; + +import fic.writer.domain.entity.Book; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface BookRepository extends JpaRepository { +} diff --git a/src/main/java/fic/writer/domain/repository/GenreRepository.java b/src/main/java/fic/writer/domain/repository/GenreRepository.java new file mode 100644 index 0000000..fddb9e1 --- /dev/null +++ b/src/main/java/fic/writer/domain/repository/GenreRepository.java @@ -0,0 +1,7 @@ +package fic.writer.domain.repository; + +import fic.writer.domain.entity.Genre; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface GenreRepository extends JpaRepository { +} diff --git a/src/main/java/fic/writer/domain/repository/UserRepository.java b/src/main/java/fic/writer/domain/repository/UserRepository.java new file mode 100644 index 0000000..361fabf --- /dev/null +++ b/src/main/java/fic/writer/domain/repository/UserRepository.java @@ -0,0 +1,10 @@ +package fic.writer.domain.repository; + +import fic.writer.domain.entity.User; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; + +public interface UserRepository extends JpaRepository { + Optional findByUsername(String username); +} diff --git a/src/main/java/fic/writer/domain/service/ActorService.java b/src/main/java/fic/writer/domain/service/ActorService.java new file mode 100644 index 0000000..e39043f --- /dev/null +++ b/src/main/java/fic/writer/domain/service/ActorService.java @@ -0,0 +1,25 @@ +package fic.writer.domain.service; + +import fic.writer.domain.entity.Actor; +import fic.writer.domain.entity.dto.ActorDto; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; + +import java.util.List; +import java.util.Optional; + +public interface ActorService { + Actor getOne(Long id); + + Actor create(ActorDto actor); + + List findAll(); + + Page findPage(Pageable pageable); + + Optional findById(Long id); + + Actor update(Long id, ActorDto actor); + + void deleteById(Long aLong); +} diff --git a/src/main/java/fic/writer/domain/service/ActorStateService.java b/src/main/java/fic/writer/domain/service/ActorStateService.java new file mode 100644 index 0000000..f3988bf --- /dev/null +++ b/src/main/java/fic/writer/domain/service/ActorStateService.java @@ -0,0 +1,25 @@ +package fic.writer.domain.service; + +import fic.writer.domain.entity.ActorState; +import fic.writer.domain.entity.ActorStateId; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; + +import java.util.List; +import java.util.Optional; + +public interface ActorStateService { + Page findAllByActor(Long id, Pageable pageable); + + Optional findForActorByArticle(Long actorId, Long articleId); + + List findAll(); + + Page findPage(Pageable pageable); + + Optional findById(ActorStateId actorStateId); + + void delete(ActorState actorState); + + void deleteById(ActorStateId actorStateId); +} diff --git a/src/main/java/fic/writer/domain/service/ArticleService.java b/src/main/java/fic/writer/domain/service/ArticleService.java new file mode 100644 index 0000000..8129e9a --- /dev/null +++ b/src/main/java/fic/writer/domain/service/ArticleService.java @@ -0,0 +1,25 @@ +package fic.writer.domain.service; + +import fic.writer.domain.entity.Article; +import fic.writer.domain.entity.dto.ArticleDto; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; + +import java.util.List; +import java.util.Optional; + +public interface ArticleService { + List
findAll(); + + List
findAllForBook(Long bookId); + + Page
findPage(Pageable pageable); + + Article update(Long id, ArticleDto articleDto); + + Optional
findById(Long aLong); + + void delete(Article article); + + void deleteById(Long aLong); +} diff --git a/src/main/java/fic/writer/domain/service/BookService.java b/src/main/java/fic/writer/domain/service/BookService.java new file mode 100644 index 0000000..49a027d --- /dev/null +++ b/src/main/java/fic/writer/domain/service/BookService.java @@ -0,0 +1,34 @@ +package fic.writer.domain.service; + +import fic.writer.domain.entity.Book; +import fic.writer.domain.entity.dto.ArticleDto; +import fic.writer.domain.entity.dto.BookDto; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; + +import java.io.IOException; +import java.util.List; +import java.util.Optional; + +public interface BookService { + + List findAll(); + + Page findPage(Pageable pageable); + + Optional findById(Long aLong); + + Book create(BookDto bookDto); + + Book update(Long id, BookDto bookDto); + + Book addArticle(Long bookId, ArticleDto articleDto); + + Book removeArticle(Long bookId, Long articleId); + + void delete(Book book); + + void deleteById(Long aLong); + + byte[] getBookAsByteArray(Long bookId) throws IOException; +} diff --git a/src/main/java/fic/writer/domain/service/CrudService.java b/src/main/java/fic/writer/domain/service/CrudService.java new file mode 100644 index 0000000..7e5739f --- /dev/null +++ b/src/main/java/fic/writer/domain/service/CrudService.java @@ -0,0 +1,21 @@ +package fic.writer.domain.service; + +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; + +import java.util.List; +import java.util.Optional; + +public interface CrudService { + List findAll(); + + Page findPage(Pageable pageable); + + Optional findById(ID id); + + T save(T t); + + void delete(T t); + + void deleteById(ID id); +} diff --git a/src/main/java/fic/writer/domain/service/GenreService.java b/src/main/java/fic/writer/domain/service/GenreService.java new file mode 100644 index 0000000..9292154 --- /dev/null +++ b/src/main/java/fic/writer/domain/service/GenreService.java @@ -0,0 +1,7 @@ +package fic.writer.domain.service; + +import fic.writer.domain.entity.Genre; + +public interface GenreService extends CrudService { + +} diff --git a/src/main/java/fic/writer/domain/service/UserService.java b/src/main/java/fic/writer/domain/service/UserService.java new file mode 100644 index 0000000..5df0850 --- /dev/null +++ b/src/main/java/fic/writer/domain/service/UserService.java @@ -0,0 +1,27 @@ +package fic.writer.domain.service; + +import fic.writer.domain.entity.User; +import fic.writer.domain.entity.dto.UserDto; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; + +import java.util.List; +import java.util.Optional; + +public interface UserService { + List findAll(); + + Page findPage(Pageable pageable); + + Optional findById(Long aLong); + + Optional findByUsername(String username); + + User create(UserDto user); + + User update(Long userId, UserDto user); + + void delete(User user); + + void deleteById(Long aLong); +} diff --git a/src/main/resources/application-db-mysql.yml b/src/main/resources/application-db-mysql.yml new file mode 100644 index 0000000..c27a72f --- /dev/null +++ b/src/main/resources/application-db-mysql.yml @@ -0,0 +1,17 @@ +spring: + datasource: + url: jdbc:mysql://localhost:3306/ficwriter + username: dl + password: p@ssword + initialization-mode: always + + jpa: + hibernate: + ddl-auto: create-drop + properties: + hibernate: + dialect: org.hibernate.dialect.MySQL5InnoDBDialect + hbm2ddl: + import_files_sql_extractor: org.hibernate.tool.hbm2ddl.MultipleLinesSqlCommandExtractor + import_files: data/user.sql, data/actor.sql, data/book.sql, data/article.sql,data/book_article.sql, data/actor_state.sql + diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml new file mode 100644 index 0000000..596c249 --- /dev/null +++ b/src/main/resources/application.yml @@ -0,0 +1,9 @@ +spring: + profiles: + active: db-mysql +logging: + level: + org: + springframework: INFO +server: + port: 8080 \ No newline at end of file diff --git a/src/main/resources/data/actor.sql b/src/main/resources/data/actor.sql new file mode 100644 index 0000000..bb9597c --- /dev/null +++ b/src/main/resources/data/actor.sql @@ -0,0 +1,10 @@ +INSERT INTO actor(id,description,name)VALUES(1,'description1','name1'); +INSERT INTO actor(id,description,name)VALUES(2,'description2','name2'); +INSERT INTO actor(id,description,name)VALUES(3,'description3','name3'); +INSERT INTO actor(id,description,name)VALUES(987,'description','name'); +INSERT INTO actor(id,description,name)VALUES(333,'description','name'); +INSERT INTO actor(id,description,name)VALUES(334,'description','name'); + + + + diff --git a/src/main/resources/data/actor_state.sql b/src/main/resources/data/actor_state.sql new file mode 100644 index 0000000..6e99aca --- /dev/null +++ b/src/main/resources/data/actor_state.sql @@ -0,0 +1,7 @@ +INSERT INTO actor_state(content,title,actor_id,article_id)VALUES('content1','title1',1,1); +INSERT INTO actor_state(content,title,actor_id,article_id)VALUES('content2','title2',1,2); +INSERT INTO actor_state(content,title,actor_id,article_id)VALUES('content3','title3',2,1); +INSERT INTO actor_state(content,title,actor_id,article_id)VALUES('content4','title4',2,2); + +INSERT INTO actor_state(content,title,actor_id,article_id)VALUES('content4','title4',333,3); +INSERT INTO actor_state(content,title,actor_id,article_id)VALUES('content4','title4',334,3); \ No newline at end of file diff --git a/src/main/resources/data/article.sql b/src/main/resources/data/article.sql new file mode 100644 index 0000000..1572fba --- /dev/null +++ b/src/main/resources/data/article.sql @@ -0,0 +1,146 @@ +INSERT INTO article(id,annotation,content,title,book_id)VALUES(1,'Place for annotation','

Place for content.

','Summer inspiration',1); +INSERT INTO article(id,annotation,content,title)VALUES(2,'annotation2','content2','title2'); +INSERT INTO article(id,annotation,content,title)VALUES(3,'annotation','content','title'); +INSERT INTO article(id,annotation,content,title)VALUES(4,'annotation','content','title'); +INSERT INTO article(id,annotation,content,title)VALUES(333,'annotation','content','delete article'); + +INSERT INTO article(id,book_id,annotation,title,content)VALUES(335,1,'','Зимняя поэма', +'

Измеряются грустью и чашками чая
+Безымянные, кроткие, зимние дни.
+Проживаешь мгновения, не замечая,
+Как бесследно теряются в прошлом они.
+
+Покрывает надежды обманчивый иней,
+Запотевшая память подобна окну.
+Растворяется контур реальности синей:
+Над экраном холодным и ясным усну.
+
+Утомлен безучастностью, сентиментален,
+Погружаюсь, запутавшись, в тихую тьму.
+А приснятся весенние язвы проталин
+И снега, равнодушны к концу своему.
+
+И покажется, будто неловко ступаю
+По сулящему гибель лукавому льду,
+Приближаюсь безвольно к незримому краю,
+Безучастно забвения смертного жду.
+
+Обреченность души молодой беспричинна,
+И мечты, и стремления сердца смешны.
+Неизбежно и близко маячит кончина,
+Обещая обители вечной весны.
+
+А былого сомнения ныне убоги,
+Поглотила пучина загробной реки;
+Мысли канули в тени последней дороги.
+Берега колдовской глубины далеки.
+
+Не внимая молитвам, судьба непреклонна,
+И слова, и молчание тщетны, пусты,
+Но зовут перезвоны миров Авалона
+Сквозь слепую завесу могильной черты.
+
+Промелькнуло знамение в зыби туманной,
+Воплощение обетованной земли.
+Кровоточит сознание призрачной раной.
+Рассеченную веру, Харон, исцели!
+
+На морозе растрескалась черная лодка,
+Перевозчик не тронет стремнину веслом.
+Изменилась от боли и страха походка:
+Не устанешь терзаться, скорбеть о былом.
+
+Разрывается грудь от печали железной,
+Утянуло уныние душу на дно.
+Беспредельная пропасть зияющей бездной
+Констатирует факт: умереть суждено.
+
+Принимаю жестокую истину эту.
+Под ногами ни твердь, но крошащийся наст.
+Пересечь пожелавший замерзшую Лету
+Неизбежно бесценное стражу отдаст.
+
+Проседает поверхность, ломаясь и тая,
+Увлекаясь течением мертвой воды,
+И тасует агония льды, как живая,
+И надежды безлики и сердцу чужды.
+
+На сминаемой глади нельзя схорониться,
+Настигает невидимый ужас. Фантом
+Беспощаден. Аида владений граница
+Искаверкала личность в тумане густом.
+
+Просыпаюсь, но кровь под висками грохочет,
+Что увидел в зловещем, пророческом сне.
+И дрожу, возвратившийся первопроходчик,
+Почему темнота ухмыляется мне?
+
+Поднимусь, в запыленное зеркало гляну,
+Не поверю, что нет в волосах седины.
+Удивленный открытому в духе изъяну,
+Осознаю, подобные обречены.
+
+Не бывает беспечна дорога поэта,
+И печаль неотступная бдит за спиной.
+Угнетает суровая истина эта.
+Почему безучастность любезна со мной?
+
+Очарован иллюзией, горечью болен,
+За словами под землю бреду в глубину.
+В лабиринтах блуждаю заброшенных штолен
+И ищу драгоценную правду одну.
+
+И в прорубленных поиском чьим-то пещерах
+Затеряюсь: обманка, сомнения, ложь.
+А в рассветных, неискренних сумерках серых
+На умершего в зеркале старом похож.
+
+Бесполезен желанием я. Одноразов
+И порыв, и поэзии выкрик немой.
+Принимаю стекляшки за груды алмазов.
+Одиссей никогда не вернется домой.
+
+Помню Данте и вечный огонь Одиссею,
+И правдивый, бесплотный, печальный язык.
+Опереться на слабую веру не смею,
+К безысходности мрачной за годы привык.
+
+Не боюсь очевидной угрозы обвала,
+Не боюсь нависающей тяжести гор.
+Равнодушная память, чадя, истлевала.
+Неужели конец однозначен и скор?
+
+Умываюсь, покинув недвижность постели,
+Отвечает насмешкой безмолвие глаз.
+А секунды, минуты, недели летели.
+Поклянусь измениться единственный раз.
+
+И слезами обет приношу перед Богом,
+Не терять ни мгновения, миг не терять.
+На пути разрушения скользком, пологом
+Не могу, покатившись, подняться опять.
+
+Поклонюсь утешающим, строгим иконам,
+И молитва развеет гнетущую тьму.
+И прощенный, служивший делам беззаконным,
+Не надеюсь тщеславно спастись самому.
+
+На восходе сугроб переливчат и розов,
+И затейлив узор приукрасил окно.
+Неужели с уходом кристальных морозов
+Полотно белотканное обречено?
+
+Опалив чистоту, молодое светило
+Прожигает сияющий кров белизны,
+А снежинки в бесплодную грязь превратило.
+Обтекают деревья угрюмы, темны.
+
+Почему разрушения ярость воспета?
+Сожаления вязки, сугубы, остры.
+Разлилась половодьем забвения Лета,
+Разделяя потоком зеркальным миры.
+
+А тлетворная оттепель жизни хлопочет,
+Умирает в смирении зимний покой.
+Вырываются листья из лопнувших почек,
+И весна торжествует в капели слепой.
'); \ No newline at end of file diff --git a/src/main/resources/data/book.sql b/src/main/resources/data/book.sql new file mode 100644 index 0000000..49fd526 --- /dev/null +++ b/src/main/resources/data/book.sql @@ -0,0 +1,11 @@ +INSERT INTO book(id,title,description, size, state,author_id)VALUES(1,'Arabella','Artic monkeys', 1,2,1); +INSERT INTO user_books_as_author (user_id,books_as_author_id)VALUES(1,1); +INSERT INTO book_subauthors (user_id,book_id)VALUES(2,1); +INSERT INTO book(title,description, size, state)VALUES('Old yellow bricks','Artic monkeys', 1,2); +INSERT INTO book(title,description, size, state)VALUES('End of me','Apocalyptica', 0,1); +INSERT INTO book(title,description, size, state)VALUES('Отблеск разочарований','Безнадежности печать...', 0,1); + + + + + diff --git a/src/main/resources/data/book_article.sql b/src/main/resources/data/book_article.sql new file mode 100644 index 0000000..1c61683 --- /dev/null +++ b/src/main/resources/data/book_article.sql @@ -0,0 +1,2 @@ +INSERT INTO book_articles(book_id,articles_id)VALUES(1,335); +INSERT INTO book_articles(book_id,articles_id)VALUES(1,1); \ No newline at end of file diff --git a/src/main/resources/data/user.sql b/src/main/resources/data/user.sql new file mode 100644 index 0000000..deb354d --- /dev/null +++ b/src/main/resources/data/user.sql @@ -0,0 +1,2 @@ +INSERT INTO user(id,about, information, username)VALUES(1,'I am author',' zaraza-takaja@mail.ru','Zaraza takaja'); +INSERT INTO user(id,about, information, username)VALUES(2,'I am author, too',' zaraza-takaja@mail.ru','@uthor'); \ No newline at end of file diff --git a/src/test/resources/application-db-h2.yml b/src/test/resources/application-db-h2.yml new file mode 100644 index 0000000..ced131b --- /dev/null +++ b/src/test/resources/application-db-h2.yml @@ -0,0 +1,13 @@ +spring: + datasource: + url: jdbc:h2:mem:testdb + driverClassName: org.h2.Driver + username: sa + password: + jpa: + properties: + hibernate: + dialect: org.hibernate.dialect.H2Dialect + h2: + console: + enabled: true \ No newline at end of file diff --git a/src/test/resources/application-db-mysql.yml b/src/test/resources/application-db-mysql.yml new file mode 100644 index 0000000..68c4a70 --- /dev/null +++ b/src/test/resources/application-db-mysql.yml @@ -0,0 +1,12 @@ +spring: + datasource: + url: jdbc:mysql://localhost:3306/ficwriter-test + username: dl + password: p@ssword + initialization-mode: always + jpa: + hibernate: + ddl-auto: create-drop + properties: + hibernate: + dialect: org.hibernate.dialect.MySQL5InnoDBDialect \ No newline at end of file diff --git a/src/test/resources/application.yml b/src/test/resources/application.yml new file mode 100644 index 0000000..5828953 --- /dev/null +++ b/src/test/resources/application.yml @@ -0,0 +1,15 @@ +spring: + profiles: + active: db-mysql + jpa: + hibernate: + ddl-auto: create-drop + properties: + hibernate: + hbm2ddl: + import_files: data/user.sql, data/actor.sql, data/book.sql, data/article.sql, data/book_article.sql, data/actor_state.sql +logging: + level: + org: + springframework: INFO + diff --git a/src/test/resources/data/actor.sql b/src/test/resources/data/actor.sql new file mode 100644 index 0000000..bb9597c --- /dev/null +++ b/src/test/resources/data/actor.sql @@ -0,0 +1,10 @@ +INSERT INTO actor(id,description,name)VALUES(1,'description1','name1'); +INSERT INTO actor(id,description,name)VALUES(2,'description2','name2'); +INSERT INTO actor(id,description,name)VALUES(3,'description3','name3'); +INSERT INTO actor(id,description,name)VALUES(987,'description','name'); +INSERT INTO actor(id,description,name)VALUES(333,'description','name'); +INSERT INTO actor(id,description,name)VALUES(334,'description','name'); + + + + diff --git a/src/test/resources/data/actor_state.sql b/src/test/resources/data/actor_state.sql new file mode 100644 index 0000000..6e99aca --- /dev/null +++ b/src/test/resources/data/actor_state.sql @@ -0,0 +1,7 @@ +INSERT INTO actor_state(content,title,actor_id,article_id)VALUES('content1','title1',1,1); +INSERT INTO actor_state(content,title,actor_id,article_id)VALUES('content2','title2',1,2); +INSERT INTO actor_state(content,title,actor_id,article_id)VALUES('content3','title3',2,1); +INSERT INTO actor_state(content,title,actor_id,article_id)VALUES('content4','title4',2,2); + +INSERT INTO actor_state(content,title,actor_id,article_id)VALUES('content4','title4',333,3); +INSERT INTO actor_state(content,title,actor_id,article_id)VALUES('content4','title4',334,3); \ No newline at end of file diff --git a/src/test/resources/data/article.sql b/src/test/resources/data/article.sql new file mode 100644 index 0000000..3ca4a6e --- /dev/null +++ b/src/test/resources/data/article.sql @@ -0,0 +1,12 @@ +INSERT INTO article(id,annotation,content,title)VALUES(1,'annotation1','content1','title1'); +INSERT INTO article(id,annotation,content,title)VALUES(2,'annotation2','content2','title2'); +INSERT INTO article(id,annotation,content,title)VALUES(3,'annotation','content','title'); +INSERT INTO article(id,annotation,content,title)VALUES(4,'annotation','content','title'); +INSERT INTO article(id,annotation,content,title)VALUES(333,'annotation','content','delete article'); +INSERT INTO article(id,annotation,content,title)VALUES(334,'annotation','content','delete article'); + +INSERT INTO article(id,annotation,content,title,book_id)VALUES(5,'Place for annotation','

Place for content.

','Summer inspiration',335); +INSERT INTO article(id,annotation,content,title,book_id)VALUES(6,'Place for annotation','

Place for content.

','Summer inspiration#2',335); +INSERT INTO article(id,annotation,content,title,book_id)VALUES(7,'Place for annotation','

Place for content.

','Summer #3',335); +INSERT INTO article(id,annotation,content,title,book_id)VALUES(8,'Place for annotation','

Place for content.

','Winrte',335); + diff --git a/src/test/resources/data/book.sql b/src/test/resources/data/book.sql new file mode 100644 index 0000000..b3adcdc --- /dev/null +++ b/src/test/resources/data/book.sql @@ -0,0 +1,15 @@ +INSERT INTO book(id,title)VALUES(1,'book title'); +INSERT INTO book(id,title,description)VALUES(2,'book title','description'); +INSERT INTO book(id,title,size)VALUES(3,'book title',1); +INSERT INTO book(id,title,state)VALUES(4,'book title',1); +INSERT INTO book(id,title)VALUES(5,'book title'); +INSERT INTO book(id,title)VALUES(333,'delete book'); +INSERT INTO book(id,title)VALUES(334,'Книга для удаления'); + +INSERT INTO book(id,title,description, size, state,author_id)VALUES(335,'Arabella','Artic monkeys', 1,2,3); +INSERT INTO user_books_as_author (user_id,books_as_author_id)VALUES(3,335); +INSERT INTO book_subauthors (user_id,book_id)VALUES(4,335); + + + + diff --git a/src/test/resources/data/book_article.sql b/src/test/resources/data/book_article.sql new file mode 100644 index 0000000..7cf2f23 --- /dev/null +++ b/src/test/resources/data/book_article.sql @@ -0,0 +1,5 @@ +INSERT INTO book_articles(book_id,articles_id)VALUES(334,334); +INSERT INTO book_articles(book_id,articles_id)VALUES(335,5); +INSERT INTO book_articles(book_id,articles_id)VALUES(335,6); +INSERT INTO book_articles(book_id,articles_id)VALUES(335,7); +INSERT INTO book_articles(book_id,articles_id)VALUES(335,8); \ No newline at end of file diff --git a/src/test/resources/data/user.sql b/src/test/resources/data/user.sql new file mode 100644 index 0000000..dd5d16b --- /dev/null +++ b/src/test/resources/data/user.sql @@ -0,0 +1,4 @@ +INSERT INTO user(id,username)VALUES(123,'delete user'); +INSERT INTO user(id,username)VALUES(1,'test user'); +INSERT INTO user(id,username)VALUES(3,'Bella'); +INSERT INTO user(id,username)VALUES(4,'Bella junior'); \ No newline at end of file