diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/build.gradle b/build.gradle index 2263922..d174ab2 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ plugins { id 'java' - id 'org.springframework.boot' version '3.2.2' + id 'org.springframework.boot' version '3.2.5' id 'io.spring.dependency-management' version '1.1.4' } @@ -18,6 +18,7 @@ repositories { dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.3.0' + implementation 'org.modelmapper:modelmapper:3.2.0' testImplementation 'org.springframework.boot:spring-boot-starter-test' } diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index d64cd49..e644113 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 1af9e09..b82aa23 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew.bat b/gradlew.bat index 93e3f59..25da30d 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -43,11 +43,11 @@ set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 if %ERRORLEVEL% equ 0 goto execute -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail @@ -57,11 +57,11 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe if exist "%JAVA_EXE%" goto execute -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail diff --git a/src/main/java/com/example/demo/ApiController.java b/src/main/java/com/example/demo/ApiController.java deleted file mode 100644 index df1e67a..0000000 --- a/src/main/java/com/example/demo/ApiController.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.example.demo; - -import java.util.Date; -import java.util.List; -import java.util.ArrayList; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -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.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -@RestController -@RequestMapping("/usertest") -public class ApiController { - private final Logger log = LoggerFactory.getLogger(ApiController.class); - - List data = new ArrayList<>(List.of( - new UserTest("handle1", "email1", "name1", "password1"), - new UserTest("handle2", "email2", "name2", "password2"))); - - @PostMapping - public UserTest create(@RequestBody UserTest user) { - data.add(user); - return user; - } - - @GetMapping - public List readAll() { - return data; - } - - @GetMapping("/{id}") - public UserTest read(@PathVariable(name = "id") int id) { - return data.get(id); - } - - @PutMapping("/{id}") - public UserTest update(@PathVariable(name = "id") int id, @RequestBody UserTest user) { - UserTest us = data.get(id); - - if (us != null) { - data.remove(id); - } - - data.add(id, user); - return data.get(id); - } - - @DeleteMapping("/{id}") - public UserTest delete(@PathVariable(name = "id") int id) { - UserTest us = data.get(id); - - if (us != null) { - data.remove(id); - } - return null; - } - -} diff --git a/src/main/java/com/example/demo/DemoApplication.java b/src/main/java/com/example/demo/DemoApplication.java index e03ec75..12429b7 100644 --- a/src/main/java/com/example/demo/DemoApplication.java +++ b/src/main/java/com/example/demo/DemoApplication.java @@ -1,12 +1,120 @@ package com.example.demo; +import java.util.Objects; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import com.example.demo.ivents.model.IventEntity; +import com.example.demo.ivents.service.IventService; +import com.example.demo.types.model.TypeEntity; +import com.example.demo.types.service.TypeService; +import com.example.demo.places.model.PlaceEntity; +import com.example.demo.places.service.PlaceService; +import com.example.demo.users.model.UserEntity; +import com.example.demo.users.service.UserService; + @SpringBootApplication -public class DemoApplication { +public class DemoApplication implements CommandLineRunner { + private final Logger log = LoggerFactory.getLogger(DemoApplication.class); + + private final TypeService typeService; + private final PlaceService placeService; + private final IventService iventService; + private final UserService userService; + + public DemoApplication(PlaceService placeService, TypeService typeService, IventService iventService, UserService userService) { + this.placeService = placeService; + this.typeService = typeService; + this.iventService = iventService; + this.userService = userService; + } public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } + + @Override + public void run(String... args) throws Exception { + + if (args.length > 0 && Objects.equals("--populate", args[0])) { + log.info("Create default categories values"); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate _date = LocalDate.parse("2023-10-15", formatter); + + final var type1 = typeService.create(new TypeEntity(null, "Концерт")); + final var type2 = typeService.create(new TypeEntity(null, "Кино")); + final var type3 = typeService.create(new TypeEntity(null, "Театр")); + + final var place1 = placeService.create(new PlaceEntity(null, "US, California")); + final var place2 = placeService.create(new PlaceEntity(null, "Germany, Berlin")); + final var place3 = placeService.create(new PlaceEntity(null, "UK, London")); + + log.info("Create default books values"); + iventService.create(new IventEntity( + null, + "Slipknot", + type1, + _date, + "Slipknot - американская ню-метал группа, основанная в 1995 году. Они известны своим агрессивным звучанием, смешением хардкор-панк и тяжелого метала с индастриалом и элементами альтернативного рока.", + "Участники группы Slipknot - это:<....>", + 2500.33, + 30, + place1)); + + iventService.create(new IventEntity( + null, + "Placebo", + type1, + _date, + "Placebo - британская альтернативная рок-группа, основанная в 1994 году. Они известны своим уникальным звучанием, погружающим слушателей в меланхоличную атмосферу и наполняющим музыку эмоциональным содержанием.", + "Группа Placebo состояла из следующих участников:<....>", + 2500.33, + 30, + place2)); + + iventService.create(new IventEntity( + null, + "Radiohead", + type1, + _date, + "Radiohead - британская рок-группа, образованная в 1985 году.", + "Участниками Radiohead являются:<....>", + 2500.33, + 30, + place3)); + + iventService.create(new IventEntity( + null, + "Сияние", + type2, + _date, + "\"Сияние\" - это психологический триллер режиссера Стэнли Кубрика, вышедший в 1980 году.", + "Актеры:<....>", + 2500.33, + 45, + place3)); + + iventService.create(new IventEntity( + null, + "Мастер и Маргарита", + type3, + _date, + "тут должно быть описание", + "Автор: М. А. Булгаков", + 2500.33, + 30, + place2)); + + log.info("Create default users values"); + userService.create(new UserEntity(null, "Admin", "Admin@gmail.com", "admin")); + userService.create(new UserEntity(null, "Milana", "milana@gmail.com", "milana")); + userService.create(new UserEntity(null, "TestUser", "user@gmail.com", "test")); + } + } } diff --git a/src/main/java/com/example/demo/UserTest.java b/src/main/java/com/example/demo/UserTest.java deleted file mode 100644 index 932bc83..0000000 --- a/src/main/java/com/example/demo/UserTest.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.example.demo; - -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonProperty; - -public class UserTest { - private String handle; - private String email; - private String name; - private String password; - - public UserTest() { - } - - @JsonCreator - public UserTest( - @JsonProperty(value = "handle") String handle, - @JsonProperty(value = "email") String email, - @JsonProperty(value = "name") String name, - @JsonProperty(value = "password") String password) { - this.handle = handle; - this.email = email; - this.name = name; - this.password = password; - } - public String getHandle() { - return handle; - } - - public String getEmail() { - return email; - } - - public String getName() { - return name; - } - - public String getPassword() { - return password; - } - -} diff --git a/src/main/java/com/example/demo/core/configuration/Constants.java b/src/main/java/com/example/demo/core/configuration/Constants.java new file mode 100644 index 0000000..d9c6b7c --- /dev/null +++ b/src/main/java/com/example/demo/core/configuration/Constants.java @@ -0,0 +1,8 @@ +package com.example.demo.core.configuration; + +public class Constants { + public static final String API_URL = "/api/1.0"; + + private Constants() { + } +} diff --git a/src/main/java/com/example/demo/core/configuration/MapperConfiguration.java b/src/main/java/com/example/demo/core/configuration/MapperConfiguration.java new file mode 100644 index 0000000..5888106 --- /dev/null +++ b/src/main/java/com/example/demo/core/configuration/MapperConfiguration.java @@ -0,0 +1,16 @@ +package com.example.demo.core.configuration; + +import org.modelmapper.ModelMapper; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + + +@Configuration +public class MapperConfiguration { + @Bean + ModelMapper modelMapper() { + return new ModelMapper(); + + + } +} diff --git a/src/main/java/com/example/demo/WebConfig.java b/src/main/java/com/example/demo/core/configuration/WebConfiguration.java similarity index 81% rename from src/main/java/com/example/demo/WebConfig.java rename to src/main/java/com/example/demo/core/configuration/WebConfiguration.java index d5585a1..762e85a 100644 --- a/src/main/java/com/example/demo/WebConfig.java +++ b/src/main/java/com/example/demo/core/configuration/WebConfiguration.java @@ -1,4 +1,4 @@ -package com.example.demo; +package com.example.demo.core.configuration; import org.springframework.context.annotation.Configuration; import org.springframework.lang.NonNull; @@ -6,7 +6,7 @@ import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration -public class WebConfig implements WebMvcConfigurer { +public class WebConfiguration implements WebMvcConfigurer { @Override public void addCorsMappings(@NonNull CorsRegistry registry) { registry.addMapping("/**") diff --git a/src/main/java/com/example/demo/core/error/NotFoundException.java b/src/main/java/com/example/demo/core/error/NotFoundException.java new file mode 100644 index 0000000..586af3c --- /dev/null +++ b/src/main/java/com/example/demo/core/error/NotFoundException.java @@ -0,0 +1,7 @@ +package com.example.demo.core.error; + +public class NotFoundException extends RuntimeException { + public NotFoundException(Long id) { + super(String.format("Entity with id [%s] is not found or not exists", id)); + } +} diff --git a/src/main/java/com/example/demo/core/model/BaseEntity.java b/src/main/java/com/example/demo/core/model/BaseEntity.java new file mode 100644 index 0000000..2b486bd --- /dev/null +++ b/src/main/java/com/example/demo/core/model/BaseEntity.java @@ -0,0 +1,20 @@ +package com.example.demo.core.model; + +public abstract class BaseEntity { + protected Long id; + + protected BaseEntity() { + } + + protected BaseEntity(Long id) { + this.id = id; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } +} \ No newline at end of file diff --git a/src/main/java/com/example/demo/core/repository/CommonRepository.java b/src/main/java/com/example/demo/core/repository/CommonRepository.java new file mode 100644 index 0000000..85e1e6d --- /dev/null +++ b/src/main/java/com/example/demo/core/repository/CommonRepository.java @@ -0,0 +1,17 @@ +package com.example.demo.core.repository; + +import java.util.List; + +public interface CommonRepository { + List getAll(); + + E get(T id); + + E create(E entity); + + E update(E entity); + + E delete(E entity); + + void deleteAll(); +} diff --git a/src/main/java/com/example/demo/core/repository/MapRepository.java b/src/main/java/com/example/demo/core/repository/MapRepository.java new file mode 100644 index 0000000..7be3039 --- /dev/null +++ b/src/main/java/com/example/demo/core/repository/MapRepository.java @@ -0,0 +1,58 @@ +package com.example.demo.core.repository; + +import java.util.List; +import java.util.Map; +import java.util.TreeMap; + +import com.example.demo.core.model.BaseEntity; + +public abstract class MapRepository implements CommonRepository { + private final Map entities = new TreeMap<>(); + private Long lastId = 0L; + + protected MapRepository() { + } + + @Override + public List getAll() { + return entities.values().stream().toList(); + } + + @Override + public E get(Long id) { + return entities.get(id); + } + + @Override + public E create(E entity) { + lastId++; + entity.setId(lastId); + entities.put(lastId, entity); + return entity; + } + + @Override + public E update(E entity) { + if (get(entity.getId()) == null) { + return null; + } + entities.put(entity.getId(), entity); + return entity; + } + + @Override + public E delete(E entity) { + if (get(entity.getId()) == null) { + return null; + } + entities.remove(entity.getId()); + return entity; + } + + @Override + public void deleteAll() { + lastId = 0L; + entities.clear(); + } +} + diff --git a/src/main/java/com/example/demo/core/utils/Formatter.java b/src/main/java/com/example/demo/core/utils/Formatter.java new file mode 100644 index 0000000..79c8bc8 --- /dev/null +++ b/src/main/java/com/example/demo/core/utils/Formatter.java @@ -0,0 +1,20 @@ +package com.example.demo.core.utils; + +import java.util.Date; +import java.text.ParseException; +import java.text.SimpleDateFormat; + +public final class Formatter { + private Formatter() { + } + + private static SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd"); + + public static String format(Date date) { + return dateFormatter.format(date); + } + + public static Date parse(String date) throws ParseException { + return dateFormatter.parse(date); + } +} diff --git a/src/main/java/com/example/demo/ivents/api/IventController.java b/src/main/java/com/example/demo/ivents/api/IventController.java new file mode 100644 index 0000000..8858e95 --- /dev/null +++ b/src/main/java/com/example/demo/ivents/api/IventController.java @@ -0,0 +1,87 @@ +package com.example.demo.ivents.api; + +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.List; +import java.util.stream.Collectors; + +import org.modelmapper.ModelMapper; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +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.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.example.demo.ivents.model.IventEntity; +import com.example.demo.ivents.service.IventService; +import com.example.demo.core.configuration.Constants; +import com.example.demo.types.service.TypeService; +import com.example.demo.places.service.PlaceService; + +import jakarta.validation.Valid; + +@RestController +@RequestMapping(Constants.API_URL + "/ivents") +public class IventController { + private final IventService iventService; + private final TypeService typeService; + private final PlaceService placeService; + private final ModelMapper modelMapper; + + public IventController(IventService iventService, TypeService typeService, + PlaceService placeService, ModelMapper modelMapper) { + this.iventService = iventService; + this.typeService = typeService; + this.placeService = placeService; + this.modelMapper = modelMapper; + } + + private IventDto toDto(IventEntity entity) { + return modelMapper.map(entity, IventDto.class); + } + + private IventEntity toEntity(IventDto dto) { + final IventEntity entity = modelMapper.map(dto, IventEntity.class); + entity.setType(typeService.get(dto.getTypeId())); + entity.setPlace(placeService.get(dto.getPlaceId())); + return entity; + } + + + + @GetMapping + public List getAll( + @RequestParam(name = "typeId", defaultValue = "0") Long typeId, + @RequestParam(name = "placeId", defaultValue = "0") Long placeId, + @RequestParam(name = "startDate", defaultValue = "0001-01-01") String startDate, + @RequestParam(name = "endDate", defaultValue = "9999-12-31") String endDate) { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate _startDate = LocalDate.parse(startDate, formatter); + LocalDate _endDate = LocalDate.parse(endDate, formatter); + return iventService.getAll(typeId, placeId, _startDate, _endDate).stream().map(this::toDto).toList(); + } + + @GetMapping("/{id}") + public IventDto get(@PathVariable(name = "id") Long id) { + return toDto(iventService.get(id)); + } + + @PostMapping + public IventDto create(@RequestBody @Valid IventDto dto) { + return toDto(iventService.create(toEntity(dto))); + } + + @PutMapping("/{id}") + public IventDto update(@PathVariable(name = "id") Long id, @RequestBody IventDto dto) { + return toDto(iventService.update(id, toEntity(dto))); + } + + @DeleteMapping("/{id}") + public IventDto delete(@PathVariable(name = "id") Long id) { + return toDto(iventService.delete(id)); + } +} diff --git a/src/main/java/com/example/demo/ivents/api/IventDto.java b/src/main/java/com/example/demo/ivents/api/IventDto.java new file mode 100644 index 0000000..e283eb2 --- /dev/null +++ b/src/main/java/com/example/demo/ivents/api/IventDto.java @@ -0,0 +1,111 @@ +package com.example.demo.ivents.api; + +import com.fasterxml.jackson.annotation.JsonProperty; +import java.time.LocalDate; + +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; + +public class IventDto { + private Long id; + @NotBlank + private String itName; + @NotNull + @Min(1) + private Long typeId; + @NotNull + private LocalDate date; + @NotBlank + private String description; + @NotBlank + private String other; + @NotNull + @Min(1) + private Double price; + @NotNull + @Min(1) + private Integer count; + @NotNull + @Min(1) + private Long placeId; + + @JsonProperty(access = JsonProperty.Access.READ_ONLY) + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getTypeId() { + return typeId; + } + + public void setTypeId(Long typeId) { + this.typeId = typeId; + } + + public String getName() { + return itName; + } + + public void setName(String itName) { + this.itName = itName; + } + + public LocalDate getDate() { + return date; + } + + public void setDate(LocalDate date) { + this.date = date; + } + + public String getDesc() { + return description; + } + + public void setDesc(String description) { + this.description = description; + } + + public String getOther() { + return other; + } + + public void setOther(String other) { + this.other = other; + } + + public Double getPrice() { + return price; + } + + public void setPrice(Double price) { + this.price = price; + } + + public Integer getCount() { + return count; + } + + public void setCount(Integer count) { + this.count = count; + } + + public Long getPlaceId() { + return placeId; + } + + public void setPLaceId(Long placeId) { + this.placeId = placeId; + } + + @JsonProperty(access = JsonProperty.Access.READ_ONLY) + public Double getSum() { + return price * count; + } +} + diff --git a/src/main/java/com/example/demo/ivents/model/IventEntity.java b/src/main/java/com/example/demo/ivents/model/IventEntity.java new file mode 100644 index 0000000..57b224e --- /dev/null +++ b/src/main/java/com/example/demo/ivents/model/IventEntity.java @@ -0,0 +1,124 @@ +package com.example.demo.ivents.model; + +import java.util.Objects; +import java.time.LocalDate; + +import com.example.demo.core.model.BaseEntity; +import com.example.demo.types.model.TypeEntity; +import com.example.demo.places.model.PlaceEntity; + +public class IventEntity extends BaseEntity { + private String name; + private TypeEntity type; + private LocalDate date; + private String description; + private String other; + private Double price; + private Integer count; + private PlaceEntity place; + + public IventEntity() { + super(); + } + + public IventEntity(Long id, String name, TypeEntity type, LocalDate date, + String description, String other, Double price, Integer count, PlaceEntity place) { + super(id); + this.name = name; + this.type = type; + this.date = date; + this.description = description; + this.other = other; + this.price = price; + this.count = count; + this.place = place; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public TypeEntity getType() { + return type; + } + + public void setType(TypeEntity type) { + this.type = type; + } + + public LocalDate getDate() { + return date; + } + + public void setDate(LocalDate date) { + this.date = date; + } + + public String getDesc() { + return description; + } + + public void setDesc(String description) { + this.description = description; + } + + public String getOther() { + return other; + } + + public void setOther(String other) { + this.other = other; + } + + public Double getPrice() { + return price; + } + + public void setPrice(Double price) { + this.price = price; + } + + public Integer getCount() { + return count; + } + + public void setCount(Integer count) { + this.count = count; + } + + public PlaceEntity getPlace() { + return place; + } + + public void setPlace(PlaceEntity place) { + this.place = place; + } + + @Override + public int hashCode() { + return Objects.hash(id, name, type, date, description, other, price, count, place); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null || getClass() != obj.getClass()) + return false; + final IventEntity otheren = (IventEntity) obj; + return Objects.equals(otheren.getId(), id) + && Objects.equals(otheren.getName(), name) + && Objects.equals(otheren.getType(), type) + && Objects.equals(otheren.getDate(), date) + && Objects.equals(otheren.getDesc(), description) + && Objects.equals(otheren.getOther(), other) + && Objects.equals(otheren.getPrice(), price) + && Objects.equals(otheren.getCount(), count) + && Objects.equals(otheren.getPlace(), place); + } +} + diff --git a/src/main/java/com/example/demo/ivents/repository/IventRepository.java b/src/main/java/com/example/demo/ivents/repository/IventRepository.java new file mode 100644 index 0000000..e23fdf2 --- /dev/null +++ b/src/main/java/com/example/demo/ivents/repository/IventRepository.java @@ -0,0 +1,11 @@ +package com.example.demo.ivents.repository; + +import org.springframework.stereotype.Repository; + +import com.example.demo.core.repository.MapRepository; +import com.example.demo.ivents.model.IventEntity; + +@Repository +public class IventRepository extends MapRepository { +} + diff --git a/src/main/java/com/example/demo/ivents/service/IventService.java b/src/main/java/com/example/demo/ivents/service/IventService.java new file mode 100644 index 0000000..656e93c --- /dev/null +++ b/src/main/java/com/example/demo/ivents/service/IventService.java @@ -0,0 +1,91 @@ +package com.example.demo.ivents.service; + +import java.time.LocalDate; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.stream.Collectors; + +import org.springframework.stereotype.Service; + +import com.example.demo.core.error.NotFoundException; +import com.example.demo.ivents.model.IventEntity; +import com.example.demo.ivents.repository.IventRepository; + +@Service +public class IventService { + private final IventRepository repository; + + public IventService(IventRepository repository) { + this.repository = repository; + } + + public List getAll(Long typeId, Long placeId, LocalDate startDate, LocalDate endDate) { + List result = repository.getAll(); + + if (startDate != null || endDate != null) { + LocalDate start = Objects.requireNonNullElse(startDate, LocalDate.MIN); + LocalDate end = Objects.requireNonNullElse(endDate, LocalDate.now()); + + result = result.stream() + .filter(item -> (startDate == null || item.getDate().isAfter(start.minusDays(1))) + && (endDate == null || item.getDate().isBefore(end.plusDays(1))) + ) + .collect(Collectors.toList()); + } + + if (!Objects.equals(typeId, 0L)){ + result = result.stream() + .filter(item -> item.getType().getId().equals(typeId)) + .toList(); + } + + if (!Objects.equals(placeId, 0L)){ + result = result.stream() + .filter(item -> item.getPlace().getId().equals(placeId)) + .toList(); + } + return result; + } + + public List getAllDate(LocalDate startDate, LocalDate endDate) { + if (startDate == null) { + throw new IllegalArgumentException("Дата 'от' должна быть указана"); + } + LocalDate end = Objects.requireNonNullElse(endDate, LocalDate.now()); + return repository.getAll().stream() + .filter(item -> item.getDate().isAfter(startDate.minusDays(1)) && item.getDate().isBefore(end.plusDays(1))) // использование методов isAfter и isBefore для LocalDate + .collect(Collectors.toList()); + } + + public List getAll() { + return repository.getAll(); + } + + public IventEntity get(Long id) { + return Optional.ofNullable(repository.get(id)) + .orElseThrow(() -> new NotFoundException(id)); + } + + public IventEntity create(IventEntity entity) { + return repository.create(entity); + } + + public IventEntity update(Long id, IventEntity entity) { + final IventEntity existsEntity = get(id); + existsEntity.setName(entity.getName()); + existsEntity.setType(entity.getType()); + existsEntity.setDate(entity.getDate()); + existsEntity.setDesc(entity.getDesc()); + existsEntity.setOther(entity.getOther()); + existsEntity.setPrice(entity.getPrice()); + existsEntity.setCount(entity.getCount()); + existsEntity.setPlace(entity.getPlace()); + return repository.update(existsEntity); + } + + public IventEntity delete(Long id) { + final IventEntity existsEntity = get(id); + return repository.delete(existsEntity); + } +} diff --git a/src/main/java/com/example/demo/places/api/PlaceController.java b/src/main/java/com/example/demo/places/api/PlaceController.java new file mode 100644 index 0000000..bccc172 --- /dev/null +++ b/src/main/java/com/example/demo/places/api/PlaceController.java @@ -0,0 +1,65 @@ +package com.example.demo.places.api; + +import java.util.List; + +import org.modelmapper.ModelMapper; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +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.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.example.demo.core.configuration.Constants; +import com.example.demo.places.model.PlaceEntity; +import com.example.demo.places.service.PlaceService; + +import jakarta.validation.Valid; + +@RestController +@RequestMapping(Constants.API_URL + "/place") +public class PlaceController { + private final PlaceService placeService; + private final ModelMapper modelMapper; + + public PlaceController(PlaceService placeService, ModelMapper modelMapper) { + this.placeService = placeService; + this.modelMapper = modelMapper; + } + + private PlaceDto toDto(PlaceEntity entity) { + return modelMapper.map(entity, PlaceDto.class); + } + + private PlaceEntity toEntity(PlaceDto dto) { + return modelMapper.map(dto, PlaceEntity.class); + } + + @GetMapping + public List getAll() { + return placeService.getAll().stream().map(this::toDto).toList(); + } + + @GetMapping("/{id}") + public PlaceDto get(@PathVariable(name = "id") Long id) { + return toDto(placeService.get(id)); + } + + @PostMapping + public PlaceDto create(@RequestBody @Valid PlaceDto dto) { + return toDto(placeService.create(toEntity(dto))); + } + + @PutMapping("/{id}") + public PlaceDto update(@PathVariable(name = "id") Long id, @RequestBody PlaceDto dto) { + return toDto(placeService.update(id, toEntity(dto))); + } + + @DeleteMapping("/{id}") + public PlaceDto delete(@PathVariable(name = "id") Long id) { + return toDto(placeService.delete(id)); + } +} + diff --git a/src/main/java/com/example/demo/places/api/PlaceDto.java b/src/main/java/com/example/demo/places/api/PlaceDto.java new file mode 100644 index 0000000..e08e3f9 --- /dev/null +++ b/src/main/java/com/example/demo/places/api/PlaceDto.java @@ -0,0 +1,29 @@ +package com.example.demo.places.api; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import jakarta.validation.constraints.NotBlank; + +public class PlaceDto { + private Long id; + @NotBlank + private String name; + + @JsonProperty(access = JsonProperty.Access.READ_ONLY) + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} + diff --git a/src/main/java/com/example/demo/places/model/PlaceEntity.java b/src/main/java/com/example/demo/places/model/PlaceEntity.java new file mode 100644 index 0000000..bbd730d --- /dev/null +++ b/src/main/java/com/example/demo/places/model/PlaceEntity.java @@ -0,0 +1,44 @@ +package com.example.demo.places.model; + +import java.util.Objects; + +import com.example.demo.core.model.BaseEntity; + +public class PlaceEntity extends BaseEntity { + private String name; + + public PlaceEntity() { + super(); + } + + public PlaceEntity(Long id, String name) { + super(id); + this.name = name; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public int hashCode() { + return Objects.hash(id, name); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null || getClass() != obj.getClass()) + return false; + final PlaceEntity other = (PlaceEntity) obj; + return Objects.equals(other.getId(), id) + && Objects.equals(other.getName(), name); + } + +} + diff --git a/src/main/java/com/example/demo/places/repository/PlaceRepository.java b/src/main/java/com/example/demo/places/repository/PlaceRepository.java new file mode 100644 index 0000000..16cc5fc --- /dev/null +++ b/src/main/java/com/example/demo/places/repository/PlaceRepository.java @@ -0,0 +1,11 @@ +package com.example.demo.places.repository; + +import org.springframework.stereotype.Repository; + +import com.example.demo.core.repository.MapRepository; +import com.example.demo.places.model.PlaceEntity; + +@Repository +public class PlaceRepository extends MapRepository { +} + diff --git a/src/main/java/com/example/demo/places/service/PlaceService.java b/src/main/java/com/example/demo/places/service/PlaceService.java new file mode 100644 index 0000000..a44b970 --- /dev/null +++ b/src/main/java/com/example/demo/places/service/PlaceService.java @@ -0,0 +1,44 @@ +package com.example.demo.places.service; + +import java.util.List; +import java.util.Optional; + +import org.springframework.stereotype.Service; + +import com.example.demo.core.error.NotFoundException; +import com.example.demo.places.model.PlaceEntity; +import com.example.demo.places.repository.PlaceRepository; + +@Service +public class PlaceService { + private final PlaceRepository repository; + + public PlaceService(PlaceRepository repository) { + this.repository = repository; + } + + public List getAll() { + return repository.getAll(); + } + + public PlaceEntity get(Long id) { + return Optional.ofNullable(repository.get(id)) + .orElseThrow(() -> new NotFoundException(id)); + } + + public PlaceEntity create(PlaceEntity entity) { + return repository.create(entity); + } + + public PlaceEntity update(Long id, PlaceEntity entity) { + final PlaceEntity existsEntity = get(id); + existsEntity.setName(entity.getName()); + return repository.update(existsEntity); + } + + public PlaceEntity delete(Long id) { + final PlaceEntity existsEntity = get(id); + return repository.delete(existsEntity); + } +} + diff --git a/src/main/java/com/example/demo/types/api/TypeController.java b/src/main/java/com/example/demo/types/api/TypeController.java new file mode 100644 index 0000000..8c60b3c --- /dev/null +++ b/src/main/java/com/example/demo/types/api/TypeController.java @@ -0,0 +1,65 @@ +package com.example.demo.types.api; + +import java.util.List; + +import org.modelmapper.ModelMapper; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +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.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.example.demo.core.configuration.Constants; +import com.example.demo.types.model.TypeEntity; +import com.example.demo.types.service.TypeService; + +import jakarta.validation.Valid; + +@RestController +@RequestMapping(Constants.API_URL + "/type") +public class TypeController { + private final TypeService typeService; + private final ModelMapper modelMapper; + + public TypeController(TypeService typeService, ModelMapper modelMapper) { + this.typeService = typeService; + this.modelMapper = modelMapper; + } + + private TypeDto toDto(TypeEntity entity) { + return modelMapper.map(entity, TypeDto.class); + } + + private TypeEntity toEntity(TypeDto dto) { + return modelMapper.map(dto, TypeEntity.class); + } + + @GetMapping + public List getAll() { + return typeService.getAll().stream().map(this::toDto).toList(); + } + + @GetMapping("/{id}") + public TypeDto get(@PathVariable(name = "id") Long id) { + return toDto(typeService.get(id)); + } + + @PostMapping + public TypeDto create(@RequestBody @Valid TypeDto dto) { + return toDto(typeService.create(toEntity(dto))); + } + + @PutMapping("/{id}") + public TypeDto update(@PathVariable(name = "id") Long id, @RequestBody TypeDto dto) { + return toDto(typeService.update(id, toEntity(dto))); + } + + @DeleteMapping("/{id}") + public TypeDto delete(@PathVariable(name = "id") Long id) { + return toDto(typeService.delete(id)); + } +} + diff --git a/src/main/java/com/example/demo/types/api/TypeDto.java b/src/main/java/com/example/demo/types/api/TypeDto.java new file mode 100644 index 0000000..6eb16a2 --- /dev/null +++ b/src/main/java/com/example/demo/types/api/TypeDto.java @@ -0,0 +1,29 @@ +package com.example.demo.types.api; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import jakarta.validation.constraints.NotBlank; + +public class TypeDto { + private Long id; + @NotBlank + private String name; + + @JsonProperty(access = JsonProperty.Access.READ_ONLY) + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} + diff --git a/src/main/java/com/example/demo/types/model/TypeEntity.java b/src/main/java/com/example/demo/types/model/TypeEntity.java new file mode 100644 index 0000000..8031c1e --- /dev/null +++ b/src/main/java/com/example/demo/types/model/TypeEntity.java @@ -0,0 +1,44 @@ +package com.example.demo.types.model; + +import java.util.Objects; + +import com.example.demo.core.model.BaseEntity; + +public class TypeEntity extends BaseEntity { + private String name; + + public TypeEntity() { + super(); + } + + public TypeEntity(Long id, String name) { + super(id); + this.name = name; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public int hashCode() { + return Objects.hash(id, name); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null || getClass() != obj.getClass()) + return false; + final TypeEntity other = (TypeEntity) obj; + return Objects.equals(other.getId(), id) + && Objects.equals(other.getName(), name); + } + +} + diff --git a/src/main/java/com/example/demo/types/repository/TypeRepository.java b/src/main/java/com/example/demo/types/repository/TypeRepository.java new file mode 100644 index 0000000..bb008bc --- /dev/null +++ b/src/main/java/com/example/demo/types/repository/TypeRepository.java @@ -0,0 +1,11 @@ +package com.example.demo.types.repository; + +import org.springframework.stereotype.Repository; + +import com.example.demo.core.repository.MapRepository; +import com.example.demo.types.model.TypeEntity; + +@Repository +public class TypeRepository extends MapRepository { +} + diff --git a/src/main/java/com/example/demo/types/service/TypeService.java b/src/main/java/com/example/demo/types/service/TypeService.java new file mode 100644 index 0000000..bbb922c --- /dev/null +++ b/src/main/java/com/example/demo/types/service/TypeService.java @@ -0,0 +1,44 @@ +package com.example.demo.types.service; + +import java.util.List; +import java.util.Optional; + +import org.springframework.stereotype.Service; + +import com.example.demo.core.error.NotFoundException; +import com.example.demo.types.model.TypeEntity; +import com.example.demo.types.repository.TypeRepository; + +@Service +public class TypeService { + private final TypeRepository repository; + + public TypeService(TypeRepository repository) { + this.repository = repository; + } + + public List getAll() { + return repository.getAll(); + } + + public TypeEntity get(Long id) { + return Optional.ofNullable(repository.get(id)) + .orElseThrow(() -> new NotFoundException(id)); + } + + public TypeEntity create(TypeEntity entity) { + return repository.create(entity); + } + + public TypeEntity update(Long id, TypeEntity entity) { + final TypeEntity existsEntity = get(id); + existsEntity.setName(entity.getName()); + return repository.update(existsEntity); + } + + public TypeEntity delete(Long id) { + final TypeEntity existsEntity = get(id); + return repository.delete(existsEntity); + } +} + diff --git a/src/main/java/com/example/demo/users/api/UserController.java b/src/main/java/com/example/demo/users/api/UserController.java new file mode 100644 index 0000000..1d00e35 --- /dev/null +++ b/src/main/java/com/example/demo/users/api/UserController.java @@ -0,0 +1,64 @@ +package com.example.demo.users.api; + +import java.util.List; + +import org.modelmapper.ModelMapper; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +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.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.example.demo.core.configuration.Constants; +import com.example.demo.users.model.UserEntity; +import com.example.demo.users.service.UserService; + +import jakarta.validation.Valid; + +@RestController +@RequestMapping(Constants.API_URL + "/user") +public class UserController { + private final UserService userService; + private final ModelMapper modelMapper; + + public UserController(UserService userService, ModelMapper modelMapper) { + this.userService = userService; + this.modelMapper = modelMapper; + } + + private UserDto toDto(UserEntity entity) { + return modelMapper.map(entity, UserDto.class); + } + + private UserEntity toEntity(UserDto dto) { + return modelMapper.map(dto, UserEntity.class); + } + + @GetMapping + public List getAll() { + return userService.getAll().stream().map(this::toDto).toList(); + } + + @GetMapping("/{id}") + public UserDto get(@PathVariable(name = "id") Long id) { + return toDto(userService.get(id)); + } + + @PostMapping + public UserDto create(@RequestBody @Valid UserDto dto) { + return toDto(userService.create(toEntity(dto))); + } + + @PutMapping("/{id}") + public UserDto update(@PathVariable(name = "id") Long id, @RequestBody UserDto dto) { + return toDto(userService.update(id, toEntity(dto))); + } + + @DeleteMapping("/{id}") + public UserDto delete(@PathVariable(name = "id") Long id) { + return toDto(userService.delete(id)); + } +} diff --git a/src/main/java/com/example/demo/users/api/UserDto.java b/src/main/java/com/example/demo/users/api/UserDto.java new file mode 100644 index 0000000..0d221bc --- /dev/null +++ b/src/main/java/com/example/demo/users/api/UserDto.java @@ -0,0 +1,49 @@ +package com.example.demo.users.api; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import jakarta.validation.constraints.NotBlank; + +public class UserDto { + private Long id; + @NotBlank + private String handle; + @NotBlank + private String email; + @NotBlank + private String password; + + @JsonProperty(access = JsonProperty.Access.READ_ONLY) + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getHandle() { + return handle; + } + + public void setHandle(String handle) { + this.handle = handle; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } +} + diff --git a/src/main/java/com/example/demo/users/model/UserEntity.java b/src/main/java/com/example/demo/users/model/UserEntity.java new file mode 100644 index 0000000..89607c2 --- /dev/null +++ b/src/main/java/com/example/demo/users/model/UserEntity.java @@ -0,0 +1,66 @@ +package com.example.demo.users.model; + +import java.util.Objects; + +import com.example.demo.core.model.BaseEntity; + +public class UserEntity extends BaseEntity { + private String handle; + private String email; + private String password; + + public UserEntity() { + super(); + } + + public UserEntity(Long id, String handle, String email, String password) { + super(id); + this.handle = handle; + this.email = email; + this.password = password; + } + + public String getHandle() { + return handle; + } + + public void setHandle(String handle) { + this.handle = handle; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + @Override + public int hashCode() { + return Objects.hash(id, handle, email, password); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null || getClass() != obj.getClass()) + return false; + final UserEntity other = (UserEntity) obj; + return Objects.equals(other.getId(), id) + && Objects.equals(other.getHandle(), handle) + && Objects.equals(other.getEmail(), email) + && Objects.equals(other.getPassword(), password); + } + +} + diff --git a/src/main/java/com/example/demo/users/repository/UserRepository.java b/src/main/java/com/example/demo/users/repository/UserRepository.java new file mode 100644 index 0000000..0fdbee5 --- /dev/null +++ b/src/main/java/com/example/demo/users/repository/UserRepository.java @@ -0,0 +1,11 @@ +package com.example.demo.users.repository; + +import org.springframework.stereotype.Repository; + +import com.example.demo.core.repository.MapRepository; +import com.example.demo.users.model.UserEntity; + +@Repository +public class UserRepository extends MapRepository { +} + diff --git a/src/main/java/com/example/demo/users/service/UserService.java b/src/main/java/com/example/demo/users/service/UserService.java new file mode 100644 index 0000000..3613015 --- /dev/null +++ b/src/main/java/com/example/demo/users/service/UserService.java @@ -0,0 +1,44 @@ +package com.example.demo.users.service; + +import java.util.List; +import java.util.Optional; + +import org.springframework.stereotype.Service; + +import com.example.demo.core.error.NotFoundException; +import com.example.demo.users.model.UserEntity; +import com.example.demo.users.repository.UserRepository; + +@Service +public class UserService { + private final UserRepository repository; + + public UserService(UserRepository repository) { + this.repository = repository; + } + + public List getAll() { + return repository.getAll(); + } + + public UserEntity get(Long id) { + return Optional.ofNullable(repository.get(id)) + .orElseThrow(() -> new NotFoundException(id)); + } + + public UserEntity create(UserEntity entity) { + return repository.create(entity); + } + + public UserEntity update(Long id, UserEntity entity) { + final UserEntity existsEntity = get(id); + existsEntity.setHandle(entity.getHandle()); + return repository.update(existsEntity); + } + + public UserEntity delete(Long id) { + final UserEntity existsEntity = get(id); + return repository.delete(existsEntity); + } +} + diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 4d360de..7e6b2b8 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1 +1,2 @@ -server.port=8081 +spring.application.name=demo +server.port=8081 \ No newline at end of file diff --git a/src/test/java/com/example/demo/DemoApplicationTests.java b/src/test/java/com/example/demo/DemoApplicationTests.java deleted file mode 100644 index 2778a6a..0000000 --- a/src/test/java/com/example/demo/DemoApplicationTests.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.example.demo; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class DemoApplicationTests { - - @Test - void contextLoads() { - } - -} diff --git a/src/test/java/com/example/demo/IventServiceTests.java b/src/test/java/com/example/demo/IventServiceTests.java new file mode 100644 index 0000000..bd8ec37 --- /dev/null +++ b/src/test/java/com/example/demo/IventServiceTests.java @@ -0,0 +1,143 @@ +package com.example.demo; + +import java.time.LocalDate; +import java.util.List; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.MethodOrderer.OrderAnnotation; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestMethodOrder; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import com.example.demo.ivents.model.IventEntity; +import com.example.demo.ivents.service.IventService; +import com.example.demo.types.model.TypeEntity; +import com.example.demo.types.service.TypeService; +import com.example.demo.places.model.PlaceEntity; +import com.example.demo.places.service.PlaceService; +import com.example.demo.core.error.NotFoundException; + +@SpringBootTest +@TestMethodOrder(OrderAnnotation.class) +class IventServiceTests { + @Autowired + private TypeService typeService; + + @Autowired + private PlaceService placeService; + + @Autowired + private IventService iventService; + + @Test + void getTest() { + Assertions.assertThrows(NotFoundException.class, () -> iventService.get(0L)); + } + + @Test + @Order(1) + void createTest() { + final TypeEntity type = typeService.create(new TypeEntity(null, "Концерт")); + final PlaceEntity place = placeService.create(new PlaceEntity(null, "USA, California")); + + iventService.create(new IventEntity( + null, + "Slipknot", + type, + LocalDate.of(2023, 10, 15), + "Slipknot - американская ню-метал группа, основанная в 1995 году. Они известны своим агрессивным звучанием, смешением хардкор-панк и тяжелого метала с индастриалом и элементами альтернативного рока.", + "Участники группы Slipknot - это:<....>", + 2500.33, + 30, + place)); + iventService.create(new IventEntity( + null, + "Placebo", + type, + LocalDate.of(2024, 2, 13), + "Placebo - британская альтернативная рок-группа, основанная в 1994 году. Они известны своим уникальным звучанием, погружающим слушателей в меланхоличную атмосферу и наполняющим музыку эмоциональным содержанием.", + "Группа Placebo состояла из следующих участников:<....>", + 2500.33, + 30, + place)); + final IventEntity last = iventService.create(new IventEntity( + null, + "Radiohead", + type, + LocalDate.of(2024, 2, 15), + "Radiohead - британская рок-группа, образованная в 1985 году.", + "Участниками Radiohead являются:<....>", + 2500.33, + 30, + place)); + Assertions.assertEquals(3, iventService.getAll().size()); + Assertions.assertEquals(last, iventService.get(3L)); + } + + @Test + @Order(2) + void sortDates() { + LocalDate start = LocalDate.of(2024, 1, 15); + LocalDate end = LocalDate.of(2024, 5, 15); + + List list = iventService.getAll(0L, 0L, start, end); + + Assertions.assertEquals(2, list.size()); + } + + @Test + @Order(3) + void updateTest() { + final TypeEntity type = typeService.create(new TypeEntity(null, "Кино")); + final PlaceEntity place = placeService.create(new PlaceEntity(null, "Germany, Berlin")); + final String test = "TEST"; + final IventEntity entity = iventService.get(3L); + final TypeEntity oldType = entity.getType(); + final PlaceEntity oldPlace = entity.getPlace(); + final String oldName = entity.getName(); + final IventEntity newEntity = iventService.update(3L, new IventEntity( + null, + test, + type, + LocalDate.of(2023, 10, 15), + "Radiohead - британская рок-группа, образованная в 1985 году.", + "Участниками Radiohead являются:<....>", + 2500.33, + 30, + place)); + Assertions.assertEquals(3, iventService.getAll().size()); + Assertions.assertEquals(newEntity, iventService.get(3L)); + Assertions.assertEquals(test, newEntity.getName()); + Assertions.assertEquals(type, newEntity.getType()); + Assertions.assertEquals(place, newEntity.getPlace()); + Assertions.assertNotEquals(oldName, newEntity.getName()); + Assertions.assertNotEquals(oldType, newEntity.getType()); + Assertions.assertNotEquals(oldPlace, newEntity.getPlace()); + } + + @Test + @Order(4) + void deleteTest() { + iventService.delete(3L); + Assertions.assertEquals(2, iventService.getAll().size()); + final IventEntity last = iventService.get(2L); + Assertions.assertEquals(2L, last.getId()); + + final TypeEntity type = typeService.create(new TypeEntity(null, "Концерт")); + final PlaceEntity place = placeService.create(new PlaceEntity(null, "USA, California")); + final IventEntity newEntity = iventService.create(new IventEntity( + null, + "Deftones", + type, + LocalDate.of(2023, 10, 15), + "Deftones - американская альтернативная метал-группа, сформированная в 1988 году. ", + "Участники Deftones:<....>", + 2550.33, + 25, + place)); + Assertions.assertEquals(3, iventService.getAll().size()); + Assertions.assertEquals(4L, newEntity.getId()); + } +} diff --git a/src/test/java/com/example/demo/PlaceServiceTests.java b/src/test/java/com/example/demo/PlaceServiceTests.java new file mode 100644 index 0000000..13d9838 --- /dev/null +++ b/src/test/java/com/example/demo/PlaceServiceTests.java @@ -0,0 +1,62 @@ +package com.example.demo; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.MethodOrderer.OrderAnnotation; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestMethodOrder; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import com.example.demo.places.model.PlaceEntity; +import com.example.demo.places.service.PlaceService; +import com.example.demo.core.error.NotFoundException; + +@SpringBootTest +@TestMethodOrder(OrderAnnotation.class) +class PlaceServiceTests { + @Autowired + private PlaceService placeService; + + @Test + void getTest() { + Assertions.assertThrows(NotFoundException.class, () -> placeService.get(0L)); + } + + @Test + @Order(1) + void createTest() { + placeService.create(new PlaceEntity(null, "USA, California")); + placeService.create(new PlaceEntity(null, "Germany, Berlin")); + final PlaceEntity last = placeService.create(new PlaceEntity(null, "UK, London")); + Assertions.assertEquals(3, placeService.getAll().size()); + Assertions.assertEquals(last, placeService.get(3L)); + } + + @Test + @Order(2) + void updateTest() { + final String test = "TEST"; + final PlaceEntity entity = placeService.get(3L); + final String oldName = entity.getName(); + final PlaceEntity newEntity = placeService.update(3L, new PlaceEntity(1L, test)); + Assertions.assertEquals(3, placeService.getAll().size()); + Assertions.assertEquals(newEntity, placeService.get(3L)); + Assertions.assertEquals(test, newEntity.getName()); + Assertions.assertNotEquals(oldName, newEntity.getName()); + } + + @Test + @Order(3) + void deleteTest() { + placeService.delete(3L); + Assertions.assertEquals(2, placeService.getAll().size()); + final PlaceEntity last = placeService.get(2L); + Assertions.assertEquals(2L, last.getId()); + + final PlaceEntity newEntity = placeService.create(new PlaceEntity(null, "UK, London")); + Assertions.assertEquals(3, placeService.getAll().size()); + Assertions.assertEquals(4L, newEntity.getId()); + } +} + diff --git a/src/test/java/com/example/demo/TypeServiceTests.java b/src/test/java/com/example/demo/TypeServiceTests.java new file mode 100644 index 0000000..2c73d93 --- /dev/null +++ b/src/test/java/com/example/demo/TypeServiceTests.java @@ -0,0 +1,61 @@ +package com.example.demo; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.MethodOrderer.OrderAnnotation; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestMethodOrder; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import com.example.demo.types.model.TypeEntity; +import com.example.demo.types.service.TypeService; +import com.example.demo.core.error.NotFoundException; + +@SpringBootTest +@TestMethodOrder(OrderAnnotation.class) +class TypeServiceTests { + @Autowired + private TypeService typeService; + + @Test + void getTest() { + Assertions.assertThrows(NotFoundException.class, () -> typeService.get(0L)); + } + + @Test + @Order(1) + void createTest() { + typeService.create(new TypeEntity(null, "Кино")); + typeService.create(new TypeEntity(null, "Концерт")); + final TypeEntity last = typeService.create(new TypeEntity(null, "Театр")); + Assertions.assertEquals(3, typeService.getAll().size()); + Assertions.assertEquals(last, typeService.get(3L)); + } + + @Test + @Order(2) + void updateTest() { + final String test = "TEST"; + final TypeEntity entity = typeService.get(3L); + final String oldName = entity.getName(); + final TypeEntity newEntity = typeService.update(3L, new TypeEntity(1L, test)); + Assertions.assertEquals(3, typeService.getAll().size()); + Assertions.assertEquals(newEntity, typeService.get(3L)); + Assertions.assertEquals(test, newEntity.getName()); + Assertions.assertNotEquals(oldName, newEntity.getName()); + } + + @Test + @Order(3) + void deleteTest() { + typeService.delete(3L); + Assertions.assertEquals(2, typeService.getAll().size()); + final TypeEntity last = typeService.get(2L); + Assertions.assertEquals(2L, last.getId()); + + final TypeEntity newEntity = typeService.create(new TypeEntity(null, "Театр")); + Assertions.assertEquals(3, typeService.getAll().size()); + Assertions.assertEquals(4L, newEntity.getId()); + } +} diff --git a/src/test/java/com/example/demo/UserServiceTests.java b/src/test/java/com/example/demo/UserServiceTests.java new file mode 100644 index 0000000..3253417 --- /dev/null +++ b/src/test/java/com/example/demo/UserServiceTests.java @@ -0,0 +1,62 @@ +package com.example.demo; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.MethodOrderer.OrderAnnotation; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestMethodOrder; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import com.example.demo.users.model.UserEntity; +import com.example.demo.users.service.UserService; +import com.example.demo.core.error.NotFoundException; + +@SpringBootTest +@TestMethodOrder(OrderAnnotation.class) +class UserServiceTests { + @Autowired + private UserService userService; + + @Test + void getTest() { + Assertions.assertThrows(NotFoundException.class, () -> userService.get(0L)); + } + + @Test + @Order(1) + void createTest() { + userService.create(new UserEntity(null, "Admin", "admin@gmail.com", "admin")); + userService.create(new UserEntity(null, "Milana", "milana@gmail.com", "milana")); + final UserEntity last = userService.create(new UserEntity(null, "TestUser", "user@gmail.com", "test")); + Assertions.assertEquals(3, userService.getAll().size()); + Assertions.assertEquals(last, userService.get(3L)); + } + + @Test + @Order(2) + void updateTest() { + final String test = "TEST"; + final UserEntity entity = userService.get(3L); + final String oldName = entity.getHandle(); + final UserEntity newEntity = userService.update(3L, new UserEntity(1L, test, "user@gmail.com", "test")); + Assertions.assertEquals(3, userService.getAll().size()); + Assertions.assertEquals(newEntity, userService.get(3L)); + Assertions.assertEquals(test, newEntity.getHandle()); + Assertions.assertNotEquals(oldName, newEntity.getHandle()); + } + + @Test + @Order(3) + void deleteTest() { + userService.delete(3L); + Assertions.assertEquals(2, userService.getAll().size()); + final UserEntity last = userService.get(2L); + Assertions.assertEquals(2L, last.getId()); + + final UserEntity newEntity = userService.create(new UserEntity(null, "TestUser", "user@gmail.com", "test")); + Assertions.assertEquals(3, userService.getAll().size()); + Assertions.assertEquals(4L, newEntity.getId()); + } +} +