From ea49e080a349c38b9b60c2f1611be3e495cdc1bd Mon Sep 17 00:00:00 2001 From: Sotheran Date: Fri, 31 Jan 2020 15:42:15 +0000 Subject: [PATCH] [31.01.20] Start of GraphQL creation and messing --- pom.xml | 39 +++++++++++++++ .../cryptosky/me/dbgateway/Application.java | 13 +++++ .../data/cryptoPriceNotFoundException.java | 33 +++++++++++++ .../service/GraphQLAdapterError.java | 48 +++++++++++++++++++ .../me/dbgateway/jpa/entities/BtcEntity.java | 40 ---------------- .../me/dbgateway/jpa/entity/Vehicle.java | 47 ++++++++++++++++++ .../jpa/repositories/BtcRepository.java | 9 ---- .../jpa/repository/VehicleRepository.java | 9 ++++ .../me/dbgateway/models/CryptoPriceModel.java | 42 ++++++++++++++++ .../dbgateway/mutation/VehicleMutation.java | 20 ++++++++ .../me/dbgateway/mutations/BtcMutation.java | 19 -------- .../me/dbgateway/query/BtcQuery.java | 26 ---------- .../me/dbgateway/query/VehicleQuery.java | 25 ++++++++++ .../repository/CryptoPriceRepository.java | 9 ++++ .../dataResolvers/CryptoPriceResolver.java | 17 +++++++ .../mutations/CryptoPriceMutation.java | 36 ++++++++++++++ .../me/dbgateway/service/BtcService.java | 41 ---------------- .../me/dbgateway/service/VehicleService.java | 45 +++++++++++++++++ src/main/resources/graphql/vehicleql.graphqls | 16 +++++++ 19 files changed, 399 insertions(+), 135 deletions(-) create mode 100644 src/main/java/cryptosky/me/dbgateway/Application.java create mode 100644 src/main/java/cryptosky/me/dbgateway/exceptions/data/cryptoPriceNotFoundException.java create mode 100644 src/main/java/cryptosky/me/dbgateway/exceptions/service/GraphQLAdapterError.java delete mode 100644 src/main/java/cryptosky/me/dbgateway/jpa/entities/BtcEntity.java create mode 100644 src/main/java/cryptosky/me/dbgateway/jpa/entity/Vehicle.java delete mode 100644 src/main/java/cryptosky/me/dbgateway/jpa/repositories/BtcRepository.java create mode 100644 src/main/java/cryptosky/me/dbgateway/jpa/repository/VehicleRepository.java create mode 100644 src/main/java/cryptosky/me/dbgateway/models/CryptoPriceModel.java create mode 100644 src/main/java/cryptosky/me/dbgateway/mutation/VehicleMutation.java delete mode 100644 src/main/java/cryptosky/me/dbgateway/mutations/BtcMutation.java delete mode 100644 src/main/java/cryptosky/me/dbgateway/query/BtcQuery.java create mode 100644 src/main/java/cryptosky/me/dbgateway/query/VehicleQuery.java create mode 100644 src/main/java/cryptosky/me/dbgateway/repository/CryptoPriceRepository.java create mode 100644 src/main/java/cryptosky/me/dbgateway/resolvers/dataResolvers/CryptoPriceResolver.java create mode 100644 src/main/java/cryptosky/me/dbgateway/resolvers/mutations/CryptoPriceMutation.java delete mode 100644 src/main/java/cryptosky/me/dbgateway/service/BtcService.java create mode 100644 src/main/java/cryptosky/me/dbgateway/service/VehicleService.java create mode 100644 src/main/resources/graphql/vehicleql.graphqls diff --git a/pom.xml b/pom.xml index 67b3d31..2599a43 100644 --- a/pom.xml +++ b/pom.xml @@ -8,6 +8,7 @@ 2.2.4.RELEASE + cryptosky.me db-gateway 0.0.1 @@ -81,6 +82,24 @@ 5.0.2 + + com.graphql-java + graphql-java-servlet + 4.0.0 + + + javax.servlet + javax.servlet-api + 3.0.1 + provided + + + + javax.xml.bind + jaxb-api + 2.3.0 + + org.springframework.boot spring-boot-starter-test @@ -107,11 +126,31 @@ + Cryptosky DB Gateway + + org.eclipse.jetty + jetty-maven-plugin + 9.4.6.v20170531 + org.springframework.boot spring-boot-maven-plugin + + org.apache.maven.plugins + maven-compiler-plugin + 3.5.1 + + 1.8 + 1.8 + + + + + maven-war-plugin + 3.1.0 + diff --git a/src/main/java/cryptosky/me/dbgateway/Application.java b/src/main/java/cryptosky/me/dbgateway/Application.java new file mode 100644 index 0000000..43595f4 --- /dev/null +++ b/src/main/java/cryptosky/me/dbgateway/Application.java @@ -0,0 +1,13 @@ +package cryptosky.me.dbgateway; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; + +@SpringBootApplication +public class Application extends SpringBootServletInitializer { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } +} diff --git a/src/main/java/cryptosky/me/dbgateway/exceptions/data/cryptoPriceNotFoundException.java b/src/main/java/cryptosky/me/dbgateway/exceptions/data/cryptoPriceNotFoundException.java new file mode 100644 index 0000000..d09222d --- /dev/null +++ b/src/main/java/cryptosky/me/dbgateway/exceptions/data/cryptoPriceNotFoundException.java @@ -0,0 +1,33 @@ +package cryptosky.me.dbgateway.exceptions.data; + +import graphql.ErrorType; +import graphql.GraphQLError; +import graphql.language.SourceLocation; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class cryptoPriceNotFoundException extends RuntimeException implements GraphQLError { + private Map extensions = new HashMap<>(); + + public cryptoPriceNotFoundException(String message, Long invalidId) { + super(message); + extensions.put("invalidId", invalidId); + } + + @Override + public List getLocations() { + return null; + } + + @Override + public Map getExtensions() { + return extensions; + } + + @Override + public ErrorType getErrorType() { + return ErrorType.DataFetchingException; + } +} diff --git a/src/main/java/cryptosky/me/dbgateway/exceptions/service/GraphQLAdapterError.java b/src/main/java/cryptosky/me/dbgateway/exceptions/service/GraphQLAdapterError.java new file mode 100644 index 0000000..e2b1f5b --- /dev/null +++ b/src/main/java/cryptosky/me/dbgateway/exceptions/service/GraphQLAdapterError.java @@ -0,0 +1,48 @@ +package cryptosky.me.dbgateway.exceptions.service; + +import graphql.ErrorType; +import graphql.GraphQLError; +import graphql.language.SourceLocation; +import graphql.ExceptionWhileDataFetching; + +import java.util.List; +import java.util.Map; + +public class GraphQLAdapterError implements GraphQLError { + + private GraphQLError error; + + public GraphQLAdapterError(GraphQLError error) { + this.error = error; + } + + @Override + public Map getExtensions() { + return error.getExtensions(); + } + + @Override + public List getLocations() { + return error.getLocations(); + } + + @Override + public ErrorType getErrorType() { + return error.getErrorType(); + } + + @Override + public List getPath() { + return error.getPath(); + } + + @Override + public Map toSpecification() { + return error.toSpecification(); + } + + @Override + public String getMessage() { + return (error instanceof ExceptionWhileDataFetching) ? ((ExceptionWhileDataFetching) error).getException().getMessage() : error.getMessage(); + } +} diff --git a/src/main/java/cryptosky/me/dbgateway/jpa/entities/BtcEntity.java b/src/main/java/cryptosky/me/dbgateway/jpa/entities/BtcEntity.java deleted file mode 100644 index a67a316..0000000 --- a/src/main/java/cryptosky/me/dbgateway/jpa/entities/BtcEntity.java +++ /dev/null @@ -1,40 +0,0 @@ -package cryptosky.me.dbgateway.jpa.entities; - - -import lombok.Data; -import lombok.EqualsAndHashCode; -import javax.persistence.*; -import java.io.Serializable; -import java.time.LocalDate; - -@Data -@EqualsAndHashCode -@Entity -public class BtcEntity implements Serializable { - - private static final long serialVersionUID = 1L; - - @Id - @Column(name = "ID", nullable = false) - @GeneratedValue(strategy = GenerationType.AUTO) - private int id; - - @Column(name = "type", nullable = false) - private String type; - - @Column(name = "model_code", nullable = false) - private String modelCode; - - @Column(name = "brand_name") - private String brandName; - - @Column(name = "launch_date") - private LocalDate launchDate; - - private transient String formattedDate; - - // Getter and setter - public String getFormattedDate() { - return getLaunchDate().toString(); - } -} diff --git a/src/main/java/cryptosky/me/dbgateway/jpa/entity/Vehicle.java b/src/main/java/cryptosky/me/dbgateway/jpa/entity/Vehicle.java new file mode 100644 index 0000000..14e3b20 --- /dev/null +++ b/src/main/java/cryptosky/me/dbgateway/jpa/entity/Vehicle.java @@ -0,0 +1,47 @@ +package cryptosky.me.dbgateway.jpa.entity; + +import lombok.*; + +import javax.persistence.*; +import java.time.LocalDate; + +@AllArgsConstructor +@NoArgsConstructor(access = AccessLevel.PRIVATE) +@ToString +@Getter +@Setter +@Builder +@Data +@EqualsAndHashCode +@Entity +public class Vehicle { + + @Id + @Column(name = "ID", nullable = false) + @GeneratedValue(strategy = GenerationType.AUTO) + private int id; + + @Column(name = "timestamp", nullable = false) + private LocalDate timestamp; + + @Column(name = "av_price", nullable = false) + private Long average_price; + + @Column(name = "h_price", nullable = false) + private Long high_price; + + @Column(name = "l_price", nullable = false) + private Long low_price; + + @Column(name = "c_price", nullable = false) + private Long close_price; + + @Column(name = "volume", nullable = false) + private Long volume; + + private transient String formattedDate; + + public String getFormattedDate() { + return getTimestamp().toString(); + } +} diff --git a/src/main/java/cryptosky/me/dbgateway/jpa/repositories/BtcRepository.java b/src/main/java/cryptosky/me/dbgateway/jpa/repositories/BtcRepository.java deleted file mode 100644 index 9256eb8..0000000 --- a/src/main/java/cryptosky/me/dbgateway/jpa/repositories/BtcRepository.java +++ /dev/null @@ -1,9 +0,0 @@ -package cryptosky.me.dbgateway.jpa.repositories; - -import cryptosky.me.dbgateway.jpa.entities.BtcEntity; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; -@Repository -public class BtcRepository extends JpaRepository{ - -} diff --git a/src/main/java/cryptosky/me/dbgateway/jpa/repository/VehicleRepository.java b/src/main/java/cryptosky/me/dbgateway/jpa/repository/VehicleRepository.java new file mode 100644 index 0000000..15a9dcc --- /dev/null +++ b/src/main/java/cryptosky/me/dbgateway/jpa/repository/VehicleRepository.java @@ -0,0 +1,9 @@ +package cryptosky.me.dbgateway.jpa.repository; + +import cryptosky.me.dbgateway.jpa.entity.Vehicle; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface VehicleRepository extends JpaRepository { +} diff --git a/src/main/java/cryptosky/me/dbgateway/models/CryptoPriceModel.java b/src/main/java/cryptosky/me/dbgateway/models/CryptoPriceModel.java new file mode 100644 index 0000000..4a60bf8 --- /dev/null +++ b/src/main/java/cryptosky/me/dbgateway/models/CryptoPriceModel.java @@ -0,0 +1,42 @@ +package cryptosky.me.dbgateway.models; + +import lombok.*; + +import javax.persistence.*; +import java.sql.Timestamp; + +@AllArgsConstructor +@NoArgsConstructor(access = AccessLevel.PRIVATE) +@ToString +@Getter +@Setter +@Builder +public class CryptoPriceModel { + + @Id + @Column(name = "id", nullable = false) + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + @Column(name = "timestamp", nullable = false) + private Timestamp timestamp; + + @Column(name = "type", nullable = false) + private String type; + + @Column(name = "av_price", nullable = false) + private Long average_price; + + @Column(name = "h_price", nullable = false) + private Long high_price; + + @Column(name = "l_price", nullable = false) + private Long low_price; + + @Column(name = "c_price", nullable = false) + private Long close_price; + + @Column(name = "volume", nullable = false) + private Long volume; + +} diff --git a/src/main/java/cryptosky/me/dbgateway/mutation/VehicleMutation.java b/src/main/java/cryptosky/me/dbgateway/mutation/VehicleMutation.java new file mode 100644 index 0000000..645ffd9 --- /dev/null +++ b/src/main/java/cryptosky/me/dbgateway/mutation/VehicleMutation.java @@ -0,0 +1,20 @@ +package cryptosky.me.dbgateway.mutation; + +import com.coxautodev.graphql.tools.GraphQLMutationResolver; +import cryptosky.me.dbgateway.jpa.entity.Vehicle; +import cryptosky.me.dbgateway.service.VehicleService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.time.LocalDate; + +@Component +public class VehicleMutation implements GraphQLMutationResolver { + + @Autowired + private VehicleService vehicleService; + + public Vehicle createVehicle(final LocalDate timestamp, final Long av_price, final Long h_price, final Long l_price, final Long c_price, final Long volume ) { + return this.vehicleService.createVehicle( timestamp, av_price, h_price, l_price, c_price, volume ); + } +} diff --git a/src/main/java/cryptosky/me/dbgateway/mutations/BtcMutation.java b/src/main/java/cryptosky/me/dbgateway/mutations/BtcMutation.java deleted file mode 100644 index f24f4fe..0000000 --- a/src/main/java/cryptosky/me/dbgateway/mutations/BtcMutation.java +++ /dev/null @@ -1,19 +0,0 @@ -package cryptosky.me.dbgateway.mutations; - -import com.coxautodev.graphql.tools.GraphQLMutationResolver; -import cryptosky.me.dbgateway.jpa.entities.BtcEntity; -import cryptosky.me.dbgateway.service.BtcService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -@Component -public class BtcMutation implements GraphQLMutationResolver { - - @Autowired - private BtcService btcService; - - public BtcEntity createBtc(final String type, final String modelCode, final String brandName, final String launchDate) { - return this.btcService.createBtc(type, modelCode, brandName, launchDate); - } - -} diff --git a/src/main/java/cryptosky/me/dbgateway/query/BtcQuery.java b/src/main/java/cryptosky/me/dbgateway/query/BtcQuery.java deleted file mode 100644 index abae5a5..0000000 --- a/src/main/java/cryptosky/me/dbgateway/query/BtcQuery.java +++ /dev/null @@ -1,26 +0,0 @@ -package cryptosky.me.dbgateway.query; - -import com.coxautodev.graphql.tools.GraphQLQueryResolver; - -import cryptosky.me.dbgateway.jpa.entities.BtcEntity; -import cryptosky.me.dbgateway.service.BtcService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import java.util.List; -import java.util.Optional; - -@Component -public class BtcQuery implements GraphQLQueryResolver { - - @Autowired - private BtcService btcService; - - public List getBtc(final int count) { - return this.btcService.getAllBtc(count); - } - - public Optional getVehicle(final int id) { - return this.btcService.getBtc(id); - } -} diff --git a/src/main/java/cryptosky/me/dbgateway/query/VehicleQuery.java b/src/main/java/cryptosky/me/dbgateway/query/VehicleQuery.java new file mode 100644 index 0000000..03b16a0 --- /dev/null +++ b/src/main/java/cryptosky/me/dbgateway/query/VehicleQuery.java @@ -0,0 +1,25 @@ +package cryptosky.me.dbgateway.query; + +import com.coxautodev.graphql.tools.GraphQLQueryResolver; +import cryptosky.me.dbgateway.jpa.entity.Vehicle; +import cryptosky.me.dbgateway.service.VehicleService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Optional; + +@Component +public class VehicleQuery implements GraphQLQueryResolver { + + @Autowired + private VehicleService vehicleService; + + public List getVehicles(final int count) { + return this.vehicleService.getAllVehicles(count); + } + + public Optional getVehicle(final int id) { + return this.vehicleService.getVehicle(id); + } +} diff --git a/src/main/java/cryptosky/me/dbgateway/repository/CryptoPriceRepository.java b/src/main/java/cryptosky/me/dbgateway/repository/CryptoPriceRepository.java new file mode 100644 index 0000000..bbd6e49 --- /dev/null +++ b/src/main/java/cryptosky/me/dbgateway/repository/CryptoPriceRepository.java @@ -0,0 +1,9 @@ +package cryptosky.me.dbgateway.repository; + +import cryptosky.me.dbgateway.models.CryptoPriceModel; +import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface CryptoPriceRepository extends CrudRepository { +} diff --git a/src/main/java/cryptosky/me/dbgateway/resolvers/dataResolvers/CryptoPriceResolver.java b/src/main/java/cryptosky/me/dbgateway/resolvers/dataResolvers/CryptoPriceResolver.java new file mode 100644 index 0000000..12077ec --- /dev/null +++ b/src/main/java/cryptosky/me/dbgateway/resolvers/dataResolvers/CryptoPriceResolver.java @@ -0,0 +1,17 @@ +package cryptosky.me.dbgateway.resolvers.dataResolvers; + +import com.coxautodev.graphql.tools.GraphQLResolver; +import cryptosky.me.dbgateway.models.CryptoPriceModel; +import cryptosky.me.dbgateway.repository.CryptoPriceRepository; + +public class CryptoPriceResolver implements GraphQLResolver { + private CryptoPriceRepository cryptoPriceRepository; + + public CryptoPriceResolver( CryptoPriceRepository cryptoPriceRepository ) { + this.cryptoPriceRepository = cryptoPriceRepository; + } + +// public CryptoPriceModel getPrice( Long id ) { +// return cryptoPriceRepository.findById( CryptoPriceModel ); +// } +} diff --git a/src/main/java/cryptosky/me/dbgateway/resolvers/mutations/CryptoPriceMutation.java b/src/main/java/cryptosky/me/dbgateway/resolvers/mutations/CryptoPriceMutation.java new file mode 100644 index 0000000..a81a3ca --- /dev/null +++ b/src/main/java/cryptosky/me/dbgateway/resolvers/mutations/CryptoPriceMutation.java @@ -0,0 +1,36 @@ +package cryptosky.me.dbgateway.resolvers.mutations; + +import com.coxautodev.graphql.tools.GraphQLMutationResolver; +import cryptosky.me.dbgateway.models.CryptoPriceModel; +import cryptosky.me.dbgateway.repository.CryptoPriceRepository; + +import java.sql.Timestamp; + +public class CryptoPriceMutation implements GraphQLMutationResolver { + private CryptoPriceRepository cryptoPriceRepository; + +// public Mutation(CryptoPriceRepository cryptoPriceRepository) { +// this.cryptoPriceRepository = cryptoPriceRepository; +// } + + public CryptoPriceModel newPriceEntry(Timestamp timestamp, String type, Long average_price, Long high_price, Long low_price, Long close_price, Long volume) { + CryptoPriceModel cryptoPriceModel = CryptoPriceModel.builder() + .timestamp(timestamp) + .type(type) + .average_price(average_price) + .high_price(high_price) + .low_price(low_price) + .close_price(close_price) + .volume(volume) + .build(); + + cryptoPriceRepository.save(cryptoPriceModel); + + return cryptoPriceModel; + } + +// public boolean deleteCrypto(Long id) { +// cryptoPriceRepository.delete(id); +// return true; +// } +} diff --git a/src/main/java/cryptosky/me/dbgateway/service/BtcService.java b/src/main/java/cryptosky/me/dbgateway/service/BtcService.java deleted file mode 100644 index 6427d3f..0000000 --- a/src/main/java/cryptosky/me/dbgateway/service/BtcService.java +++ /dev/null @@ -1,41 +0,0 @@ -package cryptosky.me.dbgateway.service; - -import cryptosky.me.dbgateway.jpa.entities.BtcEntity; -import cryptosky.me.dbgateway.jpa.repositories.BtcRepository; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.time.LocalDate; -import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; - -@Service -public class BtcService { - - private final BtcRepository btcRepository; - - public BtcService(final BtcRepository btcRepository) { - this.btcRepository = btcRepository ; - } - - @Transactional - public BtcEntity createBtc(final String type, final String modelCode, final String brandName, final String launchDate) { - final BtcEntity btc = new BtcEntity(); - btc.setType(type); - btc.setModelCode(modelCode); - btc.setBrandName(brandName); - btc.setLaunchDate(LocalDate.parse(launchDate)); - return this.btcRepository.save(btc); - } - - @Transactional(readOnly = true) - public List getAllBtc(final int count) { - return this.btcRepository.findAll().stream().limit(count).collect(Collectors.toList()); - } - - @Transactional(readOnly = true) - public Optional getBtc(final int id) { - return this.btcRepository.findById(id); - } -} diff --git a/src/main/java/cryptosky/me/dbgateway/service/VehicleService.java b/src/main/java/cryptosky/me/dbgateway/service/VehicleService.java new file mode 100644 index 0000000..a40045d --- /dev/null +++ b/src/main/java/cryptosky/me/dbgateway/service/VehicleService.java @@ -0,0 +1,45 @@ +package cryptosky.me.dbgateway.service; + +import cryptosky.me.dbgateway.jpa.entity.Vehicle; +import cryptosky.me.dbgateway.jpa.repository.VehicleRepository; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDate; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +@Service +public class VehicleService { + + private final VehicleRepository vehicleRepository ; + + public VehicleService(final VehicleRepository vehicleRepository) { + this.vehicleRepository = vehicleRepository ; + } + + @Transactional + public Vehicle createVehicle( final LocalDate timestamp, final Long av_price, final Long h_price, final Long l_price, final Long c_price, final Long volume ) { + Vehicle vehicle = Vehicle.builder() + .timestamp(timestamp) + .average_price(av_price) + .high_price(h_price) + .low_price(l_price) + .close_price(c_price) + .volume(volume) + .build(); + + return this.vehicleRepository.save(vehicle); + } + + @Transactional(readOnly = true) + public List getAllVehicles(final int count) { + return this.vehicleRepository.findAll().stream().limit(count).collect(Collectors.toList()); + } + + @Transactional(readOnly = true) + public Optional getVehicle(final int id) { + return this.vehicleRepository.findById(id); + } +} diff --git a/src/main/resources/graphql/vehicleql.graphqls b/src/main/resources/graphql/vehicleql.graphqls new file mode 100644 index 0000000..97bde48 --- /dev/null +++ b/src/main/resources/graphql/vehicleql.graphqls @@ -0,0 +1,16 @@ +type Vehicle { + id: ID!, + type: String, + modelCode: String, + brandName: String, + launchDate: String +} + +type Query { + vehicles(count: Int):[Vehicle] + vehicle(id: ID):Vehicle +} + +type Mutation { + createVehicle(type: String!, modelCode: String!, brandName: String, launchDate: String):Vehicle +} \ No newline at end of file