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 +}