diff --git a/pom.xml b/pom.xml index 3a870e1..7eac6f6 100644 --- a/pom.xml +++ b/pom.xml @@ -35,6 +35,16 @@ spring-boot-starter-web + + org.springframework.boot + spring-boot-starter-data-jpa + + + com.h2database + h2 + runtime + + org.springdoc springdoc-openapi-starter-webmvc-ui diff --git a/src/main/java/ru/ip/example/domain/entity/FilmEntity.java b/src/main/java/ru/ip/example/domain/entity/FilmEntity.java index e1accd9..d102534 100644 --- a/src/main/java/ru/ip/example/domain/entity/FilmEntity.java +++ b/src/main/java/ru/ip/example/domain/entity/FilmEntity.java @@ -1,5 +1,11 @@ package ru.ip.example.domain.entity; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.OneToMany; +import jakarta.persistence.Table; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; @@ -7,9 +13,13 @@ import lombok.ToString; import java.util.List; @Data +@Entity +@Table(name = "film") @EqualsAndHashCode(onlyExplicitlyIncluded = true) public class FilmEntity { + @Id + @GeneratedValue @EqualsAndHashCode.Include private Integer id; @@ -20,5 +30,7 @@ public class FilmEntity { private Integer releaseYear; @ToString.Exclude + @OneToMany + @JoinColumn(name = "film_id", referencedColumnName = "id") private List seazons; } diff --git a/src/main/java/ru/ip/example/domain/entity/SeazonEntity.java b/src/main/java/ru/ip/example/domain/entity/SeazonEntity.java index 0400c57..27f3734 100644 --- a/src/main/java/ru/ip/example/domain/entity/SeazonEntity.java +++ b/src/main/java/ru/ip/example/domain/entity/SeazonEntity.java @@ -1,5 +1,11 @@ package ru.ip.example.domain.entity; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.OneToMany; +import jakarta.persistence.Table; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; @@ -7,14 +13,20 @@ import lombok.ToString; import java.util.List; @Data +@Entity +@Table(name = "seazon") @EqualsAndHashCode(onlyExplicitlyIncluded = true) public class SeazonEntity { + @Id + @GeneratedValue @EqualsAndHashCode.Include private Integer id; private Integer number; @ToString.Exclude + @OneToMany + @JoinColumn(name = "seazon_id", referencedColumnName = "id") private List series; } diff --git a/src/main/java/ru/ip/example/domain/entity/SeriesEntity.java b/src/main/java/ru/ip/example/domain/entity/SeriesEntity.java index 7ef39e4..7099404 100644 --- a/src/main/java/ru/ip/example/domain/entity/SeriesEntity.java +++ b/src/main/java/ru/ip/example/domain/entity/SeriesEntity.java @@ -1,14 +1,22 @@ package ru.ip.example.domain.entity; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.persistence.Table; import lombok.Data; import lombok.EqualsAndHashCode; import java.util.Objects; @Data +@Entity +@Table(name = "series") @EqualsAndHashCode(onlyExplicitlyIncluded = true) public class SeriesEntity { + @Id + @GeneratedValue @EqualsAndHashCode.Include private Integer id; diff --git a/src/main/java/ru/ip/example/domain/entity/SubscribeEntity.java b/src/main/java/ru/ip/example/domain/entity/SubscribeEntity.java index b528955..0a7b025 100644 --- a/src/main/java/ru/ip/example/domain/entity/SubscribeEntity.java +++ b/src/main/java/ru/ip/example/domain/entity/SubscribeEntity.java @@ -1,12 +1,20 @@ package ru.ip.example.domain.entity; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.persistence.Table; import lombok.Data; import lombok.EqualsAndHashCode; @Data +@Entity +@Table(name = "subscribe") @EqualsAndHashCode(onlyExplicitlyIncluded = true) public class SubscribeEntity { + @Id + @GeneratedValue @EqualsAndHashCode.Include private Integer id; diff --git a/src/main/java/ru/ip/example/repository/FilmRepository.java b/src/main/java/ru/ip/example/repository/FilmRepository.java index 5486701..234cb54 100644 --- a/src/main/java/ru/ip/example/repository/FilmRepository.java +++ b/src/main/java/ru/ip/example/repository/FilmRepository.java @@ -1,15 +1,8 @@ package ru.ip.example.repository; +import org.springframework.data.repository.CrudRepository; import ru.ip.example.domain.entity.FilmEntity; import java.util.List; -public interface FilmRepository { - - FilmEntity save(FilmEntity entity); - - List findAll(); - - FilmEntity findById(Integer id); - - void deleteById(Integer id); +public interface FilmRepository extends CrudRepository { } diff --git a/src/main/java/ru/ip/example/repository/SeazonRepository.java b/src/main/java/ru/ip/example/repository/SeazonRepository.java index 0e555bc..4a1cca4 100644 --- a/src/main/java/ru/ip/example/repository/SeazonRepository.java +++ b/src/main/java/ru/ip/example/repository/SeazonRepository.java @@ -1,18 +1,12 @@ package ru.ip.example.repository; +import org.springframework.data.repository.CrudRepository; import ru.ip.example.domain.SeazonDto; +import ru.ip.example.domain.entity.FilmEntity; import ru.ip.example.domain.entity.SeazonEntity; import ru.ip.example.domain.entity.SeriesEntity; import java.util.List; -public interface SeazonRepository { - - List findAll(); - - SeazonEntity findById(Integer id); - - SeazonEntity save(SeazonEntity entity); - - void delete(Integer id); +public interface SeazonRepository extends CrudRepository { } diff --git a/src/main/java/ru/ip/example/repository/SeriesRepository.java b/src/main/java/ru/ip/example/repository/SeriesRepository.java index a557c10..a098427 100644 --- a/src/main/java/ru/ip/example/repository/SeriesRepository.java +++ b/src/main/java/ru/ip/example/repository/SeriesRepository.java @@ -1,16 +1,7 @@ package ru.ip.example.repository; +import org.springframework.data.repository.CrudRepository; import ru.ip.example.domain.entity.SeriesEntity; -import java.util.List; - -public interface SeriesRepository { - - List findAll(); - - SeriesEntity findById(int id); - - SeriesEntity save(SeriesEntity entity); - - void delete(Integer id); +public interface SeriesRepository extends CrudRepository { } diff --git a/src/main/java/ru/ip/example/repository/SubscribeRepository.java b/src/main/java/ru/ip/example/repository/SubscribeRepository.java index 57a74c0..d116ece 100644 --- a/src/main/java/ru/ip/example/repository/SubscribeRepository.java +++ b/src/main/java/ru/ip/example/repository/SubscribeRepository.java @@ -1,16 +1,7 @@ package ru.ip.example.repository; +import org.springframework.data.repository.CrudRepository; import ru.ip.example.domain.entity.SubscribeEntity; -import java.util.List; - -public interface SubscribeRepository { - - SubscribeEntity save(SubscribeEntity entity); - - List findAll(); - - SubscribeEntity findById(Integer id); - - void deleteById(Integer id); +public interface SubscribeRepository extends CrudRepository { } diff --git a/src/main/java/ru/ip/example/repository/impl/FilmRepositoryDao.java b/src/main/java/ru/ip/example/repository/impl/FilmRepositoryDao.java deleted file mode 100644 index 7752e66..0000000 --- a/src/main/java/ru/ip/example/repository/impl/FilmRepositoryDao.java +++ /dev/null @@ -1,55 +0,0 @@ -package ru.ip.example.repository.impl; - -import org.springframework.stereotype.Service; -import ru.ip.example.domain.entity.FilmEntity; -import ru.ip.example.repository.FilmRepository; - -import java.util.ArrayList; -import java.util.List; - -@Service -public class FilmRepositoryDao implements FilmRepository { - - private static Integer idSequence = 0; - - private static List films = new ArrayList<>(); - - @Override - public FilmEntity save(FilmEntity entity) { - if (entity.getId() == null) { - entity.setSeazons(new ArrayList<>()); - entity.setId(idSequence++); - films.add(entity); - } else if (films.contains(entity)) { - FilmEntity film = findById(entity.getId()); - film.setCategory(entity.getCategory()); - film.setTitle(entity.getTitle()); - film.setReleaseYear(entity.getReleaseYear()); - } - System.out.println("save/upd film: " + entity); - return entity; - } - - @Override - public List findAll() { - return films; - } - - @Override - public FilmEntity findById(Integer id) { - for (FilmEntity film : films) { - if (film.getId().equals(id)) { - return film; - } - } - return null; - } - - //equals реализован только с id, поэтому для remove в entity проставляем только id - @Override - public void deleteById(Integer id) { - FilmEntity filmEntity = new FilmEntity(); - filmEntity.setId(id); - films.remove(filmEntity); - } -} diff --git a/src/main/java/ru/ip/example/repository/impl/SeazonRepositoryDao.java b/src/main/java/ru/ip/example/repository/impl/SeazonRepositoryDao.java deleted file mode 100644 index 808013b..0000000 --- a/src/main/java/ru/ip/example/repository/impl/SeazonRepositoryDao.java +++ /dev/null @@ -1,54 +0,0 @@ -package ru.ip.example.repository.impl; - -import org.springframework.stereotype.Service; -import ru.ip.example.domain.entity.SeazonEntity; -import ru.ip.example.repository.SeazonRepository; - -import java.util.ArrayList; -import java.util.List; - -@Service -public class SeazonRepositoryDao implements SeazonRepository { - - private static Integer SEAZON_SEQ = 0; - - public static List seazons = new ArrayList<>(); - - @Override - public List findAll() { - return seazons; - } - - @Override - public SeazonEntity findById(Integer id) { - SeazonEntity seazonEntity = new SeazonEntity(); - seazonEntity.setId(id); - for (SeazonEntity seazon : seazons) { - if (seazon.equals(seazonEntity)) { - return seazon; - } - } - return null; - } - - @Override - public SeazonEntity save(SeazonEntity entity) { - if (entity.getId() == null) { - entity.setSeries(new ArrayList<>()); - entity.setId(SEAZON_SEQ++); - seazons.add(entity); - } else if (seazons.contains(entity)) { - SeazonEntity seazon = findById(entity.getId()); - seazon.setNumber(entity.getNumber()); - } - System.out.println("save/upd seazon: " + entity); - return entity; - } - - @Override - public void delete(Integer id) { - SeazonEntity seazon = new SeazonEntity(); - seazon.setId(id); - seazons.remove(seazon); - } -} diff --git a/src/main/java/ru/ip/example/repository/impl/SerialRepositoryDao.java b/src/main/java/ru/ip/example/repository/impl/SerialRepositoryDao.java deleted file mode 100644 index d816da7..0000000 --- a/src/main/java/ru/ip/example/repository/impl/SerialRepositoryDao.java +++ /dev/null @@ -1,54 +0,0 @@ -package ru.ip.example.repository.impl; - -import org.springframework.stereotype.Service; -import ru.ip.example.domain.entity.SeriesEntity; -import ru.ip.example.repository.SeriesRepository; - -import java.util.ArrayList; -import java.util.List; - -@Service -public class SerialRepositoryDao implements SeriesRepository { - - public static List series = new ArrayList<>(); - - private static Integer SERIES_SEQ = 0; - - @Override - public List findAll() { - return series; - } - - @Override - public SeriesEntity findById(int id) { - SeriesEntity seriesEntity = new SeriesEntity(); - seriesEntity.setId(id); - for (SeriesEntity ser : series) { - if (ser.equals(seriesEntity)) { - return ser; - } - } - return null; - } - - @Override - public SeriesEntity save(SeriesEntity entity) { - if (entity.getId() == null) { - entity.setId(SERIES_SEQ++); - series.add(entity); - } else if (series.contains(entity)) { - SeriesEntity series1 = findById(entity.getId()); - series1.setName(entity.getName()); - series1.setNumber(entity.getNumber()); - } - System.out.println("save/upd series: " + entity); - return entity; - } - - @Override - public void delete(Integer id) { - SeriesEntity seriesEntity = new SeriesEntity(); - seriesEntity.setId(id); - series.remove(seriesEntity); - } -} diff --git a/src/main/java/ru/ip/example/repository/impl/SubscribeRepositoryDao.java b/src/main/java/ru/ip/example/repository/impl/SubscribeRepositoryDao.java deleted file mode 100644 index 8dd11b6..0000000 --- a/src/main/java/ru/ip/example/repository/impl/SubscribeRepositoryDao.java +++ /dev/null @@ -1,53 +0,0 @@ -package ru.ip.example.repository.impl; - -import org.springframework.stereotype.Service; -import ru.ip.example.domain.entity.SubscribeEntity; -import ru.ip.example.repository.SubscribeRepository; - -import java.util.ArrayList; -import java.util.List; - -@Service -public class SubscribeRepositoryDao implements SubscribeRepository { - - private static Integer idSequence = 0; - - private static List subscribes = new ArrayList<>(); - - @Override - public SubscribeEntity save(SubscribeEntity entity) { - if (entity.getId() == null) { - entity.setId(idSequence++); - subscribes.add(entity); - } else if (subscribes.contains(entity)) { - SubscribeEntity film = findById(entity.getId()); - film.setName(entity.getName()); - film.setSum(entity.getSum()); - } - System.out.println("save/upd film: " + entity); - return entity; - } - - @Override - public List findAll() { - return subscribes; - } - - @Override - public SubscribeEntity findById(Integer id) { - for (SubscribeEntity sub : subscribes) { - if (sub.getId().equals(id)) { - return sub; - } - } - return null; - } - - //equals реализован только с id, поэтому для remove в entity проставляем только id - @Override - public void deleteById(Integer id) { - SubscribeEntity SubscribeEntity = new SubscribeEntity(); - SubscribeEntity.setId(id); - subscribes.remove(SubscribeEntity); - } -} diff --git a/src/main/java/ru/ip/example/service/impl/FilmServiceImpl.java b/src/main/java/ru/ip/example/service/impl/FilmServiceImpl.java index fa8e7b0..adcc7c8 100644 --- a/src/main/java/ru/ip/example/service/impl/FilmServiceImpl.java +++ b/src/main/java/ru/ip/example/service/impl/FilmServiceImpl.java @@ -6,6 +6,7 @@ import ru.ip.example.domain.AddSeazonDto; import ru.ip.example.domain.FilmDto; 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; @@ -41,7 +42,7 @@ public class FilmServiceImpl implements FilmService { @Override public List findAllFilms() { - List filmEntities = filmRepository.findAll(); + Iterable filmEntities = filmRepository.findAll(); List films = new ArrayList<>(); for (FilmEntity entity : filmEntities) { FilmDto dto = filmMapper.toDto(entity); @@ -52,7 +53,7 @@ public class FilmServiceImpl implements FilmService { @Override public FilmDto findFilmById(Integer id) { - FilmEntity film = filmRepository.findById(id); + FilmEntity film = filmRepository.findById(id).orElseThrow(); return filmMapper.toDto(film); } @@ -63,12 +64,14 @@ public class FilmServiceImpl implements FilmService { @Override public FilmDto addSeazon(AddSeazonDto addSeazonDto) { - SeazonEntity seazonEntity = seazonRepository.findById(addSeazonDto.getSeazonId()); - FilmEntity film = filmRepository.findById(addSeazonDto.getFilmId()); + var film = filmRepository.findById(addSeazonDto.getFilmId()); + var seazon = seazonRepository.findById(addSeazonDto.getSeazonId()); - if (seazonEntity != null && film != null && !film.getSeazons().contains(seazonEntity)) { - film.getSeazons().add(seazonEntity); + if (film.isPresent() && seazon.isPresent() && !seazon.get().getSeries().contains(film.get())) { + film.get().getSeazons().add(seazon.get()); + FilmEntity save = filmRepository.save(film.get()); + return filmMapper.toDto(save); } - return filmMapper.toDto(film); + return filmMapper.toDto(film.get()); } } diff --git a/src/main/java/ru/ip/example/service/impl/SeazonServiceImpl.java b/src/main/java/ru/ip/example/service/impl/SeazonServiceImpl.java index c00f724..a87c92d 100644 --- a/src/main/java/ru/ip/example/service/impl/SeazonServiceImpl.java +++ b/src/main/java/ru/ip/example/service/impl/SeazonServiceImpl.java @@ -13,6 +13,7 @@ import ru.ip.example.service.SeazonService; import java.util.ArrayList; import java.util.List; +import java.util.Optional; @Service @RequiredArgsConstructor @@ -26,7 +27,7 @@ public class SeazonServiceImpl implements SeazonService { @Override public List findAll() { - List seazons = seazonRepository.findAll(); + Iterable seazons = seazonRepository.findAll(); List seazonDtos = new ArrayList<>(); for(SeazonEntity seazon : seazons) { seazonDtos.add(seazonMapper.toDto(seazon)); @@ -36,7 +37,7 @@ public class SeazonServiceImpl implements SeazonService { @Override public SeazonDto findById(Integer id) { - SeazonEntity seazon = seazonRepository.findById(id); + SeazonEntity seazon = seazonRepository.findById(id).orElseThrow(); return seazonMapper.toDto(seazon); } @@ -57,17 +58,21 @@ public class SeazonServiceImpl implements SeazonService { @Override public void delete(Integer id) { - seazonRepository.delete(id); + Optional seazon = seazonRepository.findById(id); + seazon.ifPresent(seazonRepository::delete); } @Override public SeazonDto addSeries(AddSeriesDto dto) { - SeriesEntity series = seriesRepository.findById(dto.getSeriesId()); - SeazonEntity seazon = seazonRepository.findById(dto.getSeazonId()); + var series = seriesRepository.findById(dto.getSeriesId()); + var seazon = seazonRepository.findById(dto.getSeazonId()); - if (series != null && seazon != null && !seazon.getSeries().contains(series)) { - seazon.getSeries().add(series); + if (series.isPresent() && seazon.isPresent() && !seazon.get().getSeries().contains(series.get())) { + + seazon.get().getSeries().add(series.get()); + SeazonEntity seazonEntity = seazonRepository.save(seazon.get()); + return seazonMapper.toDto(seazonEntity); } - return seazonMapper.toDto(seazon); + return seazonMapper.toDto(seazon.get()); } } diff --git a/src/main/java/ru/ip/example/service/impl/SeriesServiceImpl.java b/src/main/java/ru/ip/example/service/impl/SeriesServiceImpl.java index 9fc96b3..f38377d 100644 --- a/src/main/java/ru/ip/example/service/impl/SeriesServiceImpl.java +++ b/src/main/java/ru/ip/example/service/impl/SeriesServiceImpl.java @@ -23,7 +23,7 @@ public class SeriesServiceImpl implements SeriesService { @Override public List findAll() { - List series = seriesRepository.findAll(); + Iterable series = seriesRepository.findAll(); List seriesDtos = new ArrayList<>(); for(SeriesEntity seazon : series) { seriesDtos.add(seriesMapper.toDto(seazon)); @@ -33,7 +33,7 @@ public class SeriesServiceImpl implements SeriesService { @Override public SeriesDto findById(Integer id) { - SeriesEntity series = seriesRepository.findById(id); + SeriesEntity series = seriesRepository.findById(id).orElseThrow(); return seriesMapper.toDto(series); } @@ -54,6 +54,7 @@ public class SeriesServiceImpl implements SeriesService { @Override public void delete(Integer id) { - seriesRepository.delete(id); + seriesRepository.findById(id) + .ifPresent(seriesRepository::delete); } } diff --git a/src/main/java/ru/ip/example/service/impl/SubscribeServiceImpl.java b/src/main/java/ru/ip/example/service/impl/SubscribeServiceImpl.java index f451a32..1cd3cfd 100644 --- a/src/main/java/ru/ip/example/service/impl/SubscribeServiceImpl.java +++ b/src/main/java/ru/ip/example/service/impl/SubscribeServiceImpl.java @@ -36,7 +36,7 @@ public class SubscribeServiceImpl implements SubscribeService { @Override public List findAllSubscribes() { - List subscribeEntities = subscribeRepository.findAll(); + Iterable subscribeEntities = subscribeRepository.findAll(); List subscribes = new ArrayList<>(); for (SubscribeEntity entity : subscribeEntities) { SubscribeDto dto = subscribeMapper.toDto(entity); @@ -47,7 +47,7 @@ public class SubscribeServiceImpl implements SubscribeService { @Override public SubscribeDto findSubscribeById(Integer id) { - SubscribeEntity subscribe = subscribeRepository.findById(id); + SubscribeEntity subscribe = subscribeRepository.findById(id).orElseThrow(); return subscribeMapper.toDto(subscribe); } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 68de7d3..aefdc81 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1 +1,7 @@ spring.application.name=example +spring.datasource.url=jdbc:h2:mem:testdb +spring.datasource.driverClassName=org.h2.Driver +spring.datasource.username=sa +spring.datasource.password=password +spring.jpa.database-platform=org.hibernate.dialect.H2Dialect +spring.h2.console.enabled=true