From 09d431366589114059b36009467fe1cf2e2df9c3 Mon Sep 17 00:00:00 2001 From: zidane-itb <16521420@mahasiswa.itb.ac.id> Date: Tue, 31 Oct 2023 18:32:15 +0700 Subject: [PATCH] initial commit --- docker-compose.yml | 17 +++ pom.xml | 117 ++++++++++++++++++ sql/ddl.sql | 20 +++ src/main/java/com/kms/App.java | 34 +++++ .../java/com/kms/crosscut/LoggingHelper.java | 41 ++++++ src/main/java/com/kms/dto/EmailReq.java | 19 +++ .../java/com/kms/dto/PaymentHistoryResp.java | 21 ++++ src/main/java/com/kms/dto/PaymentInitReq.java | 21 ++++ .../java/com/kms/dto/PaymentInitResp.java | 17 +++ .../java/com/kms/dto/PaymentStatusResp.java | 19 +++ src/main/java/com/kms/handler/LogHandler.java | 61 +++++++++ src/main/java/com/kms/model/Log.java | 34 +++++ src/main/java/com/kms/model/Payment.java | 36 ++++++ .../com/kms/repository/LogRepository.java | 34 +++++ .../com/kms/repository/PaymentRepository.java | 33 +++++ .../java/com/kms/service/EmailService.java | 22 ++++ .../kms/service/PaymentHistoryService.java | 48 +++++++ .../java/com/kms/service/PaymentService.java | 58 +++++++++ .../com/kms/task/PaymentCompletorTask.java | 32 +++++ src/main/java/com/kms/util/EmailUtil.java | 18 +++ src/main/resources/handlers.xml | 8 ++ 21 files changed, 710 insertions(+) create mode 100644 docker-compose.yml create mode 100644 pom.xml create mode 100644 sql/ddl.sql create mode 100644 src/main/java/com/kms/App.java create mode 100644 src/main/java/com/kms/crosscut/LoggingHelper.java create mode 100644 src/main/java/com/kms/dto/EmailReq.java create mode 100644 src/main/java/com/kms/dto/PaymentHistoryResp.java create mode 100644 src/main/java/com/kms/dto/PaymentInitReq.java create mode 100644 src/main/java/com/kms/dto/PaymentInitResp.java create mode 100644 src/main/java/com/kms/dto/PaymentStatusResp.java create mode 100644 src/main/java/com/kms/handler/LogHandler.java create mode 100644 src/main/java/com/kms/model/Log.java create mode 100644 src/main/java/com/kms/model/Payment.java create mode 100644 src/main/java/com/kms/repository/LogRepository.java create mode 100644 src/main/java/com/kms/repository/PaymentRepository.java create mode 100644 src/main/java/com/kms/service/EmailService.java create mode 100644 src/main/java/com/kms/service/PaymentHistoryService.java create mode 100644 src/main/java/com/kms/service/PaymentService.java create mode 100644 src/main/java/com/kms/task/PaymentCompletorTask.java create mode 100644 src/main/java/com/kms/util/EmailUtil.java create mode 100644 src/main/resources/handlers.xml diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..a1da0d2 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,17 @@ +version: "3.1" + +services: + db: + image: mysql:8.2 + restart: always + environment: + MYSQL_DATABASE: 'db' + MYSQL_USER: 'user' + MYSQL_PASSWORD: 'password' + MYSQL_ROOT_PASSWORD: 'password' + ports: + - '3306:3306' + volumes: + - my-db:/var/lib/mysql +volumes: + my-db: \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..8ba5d30 --- /dev/null +++ b/pom.xml @@ -0,0 +1,117 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <groupId>com.kms</groupId> + <artifactId>soap</artifactId> + <version>0.0</version> + + <name>soap</name> + + <properties> + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + <maven.compiler.source>21</maven.compiler.source> + <maven.compiler.target>21</maven.compiler.target> + </properties> + + <dependencies> + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <version>4.13.1</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.projectlombok</groupId> + <artifactId>lombok</artifactId> + <version>1.18.30</version> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>com.sun.xml.ws</groupId> + <artifactId>jaxws-rt</artifactId> + <version>2.3.6</version> + </dependency> + <dependency> + <groupId>com.j256.ormlite</groupId> + <artifactId>ormlite-jdbc</artifactId> + <version>6.1</version> + </dependency> + <!-- https://mvnrepository.com/artifact/com.mysql/mysql-connector-j --> + <dependency> + <groupId>com.mysql</groupId> + <artifactId>mysql-connector-j</artifactId> + <version>8.2.0</version> + </dependency> + + </dependencies> + + <build> + <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) --> + <plugins> + <!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle --> + <plugin> + <artifactId>maven-clean-plugin</artifactId> + <version>3.1.0</version> + </plugin> + <!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging --> + <plugin> + <artifactId>maven-resources-plugin</artifactId> + <version>3.0.2</version> + </plugin> + <plugin> + <artifactId>maven-compiler-plugin</artifactId> + <version>3.8.0</version> + </plugin> + <plugin> + <artifactId>maven-surefire-plugin</artifactId> + <version>2.22.1</version> + </plugin> + <plugin> + <artifactId>maven-jar-plugin</artifactId> + <version>3.0.2</version> + </plugin> + <plugin> + <artifactId>maven-install-plugin</artifactId> + <version>2.5.2</version> + </plugin> + <plugin> + <artifactId>maven-deploy-plugin</artifactId> + <version>2.8.2</version> + </plugin> + <!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle --> + <plugin> + <artifactId>maven-site-plugin</artifactId> + <version>3.7.1</version> + </plugin> + <plugin> + <artifactId>maven-project-info-reports-plugin</artifactId> + <version>3.0.0</version> + </plugin> + <plugin> + <groupId>org.jvnet.jax-ws-commons</groupId> + <artifactId>jaxws-maven-plugin</artifactId> + <version>2.2</version> + <executions> + <execution> + <id>SomeId</id> + <goals> + <goal>wsgen</goal> + </goals> + <phase>prepare-package</phase> + <configuration> + <sei>com.kms.service.PaymentService</sei> + <genWsdl>true</genWsdl> + <keep>true</keep> + <inlineSchemas>true</inlineSchemas> + </configuration> + </execution> + </executions> + </plugin> + + </plugins> + </pluginManagement> + </build> +</project> diff --git a/sql/ddl.sql b/sql/ddl.sql new file mode 100644 index 0000000..267190e --- /dev/null +++ b/sql/ddl.sql @@ -0,0 +1,20 @@ +CREATE TABLE `payment` ( + `payment_id` int NOT NULL AUTO_INCREMENT, + `amount` double NOT NULL, + `payment_init_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `status_paid` tinyint(1) NOT NULL DEFAULT '0', + `payment_paid_time` timestamp NULL DEFAULT NULL, + `description` varchar(200) DEFAULT NULL, + `initiator_id` varchar(100) NOT NULL, + PRIMARY KEY (`payment_id`) +); + +CREATE TABLE `log` ( + `log_id` int NOT NULL AUTO_INCREMENT, + `request_description` varchar(2000) NOT NULL, + `origin_ip` varchar(12) NOT NULL, + `endpoint` varchar(100) NOT NULL, + `request_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `caller_id` varchar(100) NOT NULL, + PRIMARY KEY (`log_id`) +); \ No newline at end of file diff --git a/src/main/java/com/kms/App.java b/src/main/java/com/kms/App.java new file mode 100644 index 0000000..1b28d90 --- /dev/null +++ b/src/main/java/com/kms/App.java @@ -0,0 +1,34 @@ +package com.kms; + +import com.j256.ormlite.dao.Dao; +import com.j256.ormlite.dao.DaoManager; +import com.j256.ormlite.jdbc.JdbcConnectionSource; +import com.j256.ormlite.support.ConnectionSource; +import com.kms.crosscut.LoggingHelper; +import com.kms.model.Log; +import com.kms.model.Payment; +import com.kms.service.PaymentHistoryService; +import com.kms.service.PaymentService; +import com.kms.task.PaymentCompletorTask; + +import javax.xml.ws.Endpoint; +import java.sql.SQLException; +import java.util.Timer; + +public class App { + public static void main( String[] args ) throws SQLException { + String databaseUrl = "jdbc:mysql://localhost:3306/db?user=user&password=password"; + ConnectionSource connectionSource = new JdbcConnectionSource(databaseUrl); + Dao<Payment,Integer> paymentDao = + DaoManager.createDao(connectionSource, Payment.class); + Dao<Log,Integer> logDao = DaoManager.createDao(connectionSource, Log.class); + LoggingHelper.init(logDao); + + Timer time = new Timer(); + PaymentCompletorTask task = new PaymentCompletorTask(paymentDao); + time.schedule(task, 0, 25000); + + Endpoint.publish("http://localhost:8080/paymentservice", new PaymentService(paymentDao)); + Endpoint.publish("http://localhost:8080/paymenthistory", new PaymentHistoryService(paymentDao)); + } +} diff --git a/src/main/java/com/kms/crosscut/LoggingHelper.java b/src/main/java/com/kms/crosscut/LoggingHelper.java new file mode 100644 index 0000000..f5ee1b1 --- /dev/null +++ b/src/main/java/com/kms/crosscut/LoggingHelper.java @@ -0,0 +1,41 @@ +package com.kms.crosscut; + +import com.j256.ormlite.dao.Dao; +import com.kms.model.Log; + +import java.sql.SQLException; +import java.sql.Timestamp; + +public class LoggingHelper { + + private static LoggingHelper instance = null; + private final Dao<Log,Integer> logDao; + + public LoggingHelper(Dao<Log,Integer> logDao) { + this.logDao = logDao; + } + + public static void init(Dao<Log,Integer> logDao) { + instance = new LoggingHelper(logDao); + } + + public static synchronized LoggingHelper getInstance() { + return instance; + } + + public void log(String description, String ip, String endpoint) { + Log log = Log.builder() + .endpoint(endpoint) + .originIp(ip) + .requestDesc(description) + .requestTime(new Timestamp(System.currentTimeMillis())) + .build(); + + try { + logDao.create(log); + } catch (SQLException ignored) { + System.out.println(ignored); + } + } + +} diff --git a/src/main/java/com/kms/dto/EmailReq.java b/src/main/java/com/kms/dto/EmailReq.java new file mode 100644 index 0000000..bb417f5 --- /dev/null +++ b/src/main/java/com/kms/dto/EmailReq.java @@ -0,0 +1,19 @@ +package com.kms.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +public class EmailReq { + + private String recipient; + private String cc; + private String subject; + private String body; + +} diff --git a/src/main/java/com/kms/dto/PaymentHistoryResp.java b/src/main/java/com/kms/dto/PaymentHistoryResp.java new file mode 100644 index 0000000..754d586 --- /dev/null +++ b/src/main/java/com/kms/dto/PaymentHistoryResp.java @@ -0,0 +1,21 @@ +package com.kms.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.sql.Timestamp; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +public class PaymentHistoryResp { + + private String paymentInitTime; + private String paymentPaidTime; + private double amount; + private String description; + +} diff --git a/src/main/java/com/kms/dto/PaymentInitReq.java b/src/main/java/com/kms/dto/PaymentInitReq.java new file mode 100644 index 0000000..2bf3707 --- /dev/null +++ b/src/main/java/com/kms/dto/PaymentInitReq.java @@ -0,0 +1,21 @@ +package com.kms.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +@Getter @Setter +@AllArgsConstructor +@NoArgsConstructor +@XmlRootElement +public class PaymentInitReq { + + private double amount; + private String description; + private String initiatorId; + +} diff --git a/src/main/java/com/kms/dto/PaymentInitResp.java b/src/main/java/com/kms/dto/PaymentInitResp.java new file mode 100644 index 0000000..e9e18c3 --- /dev/null +++ b/src/main/java/com/kms/dto/PaymentInitResp.java @@ -0,0 +1,17 @@ +package com.kms.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +public class PaymentInitResp { + + private Integer paymentId; + private boolean success; + +} diff --git a/src/main/java/com/kms/dto/PaymentStatusResp.java b/src/main/java/com/kms/dto/PaymentStatusResp.java new file mode 100644 index 0000000..d24d0cd --- /dev/null +++ b/src/main/java/com/kms/dto/PaymentStatusResp.java @@ -0,0 +1,19 @@ +package com.kms.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class PaymentStatusResp { + + private Boolean paid; + private String description; + +} diff --git a/src/main/java/com/kms/handler/LogHandler.java b/src/main/java/com/kms/handler/LogHandler.java new file mode 100644 index 0000000..d9d5a49 --- /dev/null +++ b/src/main/java/com/kms/handler/LogHandler.java @@ -0,0 +1,61 @@ +package com.kms.handler; + +import com.kms.crosscut.LoggingHelper; +import com.sun.net.httpserver.HttpExchange; +import com.sun.xml.ws.developer.JAXWSProperties; + +import javax.xml.namespace.QName; +import javax.xml.soap.SOAPBody; +import javax.xml.soap.SOAPException; +import javax.xml.ws.handler.MessageContext; +import javax.xml.ws.handler.soap.SOAPHandler; +import javax.xml.ws.handler.soap.SOAPMessageContext; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.net.InetSocketAddress; +import java.util.Set; + +public class LogHandler implements SOAPHandler<SOAPMessageContext> { + + @Override + public Set<QName> getHeaders() { + return null; + } + + @Override + public boolean handleMessage(SOAPMessageContext soapMessageContext) { + boolean messageHandled = (boolean) soapMessageContext.getOrDefault("messageHandled", false); + + if (messageHandled) { + return true; + } + + soapMessageContext.put("messageHandled", true); + + HttpExchange exchange = (HttpExchange)soapMessageContext.get(JAXWSProperties.HTTP_EXCHANGE); + InetSocketAddress remoteAddress = exchange.getRemoteAddress(); + String remoteHost = remoteAddress.getHostName(); + + try { + SOAPBody soapBody = soapMessageContext.getMessage().getSOAPBody(); + OutputStream outputStream = new ByteArrayOutputStream(); + soapMessageContext.getMessage().writeTo(outputStream); + + LoggingHelper loggingHelper = LoggingHelper.getInstance(); + loggingHelper.log(outputStream.toString(), remoteHost, soapBody.getChildNodes().item(1).getNodeName()); + } catch (SOAPException | IOException ignored) { + } + return true; + } + + @Override + public boolean handleFault(SOAPMessageContext soapMessageContext) { + return false; + } + + @Override + public void close(MessageContext messageContext) { + + } +} diff --git a/src/main/java/com/kms/model/Log.java b/src/main/java/com/kms/model/Log.java new file mode 100644 index 0000000..a2e683d --- /dev/null +++ b/src/main/java/com/kms/model/Log.java @@ -0,0 +1,34 @@ +package com.kms.model; + +import com.j256.ormlite.field.DatabaseField; +import com.j256.ormlite.table.DatabaseTable; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.sql.Timestamp; + +@AllArgsConstructor +@Getter +@Setter +@NoArgsConstructor +@DatabaseTable(tableName = "log") +@Builder +public class Log { + + @DatabaseField(generatedId = true, columnName = "log_id") + private Integer id; + @DatabaseField(columnName = "request_description") + private String requestDesc; + @DatabaseField(columnName = "origin_ip") + private String originIp; + @DatabaseField(columnName = "endpoint") + private String endpoint; + @DatabaseField(columnName = "request_time") + private Timestamp requestTime; + @DatabaseField(columnName = "caller_id") + private String callerId; + +} diff --git a/src/main/java/com/kms/model/Payment.java b/src/main/java/com/kms/model/Payment.java new file mode 100644 index 0000000..89fba01 --- /dev/null +++ b/src/main/java/com/kms/model/Payment.java @@ -0,0 +1,36 @@ +package com.kms.model; + +import com.j256.ormlite.field.DatabaseField; +import com.j256.ormlite.table.DatabaseTable; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.sql.Timestamp; + +@AllArgsConstructor +@Getter @Setter +@NoArgsConstructor +@DatabaseTable(tableName = "payment") +@Builder +public class Payment { + + @DatabaseField(generatedId = true, columnName = "payment_id") + private Integer paymentId; + @DatabaseField(columnName = "amount") + private double amount; + @DatabaseField(columnName = "payment_init_time") + private Timestamp paymentInitTime; + @DatabaseField(columnName = "status_paid") + private boolean paid; + @DatabaseField(columnName = "payment_paid_time") + private Timestamp paymentPaidTime; + @DatabaseField(columnName = "description") + private String description; + @DatabaseField(columnName = "initiator_id") + private String initiatorId; + + +} diff --git a/src/main/java/com/kms/repository/LogRepository.java b/src/main/java/com/kms/repository/LogRepository.java new file mode 100644 index 0000000..4efdb0c --- /dev/null +++ b/src/main/java/com/kms/repository/LogRepository.java @@ -0,0 +1,34 @@ +package com.kms.repository; + +import com.j256.ormlite.dao.Dao; +import com.j256.ormlite.dao.DaoManager; +import com.j256.ormlite.jdbc.JdbcConnectionSource; +import com.j256.ormlite.support.ConnectionSource; +import com.kms.crosscut.LoggingHelper; +import com.kms.model.Log; +import lombok.RequiredArgsConstructor; + +import java.sql.SQLException; + +@RequiredArgsConstructor +public class LogRepository { + + private final Dao<Log,Integer> logDao; + private static LogRepository instance; + + private static void init() { + try { + String databaseUrl = "jdbc:mysql://localhost:3306/db?user=user&password=password"; + ConnectionSource connectionSource = new JdbcConnectionSource(databaseUrl); + instance = new LogRepository(DaoManager.createDao(connectionSource, Log.class)); + } catch (SQLException e) { + } + } + + public static synchronized LogRepository getInstance() { + return instance; + } + + + +} diff --git a/src/main/java/com/kms/repository/PaymentRepository.java b/src/main/java/com/kms/repository/PaymentRepository.java new file mode 100644 index 0000000..7ab4d24 --- /dev/null +++ b/src/main/java/com/kms/repository/PaymentRepository.java @@ -0,0 +1,33 @@ +package com.kms.repository; + +import com.j256.ormlite.dao.Dao; +import com.j256.ormlite.dao.DaoManager; +import com.j256.ormlite.jdbc.JdbcConnectionSource; +import com.j256.ormlite.support.ConnectionSource; +import com.kms.model.Log; +import com.kms.model.Payment; +import lombok.RequiredArgsConstructor; + +import java.sql.SQLException; + +@RequiredArgsConstructor +public class PaymentRepository { + + private final Dao<Payment,Integer> paymentDao; + private static PaymentRepository instance; + + private static void init() { + try { + String databaseUrl = "jdbc:mysql://localhost:3306/db?user=user&password=password"; + ConnectionSource connectionSource = new JdbcConnectionSource(databaseUrl); + instance = new PaymentRepository(DaoManager.createDao(connectionSource, Payment.class)); + } catch (SQLException e) { + } + } + + public static synchronized PaymentRepository getInstance() { + return instance; + } + + +} diff --git a/src/main/java/com/kms/service/EmailService.java b/src/main/java/com/kms/service/EmailService.java new file mode 100644 index 0000000..fbf0234 --- /dev/null +++ b/src/main/java/com/kms/service/EmailService.java @@ -0,0 +1,22 @@ +package com.kms.service; + +import com.kms.util.EmailUtil; + +public class EmailService { + + public static void send(String recipient, String cc, String subject, String body) { + if (recipient == null || recipient.isEmpty() || !EmailUtil.isEmailValid(recipient)) { + return; + } + + for (String x: cc.split(",")) { + x = x.trim(); + if (!EmailUtil.isEmailValid(x)) { + return; + } + } + + // TODO: send with smtp + } + +} diff --git a/src/main/java/com/kms/service/PaymentHistoryService.java b/src/main/java/com/kms/service/PaymentHistoryService.java new file mode 100644 index 0000000..81fd853 --- /dev/null +++ b/src/main/java/com/kms/service/PaymentHistoryService.java @@ -0,0 +1,48 @@ +package com.kms.service; + +import com.j256.ormlite.dao.Dao; +import com.kms.dto.EmailReq; +import com.kms.dto.PaymentHistoryResp; + +import com.kms.model.Payment; +import lombok.RequiredArgsConstructor; + +import javax.jws.HandlerChain; +import javax.jws.WebMethod; +import javax.jws.WebParam; +import javax.jws.WebService; +import java.sql.SQLException; +import java.util.List; + +@WebService +@RequiredArgsConstructor +@HandlerChain(file = "handlers.xml") +public class PaymentHistoryService { + + private final Dao<Payment,Integer> paymentDao; + + @WebMethod + public List<PaymentHistoryResp> getPaymentHistory(@WebParam(name = "initiatorId") String initiatorId, + @WebParam(name = "sendMail") boolean sendMail, + @WebParam(name = "mailData") EmailReq emailReq) { + try { + Payment filter = Payment.builder() + .initiatorId(initiatorId) + .paid(true) + .build(); + List<Payment> payments = paymentDao.queryForMatching(filter); + + if (sendMail && emailReq != null) { + EmailService.send(emailReq.getRecipient(), emailReq.getCc(), emailReq.getSubject(), emailReq.getBody()); + } + + return payments.stream() + .map(el -> new PaymentHistoryResp(el.getPaymentInitTime().toString(), el.getPaymentPaidTime().toString(), + el.getAmount(), el.getDescription())) + .toList(); + } catch (SQLException e) { + throw new RuntimeException(e); + } + } + +} diff --git a/src/main/java/com/kms/service/PaymentService.java b/src/main/java/com/kms/service/PaymentService.java new file mode 100644 index 0000000..1ebe4e5 --- /dev/null +++ b/src/main/java/com/kms/service/PaymentService.java @@ -0,0 +1,58 @@ +package com.kms.service; + +import com.j256.ormlite.dao.Dao; +import com.kms.dto.PaymentInitReq; +import com.kms.dto.PaymentInitResp; +import com.kms.dto.PaymentStatusResp; +import com.kms.model.Payment; +import lombok.RequiredArgsConstructor; + +import javax.annotation.Resource; +import javax.jws.HandlerChain; +import javax.jws.WebMethod; +import javax.jws.WebParam; +import javax.jws.WebService; +import java.sql.SQLException; +import java.sql.Timestamp; + +@WebService +@HandlerChain(file = "handlers.xml") +@RequiredArgsConstructor +public class PaymentService { + + private final Dao<Payment,Integer> paymentDao; + + + @WebMethod + public PaymentInitResp initPayment(@WebParam(name = "req") PaymentInitReq req) { + Payment payment = Payment.builder() + .amount(req.getAmount()) + .paymentInitTime(new Timestamp(System.currentTimeMillis())) + .initiatorId(req.getInitiatorId()) + .description(req.getDescription()) + .build(); + + try { + paymentDao.create(payment); + } catch (SQLException e) { + return new PaymentInitResp(null, false); + } + + return new PaymentInitResp(payment.getPaymentId(), true); + } + + @WebMethod + public PaymentStatusResp checkPaymentStatus(@WebParam(name = "paymentId") Integer paymentId) { + try { + Payment payment = paymentDao.queryForId(paymentId); + + if (payment == null) { + return new PaymentStatusResp(null, "Payment id not found"); + } + + return new PaymentStatusResp(payment.isPaid(), null); + } catch (SQLException e) { + return new PaymentStatusResp(null, "Unexpected error has happened"); + } + } +} diff --git a/src/main/java/com/kms/task/PaymentCompletorTask.java b/src/main/java/com/kms/task/PaymentCompletorTask.java new file mode 100644 index 0000000..592a2f9 --- /dev/null +++ b/src/main/java/com/kms/task/PaymentCompletorTask.java @@ -0,0 +1,32 @@ +package com.kms.task; + +import com.j256.ormlite.dao.Dao; +import com.kms.model.Payment; + +import java.sql.SQLException; +import java.util.List; +import java.util.TimerTask; + +public class PaymentCompletorTask extends TimerTask { + + private final Dao<Payment, Integer> paymentDao; + + public PaymentCompletorTask(Dao<Payment, Integer> paymentDao) { + this.paymentDao = paymentDao; + } + + @Override + public void run() { + try { + List<Payment> paymentsNotDone = paymentDao.queryForEq("status_paid", 0); + + for (Payment p: paymentsNotDone) { + p.setPaid(true); + paymentDao.update(p); + } + } catch (SQLException e) { + throw new RuntimeException(e); + } + + } +} diff --git a/src/main/java/com/kms/util/EmailUtil.java b/src/main/java/com/kms/util/EmailUtil.java new file mode 100644 index 0000000..99f4928 --- /dev/null +++ b/src/main/java/com/kms/util/EmailUtil.java @@ -0,0 +1,18 @@ +package com.kms.util; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class EmailUtil { + + private static final String EMAIL_PATTERN = + "^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$"; + + private static final Pattern pattern = Pattern.compile(EMAIL_PATTERN); + + public static boolean isEmailValid(String email) { + Matcher matcher = pattern.matcher(email); + return matcher.matches(); + } + +} diff --git a/src/main/resources/handlers.xml b/src/main/resources/handlers.xml new file mode 100644 index 0000000..033b4d9 --- /dev/null +++ b/src/main/resources/handlers.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<handler-chains xmlns="http://java.sun.com/xml/ns/javaee"> + <handler-chain> + <handler> + <handler-class>com.kms.handler.LogHandler</handler-class> + </handler> + </handler-chain> +</handler-chains> -- GitLab