org.dfr.dfr.worker.MemberWorker.java Source code

Java tutorial

Introduction

Here is the source code for org.dfr.dfr.worker.MemberWorker.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package org.dfr.dfr.worker;

import io.vertx.core.AbstractVerticle;
import io.vertx.core.Future;
import io.vertx.core.json.Json;
import io.vertx.core.json.JsonArray;
import io.vertx.core.json.JsonObject;
import io.vertx.ext.jdbc.JDBCClient;
import io.vertx.ext.sql.ResultSet;
import io.vertx.ext.sql.SQLConnection;
import io.vertx.ext.sql.UpdateResult;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Set;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import org.dfr.dfr.ErrorCode;
import org.dfr.dfr.request.AddAssetRequest;
import org.dfr.dfr.request.ChangePasswordRequest;
import org.dfr.dfr.request.GeneralResponse;
import org.dfr.dfr.request.GetAssetRequest;
import org.dfr.dfr.request.MemberRegisterRequest;
import org.dfr.dfr.request.ProfileRequest;
import org.dfr.dfr.request.ProfileUpdateRequest;
import org.dfr.dfr.request.UpdateAssetRequest;

/**
 *
 * @author fian.manafe
 */
public class MemberWorker extends AbstractVerticle {

    @Override
    public void start(Future<Void> fut) {
        JsonObject config = new JsonObject();
        config.put("url", "jdbc:mysql://localhost:3306/latihan");
        config.put("driver_class", "com.mysql.jdbc.Driver");
        config.put("user", "root");
        config.put("password", "admin");
        JDBCClient client = JDBCClient.createShared(vertx, config, "memberds");
        final Validator v = Validation.buildDefaultValidatorFactory().getValidator();
        SimpleDateFormat mysqlFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        vertx.eventBus().consumer("MemberWorker#Register").handler(h -> {
            MemberRegisterRequest req = null;
            try {
                req = Json.decodeValue(h.body().toString(), MemberRegisterRequest.class);
            } catch (Exception e) {
                h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.INVALID_JSON)));
                return;
            }
            Set<ConstraintViolation<MemberRegisterRequest>> vr = v.validate(req);
            if (!vr.isEmpty()) {
                h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.INVALID_JSON)
                        .setMessage(vr.iterator().next().getMessage())));
                return;
            }
            final MemberRegisterRequest r = req;
            final HashMap<String, Object> smap = new HashMap();

            client.getConnection(ch -> {
                if (ch.succeeded()) {
                    SQLConnection c = ch.result();
                    Future<Void> f1 = Future.future();
                    c.setAutoCommit(false, f1.completer());
                    f1.compose(o -> {
                        Future<ResultSet> f2 = Future.future();
                        c.queryWithParams("select username from member where username=?",
                                new JsonArray().add(r.getUsername()), f2.completer());
                        return f2;
                    }).compose(res -> {
                        Future<ResultSet> f2 = Future.future();
                        if (res.getNumRows() != 0) {
                            f2.fail(ErrorCode.USER_EXIST);
                        } else {
                            c.queryWithParams("select email from member where email=?",
                                    new JsonArray().add(r.getEmail()), f2.completer());
                        }
                        return f2;
                    }).compose(res -> {
                        if (res.getNumRows() > 0) {
                            return Future.failedFuture(ErrorCode.EMAIL_EXIST);
                        } else {
                            try {
                                r.setPassword(hash(r.getPassword()));
                            } catch (Exception e) {
                                return Future.failedFuture(ErrorCode.SERVER_ERROR);
                            }
                            Future<UpdateResult> f2 = Future.future();
                            c.updateWithParams("insert into member(username,password,email) values (?,?,?)",
                                    new JsonArray().add(r.getUsername()).add(r.getPassword()).add(r.getEmail()),
                                    f2.completer());
                            return f2;
                        }
                    }).compose(res -> {
                        Future<UpdateResult> f2 = Future.future();
                        c.updateWithParams("insert into profile(member_id) values(?)",
                                new JsonArray().add(res.getKeys().getLong(0)), f2.completer());
                        return f2;
                    }).compose(res -> {
                        Future<Void> cfut = Future.future();
                        c.commit(cfut.completer());
                        return cfut;
                    }).setHandler(ch1 -> {
                        if (ch1.succeeded()) {
                            c.close(close -> {
                                h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.COMPLETE)));
                            });
                        } else {
                            c.rollback(rr -> {
                                c.close(close -> {
                                    h.reply(Json.encode(new GeneralResponse().setCode(ch1.cause().getMessage())
                                            .setMessage(ErrorCode.getMessage(ch1.cause().getMessage()))));
                                });
                            });
                        }
                    });
                } else {
                    h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.SERVER_ERROR)
                            .setMessage(ErrorCode.getMessage(ErrorCode.SERVER_ERROR))));
                }
            });
        });

        vertx.eventBus().consumer("MemberWorker#ProfileUpdate").handler(h -> {
            ProfileUpdateRequest req = null;
            try {
                req = Json.decodeValue(h.body().toString(), ProfileUpdateRequest.class);
            } catch (Exception e) {
                h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.INVALID_JSON)));
                return;
            }
            Set<ConstraintViolation<ProfileUpdateRequest>> vr = v.validate(req);
            if (!vr.isEmpty()) {
                h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.INVALID_JSON)
                        .setMessage(vr.iterator().next().getMessage())));
                return;
            }

            ProfileUpdateRequest rq = req;

            client.getConnection(connection -> {
                if (connection.succeeded()) {
                    HashMap<String, Object> sm = new HashMap<String, Object>();
                    SQLConnection con = connection.result();
                    Future<Void> ac = Future.future();
                    con.setAutoCommit(false, ac.completer());
                    ac.compose(rv -> {
                        Future<ResultSet> lock = Future.future();
                        con.queryWithParams(
                                "select p.* from profile p inner join member m on p.member_id=m.member_id where m.username=? and m.password=? for update",
                                new JsonArray().add(rq.getUsername()).add(rq.getPassword()), lock.completer());
                        return lock;
                    }).compose(r -> {
                        if (r.getNumRows() == 0) {
                            return Future.failedFuture(ErrorCode.USERNAME_PASSWORD_NOT_MATCH);
                        }
                        long member_id = r.getRows().iterator().next().getLong("member_id");
                        Future<UpdateResult> up = Future.future();
                        con.updateWithParams(
                                "update profile set name=?, phone=?, address=?, company_name=?, company_address=? where member_id=?",
                                new JsonArray().add(rq.getName()).add(rq.getPhone()).add(rq.getAddress())
                                        .add(rq.getCompanyName()).add(rq.getCompanyAddress()).add(member_id),
                                up.completer());
                        return up;
                    }).compose(ok -> {
                        Future<Void> commitFu = Future.future();
                        con.commit(commitFu.completer());
                        return commitFu;
                    }).setHandler(th -> {
                        if (th.succeeded()) {
                            con.close(cr -> {
                                h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.COMPLETE)));
                            });
                        } else {
                            con.rollback(rh -> {
                                con.close(cl -> {
                                    h.reply(Json.encode(new GeneralResponse().setCode(th.cause().getMessage())
                                            .setMessage(ErrorCode.getMessage(th.cause().getMessage()))));
                                });
                            });
                        }
                    });
                } else {
                    h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.SERVER_ERROR)
                            .setMessage(ErrorCode.getMessage(ErrorCode.SERVER_ERROR))));
                }
            });
        });

        vertx.eventBus().consumer("MemberWorker#GetProfile").handler(h -> {
            ProfileRequest req = null;
            try {
                req = Json.decodeValue(h.body().toString(), ProfileRequest.class);
            } catch (Exception e) {
                h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.INVALID_JSON)));
                return;
            }

            Set<ConstraintViolation<ProfileRequest>> rV = v.validate(req);

            if (!rV.isEmpty()) {
                h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.INVALID_JSON)));
                return;
            }

            final ProfileRequest r = req;

            client.getConnection(cH -> {
                if (cH.succeeded()) {
                    SQLConnection c = cH.result();
                    Future<Void> f = Future.future();
                    c.setAutoCommit(true, f.completer());
                    f.compose(res -> {
                        Future<ResultSet> f0 = Future.future();
                        c.queryWithParams("select member_id from member m where m.username=? and m.password=?",
                                new JsonArray().add(r.getUsername()).add(r.getPassword()), f0.completer());
                        return f0;
                    }).compose(res -> {
                        Future<ResultSet> f0 = Future.future();
                        if (res.getNumRows() <= 0) {
                            f0.fail(ErrorCode.USERNAME_PASSWORD_NOT_MATCH);
                        } else {
                            c.queryWithParams("select * from profile where member_id=?",
                                    new JsonArray().add(res.getRows().iterator().next().getLong("member_id")),
                                    f0.completer());
                        }
                        return f0;
                    }).setHandler(rh -> {
                        c.close();
                        if (rh.succeeded()) {
                            h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.COMPLETE)
                                    .setData(rh.result().getRows().get(0))));
                        } else {
                            h.reply(Json.encode(new GeneralResponse().setCode(rh.cause().getMessage())
                                    .setMessage(ErrorCode.getMessage(rh.cause().getMessage()))));
                        }
                    });
                } else {
                    h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.SERVER_ERROR)
                            .setMessage(ErrorCode.getMessage(ErrorCode.SERVER_ERROR))));
                }
            });
        });

        vertx.eventBus().consumer("MemberWorker#ChangePassword").handler(h -> {
            ChangePasswordRequest req = null;
            try {
                req = Json.decodeValue(h.body().toString(), ChangePasswordRequest.class);
            } catch (Exception e) {
                h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.INVALID_JSON)));
                return;
            }
            Set<ConstraintViolation<ChangePasswordRequest>> rV = v.validate(req);
            if (!rV.isEmpty()) {
                h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.INVALID_JSON)));
                return;
            }
            final ChangePasswordRequest r = req;

            client.getConnection(connection -> {
                if (connection.succeeded()) {
                    SQLConnection c = connection.result();
                    Future<Void> f1 = Future.future();
                    c.setAutoCommit(false, f1.completer());
                    f1.compose(vo -> {
                        Future<ResultSet> f = Future.future();
                        c.queryWithParams("select member_id from member where username=? and password=? for update",
                                new JsonArray().add(r.getUsername()).add(r.getPassword()), f.completer());
                        return f;
                    }).compose(res -> {
                        Future<UpdateResult> f0 = Future.future();
                        if (res.getNumRows() <= 0) {
                            f0.fail(ErrorCode.USERNAME_PASSWORD_NOT_MATCH);
                        } else {
                            long member_id = res.getRows().iterator().next().getLong("member_id");
                            String hash = null;
                            try {
                                hash = hash(r.getNewPassword());
                            } catch (Exception e) {
                                return Future.failedFuture(ErrorCode.SERVER_ERROR);
                            }
                            c.updateWithParams("update member set password=? where member_id=?",
                                    new JsonArray().add(hash).add(member_id), f0.completer());
                        }
                        return f0;
                    }).compose(res -> {
                        Future<Void> cf = Future.future();
                        c.commit(cf.completer());
                        return cf;
                    }).setHandler(ch -> {
                        if (ch.succeeded()) {
                            c.close();
                            h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.COMPLETE)));
                        } else {
                            ch.cause().printStackTrace();
                            c.rollback(rh -> {
                                c.close();
                                h.reply(Json.encode(new GeneralResponse().setCode(ch.cause().getMessage())
                                        .setMessage(ErrorCode.getMessage(ch.cause().getMessage()))));
                            });
                        }
                    });
                } else {
                    h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.SERVER_ERROR)
                            .setMessage(ErrorCode.getMessage(ErrorCode.SERVER_ERROR))));
                }
            });
        });

        vertx.eventBus().consumer("MembrWorker#AddAsset").handler(h -> {
            AddAssetRequest req = null;
            try {
                req = Json.decodeValue(h.body().toString(), AddAssetRequest.class);
            } catch (Exception e) {
                h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.INVALID_JSON)));
                return;
            }
            Set<ConstraintViolation<AddAssetRequest>> res = v.validate(req);
            if (!res.isEmpty()) {
                h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.INVALID_JSON)
                        .setMessage(res.iterator().next().getMessage())));
                return;
            }

            AddAssetRequest r = req;

            client.getConnection(connection -> {
                if (connection.succeeded()) {
                    SQLConnection con = connection.result();
                    Future<Void> f = Future.future();
                    con.setAutoCommit(false, f.completer());
                    f.compose(vo -> {
                        Future<ResultSet> f1 = Future.future();
                        con.queryWithParams("select * from member where username=? and password=?",
                                new JsonArray().add(r.getUsername()).add(r.getPassword()), f1.completer());
                        return f1;
                    }).compose(re -> {
                        Future<UpdateResult> f1 = Future.future();
                        if (re.getNumRows() <= 0) {
                            System.out.println(Json.encode(re));
                            System.out.println(Json.encode(r));
                            f1.fail(ErrorCode.USERNAME_PASSWORD_NOT_MATCH);
                        } else {
                            long member_id = re.getRows().iterator().next().getLong("member_id");
                            con.updateWithParams(
                                    "insert into assets (member_id,debit_credit,asset_name,asset_value,date_time,description) values(?,?,?,?,?,?)",
                                    new JsonArray().add(member_id).add(r.getDebitCredit()).add(r.getAssetName())
                                            .add(r.getAssetValue()).add(mysqlFormat.format(new Date()))
                                            .add(r.getDescription()),
                                    f1.completer());
                        }
                        return f1;
                    }).compose(re -> {
                        Future<Void> end = Future.future();
                        con.commit(end.completer());
                        return end;
                    }).setHandler(ch -> {
                        if (ch.succeeded()) {
                            con.close();
                            h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.COMPLETE)));
                        } else {
                            con.rollback(rh -> {
                                con.close();
                                h.reply(Json.encode(new GeneralResponse().setCode(ch.cause().getMessage())
                                        .setMessage(ErrorCode.getMessage(ch.cause().getMessage()))));
                            });
                        }
                    });
                } else {
                    h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.SERVER_ERROR)
                            .setMessage(ErrorCode.getMessage(ErrorCode.SERVER_ERROR))));
                }
            });
        });

        vertx.eventBus().consumer("AssetWorker#GetAsset").handler(h -> {

            GetAssetRequest req = null;
            try {
                req = Json.decodeValue(h.body().toString(), GetAssetRequest.class);
            } catch (Exception e) {
                h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.INVALID_JSON)));
                return;
            }
            Set<ConstraintViolation<GetAssetRequest>> res = v.validate(req);
            if (!res.isEmpty()) {
                h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.INVALID_JSON)
                        .setMessage(res.iterator().next().getMessage())));
                return;
            }

            GetAssetRequest r = req;

            client.getConnection(connection -> {
                if (connection.succeeded()) {
                    SQLConnection c = connection.result();
                    Future<Void> vo = Future.future();
                    c.setAutoCommit(true, vo.completer());
                    vo.compose(re -> {
                        Future<ResultSet> f0 = Future.future();
                        c.queryWithParams("select member_id from member where username=? and password=?",
                                new JsonArray().add(r.getUsername()).add(r.getPassword()), f0.completer());
                        return f0;
                    }).compose(re -> {
                        Future<ResultSet> f0 = Future.future();
                        if (re.getNumRows() <= 0) {
                            f0.fail(ErrorCode.USERNAME_PASSWORD_NOT_MATCH);
                        } else {
                            long member_id = re.getRows().iterator().next().getLong("member_id");
                            c.queryWithParams("select * from assets where member_id=?",
                                    new JsonArray().add(member_id), f0.completer());
                        }
                        return f0;
                    }).setHandler(resp -> {
                        if (resp.succeeded()) {
                            h.reply(Json.encodePrettily(new GeneralResponse().setCode(ErrorCode.COMPLETE)
                                    .setData(resp.result().getRows())));
                        } else {
                            h.reply(Json.encode(new GeneralResponse().setCode(resp.cause().getMessage())
                                    .setMessage(ErrorCode.getMessage(resp.cause().getMessage()))));
                        }
                        c.close();
                    });
                } else {
                    h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.SERVER_ERROR)
                            .setMessage(connection.cause().getMessage())));
                }
            });
        });

        vertx.eventBus().consumer("AssetWorker#UpdateAsset").handler(h -> {

            UpdateAssetRequest req = null;
            try {
                req = Json.decodeValue(h.body().toString(), UpdateAssetRequest.class);
            } catch (Exception e) {
                h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.INVALID_JSON)));
                return;
            }

            Set<ConstraintViolation<UpdateAssetRequest>> res = v.validate(req);

            if (!res.isEmpty()) {
                h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.INVALID_JSON)
                        .setMessage(res.iterator().next().getMessage())));
                return;
            }

            final UpdateAssetRequest r = req;

            client.getConnection(connection -> {
                if (connection.succeeded()) {
                    SQLConnection con = connection.result();
                    Future<Void> f = Future.future();
                    con.setAutoCommit(false, f.completer());
                    f.compose(vo -> {
                        Future<ResultSet> f0 = Future.future();
                        con.queryWithParams("select member_id from member where username=? and password=?",
                                new JsonArray().add(r.getUsername()).add(r.getPassword()), f0.completer());
                        return f0;
                    }).compose(rs -> {
                        Future<ResultSet> f0 = Future.future();
                        if (rs.getNumRows() <= 0) {
                            f0.fail(ErrorCode.USERNAME_PASSWORD_NOT_MATCH);
                        } else {
                            long member_id = rs.getRows().iterator().next().getLong("member_id");
                            con.queryWithParams("select * from assets where asset_id=? and member_id=? for update",
                                    new JsonArray().add(r.getAssetId()).add(member_id), f0.completer());
                        }
                        return f0;
                    }).compose(rs -> {
                        Future<UpdateResult> f0 = Future.future();
                        con.updateWithParams(
                                "update assets set debit_credit=?,asset_name=?,asset_value=?,date_time=?,description=? where asset_id=?",
                                new JsonArray().add(r.getDebitCredit()).add(r.getAssetName()).add(r.getAssetValue())
                                        .add(mysqlFormat.format(new Date())).add(r.getDescription())
                                        .add(r.getAssetId()),
                                f0.completer());
                        return f0;
                    }).compose(rs -> {
                        Future<Void> cf = Future.future();
                        con.commit(cf.completer());
                        return cf;
                    }).setHandler(sh -> {
                        if (sh.succeeded()) {
                            con.close();
                            h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.COMPLETE)));
                        } else {
                            con.rollback(rh -> {
                                con.close();
                                h.reply(Json.encode(new GeneralResponse().setCode(sh.cause().getMessage())
                                        .setMessage(ErrorCode.getMessage(sh.cause().getMessage()))));
                            });
                        }
                    });
                } else {
                    h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.SERVER_ERROR)));
                }
            });
        });

        fut.complete();
    }

    static String hash(String input) throws NoSuchAlgorithmException {
        MessageDigest mDigest = MessageDigest.getInstance("SHA-512");
        byte[] result = mDigest.digest(input.getBytes());
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < result.length; i++) {
            sb.append(Integer.toString((result[i] & 0xff) + 0x100, 16).substring(1));
        }
        return sb.toString();
    }

}