From d6553f2888bafff1bb4db096fc9d7d5f5bf4e0a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A0=D0=B8=D1=84=D0=B0=D1=82=20=D0=97=D0=B0=D0=BA=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2?= Date: Mon, 8 Dec 2025 12:03:44 +0000 Subject: [PATCH 01/19] Update src/main/java/com/example/nto/controller/BookingController.java --- .../nto/controller/BookingController.java | 172 +++++++++++++++++- 1 file changed, 166 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/example/nto/controller/BookingController.java b/src/main/java/com/example/nto/controller/BookingController.java index 9885f84..7a58138 100644 --- a/src/main/java/com/example/nto/controller/BookingController.java +++ b/src/main/java/com/example/nto/controller/BookingController.java @@ -1,10 +1,170 @@ package com.example.nto.controller; -/** - * TODO: ДОРАБОТАТЬ в рамках задания - * ================================= - * МОЖНО: Добавлять методы, аннотации, зависимости - * НЕЛЬЗЯ: Изменять название класса и пакета - */ +import com.example.nto.dto.BookingRequestDto; +import com.example.nto.dto.BookingShortDto; +import com.example.nto.dto.EmployeeInfoResponseDto; +import com.example.nto.entity.Booking; +import com.example.nto.entity.Employee; +import com.example.nto.entity.Place; +import com.example.nto.repository.PlaceRepository; +import com.example.nto.service.BookingService; +import com.example.nto.service.EmployeeService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.time.LocalDate; +import java.time.format.DateTimeParseException; +import java.util.*; +import java.util.stream.Collectors; + +@RestController +@RequestMapping("/api") +@RequiredArgsConstructor public class BookingController { + + private final EmployeeService employeeService; + private final BookingService bookingService; + private final PlaceRepository placeRepository; + + /** + * GET api/{code}/info + * + * Ответ (пример из README): + * { + * "name": "Иванов Петр Федорович", + * "photoUrl": "https://...", + * "booking": { + * "2025-01-05": {"id":1,"place":"102"}, + * "2025-01-09": {"id":3,"place":"Зона 51. 50"} + * } + * } + * + * 400 – что-то пошло не так + * 401 – кода не существует + * 200 – ОК + */ + @GetMapping("/{code}/info") + public ResponseEntity getInfo(@PathVariable("code") String code) { + if (code == null || code.isBlank()) { + return ResponseEntity.badRequest().build(); + } + + Optional employeeOpt = employeeService.findByCode(code); + if (employeeOpt.isEmpty()) { + return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build(); + } + + Employee employee = employeeOpt.get(); + Map bookings = bookingService.getBookingsByEmployee(employee); + + Map bookingMap = new LinkedHashMap<>(); + bookings.forEach((date, booking) -> bookingMap.put( + date.toString(), + new BookingShortDto( + booking.getPlace().getId(), + booking.getPlace().getPlace() + ) + )); + + EmployeeInfoResponseDto response = new EmployeeInfoResponseDto( + employee.getName(), + employee.getPhotoUrl(), + bookingMap + ); + + return ResponseEntity.ok(response); + } + + /** + * GET api/{code}/booking + * + * Ответ (пример из README): + * { + * "2025-01-05": [{"id":1,"place":"102"}, {"id":2,"place":"209.13"}], + * "2025-01-06": [{"id":3,"place":"Зона 51. 50"}], + * ... + * } + * + * 400 – что-то пошло не так + * 401 – кода не существует + * 200 – ОК + */ + @GetMapping("/{code}/booking") + public ResponseEntity getAvailable(@PathVariable("code") String code) { + if (code == null || code.isBlank()) { + return ResponseEntity.badRequest().build(); + } + + if (!employeeService.existsByCode(code)) { + return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build(); + } + + Map> available = bookingService.getAvailablePlaces(); + + Map> body = new LinkedHashMap<>(); + available.forEach((date, places) -> body.put( + date.toString(), + places.stream() + .map(place -> new BookingShortDto(place.getId(), place.getPlace())) + .collect(Collectors.toList()) + )); + + return ResponseEntity.ok(body); + } + + /** + * POST api/{code}/book + * + * Тело: + * { + * "date": "2025-01-05", + * "placeId": 1 + * } + * + * 400 – что-то пошло не так (неправильный формат даты, нет placeId и т.п.) + * 401 – кода не существует + * 409 – место уже занято или у сотрудника уже есть бронь на эту дату + * 201 – бронирование успешно создано + */ + @PostMapping("/{code}/book") + public ResponseEntity createBooking(@PathVariable("code") String code, + @RequestBody BookingRequestDto request) { + if (code == null || code.isBlank()) { + return ResponseEntity.badRequest().build(); + } + + Optional employeeOpt = employeeService.findByCode(code); + if (employeeOpt.isEmpty()) { + return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build(); + } + + if (request == null || request.date() == null || request.placeId() == null) { + return ResponseEntity.badRequest().build(); + } + + LocalDate date; + try { + date = LocalDate.parse(request.date()); + } catch (DateTimeParseException ex) { + return ResponseEntity.badRequest().build(); + } + + Optional placeOpt = placeRepository.findById(request.placeId()); + if (placeOpt.isEmpty()) { + return ResponseEntity.badRequest().build(); + } + + Employee employee = employeeOpt.get(); + Place place = placeOpt.get(); + + if (bookingService.existsBookingForEmployeeOnDate(employee, date) + || bookingService.isPlaceBookedOnDate(place, date)) { + return ResponseEntity.status(HttpStatus.CONFLICT).build(); // 409 + } + + bookingService.createBooking(employee, date, place); + return ResponseEntity.status(HttpStatus.CREATED).build(); // 201 + } } -- 2.34.1 From de79bac801bcb25b2355d364e5de2b95d566af3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A0=D0=B8=D1=84=D0=B0=D1=82=20=D0=97=D0=B0=D0=BA=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2?= Date: Mon, 8 Dec 2025 12:04:05 +0000 Subject: [PATCH 02/19] Update src/main/java/com/example/nto/controller/EmployeeController.java --- .../nto/controller/EmployeeController.java | 39 ++++++++++++++++--- 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/example/nto/controller/EmployeeController.java b/src/main/java/com/example/nto/controller/EmployeeController.java index 47658f9..bae8b30 100644 --- a/src/main/java/com/example/nto/controller/EmployeeController.java +++ b/src/main/java/com/example/nto/controller/EmployeeController.java @@ -1,10 +1,37 @@ package com.example.nto.controller; -/** - * TODO: ДОРАБОТАТЬ в рамках задания - * ================================= - * МОЖНО: Добавлять методы, аннотации, зависимости - * НЕЛЬЗЯ: Изменять название класса и пакета - */ +import com.example.nto.service.EmployeeService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + + +@RestController +@RequestMapping("/api") +@RequiredArgsConstructor public class EmployeeController { + + private final EmployeeService employeeService; + + /** + * GET api/{code}/auth + * + * 400 – что-то пошло не так (пустой код и т.п.) + * 401 – кода не существует + * 200 – код существует + */ + @GetMapping("/{code}/auth") + public ResponseEntity auth(@PathVariable("code") String code) { + if (code == null || code.isBlank()) { + return ResponseEntity.badRequest().build(); // 400 + } + + boolean exists = employeeService.existsByCode(code); + if (!exists) { + return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build(); // 401 + } + + return ResponseEntity.ok().build(); // 200 + } } -- 2.34.1 From 631dfbd67d6c5df3fb9a644635cd9b8748eb3fff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A0=D0=B8=D1=84=D0=B0=D1=82=20=D0=97=D0=B0=D0=BA=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2?= Date: Mon, 8 Dec 2025 12:04:19 +0000 Subject: [PATCH 03/19] Update src/main/java/com/example/nto/entity/Booking.java --- .../java/com/example/nto/entity/Booking.java | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/example/nto/entity/Booking.java b/src/main/java/com/example/nto/entity/Booking.java index 21c1981..46dca69 100644 --- a/src/main/java/com/example/nto/entity/Booking.java +++ b/src/main/java/com/example/nto/entity/Booking.java @@ -1,8 +1,6 @@ package com.example.nto.entity; -import jakarta.persistence.FetchType; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.ManyToOne; +import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -11,25 +9,26 @@ import lombok.NoArgsConstructor; import java.time.LocalDate; -/** - * TODO: ДОРАБОТАТЬ в рамках задания - * ================================= - * МОЖНО: Добавлять методы, аннотации, зависимости - * НЕЛЬЗЯ: Изменять название класса и пакета - */ +@Entity +@Table(name = "booking") @Data @Builder @NoArgsConstructor @AllArgsConstructor public class Booking { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; + @Column(name = "date") private LocalDate date; - @ManyToOne(targetEntity = Place.class, fetch = FetchType.LAZY) - @JoinColumn(name = "place_id") + @ManyToOne(fetch = FetchType.LAZY, targetEntity = Place.class) + @JoinColumn(name = "place_id", nullable = false) private Place place; + @ManyToOne(fetch = FetchType.LAZY, targetEntity = Employee.class) + @JoinColumn(name = "employee_id", nullable = false) private Employee employee; } -- 2.34.1 From 98897bc809dde719af6fa60b4f778223e49859dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A0=D0=B8=D1=84=D0=B0=D1=82=20=D0=97=D0=B0=D0=BA=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2?= Date: Mon, 8 Dec 2025 12:04:33 +0000 Subject: [PATCH 04/19] Update src/main/java/com/example/nto/entity/Employee.java --- src/main/java/com/example/nto/entity/Employee.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/example/nto/entity/Employee.java b/src/main/java/com/example/nto/entity/Employee.java index a52102b..7c12057 100644 --- a/src/main/java/com/example/nto/entity/Employee.java +++ b/src/main/java/com/example/nto/entity/Employee.java @@ -1,5 +1,6 @@ package com.example.nto.entity; +import com.fasterxml.jackson.annotation.JsonIgnore; import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Builder; @@ -8,27 +9,26 @@ import lombok.NoArgsConstructor; import java.util.List; - -/** - * TODO: ДОРАБОТАТЬ в рамках задания - * ================================= - * МОЖНО: Добавлять методы, аннотации, зависимости - * НЕЛЬЗЯ: Изменять название класса и пакета - */ +@Entity +@Table(name = "employee") @Data @Builder @NoArgsConstructor @AllArgsConstructor public class Employee { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; private String name; private String code; + @Column(name = "photo_url") private String photoUrl; @OneToMany(mappedBy = "employee", cascade = CascadeType.ALL, fetch = FetchType.LAZY) + @JsonIgnore private List bookingList; } -- 2.34.1 From f5c5f5050e062ad5e7746e256de727e3c0bd1590 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A0=D0=B8=D1=84=D0=B0=D1=82=20=D0=97=D0=B0=D0=BA=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2?= Date: Mon, 8 Dec 2025 12:04:50 +0000 Subject: [PATCH 05/19] Update src/main/java/com/example/nto/entity/Place.java --- src/main/java/com/example/nto/entity/Place.java | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/example/nto/entity/Place.java b/src/main/java/com/example/nto/entity/Place.java index 00c253b..011ff1d 100644 --- a/src/main/java/com/example/nto/entity/Place.java +++ b/src/main/java/com/example/nto/entity/Place.java @@ -1,20 +1,13 @@ package com.example.nto.entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; +import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; - -/** - * TODO: ДОРАБОТАТЬ в рамках задания - * ================================= - * МОЖНО: Добавлять методы, аннотации, зависимости - * НЕЛЬЗЯ: Изменять название класса и пакета - */ +@Entity +@Table(name = "place") @Data @Builder @NoArgsConstructor @@ -25,5 +18,6 @@ public class Place { @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; + @Column(name = "place_name") private String place; } -- 2.34.1 From f870b7991a29cb5e5cdbcd4051fba9f26915a242 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A0=D0=B8=D1=84=D0=B0=D1=82=20=D0=97=D0=B0=D0=BA=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2?= Date: Mon, 8 Dec 2025 12:05:01 +0000 Subject: [PATCH 06/19] Update src/main/java/com/example/nto/repository/BookingRepository.java --- .../nto/repository/BookingRepository.java | 30 ++++++++++++++----- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/example/nto/repository/BookingRepository.java b/src/main/java/com/example/nto/repository/BookingRepository.java index 303bb54..05c624d 100644 --- a/src/main/java/com/example/nto/repository/BookingRepository.java +++ b/src/main/java/com/example/nto/repository/BookingRepository.java @@ -1,10 +1,26 @@ package com.example.nto.repository; -/** - * TODO: ДОРАБОТАТЬ в рамках задания - * ================================= - * МОЖНО: Добавлять методы, аннотации, зависимости - * НЕЛЬЗЯ: Изменять название класса и пакета - */ -public interface BookingRepository { +import com.example.nto.entity.Booking; +import com.example.nto.entity.Employee; +import com.example.nto.entity.Place; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.time.LocalDate; +import java.util.List; + +@Repository +public interface BookingRepository extends JpaRepository { + + // Все брони сотрудника + List findAllByEmployee(Employee employee); + + // Все брони на дату + List findAllByDate(LocalDate date); + + // Есть ли бронь у сотрудника на эту дату + boolean existsByDateAndEmployee(LocalDate date, Employee employee); + + // Занято ли место на эту дату + boolean existsByDateAndPlace(LocalDate date, Place place); } -- 2.34.1 From f8a1da5df9fad8c0cb7e4ed2c17dd4722a3408c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A0=D0=B8=D1=84=D0=B0=D1=82=20=D0=97=D0=B0=D0=BA=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2?= Date: Mon, 8 Dec 2025 12:05:13 +0000 Subject: [PATCH 07/19] Update src/main/java/com/example/nto/repository/EmployeeRepository.java --- .../nto/repository/EmployeeRepository.java | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/example/nto/repository/EmployeeRepository.java b/src/main/java/com/example/nto/repository/EmployeeRepository.java index 210d29c..69bada1 100644 --- a/src/main/java/com/example/nto/repository/EmployeeRepository.java +++ b/src/main/java/com/example/nto/repository/EmployeeRepository.java @@ -1,10 +1,16 @@ package com.example.nto.repository; -/** - * TODO: ДОРАБОТАТЬ в рамках задания - * ================================= - * МОЖНО: Добавлять методы, аннотации, зависимости - * НЕЛЬЗЯ: Изменять название класса и пакета - */ -public interface EmployeeRepository { +import com.example.nto.entity.Employee; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.Optional; + + +@Repository +public interface EmployeeRepository extends JpaRepository { + + Optional findByCode(String code); + + boolean existsByCode(String code); } -- 2.34.1 From 2e2dc5cd1f0bfe946c13bf4b3d15918af05982be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A0=D0=B8=D1=84=D0=B0=D1=82=20=D0=97=D0=B0=D0=BA=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2?= Date: Mon, 8 Dec 2025 12:05:23 +0000 Subject: [PATCH 08/19] Update src/main/java/com/example/nto/repository/PlaceRepository.java --- .../example/nto/repository/PlaceRepository.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/example/nto/repository/PlaceRepository.java b/src/main/java/com/example/nto/repository/PlaceRepository.java index d3bea1d..8e00833 100644 --- a/src/main/java/com/example/nto/repository/PlaceRepository.java +++ b/src/main/java/com/example/nto/repository/PlaceRepository.java @@ -1,10 +1,10 @@ package com.example.nto.repository; -/** - * TODO: ДОРАБОТАТЬ в рамках задания - * ================================= - * МОЖНО: Добавлять методы, аннотации, зависимости - * НЕЛЬЗЯ: Изменять название класса и пакета - */ -public interface PlaceRepository { +import com.example.nto.entity.Place; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + + +@Repository +public interface PlaceRepository extends JpaRepository { } -- 2.34.1 From 4cd71ec9ad57a4722014bad5df4b1d83a2f5cb7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A0=D0=B8=D1=84=D0=B0=D1=82=20=D0=97=D0=B0=D0=BA=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2?= Date: Mon, 8 Dec 2025 12:05:39 +0000 Subject: [PATCH 09/19] Update src/main/java/com/example/nto/service/impl/BookingServiceImpl.java --- .../nto/service/impl/BookingServiceImpl.java | 85 +++++++++++++++++-- 1 file changed, 79 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/example/nto/service/impl/BookingServiceImpl.java b/src/main/java/com/example/nto/service/impl/BookingServiceImpl.java index d24b244..33c2eee 100644 --- a/src/main/java/com/example/nto/service/impl/BookingServiceImpl.java +++ b/src/main/java/com/example/nto/service/impl/BookingServiceImpl.java @@ -1,12 +1,85 @@ package com.example.nto.service.impl; +import com.example.nto.entity.Booking; +import com.example.nto.entity.Employee; +import com.example.nto.entity.Place; +import com.example.nto.repository.BookingRepository; +import com.example.nto.repository.PlaceRepository; import com.example.nto.service.BookingService; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; -/** - * TODO: ДОРАБОТАТЬ в рамках задания - * ================================= - * МОЖНО: Добавлять методы, аннотации, зависимости - * НЕЛЬЗЯ: Изменять название класса и пакета - */ +import java.time.LocalDate; +import java.util.*; +import java.util.stream.Collectors; + +@Service +@RequiredArgsConstructor public class BookingServiceImpl implements BookingService { + + private final BookingRepository bookingRepository; + private final PlaceRepository placeRepository; + + @Value("${booking.days-ahead}") + private int daysAhead; + + @Override + public Map getBookingsByEmployee(Employee employee) { + List bookings = bookingRepository.findAllByEmployee(employee); + + return bookings.stream() + .collect(Collectors.toMap( + Booking::getDate, + b -> b, + (b1, b2) -> b1, + TreeMap::new + )); + } + + @Override + public Map> getAvailablePlaces() { + LocalDate start = LocalDate.now(); + List allPlaces = placeRepository.findAll(); + Map> result = new LinkedHashMap<>(); + + for (int i = 0; i <= daysAhead; i++) { + LocalDate date = start.plusDays(i); + + List bookingsForDate = bookingRepository.findAllByDate(date); + Set busyPlaceIds = bookingsForDate.stream() + .map(b -> b.getPlace().getId()) + .collect(Collectors.toSet()); + + List available = allPlaces.stream() + .filter(p -> !busyPlaceIds.contains(p.getId())) + .collect(Collectors.toList()); + + result.put(date, available); + } + + return result; + } + + @Override + public boolean existsBookingForEmployeeOnDate(Employee employee, LocalDate date) { + return bookingRepository.findAllByDate(date).stream() + .anyMatch(b -> b.getEmployee() != null && b.getEmployee().getId() == employee.getId()); + } + + @Override + public boolean isPlaceBookedOnDate(Place place, LocalDate date) { + return bookingRepository.existsByDateAndPlace(date, place); + } + + @Override + public Booking createBooking(Employee employee, LocalDate date, Place place) { + Booking booking = Booking.builder() + .date(date) + .employee(employee) + .place(place) + .build(); + + return bookingRepository.save(booking); + } } -- 2.34.1 From b513cfb282bf67e455cd0d2fdbff360491658784 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A0=D0=B8=D1=84=D0=B0=D1=82=20=D0=97=D0=B0=D0=BA=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2?= Date: Mon, 8 Dec 2025 12:05:48 +0000 Subject: [PATCH 10/19] Update src/main/java/com/example/nto/service/impl/EmployeeServiceImpl.java --- .../nto/service/impl/EmployeeServiceImpl.java | 26 ++++++++++++++----- 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/example/nto/service/impl/EmployeeServiceImpl.java b/src/main/java/com/example/nto/service/impl/EmployeeServiceImpl.java index f8125e5..20c01a9 100644 --- a/src/main/java/com/example/nto/service/impl/EmployeeServiceImpl.java +++ b/src/main/java/com/example/nto/service/impl/EmployeeServiceImpl.java @@ -1,12 +1,26 @@ package com.example.nto.service.impl; +import com.example.nto.entity.Employee; +import com.example.nto.repository.EmployeeRepository; import com.example.nto.service.EmployeeService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; -/** - * TODO: ДОРАБОТАТЬ в рамках задания - * ================================= - * МОЖНО: Добавлять методы, аннотации, зависимости - * НЕЛЬЗЯ: Изменять название класса и пакета - */ +import java.util.Optional; + +@Service +@RequiredArgsConstructor public class EmployeeServiceImpl implements EmployeeService { + + private final EmployeeRepository employeeRepository; + + @Override + public boolean existsByCode(String code) { + return employeeRepository.existsByCode(code); + } + + @Override + public Optional findByCode(String code) { + return employeeRepository.findByCode(code); + } } -- 2.34.1 From 2b83847947923be8823df95ced837f2a49de937c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A0=D0=B8=D1=84=D0=B0=D1=82=20=D0=97=D0=B0=D0=BA=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2?= Date: Mon, 8 Dec 2025 12:05:57 +0000 Subject: [PATCH 11/19] Update src/main/java/com/example/nto/service/BookingService.java --- .../example/nto/service/BookingService.java | 24 ++++++++++++++----- 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/example/nto/service/BookingService.java b/src/main/java/com/example/nto/service/BookingService.java index 31ec148..e244ff3 100644 --- a/src/main/java/com/example/nto/service/BookingService.java +++ b/src/main/java/com/example/nto/service/BookingService.java @@ -1,10 +1,22 @@ package com.example.nto.service; -/** - * TODO: ДОРАБОТАТЬ в рамках задания - * ================================= - * МОЖНО: Добавлять методы, аннотации, зависимости - * НЕЛЬЗЯ: Изменять название класса и пакета - */ +import com.example.nto.entity.Booking; +import com.example.nto.entity.Employee; +import com.example.nto.entity.Place; + +import java.time.LocalDate; +import java.util.List; +import java.util.Map; + public interface BookingService { + + Map getBookingsByEmployee(Employee employee); + + Map> getAvailablePlaces(); + + boolean existsBookingForEmployeeOnDate(Employee employee, LocalDate date); + + boolean isPlaceBookedOnDate(Place place, LocalDate date); + + Booking createBooking(Employee employee, LocalDate date, Place place); } -- 2.34.1 From ffe6d20c587d5edd870a895b94f364af69bce61e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A0=D0=B8=D1=84=D0=B0=D1=82=20=D0=97=D0=B0=D0=BA=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2?= Date: Mon, 8 Dec 2025 12:06:06 +0000 Subject: [PATCH 12/19] Update src/main/java/com/example/nto/service/EmployeeService.java --- .../com/example/nto/service/EmployeeService.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/example/nto/service/EmployeeService.java b/src/main/java/com/example/nto/service/EmployeeService.java index cccd209..b799f1c 100644 --- a/src/main/java/com/example/nto/service/EmployeeService.java +++ b/src/main/java/com/example/nto/service/EmployeeService.java @@ -1,10 +1,13 @@ package com.example.nto.service; -/** - * TODO: ДОРАБОТАТЬ в рамках задания - * ================================= - * МОЖНО: Добавлять методы, аннотации, зависимости - * НЕЛЬЗЯ: Изменять название класса и пакета - */ +import com.example.nto.entity.Employee; + +import java.util.Optional; + + public interface EmployeeService { + + boolean existsByCode(String code); + + Optional findByCode(String code); } -- 2.34.1 From 14f176557ee3ff4255a0d794ae7d962e6f97557b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A0=D0=B8=D1=84=D0=B0=D1=82=20=D0=97=D0=B0=D0=BA=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2?= Date: Mon, 8 Dec 2025 12:06:16 +0000 Subject: [PATCH 13/19] Update src/main/java/com/example/nto/App.java --- src/main/java/com/example/nto/App.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/example/nto/App.java b/src/main/java/com/example/nto/App.java index e453f89..d4add94 100644 --- a/src/main/java/com/example/nto/App.java +++ b/src/main/java/com/example/nto/App.java @@ -1,12 +1,11 @@ package com.example.nto; -/** - * TODO: ДОРАБОТАТЬ в рамках задания - * ================================= - * МОЖНО: Добавлять методы, аннотации, зависимости - * НЕЛЬЗЯ: Изменять название класса и пакета - */ +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication public class App { public static void main(String[] args) { + SpringApplication.run(App.class, args); } } -- 2.34.1 From ba04d412e8455ee311cce8152ee10d4ad65cf583 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A0=D0=B8=D1=84=D0=B0=D1=82=20=D0=97=D0=B0=D0=BA=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2?= Date: Mon, 8 Dec 2025 12:07:31 +0000 Subject: [PATCH 14/19] Upload files to "src/main/java/com/example/nto" --- src/main/java/com/example/nto/BookingRequestDto.java | 11 +++++++++++ src/main/java/com/example/nto/BookingShortDto.java | 4 ++++ .../java/com/example/nto/EmployeeInfoResponseDto.java | 10 ++++++++++ 3 files changed, 25 insertions(+) create mode 100644 src/main/java/com/example/nto/BookingRequestDto.java create mode 100644 src/main/java/com/example/nto/BookingShortDto.java create mode 100644 src/main/java/com/example/nto/EmployeeInfoResponseDto.java diff --git a/src/main/java/com/example/nto/BookingRequestDto.java b/src/main/java/com/example/nto/BookingRequestDto.java new file mode 100644 index 0000000..e9bed52 --- /dev/null +++ b/src/main/java/com/example/nto/BookingRequestDto.java @@ -0,0 +1,11 @@ +package com.example.nto.dto; + +/** + * Тело запроса для POST /api/{code}/book + * { + * "date": "2025-01-05", + * "placeId": 1 + * } + */ +public record BookingRequestDto(String date, Long placeId) { +} diff --git a/src/main/java/com/example/nto/BookingShortDto.java b/src/main/java/com/example/nto/BookingShortDto.java new file mode 100644 index 0000000..1816de5 --- /dev/null +++ b/src/main/java/com/example/nto/BookingShortDto.java @@ -0,0 +1,4 @@ +package com.example.nto.dto; + +public record BookingShortDto(long id, String place) { +} diff --git a/src/main/java/com/example/nto/EmployeeInfoResponseDto.java b/src/main/java/com/example/nto/EmployeeInfoResponseDto.java new file mode 100644 index 0000000..9de7259 --- /dev/null +++ b/src/main/java/com/example/nto/EmployeeInfoResponseDto.java @@ -0,0 +1,10 @@ +package com.example.nto.dto; + +import java.util.Map; + +public record EmployeeInfoResponseDto( + String name, + String photoUrl, + Map booking +) { +} -- 2.34.1 From 9b9cd0883693995c4e64d30216b9a8f3e51c641e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A0=D0=B8=D1=84=D0=B0=D1=82=20=D0=97=D0=B0=D0=BA=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2?= Date: Mon, 8 Dec 2025 12:07:38 +0000 Subject: [PATCH 15/19] Delete src/main/java/com/example/nto/BookingRequestDto.java --- src/main/java/com/example/nto/BookingRequestDto.java | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100644 src/main/java/com/example/nto/BookingRequestDto.java diff --git a/src/main/java/com/example/nto/BookingRequestDto.java b/src/main/java/com/example/nto/BookingRequestDto.java deleted file mode 100644 index e9bed52..0000000 --- a/src/main/java/com/example/nto/BookingRequestDto.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.example.nto.dto; - -/** - * Тело запроса для POST /api/{code}/book - * { - * "date": "2025-01-05", - * "placeId": 1 - * } - */ -public record BookingRequestDto(String date, Long placeId) { -} -- 2.34.1 From 5bdfb19fd85157caac749aa80d5b4c269c2d4e14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A0=D0=B8=D1=84=D0=B0=D1=82=20=D0=97=D0=B0=D0=BA=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2?= Date: Mon, 8 Dec 2025 12:07:43 +0000 Subject: [PATCH 16/19] Delete src/main/java/com/example/nto/BookingShortDto.java --- src/main/java/com/example/nto/BookingShortDto.java | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 src/main/java/com/example/nto/BookingShortDto.java diff --git a/src/main/java/com/example/nto/BookingShortDto.java b/src/main/java/com/example/nto/BookingShortDto.java deleted file mode 100644 index 1816de5..0000000 --- a/src/main/java/com/example/nto/BookingShortDto.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.example.nto.dto; - -public record BookingShortDto(long id, String place) { -} -- 2.34.1 From 2a9f262b528b6f339fecba46bfa6155aef7bd61a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A0=D0=B8=D1=84=D0=B0=D1=82=20=D0=97=D0=B0=D0=BA=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2?= Date: Mon, 8 Dec 2025 12:07:47 +0000 Subject: [PATCH 17/19] Delete src/main/java/com/example/nto/EmployeeInfoResponseDto.java --- .../java/com/example/nto/EmployeeInfoResponseDto.java | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 src/main/java/com/example/nto/EmployeeInfoResponseDto.java diff --git a/src/main/java/com/example/nto/EmployeeInfoResponseDto.java b/src/main/java/com/example/nto/EmployeeInfoResponseDto.java deleted file mode 100644 index 9de7259..0000000 --- a/src/main/java/com/example/nto/EmployeeInfoResponseDto.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.example.nto.dto; - -import java.util.Map; - -public record EmployeeInfoResponseDto( - String name, - String photoUrl, - Map booking -) { -} -- 2.34.1 From 4304812e5f4ea557d5327e2045922bf875a19d67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A0=D0=B8=D1=84=D0=B0=D1=82=20=D0=97=D0=B0=D0=BA=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2?= Date: Mon, 8 Dec 2025 12:08:05 +0000 Subject: [PATCH 18/19] Upload files to "src/main/java/com/example/nto/dto" --- .../java/com/example/nto/dto/BookingRequestDto.java | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 src/main/java/com/example/nto/dto/BookingRequestDto.java diff --git a/src/main/java/com/example/nto/dto/BookingRequestDto.java b/src/main/java/com/example/nto/dto/BookingRequestDto.java new file mode 100644 index 0000000..e9bed52 --- /dev/null +++ b/src/main/java/com/example/nto/dto/BookingRequestDto.java @@ -0,0 +1,11 @@ +package com.example.nto.dto; + +/** + * Тело запроса для POST /api/{code}/book + * { + * "date": "2025-01-05", + * "placeId": 1 + * } + */ +public record BookingRequestDto(String date, Long placeId) { +} -- 2.34.1 From adee20f7c3e9015a77680b8b5f21b3d94c9241f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A0=D0=B8=D1=84=D0=B0=D1=82=20=D0=97=D0=B0=D0=BA=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2?= Date: Mon, 8 Dec 2025 12:08:16 +0000 Subject: [PATCH 19/19] Upload files to "src/main/java/com/example/nto/dto" --- src/main/java/com/example/nto/dto/BookingShortDto.java | 4 ++++ .../com/example/nto/dto/EmployeeInfoResponseDto.java | 10 ++++++++++ 2 files changed, 14 insertions(+) create mode 100644 src/main/java/com/example/nto/dto/BookingShortDto.java create mode 100644 src/main/java/com/example/nto/dto/EmployeeInfoResponseDto.java diff --git a/src/main/java/com/example/nto/dto/BookingShortDto.java b/src/main/java/com/example/nto/dto/BookingShortDto.java new file mode 100644 index 0000000..1816de5 --- /dev/null +++ b/src/main/java/com/example/nto/dto/BookingShortDto.java @@ -0,0 +1,4 @@ +package com.example.nto.dto; + +public record BookingShortDto(long id, String place) { +} diff --git a/src/main/java/com/example/nto/dto/EmployeeInfoResponseDto.java b/src/main/java/com/example/nto/dto/EmployeeInfoResponseDto.java new file mode 100644 index 0000000..9de7259 --- /dev/null +++ b/src/main/java/com/example/nto/dto/EmployeeInfoResponseDto.java @@ -0,0 +1,10 @@ +package com.example.nto.dto; + +import java.util.Map; + +public record EmployeeInfoResponseDto( + String name, + String photoUrl, + Map booking +) { +} -- 2.34.1