REST API для управления кинотеатром с функциями управления фильмами, залами, сеансами, покупателями и билетами.
- Java 21
- Spring Boot 3.5.6
- PostgreSQL
id- уникальный идентификаторtitle- название фильмаdescription- описаниеdurationMinutes- продолжительность в минутахgenre- жанрdirector- режиссерyear- год выпуска
id- уникальный идентификаторname- название залаcapacity- вместимость
id- уникальный идентификаторfirstName- имяlastName- фамилияemail- emailphone- телефон
id- уникальный идентификаторmovieId- ID фильмаhallId- ID залаstartTime- время началаprice- цена билетаavailableSeats- доступные места
id- уникальный идентификаторscreeningId- ID сеансаcustomerId- ID покупателяseatNumber- номер местаpurchaseTime- время покупкиisCancelled- статус отмены
POST /api/movies- создать фильмGET /api/movies- получить все фильмыGET /api/movies/{id}- получить фильм по IDPUT /api/movies/{id}- обновить фильмDELETE /api/movies/{id}- удалить фильмGET /api/movies/search?title={title}- поиск по названиюGET /api/movies/genre/{genre}- получить фильмы по жанру
POST /api/halls- создать залGET /api/halls- получить все залыGET /api/halls/{id}- получить зал по IDPUT /api/halls/{id}- обновить залDELETE /api/halls/{id}- удалить зал
POST /api/customers- создать покупателяGET /api/customers- получить всех покупателейGET /api/customers/{id}- получить покупателя по IDPUT /api/customers/{id}- обновить покупателяDELETE /api/customers/{id}- удалить покупателя
POST /api/screenings- создать сеансGET /api/screenings- получить все сеансыGET /api/screenings/{id}- получить сеанс по IDPUT /api/screenings/{id}- обновить сеансDELETE /api/screenings/{id}- удалить сеансGET /api/screenings/upcoming- получить предстоящие сеансыGET /api/screenings/movie/{movieId}- получить сеансы по фильмуGET /api/screenings/hall/{hallId}- получить сеансы по залу
POST /api/tickets- купить билетGET /api/tickets- получить все билетыGET /api/tickets/{id}- получить билет по IDPUT /api/tickets/{id}- обновить билетDELETE /api/tickets/{id}- удалить билетPOST /api/tickets/{id}/cancel- отменить билет (возврат)POST /api/tickets/bulk-purchase- массовая покупка билетовGET /api/tickets/screening/{screeningId}- получить билеты по сеансуGET /api/tickets/customer/{customerId}- получить билеты покупателяGET /api/tickets/screening/{screeningId}/active- активные билеты на сеанс
В системе реализовано 5 бизнес-операций, которые работают с несколькими таблицами и используют транзакции:
Endpoint: POST /api/tickets
- Проверяет доступность мест в зале
- Проверяет, что место не занято
- Проверяет, что номер места не превышает вместимость зала
- Автоматически уменьшает количество доступных мест
- Транзакция: Ticket + Screening
Endpoint: POST /api/tickets/{id}/cancel
- Проверяет, что сеанс еще не начался
- Проверяет, что билет не был отменен ранее
- Автоматически увеличивает количество доступных мест
- Помечает билет как отмененный
- Транзакция: Ticket + Screening
Endpoint: POST /api/tickets/bulk-purchase
- Покупка нескольких билетов одним запросом
- Проверяет доступность всех запрошенных мест
- Проверяет отсутствие дубликатов в запросе
- Проверяет, что все места не заняты
- Либо покупает все билеты, либо не покупает ни одного (атомарная транзакция)
- Транзакция: Multiple Tickets + Screening
Endpoint: GET /api/screenings/upcoming
- Возвращает только сеансы, которые еще не начались
- Фильтрация по текущей дате и времени
- Включает полную информацию о фильме и зале
Endpoint: GET /api/tickets/screening/{screeningId}/active
- Возвращает только неотмененные билеты
- Показывает занятые места на конкретный сеанс
- Используется для проверки доступности мест
- Вместимость зала: Количество проданных билетов не может превышать вместимость зала
- Уникальность мест: Одно место может быть продано только один раз на сеанс
- Возврат билетов: Возврат возможен только до начала сеанса
- Автоматический подсчет: Количество доступных мест автоматически уменьшается при покупке и увеличивается при возврате
- Транзакционность: Все операции с билетами и сеансами выполняются в транзакциях
- Откройте pgAdmin
- Подключитесь к серверу PostgreSQL
- Правой кнопкой на "Databases" → "Create" → "Database..."
- Введите имя:
cinemadb - Owner:
postgres - Нажмите "Save"
.\gradlew.bat bootRun.\gradlew.bat clean build -x testПриложение будет доступно по адресу: http://localhost:8081
Подробный файл WINDOWS_TERMINAL_GUIDE.md для всех команд.
try {
Invoke-RestMethod -Uri "http://localhost:8081/api/customers" -Method Post `
-Body '{"firstName":"","lastName":"","email":"bad","phone":""}' `
-ContentType "application/json; charset=utf-8"
} catch {
$reader = New-Object System.IO.StreamReader($_.Exception.Response.GetResponseStream())
$reader.BaseStream.Position = 0
$responseBody = $reader.ReadToEnd()
$result = $responseBody | ConvertFrom-Json
Write-Host "`nAll validation errors:" -ForegroundColor Yellow
$result.errors.PSObject.Properties | ForEach-Object {
Write-Host " - $($_.Name): $($_.Value)" -ForegroundColor Yellow
}
}- Аутентификация и авторизация пользователей
- Административная панель
- Лендинг фильмов(?наверное, если потрбуете что-то с фронтом)