Skip to content
Merged
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
4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,4 @@
# java-shareit
Template repository for Shareit project.

### Database map
![SchemaDatabase.png](SchemaDatabase.png)
Binary file added SchemaDatabase.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
16 changes: 16 additions & 0 deletions compose.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
services:
db:
image: postgres:16.1
ports:
- "5432:5432"
volumes:
- ./volumes/postgres:/var/lib/postgresql/data/
environment:
- POSTGRES_DB=shareit
- POSTGRES_USER=dbuser
- POSTGRES_PASSWORD=12345
healthcheck:
test: pg_isready -q -d $$POSTGRES_DB -U $$POSTGRES_USER
timeout: 5s
interval: 5s
retries: 10
8 changes: 7 additions & 1 deletion lombok.config
Original file line number Diff line number Diff line change
@@ -1,4 +1,10 @@
config.stopBubbling = true
lombok.anyconstructor.addconstructorproperties = false
lombok.addLombokGeneratedAnnotation = true
lombok.addSuppressWarnings = false
lombok.addSuppressWarnings = false
lombok.fieldDefaults.defaultPrivate = true
lombok.equalsAndHashCode.callSuper = call
lombok.equalsAndHashCode.doNotUseGetters = true
lombok.toString.callSuper = call
lombok.toString.doNotUseGetters = true
lombok.noArgsConstructor.extraPrivate = true
36 changes: 18 additions & 18 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,11 @@
</properties>

<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
Expand All @@ -33,34 +38,29 @@
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>

<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>

<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>test</scope>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.zalando</groupId>
<artifactId>logbook-spring-boot-starter</artifactId>
Expand Down
23 changes: 0 additions & 23 deletions src/main/java/ru/practicum/shareit/booking/Booking.java

This file was deleted.

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

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import ru.practicum.shareit.booking.dto.BookingDto;
import ru.practicum.shareit.booking.dto.IncomingBookingDto;
import ru.practicum.shareit.booking.service.BookingService;
import ru.practicum.shareit.util.Marker;

import java.util.List;

/**
* TODO Sprint add-bookings.
*/
@RestController
@Validated
@RequestMapping(path = "/bookings")
@RequiredArgsConstructor
public class BookingController {
final BookingService bookingService;

@GetMapping("/{bookingId}")
public BookingDto getBooking(
@RequestHeader("X-Sharer-User-Id") Long userId,
@PathVariable long bookingId
) {
return bookingService.getBooking(userId, bookingId);
}

@GetMapping
public List<BookingDto> getAllBookingsByBooker(
@RequestHeader("X-Sharer-User-Id") long userId,
@RequestParam(required = false) String state
) {
return bookingService.getAllBookingsByBooker(userId, state);
}

@GetMapping("/owner")
public List<BookingDto> getAllBookingsByOwner(
@RequestHeader("X-Sharer-User-Id") long userId,
@RequestParam(required = false) String state
) {
return bookingService.getAllBookingsByOwner(userId, state);
}

@PostMapping
@Validated(Marker.OnCreate.class)
public BookingDto addNewBooking(
@RequestHeader("X-Sharer-User-Id") Long userId,
@Valid @RequestBody IncomingBookingDto bookingDto
) {
return bookingService.addNewBooking(userId, bookingDto);
}

@PatchMapping("/{bookingId}")
public BookingDto approveBooking(
@RequestHeader("X-Sharer-User-Id") long userId,
@PathVariable long bookingId,
@RequestParam boolean approved
) {
return bookingService.approveBooking(userId, bookingId, approved);
}
}
8 changes: 0 additions & 8 deletions src/main/java/ru/practicum/shareit/booking/BookingStatus.java

This file was deleted.

18 changes: 16 additions & 2 deletions src/main/java/ru/practicum/shareit/booking/dto/BookingDto.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,21 @@
package ru.practicum.shareit.booking.dto;

import jakarta.validation.constraints.NotNull;
import ru.practicum.shareit.booking.model.BookingStatus;
import ru.practicum.shareit.item.dto.ItemDto;
import ru.practicum.shareit.user.dto.UserDto;

import java.time.LocalDateTime;

/**
* TODO Sprint add-bookings.
*/
public class BookingDto {
}
@NotNull
public record BookingDto(
Long id,
LocalDateTime start,
LocalDateTime end,
ItemDto item,
UserDto booker,
BookingStatus status
) {}
36 changes: 36 additions & 0 deletions src/main/java/ru/practicum/shareit/booking/dto/BookingMapper.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package ru.practicum.shareit.booking.dto;

import org.springframework.lang.NonNull;
import ru.practicum.shareit.booking.model.Booking;
import ru.practicum.shareit.booking.model.BookingStatus;
import ru.practicum.shareit.item.dto.ItemMapper;
import ru.practicum.shareit.item.model.Item;
import ru.practicum.shareit.user.dto.UserMapper;
import ru.practicum.shareit.user.model.User;

import java.time.ZoneId;

public class BookingMapper {

@NonNull
public static BookingDto toBookingDto(@NonNull Booking booking) {
return new BookingDto(
booking.getId(),
booking.getStart().atZone(ZoneId.systemDefault()).toLocalDateTime(),
booking.getEnd().atZone(ZoneId.systemDefault()).toLocalDateTime(),
ItemMapper.toItemDto(booking.getItem()),
UserMapper.toUserDto(booking.getBooker()),
booking.getStatus()
);
}

public static Booking fromIncomingDto(@NonNull IncomingBookingDto bookingDto, Item item, User booker) {
return new Booking()
.setId(null)
.setStart(bookingDto.getStart())
.setEnd(bookingDto.getEnd())
.setBooker(booker)
.setItem(item)
.setStatus(BookingStatus.WAITING);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package ru.practicum.shareit.booking.dto;

import jakarta.validation.constraints.*;
import lombok.Data;
import ru.practicum.shareit.util.Marker;

import java.time.LocalDateTime;

@Data
@NotNull
public class IncomingBookingDto {

@Positive(message = "id вещи - обязательный параметр, должен быть положительным числом")
long itemId;

@FutureOrPresent(message = "Дата начала не может быть в прошлом")
@NotNull(groups = Marker.OnCreate.class, message = "Дата начала бронирования - обязательна")
LocalDateTime start;

@Future(message = "Дата окончания должна быть в будущем")
@NotNull(groups = Marker.OnCreate.class, message = "Дата окончания бронирования - обязательна")
LocalDateTime end;
}
64 changes: 64 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,64 @@
package ru.practicum.shareit.booking.model;

import jakarta.persistence.*;
import lombok.*;
import lombok.experimental.Accessors;
import lombok.experimental.ExtensionMethod;
import ru.practicum.shareit.item.model.Item;
import ru.practicum.shareit.user.model.User;
import ru.practicum.shareit.util.hibernate.HibernateEqualsAndHashCode;

import java.time.LocalDateTime;
import java.util.Objects;

import static ru.practicum.shareit.util.hibernate.HibernateEqualsAndHashCode.*;

/**
* TODO Sprint add-bookings.
*/

@Data
@Entity
@NoArgsConstructor
@Accessors(chain = true)
@Table(name = "bookings")
@ExtensionMethod({HibernateEqualsAndHashCode.class})
public class Booking {

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

@Column(name = "start_date", nullable = false)
LocalDateTime start;

@Column(name = "end_date", nullable = false)
LocalDateTime end;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "item_id", nullable = false)
Item item;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "booker_id", nullable = false)
User booker;

@Enumerated(EnumType.STRING)
BookingStatus status;

//region equals and hashCode
@Override
public final boolean equals(Object object) {
return this == object
|| object != null
&& persistentClass(this) == object.persistentClass()
&& object instanceof Booking booking
&& Objects.equals(getId(), booking.getId());
}

@Override
public final int hashCode() {
return persistentClass(this).hashCode();
}
//endregion
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package ru.practicum.shareit.booking.model;

/// Статус бронирования вещи
public enum BookingStatus {

/// новое бронирование, ожидает одобрения
WAITING,

/// бронирование подтверждено владельцем
APPROVED,

/// бронирование отклонено владельцем
REJECTED,

/// бронирование отменено создателем
CANCELED
}
Loading
Loading