Skip to content

Commit

Permalink
changed readme file and other fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
TarasYashchuk committed Aug 13, 2024
1 parent 40b4b65 commit 1134ab6
Show file tree
Hide file tree
Showing 9 changed files with 55 additions and 31 deletions.
44 changes: 27 additions & 17 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# "Bookstore"
# 📚 Bookstore

---

Expand All @@ -9,7 +9,7 @@
The application leverages modern Java-based server-side technologies, including the Spring Framework, to ensure robust and scalable performance. For security, JWT (JSON Web Tokens) is used to manage authentication and authorization, providing secure access control throughout the application. The application is containerized using Docker, making it easy to deploy and manage in various environments, including cloud services like AWS.

---
## Key Features
## 🌟 Key Features

- **Category Management**: Organize books into categories for easier browsing.
- **Shopping Cart**: Add books to a shopping cart for streamlined purchasing.
Expand All @@ -19,14 +19,14 @@ The application leverages modern Java-based server-side technologies, including
- **Dockerized Deployment**: Simplified deployment using Docker and Docker Compose.
- **Database Integration**: MySQL database support with schema management via Liquibase.
---
### Authentication Management
### 🔑 Authentication Management

Endpoints for managing user authentication:

- **POST**: `/auth/registration` - Register a new user.
- **POST**: `/auth/login` - Log in an existing user.

### Order Management
### 📦 Order Management

Endpoints for managing user orders:

Expand All @@ -36,7 +36,7 @@ Endpoints for managing user orders:
- **GET**: `/orders/{orderId}/items` - Retrieve all items for a specific order.
- **GET**: `/orders/{orderId}/items/{itemId}` - Retrieve a specific item within an order.

### Category Management
### 🗂️ Category Management

Endpoints for managing categories:

Expand All @@ -47,7 +47,7 @@ Endpoints for managing categories:
- **DELETE**: `/categories/{id}` - Delete a category by its ID.
- **GET**: `/categories/{id}/books` - Get all books associated with a specific category ID.

### Shopping Cart Management
### 🛒 Shopping Cart Management

Endpoints for managing the shopping cart:

Expand All @@ -56,7 +56,7 @@ Endpoints for managing the shopping cart:
- **GET**: `/cart` - Retrieve the user's shopping cart.
- **POST**: `/cart` - Add a book to the shopping cart.

### Book Management
### 📚 Book Management

Endpoints for managing books:

Expand All @@ -67,16 +67,19 @@ Endpoints for managing books:
- **DELETE**: `/books/{id}` - Delete a book by its ID.
- **GET**: `/books/search` - Search for books by various parameters.
---
### Technologies Used:
## 🛠️ Technologies Used

- Java 17
- Spring Boot, Spring Security, Spring data JPA
- Spring Boot 3.1.0, Spring Security, Spring data JPA
- REST, Mapstruct
- MySQL, Liquibase
- MySQL 8.0, Liquibase
- Maven, Docker
- Lombok, Swagger
- Junit, Mockito
---
## Getting Started
## 🚀 Getting Started

#### [Watch the demo video](https://www.youtube.com/watch?v=0lrKKQNzPis)

### Prerequisites

Expand All @@ -94,28 +97,35 @@ Before you begin, ensure you have met the following requirements:
cd bookstore
```

2. **Set Up the Environment**:
2. **Configure Environment Variables**:

Customize the `.env` file to set up your environment-specific variables such as database credentials, JWT secret keys, etc. This allows you to connect to your own database or adjust configurations as needed.


3. **Set Up the Environment**:

Ensure Docker and Docker Compose are installed on your system. You can configure environment variables directly in the `docker-compose.yml` file.

3. **Build and Run the Application**:

4. **Build and Run the Application**:

```sh
docker-compose up --build
```

4. **Access the Application**:
5. **Access the Application**:

The application will be available at `http://localhost:8080/api`.

5. **API Documentation**:

6. **API Documentation**:

Access the API documentation via Swagger at `http://localhost:8080/api/swagger-ui/index.html#/`.

### Contact
### 📬 Contact

For any inquiries or support, please contact [[email protected]](mailto:[email protected]).

---

> This README file was last updated on 2024-08-11.
> This README file was last updated on 2024-08-13.
7 changes: 4 additions & 3 deletions src/main/java/mate/academy/controller/CategoryController.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import lombok.RequiredArgsConstructor;
import mate.academy.dto.book.BookDtoWithoutCategoryIds;
import mate.academy.dto.category.CategoryDto;
import mate.academy.dto.category.CreateCategoryRequestDto;
import mate.academy.service.CategoryService;
import org.springdoc.core.annotations.ParameterObject;
import org.springframework.data.domain.Pageable;
Expand Down Expand Up @@ -42,15 +43,15 @@ public class CategoryController {
@ApiResponses({
@ApiResponse(responseCode = "200", description = "Category created successfully",
content = @Content(mediaType = "application/json",
schema = @Schema(implementation = CategoryDto.class))),
schema = @Schema(implementation = CreateCategoryRequestDto.class))),
@ApiResponse(responseCode = "400",
description = "Invalid input",
content = @Content)
})
@PreAuthorize("hasRole('ADMIN')")
@PostMapping
public CategoryDto createCategory(@Valid @RequestBody CategoryDto categoryDto) {
return categoryService.save(categoryDto);
public CategoryDto createCategory(@Valid @RequestBody CreateCategoryRequestDto requestDto) {
return categoryService.save(requestDto);
}

@Operation(summary = "Get all categories",
Expand Down
5 changes: 1 addition & 4 deletions src/main/java/mate/academy/dto/category/CategoryDto.java
Original file line number Diff line number Diff line change
@@ -1,14 +1,11 @@
package mate.academy.dto.category;

import jakarta.validation.constraints.NotBlank;
import lombok.Data;

@Data
public class CategoryDto {
@NotBlank(message = "name cannot be blank")
private Long id;
private String name;

@NotBlank(message = "description cannot be blank")
private String description;
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package mate.academy.dto.category;

import jakarta.validation.constraints.NotBlank;
import lombok.Data;

@Data
public class CreateCategoryRequestDto {
@NotBlank(message = "Category should not be blank")
private String name;
private String description;
}
3 changes: 2 additions & 1 deletion src/main/java/mate/academy/mapper/CategoryMapper.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import mate.academy.config.MapperConfig;
import mate.academy.dto.category.CategoryDto;
import mate.academy.dto.category.CreateCategoryRequestDto;
import mate.academy.model.Category;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
Expand All @@ -12,5 +13,5 @@ public interface CategoryMapper {
CategoryDto toDto(Category category);

@Mapping(target = "id", ignore = true)
Category toModel(CategoryDto requestDto);
Category toModel(CreateCategoryRequestDto requestDto);
}
3 changes: 2 additions & 1 deletion src/main/java/mate/academy/service/CategoryService.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,15 @@
import java.util.List;
import mate.academy.dto.book.BookDtoWithoutCategoryIds;
import mate.academy.dto.category.CategoryDto;
import mate.academy.dto.category.CreateCategoryRequestDto;
import org.springframework.data.domain.Pageable;

public interface CategoryService {
List<CategoryDto> findAll();

CategoryDto getById(Long id);

CategoryDto save(CategoryDto categoryDto);
CategoryDto save(CreateCategoryRequestDto requestDto);

CategoryDto update(Long id, CategoryDto categoryDto);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import lombok.RequiredArgsConstructor;
import mate.academy.dto.book.BookDtoWithoutCategoryIds;
import mate.academy.dto.category.CategoryDto;
import mate.academy.dto.category.CreateCategoryRequestDto;
import mate.academy.exception.EntityNotFoundException;
import mate.academy.mapper.BookMapper;
import mate.academy.mapper.CategoryMapper;
Expand Down Expand Up @@ -40,8 +41,8 @@ public CategoryDto getById(Long id) {
}

@Override
public CategoryDto save(CategoryDto categoryDto) {
Category category = categoryMapper.toModel(categoryDto);
public CategoryDto save(CreateCategoryRequestDto requestDto) {
Category category = categoryMapper.toModel(requestDto);
return categoryMapper.toDto(categoryRepository.save(category));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
import java.util.List;
import mate.academy.dto.book.BookDtoWithoutCategoryIds;
import mate.academy.dto.category.CategoryDto;
import mate.academy.dto.category.CreateCategoryRequestDto;
import mate.academy.exception.EntityNotFoundException;
import mate.academy.service.CategoryService;
import net.datafaker.Faker;
Expand Down Expand Up @@ -79,7 +80,7 @@ void createCategory_ValidRequest_ReturnsCategory() throws Exception {
expected.setName(faker.book().genre());
expected.setDescription(faker.lorem().paragraph());

when(categoryService.save(any(CategoryDto.class))).thenReturn(expected);
when(categoryService.save(any(CreateCategoryRequestDto.class))).thenReturn(expected);

String jsonRequest = objectMapper.writeValueAsString(expected);
MvcResult result = mockMvc.perform(post(BASE_CATEGORY_URL)
Expand All @@ -102,7 +103,7 @@ void createCategory_NonAdminUser_ReturnsForbidden() throws Exception {
expected.setName(faker.book().genre());
expected.setDescription(faker.lorem().paragraph());

when(categoryService.save(any(CategoryDto.class))).thenReturn(expected);
when(categoryService.save(any(CreateCategoryRequestDto.class))).thenReturn(expected);

String jsonRequest = objectMapper.writeValueAsString(expected);
mockMvc.perform(post(BASE_CATEGORY_URL)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import java.util.Optional;
import mate.academy.dto.book.BookDtoWithoutCategoryIds;
import mate.academy.dto.category.CategoryDto;
import mate.academy.dto.category.CreateCategoryRequestDto;
import mate.academy.exception.EntityNotFoundException;
import mate.academy.mapper.BookMapper;
import mate.academy.mapper.CategoryMapper;
Expand Down Expand Up @@ -57,7 +58,7 @@ class CategoryServiceImplTest {
@Test
@DisplayName("Save category - Valid CategoryDto returns saved CategoryDto")
void saveCategory_ValidCategoryDto_ReturnsSavedCategoryDto() {
CategoryDto categoryDto = new CategoryDto();
CreateCategoryRequestDto categoryDto = new CreateCategoryRequestDto();
categoryDto.setName(faker.book().genre());
categoryDto.setDescription(faker.lorem().paragraph());

Expand Down

0 comments on commit 1134ab6

Please sign in to comment.