entity additions

This commit is contained in:
2025-04-18 22:42:57 +04:00
parent d2eaee9282
commit af46007de1
25 changed files with 445 additions and 125 deletions

38
pom.xml
View File

@@ -41,6 +41,13 @@
<version>2.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
@@ -56,6 +63,37 @@
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven-compiler.version}</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</path>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.6.3</version>
</path>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-mapstruct-binding</artifactId>
<version>0.2.0</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>

View File

@@ -5,11 +5,21 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
import ru.ip.example.config.SwaggerConfig;
import ru.ip.example.controller.FilmController;
import ru.ip.example.controller.SeazonController;
import ru.ip.example.controller.SeriesController;
import ru.ip.example.mapper.FilmMapper;
import ru.ip.example.mapper.SeazonMapper;
import ru.ip.example.mapper.SeriesMapper;
import ru.ip.example.repository.FilmRepository;
import ru.ip.example.repository.SeazonRepository;
import ru.ip.example.repository.SeriesRepository;
import ru.ip.example.service.FilmService;
import ru.ip.example.service.SeazonService;
import ru.ip.example.service.SeriesService;
@ComponentScan(basePackageClasses = {FilmMapper.class, FilmController.class, FilmService.class, FilmRepository.class, SwaggerConfig.class})
@ComponentScan(basePackageClasses = {FilmMapper.class, FilmController.class, FilmService.class, FilmRepository.class,
SeazonMapper.class, SeazonRepository.class, SeazonService.class, SeazonController.class,
SeriesMapper.class, SeriesRepository.class, SeriesService.class, SeriesController.class, SwaggerConfig.class})
@SpringBootApplication
public class ExampleApplication {

View File

@@ -0,0 +1,30 @@
package ru.ip.example.controller;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import ru.ip.example.domain.SeazonDto;
import ru.ip.example.service.SeazonService;
@RestController
@RequiredArgsConstructor
@Tag(name = "SeazonsAPI", description = "Контроллер для управления сезонами")
public class SeazonController {
private final SeazonService seazonService;
@PostMapping("/seazons")
public SeazonDto save(@RequestBody SeazonDto dto) {
return seazonService.save(dto);
}
@PutMapping("/seazons/{id}")
public SeazonDto update(@PathVariable("id") Integer id, @RequestBody SeazonDto dto) {
return seazonService.update(id, dto);
}
@DeleteMapping("/seazons/{id}")
public void delete(@PathVariable("id") Integer id) {
seazonService.delete(id);
}
}

View File

@@ -0,0 +1,28 @@
package ru.ip.example.controller;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import ru.ip.example.domain.SeriesDto;
import ru.ip.example.service.SeriesService;
@RestController
@RequiredArgsConstructor
public class SeriesController {
private final SeriesService seriesService;
@PostMapping("/series")
public SeriesDto save(@RequestBody SeriesDto dto) {
return seriesService.save(dto);
}
@PutMapping("/series/{id}")
public SeriesDto update(@PathVariable("id") Integer id, @RequestBody SeriesDto seriesDto) {
return seriesService.update(id, seriesDto);
}
@DeleteMapping("/series/{id}")
public void delete(@PathVariable("id") Integer id) {
seriesService.delete(id);
}
}

View File

@@ -1,8 +1,13 @@
package ru.ip.example.domain;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.ToString;
import java.util.List;
//dto - data transfer object
@Data
@Schema(description = "Информация о фильме")
public class FilmDto {
@@ -15,36 +20,7 @@ public class FilmDto {
@Schema(description = "Год выпуска")
private Integer releaseYear;
public FilmDto(String title, String category, Integer releaseYear) {
this.title = title;
this.category = category;
this.releaseYear = releaseYear;
}
public FilmDto() {
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
public Integer getReleaseYear() {
return releaseYear;
}
public void setReleaseYear(Integer releaseYear) {
this.releaseYear = releaseYear;
}
@ToString.Exclude
@Schema(description = "Список сезонов")
private List<SeazonDto> seazons;
}

View File

@@ -1,79 +0,0 @@
package ru.ip.example.domain;
import java.util.Objects;
public class FilmEntity {
private Integer id;
private String title;
private String category;
private Integer releaseYear;
public FilmEntity(Integer id, String title, String category, Integer releaseYear) {
this.id = id;
this.title = title;
this.category = category;
this.releaseYear = releaseYear;
}
public FilmEntity() {
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
public Integer getReleaseYear() {
return releaseYear;
}
public void setReleaseYear(Integer releaseYear) {
this.releaseYear = releaseYear;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
FilmEntity that = (FilmEntity) o;
return Objects.equals(id, that.id);
}
@Override
public int hashCode() {
return Objects.hashCode(id);
}
@Override
public String toString() {
return "FilmEntity{" +
"id=" + id +
", title='" + title + '\'' +
", category='" + category + '\'' +
", releaseYear=" + releaseYear +
'}';
}
}

View File

@@ -0,0 +1,18 @@
package ru.ip.example.domain;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.ToString;
import java.util.List;
@Data
public class SeazonDto {
@Schema(description = "Номер сезона")
private Integer number;
@ToString.Exclude
@Schema(description = "Список серий")
private List<SeriesDto> series;
}

View File

@@ -0,0 +1,14 @@
package ru.ip.example.domain;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class SeriesDto {
@Schema(description = "Название серии")
private String name;
@Schema(description = "Номер серии")
private Integer number;
}

View File

@@ -0,0 +1,25 @@
package ru.ip.example.domain.entity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import java.util.List;
import java.util.Objects;
@Data
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
public class FilmEntity {
@EqualsAndHashCode.Include
private Integer id;
private String title;
private String category;
private Integer releaseYear;
@ToString.Exclude
private List<SeazonEntity> seasons;
}

View File

@@ -0,0 +1,20 @@
package ru.ip.example.domain.entity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import java.util.List;
@Data
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
public class SeazonEntity {
@EqualsAndHashCode.Include
private Integer id;
private Integer number;
@ToString.Exclude
private List<SeriesEntity> series;
}

View File

@@ -0,0 +1,18 @@
package ru.ip.example.domain.entity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Objects;
@Data
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
public class SeriesEntity {
@EqualsAndHashCode.Include
private Integer id;
private String name;
private Integer number;
}

View File

@@ -2,7 +2,7 @@ package ru.ip.example.mapper;
import org.mapstruct.Mapper;
import ru.ip.example.domain.FilmDto;
import ru.ip.example.domain.FilmEntity;
import ru.ip.example.domain.entity.FilmEntity;
//чтобы spring инициализировал маппер
@Mapper(componentModel = "spring")

View File

@@ -0,0 +1,13 @@
package ru.ip.example.mapper;
import org.mapstruct.Mapper;
import ru.ip.example.domain.SeazonDto;
import ru.ip.example.domain.entity.SeazonEntity;
@Mapper(componentModel = "spring")
public interface SeazonMapper {
SeazonDto toDto(SeazonEntity entity);
SeazonEntity toEntity(SeazonDto dto);
}

View File

@@ -0,0 +1,13 @@
package ru.ip.example.mapper;
import org.mapstruct.Mapper;
import ru.ip.example.domain.SeriesDto;
import ru.ip.example.domain.entity.SeriesEntity;
@Mapper(componentModel = "spring")
public interface SeriesMapper {
SeriesEntity toEntity(SeriesDto dto);
SeriesDto toDto(SeriesEntity entity);
}

View File

@@ -1,7 +1,6 @@
package ru.ip.example.repository;
import ru.ip.example.domain.FilmEntity;
import ru.ip.example.domain.entity.FilmEntity;
import java.util.List;
public interface FilmRepository {

View File

@@ -0,0 +1,14 @@
package ru.ip.example.repository;
import ru.ip.example.domain.SeazonDto;
import ru.ip.example.domain.entity.SeazonEntity;
import ru.ip.example.domain.entity.SeriesEntity;
import java.util.List;
public interface SeazonRepository {
SeazonEntity save(SeazonEntity entity);
void delete(Integer id);
}

View File

@@ -0,0 +1,10 @@
package ru.ip.example.repository;
import ru.ip.example.domain.entity.SeriesEntity;
public interface SeriesRepository {
SeriesEntity save(SeriesEntity entity);
void delete(Integer id);
}

View File

@@ -1,7 +1,10 @@
package ru.ip.example.repository;
package ru.ip.example.repository.impl;
import org.springframework.stereotype.Service;
import ru.ip.example.domain.FilmEntity;
import ru.ip.example.domain.FilmDto;
import ru.ip.example.domain.entity.FilmEntity;
import ru.ip.example.domain.entity.SeazonEntity;
import ru.ip.example.repository.FilmRepository;
import java.util.ArrayList;
import java.util.List;

View File

@@ -0,0 +1,38 @@
package ru.ip.example.repository.impl;
import org.springframework.stereotype.Service;
import ru.ip.example.domain.entity.SeazonEntity;
import ru.ip.example.domain.entity.SeriesEntity;
import ru.ip.example.repository.SeazonRepository;
import java.util.List;
@Service
public class SeazonRepositoryDao implements SeazonRepository {
private static Integer SEAZON_SEQ = 0;
public static List<SeazonEntity> seazons;
@Override
public SeazonEntity save(SeazonEntity entity) {
if (entity.getId() == null) {
entity.setId(SEAZON_SEQ++);
} else if (seazons.contains(entity)) {
int persistEntityIndex = seazons.indexOf(entity);
SeazonEntity savedSeazon = seazons.get(persistEntityIndex);
entity.setSeries(savedSeazon.getSeries());
seazons.remove(entity);
}
seazons.add(entity);
System.out.println("save/upd film: " + entity);
return entity;
}
@Override
public void delete(Integer id) {
SeazonEntity seazon = new SeazonEntity();
seazon.setId(id);
seazons.remove(seazon);
}
}

View File

@@ -0,0 +1,34 @@
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.List;
@Service
public class SerialRepositoryDao implements SeriesRepository {
public static List<SeriesEntity> series;
private static Integer SERIES_SEQ = 0;
@Override
public SeriesEntity save(SeriesEntity entity) {
if (entity.getId() == null) {
entity.setId(SERIES_SEQ++);
} else if (series.contains(entity)) {
series.remove(entity);
}
series.add(entity);
System.out.println("save/upd film: " + entity);
return entity;
}
@Override
public void delete(Integer id) {
SeriesEntity seriesEntity = new SeriesEntity();
seriesEntity.setId(id);
series.remove(seriesEntity);
}
}

View File

@@ -0,0 +1,12 @@
package ru.ip.example.service;
import ru.ip.example.domain.SeazonDto;
public interface SeazonService {
SeazonDto save(SeazonDto dto);
SeazonDto update(Integer id, SeazonDto dto);
void delete(Integer id);
}

View File

@@ -0,0 +1,12 @@
package ru.ip.example.service;
import ru.ip.example.domain.SeriesDto;
public interface SeriesService {
SeriesDto save(SeriesDto dto);
SeriesDto update(Integer id, SeriesDto dto);
void delete(Integer id);
}

View File

@@ -1,28 +1,25 @@
package ru.ip.example.service;
package ru.ip.example.service.impl;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import ru.ip.example.domain.FilmDto;
import ru.ip.example.domain.FilmEntity;
import ru.ip.example.domain.entity.FilmEntity;
import ru.ip.example.mapper.FilmMapper;
import ru.ip.example.repository.FilmRepository;
import ru.ip.example.service.FilmService;
import java.util.ArrayList;
import java.util.List;
@Service
@RequiredArgsConstructor
public class FilmServiceImpl implements FilmService {
private final FilmRepository filmRepository;
private final FilmMapper filmMapper;
@Autowired
public FilmServiceImpl(FilmRepository filmRepository, FilmMapper filmMapper) {
this.filmRepository = filmRepository;
this.filmMapper = filmMapper;
}
@Override
public FilmDto saveFilm(FilmDto dto) {
FilmEntity entity = filmMapper.toEntity(dto);

View File

@@ -0,0 +1,38 @@
package ru.ip.example.service.impl;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import ru.ip.example.domain.SeazonDto;
import ru.ip.example.domain.entity.SeazonEntity;
import ru.ip.example.mapper.SeazonMapper;
import ru.ip.example.repository.SeazonRepository;
import ru.ip.example.service.SeazonService;
@Service
@RequiredArgsConstructor
public class SeazonServiceImpl implements SeazonService {
private final SeazonRepository seazonRepository;
private final SeazonMapper seazonMapper;
@Override
public SeazonDto save(SeazonDto dto) {
SeazonEntity entity = seazonMapper.toEntity(dto);
SeazonEntity savedEntity = seazonRepository.save(entity);
return seazonMapper.toDto(savedEntity);
}
@Override
public SeazonDto update(Integer id, SeazonDto dto) {
SeazonEntity entity = seazonMapper.toEntity(dto);
entity.setId(id);
SeazonEntity savedEntity = seazonRepository.save(entity);
return seazonMapper.toDto(savedEntity);
}
@Override
public void delete(Integer id) {
seazonRepository.delete(id);
}
}

View File

@@ -0,0 +1,39 @@
package ru.ip.example.service.impl;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
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;
import ru.ip.example.service.SeriesService;
@Service
@RequiredArgsConstructor
public class SeriesServiceImpl implements SeriesService {
private final SeriesMapper seriesMapper;
private final SeriesRepository seriesRepository;
@Override
public SeriesDto save(SeriesDto dto) {
SeriesEntity entity = seriesMapper.toEntity(dto);
SeriesEntity savedEntity = seriesRepository.save(entity);
return seriesMapper.toDto(savedEntity);
}
@Override
public SeriesDto update(Integer id, SeriesDto dto) {
SeriesEntity entity = seriesMapper.toEntity(dto);
entity.setId(id);
SeriesEntity savedEntity = seriesRepository.save(entity);
return seriesMapper.toDto(savedEntity);
}
@Override
public void delete(Integer id) {
seriesRepository.delete(id);
}
}