From 11e15bc218218a9bd3ad4114b5be6ec375bb3bd3 Mon Sep 17 00:00:00 2001 From: ChirkinaTanya Date: Fri, 28 Feb 2020 23:52:15 +0300 Subject: [PATCH 1/3] Issue #81 added interface PersonalDataService and common features of the PersonalDataServiceImpl --- .../serviceimpl/PersonalDataServiceImpl.java | 123 ++++++++++++++++++ .../services/PersonalDataService.java | 18 +++ 2 files changed, 141 insertions(+) create mode 100644 src/main/java/com/ifmo/epampractice/serviceimpl/PersonalDataServiceImpl.java create mode 100644 src/main/java/com/ifmo/epampractice/services/PersonalDataService.java diff --git a/src/main/java/com/ifmo/epampractice/serviceimpl/PersonalDataServiceImpl.java b/src/main/java/com/ifmo/epampractice/serviceimpl/PersonalDataServiceImpl.java new file mode 100644 index 0000000..b55369a --- /dev/null +++ b/src/main/java/com/ifmo/epampractice/serviceimpl/PersonalDataServiceImpl.java @@ -0,0 +1,123 @@ +package com.ifmo.epampractice.serviceimpl; + +import com.ifmo.epampractice.dao.UsersDao; +import com.ifmo.epampractice.entity.DrivingLicenseEntity; +import com.ifmo.epampractice.entity.PassportEntity; +import com.ifmo.epampractice.entity.UsersEntity; +import com.ifmo.epampractice.services.PasswordHashService; +import com.ifmo.epampractice.services.PersonalDataService; +import com.ifmo.epampractice.security.SecureString; + +import java.time.LocalDate; + +public class PersonalDataServiceImpl implements PersonalDataService { + + private UsersDao usersDao; + // private PassportDao passportDao; after merge + private PasswordHashService passwordHashService; + + @Override + public PassportEntity changePassport(int userId, String issueCountry, String issuer, LocalDate issueDate, + LocalDate expirationDate, String serialNumber) { + UsersEntity usersEntity = usersDao.get(userId); + //PassportEntity passportEntity = passportDao.get(usersEntity.getPassId()); after merge + if (usersEntity == null){ + throw new RuntimeException(); + } + if (passportEntity == null){ + return createPassport(usersEntity, issueCountry, issuer, issueDate, expirationDate, serialNumber); + } + else { + return updatePassport(passportEntity, issueCountry, issuer, issueDate, expirationDate, serialNumber); + } + + + } + + private PassportEntity createPassport(UsersEntity usersEntity, String issueCountry, String issuer, LocalDate issueDate, + LocalDate expirationDate, String serialNumber){ + validatePassport(issueCountry, issuer, issueDate, expirationDate, serialNumber); + + PassportEntity passportEntity = new PassportEntity(0,issueCountry, issuer, issueDate, expirationDate, + serialNumber); + //passportDAO.save(passportEntity); after merge + //add getBySerialNumber in PassportDao to get Id for new passport + //update userEntity with Id of new passport + //return passportEntity + return null; + } + private PassportEntity updatePassport(PassportEntity passportEntity, String issueCountry, String issuer, LocalDate issueDate, + LocalDate expirationDate, String serialNumber){ + validatePassport(issueCountry, issuer, issueDate, expirationDate, serialNumber); + //passportEntity.set set all fields + //update passportEntity + //return passportEntity + return null; + } + @Override + public DrivingLicenseEntity changeDrivingLicence(int userId, LocalDate issueDate, LocalDate expirationDate, + String serialNumber) { + //here will be two methods to create drivingLicenseEntity and to update it + //need method to get drivingLicenseEntity by serial number in Dao + //need method to validate data + //return drivingLicenceEntity + return null; + } + + @Override + public UsersEntity changeUserData(int id, String email, SecureString password, String name, + String contactPhone, String address) { + UsersEntity usersEntity = usersDao.get(id); + validateUserData(email, password, name, contactPhone, address); + usersEntity.setEmail(email); + String passwordHash = passwordHashService.getHash(password); + usersEntity.setPasswordHash(passwordHash); + usersEntity.setName(name); + usersEntity.setContactPhone(contactPhone); + usersEntity.setAddress(address); + usersDao.update(usersEntity); + return usersEntity; + } + + private static final String PHONE_REGEX = "[\\d\\s\\(\\)\\+]+"; + + private void validateUserData(String email, SecureString password, String name, + String phone, String address) throws RuntimeException { + if (email == null || email.length() == 0) { + throw new RuntimeException("Email not specified."); + } + if (password == null) { + throw new RuntimeException("Password is not specified."); + } + if (name == null || name.length() == 0) { + throw new RuntimeException("Name is not specified."); + } + if (phone == null || phone.length() == 0) { + throw new RuntimeException("Phone number is not specified."); + } + if (!phone.matches(PHONE_REGEX)) { + throw new RuntimeException("Phone number may only contain digits, spaces, parentheses and '+' sign."); + } + if (address == null || address.length() == 0) { + throw new RuntimeException("Address is not specified."); + } + } + private void validatePassport (String issueCountry, String issuer, LocalDate issueDate, + LocalDate expirationDate, String serialNumber) throws RuntimeException { + if (issueCountry == null || issueCountry.length() == 0) { + throw new RuntimeException("IssueCountry not specified."); + } + if (issuer == null || issuer.length() == 0) { + throw new RuntimeException("Issuer is not specified."); + } + if (issueDate == null) { + throw new RuntimeException("IssueDate date is not specified."); + } + if (expirationDate == null) { + throw new RuntimeException("ExpirationDate date is not specified."); + } + if (serialNumber == null || serialNumber.length() == 0) { + throw new RuntimeException("SerialNumber number is not specified."); + } + } +} diff --git a/src/main/java/com/ifmo/epampractice/services/PersonalDataService.java b/src/main/java/com/ifmo/epampractice/services/PersonalDataService.java new file mode 100644 index 0000000..63b4682 --- /dev/null +++ b/src/main/java/com/ifmo/epampractice/services/PersonalDataService.java @@ -0,0 +1,18 @@ +package com.ifmo.epampractice.services; + +import com.ifmo.epampractice.entity.DrivingLicenseEntity; +import com.ifmo.epampractice.entity.PassportEntity; +import com.ifmo.epampractice.entity.UsersEntity; +import com.ifmo.epampractice.enums.UserRole; +import com.ifmo.epampractice.security.SecureString; + +import java.time.LocalDate; + +public interface PersonalDataService { + public PassportEntity changePassport (int userId, String issueCountry, String issuer, LocalDate issueDate, + LocalDate expirationDate, String serialNumber); + public DrivingLicenseEntity changeDrivingLicence (int userId, LocalDate issueDate, LocalDate expirationDate, + String serialNumber); + public UsersEntity changeUserData(int id, String email, SecureString password, String name, + String contactPhone, String address); +} From 76232ae6a8a5e02781ea759ec601e35663eff7d8 Mon Sep 17 00:00:00 2001 From: ChirkinaTanya Date: Sat, 29 Feb 2020 00:48:18 +0300 Subject: [PATCH 2/3] Issue #81 added getBySerialNumber method in PassportDao and PassportDaoImpl, created passportChange and dataChangeUserData methods in PersonalDataServiceImpl --- .../ifmo/epampractice/dao/PassportDao.java | 1 + .../epampractice/daoimpl/PassportDaoImpl.java | 18 +++++++++ .../serviceimpl/PersonalDataServiceImpl.java | 38 ++++++++++++------- 3 files changed, 43 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/ifmo/epampractice/dao/PassportDao.java b/src/main/java/com/ifmo/epampractice/dao/PassportDao.java index 5d58838..a995609 100644 --- a/src/main/java/com/ifmo/epampractice/dao/PassportDao.java +++ b/src/main/java/com/ifmo/epampractice/dao/PassportDao.java @@ -20,4 +20,5 @@ public interface PassportDao extends BasicDaoInterface { @Override void save(PassportEntity PassportEntity); + PassportEntity getBySerialNumber(String serialNumber); } diff --git a/src/main/java/com/ifmo/epampractice/daoimpl/PassportDaoImpl.java b/src/main/java/com/ifmo/epampractice/daoimpl/PassportDaoImpl.java index 74b8178..82ca1d8 100644 --- a/src/main/java/com/ifmo/epampractice/daoimpl/PassportDaoImpl.java +++ b/src/main/java/com/ifmo/epampractice/daoimpl/PassportDaoImpl.java @@ -18,6 +18,7 @@ public class PassportDaoImpl implements PassportDao { private static final String DELETE_QUERY = "DELETE FROM passport WHERE id = ?"; private static final String SAVE_QUERY = "INSERT INTO passport (issue_country, issuer, issue_date," + " expiration_date, serial_number) VALUES (?, ?, ?, ?, ?)"; + private static final String GET_BE_SERIAL_NUMBER_QUERY = "SELECT * FROM passport WHERE serial_number = ?"; private static final Logger logger = LogManager.getLogger(CarDaoImpl.class); @@ -97,6 +98,23 @@ public void save(PassportEntity passportEntity) { } + @Override + public PassportEntity getBySerialNumber(String serialNumber) { + try (Connection connection = dbConnector.getConnection(); + PreparedStatement statement = connection.prepareStatement(GET_BE_SERIAL_NUMBER_QUERY) + ) { + statement.setString(1, serialNumber); + try (ResultSet resultSet = statement.executeQuery()) { + if (resultSet.next()) { + return entityFromResultSet(resultSet); + } + } + } catch (SQLException e) { + logger.error(e); + } + return null; + } + private PassportEntity entityFromResultSet(ResultSet resultSet) throws SQLException { return new PassportEntity( resultSet.getInt("id"), diff --git a/src/main/java/com/ifmo/epampractice/serviceimpl/PersonalDataServiceImpl.java b/src/main/java/com/ifmo/epampractice/serviceimpl/PersonalDataServiceImpl.java index b55369a..a0f2adb 100644 --- a/src/main/java/com/ifmo/epampractice/serviceimpl/PersonalDataServiceImpl.java +++ b/src/main/java/com/ifmo/epampractice/serviceimpl/PersonalDataServiceImpl.java @@ -1,5 +1,6 @@ package com.ifmo.epampractice.serviceimpl; +import com.ifmo.epampractice.dao.PassportDao; import com.ifmo.epampractice.dao.UsersDao; import com.ifmo.epampractice.entity.DrivingLicenseEntity; import com.ifmo.epampractice.entity.PassportEntity; @@ -13,14 +14,20 @@ public class PersonalDataServiceImpl implements PersonalDataService { private UsersDao usersDao; - // private PassportDao passportDao; after merge + private PassportDao passportDao; private PasswordHashService passwordHashService; + public PersonalDataServiceImpl(UsersDao usersDao, PassportDao passportDao, PasswordHashService passwordHashService){ + this.usersDao = usersDao; + this.passportDao = passportDao; + this.passwordHashService = passwordHashService; + } + @Override public PassportEntity changePassport(int userId, String issueCountry, String issuer, LocalDate issueDate, LocalDate expirationDate, String serialNumber) { UsersEntity usersEntity = usersDao.get(userId); - //PassportEntity passportEntity = passportDao.get(usersEntity.getPassId()); after merge + PassportEntity passportEntity = passportDao.get(usersEntity.getPassId()); if (usersEntity == null){ throw new RuntimeException(); } @@ -38,21 +45,24 @@ private PassportEntity createPassport(UsersEntity usersEntity, String issueCount LocalDate expirationDate, String serialNumber){ validatePassport(issueCountry, issuer, issueDate, expirationDate, serialNumber); - PassportEntity passportEntity = new PassportEntity(0,issueCountry, issuer, issueDate, expirationDate, + PassportEntity passportEntity = new PassportEntity(0, issueCountry, issuer, issueDate, expirationDate, serialNumber); - //passportDAO.save(passportEntity); after merge - //add getBySerialNumber in PassportDao to get Id for new passport - //update userEntity with Id of new passport - //return passportEntity - return null; + passportDao.save(passportEntity); + passportEntity = passportDao.getBySerialNumber(passportEntity.getSerialNumber()); + usersEntity.setPassId(passportEntity.getId()); + usersDao.update(usersEntity); + return passportEntity; } - private PassportEntity updatePassport(PassportEntity passportEntity, String issueCountry, String issuer, LocalDate issueDate, - LocalDate expirationDate, String serialNumber){ + private PassportEntity updatePassport(PassportEntity passportEntity, String issueCountry, String issuer, + LocalDate issueDate, LocalDate expirationDate, String serialNumber){ validatePassport(issueCountry, issuer, issueDate, expirationDate, serialNumber); - //passportEntity.set set all fields - //update passportEntity - //return passportEntity - return null; + passportEntity.setIssueCountry(issueCountry); + passportEntity.setIssuer(issuer); + passportEntity.setIssueDate(issueDate); + passportEntity.setExpirationDate(expirationDate); + passportEntity.setSerialNumber(serialNumber); + passportDao.update(passportEntity); + return passportEntity; } @Override public DrivingLicenseEntity changeDrivingLicence(int userId, LocalDate issueDate, LocalDate expirationDate, From 8ff01cbbc6ab1204ab77c57d57871a26d3e6b815 Mon Sep 17 00:00:00 2001 From: ChirkinaTanya Date: Mon, 2 Mar 2020 19:46:14 +0300 Subject: [PATCH 3/3] Issue #81 created changeDrivingLicence method which contains createDrivingLicense and updateDrivingLicense methods, added validateDrivingLicense method --- .../serviceimpl/PersonalDataServiceImpl.java | 90 ++++++++++++++----- 1 file changed, 69 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/ifmo/epampractice/serviceimpl/PersonalDataServiceImpl.java b/src/main/java/com/ifmo/epampractice/serviceimpl/PersonalDataServiceImpl.java index a0f2adb..c7ec2e6 100644 --- a/src/main/java/com/ifmo/epampractice/serviceimpl/PersonalDataServiceImpl.java +++ b/src/main/java/com/ifmo/epampractice/serviceimpl/PersonalDataServiceImpl.java @@ -1,5 +1,6 @@ package com.ifmo.epampractice.serviceimpl; +import com.ifmo.epampractice.dao.DrivingLicenseDao; import com.ifmo.epampractice.dao.PassportDao; import com.ifmo.epampractice.dao.UsersDao; import com.ifmo.epampractice.entity.DrivingLicenseEntity; @@ -15,11 +16,13 @@ public class PersonalDataServiceImpl implements PersonalDataService { private UsersDao usersDao; private PassportDao passportDao; + private DrivingLicenseDao drivingLicenseDao; private PasswordHashService passwordHashService; public PersonalDataServiceImpl(UsersDao usersDao, PassportDao passportDao, PasswordHashService passwordHashService){ this.usersDao = usersDao; this.passportDao = passportDao; + this.drivingLicenseDao = drivingLicenseDao; this.passwordHashService = passwordHashService; } @@ -41,6 +44,40 @@ public PassportEntity changePassport(int userId, String issueCountry, String iss } + @Override + public DrivingLicenseEntity changeDrivingLicence(int userId, LocalDate issueDate, LocalDate expirationDate, + String serialNumber) { + + UsersEntity usersEntity = usersDao.get(userId); + DrivingLicenseEntity drivingLicenseEntity = drivingLicenseDao.get(usersEntity.getDrivingLicenseId()); + if (usersEntity == null){ + throw new RuntimeException(); + } + if (drivingLicenseEntity == null){ + return createDrivingLicense(usersEntity, issueDate, expirationDate, serialNumber); + } + else { + return updateDrivingLicense(drivingLicenseEntity, issueDate, expirationDate, serialNumber); + } + //need method to validate data + //return drivingLicenceEntity + } + + @Override + public UsersEntity changeUserData(int id, String email, SecureString password, String name, + String contactPhone, String address) { + UsersEntity usersEntity = usersDao.get(id); + validateUserData(email, password, name, contactPhone, address); + usersEntity.setEmail(email); + String passwordHash = passwordHashService.getHash(password); + usersEntity.setPasswordHash(passwordHash); + usersEntity.setName(name); + usersEntity.setContactPhone(contactPhone); + usersEntity.setAddress(address); + usersDao.update(usersEntity); + return usersEntity; + } + private PassportEntity createPassport(UsersEntity usersEntity, String issueCountry, String issuer, LocalDate issueDate, LocalDate expirationDate, String serialNumber){ validatePassport(issueCountry, issuer, issueDate, expirationDate, serialNumber); @@ -64,31 +101,30 @@ private PassportEntity updatePassport(PassportEntity passportEntity, String issu passportDao.update(passportEntity); return passportEntity; } - @Override - public DrivingLicenseEntity changeDrivingLicence(int userId, LocalDate issueDate, LocalDate expirationDate, - String serialNumber) { - //here will be two methods to create drivingLicenseEntity and to update it - //need method to get drivingLicenseEntity by serial number in Dao - //need method to validate data - //return drivingLicenceEntity - return null; - } - @Override - public UsersEntity changeUserData(int id, String email, SecureString password, String name, - String contactPhone, String address) { - UsersEntity usersEntity = usersDao.get(id); - validateUserData(email, password, name, contactPhone, address); - usersEntity.setEmail(email); - String passwordHash = passwordHashService.getHash(password); - usersEntity.setPasswordHash(passwordHash); - usersEntity.setName(name); - usersEntity.setContactPhone(contactPhone); - usersEntity.setAddress(address); + private DrivingLicenseEntity createDrivingLicense(UsersEntity usersEntity, LocalDate issueDate, + LocalDate expirationDate, String serialNumber){ + validateDrivingLicense(issueDate, expirationDate, serialNumber); + DrivingLicenseEntity drivingLicenseEntity = new DrivingLicenseEntity(0, issueDate, expirationDate, + serialNumber); + drivingLicenseDao.save(drivingLicenseEntity); + drivingLicenseEntity = drivingLicenseDao.getBySerialNumber(drivingLicenseEntity.getSerialNumber()); + usersEntity.setDrivingLicenseId(drivingLicenseEntity.getId()); usersDao.update(usersEntity); - return usersEntity; + return drivingLicenseEntity; + } + + private DrivingLicenseEntity updateDrivingLicense (DrivingLicenseEntity drivingLicenseEntity, LocalDate issueDate, + LocalDate expirationDate, String serialNumber){ + validateDrivingLicense(issueDate, expirationDate, serialNumber); + drivingLicenseEntity.setIssueDate(issueDate); + drivingLicenseEntity.setExpirationDate(expirationDate); + drivingLicenseEntity.setSerialNumber(serialNumber); + drivingLicenseDao.update(drivingLicenseEntity); + return drivingLicenseEntity; } + private static final String PHONE_REGEX = "[\\d\\s\\(\\)\\+]+"; private void validateUserData(String email, SecureString password, String name, @@ -130,4 +166,16 @@ private void validatePassport (String issueCountry, String issuer, LocalDate iss throw new RuntimeException("SerialNumber number is not specified."); } } + + private void validateDrivingLicense(LocalDate issueDate, LocalDate expirationDate, String serialNumber){ + if (issueDate == null) { + throw new RuntimeException("IssueDate date is not specified."); + } + if (expirationDate == null) { + throw new RuntimeException("ExpirationDate date is not specified."); + } + if (serialNumber == null || serialNumber.length() == 0) { + throw new RuntimeException("SerialNumber number is not specified."); + } + } }