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
37 changes: 37 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
FROM maven:3.9.11-amazoncorretto-21 AS builder
WORKDIR /application

COPY pom.xml ./

ENV MAVEN_OPTS="-Dmaven.repo.local=/app/.m2/repository"
RUN mvn dependency:go-offline -B
COPY src ./src

RUN mvn clean package -DskipTests

FROM amazoncorretto:21.0.8-alpine AS layers
WORKDIR /application
COPY --from=builder /application/target/*.jar app.jar
RUN java -Djarmode=tools -jar app.jar extract --layers --destination extracted

FROM amazoncorretto:21.0.8-alpine
VOLUME /tmp
RUN adduser -S spring-user
USER spring-user

WORKDIR /application

COPY --from=layers /application/extracted/dependencies/ ./
COPY --from=layers /application/extracted/spring-boot-loader/ ./
COPY --from=layers /application/extracted/snapshot-dependencies/ ./
COPY --from=layers /application/extracted/application/ ./

RUN java -XX:ArchiveClassesAtExit=app.jsa -Dspring.context.exit=onRefresh -jar app.jar & exit 0

ENV JAVA_CDS_OPTS="-XX:SharedArchiveFile=app.jsa -Xlog:class+load:file=/tmp/classload.log"
ENV JAVA_ERROR_FILE_OPTS="-XX:ErrorFile=/tmp/java_error.log"

ENTRYPOINT java \
$JAVA_ERROR_FILE_OPTS \
$JAVA_CDS_OPTS \
-jar app.jar
41 changes: 41 additions & 0 deletions docker-compose.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
services:
db:
image: postgres:17.7-alpine3.23
container_name: postgres-db
restart: unless-stopped
ports:
- "5432:5432"
environment:
- POSTGRES_DB=shareit
- POSTGRES_USER=shareit_user
- POSTGRES_PASSWORD=secret
volumes:
- postgres-data:/var/lib/postgresql/data/
healthcheck:
test: pg_isready -q -d $$POSTGRES_DB -U $$POSTGRES_USER
timeout: 5s
interval: 5s
retries: 10
shareit:
image: shareit:latest
build: .
container_name: shareit-app
restart: unless-stopped
ports:
- "8080:8080"
environment:
SPRING_DATASOURCE_URL: jdbc:postgresql://db:5432/shareit
SPRING_DATASOURCE_USERNAME: shareit_user
SPRING_DATASOURCE_PASSWORD: secret
healthcheck:
test: wget --no-verbose --tries=1 --spider http://localhost:8080/actuator/health || exit 1
interval: 30s
timeout: 5s
start_period: 30s
retries: 5
depends_on:
db:
condition: service_healthy

volumes:
postgres-data:
7 changes: 7 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -24,16 +24,23 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
Expand Down
7 changes: 0 additions & 7 deletions src/main/java/ru/practicum/shareit/booking/Booking.java

This file was deleted.

64 changes: 59 additions & 5 deletions src/main/java/ru/practicum/shareit/booking/BookingController.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,66 @@
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.http.HttpStatus;
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.BookingResponseDto;

/**
* TODO Sprint add-bookings.
*/
import java.util.List;

@Validated
@RestController
@RequiredArgsConstructor
@RequestMapping(path = "/bookings")
public class BookingController {
private static final String SHARER_USER_ID_HEADER = "X-Sharer-User-Id";
private final BookingService bookingService;

@PostMapping
@ResponseStatus(HttpStatus.CREATED)
public BookingResponseDto createBooking(
@RequestHeader(SHARER_USER_ID_HEADER) long bookerId,
@RequestBody @Valid BookingDto bookingDto
) {
return bookingService.createBooking(bookerId, bookingDto);
}

@PatchMapping("{bookingId}")
public BookingResponseDto approveBooking(
@PathVariable long bookingId,
@RequestParam boolean approved,
@RequestHeader(SHARER_USER_ID_HEADER) long ownerId
) {
return bookingService.approveBooking(bookingId, approved, ownerId);
}

@GetMapping("{bookingId}")
public BookingResponseDto getBooking(
@PathVariable long bookingId,
@RequestHeader(SHARER_USER_ID_HEADER) long userId
) {
return bookingService.getBookingById(bookingId, userId);
}

@GetMapping
public List<BookingResponseDto> getAllBookingsOfUser(
@RequestParam(defaultValue = "ALL") String state,
@RequestHeader(SHARER_USER_ID_HEADER) long userId
) {
BookingState bookingState = BookingState.fromString(state)
.orElseThrow(() -> new IllegalArgumentException("Invalid booking state"));
return bookingService.getAllBookingsOfUser(userId, bookingState);
}

@GetMapping("/owner")
public List<BookingResponseDto> getBookingsByOwner(
@RequestParam(defaultValue = "ALL") String state,
@RequestHeader(SHARER_USER_ID_HEADER) long ownerId
) {
BookingState bookingState = BookingState.fromString(state)
.orElseThrow(() -> new IllegalArgumentException("Invalid booking state"));
return bookingService.getAllBookingsByOwner(ownerId, bookingState);
}
}
68 changes: 68 additions & 0 deletions src/main/java/ru/practicum/shareit/booking/BookingMapper.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package ru.practicum.shareit.booking;

import lombok.experimental.UtilityClass;
import ru.practicum.shareit.booking.dto.BookingDto;
import ru.practicum.shareit.booking.dto.BookingInfoDto;
import ru.practicum.shareit.booking.dto.BookingResponseDto;
import ru.practicum.shareit.booking.model.Booking;
import ru.practicum.shareit.booking.model.BookingStatus;
import ru.practicum.shareit.item.dto.ItemDto;
import ru.practicum.shareit.item.model.Item;
import ru.practicum.shareit.user.dto.UserDto;
import ru.practicum.shareit.user.model.User;

import java.time.LocalDateTime;
import java.util.Optional;

@UtilityClass
public class BookingMapper {
public BookingResponseDto toBookingResponseDto(Booking booking) {
Long bookingId = booking.getId();
LocalDateTime bookingStartTime = booking.getStartTime();
LocalDateTime bookingEndTime = booking.getEndTime();
Long itemId = booking.getItem().getId();
String itemName = booking.getItem().getName();
String itemDescription = booking.getItem().getDescription();
boolean itemAvailable = booking.getItem().isAvailable();
ItemDto itemDto = new ItemDto(
itemId,
itemName,
itemDescription,
itemAvailable
);
Long userId = booking.getBooker().getId();
String userName = booking.getBooker().getName();
String userEmail = booking.getBooker().getEmail();
UserDto userDto = new UserDto(userId, userName, userEmail);
BookingStatus bookingStatus = booking.getStatus();
return new BookingResponseDto(
bookingId,
bookingStartTime,
bookingEndTime,
itemDto,
userDto,
bookingStatus
);
}

public Booking fromDto(BookingDto bookingDto, User booker, Item item) {
return new Booking(null,
bookingDto.start(),
bookingDto.end(),
item,
booker,
BookingStatus.WAITING);
}

public Optional<BookingInfoDto> toBookingInfoDto(Booking booking) {
if (booking == null) {
return Optional.empty();
}
return Optional.of(new BookingInfoDto(
booking.getId(),
booking.getBooker().getId(),
booking.getStartTime(),
booking.getEndTime()
));
}
}
18 changes: 18 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,18 @@
package ru.practicum.shareit.booking;

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

import java.util.List;

public interface BookingService {
BookingResponseDto createBooking(long bookerId, BookingDto bookingDto);

BookingResponseDto approveBooking(long bookingId, boolean approved, long ownerId);

BookingResponseDto getBookingById(long bookingId, long userId);

List<BookingResponseDto> getAllBookingsOfUser(long userId, BookingState bookingState);

List<BookingResponseDto> getAllBookingsByOwner(long ownerId, BookingState bookingState);
}
Loading