diff --git a/.gitignore b/.gitignore index 9154f4c..2dbf672 100644 --- a/.gitignore +++ b/.gitignore @@ -19,6 +19,7 @@ *.zip *.tar.gz *.rar +../target # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml hs_err_pid* diff --git a/ServiceCenter/pom.xml b/ServiceCenter/pom.xml new file mode 100644 index 0000000..cd3bbfd --- /dev/null +++ b/ServiceCenter/pom.xml @@ -0,0 +1,92 @@ + + 4.0.0 + + org.example + ServiceCenter + 1.0-SNAPSHOT + jar + + ServiceCenter + http://maven.apache.org + + + UTF-8 + 42.7.3 + 10.18.0 + 1.18.34 + 1.6.3 + 0.2.0 + + + org.springframework.boot + spring-boot-starter-parent + 3.3.2 + + + + + org.flywaydb + flyway-database-postgresql + ${org.flywaydb.version} + + + + org.flywaydb + flyway-core + ${org.flywaydb.version} + + + + org.postgresql + postgresql + ${org.postgesql.version} + + + + org.mapstruct + mapstruct + ${org.mapstruct.version} + + + + org.projectlombok + lombok + ${org.lombok.version} + provided + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.13.0 + + + + org.mapstruct + mapstruct-processor + ${org.mapstruct.version} + + + org.projectlombok + lombok + ${org.lombok.version} + + + org.projectlombok + lombok-mapstruct-binding + ${lombok-mapstruct-binding.version} + + + + + + + diff --git a/ServiceCenter/src/main/java/org/example/App.java b/ServiceCenter/src/main/java/org/example/App.java new file mode 100644 index 0000000..bcf010e --- /dev/null +++ b/ServiceCenter/src/main/java/org/example/App.java @@ -0,0 +1,13 @@ +package org.example; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class App +{ + public static void main( String[] args ) + { + SpringApplication.run(App.class, args); + } +} diff --git a/ServiceCenter/src/main/java/org/example/domain/entity/Car.java b/ServiceCenter/src/main/java/org/example/domain/entity/Car.java new file mode 100644 index 0000000..7fef2d5 --- /dev/null +++ b/ServiceCenter/src/main/java/org/example/domain/entity/Car.java @@ -0,0 +1,29 @@ +package org.example.domain.entity; + +import jakarta.persistence.*; +import lombok.Data; + +import java.util.List; +import java.util.UUID; + +@Data +@Entity +public class Car { + @Id + private Long id; + + @Column(nullable = false) + private String brand; + + @Column(nullable = false) + private String model; + + @Column(nullable = false) + private Integer year; + + @ManyToMany(fetch = FetchType.EAGER) + private List configurations; + + @OneToMany(mappedBy = "car") + private List features; +} diff --git a/ServiceCenter/src/main/java/org/example/domain/entity/Configuration.java b/ServiceCenter/src/main/java/org/example/domain/entity/Configuration.java new file mode 100644 index 0000000..39bc959 --- /dev/null +++ b/ServiceCenter/src/main/java/org/example/domain/entity/Configuration.java @@ -0,0 +1,26 @@ +package org.example.domain.entity; + +import jakarta.persistence.*; +import lombok.Data; + +import java.util.List; +import java.util.UUID; + +@Data +@Entity +public class Configuration { + @Id + private Long id; + + @Column(nullable = false) + private String name; + + @Column(nullable = false) + private String description; + + @OneToOne(fetch = FetchType.EAGER) + private User user; + + @ManyToMany(fetch = FetchType.LAZY, mappedBy = "configurations") + private List cars; +} diff --git a/ServiceCenter/src/main/java/org/example/domain/entity/Feature.java b/ServiceCenter/src/main/java/org/example/domain/entity/Feature.java new file mode 100644 index 0000000..e8b40df --- /dev/null +++ b/ServiceCenter/src/main/java/org/example/domain/entity/Feature.java @@ -0,0 +1,22 @@ +package org.example.domain.entity; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.OneToOne; +import lombok.Data; + +import java.util.UUID; + +@Entity +@Data +public class Feature { + @Id + private Long id; + + @Column(nullable = false) + private String description; + + @OneToOne + private Car car; +} diff --git a/ServiceCenter/src/main/java/org/example/domain/entity/PreparationWork.java b/ServiceCenter/src/main/java/org/example/domain/entity/PreparationWork.java new file mode 100644 index 0000000..6829969 --- /dev/null +++ b/ServiceCenter/src/main/java/org/example/domain/entity/PreparationWork.java @@ -0,0 +1,32 @@ +package org.example.domain.entity; + +import jakarta.persistence.*; +import lombok.Data; + +import java.util.List; +import java.util.UUID; + +@Entity +@Data +public class PreparationWork { + @Id + private Long id; + + @Column(nullable = false) + private String name; + + @Column(nullable = false) + private String description; + + @OneToOne(fetch = FetchType.EAGER) + private User user; + + @OneToMany(fetch = FetchType.LAZY, mappedBy = "preparationWorks") + private List requests; + + @OneToMany(fetch = FetchType.EAGER, mappedBy = "preparationWork") + private List wishes; + + @ManyToMany(fetch = FetchType.LAZY) + private List configurations; +} diff --git a/ServiceCenter/src/main/java/org/example/domain/entity/Request.java b/ServiceCenter/src/main/java/org/example/domain/entity/Request.java new file mode 100644 index 0000000..c12d705 --- /dev/null +++ b/ServiceCenter/src/main/java/org/example/domain/entity/Request.java @@ -0,0 +1,30 @@ +package org.example.domain.entity; + +import jakarta.persistence.*; +import jdk.jfr.Timestamp; +import lombok.Data; +import org.hibernate.annotations.Fetch; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.UUID; + +@Entity +@Data +public class Request { + @Id + private Long id; + + @Timestamp + @Column(nullable = false) + private LocalDateTime createdAt; + + @OneToOne(fetch = FetchType.EAGER) + private User user; + + @ManyToMany + private List cars; + + @ManyToMany(fetch = FetchType.EAGER) + private List preparationWorks; +} diff --git a/ServiceCenter/src/main/java/org/example/domain/entity/User.java b/ServiceCenter/src/main/java/org/example/domain/entity/User.java new file mode 100644 index 0000000..adac011 --- /dev/null +++ b/ServiceCenter/src/main/java/org/example/domain/entity/User.java @@ -0,0 +1,29 @@ +package org.example.domain.entity; + + +import jakarta.persistence.*; +import lombok.Data; +import org.example.domain.enums.Role; + +import java.util.UUID; + +@Entity +@Data +@Table(name = "users") +public class User { + @Id + private Long id; + + @Column(nullable = false) + private String name; + + @Column(nullable = false) + private String email; + + @Column(nullable = false) + private String password; + + @Column(nullable = false) + @Enumerated(EnumType.STRING) + private Role role; +} diff --git a/ServiceCenter/src/main/java/org/example/domain/entity/Wish.java b/ServiceCenter/src/main/java/org/example/domain/entity/Wish.java new file mode 100644 index 0000000..b3aa8e6 --- /dev/null +++ b/ServiceCenter/src/main/java/org/example/domain/entity/Wish.java @@ -0,0 +1,24 @@ +package org.example.domain.entity; + +import jakarta.persistence.*; +import jdk.jfr.Timestamp; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.UUID; + +@Entity +@Data +public class Wish { + @Id + private Long id; + + @Column(nullable = false) + private String name; + + @Timestamp + private LocalDateTime createdAt; + + @OneToOne + private PreparationWork preparationWork; +} diff --git a/ServiceCenter/src/main/java/org/example/domain/enums/Role.java b/ServiceCenter/src/main/java/org/example/domain/enums/Role.java new file mode 100644 index 0000000..54263d6 --- /dev/null +++ b/ServiceCenter/src/main/java/org/example/domain/enums/Role.java @@ -0,0 +1,8 @@ +package org.example.domain.enums; + +public enum Role { + CLADDING("CLADDING"), + WORKER("WORKER"); + Role(String value){ + } +} diff --git a/ServiceCenter/src/main/java/org/example/domain/repositories/PreparationWorkRepository.java b/ServiceCenter/src/main/java/org/example/domain/repositories/PreparationWorkRepository.java new file mode 100644 index 0000000..5bc1c51 --- /dev/null +++ b/ServiceCenter/src/main/java/org/example/domain/repositories/PreparationWorkRepository.java @@ -0,0 +1,7 @@ +package org.example.domain.repositories; + +import org.example.domain.entity.PreparationWork; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface PreparationWorkRepository extends JpaRepository { +} diff --git a/ServiceCenter/src/main/java/org/example/domain/repositories/RequestRepository.java b/ServiceCenter/src/main/java/org/example/domain/repositories/RequestRepository.java new file mode 100644 index 0000000..16bc232 --- /dev/null +++ b/ServiceCenter/src/main/java/org/example/domain/repositories/RequestRepository.java @@ -0,0 +1,13 @@ +package org.example.domain.repositories; + +import org.example.domain.entity.Request; +import org.example.domain.entity.Wish; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.time.LocalDate; +import java.util.List; +import java.util.UUID; + +public interface RequestRepository extends JpaRepository { + List findByCreatedAtBetween(LocalDate dateFrom, LocalDate dateTo); +} diff --git a/ServiceCenter/src/main/java/org/example/domain/repositories/UserRepository.java b/ServiceCenter/src/main/java/org/example/domain/repositories/UserRepository.java new file mode 100644 index 0000000..ca04d80 --- /dev/null +++ b/ServiceCenter/src/main/java/org/example/domain/repositories/UserRepository.java @@ -0,0 +1,9 @@ +package org.example.domain.repositories; + +import org.example.domain.entity.User; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.UUID; + +public interface UserRepository extends JpaRepository { +} diff --git a/ServiceCenter/src/main/java/org/example/domain/repositories/WishRepository.java b/ServiceCenter/src/main/java/org/example/domain/repositories/WishRepository.java new file mode 100644 index 0000000..53011b5 --- /dev/null +++ b/ServiceCenter/src/main/java/org/example/domain/repositories/WishRepository.java @@ -0,0 +1,14 @@ +package org.example.domain.repositories; + +import org.example.domain.entity.Wish; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; + +import java.time.LocalDate; +import java.util.List; +import java.util.UUID; + +public interface WishRepository extends JpaRepository{ + + List findByCreatedAtBetween(LocalDate dateFrom, LocalDate dateTo); +} diff --git a/ServiceCenter/src/main/java/org/example/exceptions/ObjectExistsException.java b/ServiceCenter/src/main/java/org/example/exceptions/ObjectExistsException.java new file mode 100644 index 0000000..4ce65b9 --- /dev/null +++ b/ServiceCenter/src/main/java/org/example/exceptions/ObjectExistsException.java @@ -0,0 +1,8 @@ +package org.example.exceptions; + +public class ObjectExistsException extends RuntimeException { + public ObjectExistsException(Class type,String value) + { + super("Object " + type.getName() + " exists by: " + value); + } +} diff --git a/ServiceCenter/src/main/java/org/example/exceptions/ObjectNotExistsException.java b/ServiceCenter/src/main/java/org/example/exceptions/ObjectNotExistsException.java new file mode 100644 index 0000000..626c2d7 --- /dev/null +++ b/ServiceCenter/src/main/java/org/example/exceptions/ObjectNotExistsException.java @@ -0,0 +1,7 @@ +package org.example.exceptions; + +public class ObjectNotExistsException extends RuntimeException { + public ObjectNotExistsException(Class type,String value) { + super("Object " + type.getName() + " not found by: " + value ); + } +} diff --git a/ServiceCenter/src/main/java/org/example/managers/PreparationWorkManager.java b/ServiceCenter/src/main/java/org/example/managers/PreparationWorkManager.java new file mode 100644 index 0000000..d797c7a --- /dev/null +++ b/ServiceCenter/src/main/java/org/example/managers/PreparationWorkManager.java @@ -0,0 +1,35 @@ +package org.example.managers; + + +import lombok.RequiredArgsConstructor; +import org.example.domain.entity.PreparationWork; +import org.example.domain.entity.Request; +import org.example.domain.repositories.PreparationWorkRepository; +import org.example.exceptions.ObjectNotExistsException; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component +@RequiredArgsConstructor +public class PreparationWorkManager { + private final PreparationWorkRepository preparationWorkRepository; + + public void save(PreparationWork preparationWork){ + preparationWorkRepository.save(preparationWork); + } + + public void existsById(Long id){ + preparationWorkRepository.existsById(id); + } + + public PreparationWork getById(Long id){ + return preparationWorkRepository.findById(id) + .orElseThrow(() -> new ObjectNotExistsException(PreparationWork.class, id.toString())); + } + + public List getAll(){ + return preparationWorkRepository.findAll(); + } + +} diff --git a/ServiceCenter/src/main/java/org/example/managers/RequestManager.java b/ServiceCenter/src/main/java/org/example/managers/RequestManager.java new file mode 100644 index 0000000..ee34a3b --- /dev/null +++ b/ServiceCenter/src/main/java/org/example/managers/RequestManager.java @@ -0,0 +1,38 @@ +package org.example.managers; + +import lombok.RequiredArgsConstructor; +import org.example.domain.entity.Request; +import org.example.domain.repositories.RequestRepository; +import org.example.exceptions.ObjectExistsException; +import org.example.exceptions.ObjectNotExistsException; +import org.springframework.stereotype.Component; + +import java.time.LocalDate; +import java.util.List; + +@Component +@RequiredArgsConstructor +public class RequestManager { + private RequestRepository requestRepository; + + public void save(Request request){ + requestRepository.save(request); + } + + public void existsById(Long id){ + requestRepository.existsById(id); + } + + public Request getById(Long id){ + return requestRepository.findById(id) + .orElseThrow(() -> new ObjectNotExistsException(Request.class, id.toString())); + } + + public List getAll(){ + return requestRepository.findAll(); + } + + public List getAll(LocalDate dateFrom, LocalDate dateTo){ + return requestRepository.findByCreatedAtBetween(dateFrom, dateTo); + } +} diff --git a/ServiceCenter/src/main/java/org/example/managers/UserManager.java b/ServiceCenter/src/main/java/org/example/managers/UserManager.java new file mode 100644 index 0000000..8eb2ecf --- /dev/null +++ b/ServiceCenter/src/main/java/org/example/managers/UserManager.java @@ -0,0 +1,43 @@ +package org.example.managers; + +import lombok.RequiredArgsConstructor; +import org.example.domain.entity.User; +import org.example.domain.entity.Wish; +import org.example.domain.enums.Role; +import org.example.domain.repositories.UserRepository; +import org.example.exceptions.ObjectExistsException; +import org.example.exceptions.ObjectNotExistsException; +import org.springframework.data.domain.Example; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component +@RequiredArgsConstructor +public class UserManager { + private final UserRepository userRepository; + + public void save(User user){ + userRepository.save(user); + } + + public boolean existsById(Long id){ + return userRepository.existsById(id); + } + + public User getById(Long id){ + return userRepository.findById(id) + .orElseThrow(() -> new ObjectNotExistsException(User.class, id.toString())); + } + + public List getAll(){ + return userRepository.findAll(); + } + + public List getAll(Role role){ + var user = new User(); + user.setRole(role); + var example = Example.of(user); + return userRepository.findAll(example); + } +} diff --git a/ServiceCenter/src/main/java/org/example/managers/WishManager.java b/ServiceCenter/src/main/java/org/example/managers/WishManager.java new file mode 100644 index 0000000..5c9f44a --- /dev/null +++ b/ServiceCenter/src/main/java/org/example/managers/WishManager.java @@ -0,0 +1,40 @@ +package org.example.managers; + +import lombok.RequiredArgsConstructor; +import org.example.domain.entity.User; +import org.example.domain.entity.Wish; +import org.example.domain.repositories.WishRepository; +import org.example.exceptions.ObjectExistsException; +import org.example.exceptions.ObjectNotExistsException; +import org.springframework.stereotype.Component; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.List; + +@Component +@RequiredArgsConstructor +public class WishManager { + private final WishRepository wishRepository; + + public void save(Wish wish){ + wishRepository.save(wish); + } + + public boolean existsById(Long id){ + return wishRepository.existsById(id); + } + + public Wish getById(Long id){ + return wishRepository.findById(id) + .orElseThrow(() -> new ObjectNotExistsException(Wish.class, id.toString())); + } + + public List getAll(){ + return wishRepository.findAll(); + } + + public List getAll(LocalDate dateFrom, LocalDate dateTo){ + return wishRepository.findByCreatedAtBetween(dateFrom, dateTo); + } +} diff --git a/ServiceCenter/src/main/resources/application.yml b/ServiceCenter/src/main/resources/application.yml new file mode 100644 index 0000000..3d6f4b5 --- /dev/null +++ b/ServiceCenter/src/main/resources/application.yml @@ -0,0 +1,12 @@ +spring: + datasource: + url: jdbc:postgresql://localhost:5432/ + username: postgres + password: postgres + jpa: + show-sql: true + hibernate: + ddl-auto: create + properties: + hibernate: + format_sql: true \ No newline at end of file