Skip to content

Commit

Permalink
added book controller & mapper, added findById functionality
Browse files Browse the repository at this point in the history
  • Loading branch information
BlueVioletTeti committed Sep 10, 2023
1 parent 0278efa commit 33856ec
Show file tree
Hide file tree
Showing 15 changed files with 174 additions and 42 deletions.
34 changes: 33 additions & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
<properties>
<java.version>17</java.version>
<maven.checkstyle.plugin.configLocation>checkstyle.xml</maven.checkstyle.plugin.configLocation>
<org.mapstruct.version>1.5.5.Final</org.mapstruct.version>
</properties>
<dependencies>
<dependency>
Expand Down Expand Up @@ -48,14 +49,18 @@
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>3.0.6</version>
</dependency>

<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${org.mapstruct.version}</version>
</dependency>

</dependencies>

Expand Down Expand Up @@ -83,6 +88,33 @@
<consoleOutput>true</consoleOutput>
<failsOnError>true</failsOnError>
<linkXRef>false</linkXRef>
<sourceDirectories>src</sourceDirectories>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<annotationProcessorPaths>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${org.mapstruct.version}</version>
</path>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.28</version>
</path>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-mapstruct-binding</artifactId>
<version>0.2.0</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
Expand Down
24 changes: 0 additions & 24 deletions src/main/java/mate/academy/bookstore/BookstoreApplication.java
Original file line number Diff line number Diff line change
@@ -1,35 +1,11 @@
package mate.academy.bookstore;

import java.math.BigDecimal;
import lombok.RequiredArgsConstructor;
import mate.academy.bookstore.model.Book;
import mate.academy.bookstore.service.BookService;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

@RequiredArgsConstructor
@SpringBootApplication
public class BookstoreApplication {
private final BookService bookService;

public static void main(String[] args) {
SpringApplication.run(BookstoreApplication.class, args);
}

@Bean
public CommandLineRunner commandLineRunner() {
return args -> {
Book book = new Book();
book.setTitle("Book title");
book.setAuthor("Book author");
book.setIsbn("unique isbn");
book.setPrice(BigDecimal.valueOf(700));

bookService.save(book);

System.out.println(bookService.findAll());
};
}
}
13 changes: 13 additions & 0 deletions src/main/java/mate/academy/bookstore/config/MapperConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package mate.academy.bookstore.config;

import org.mapstruct.InjectionStrategy;
import org.mapstruct.NullValueCheckStrategy;

@org.mapstruct.MapperConfig(
componentModel = "spring",
injectionStrategy = InjectionStrategy.CONSTRUCTOR,
nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS,
implementationPackage = "<PACKAGE_NAME>.impl"
)
public class MapperConfig {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package mate.academy.bookstore.controller;

import java.util.List;
import lombok.RequiredArgsConstructor;
import mate.academy.bookstore.dto.BookDto;
import mate.academy.bookstore.dto.CreateBookRequestDto;
import mate.academy.bookstore.service.BookService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RequiredArgsConstructor
@RestController
@RequestMapping(value = "/api/books")
public class BookController {
private final BookService bookService;

@GetMapping
public List<BookDto> getAll() {
return bookService.findAll();
}

@GetMapping("/{id}")
public BookDto getBookById(Long id) {
return bookService.findById(id);
}

@PostMapping
public BookDto createBook(@RequestBody CreateBookRequestDto bookDto) {
return bookService.save(bookDto);
}
}
15 changes: 15 additions & 0 deletions src/main/java/mate/academy/bookstore/dto/BookDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package mate.academy.bookstore.dto;

import java.math.BigDecimal;
import lombok.Data;

@Data
public class BookDto {
private Long id;
private String title;
private String author;
private String isbn;
private BigDecimal price;
private String description;
private String coverImage;
}
14 changes: 14 additions & 0 deletions src/main/java/mate/academy/bookstore/dto/CreateBookRequestDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package mate.academy.bookstore.dto;

import java.math.BigDecimal;
import lombok.Data;

@Data
public class CreateBookRequestDto {
private String title;
private String author;
private String isbn;
private BigDecimal price;
private String description;
private String coverImage;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package mate.academy.bookstore.exceptions;

public class EntityNotFoundException extends RuntimeException {
public EntityNotFoundException(String message) {
super(message);
}
}
14 changes: 14 additions & 0 deletions src/main/java/mate/academy/bookstore/mapper/BookMapper.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package mate.academy.bookstore.mapper;

import mate.academy.bookstore.config.MapperConfig;
import mate.academy.bookstore.dto.BookDto;
import mate.academy.bookstore.dto.CreateBookRequestDto;
import mate.academy.bookstore.model.Book;
import org.mapstruct.Mapper;

@Mapper(config = MapperConfig.class)
public interface BookMapper {
BookDto toDto(Book book);

Book toModel(CreateBookRequestDto requestDto);
}
1 change: 0 additions & 1 deletion src/main/java/mate/academy/bookstore/model/Book.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,5 @@ public class Book {
@Column(nullable = false)
private BigDecimal price;
private String description;
@Column(name = "cover_image")
private String coverImage;
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
package mate.academy.bookstore.repository;

import java.util.List;
import java.util.Optional;
import mate.academy.bookstore.model.Book;

public interface BookRepository {
Book save(Book book);

List<Book> findAll();

Optional<Book> findById(Long id);
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,16 @@
import jakarta.persistence.EntityTransaction;
import jakarta.persistence.criteria.CriteriaQuery;
import java.util.List;
import java.util.Optional;
import lombok.RequiredArgsConstructor;
import mate.academy.bookstore.model.Book;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

@RequiredArgsConstructor
@Repository
public class BookRepositoryImpl implements BookRepository {
private final EntityManagerFactory entityManagerFactory;

@Autowired
public BookRepositoryImpl(EntityManagerFactory entityManagerFactory) {
this.entityManagerFactory = entityManagerFactory;
}

@Override
public Book save(Book book) {
EntityManager entityManager = null;
Expand Down Expand Up @@ -52,4 +49,13 @@ public List<Book> findAll() {
throw new RuntimeException("Can't find all books", e);
}
}

@Override
public Optional<Book> findById(Long id) {
try (EntityManager entityManager = entityManagerFactory.createEntityManager()) {
return Optional.ofNullable(entityManager.find(Book.class, id));
} catch (Exception e) {
throw new RuntimeException("Can't find a book with id: " + id, e);
}
}
}
9 changes: 6 additions & 3 deletions src/main/java/mate/academy/bookstore/service/BookService.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
package mate.academy.bookstore.service;

import java.util.List;
import mate.academy.bookstore.model.Book;
import mate.academy.bookstore.dto.BookDto;
import mate.academy.bookstore.dto.CreateBookRequestDto;

public interface BookService {
Book save(Book book);
BookDto save(CreateBookRequestDto requestDto);

List<Book> findAll();
List<BookDto> findAll();

BookDto findById(Long id);
}
22 changes: 18 additions & 4 deletions src/main/java/mate/academy/bookstore/service/BookServiceImpl.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
package mate.academy.bookstore.service;

import jakarta.persistence.EntityNotFoundException;
import java.util.List;
import lombok.RequiredArgsConstructor;
import mate.academy.bookstore.dto.BookDto;
import mate.academy.bookstore.dto.CreateBookRequestDto;
import mate.academy.bookstore.mapper.BookMapper;
import mate.academy.bookstore.model.Book;
import mate.academy.bookstore.repository.BookRepository;
import org.springframework.stereotype.Service;
Expand All @@ -10,14 +14,24 @@
@Service
public class BookServiceImpl implements BookService {
private final BookRepository bookRepository;
private final BookMapper bookMapper;

@Override
public Book save(Book book) {
return bookRepository.save(book);
public BookDto save(CreateBookRequestDto requestDto) {
Book book = bookMapper.toModel(requestDto);
return bookMapper.toDto(bookRepository.save(book));
}

@Override
public List<Book> findAll() {
return bookRepository.findAll();
public List<BookDto> findAll() {
return bookRepository.findAll().stream()
.map(bookMapper::toDto)
.toList();
}

@Override
public BookDto findById(Long id) {
return bookMapper.toDto(bookRepository.findById(id).orElseThrow(
() -> new EntityNotFoundException("Can't find a book with it: " + id)));
}
}
2 changes: 2 additions & 0 deletions src/main/resources/application.properties
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,5 @@ spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

spring.jpa.hibernate.ddl-auto=create-drop
spring.jpa.show-sql=true
spring.jpa.open-in-view=false
spring.jackson.deserialization.fail-on-unknown-properties=true
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
@SpringBootTest
class BookstoreApplicationTests {

@Test
void contextLoads() {
}
@Test
void contextLoads() {
}

}

0 comments on commit 33856ec

Please sign in to comment.