This commit is contained in:
2025-05-20 20:28:29 +04:00
parent ac625cd19e
commit 4f3e802935
20 changed files with 113 additions and 80 deletions

View File

@@ -12,7 +12,8 @@ import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import ru.ip.example.domain.AddSeazonDto;
import ru.ip.example.domain.FilmDto;
import ru.ip.example.domain.FilmRequestDto;
import ru.ip.example.domain.FilmResponseDto;
import ru.ip.example.service.FilmService;
import java.util.List;
@@ -26,26 +27,26 @@ public class FilmController {
@GetMapping("/films")
@Operation(description = "Возвращает список всех фильмов")
public List<FilmDto> getAll() {
public List<FilmResponseDto> getAll() {
return filmService.findAllFilms();
}
@GetMapping("/films/{id}")
@Operation(description = "Возвращает фильм по id")
public FilmDto getById(@PathVariable("id") Integer id) {
public FilmResponseDto getById(@PathVariable("id") Integer id) {
return filmService.findFilmById(id);
}
@PostMapping("/films")
@Operation(description = "Сохраняет фильм")
public FilmDto save(@RequestBody FilmDto filmDto) {
return filmService.saveFilm(filmDto);
public FilmResponseDto save(@RequestBody FilmRequestDto requestDto) {
return filmService.saveFilm(requestDto);
}
@PutMapping("/films/{id}")
@Operation(description = "Обновляет фильм")
public FilmDto update(@Schema(description = "Id фильма") @PathVariable("id") Integer id, @RequestBody FilmDto filmDto) {
return filmService.updateFilm(id, filmDto);
public FilmResponseDto update(@Schema(description = "Id фильма") @PathVariable("id") Integer id, @RequestBody FilmRequestDto requestDto) {
return filmService.updateFilm(id, requestDto);
}
@DeleteMapping("/films/{id}")
@@ -56,7 +57,7 @@ public class FilmController {
@PutMapping("/films/seazons")
@Operation(description = "Привязать фильм к сезону")
public FilmDto addSeazon(@RequestBody AddSeazonDto addSeazonDto) {
public FilmResponseDto addSeazon(@RequestBody AddSeazonDto addSeazonDto) {
return filmService.addSeazon(addSeazonDto);
}
}

View File

@@ -11,7 +11,8 @@ import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import ru.ip.example.domain.AddSeriesDto;
import ru.ip.example.domain.SeazonDto;
import ru.ip.example.domain.SeazonRequestDto;
import ru.ip.example.domain.SeazonResponseDto;
import ru.ip.example.service.SeazonService;
import java.util.List;
@@ -25,25 +26,25 @@ public class SeazonController {
@GetMapping("/seazons")
@Operation(description = "Получить список сезонов")
public List<SeazonDto> getSeazons() {
public List<SeazonResponseDto> getSeazons() {
return seazonService.findAll();
}
@GetMapping("/seazons/{id}")
@Operation(description = "Получить сезон по id")
public SeazonDto getSeazon(@PathVariable("id") Integer id) {
public SeazonResponseDto getSeazon(@PathVariable("id") Integer id) {
return seazonService.findById(id);
}
@PostMapping("/seazons")
@Operation(description = "Создать сезон")
public SeazonDto save(@RequestBody SeazonDto dto) {
public SeazonResponseDto save(@RequestBody SeazonRequestDto dto) {
return seazonService.save(dto);
}
@PutMapping("/seazons/{id}")
@Operation(description = "Обновить данные сезона")
public SeazonDto update(@PathVariable("id") Integer id, @RequestBody SeazonDto dto) {
public SeazonResponseDto update(@PathVariable("id") Integer id, @RequestBody SeazonRequestDto dto) {
return seazonService.update(id, dto);
}
@@ -55,7 +56,7 @@ public class SeazonController {
@PutMapping("/seazons/series")
@Operation(description = "Привязать сезон и серию")
public SeazonDto addSeries(@RequestBody AddSeriesDto dto) {
public SeazonResponseDto addSeries(@RequestBody AddSeriesDto dto) {
return seazonService.addSeries(dto);
}
}

View File

@@ -10,7 +10,6 @@ import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import ru.ip.example.domain.SeazonDto;
import ru.ip.example.domain.SeriesDto;
import ru.ip.example.service.SeriesService;

View File

@@ -0,0 +1,18 @@
package ru.ip.example.domain;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
@Schema(description = "Информация о фильме")
public class FilmRequestDto {
@Schema(description = "Название фильма")
private String title;
@Schema(description = "Категория фильма")
private String category;
@Schema(description = "Год выпуска")
private Integer releaseYear;
}

View File

@@ -9,7 +9,7 @@ import java.util.List;
//dto - data transfer object
@Data
@Schema(description = "Информация о фильме")
public class FilmDto {
public class FilmResponseDto {
@Schema(description = "Название фильма")
private String title;
@@ -22,5 +22,5 @@ public class FilmDto {
@ToString.Exclude
@Schema(description = "Список сезонов")
private List<SeazonDto> seazons;
private List<SeazonResponseDto> seazons;
}

View File

@@ -0,0 +1,17 @@
package ru.ip.example.domain;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
@Schema(description = "Данные сезона")
public class SeazonRequestDto {
@Schema(description = "Номер сезона")
private Integer number;
@Schema(description = "Ссылка на видео анонса сезона")
private String anonsVideoLink;
}

View File

@@ -8,11 +8,14 @@ import java.util.List;
@Data
@Schema(description = "Данные сезона")
public class SeazonDto {
public class SeazonResponseDto {
@Schema(description = "Номер сезона")
private Integer number;
@Schema(description = "Ссылка на видео анонса сезона")
private String anonsVideoLink;
@ToString.Exclude
@Schema(description = "Список серий")
private List<SeriesDto> series;

View File

@@ -27,6 +27,9 @@ public class SeazonEntity {
@Column(name = "number")
private Integer number;
@Column(name = "anons_video_link")
private String anonsVideoLink;
@ToString.Exclude
@OneToMany
@JoinColumn(name = "seazon_id", referencedColumnName = "id")

View File

@@ -2,8 +2,9 @@ package ru.ip.example.mapper;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import ru.ip.example.domain.FilmDto;
import ru.ip.example.domain.SeazonDto;
import ru.ip.example.domain.FilmRequestDto;
import ru.ip.example.domain.FilmResponseDto;
import ru.ip.example.domain.SeazonResponseDto;
import ru.ip.example.domain.entity.FilmEntity;
import ru.ip.example.domain.entity.SeazonEntity;
@@ -14,9 +15,9 @@ import java.util.List;
public interface FilmMapper {
@Mapping(source = "entity.seazons", target = "seazons")
FilmDto toDto(FilmEntity entity);
FilmResponseDto toDto(FilmEntity entity);
List<SeazonDto> toSeazonsList(List<SeazonEntity> seazonEntities);
List<SeazonResponseDto> toSeazonsList(List<SeazonEntity> seazonEntities);
FilmEntity toEntity(FilmDto dto);
FilmEntity toEntity(FilmRequestDto dto);
}

View File

@@ -2,7 +2,8 @@ package ru.ip.example.mapper;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import ru.ip.example.domain.SeazonDto;
import ru.ip.example.domain.SeazonRequestDto;
import ru.ip.example.domain.SeazonResponseDto;
import ru.ip.example.domain.SeriesDto;
import ru.ip.example.domain.entity.SeazonEntity;
import ru.ip.example.domain.entity.SeriesEntity;
@@ -13,9 +14,9 @@ import java.util.List;
public interface SeazonMapper {
@Mapping(source = "entity.series", target = "series")
SeazonDto toDto(SeazonEntity entity);
SeazonResponseDto toDto(SeazonEntity entity);
List<SeriesDto> toSeriesList(List<SeriesEntity> seriesEntities);
SeazonEntity toEntity(SeazonDto dto);
SeazonEntity toEntity(SeazonRequestDto dto);
}

View File

@@ -1,21 +1,22 @@
package ru.ip.example.service;
import ru.ip.example.domain.AddSeazonDto;
import ru.ip.example.domain.FilmDto;
import ru.ip.example.domain.FilmRequestDto;
import ru.ip.example.domain.FilmResponseDto;
import java.util.List;
public interface FilmService {
FilmDto saveFilm(FilmDto dto);
FilmResponseDto saveFilm(FilmRequestDto dto);
FilmDto updateFilm(Integer id, FilmDto dto);
FilmResponseDto updateFilm(Integer id, FilmRequestDto dto);
List<FilmDto> findAllFilms();
List<FilmResponseDto> findAllFilms();
FilmDto findFilmById(Integer id);
FilmResponseDto findFilmById(Integer id);
void deleteById(Integer id);
FilmDto addSeazon(AddSeazonDto addSeazonDto);
FilmResponseDto addSeazon(AddSeazonDto addSeazonDto);
}

View File

@@ -1,21 +1,22 @@
package ru.ip.example.service;
import ru.ip.example.domain.AddSeriesDto;
import ru.ip.example.domain.SeazonDto;
import ru.ip.example.domain.SeazonRequestDto;
import ru.ip.example.domain.SeazonResponseDto;
import java.util.List;
public interface SeazonService {
List<SeazonDto> findAll();
List<SeazonResponseDto> findAll();
SeazonDto findById(Integer id);
SeazonResponseDto findById(Integer id);
SeazonDto save(SeazonDto dto);
SeazonResponseDto save(SeazonRequestDto dto);
SeazonDto update(Integer id, SeazonDto dto);
SeazonResponseDto update(Integer id, SeazonRequestDto dto);
void delete(Integer id);
SeazonDto addSeries(AddSeriesDto dto);
SeazonResponseDto addSeries(AddSeriesDto dto);
}

View File

@@ -4,10 +4,9 @@ import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import ru.ip.example.domain.AddSeazonDto;
import ru.ip.example.domain.FilmDto;
import ru.ip.example.domain.FilmRequestDto;
import ru.ip.example.domain.FilmResponseDto;
import ru.ip.example.domain.entity.FilmEntity;
import ru.ip.example.domain.entity.SeazonEntity;
import ru.ip.example.domain.entity.SeriesEntity;
import ru.ip.example.mapper.FilmMapper;
import ru.ip.example.repository.FilmRepository;
import ru.ip.example.repository.SeazonRepository;
@@ -28,7 +27,7 @@ public class FilmServiceImpl implements FilmService {
@Transactional
@Override
public FilmDto saveFilm(FilmDto dto) {
public FilmResponseDto saveFilm(FilmRequestDto dto) {
FilmEntity entity = filmMapper.toEntity(dto);
FilmEntity savedFilm = filmRepository.save(entity);
return filmMapper.toDto(savedFilm);
@@ -36,7 +35,7 @@ public class FilmServiceImpl implements FilmService {
@Transactional
@Override
public FilmDto updateFilm(Integer id, FilmDto dto) {
public FilmResponseDto updateFilm(Integer id, FilmRequestDto dto) {
FilmEntity filmEntity = filmMapper.toEntity(dto);
filmEntity.setId(id);
FilmEntity updatedEntity = filmRepository.save(filmEntity);
@@ -45,11 +44,11 @@ public class FilmServiceImpl implements FilmService {
@Transactional(readOnly = true)
@Override
public List<FilmDto> findAllFilms() {
public List<FilmResponseDto> findAllFilms() {
Iterable<FilmEntity> filmEntities = filmRepository.findAll();
List<FilmDto> films = new ArrayList<>();
List<FilmResponseDto> films = new ArrayList<>();
for (FilmEntity entity : filmEntities) {
FilmDto dto = filmMapper.toDto(entity);
FilmResponseDto dto = filmMapper.toDto(entity);
films.add(dto);
}
return films;
@@ -57,7 +56,7 @@ public class FilmServiceImpl implements FilmService {
@Transactional(readOnly = true)
@Override
public FilmDto findFilmById(Integer id) {
public FilmResponseDto findFilmById(Integer id) {
FilmEntity film = filmRepository.findById(id).orElseThrow();
return filmMapper.toDto(film);
}
@@ -70,11 +69,11 @@ public class FilmServiceImpl implements FilmService {
@Transactional
@Override
public FilmDto addSeazon(AddSeazonDto addSeazonDto) {
public FilmResponseDto addSeazon(AddSeazonDto addSeazonDto) {
var film = filmRepository.findById(addSeazonDto.getFilmId());
var seazon = seazonRepository.findById(addSeazonDto.getSeazonId());
if (film.isPresent() && seazon.isPresent() && !seazon.get().getSeries().contains(film.get())) {
if (film.isPresent() && seazon.isPresent() && !film.get().getSeazons().contains(seazon.get())) {
film.get().getSeazons().add(seazon.get());
FilmEntity save = filmRepository.save(film.get());
return filmMapper.toDto(save);

View File

@@ -4,9 +4,9 @@ import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import ru.ip.example.domain.AddSeriesDto;
import ru.ip.example.domain.SeazonDto;
import ru.ip.example.domain.SeazonRequestDto;
import ru.ip.example.domain.SeazonResponseDto;
import ru.ip.example.domain.entity.SeazonEntity;
import ru.ip.example.domain.entity.SeriesEntity;
import ru.ip.example.mapper.SeazonMapper;
import ru.ip.example.repository.SeazonRepository;
import ru.ip.example.repository.SeriesRepository;
@@ -28,25 +28,25 @@ public class SeazonServiceImpl implements SeazonService {
@Transactional(readOnly = true)
@Override
public List<SeazonDto> findAll() {
public List<SeazonResponseDto> findAll() {
Iterable<SeazonEntity> seazons = seazonRepository.findAll();
List<SeazonDto> seazonDtos = new ArrayList<>();
List<SeazonResponseDto> seazonResponseDtos = new ArrayList<>();
for (SeazonEntity seazon : seazons) {
seazonDtos.add(seazonMapper.toDto(seazon));
seazonResponseDtos.add(seazonMapper.toDto(seazon));
}
return seazonDtos;
return seazonResponseDtos;
}
@Transactional(readOnly = true)
@Override
public SeazonDto findById(Integer id) {
public SeazonResponseDto findById(Integer id) {
SeazonEntity seazon = seazonRepository.findById(id).orElseThrow();
return seazonMapper.toDto(seazon);
}
@Transactional
@Override
public SeazonDto save(SeazonDto dto) {
public SeazonResponseDto save(SeazonRequestDto dto) {
SeazonEntity entity = seazonMapper.toEntity(dto);
SeazonEntity savedEntity = seazonRepository.save(entity);
return seazonMapper.toDto(savedEntity);
@@ -54,7 +54,7 @@ public class SeazonServiceImpl implements SeazonService {
@Transactional
@Override
public SeazonDto update(Integer id, SeazonDto dto) {
public SeazonResponseDto update(Integer id, SeazonRequestDto dto) {
SeazonEntity entity = seazonMapper.toEntity(dto);
entity.setId(id);
SeazonEntity savedEntity = seazonRepository.save(entity);
@@ -70,7 +70,7 @@ public class SeazonServiceImpl implements SeazonService {
@Transactional
@Override
public SeazonDto addSeries(AddSeriesDto dto) {
public SeazonResponseDto addSeries(AddSeriesDto dto) {
var series = seriesRepository.findById(dto.getSeriesId());
var seazon = seazonRepository.findById(dto.getSeazonId());

View File

@@ -3,9 +3,7 @@ package ru.ip.example.service.impl;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import ru.ip.example.domain.SeazonDto;
import ru.ip.example.domain.SeriesDto;
import ru.ip.example.domain.entity.SeazonEntity;
import ru.ip.example.domain.entity.SeriesEntity;
import ru.ip.example.mapper.SeriesMapper;
import ru.ip.example.repository.SeriesRepository;

View File

@@ -12,9 +12,11 @@
<column name="number" type="int">
<constraints nullable="false" />
</column>
<column name="film_id" type="int">
<column name="anons_video_link" type="varchar(255)">
<constraints nullable="false" />
</column>
<column name="film_id" type="int">
</column>
</createTable>
<addForeignKeyConstraint baseTableName="seazon" baseColumnNames="film_id" constraintName="film_id_fk" referencedTableName="film"
referencedColumnNames="id" />

View File

@@ -16,7 +16,6 @@
<constraints nullable="false" />
</column>
<column name="seazon_id" type="int">
<constraints nullable="false" />
</column>
</createTable>
<addForeignKeyConstraint baseTableName="series" baseColumnNames="seazon_id" constraintName="seazon_id_fk"

View File

@@ -7,6 +7,7 @@
<insert tableName="seazon">
<column name="id" value="0" />
<column name="number" value="1" />
<column name="anons_video_link" value="link_to_anons" />
<column name="film_id" value="0" />
</insert>
</changeSet>

View File

@@ -1,18 +1,6 @@
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-latest.xsd">
<property name="now" value="now()" dbms="h2" />
<property name="floatType" value="float4" dbms="h2" />
<property name="uuidType" value="uuid" dbms="h2" />
<property name="datetimeType" value="datetime(6)" dbms="h2" />
<property name="clobType" value="longvarchar" dbms="h2" />
<property name="blobType" value="blob" dbms="h2" />
<property name="now" value="current_timestamp" dbms="postgresql" />
<property name="floatType" value="float4" dbms="postgresql" />
<property name="clobType" value="clob" dbms="postgresql" />
<property name="blobType" value="blob" dbms="postgresql" />
<property name="uuidType" value="uuid" dbms="postgresql" />
<property name="datetimeType" value="datetime" dbms="postgresql" />
<include file="db/migration/0-film-schema.xml" />
<include file="db/migration/1-seazon-schema.xml" />