Loading book-service/src/main/java/cz/muni/fi/pa165/books/config/SecurityConfig.java +9 −3 Original line number Diff line number Diff line Loading @@ -31,15 +31,21 @@ public class SecurityConfig { "/actuator/**" ).permitAll() .requestMatchers(HttpMethod.GET, "/books/physical-books/**").hasAnyAuthority(ADMIN_SCOPE, LIBRARIAN_SCOPE, MEMBER_SCOPE) .requestMatchers(HttpMethod.GET, "/books/physical-books/**").permitAll() .requestMatchers(HttpMethod.POST, "/books/physical-books/**").hasAnyAuthority(ADMIN_SCOPE, LIBRARIAN_SCOPE) .requestMatchers(HttpMethod.PUT, "/books/physical-books/**").hasAnyAuthority(ADMIN_SCOPE, LIBRARIAN_SCOPE) .requestMatchers(HttpMethod.DELETE, "/books/physical-books/**").hasAnyAuthority(ADMIN_SCOPE, LIBRARIAN_SCOPE) .requestMatchers(HttpMethod.GET, "/books/abstract-books/**").hasAnyAuthority(ADMIN_SCOPE, LIBRARIAN_SCOPE, MEMBER_SCOPE) .requestMatchers(HttpMethod.GET, "/books/abstract-books/**").permitAll() .requestMatchers(HttpMethod.POST, "/books/abstract-books/**").hasAnyAuthority(ADMIN_SCOPE, LIBRARIAN_SCOPE) .requestMatchers(HttpMethod.PUT, "/books/abstract-books/**").hasAnyAuthority(ADMIN_SCOPE, LIBRARIAN_SCOPE) .requestMatchers(HttpMethod.DELETE, "/books/abstract-books/**").hasAnyAuthority(ADMIN_SCOPE, LIBRARIAN_SCOPE)) .requestMatchers(HttpMethod.DELETE, "/books/abstract-books/**").hasAnyAuthority(ADMIN_SCOPE, LIBRARIAN_SCOPE) .requestMatchers(HttpMethod.GET, "/author/**").permitAll() .requestMatchers(HttpMethod.POST, "/author/**").hasAnyAuthority(ADMIN_SCOPE, LIBRARIAN_SCOPE) .requestMatchers(HttpMethod.DELETE, "/author/**").hasAnyAuthority(ADMIN_SCOPE, LIBRARIAN_SCOPE) .requestMatchers(HttpMethod.DELETE, "/repository/**").hasAnyAuthority(ADMIN_SCOPE)) .oauth2ResourceServer(oauth2 -> oauth2.opaqueToken(Customizer.withDefaults())); Loading book-service/src/main/java/cz/muni/fi/pa165/books/data/model/AbstractBook.java +4 −28 Original line number Diff line number Diff line Loading @@ -19,47 +19,23 @@ public class AbstractBook extends BaseModel { @Column(name = "title", length = 255, nullable = false) private String title; @Column(name = "author", length = 120, nullable = false) private String author; @ManyToOne(optional = false) private Author author; // todo uncomment for next milestone too many things use abstractBookId now // @ManyToOne // @JoinColumn(name = "abstract_book_id", nullable = false) // private AbstractBook abstractBook; @ElementCollection @CollectionTable(name = "abstract_book_physical_books", joinColumns = @JoinColumn(name = "abstract_book_id")) @Column(name = "physical_book_id") private List<UUID> physicalBookIds = new ArrayList<>(); @OneToMany(mappedBy = "abstractBook", cascade = CascadeType.ALL, orphanRemoval = true) private List<PhysicalBook> physicalBooks; @ElementCollection @CollectionTable(name = "genres_books", joinColumns = @JoinColumn(name = "abstract_book_id")) @Column(name = "genre", length = 100) private Set<String> genre = new HashSet<>(); public AbstractBook(String title, String author, Set<String> genre) { this.title = title; this.author = author; this.genre.addAll(genre); } public AbstractBook(UUID id, String title, String author, Set<String> genre) { setId(id); this.title = title; this.author = author; this.genre.addAll(genre); } public AbstractBook() { } @Override public String toString() { return "AbstractBook{" + "id = " + getId() + ", author='" + getAuthor() + '\'' + ", title='" + getTitle() + '\'' + ", physicalBookIds=" + physicalBookIds + '}'; } } No newline at end of file book-service/src/main/java/cz/muni/fi/pa165/books/data/model/Author.java 0 → 100644 +29 −0 Original line number Diff line number Diff line package cz.muni.fi.pa165.books.data.model; import cz.muni.fi.pa165.commons.BaseModel; import jakarta.persistence.*; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; import java.util.List; @Getter @Setter @Entity @EqualsAndHashCode(callSuper = false) @Table(name = "Author") public class Author extends BaseModel { @OneToMany(mappedBy = "author", cascade = CascadeType.ALL, orphanRemoval = true) private List<AbstractBook> abstractBooks; @Column(name = "firstName", length = 35, nullable = false) private String firstName; @Column(name = "lastName", length = 35, nullable = false) private String lastName; @Column(name = "biography", length = 255, nullable = false) private String biography; } book-service/src/main/java/cz/muni/fi/pa165/books/data/model/PhysicalBook.java +3 −7 Original line number Diff line number Diff line Loading @@ -15,13 +15,9 @@ import java.util.UUID; @Table(name = "PhysicalBook") public class PhysicalBook extends BaseModel { // todo uncomment for next milestone too many things use abstractBookId now // @ManyToOne(optional = false) // @JoinColumn(name = "abstract_book_id", nullable = false) // private AbstractBook abstractBook; @Column(name = "abstractBookId") private UUID abstractBookId; @ManyToOne(optional = false) @JoinColumn(name = "abstract_book_id", nullable = false) private AbstractBook abstractBook; @Column(name = "condition") private String condition; Loading book-service/src/main/java/cz/muni/fi/pa165/books/data/repository/AbstractBookRepository.java +11 −5 Original line number Diff line number Diff line Loading @@ -14,14 +14,20 @@ import java.util.UUID; @Repository public interface AbstractBookRepository extends JpaRepository<AbstractBook, UUID> { @Query("SELECT l FROM AbstractBook l LEFT JOIN l.genre g WHERE " + "(:title IS NULL OR LOWER(l.title) LIKE LOWER(CONCAT('%', :title, '%'))) " + "AND (:genre IS NULL OR LOWER(g) LIKE LOWER(CONCAT('%', :genre, '%'))) " + "AND (:author IS NULL OR LOWER(l.author) LIKE LOWER(CONCAT('%', :author, '%')))") @Query(""" SELECT l FROM AbstractBook l LEFT JOIN l.genre g LEFT JOIN l.author a WHERE (:title IS NULL OR LOWER(l.title) LIKE LOWER(CONCAT('%', :title, '%'))) AND (:genre IS NULL OR LOWER(g) LIKE LOWER(CONCAT('%', :genre, '%'))) AND ( :author IS NULL OR LOWER(CONCAT(a.firstName, ' ', a.lastName)) LIKE LOWER(CONCAT('%', :author, '%')) ) """) List<AbstractBook>findByTitleOrGenreOrAuthor( @Param("title") String title, @Param("genre") String genre, @Param("author") String author ); } No newline at end of file Loading
book-service/src/main/java/cz/muni/fi/pa165/books/config/SecurityConfig.java +9 −3 Original line number Diff line number Diff line Loading @@ -31,15 +31,21 @@ public class SecurityConfig { "/actuator/**" ).permitAll() .requestMatchers(HttpMethod.GET, "/books/physical-books/**").hasAnyAuthority(ADMIN_SCOPE, LIBRARIAN_SCOPE, MEMBER_SCOPE) .requestMatchers(HttpMethod.GET, "/books/physical-books/**").permitAll() .requestMatchers(HttpMethod.POST, "/books/physical-books/**").hasAnyAuthority(ADMIN_SCOPE, LIBRARIAN_SCOPE) .requestMatchers(HttpMethod.PUT, "/books/physical-books/**").hasAnyAuthority(ADMIN_SCOPE, LIBRARIAN_SCOPE) .requestMatchers(HttpMethod.DELETE, "/books/physical-books/**").hasAnyAuthority(ADMIN_SCOPE, LIBRARIAN_SCOPE) .requestMatchers(HttpMethod.GET, "/books/abstract-books/**").hasAnyAuthority(ADMIN_SCOPE, LIBRARIAN_SCOPE, MEMBER_SCOPE) .requestMatchers(HttpMethod.GET, "/books/abstract-books/**").permitAll() .requestMatchers(HttpMethod.POST, "/books/abstract-books/**").hasAnyAuthority(ADMIN_SCOPE, LIBRARIAN_SCOPE) .requestMatchers(HttpMethod.PUT, "/books/abstract-books/**").hasAnyAuthority(ADMIN_SCOPE, LIBRARIAN_SCOPE) .requestMatchers(HttpMethod.DELETE, "/books/abstract-books/**").hasAnyAuthority(ADMIN_SCOPE, LIBRARIAN_SCOPE)) .requestMatchers(HttpMethod.DELETE, "/books/abstract-books/**").hasAnyAuthority(ADMIN_SCOPE, LIBRARIAN_SCOPE) .requestMatchers(HttpMethod.GET, "/author/**").permitAll() .requestMatchers(HttpMethod.POST, "/author/**").hasAnyAuthority(ADMIN_SCOPE, LIBRARIAN_SCOPE) .requestMatchers(HttpMethod.DELETE, "/author/**").hasAnyAuthority(ADMIN_SCOPE, LIBRARIAN_SCOPE) .requestMatchers(HttpMethod.DELETE, "/repository/**").hasAnyAuthority(ADMIN_SCOPE)) .oauth2ResourceServer(oauth2 -> oauth2.opaqueToken(Customizer.withDefaults())); Loading
book-service/src/main/java/cz/muni/fi/pa165/books/data/model/AbstractBook.java +4 −28 Original line number Diff line number Diff line Loading @@ -19,47 +19,23 @@ public class AbstractBook extends BaseModel { @Column(name = "title", length = 255, nullable = false) private String title; @Column(name = "author", length = 120, nullable = false) private String author; @ManyToOne(optional = false) private Author author; // todo uncomment for next milestone too many things use abstractBookId now // @ManyToOne // @JoinColumn(name = "abstract_book_id", nullable = false) // private AbstractBook abstractBook; @ElementCollection @CollectionTable(name = "abstract_book_physical_books", joinColumns = @JoinColumn(name = "abstract_book_id")) @Column(name = "physical_book_id") private List<UUID> physicalBookIds = new ArrayList<>(); @OneToMany(mappedBy = "abstractBook", cascade = CascadeType.ALL, orphanRemoval = true) private List<PhysicalBook> physicalBooks; @ElementCollection @CollectionTable(name = "genres_books", joinColumns = @JoinColumn(name = "abstract_book_id")) @Column(name = "genre", length = 100) private Set<String> genre = new HashSet<>(); public AbstractBook(String title, String author, Set<String> genre) { this.title = title; this.author = author; this.genre.addAll(genre); } public AbstractBook(UUID id, String title, String author, Set<String> genre) { setId(id); this.title = title; this.author = author; this.genre.addAll(genre); } public AbstractBook() { } @Override public String toString() { return "AbstractBook{" + "id = " + getId() + ", author='" + getAuthor() + '\'' + ", title='" + getTitle() + '\'' + ", physicalBookIds=" + physicalBookIds + '}'; } } No newline at end of file
book-service/src/main/java/cz/muni/fi/pa165/books/data/model/Author.java 0 → 100644 +29 −0 Original line number Diff line number Diff line package cz.muni.fi.pa165.books.data.model; import cz.muni.fi.pa165.commons.BaseModel; import jakarta.persistence.*; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; import java.util.List; @Getter @Setter @Entity @EqualsAndHashCode(callSuper = false) @Table(name = "Author") public class Author extends BaseModel { @OneToMany(mappedBy = "author", cascade = CascadeType.ALL, orphanRemoval = true) private List<AbstractBook> abstractBooks; @Column(name = "firstName", length = 35, nullable = false) private String firstName; @Column(name = "lastName", length = 35, nullable = false) private String lastName; @Column(name = "biography", length = 255, nullable = false) private String biography; }
book-service/src/main/java/cz/muni/fi/pa165/books/data/model/PhysicalBook.java +3 −7 Original line number Diff line number Diff line Loading @@ -15,13 +15,9 @@ import java.util.UUID; @Table(name = "PhysicalBook") public class PhysicalBook extends BaseModel { // todo uncomment for next milestone too many things use abstractBookId now // @ManyToOne(optional = false) // @JoinColumn(name = "abstract_book_id", nullable = false) // private AbstractBook abstractBook; @Column(name = "abstractBookId") private UUID abstractBookId; @ManyToOne(optional = false) @JoinColumn(name = "abstract_book_id", nullable = false) private AbstractBook abstractBook; @Column(name = "condition") private String condition; Loading
book-service/src/main/java/cz/muni/fi/pa165/books/data/repository/AbstractBookRepository.java +11 −5 Original line number Diff line number Diff line Loading @@ -14,14 +14,20 @@ import java.util.UUID; @Repository public interface AbstractBookRepository extends JpaRepository<AbstractBook, UUID> { @Query("SELECT l FROM AbstractBook l LEFT JOIN l.genre g WHERE " + "(:title IS NULL OR LOWER(l.title) LIKE LOWER(CONCAT('%', :title, '%'))) " + "AND (:genre IS NULL OR LOWER(g) LIKE LOWER(CONCAT('%', :genre, '%'))) " + "AND (:author IS NULL OR LOWER(l.author) LIKE LOWER(CONCAT('%', :author, '%')))") @Query(""" SELECT l FROM AbstractBook l LEFT JOIN l.genre g LEFT JOIN l.author a WHERE (:title IS NULL OR LOWER(l.title) LIKE LOWER(CONCAT('%', :title, '%'))) AND (:genre IS NULL OR LOWER(g) LIKE LOWER(CONCAT('%', :genre, '%'))) AND ( :author IS NULL OR LOWER(CONCAT(a.firstName, ' ', a.lastName)) LIKE LOWER(CONCAT('%', :author, '%')) ) """) List<AbstractBook>findByTitleOrGenreOrAuthor( @Param("title") String title, @Param("genre") String genre, @Param("author") String author ); } No newline at end of file