Skip to content
Closed

- #2

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .docker/data/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
*
!.gitignore
17 changes: 17 additions & 0 deletions compose.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
services:
db:
image: postgres:16.1
container_name: postgres
ports:
- "5432:5432"
volumes:
- .docker/data/postgres:/var/lib/postgresql/data/
environment:
- POSTGRES_DB=share-it
- POSTGRES_USER=dbuser
- POSTGRES_PASSWORD=password
healthcheck:
test: pg_isready -q -d $$POSTGRES_DB -U $$POSTGRES_USER
timeout: 5s
interval: 5s
retries: 10
4 changes: 4 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,10 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
Expand Down
19 changes: 0 additions & 19 deletions src/main/java/ru/practicum/shareit/booking/Booking.java

This file was deleted.

12 changes: 12 additions & 0 deletions src/main/java/ru/practicum/shareit/booking/BookingService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package ru.practicum.shareit.booking;

import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import ru.practicum.shareit.booking.contracts.BookingRepositoryInterface;
import ru.practicum.shareit.booking.contracts.BookingServiceInterface;

@Service
@AllArgsConstructor
public class BookingService implements BookingServiceInterface {
private BookingRepositoryInterface bookingRepository;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package ru.practicum.shareit.booking.contracts;

import org.springframework.data.jpa.repository.JpaRepository;
import ru.practicum.shareit.booking.model.Booking;

public interface BookingRepositoryInterface extends JpaRepository<Booking, Long> {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package ru.practicum.shareit.booking.contracts;

import ru.practicum.shareit.booking.dto.BookingDto;

public interface BookingServiceInterface {

BookingDto create(BookingDto bookingDto, Long userId);

BookingDto update(BookingDto bookingDto, Long userId);

}
10 changes: 7 additions & 3 deletions src/main/java/ru/practicum/shareit/booking/dto/BookingDto.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
package ru.practicum.shareit.booking.dto;

/**
* TODO Sprint add-bookings.
*/
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;

@Data
@AllArgsConstructor
@Builder
public class BookingDto {
}
47 changes: 47 additions & 0 deletions src/main/java/ru/practicum/shareit/booking/model/Booking.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package ru.practicum.shareit.booking.model;

import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import ru.practicum.shareit.booking.BookingStatus;
import ru.practicum.shareit.item.model.Item;
import ru.practicum.shareit.user.model.User;

import java.time.LocalDateTime;

@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "bookings")
public class Booking {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

private LocalDateTime start;

private LocalDateTime end;

@ManyToOne
@JoinColumn(name = "item_id", nullable = false)
private Item item;

@ManyToOne
@JoinColumn(name = "booker_id", nullable = false)
private User booker;

@Enumerated(EnumType.STRING)
private BookingStatus status;

}
10 changes: 5 additions & 5 deletions src/main/java/ru/practicum/shareit/item/ItemController.java
Original file line number Diff line number Diff line change
Expand Up @@ -28,16 +28,16 @@ public class ItemController {
@PostMapping
public ItemDto create(
final @Valid @RequestBody ItemDto dto,
final @RequestHeader(name = X_SHARER_USER_ID) Integer userId
final @RequestHeader(name = X_SHARER_USER_ID) Long userId
) {
return itemService.create(dto, userId);
}

@PatchMapping("/{itemId}")
public ItemDto update(
final @RequestBody ItemDto dto,
final @PathVariable Integer itemId,
final @RequestHeader(name = X_SHARER_USER_ID) Integer userId
final @PathVariable Long itemId,
final @RequestHeader(name = X_SHARER_USER_ID) Long userId
) {
if (itemId == null) {
throw new EmptyIdException("Id required");
Expand All @@ -49,12 +49,12 @@ public ItemDto update(
}

@GetMapping("/{itemId}")
public ItemDto getItem(final @PathVariable Integer itemId) {
public ItemDto getItem(final @PathVariable Long itemId) {
return itemService.findItemById(itemId);
}

@GetMapping
public List<ItemDto> getItemsByUser(final @RequestHeader(name = X_SHARER_USER_ID) Integer userId) {
public List<ItemDto> getItemsByUser(final @RequestHeader(name = X_SHARER_USER_ID) Long userId) {
return itemService.findItemsByUser(userId);
}

Expand Down
89 changes: 0 additions & 89 deletions src/main/java/ru/practicum/shareit/item/ItemRepository.java

This file was deleted.

53 changes: 33 additions & 20 deletions src/main/java/ru/practicum/shareit/item/ItemService.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,47 +10,58 @@
import ru.practicum.shareit.exception.NotFoundException;
import ru.practicum.shareit.item.model.Item;
import ru.practicum.shareit.user.contracts.UserRepositoryInterface;
import ru.practicum.shareit.user.model.User;

import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.Optional;

@Slf4j
@Service
@AllArgsConstructor
public class ItemService implements ItemServiceInterface {

private static final String USER_NOT_FOUND = "User with id='%d' not found";

private final ItemRepositoryInterface itemRepository;
private final UserRepositoryInterface userRepository;

public ItemDto create(final ItemDto itemDto, final Integer userId) {
@Override
public ItemDto create(final ItemDto itemDto, final Long userId) {

Optional<User> user = userRepository.findById(userId);

if (!userRepository.userExists(userId)) {
throw new NotFoundException("User with id='%d' not found".formatted(userId));
if (user.isEmpty()) {
throw new NotFoundException(USER_NOT_FOUND.formatted(userId));
}

Item item = ItemMapper.toItem(itemDto);
item.setOwner(userId);
item.setOwner(user.get());

Item newItem = itemRepository.create(item);
Item newItem = itemRepository.save(item);
itemDto.setId(newItem.getId());

return itemDto;
}

@Override
public ItemDto update(final ItemDto itemDto, final Integer userId) {
if (!userRepository.userExists(userId)) {
throw new NotFoundException("User not found");
public ItemDto update(final ItemDto itemDto, final Long userId) {
Optional<User> user = userRepository.findById(userId);

if (user.isEmpty()) {
throw new NotFoundException(USER_NOT_FOUND.formatted(userId));
}

Item item = itemRepository.findById(itemDto.getId());
Optional<Item> itemOptional = itemRepository.findById(itemDto.getId());

if (item == null) {
if (itemOptional.isEmpty()) {
throw new NotFoundException("Item with id='%d' not found".formatted(itemDto.getId()));
}

if (!Objects.equals(item.getOwner(), userId)) {
Item item = itemOptional.get();

if (!Objects.equals(item.getOwner(), user.get())) {
throw new InvalidOwnerException("Owner is not the same user");
}

Expand All @@ -64,26 +75,28 @@ public ItemDto update(final ItemDto itemDto, final Integer userId) {

item.setAvailable(itemDto.getAvailable());

itemRepository.update(item);
itemRepository.save(item);

return itemDto;
}

@Override
public ItemDto findItemById(Integer itemId) {
Item item = itemRepository.findById(itemId);
public ItemDto findItemById(Long itemId) {
Optional<Item> item = itemRepository.findById(itemId);

return ItemMapper.toItemDto(item);
return item.map(ItemMapper::toItemDto).orElse(null);
}

@Override
public List<ItemDto> findItemsByUser(final Integer userId) {
if (!userRepository.userExists(userId)) {
throw new NotFoundException("User with id='%d' not found".formatted(userId));
public List<ItemDto> findItemsByUser(final Long userId) {
Optional<User> user = userRepository.findById(userId);

if (user.isEmpty()) {
throw new NotFoundException(USER_NOT_FOUND.formatted(userId));
}

return itemRepository
.findByUserId(userId)
.findAllByOwnerId(user.get().getId())
.stream()
.map(ItemMapper::toItemDto)
.toList();
Expand All @@ -96,7 +109,7 @@ public List<ItemDto> findItemsByText(final String text) {
}

return itemRepository
.findByText(text)
.findAllByText(text)
.stream()
.map(ItemMapper::toItemDto)
.toList();
Expand Down
Loading
Loading