From 2129a8337c1fb2f165357ae9451ca6fcd1eb09e4 Mon Sep 17 00:00:00 2001 From: mIst Date: Sat, 9 Sep 2023 00:01:34 +0300 Subject: [PATCH] added category implementation --- .../bookstore/controller/BookController.java | 11 +-- .../controller/CategoryController.java | 79 +++++++++++++++++++ .../java/com/bookstore/dto/book/BookDto.java | 2 + .../dto/book/BookDtoWithoutCategoryIds.java | 15 ++++ .../dto/book/CreateBookRequestDto.java | 3 + .../bookstore/dto/category/CategoryDto.java | 9 +++ .../java/com/bookstore/mapper/BookMapper.java | 28 +++++++ .../com/bookstore/mapper/CategoryMapper.java | 13 +++ src/main/java/com/bookstore/model/Book.java | 11 +++ .../java/com/bookstore/model/Category.java | 31 ++++++++ .../repository/book/BookRepository.java | 18 +++++ .../category/CategoryRepository.java | 9 +++ .../com/bookstore/service/BookService.java | 5 +- .../bookstore/service/CategoryService.java | 17 ++++ .../service/impl/BookServiceImpl.java | 23 +++++- .../service/impl/CategoryServiceImpl.java | 56 +++++++++++++ .../changes/07-create-categories-table.yaml | 29 +++++++ .../08-create-books-categories-table.yaml | 26 ++++++ .../db/changelog/db.changelog-master.yaml | 6 +- 19 files changed, 381 insertions(+), 10 deletions(-) create mode 100644 src/main/java/com/bookstore/controller/CategoryController.java create mode 100644 src/main/java/com/bookstore/dto/book/BookDtoWithoutCategoryIds.java create mode 100644 src/main/java/com/bookstore/dto/category/CategoryDto.java create mode 100644 src/main/java/com/bookstore/mapper/CategoryMapper.java create mode 100644 src/main/java/com/bookstore/model/Category.java create mode 100644 src/main/java/com/bookstore/repository/category/CategoryRepository.java create mode 100644 src/main/java/com/bookstore/service/CategoryService.java create mode 100644 src/main/java/com/bookstore/service/impl/CategoryServiceImpl.java create mode 100644 src/main/resources/db/changelog/changes/07-create-categories-table.yaml create mode 100644 src/main/resources/db/changelog/changes/08-create-books-categories-table.yaml diff --git a/src/main/java/com/bookstore/controller/BookController.java b/src/main/java/com/bookstore/controller/BookController.java index 61acd98..efe6dee 100644 --- a/src/main/java/com/bookstore/controller/BookController.java +++ b/src/main/java/com/bookstore/controller/BookController.java @@ -46,14 +46,14 @@ public BookDto getBookById(@PathVariable Long id) { @GetMapping("/search") @PreAuthorize("hasRole('USER')") @Operation(summary = "Search books", description = "Search book by specific search parameters") - public List searchBooks(BookSearchParametersDto searchParameters, Pageable pageable) { - return bookService.searchBooks(searchParameters, pageable); + public List searchBooks(BookSearchParametersDto searchParameters) { + return bookService.searchBooks(searchParameters); } @PostMapping @ResponseStatus(HttpStatus.CREATED) @PreAuthorize("hasRole('ADMIN')") - @Operation(summary = "Create a new book", description = "Create a new book") + @Operation(summary = "Create a new book(only for admins)", description = "Create a new book") public BookDto createBook(@RequestBody @Valid CreateBookRequestDto bookRequestDto) { return bookService.createBook(bookRequestDto); } @@ -61,7 +61,8 @@ public BookDto createBook(@RequestBody @Valid CreateBookRequestDto bookRequestDt @PutMapping("/{id}") @ResponseStatus(HttpStatus.ACCEPTED) @PreAuthorize("hasRole('ADMIN')") - @Operation(summary = "Update the existing book", description = "Update the existing book") + @Operation(summary = "Update the existing book(only for admins)", + description = "Update the existing book") public void updateBook(@PathVariable Long id, @RequestBody @Valid CreateBookRequestDto bookRequestDto) { bookService.updateBook(id, bookRequestDto); @@ -69,7 +70,7 @@ public void updateBook(@PathVariable Long id, @DeleteMapping("/{id}") @PreAuthorize("hasRole('ADMIN')") - @Operation(summary = "Delete book", description = "Delete book by specific id") + @Operation(summary = "Delete book(only for admins)", description = "Delete book by specific id") public void deleteBookById(@PathVariable Long id) { bookService.deleteBookById(id); } diff --git a/src/main/java/com/bookstore/controller/CategoryController.java b/src/main/java/com/bookstore/controller/CategoryController.java new file mode 100644 index 0000000..0b5820e --- /dev/null +++ b/src/main/java/com/bookstore/controller/CategoryController.java @@ -0,0 +1,79 @@ +package com.bookstore.controller; + +import com.bookstore.dto.book.BookDtoWithoutCategoryIds; +import com.bookstore.dto.category.CategoryDto; +import com.bookstore.service.BookService; +import com.bookstore.service.CategoryService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Pageable; +import org.springframework.http.HttpStatus; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.RestController; + +@Tag(name = "Category management", description = "Endpoints for managing categories") +@RequiredArgsConstructor +@RestController +@RequestMapping(value = "/api/categories") +public class CategoryController { + private final CategoryService categoryService; + private final BookService bookService; + + @PostMapping + @ResponseStatus(HttpStatus.CREATED) + @PreAuthorize("hasRole('ADMIN')") + @Operation(summary = "Create a new category(only for admins)", + description = "Create a new category") + public CategoryDto createCategory(@RequestBody CategoryDto categoryDto) { + return categoryService.save(categoryDto); + } + + @GetMapping + @PreAuthorize("hasRole('USER')") + @Operation(summary = "Get all categories", description = "Get all categories") + public List getAll(Pageable pageable) { + return categoryService.findAll(pageable); + } + + @GetMapping("/{id}") + @PreAuthorize("hasRole('USER')") + @Operation(summary = "Get category by specific id", description = "Get category by specific id") + public CategoryDto getCategoryById(@PathVariable Long id) { + return categoryService.getById(id); + } + + @PutMapping("/{id}") + @ResponseStatus(HttpStatus.ACCEPTED) + @PreAuthorize("hasRole('ADMIN')") + @Operation(summary = "Update category(only for admins)", description = "Update category") + public CategoryDto updateCategory(@PathVariable Long id, + @RequestBody CategoryDto categoryDto) { + return categoryService.update(id, categoryDto); + } + + @DeleteMapping("/{id}") + @PreAuthorize("hasRole('ADMIN')") + @Operation(summary = "Delete book(only for admins)", description = "Delete book") + public void deleteCategory(@PathVariable Long id) { + categoryService.deleteById(id); + } + + @GetMapping("/{id}/books") + @PreAuthorize("hasRole('USER')") + @Operation(summary = "Get books by specific category_id", + description = "Get books by specific category_id") + public List getBooksByCategoryId(@PathVariable Long id, + Pageable pageable) { + return bookService.findAllByCategoryId(id, pageable); + } +} diff --git a/src/main/java/com/bookstore/dto/book/BookDto.java b/src/main/java/com/bookstore/dto/book/BookDto.java index bbd6c25..2dc0f8b 100644 --- a/src/main/java/com/bookstore/dto/book/BookDto.java +++ b/src/main/java/com/bookstore/dto/book/BookDto.java @@ -1,6 +1,7 @@ package com.bookstore.dto.book; import java.math.BigDecimal; +import java.util.Set; import lombok.Data; @Data @@ -12,4 +13,5 @@ public class BookDto { private BigDecimal price; private String description; private String coverImage; + private Set categoryIds; } diff --git a/src/main/java/com/bookstore/dto/book/BookDtoWithoutCategoryIds.java b/src/main/java/com/bookstore/dto/book/BookDtoWithoutCategoryIds.java new file mode 100644 index 0000000..1193887 --- /dev/null +++ b/src/main/java/com/bookstore/dto/book/BookDtoWithoutCategoryIds.java @@ -0,0 +1,15 @@ +package com.bookstore.dto.book; + +import java.math.BigDecimal; +import lombok.Data; + +@Data +public class BookDtoWithoutCategoryIds { + private Long id; + private String title; + private String author; + private String isbn; + private BigDecimal price; + private String description; + private String coverImage; +} diff --git a/src/main/java/com/bookstore/dto/book/CreateBookRequestDto.java b/src/main/java/com/bookstore/dto/book/CreateBookRequestDto.java index 419dd32..a197974 100644 --- a/src/main/java/com/bookstore/dto/book/CreateBookRequestDto.java +++ b/src/main/java/com/bookstore/dto/book/CreateBookRequestDto.java @@ -4,6 +4,7 @@ import jakarta.validation.constraints.Min; import jakarta.validation.constraints.NotNull; import java.math.BigDecimal; +import java.util.Set; import lombok.Data; @Data @@ -19,4 +20,6 @@ public class CreateBookRequestDto { private BigDecimal price; private String description; private String coverImage; + @NotNull + private Set categoryIds; } diff --git a/src/main/java/com/bookstore/dto/category/CategoryDto.java b/src/main/java/com/bookstore/dto/category/CategoryDto.java new file mode 100644 index 0000000..e2e4614 --- /dev/null +++ b/src/main/java/com/bookstore/dto/category/CategoryDto.java @@ -0,0 +1,9 @@ +package com.bookstore.dto.category; + +import lombok.Data; + +@Data +public class CategoryDto { + private String name; + private String description; +} diff --git a/src/main/java/com/bookstore/mapper/BookMapper.java b/src/main/java/com/bookstore/mapper/BookMapper.java index 90d3b62..5e4d60e 100644 --- a/src/main/java/com/bookstore/mapper/BookMapper.java +++ b/src/main/java/com/bookstore/mapper/BookMapper.java @@ -2,13 +2,41 @@ import com.bookstore.config.MapperConfig; import com.bookstore.dto.book.BookDto; +import com.bookstore.dto.book.BookDtoWithoutCategoryIds; import com.bookstore.dto.book.CreateBookRequestDto; import com.bookstore.model.Book; +import com.bookstore.model.Category; +import java.util.Set; +import java.util.stream.Collectors; +import org.mapstruct.AfterMapping; import org.mapstruct.Mapper; +import org.mapstruct.MappingTarget; +import org.mapstruct.Named; @Mapper(config = MapperConfig.class) public interface BookMapper { BookDto toDto(Book book); Book toBookModel(CreateBookRequestDto bookRequestDto); + + BookDtoWithoutCategoryIds toDtoWithoutCategories(Book book); + + @AfterMapping + default void setCategoryIds(@MappingTarget BookDto bookDto, Book book) { + Set ids = book.getCategories() + .stream() + .map(Category::getId) + .collect(Collectors.toSet()); + bookDto.setCategoryIds(ids); + } + + @Named("bookFromId") + default Book bookFromId(Long id) { + if (id == null) { + throw new RuntimeException("Id can't be null."); + } + Book book = new Book(); + book.setId(id); + return book; + } } diff --git a/src/main/java/com/bookstore/mapper/CategoryMapper.java b/src/main/java/com/bookstore/mapper/CategoryMapper.java new file mode 100644 index 0000000..8c13732 --- /dev/null +++ b/src/main/java/com/bookstore/mapper/CategoryMapper.java @@ -0,0 +1,13 @@ +package com.bookstore.mapper; + +import com.bookstore.config.MapperConfig; +import com.bookstore.dto.category.CategoryDto; +import com.bookstore.model.Category; +import org.mapstruct.Mapper; + +@Mapper(config = MapperConfig.class) +public interface CategoryMapper { + CategoryDto toDto(Category category); + + Category toEntity(CategoryDto categoryDto); +} diff --git a/src/main/java/com/bookstore/model/Book.java b/src/main/java/com/bookstore/model/Book.java index a2cda5e..712264a 100644 --- a/src/main/java/com/bookstore/model/Book.java +++ b/src/main/java/com/bookstore/model/Book.java @@ -5,8 +5,13 @@ import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.JoinTable; +import jakarta.persistence.ManyToMany; import jakarta.persistence.Table; import java.math.BigDecimal; +import java.util.HashSet; +import java.util.Set; import lombok.Getter; import lombok.Setter; import org.hibernate.annotations.SQLDelete; @@ -36,5 +41,11 @@ public class Book { private String coverImage; @Column(name = "is_deleted", nullable = false) + @ManyToMany + @JoinTable(name = "books_categories", + joinColumns = @JoinColumn(name = "book_id"), + inverseJoinColumns = @JoinColumn(name = "category_id")) + private Set categories = new HashSet<>(); + @Column(name = "is_deleted", nullable = false) private boolean isDeleted = false; } diff --git a/src/main/java/com/bookstore/model/Category.java b/src/main/java/com/bookstore/model/Category.java new file mode 100644 index 0000000..7bbe392 --- /dev/null +++ b/src/main/java/com/bookstore/model/Category.java @@ -0,0 +1,31 @@ +package com.bookstore.model; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; +import org.hibernate.annotations.SQLDelete; +import org.hibernate.annotations.Where; + +@Getter +@Setter +@EqualsAndHashCode +@Entity +@SQLDelete(sql = "UPDATE categories SET is_deleted=true WHERE id=?") +@Where(clause = "is_deleted=false") +@Table(name = "categories") +public class Category { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + @Column(nullable = false) + private String name; + private String description; + @Column(name = "is_deleted", nullable = false) + private boolean isDeleted = false; +} diff --git a/src/main/java/com/bookstore/repository/book/BookRepository.java b/src/main/java/com/bookstore/repository/book/BookRepository.java index bad38f5..e6d3bb3 100644 --- a/src/main/java/com/bookstore/repository/book/BookRepository.java +++ b/src/main/java/com/bookstore/repository/book/BookRepository.java @@ -1,9 +1,27 @@ package com.bookstore.repository.book; import com.bookstore.model.Book; +import java.util.List; +import java.util.Optional; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.data.jpa.repository.EntityGraph; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; +import org.springframework.data.jpa.repository.Query; public interface BookRepository extends JpaRepository, JpaSpecificationExecutor { + @Query("FROM Book b JOIN FETCH b.categories c " + + "WHERE c.id = :categoryId") + List findAllByCategoryId(Long categoryId, Pageable pageable); + + @EntityGraph(attributePaths = "categories") + Optional findById(Long id); + + @Query("FROM Book b LEFT JOIN FETCH b.categories c") + List findAllPageable(Pageable pageable); + + @EntityGraph(attributePaths = "categories") + List findAll(Specification bookSpecification); } diff --git a/src/main/java/com/bookstore/repository/category/CategoryRepository.java b/src/main/java/com/bookstore/repository/category/CategoryRepository.java new file mode 100644 index 0000000..e207c07 --- /dev/null +++ b/src/main/java/com/bookstore/repository/category/CategoryRepository.java @@ -0,0 +1,9 @@ +package com.bookstore.repository.category; + +import com.bookstore.model.Category; +import java.util.Set; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface CategoryRepository extends JpaRepository { + Set findByIdIn(Set categoryIds); +} diff --git a/src/main/java/com/bookstore/service/BookService.java b/src/main/java/com/bookstore/service/BookService.java index 5c4e96e..5321645 100644 --- a/src/main/java/com/bookstore/service/BookService.java +++ b/src/main/java/com/bookstore/service/BookService.java @@ -1,6 +1,7 @@ package com.bookstore.service; import com.bookstore.dto.book.BookDto; +import com.bookstore.dto.book.BookDtoWithoutCategoryIds; import com.bookstore.dto.book.BookSearchParametersDto; import com.bookstore.dto.book.CreateBookRequestDto; import java.util.List; @@ -17,5 +18,7 @@ public interface BookService { void deleteBookById(Long id); - List searchBooks(BookSearchParametersDto searchParameters, Pageable pageable); + List searchBooks(BookSearchParametersDto searchParameters); + + List findAllByCategoryId(Long categoryId, Pageable pageable); } diff --git a/src/main/java/com/bookstore/service/CategoryService.java b/src/main/java/com/bookstore/service/CategoryService.java new file mode 100644 index 0000000..4d2398c --- /dev/null +++ b/src/main/java/com/bookstore/service/CategoryService.java @@ -0,0 +1,17 @@ +package com.bookstore.service; + +import com.bookstore.dto.category.CategoryDto; +import java.util.List; +import org.springframework.data.domain.Pageable; + +public interface CategoryService { + List findAll(Pageable pageable); + + CategoryDto getById(Long id); + + CategoryDto save(CategoryDto categoryDto); + + CategoryDto update(Long id, CategoryDto categoryDto); + + void deleteById(Long id); +} diff --git a/src/main/java/com/bookstore/service/impl/BookServiceImpl.java b/src/main/java/com/bookstore/service/impl/BookServiceImpl.java index 32d3814..adf8f5a 100644 --- a/src/main/java/com/bookstore/service/impl/BookServiceImpl.java +++ b/src/main/java/com/bookstore/service/impl/BookServiceImpl.java @@ -1,15 +1,19 @@ package com.bookstore.service.impl; import com.bookstore.dto.book.BookDto; +import com.bookstore.dto.book.BookDtoWithoutCategoryIds; import com.bookstore.dto.book.BookSearchParametersDto; import com.bookstore.dto.book.CreateBookRequestDto; import com.bookstore.exception.EntityNotFoundException; import com.bookstore.mapper.BookMapper; import com.bookstore.model.Book; +import com.bookstore.model.Category; import com.bookstore.repository.book.BookRepository; import com.bookstore.repository.book.BookSpecificationBuilder; +import com.bookstore.repository.category.CategoryRepository; import com.bookstore.service.BookService; import java.util.List; +import java.util.Set; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.domain.Specification; @@ -19,12 +23,15 @@ @Service public class BookServiceImpl implements BookService { private final BookRepository bookRepository; + private final CategoryRepository categoryRepository; private final BookMapper bookMapper; private final BookSpecificationBuilder bookSpecificationBuilder; @Override public BookDto createBook(CreateBookRequestDto bookRequestDto) { + Set categories = categoryRepository.findByIdIn(bookRequestDto.getCategoryIds()); Book book = bookMapper.toBookModel(bookRequestDto); + book.setCategories(categories); return bookMapper.toDto(bookRepository.save(book)); } @@ -38,7 +45,7 @@ public BookDto getBookById(Long id) { @Override public List getAll(Pageable pageable) { - return bookRepository.findAll(pageable) + return bookRepository.findAllPageable(pageable) .stream() .map(bookMapper::toDto) .toList(); @@ -46,6 +53,7 @@ public List getAll(Pageable pageable) { @Override public void updateBook(Long id, CreateBookRequestDto bookRequestDto) { + Set categories = categoryRepository.findByIdIn(bookRequestDto.getCategoryIds()); Book bookFromDb = bookRepository.findById(id) .orElseThrow(() -> new EntityNotFoundException("No book in DB by id: " + id)); @@ -55,6 +63,7 @@ public void updateBook(Long id, CreateBookRequestDto bookRequestDto) { bookFromDb.setIsbn(bookRequestDto.getIsbn()); bookFromDb.setDescription(bookRequestDto.getDescription()); bookFromDb.setCoverImage(bookRequestDto.getCoverImage()); + bookFromDb.setCategories(categories); bookRepository.save(bookFromDb); } @@ -64,11 +73,19 @@ public void deleteBookById(Long id) { } @Override - public List searchBooks(BookSearchParametersDto searchParameters, Pageable pageable) { + public List searchBooks(BookSearchParametersDto searchParameters) { Specification bookSpecification = bookSpecificationBuilder.build(searchParameters); - return bookRepository.findAll(bookSpecification, pageable) + return bookRepository.findAll(bookSpecification) .stream() .map(bookMapper::toDto) .toList(); } + + @Override + public List findAllByCategoryId(Long categoryId, Pageable pageable) { + return bookRepository.findAllByCategoryId(categoryId, pageable) + .stream() + .map(bookMapper::toDtoWithoutCategories) + .toList(); + } } diff --git a/src/main/java/com/bookstore/service/impl/CategoryServiceImpl.java b/src/main/java/com/bookstore/service/impl/CategoryServiceImpl.java new file mode 100644 index 0000000..cf78d8b --- /dev/null +++ b/src/main/java/com/bookstore/service/impl/CategoryServiceImpl.java @@ -0,0 +1,56 @@ +package com.bookstore.service.impl; + +import com.bookstore.dto.category.CategoryDto; +import com.bookstore.exception.EntityNotFoundException; +import com.bookstore.mapper.CategoryMapper; +import com.bookstore.model.Category; +import com.bookstore.repository.category.CategoryRepository; +import com.bookstore.service.CategoryService; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Component; + +@RequiredArgsConstructor +@Component +public class CategoryServiceImpl implements CategoryService { + private final CategoryRepository categoryRepository; + private final CategoryMapper categoryMapper; + + @Override + public List findAll(Pageable pageable) { + return categoryRepository.findAll(pageable) + .stream() + .map(categoryMapper::toDto) + .toList(); + } + + @Override + public CategoryDto getById(Long id) { + return categoryRepository.findById(id) + .map(categoryMapper::toDto) + .orElseThrow(() -> + new EntityNotFoundException("Can't find a category in DB by id: " + id)); + } + + @Override + public CategoryDto save(CategoryDto categoryDto) { + Category category = categoryMapper.toEntity(categoryDto); + return categoryMapper.toDto(categoryRepository.save(category)); + } + + @Override + public CategoryDto update(Long id, CategoryDto categoryDto) { + Category category = categoryRepository.findById(id) + .orElseThrow(() -> + new EntityNotFoundException("Can't find a category in DB by id: " + id)); + category.setName(categoryDto.getName()); + category.setDescription(categoryDto.getDescription()); + return categoryMapper.toDto(categoryRepository.save(category)); + } + + @Override + public void deleteById(Long id) { + categoryRepository.deleteById(id); + } +} diff --git a/src/main/resources/db/changelog/changes/07-create-categories-table.yaml b/src/main/resources/db/changelog/changes/07-create-categories-table.yaml new file mode 100644 index 0000000..e1dc56c --- /dev/null +++ b/src/main/resources/db/changelog/changes/07-create-categories-table.yaml @@ -0,0 +1,29 @@ +databaseChangeLog: + - changeSet: + id: create-categories-table + author: fmIst0 + changes: + - createTable: + tableName: categories + columns: + - column: + name: id + type: bigint + autoIncrement: true + constraints: + primaryKey: true + nullable: false + - column: + name: name + type: varchar(255) + constraints: + nullable: false + - column: + name: description + type: varchar(255) + - column: + name: is_deleted + type: boolean + defaultValueBoolean: false + constraints: + nullable: false \ No newline at end of file diff --git a/src/main/resources/db/changelog/changes/08-create-books-categories-table.yaml b/src/main/resources/db/changelog/changes/08-create-books-categories-table.yaml new file mode 100644 index 0000000..5c4d826 --- /dev/null +++ b/src/main/resources/db/changelog/changes/08-create-books-categories-table.yaml @@ -0,0 +1,26 @@ +databaseChangeLog: + - changeSet: + id: create-books-categories-table + author: fmIst0 + changes: + - createTable: + tableName: books_categories + columns: + - column: + name: book_id + type: bigint + constraints: + foreignKeyName: fk_books_categories_books + referencedTableName: books + referencedColumnNames: id + nullable: false + primaryKey: true + - column: + name: category_id + type: bigint + constraints: + foreignKeyName: fk_books_categories_categories + referencedTableName: categories + referencedColumnNames: id + nullable: false + primaryKey: true \ No newline at end of file diff --git a/src/main/resources/db/changelog/db.changelog-master.yaml b/src/main/resources/db/changelog/db.changelog-master.yaml index 7e3e498..8f3ad47 100644 --- a/src/main/resources/db/changelog/db.changelog-master.yaml +++ b/src/main/resources/db/changelog/db.changelog-master.yaml @@ -10,4 +10,8 @@ databaseChangeLog: - include: file: db/changelog/changes/05-create-users-roles-table.yaml - include: - file: db/changelog/changes/06-insert-data-to-roles-table.yaml \ No newline at end of file + file: db/changelog/changes/06-insert-data-to-roles-table.yaml + - include: + file: db/changelog/changes/07-create-categories-table.yaml + - include: + file: db/changelog/changes/08-create-books-categories-table.yaml \ No newline at end of file