diff --git a/common/pom.xml b/common/pom.xml index 8e6772d..290f33a 100644 --- a/common/pom.xml +++ b/common/pom.xml @@ -1,128 +1,134 @@ - 4.0.0 - + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 + + com.mfsys + parent + 0.0.1 + ../parent/pom.xml + com.mfsys - parent + common 0.0.1 - ../parent/pom.xml - - com.mfsys - common - 0.0.1 - common - GBRSP Project - - - - - - - - - - - - - - - 21 - - - - org.springframework.boot - spring-boot-starter-data-jpa - - - org.modelmapper - modelmapper - 3.1.1 - - - org.springframework.boot - spring-boot-starter-security - - - org.springframework.boot - spring-boot-starter-web - + common + GBRSP Project + + + + + + + + + + + + + + + 21 + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.modelmapper + modelmapper + 3.1.1 + + + org.springframework.boot + spring-boot-starter-security + + + org.springframework.boot + spring-boot-starter-web + - - org.projectlombok - lombok - true - - - org.springframework.boot - spring-boot-starter-tomcat - provided - - - org.springframework.boot - spring-boot-starter-test - test - - - org.springframework.security - spring-security-test - test - - - mysql - mysql-connector-java - 8.0.33 - - - org.mindrot - jbcrypt - 0.4 - - - io.jsonwebtoken - jjwt-api - 0.12.3 - + + org.projectlombok + lombok + true + + + org.springframework.boot + spring-boot-starter-tomcat + provided + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.security + spring-security-test + test + + + mysql + mysql-connector-java + 8.0.33 + + + org.mindrot + jbcrypt + 0.4 + + + io.jsonwebtoken + jjwt-api + 0.12.6 + + + io.jsonwebtoken + jjwt-impl + 0.12.6 + + + io.jsonwebtoken + jjwt-jackson + 0.12.6 + + + com.fasterxml.jackson.core + jackson-databind + + + api.CoreAPI + EncryptionAPI + 0.0.1-SNAPSHOT + + + jakarta.xml.bind + jakarta.xml.bind-api + provided + - - io.jsonwebtoken - jjwt-impl - 0.12.3 - runtime - + - - io.jsonwebtoken - jjwt-jackson - 0.12.3 - runtime - - - com.fasterxml.jackson.core - jackson-databind - - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.13.0 - - 21 - 21 - - - org.projectlombok - lombok - 1.18.34 - - - - - - + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.13.0 + + 21 + 21 + + + org.projectlombok + lombok + 1.18.34 + + + + + + diff --git a/common/src/main/java/com/mfsys/common/configuration/constant/PropertyConstant.java b/common/src/main/java/com/mfsys/common/configuration/constant/PropertyConstant.java deleted file mode 100644 index 0af96c5..0000000 --- a/common/src/main/java/com/mfsys/common/configuration/constant/PropertyConstant.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.mfsys.common.configuration.constant; - -public interface PropertyConstant { - -} diff --git a/common/src/main/java/com/mfsys/common/configuration/service/JwtService.java b/common/src/main/java/com/mfsys/common/configuration/service/JwtService.java deleted file mode 100644 index 83eca6e..0000000 --- a/common/src/main/java/com/mfsys/common/configuration/service/JwtService.java +++ /dev/null @@ -1,97 +0,0 @@ -package com.mfsys.common.configuration.service; - -import io.jsonwebtoken.Claims; -import io.jsonwebtoken.JwtException; -import io.jsonwebtoken.Jwts; -import io.jsonwebtoken.security.Keys; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Service; - -import javax.crypto.SecretKey; -import java.security.Key; -import java.time.Instant; -import java.util.Date; -import java.util.HashMap; -import java.util.Map; -import java.util.function.Function; - -@Service -public class JwtService { - - @Value("${jwt.secret}") - private String secret; - - @Value("${jwt.expiration}") - private Long expiration; - - @Value("${jwt.refresh-expiration}") - private Long refreshExpiration; - - public String extractUsername(String token) { - return extractClaim(token, Claims::getSubject); - } - - public Date extractExpiration(String token) { - return extractClaim(token, Claims::getExpiration); - } - - public T extractClaim(String token, Function claimsResolver) { - final Claims claims = extractAllClaims(token); - return claimsResolver.apply(claims); - } - - private Claims extractAllClaims(String token) { - try { - return Jwts.parser() - .verifyWith((SecretKey) getSigningKey()) - .build() - .parseSignedClaims(token) - .getPayload(); - } catch (JwtException e) { - throw new RuntimeException("Invalid JWT token", e); - } - } - - private Boolean isTokenExpired(String token) { - return extractExpiration(token).before(new Date()); - } - - public String generateToken(String subject) { - Map claims = new HashMap<>(); - return createToken(claims, subject, expiration); - } - - public String generateRefreshToken(String subject) { - Map claims = new HashMap<>(); - return createToken(claims, subject, refreshExpiration); - } - - private String createToken(Map claims, String subject, Long expiration) { - Instant now = Instant.now(); - return Jwts.builder() - .claims(claims) - .subject(subject) - .issuedAt(Date.from(now)) - .expiration(Date.from(now.plusMillis(expiration))) - .signWith(getSigningKey()) - .compact(); - } - - public Boolean validateToken(String token, String subject) { - final String username = extractUsername(token); - return (username.equals(subject) && !isTokenExpired(token)); - } - - public Boolean isTokenValid(String token) { - try { - return !isTokenExpired(token); - } catch (Exception e) { - return false; - } - } - - private Key getSigningKey() { - byte[] keyBytes = secret.getBytes(); - return Keys.hmacShaKeyFor(keyBytes); - } -} diff --git a/common/src/main/java/com/mfsys/common/configuration/constant/AconnectURI.java b/common/src/main/java/com/mfsys/constant/AconnectURI.java similarity index 97% rename from common/src/main/java/com/mfsys/common/configuration/constant/AconnectURI.java rename to common/src/main/java/com/mfsys/constant/AconnectURI.java index 2cc905b..4442c05 100644 --- a/common/src/main/java/com/mfsys/common/configuration/constant/AconnectURI.java +++ b/common/src/main/java/com/mfsys/constant/AconnectURI.java @@ -1,4 +1,4 @@ -package com.mfsys.common.configuration.constant; +package com.mfsys.constant; public interface AconnectURI { String REFRESH_TOKEN = "/refreshtoken"; diff --git a/common/src/main/java/com/mfsys/constant/CustomerStatus.java b/common/src/main/java/com/mfsys/constant/CustomerStatus.java new file mode 100644 index 0000000..447733b --- /dev/null +++ b/common/src/main/java/com/mfsys/constant/CustomerStatus.java @@ -0,0 +1,8 @@ +package com.mfsys.constant; + +public interface CustomerStatus { + + String CUSTOMER_UNVERIFIED = "Unverified"; + String CUSTOMER_VERIFIED = "Verified"; + String CUSTOMER_ACTIVE = "Active"; +} diff --git a/common/src/main/java/com/mfsys/constant/DBFieldNameConstant.java b/common/src/main/java/com/mfsys/constant/DBFieldNameConstant.java new file mode 100644 index 0000000..1a70d93 --- /dev/null +++ b/common/src/main/java/com/mfsys/constant/DBFieldNameConstant.java @@ -0,0 +1,7 @@ +package com.mfsys.constant; + +public interface DBFieldNameConstant { + + String POR_ORGACODE = "POR_ORGACODE"; + String PCR_CURRCODE = "PCR_CURRCODE"; +} diff --git a/common/src/main/java/com/mfsys/constant/DateFormatterConstant.java b/common/src/main/java/com/mfsys/constant/DateFormatterConstant.java new file mode 100644 index 0000000..a07b0c7 --- /dev/null +++ b/common/src/main/java/com/mfsys/constant/DateFormatterConstant.java @@ -0,0 +1,7 @@ +package com.mfsys.constant; + +public interface DateFormatterConstant { + String DATE_FORMAT = "yyyy-MM-dd"; + String TIME_FORMAT = "T00:00:00.000Z"; + String DATETIME_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"; +} diff --git a/common/src/main/java/com/mfsys/common/configuration/constant/ERRCode.java b/common/src/main/java/com/mfsys/constant/ERRCode.java similarity index 78% rename from common/src/main/java/com/mfsys/common/configuration/constant/ERRCode.java rename to common/src/main/java/com/mfsys/constant/ERRCode.java index 423ae36..e2c8697 100644 --- a/common/src/main/java/com/mfsys/common/configuration/constant/ERRCode.java +++ b/common/src/main/java/com/mfsys/constant/ERRCode.java @@ -1,6 +1,6 @@ -package com.mfsys.common.configuration.constant; +package com.mfsys.constant; -import com.mfsys.common.configuration.exception.ErrorMessage; +import com.mfsys.exception.ErrorMessage; public enum ERRCode implements ErrorMessage {; private String code; diff --git a/common/src/main/java/com/mfsys/constant/ErrorMessage.java b/common/src/main/java/com/mfsys/constant/ErrorMessage.java new file mode 100644 index 0000000..79f53c2 --- /dev/null +++ b/common/src/main/java/com/mfsys/constant/ErrorMessage.java @@ -0,0 +1,6 @@ +package com.mfsys.constant; + +public interface ErrorMessage { + public String getCode(); + public String getDescription(); +} diff --git a/common/src/main/java/com/mfsys/constant/FieldNameConstant.java b/common/src/main/java/com/mfsys/constant/FieldNameConstant.java new file mode 100644 index 0000000..4378948 --- /dev/null +++ b/common/src/main/java/com/mfsys/constant/FieldNameConstant.java @@ -0,0 +1,151 @@ +package com.mfsys.constant; + +public enum FieldNameConstant implements DBFieldNameConstant { + + PTR_TRANCODE("ptrTrancode", "PTR_TRANCODE"), PTR_TRANDESC("ptrTrandesc", "PTR_TRANDESC"),POR_ORGACODE("porOrgacode", DBFieldNameConstant.POR_ORGACODE), + SUS_USERCODE("susUsercode", "SUS_USERCODE"), SUS_NAME("susName", "SUS_NAME"), PCR_CURRCODE("pcrCurrcode", "PCR_CURRCODE"), PCR_CURRBASE("pcrCurrbase", "PCR_CURRBASE"), + SGT_GNTRAMTFC("sgtGntramtfc", "SGT_GNTRAMTFC"),PLC_LOCACODE("plcLocacode", "PLC_LOCACODE"), + SGT_GNTRVALUEDATE("sgtGntrvaluedate", "SGT_GNTRVALUEDATE"), MBM_BKMSNUMBER("mbmBkmsnumber","MBM_BKMSNUMBER"),MBM_BKMSCLOSED("mbmBkmsclosed","MBM_BKMSCLOSED"), MBM_BKMSTITLE("mbmBkmstitle","MBM_BKMSTITLE"), + DMP_PRODCODE("dmpProdcode", "DMP_PRODCODE"), MLT_LNTRPRINCIPAL("mltLntrprincipal","MLT_LNTRPRINCIPAL"), + MLT_LNTRINTEREST("mltLntrinterest","MLT_LNTRINTEREST"), MLT_LNTRPENALTY("mltLntrpenalty","MLT_LNTRPENALTY"), + SGT_GNTRNARRATION("sgtGntrnarration", "SGT_GNTRNARRATION"), BLA_LNACFINANCEDAMTFC("blaLnacfinancedamtfc","BLA_LNACFINANCEDAMTFC"), + BLA_LNACDISBURSEMENTFC("blaLnacdisbursementfc","BLA_LNACDISBURSEMENTFC"),DMP_PRODDESC("dmpProddesc","DMP_PRODDESC"), + PER_ERATRATEACT("perEratrateact","PER_ERATRATEACT"),PCR_CURRDESC("pcrCurrdesc","PCR_CURRDESC"),PLC_LOCADESC("plcLocadesc","PLC_LOCADESC"), + PLC_LOCASHORT("plcLocashort", "PLC_LOCASHORT"), PLC_LOCATYPE("plcLocatype", "PLC_LOCATYPE"), PRG_REGNCODE("prgRegncode","PRG_REGNCODE"), + PLC_OPENDATE("plcOpendate","PLC_OPENDATE"), BRANCH_DATA("branchStep", "BRANCH_STEP"), CHARGES_BIFURCATION("chargesBifurcation", "CHARGES_BIFURCATION"), + CMP_CUSTCODE("cmpCustcode", "CMP_CUSTCODE"),CMP_CUSTSEX("cmpcustsex","CMP_CUSTSEX"), CMP_GRPOUPCODE("cmpGrpoupcode","CMP_GRPOUPCODE"), PCC_CSCGCODE("pccCscgcode","PCC_CSCGCODE"), + PFS_FUSOID("pfsFusoid", "PFS_FUSOID"), PAT_AMTYCODE("patAmtycode","PAT_AMTYCODE"), BLA_LNMBSHARE_APPROVED("blaLnmbshareApproved","BLA_LNMBSHARE_APPROVED"), + BLA_ASSOCIATECUSTOMER("blaAssociatecustomer","BLA_ASSOCIATECUSTOMER"), CMP_CUSTCODE_GRP("cmpCustcodeGrp","CMP_CUSTCODE_GRP"), + CORRELATION_CUSTCODE("correlationCustcode","CORRELATION_CUSTCODE"), + CMP_COMPANYCODE("cmpCompanycode", "CMP_COMPANYCODE"), CMP_COMPANYCODE_REF("cmpCompanycodeRef","CMP_COMPANYCODE_REF"), + CMP_COMPANYNAME("cmpCompanyname", "CMP_COMPANYNAME"), + CMP_JOINTCUSTCODE("cmpJointcustcode", "CMP_JOINTCUSTCODE"), + PAS_ACSTCODE("pasAcstcode","PAS_ACSTCODE"),BDA_DPACBLOCKAMT("bdaDpacblockamt","BDA_DPACBLOCKAMT"), BDA_DPACPROFITACCRUEDAMTFC("bdaDpacprofitaccruedamtfc","BDA_DPACPROFITACCRUEDAMTFC"), + MLS_LNSHTYPE("mlsLnshtype","MLS_LNSHTYPE"),MLS_LNSHINSTNO("mlsLnshinstno","MLS_LNSHINSTNO"),MLS_LNSHDUEDATE("mlsLnshduedate","MLS_LNSHDUEDATE"), + MLS_LNSHPRINCIPAL("mlsLnshprincipal","MLS_LNSHPRINCIPAL"),MLS_LNSHINTEREST("mlsLnshinterest","MLS_LNSHINTEREST"),BLA_LNAPPROVEDAMOUNTFC("blaLnapprovedamountfc","BLA_LNAPPROVEDAMOUNTFC"), + BLA_LNACAPPROVEDATE("blaLnacapprovedate", "BLA_LNACAPPROVEDATE"), + CLOSING_DETAILS("closingBalanceDetails",""),WORKFLOWREFNUM("workFlowRefNum", "workFlowRefNum"), + PIN_LENGTH("4","pinLength"),POR_ORGADESC("porOrgadesc","POR_ORGADESC"),POR_ORGASHORT("porOrgashort","POR_ORGASHORT"), + POR_ORGAREGDATE("porOrgaregdate","POR_ORGAREGDATE"), POR_ORGALOGO("porOrgalogo","POR_ORGALOGO"),POR_ORGAREPORTLOGO("porOrgareportlogo","POR_ORGAREPORTLOGO"), POR_TRANINTEGRALVALUE("porTranintegralvalue", "POR_TRANINTEGRALVALUE"), POR_TRANPRECISIONVALUE("porTranrprecisionvalue", "POR_TRANPRECISIONVALUE"), + POR_TRANROUNDTYPE("porTranroundtype", "POR_TRANROUNDTYPE"), POR_ROUNDINGMODETRANSACTION("porRoundingmodetransactions","POR_ROUNDINGMODETRANSACTION"), + POR_ORGAEXPDATE("porOrgaexpdate","POR_ORGAEXPDATE"),POR_ORGAFAX("porOrgafax","POR_ORGAFAX"),POR_ADRSLNDPHONE("porAdrslndphone","POR_ADRSLNDPHONE"),POR_ORGAADDRESSLINE1("por_orgaaddressline1","POR_ORGAADDRESSLINE1"), + POR_ORGAADDRESSLINE2("por_orgaaddressline2","POR_ORGAADDRESSLINE2"),POR_ORGAWEBSITE("porOrgawebsite","POR_ORGAWEBSITE"), POR_ORGACODE_ENTRY("porOrgacodeEntry", "POR_ORGACODE_ENTRY"), POR_ACTIVE("porActive", "POR_ACTIVE"), + SUS_USERNAME("susUsername", "SUS_USERNAME"),SUS_PASSWORD("susPassword", "SUS_PASSWORD"),SUS_USERCELLNO("susUsercellno", "SUS_USERCELLNO"),SUL_LEVELCODE("sulLevelCode", "SUL_LEVELCODE"),SUL_DESC("sulDesc", "SUL_DESC"),SUL_STATUS("sulStatus", "SUL_STATUS") + ,SUS_MULTILOGIN("susMultilogin","SUS_MULTILOGIN") , SUS_HOMELOCATION("susHomelocation","SUS_HOMELOCATION"),SUS_ACTIVE("susActive", "SUS_ACTIVE"), SUS_SIGNLOG("susSignlog","SUS_SIGNLOG"), USER_DATA("userStep","USER_STEP"),ROLE_DATA("roleStep", "ROLE_STEP"),PCA_GLACDEBIT("pcaGlacdebit","PCA_GLACDEBIT"),PCA_GLACCREDIT("pcaGlaccredit","PCA_GLACCREDIT"),PCH_CHRGCODE("pchChrgcode","PCH_CHRGCODE"),PCH_CHRGDESC("pchChrgdesc","PCH_CHRGDESC"), + PET_EVENTCODE_POST("petEventcodePost","PET_EVENTCODE_POST"), PET_EXRTCODE("petExrtcode","PET_EXRTCODE"), PER_ERATDATE("perEratdate","PER_ERATDATE"), PLT_LOCATYPEDESC("pltLocatypedesc", "PLT_LOCATYPEDESC"), CMP_CREATEDBY("cmpCreatedby", "CMP_CREATEDBY"), PLC_LOCACODE_ENTRY("PLC_LOCACODE_ENTRY", "PLC_LOCACODE_ENTRY"), + POR_ORGATIMEZONE("porOrgatimezone", "POR_ORGATIMEZONE"), POR_ORGAUTCTIMEZONE("porOrgautctimezone", "POR_ORGAUTCTIMEZONE"),PLC_LOCATIMEZONE("plcLocatimezone", "PLC_LOCATIMEZONE"), PLC_ACTIVE("plcActive","PLC_ACTIVE"), + PCA_GLACCODE("pcaGlaccode", "PCA_GLACCODE"), SGT_GNTRDATE("sgtGntrdate", "SGT_GNTRDATE"), SGT_GNTRAMT("sgtGntramt", "SGT_GNTRAMT"), + PFS_ACNTDATEFROM("pfs_acntdatefrom","PFS_ACNTDATEFROM"), PFS_ACNTDATETO("pfs_acntdateto", "PFS_ACNTDATETO"), PFS_ACNTDESC("pfs_acntdesc","PFS_ACNTDESC"), + BGP_GLPRCOMPANYDATE("bgpGlprcompanydate","BGP_GLPRCOMPANYDATE"),BGP_GLPRCOMPANYTIMEZONE("bgpGlprcompanytimezone","BGP_GLPRCOMPANYDATE"), BGP_GLPROPERATIONCLOSE("bgpGlproperationclose", "BGP_GLPROPERATIONCLOSE"), + BGP_GLPRNEXTDATE("bgpGlprnextdate", "BGP_GLPRNEXTDATE"), PCO_CLDSTATUS("pcoCldstatus", "PCO_CLDSTATUS"), PCO_CLDSHADOWED("pcoCldshadowed", "PCO_CLDSHADOWED"), + PCO_CLDBATCHPROCESS("pcoCldbatchprocess", "PCO_CLDBATCHPROCESS"), PCO_CLDERRMESSAGE("pcoClderrmessage", "PCO_CLDERRMESSAGE"), + BLA_LNAPPLIEDAMOUNTFC ("blaLnappliedamountfc","BLA_LNAPPLIEDAMOUNTFC"), TRANSACTION_DESCRIPTION("transactionDescription","TRANSACTION_DESCRIPTION"), + BLA_LNACINTERESTRATE("blaLnacinterestrate","BLA_LNACINTERESTRATE"), PCD_CORDCODE("pcdCordcode","PCD_CORDCODE"),PPO_PURPCODE("ppoPurpcode","PPO_PURPCODE"), OLD_PCD_CORDCODE("oldPcdCordcode","OLD_PCD_CORDCODE"), + NEW_PCD_CORDCODE("newPcdCordcode","NEW_PCD_CORDCODE"), PCD_CORDCOMMENT ("pcdCordcomment","PCD_CORDCOMMENT"), TRANSACTION_TIME("transactionTime","TRANSACTION_TIME"), + SGT_GNTRNUMBER("sgtGntrnumber", "SGT_GNTRNUMBER"), SGT_GNTRTRANLINK("sgtGntrtranlink", "SGT_GNTRTRANLINK"), SGT_GNTRCREATEDAT("sgtGntrcreatedat", "SGT_GNTRCREATEDAT"), + BTA_BOOKINGAMOUNT("btaBookingamount", "BTA_BOOKINGAMOUNT"), BTA_DURATION("btaDuration", "BTA_DURATION"), PFM_FMODCODE("pfmFmodcode", "PFM_FMODCODE"), PRO_RLOVCODE("proRlovcode", "PRO_RLOVCODE"), + PTM_TMETCODE("ptmTmetcode", "PTM_TMETCODE"), PTM_TMETDESC("ptmTmetdesc", "PTM_TMETDESC"), PLC_CHARGECALCRATE("plcChargecalcrate", "PLC_CHARGECALCRATE"), + SVH_VCHDUPDATETIMESTAMP("svhVchdupdatetimestamp","SVH_VCHDUPDATETIMESTAMP"), SVH_VCHDFLDCOMB("svhVchdfldcomb", "SVH_VCHDFLDCOMB"), SVH_VCHDVALCOMBDESC("svhVchdvalcombdesc", "SVH_VCHDVALCOMBDESC"), PAA_TAAUTIMESTAMP("paaTaautimestamp", "PAA_TAAUTIMESTAMP"), + MBM_BKMSBALANCE("mbmBkmsbalance", "MBM_BKMSBALANCE"), MBM_BKMSUNAUTHDRBALANCE("mbmBkmsunauthdrbalance", "MBM_BKMSUNAUTHDRBALANCE"), MBM_BKMSUNAUTHCRBALANCE("mbmBkmsunauthcrbalance", "MBM_BKMSUNAUTHCRBALANCE"), + CURRENT_AMOUNT("currentAmount", "CURRENT_AMOUNT"), CURRENCY_DENOMINATION_DETIAL("currencyDenominationDetail", "currencyDenominationDetail"), CLOSE_OPERATION_DATA("closeOperationData", "closeOperationData"), + PCA_GLACOPITEM("pcaGlacopitem", "PCA_GLACOPITEM"), PCT_CALCODE("pctCalcode", "PCT_CALCODE"), + NODE_ID("nodeId", "NODE_ID"), SVV_VCVRREFNO("svvVcvrrefno", "SVV_VCVRREFNO"), PIT_INSTCODE("pitInstcode", "PIT_INSTCODE"), MIT_INSTCODE("mitInstcode", "MIT_INSTCODE"), + MIS_INSEBOOKNO("misInsebookno", "MIS_INSEBOOKNO"), PIS_INSTCODE("pisInstcode", "PIS_INSTCODE"), PIN_INVSCODE("pinInvscode", "PIN_INVSCODE"), MIS_INSERANGEFROM("misInserangefrom", "MIS_INSERANGEFROM"), MIS_INSERANGETO("misInserangeto", "MIS_INSERANGETO"), + MIS_INSERECVDATE("misInserecvdate", "MIS_INSERECVDATE"), MIS_INSEISSUEACNTDATE("misInseissueacntdate", "MIS_INSEISSUEACNTDATE"), + PPM_PYMDCODE("ppmPymdcode","PPM_PYMDCODE"), + SWITCH_CODE("switchCode","SWITCH_CODE"), + CRDR_CODE("crdrcode","CRDRCODE"), + ACCOUNT_TRA_NO("pcaGlaccodeAc","ACCOUNT_TRANSFER_NO"), + MBM_BKMSNUMBER_REF("mbmBkmsnumberRef","MBM_BKMSNUMBER_REF"), + DMP_PRODCODE_REF("dmpProdcodeRef","DMP_PRODCODE_REF"), + BLN_RESTRUCTUREPRINCIPALAMT("blnRestructureprincipalamt","BLN_RESTRUCTUREPRINCIPALAMT"), + BLA_LNACDISBURSEMENTDATE("bla_lnacdisbursementdate","BLA_LNACDISBURSEMENTDATE"), + PROCESS_COMPLETED("processCompleted","processCompleted"), + MIS_INSELOST( "MIS_INSELOST", "MIS_INSELOST"), + BATCH_USERCODE("@_CREATEUSER", "@_CREATEUSER"), + SGT_GNTRCREATEAT("sgtGntrcreateat", "SGT_GNTRCREATEAT"), + CMP_ACCOUNT_TITLE_FL("cmpAccountTitleFl","CMP_ACCOUNT_TITLE_FL"), + CMP_ACCOUNT_TITLE_LF("cmpAccountTitleLf","CMP_ACCOUNT_TITLE_LF"), + BN_CS_IT_IDENTIFIER("bnCsItIdentifier","BN_CS_IT_IDENTIFIER"), + CIT_IDENVALUE("citIdenValue","CIT_IDENVALUE"), + PIT_IDENCODE("pitIdenCode","PIT_IDENCODE"), + PHONE_NUMBER("phoneNumber","PHONE_NUMBER"), + BTA_AUTOROLLED("BtaAutorolled","BTA_AUTOROLLED"), + + BLN_RESTRUCTUREADDITIONALAMT("blnRestructureadditionalamt","BLN_RESTRUCTUREADDITIONALAMT"), + CMP_BLACKLISTED("cmpBlacklisted", "CMP_BLACKLISTED"), + BGP_FRACTIONALSCALE("bgpFractionalscale", "BGP_FRACTIONALSCALE"), + BGP_BLACKLISTSETUP("bgpBlacklistsetup", "BGP_BLACKLISTSETUP"), + PLC_CHARGECALCRATE_ACCOUNT("plcChargecalcrateAccount", "PLC_CHARGECALCRATE_ACCOUNT"), + DST_STIERVALUE("dstStiervalueAccount","DST_STIERVALUE"), + DST_STIERVALUE_ACCOUNT("dstStiervalue","DST_STIERVALUE_ACCOUNT"), + BLA_ASSOCIATENAME("blaAssociatename","BLA_ASSOCIATENAME"), + ANR_ACNRCODE("anrAcnrcode", "ANR_ACNRCODE"), + BLG_CUSTCODE("blgCustcode", "BLG_CUSTCODE"), + RATE_AMOUNT("rateAmount","RATE_AMOUNT"), + + + PLC_ALLOWED_LOCA("plcallowedloca","PLC_ALLOWED_LOCA"), + PLC_AMOUNTFROM("plcamountfrom","PLC_AMOUNTFROM"), + PLC_AMOUNTTO("plcamountto","PLC_AMOUNTTO"), + PLC_CHARGECALCRATE_PRODUCT("plcchargecalcrateproduct","PLC_CHARGECALCRATE_PRODUCT"), + //Online Banking + CMP_CUSTPASSWORD("cmpCustpassword","CMP_CUSTPASSWORD"), CMP_CUSTSTATUS("cmpCuststatus", "CMP_CUSTSTATUS"), CMP_CUSTSTATUSDATE("cmpCuststatusdate", "CMP_CUSTSTATUSDATE"), + CMP_CUSTLASTLOGIN("cmpCustlastlogin", "CMP_CUSTLASTLOGIN"), + PCT_CSTYCODE("pctCstycode", "PCT_CSTYCODE"), CMP_FIRSTNAME("cmpFirstname", "CMP_FIRSTNAME"), CMP_LASTNAME("cmpLastname", "CMP_LASTNAME"), + PAD_ADRSMOBPHONE("padAdrsmobphone", "PAD_ADRSMOBPHONE"), PAD_ADRSEMAIL("padAdrsemail", "PAD_ADRSEMAIL"), + PAD_ADRSCORRESPONDENCE("padAdrscorrespondence", "PAD_ADRSCORRESPONDENCE"), + OCB_BENEFICIARYVERIFIED("ocbBeneficiaryverified", "OCB_BENEFICIARYVERIFIED"), OCB_BENEFICIARYVERIFYDATE("ocbBeneficiaryverifydate", "OCB_BENEFICIARYVERIFYDATE"), + PRC_CLASSIFICATION("prcClassification", "PRC_CLASSIFICATION"), + OTD_TRANSACTIONPOSTED("otdTransactionposted", "OTD_TRANSACTIONPOSTED"), OTD_TRANSACTIONPOSTDATE("otdTransactionpostdate", "OTD_TRANSACTIONPOSTDATE"), + OTD_TRANSACTIONID("otdTransactionid", "OTD_TRANSACTIONID"), + + ORGANIZATION("organization", "ORGANIZATION"), LOCATION("location", "LOCATION"), + CURRENCY("currency", "CURRENCY"), GLOBALPARAMETER("globalparameter", "GLOBALPARAMETER"), + PCA_GLACODE_DEBIT("pcaGlacodeDebit","PCA_GLACODE_DEBIT"), PCA_GLACODE_CREDIT("pcaGlacodeCredit","PCA_GLACODE_CREDIT"), + PLC_APPLYACCRUAL("plcApplyaccrual", "PLC_APPLYACCRUAL"), + PFS_ACNTSTATUS("pfsAcntstatus","PFS_ACNTSTATUS"), + PRO_RLOVTONEWACCOUNT("proRlovtonewaccount", "PRO_RLOVTONEWACCOUNT"), + BBS_BATCHSTATUS("bbsBatchstatus", "BBS_BATCHSTATUS"), BBS_BATCHAMT("bbsBatchamt", "BBS_BATCHAMT"), + BLA_LNACGRACEPRINCIPLE("blaLnacgraceprinciple","BLA_LNACGRACEPRINCIPLE"), + BLA_LNACTOTALDURATION("blaLnactotalduration", "BLA_LNACTOTALDURATION"), + BLA_LNACEFFECTIVEDATE("blaLnaceffectivedate","BLA_LNACEFFECTIVEDATE"), + MLS_LNSHINSTTOTAL("mlsLnshinsttotal","MLS_LNSHINSTTOTAL"), SYSTEM_ORGA("SYSTEM_ORGA","SYSTEM_ORGA"), PLC_SUBLOCACODE("plcSublocacode","PLC_SUBLOCACODE"), + PLC_SUBLOCADESC("plcSublocadesc","PLC_SUBLOCADESC"), + ISC_AUTO_REVERSAL("iscAutoReversal", "ISC_AUTO_REVERSAL"), + MBM_NOTIFICATIONSERVICE("mbmNotificationService","MBM_NOTIFICATIONSERVICE"), + SERIAL_NO("serialNo" , "SERIAL_NO"), NOTIFICATION_STATUS("notificationStatus", "NOTIFICATION_STATUS"), + MESSAGE("Message", "MESSAGE"), SGT_GNTRDRCR("sgtGntrdrcr", "SGT_GNTRDRCR"), PIT_JOINTCUSTCODE("pitJoincustcode", "PIT_JOINTCUSTCODE"), + PCO_CTRYCODE("pcoCtrycode","PCO_CTRYCODE"), UDF3("prgntmUdf3","PR_GN_TM_UDF3"), UDF1("prgntmUdf1","PR_GN_TM_UDF1"), PFS_ACNTYEAR("pfsAcntyear","PFS_ACNTYEAR"), FROM_DATE("fromdate","FROM_DATE"), TO_DATE("todate","TO_DATE"), + STATUS_CODE("statusCode", "status_code"), TRANSACTION_NO("tranNo", "TRAN_NO"), TRANSACTION_DATE("tranDate", "TRAN_DATE"), TRANSACTION_AMOUNT("tranAmount", "TRAN_AMOUNT"), + CMP_IDENTIFICATION_NO("cmpIdentificationNo","CMP_IDENTIFICATION_NO"), + DEPOSIT("deposit","DEPOSIT"), + OTP_CODE("otpCode","OTP_CODE"), + IDEN_VALUE("idenValue", "IDEN_VALUE"), + PIT_IDENVALUE("pitIdenvalue", "PIT_IDENVALUE"), + PIT_IDENDESC("pit_idendesc", "PIT_IDENDESC"), + COMMISSION_AMOUNT("commissionAmount", "COMMISSION_AMOUNT"), + CMP_USERID("cmpUserId","CMP_USERID"), + COMPANY_NAME("companyName","COMPANY_NAME"), + OAUTH_FLAG("oauthFlag","OAUTH_FLAG") + + ; + + + FieldNameConstant(String variableName, String dbFieldName) { + this.variableName = variableName; + this.dbFieldName = dbFieldName; + } + + private final String variableName; + private final String dbFieldName; + + public String getVariableName() { + return variableName; + } + + public String getDbFieldName() { + return dbFieldName; + } + +} \ No newline at end of file diff --git a/common/src/main/java/com/mfsys/common/configuration/constant/FieldNameLength.java b/common/src/main/java/com/mfsys/constant/FieldNameLength.java similarity index 95% rename from common/src/main/java/com/mfsys/common/configuration/constant/FieldNameLength.java rename to common/src/main/java/com/mfsys/constant/FieldNameLength.java index e473276..0b58876 100644 --- a/common/src/main/java/com/mfsys/common/configuration/constant/FieldNameLength.java +++ b/common/src/main/java/com/mfsys/constant/FieldNameLength.java @@ -1,4 +1,4 @@ -package com.mfsys.common.configuration.constant; +package com.mfsys.constant; public interface FieldNameLength { @@ -20,7 +20,7 @@ public interface FieldNameLength { String CODE_200 = "VARCHAR(200)"; String CODE_500 = "VARCHAR(500)"; String CODE_1000 = "VARCHAR(1000)"; - + String CODE_10000 = "VARCHAR(10000)"; // Descriptions String DESCRIPTION_LONG = "VARCHAR(40)"; String DESCRIPTION_SHORT = "VARCHAR(20)"; diff --git a/common/src/main/java/com/mfsys/common/configuration/constant/FilterPriority.java b/common/src/main/java/com/mfsys/constant/FilterPriority.java similarity index 71% rename from common/src/main/java/com/mfsys/common/configuration/constant/FilterPriority.java rename to common/src/main/java/com/mfsys/constant/FilterPriority.java index 3901c55..380cffb 100644 --- a/common/src/main/java/com/mfsys/common/configuration/constant/FilterPriority.java +++ b/common/src/main/java/com/mfsys/constant/FilterPriority.java @@ -1,4 +1,4 @@ -package com.mfsys.common.configuration.constant; +package com.mfsys.constant; public interface FilterPriority { diff --git a/common/src/main/java/com/mfsys/constant/FormPropertyConst.java b/common/src/main/java/com/mfsys/constant/FormPropertyConst.java new file mode 100644 index 0000000..2866c99 --- /dev/null +++ b/common/src/main/java/com/mfsys/constant/FormPropertyConst.java @@ -0,0 +1,17 @@ +package com.mfsys.constant; + +public interface FormPropertyConst { + + String POR_ORGACODE = "POR_ORGACODE"; + String USERID = "cmpUserId"; + String REQUEST_URI = "REQUEST_URI"; + String CLIENT_IP = "CLIENT_IP"; + String THIRD_PARTY = "THIRDPARTY"; + String TEMPLATE_TYPE_NOTIFICATION = "T"; + String PIN_LOCALE_ARABIC = "ar"; + String PIN_LOCALE_FRENCH = "fr"; + + + +} + diff --git a/common/src/main/java/com/mfsys/constant/IDType.java b/common/src/main/java/com/mfsys/constant/IDType.java new file mode 100644 index 0000000..320dff7 --- /dev/null +++ b/common/src/main/java/com/mfsys/constant/IDType.java @@ -0,0 +1,19 @@ +package com.mfsys.constant; + +public enum IDType { + + cnic("CNIC"), + poc("POC"), + nicop("NICOP"), + passport("PASSPORT"); + + private final String value; + + IDType(String value) { + this.value = value; + } + + public String getValue() { + return value; + } +} diff --git a/common/src/main/java/com/mfsys/common/configuration/constant/LoggerURI.java b/common/src/main/java/com/mfsys/constant/LoggerURI.java similarity index 62% rename from common/src/main/java/com/mfsys/common/configuration/constant/LoggerURI.java rename to common/src/main/java/com/mfsys/constant/LoggerURI.java index f586160..9ae8f39 100644 --- a/common/src/main/java/com/mfsys/common/configuration/constant/LoggerURI.java +++ b/common/src/main/java/com/mfsys/constant/LoggerURI.java @@ -1,4 +1,4 @@ -package com.mfsys.common.configuration.constant; +package com.mfsys.constant; public interface LoggerURI { String GET_LOGS_BY_DATES = "/logs/getByDate"; diff --git a/common/src/main/java/com/mfsys/constant/MicroserviceBaseURI.java b/common/src/main/java/com/mfsys/constant/MicroserviceBaseURI.java new file mode 100644 index 0000000..cb6caca --- /dev/null +++ b/common/src/main/java/com/mfsys/constant/MicroserviceBaseURI.java @@ -0,0 +1,5 @@ +package com.mfsys.constant; + +public class MicroserviceBaseURI { + public static final String MConnect = "/MCONNECT"; +} diff --git a/common/src/main/java/com/mfsys/constant/MiddlewareERRCode.java b/common/src/main/java/com/mfsys/constant/MiddlewareERRCode.java new file mode 100644 index 0000000..0164982 --- /dev/null +++ b/common/src/main/java/com/mfsys/constant/MiddlewareERRCode.java @@ -0,0 +1,28 @@ +package com.mfsys.constant; + +public enum MiddlewareERRCode implements ErrorMessage { + + IB_PURPOSE_ALREADY_EXISTS("ERR_MDL_B_0001", "Purpose {1} has already exist"), + + ; + + private MiddlewareERRCode(String code, String description) { + this.code = code; + this.description = description; + } + + private String code; + private String description; + + @Override + public String getCode() { + return this.code; + } + + @Override + public String getDescription() { + return this.description; + } + + +} diff --git a/common/src/main/java/com/mfsys/constant/NotificationMessage.java b/common/src/main/java/com/mfsys/constant/NotificationMessage.java new file mode 100644 index 0000000..8941cea --- /dev/null +++ b/common/src/main/java/com/mfsys/constant/NotificationMessage.java @@ -0,0 +1,6 @@ +package com.mfsys.constant; + +public interface NotificationMessage { + public String getCode(); + public String getDescription(); +} diff --git a/common/src/main/java/com/mfsys/constant/OnlineBankingERRCode.java b/common/src/main/java/com/mfsys/constant/OnlineBankingERRCode.java new file mode 100644 index 0000000..80502e6 --- /dev/null +++ b/common/src/main/java/com/mfsys/constant/OnlineBankingERRCode.java @@ -0,0 +1,76 @@ +package com.mfsys.constant; + +import java.util.Collections; +import java.util.EnumSet; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +public enum OnlineBankingERRCode implements ErrorMessage { + ONLINE_BANKING_CUSTOMER_NOT_EXIST("ERR_OBN_0001", "Customer {0} not registered for online banking"), + BENEFICIARY_DOES_NOT_EXIST("ERR_OBN_0002", "Beneficiary with Account Number {0} does not exist"), + TRANSACTION_DOES_NOT_EXIST("ERR_OBN_0003", "Transaction with Pin Request ID {0} does not exist"), + INVALID_CREDENTIALS("ERR_OBN_0004", "Provided credentials are invalid"), + CUTOMERID_ALREADY_EXIST("ERR_OBN_0005", "You Can not take this User Name"), + BENEFICIARY_ALREADY_EXIST("ERR_OBN_0006", "Beneficiary Already Exist"), + ACCOUNT_ALREADY_EXIST("ERR_OBN_0007", "Account Already Exist"), + CUTOMERID_NOT_EXIST("ERR_OBN_0008", "User ID Not Exist"), + LOCK_USER("ERR_OBN_0009", "Your Account is Lock Due to Five Failed Attemps"), + LOCK_USER_ATTEMPS("ERR_OBN_0010", "Your have {1} Attemps left"), + PASSWORD_NOT_SAME("ERR_OBN_0011", "New password should not be same as old password"), + SERVER_DOWN("ERR_OBN_0012", "Server is down"), + CUSTOMER_IDEN_NOT_EXSIT("ERR_OBN_0013", "Customer Iden Number Not Found"), + USER_NOT_ACTIVE("ERR_OBN_0014", "User Status Not Active"), + OLD_PASSWORD_NOT_MATCHED("ERR_OBN_0015", "password Does Not Match Old Password"), + //InterserviceErrorCodes + ACCOUNT_DOES_NOT_EXIST("ERR_ACC_B_0001", "Customer account {0} does not exist."), + THIRDPARTY_ACCOUNT_DOES_NOT_EXIST("ERR_ACC_B_0006", "Customer account {0} does not exist."), + CUSTOMER_DOES_NOT_EXIST("ERR_CRM_0001", "Customer with ID {0} does not exist"), + INVALID_OTP("ERR_OTP_B_0001","Invalid OTP"), + ACCOUNT_CLOSE("ERR_ACC_B_0004", "Account {1} is closed"), + INSUFFICIENT_BAL("ERR_DEP_B_0001", "Account has insufficient balance"), + BLACKLIST_CUSTOMER("ERR_ACC_B_0015", "Customer {0} is blacklisted."), + TDR_ACCOUNT_NOT_ALLOWED("ERR_ACC_B_0027", "Term Deposit Account is Not Allowed."), + + SMS_GATEWAY_SERVICE_DOWN("ERR_ACC_B_0028","SMS Gateway Service is Down"), + ACCOUNT_RESTRICTION_EXISTS("ERR_ACC_B_0029","Account restriction exists"), + + + ; + + private String code; + private String description; + + private OnlineBankingERRCode(String code, String description) { + this.code = code; + this.description = description; + } + + @Override + public String getCode() { + return this.code; + } + + @Override + public String getDescription() { + return this.description; + } + + public static class Mapper { + private static final Map mapper = new HashMap(); + + public static OnlineBankingERRCode getErrorCode(String code) { + return mapper.get(code); + } + + public static Set getErrorCodes() { + return Collections.unmodifiableSet(mapper.keySet()); + } + + static { + for (OnlineBankingERRCode error : EnumSet.allOf(OnlineBankingERRCode.class)) { + mapper.put(error.getCode(), error); + } + } + } +} diff --git a/common/src/main/java/com/mfsys/constant/OnlineBankingNotifCode.java b/common/src/main/java/com/mfsys/constant/OnlineBankingNotifCode.java new file mode 100644 index 0000000..8a9937b --- /dev/null +++ b/common/src/main/java/com/mfsys/constant/OnlineBankingNotifCode.java @@ -0,0 +1,29 @@ +package com.mfsys.constant; + +public enum OnlineBankingNotifCode implements NotificationMessage { + + CUSTOMER_REGISTRATION_PIN("NTF_OBN_B_0001", "New Online Banking Customer Registration Verification Pin"), + CUSTOMER_ONE_TIME_PIN("NTF_OBN_B_0002", "Customer One Time Pin for First Login Verification"), + CUSTOMER_BENEFICIARY_VERIFY_PIN("NTF_OBN_B_0003", "Customer Beneficiary Verify Pin"), + FINANCIAL_TRANSACTION_VERIFY_PIN("NTF_OBN_B_0004", "Financial Transaction Verification Pin"), + LOAN_FINANCIAL_TRANSACTION_VERIFY_PIN("NTF_OBN_B_0005", "Loan Financial Transaction Verification Pin"); + + private String code; + private String description; + + private OnlineBankingNotifCode(String code, String description) { + this.code = code; + this.description = description; + } + + @Override + public String getCode() { + return code; + } + + @Override + public String getDescription() { + return description; + } + +} diff --git a/common/src/main/java/com/mfsys/constant/OnlineBankingURI.java b/common/src/main/java/com/mfsys/constant/OnlineBankingURI.java new file mode 100644 index 0000000..57b71f7 --- /dev/null +++ b/common/src/main/java/com/mfsys/constant/OnlineBankingURI.java @@ -0,0 +1,100 @@ +package com.mfsys.constant; + + +public interface OnlineBankingURI { + + String REFRESH_TOKEN = "/refreshtoken"; + + String CUSTOMER_REGISTER = "/customer/register"; + String CUSTOMER_REGISTER_PIN_VERIFY = "/customer/register/pin-verify"; + String CUSTOMER_REGISTER_PIN_RESEND = "/customer/register/pin-resend"; + String CUSTOMER_SET_PASSWORD = "/customer/set-password"; + String CUSTOMER_OTP_RESEND = "/customer/register/otp-resend"; + String CUSTOMER_CHANGE_PASSWORD = "/customer/change-password"; + String CUSTOMER_LOGIN = "/customer/login"; + + String ACCOUNTS_DETAILS = "/accounts/details"; + + String BENEFICIARY = "/beneficiary/organization/{porOrgacode}/customer/{cmpCustcode}/customertype/{pctCstycode}/account/{mbmBkmsnumberRef}"; + String BENEFICIARY_LIST = "/beneficiary/organization/{porOrgacode}/customer/{cmpCustcode}/customertype/{pctCstycode}"; + String BENEFICIARY_VERIFICATION = "/beneficiary/verify"; + String BENEFICIARY_VERIFICATION_PIN_RESEND = "/beneficiary/pin/resend"; + + String ACCOUNT_TO_ACCOUNT_TRANSACTION_REQUEST = "/transaction/request/account-account"; + String ACCOUNT_TO_ACCOUNT_TRANSACTION_POST = "/transaction/post/account-account"; + String TRANSACTION_PIN_RESEND = "/transaction/pin-resend"; + + String CUSTOMER_REGISTER_IDNUMBER = "/customer/register/checkid"; + + String CUSTOMER_REGISTER_ACCOUNT_NO = "/customer/register/checkaccountno"; + String FETCH_ACCOUNT_TITLE = "/thirdparty/user/register/checkaccountno"; + + String CUSTOMER_REGISTER_USERID = "/customer/register/userid"; + + String CUSTOMER_FORGETPASS_USERID = "/customer/forgetPassword/userid"; + + String ADD_BENEFICIARY = "/beneficiary/channel/{channelCode}"; + + String ADD_BENEFICIARY_URL = "/beneficiary"; + + String ACCOUNTS_HISTORY = "/accounts/history"; + + String LOAN_ACCOUNT_INDV_DETAILS_URI = "/account/indvdetails"; + + String LOAN_ACCOUNT_REQUEST_PAY="/transactions/channel/{channelCode}/customer/{cmpCustcode}/customertype/{pctCstycode}/pay/{obpPincode}"; + String LOAN_INDIVIDUAL_REPAYMENT_TRANSACTION_URI = "/transactions/pay"; + + String CUSTOMER_OTP_SEND = "/customer/login/otp-send"; + + String LOAN_ACCOUNT_TRAN_HISTORY = "/account/loan/history"; + + String CUSTOMER_FORGETPASS = "/customer/forgetpassword"; + + String CUSTOMER_UPDATEPASSWORD = "/customer/updatepassword"; + + String ACCOUNT_ACTIVITY = "/account/activity/organization/{porOrgacode}/customer/{cmpCustcode}/customertype/{pctCstycode}/fromdate/{fdate}/todate/{tdate}"; + String POST_ACCOUNT_ACTIVITY = "/account/activity/organization/{porOrgacode}/customer/{cmpCustcode}/customertype/{pctCstycode}"; + + String ZAKAT_HISTORY = "/account/zakat/details"; + + String TEST_PIN = "/account/pin"; + + String LOAN_TRANSACTION_PIN_RESEND = "/loan/transaction/pin-resend/channel/{channelCode}"; + + String LOAN_TRANSACTION_PIN_SEND = "/loan/transaction/pin-send/channel/{channelCode}"; + + String CUSTOMER_ACCOUNT_DETAILS = "/customer/account/details"; + + String UPDATE_CUSTOMER_DETAILS = "/customer/update"; + + String report = "/customer/account/report"; + + String Bankingreport = "/generate/report"; + String CUSTOMER_REGISTRATION_CHECKID = "/thirdparty/user/register/checkid"; + String CHECK_CUSTOMER_ACCOUNT_NO = "/thirdparty/user/register/checkaccountno"; + String THIRD_PARTY_CUSTOMER_REGISTER = "/thirdparty/user/register"; + String THIRDPARTY_CUSTOMER_REGISTER_PIN_RESEND = "/thirdparty/user/register/pin-resend"; + String THIRDPARTY_CUSTOMER_SET_PASSWORD = "/thirdparty/user/set-password"; + String THIRDPARTY_CUSTOMER_REGISTER_PIN_VERIFY = "/thirdparty/user/register/pin-verify"; + String CHANNEL_REGISTRATION = "/thirdparty/channel/register"; + String THIRDPARTY_USER_AUTHENTICATION = "/thirdparty/user/auth"; + String THIRDPARTY_ACCOUNT_DETAILS = "/thirdparty/deposit/account/details"; + String THIRDPARTY_CUSTOMER_UPDATEPASSWORD = "/thirdparty/user/update-password"; + String THIRDPARTY_DEPOSIT_ACCOUNT_BALANCE_INQUIRY = "/thirdparty/deposit/account/balance-inquiry"; + String THIRDPARTY_ACCOUNT_TO_ACCOUNT_TRANSACTION_REQUEST = "/thirdparty/deposit/transaction/acc-acc"; + String THIRDPARTY_ACCOUNT_TO_ACCOUNT_TRANSACTION_POST = "/thirdparty/deposit/transaction/post/acc-acc"; + String THIRDPARTY_MINI_ACCOUNT_STATEMENT = "/thirdparty/deposit/account/mini-statement"; + String THIRDPARTY_ACCOUNT_TO_SAMA_WALLET_TRANSACTION = "/thirdparty/deposit/transaction/acc-wallet"; + String THIRDPARTY_ACCOUNT_TO_GL_TRANSACTION = "/thirdparty/deposit/transaction/acc-gl"; + String ACCOUNT_TO_GL_TRANSACTION_REQUEST = "/transaction/request/account-gl"; + String FETCH_CHANNEL_LIST = "/thirdparty/channel/register"; + String THIRDPARTY_PHONENUMBER = "/thirdparty/deposit/transaction/phoneNumber"; + String FETCH_IDENTIFIERS = "/include/fetch/identifiers"; + String THIRDPARTY_SAMA_WALLET_TO_ACCOUNT_TRANSACTION = "/thirdparty/deposit/transaction/wallet-acc"; + String THIRDPARTY_SAMA_WALLET_TO_ACCOUNT = "/transaction/request/gl-account"; + String THIRDPARTY_FORGET_PASSWORD_GENERATE_OTP = "/thirdparty/user/forget-password/generate-otp"; + String THIRDPARTY_FORGET_PASSWORD_SET_PASSWORD= "/thirdparty/user/forget-password/set-password"; + String THIRDPARTY_FORGET_PASSWORD_PIN_VERIFY = "/thirdparty/user/forget-password/pin-verify"; + // String FETCH_CHANNEL_LIST = "/thirdparty/channel/register"; + +} diff --git a/common/src/main/java/com/mfsys/constant/PROFILES.java b/common/src/main/java/com/mfsys/constant/PROFILES.java new file mode 100644 index 0000000..26f3819 --- /dev/null +++ b/common/src/main/java/com/mfsys/constant/PROFILES.java @@ -0,0 +1,12 @@ +package com.mfsys.constant; + +public class PROFILES { + + public static final String AWS = "aws"; + public static final String NOT_AWS = "!" + AWS; + public static final String DEV = "dev"; + public static final String NOT_TEST = "!test"; + public static final String RELEASE = "release"; + + +} diff --git a/common/src/main/java/com/mfsys/constant/PinConstants.java b/common/src/main/java/com/mfsys/constant/PinConstants.java new file mode 100644 index 0000000..dc78955 --- /dev/null +++ b/common/src/main/java/com/mfsys/constant/PinConstants.java @@ -0,0 +1,8 @@ +package com.mfsys.constant; + +public interface PinConstants { + + int PIN_LENGTH = 4; + int PIN_UPPER_BOUND_4 = 10000; + String PIN_PADDING_CONSTANT_4 = "%04d"; +} diff --git a/common/src/main/java/com/mfsys/constant/PinStatus.java b/common/src/main/java/com/mfsys/constant/PinStatus.java new file mode 100644 index 0000000..7c64bcb --- /dev/null +++ b/common/src/main/java/com/mfsys/constant/PinStatus.java @@ -0,0 +1,8 @@ +package com.mfsys.constant; + +public interface PinStatus { + + String PIN_UNVERIFIED = "Unverified"; + String PIN_VERIFIED = "Verified"; + String PIN_EXPIRED = "Expired"; +} diff --git a/common/src/main/java/com/mfsys/constant/PinType.java b/common/src/main/java/com/mfsys/constant/PinType.java new file mode 100644 index 0000000..4740e60 --- /dev/null +++ b/common/src/main/java/com/mfsys/constant/PinType.java @@ -0,0 +1,48 @@ +package com.mfsys.constant; + +import java.util.Collections; +import java.util.EnumSet; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +public enum PinType { + + ONE_TIME_PIN("OTP"), + REGISTRATION_VERIFY_PIN("REG"), + BENEFICIARY_VERIFY_PIN("BEN"), + + FINANCIAL_TRANSACTION_PIN("FTP"), + LOAN_FINANCIAL_TRANSACTION_PIN("LTP"), + DEPOSIT_TRANSACTION_PIN("DTP"), + ; + + private String code; + + private PinType(String code) { + this.code = code; + } + + public String getCode() { + return code; + } + + public static class Mapper { + private static final Map mapper = new HashMap(); + + public static PinType getPinType(String code) { + return mapper.get(code); + } + + public static Set getPinTypes() { + return Collections.unmodifiableSet(mapper.keySet()); + } + + static { + for (PinType pin : EnumSet.allOf(PinType.class)) { + mapper.put(pin.getCode(), pin); + } + } + + } +} diff --git a/common/src/main/java/com/mfsys/constant/PropertyConstant.java b/common/src/main/java/com/mfsys/constant/PropertyConstant.java new file mode 100644 index 0000000..9117489 --- /dev/null +++ b/common/src/main/java/com/mfsys/constant/PropertyConstant.java @@ -0,0 +1,5 @@ +package com.mfsys.constant; + +public interface PropertyConstant { + +} diff --git a/common/src/main/java/com/mfsys/common/configuration/constant/TokenBypassURI.java b/common/src/main/java/com/mfsys/constant/TokenBypassURI.java similarity index 84% rename from common/src/main/java/com/mfsys/common/configuration/constant/TokenBypassURI.java rename to common/src/main/java/com/mfsys/constant/TokenBypassURI.java index f1a61e1..e28d890 100644 --- a/common/src/main/java/com/mfsys/common/configuration/constant/TokenBypassURI.java +++ b/common/src/main/java/com/mfsys/constant/TokenBypassURI.java @@ -1,4 +1,4 @@ -package com.mfsys.common.configuration.constant; +package com.mfsys.constant; import java.util.ArrayList; import java.util.Arrays; @@ -7,6 +7,7 @@ import java.util.List; public interface TokenBypassURI { List URIs = new ArrayList(Arrays.asList( "/aconnect/signin", + "/aconnect/loginUser", "/aconnect/transactions/accounttogl", "/aconnect/account/miscDetails", "/deposit/account/miscDetails", @@ -23,7 +24,8 @@ public interface TokenBypassURI { "/aconnect/generalledger/transactions/reversal", "/aconnect/deposit/transactions/rejection", - "/aconnect/generalledger/transactions/rejection" + "/aconnect/generalledger/transactions/rejection", + "/aconnect/generate" )); } diff --git a/common/src/main/java/com/mfsys/constant/TransactionType.java b/common/src/main/java/com/mfsys/constant/TransactionType.java new file mode 100644 index 0000000..9387eb6 --- /dev/null +++ b/common/src/main/java/com/mfsys/constant/TransactionType.java @@ -0,0 +1,9 @@ +package com.mfsys.constant; + +public interface TransactionType { + + // TODO: Must be stored in DB + String ACCOUNT_TO_ACCOUNT_FUNDS_TRANSFER = "ATAFT"; + String LOAN_ACCOUNT_FUNDS_TRANSFER = "LAFT"; + String ACCOUNT_TO_WALLET_FUNDS_TRANSFER = "ATWFT"; +} \ No newline at end of file diff --git a/common/src/main/java/com/mfsys/common/configuration/controller/LoggerController.java b/common/src/main/java/com/mfsys/controller/LoggerController.java similarity index 76% rename from common/src/main/java/com/mfsys/common/configuration/controller/LoggerController.java rename to common/src/main/java/com/mfsys/controller/LoggerController.java index 89bec93..ff46db8 100644 --- a/common/src/main/java/com/mfsys/common/configuration/controller/LoggerController.java +++ b/common/src/main/java/com/mfsys/controller/LoggerController.java @@ -1,8 +1,8 @@ -package com.mfsys.common.configuration.controller; +package com.mfsys.controller; -import com.mfsys.common.configuration.constant.LoggerURI; -import com.mfsys.common.configuration.model.Logger; -import com.mfsys.common.configuration.service.LoggerService; +import com.mfsys.constant.LoggerURI; +import com.mfsys.model.Logger; +import com.mfsys.service.LoggerService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; diff --git a/common/src/main/java/com/mfsys/common/configuration/exception/ApplicationException.java b/common/src/main/java/com/mfsys/exception/ApplicationException.java similarity index 96% rename from common/src/main/java/com/mfsys/common/configuration/exception/ApplicationException.java rename to common/src/main/java/com/mfsys/exception/ApplicationException.java index 298dfaf..4ef47db 100644 --- a/common/src/main/java/com/mfsys/common/configuration/exception/ApplicationException.java +++ b/common/src/main/java/com/mfsys/exception/ApplicationException.java @@ -1,4 +1,4 @@ -package com.mfsys.common.configuration.exception; +package com.mfsys.exception; import java.text.MessageFormat; diff --git a/common/src/main/java/com/mfsys/common/configuration/exception/ApplicationExceptionMapper.java b/common/src/main/java/com/mfsys/exception/ApplicationExceptionMapper.java similarity index 99% rename from common/src/main/java/com/mfsys/common/configuration/exception/ApplicationExceptionMapper.java rename to common/src/main/java/com/mfsys/exception/ApplicationExceptionMapper.java index 0370565..485365b 100644 --- a/common/src/main/java/com/mfsys/common/configuration/exception/ApplicationExceptionMapper.java +++ b/common/src/main/java/com/mfsys/exception/ApplicationExceptionMapper.java @@ -1,4 +1,4 @@ -package com.mfsys.common.configuration.exception; +package com.mfsys.exception; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/common/src/main/java/com/mfsys/exception/DecryptionException.java b/common/src/main/java/com/mfsys/exception/DecryptionException.java new file mode 100644 index 0000000..5365eea --- /dev/null +++ b/common/src/main/java/com/mfsys/exception/DecryptionException.java @@ -0,0 +1,11 @@ +package com.mfsys.exception; + +public class DecryptionException extends Exception{ + public DecryptionException(String message) { + super(message); + } + + public DecryptionException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/common/src/main/java/com/mfsys/common/configuration/exception/DuplicateException.java b/common/src/main/java/com/mfsys/exception/DuplicateException.java similarity index 76% rename from common/src/main/java/com/mfsys/common/configuration/exception/DuplicateException.java rename to common/src/main/java/com/mfsys/exception/DuplicateException.java index a92fb23..c4f1fd9 100644 --- a/common/src/main/java/com/mfsys/common/configuration/exception/DuplicateException.java +++ b/common/src/main/java/com/mfsys/exception/DuplicateException.java @@ -1,4 +1,4 @@ -package com.mfsys.common.configuration.exception; +package com.mfsys.exception; public class DuplicateException extends ApplicationException { public DuplicateException(ErrorMessage errCode){ diff --git a/common/src/main/java/com/mfsys/common/configuration/exception/ErrorMessage.java b/common/src/main/java/com/mfsys/exception/ErrorMessage.java similarity index 66% rename from common/src/main/java/com/mfsys/common/configuration/exception/ErrorMessage.java rename to common/src/main/java/com/mfsys/exception/ErrorMessage.java index 0c082a8..2a2c1f1 100644 --- a/common/src/main/java/com/mfsys/common/configuration/exception/ErrorMessage.java +++ b/common/src/main/java/com/mfsys/exception/ErrorMessage.java @@ -1,4 +1,4 @@ -package com.mfsys.common.configuration.exception; +package com.mfsys.exception; public interface ErrorMessage { public String getCode(); diff --git a/common/src/main/java/com/mfsys/common/configuration/exception/ExceptionDAO.java b/common/src/main/java/com/mfsys/exception/ExceptionDAO.java similarity index 89% rename from common/src/main/java/com/mfsys/common/configuration/exception/ExceptionDAO.java rename to common/src/main/java/com/mfsys/exception/ExceptionDAO.java index d86e81a..3c86741 100644 --- a/common/src/main/java/com/mfsys/common/configuration/exception/ExceptionDAO.java +++ b/common/src/main/java/com/mfsys/exception/ExceptionDAO.java @@ -1,4 +1,4 @@ -package com.mfsys.common.configuration.exception; +package com.mfsys.exception; public class ExceptionDAO { diff --git a/common/src/main/java/com/mfsys/common/configuration/exception/ExceptionUtil.java b/common/src/main/java/com/mfsys/exception/ExceptionUtil.java similarity index 89% rename from common/src/main/java/com/mfsys/common/configuration/exception/ExceptionUtil.java rename to common/src/main/java/com/mfsys/exception/ExceptionUtil.java index 53aaa99..17230f6 100644 --- a/common/src/main/java/com/mfsys/common/configuration/exception/ExceptionUtil.java +++ b/common/src/main/java/com/mfsys/exception/ExceptionUtil.java @@ -1,4 +1,4 @@ -package com.mfsys.common.configuration.exception; +package com.mfsys.exception; import org.slf4j.MDC; diff --git a/common/src/main/java/com/mfsys/common/configuration/exception/ResourceNotFoundException.java b/common/src/main/java/com/mfsys/exception/ResourceNotFoundException.java similarity index 78% rename from common/src/main/java/com/mfsys/common/configuration/exception/ResourceNotFoundException.java rename to common/src/main/java/com/mfsys/exception/ResourceNotFoundException.java index 9f495fe..7a74605 100644 --- a/common/src/main/java/com/mfsys/common/configuration/exception/ResourceNotFoundException.java +++ b/common/src/main/java/com/mfsys/exception/ResourceNotFoundException.java @@ -1,4 +1,4 @@ -package com.mfsys.common.configuration.exception; +package com.mfsys.exception; public class ResourceNotFoundException extends ApplicationException { public ResourceNotFoundException(String porOrgacode, ErrorMessage errCode){ diff --git a/common/src/main/java/com/mfsys/common/configuration/filter/CORSResponseFilter.java b/common/src/main/java/com/mfsys/filter/CORSResponseFilter.java similarity index 98% rename from common/src/main/java/com/mfsys/common/configuration/filter/CORSResponseFilter.java rename to common/src/main/java/com/mfsys/filter/CORSResponseFilter.java index eaca561..358b3b3 100644 --- a/common/src/main/java/com/mfsys/common/configuration/filter/CORSResponseFilter.java +++ b/common/src/main/java/com/mfsys/filter/CORSResponseFilter.java @@ -1,4 +1,4 @@ -package com.mfsys.common.configuration.filter; +package com.mfsys.filter; import java.io.ByteArrayInputStream; import java.io.IOException; @@ -12,7 +12,7 @@ import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; -import com.mfsys.common.configuration.constant.FilterPriority; +import com.mfsys.constant.FilterPriority; import jakarta.servlet.FilterChain; import jakarta.servlet.ReadListener; import jakarta.servlet.ServletException; diff --git a/common/src/main/java/com/mfsys/common/configuration/filter/LoggingFilter.java b/common/src/main/java/com/mfsys/filter/LoggingFilter.java similarity index 93% rename from common/src/main/java/com/mfsys/common/configuration/filter/LoggingFilter.java rename to common/src/main/java/com/mfsys/filter/LoggingFilter.java index fd2e2f8..1c3ad88 100644 --- a/common/src/main/java/com/mfsys/common/configuration/filter/LoggingFilter.java +++ b/common/src/main/java/com/mfsys/filter/LoggingFilter.java @@ -1,9 +1,9 @@ -package com.mfsys.common.configuration.filter; +package com.mfsys.filter; import com.fasterxml.jackson.databind.ObjectMapper; -import com.mfsys.common.configuration.constant.FilterPriority; -import com.mfsys.common.configuration.model.Logger; -import com.mfsys.common.configuration.repository.LoggerRepository; +import com.mfsys.constant.FilterPriority; +import com.mfsys.model.Logger; +import com.mfsys.repository.LoggerRepository; import jakarta.servlet.FilterChain; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; diff --git a/common/src/main/java/com/mfsys/filter/RefreshToken.java b/common/src/main/java/com/mfsys/filter/RefreshToken.java new file mode 100644 index 0000000..304d460 --- /dev/null +++ b/common/src/main/java/com/mfsys/filter/RefreshToken.java @@ -0,0 +1,20 @@ +package com.mfsys.filter; + +public class RefreshToken { + + private String token; + + public RefreshToken(String token) { + super(); + this.token = token; + } + + public String getToken() { + return token; + } + + public void setToken(String token) { + this.token = token; + } + +} diff --git a/common/src/main/java/com/mfsys/common/configuration/filter/TokenAuthenticationFilter.java b/common/src/main/java/com/mfsys/filter/TokenAuthenticationFilter.java similarity index 88% rename from common/src/main/java/com/mfsys/common/configuration/filter/TokenAuthenticationFilter.java rename to common/src/main/java/com/mfsys/filter/TokenAuthenticationFilter.java index 5a2a2ef..d828aae 100644 --- a/common/src/main/java/com/mfsys/common/configuration/filter/TokenAuthenticationFilter.java +++ b/common/src/main/java/com/mfsys/filter/TokenAuthenticationFilter.java @@ -1,11 +1,10 @@ -package com.mfsys.common.configuration.filter; +package com.mfsys.filter; import java.io.IOException; import java.util.Objects; -import com.mfsys.common.configuration.constant.PropertyConstant; -import com.mfsys.common.configuration.constant.TokenBypassURI; -import com.mfsys.common.configuration.service.JwtService; +import com.mfsys.constant.TokenBypassURI; +import com.mfsys.service.JwtService; import jakarta.servlet.FilterChain; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; @@ -17,7 +16,7 @@ import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import org.springframework.web.filter.OncePerRequestFilter; -import com.mfsys.common.configuration.constant.FilterPriority; +import com.mfsys.constant.FilterPriority; @Component @Order(FilterPriority.AUTHENTICATION) diff --git a/common/src/main/java/com/mfsys/common/configuration/model/Logger.java b/common/src/main/java/com/mfsys/model/Logger.java similarity index 95% rename from common/src/main/java/com/mfsys/common/configuration/model/Logger.java rename to common/src/main/java/com/mfsys/model/Logger.java index 16b6c6c..a421edf 100644 --- a/common/src/main/java/com/mfsys/common/configuration/model/Logger.java +++ b/common/src/main/java/com/mfsys/model/Logger.java @@ -1,4 +1,4 @@ -package com.mfsys.common.configuration.model; +package com.mfsys.model; import jakarta.persistence.*; import lombok.AllArgsConstructor; diff --git a/common/src/main/java/com/mfsys/common/configuration/repository/LoggerRepository.java b/common/src/main/java/com/mfsys/repository/LoggerRepository.java similarity index 77% rename from common/src/main/java/com/mfsys/common/configuration/repository/LoggerRepository.java rename to common/src/main/java/com/mfsys/repository/LoggerRepository.java index 507a207..1a29112 100644 --- a/common/src/main/java/com/mfsys/common/configuration/repository/LoggerRepository.java +++ b/common/src/main/java/com/mfsys/repository/LoggerRepository.java @@ -1,6 +1,6 @@ -package com.mfsys.common.configuration.repository; +package com.mfsys.repository; -import com.mfsys.common.configuration.model.Logger; +import com.mfsys.model.Logger; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; diff --git a/common/src/main/java/com/mfsys/service/JwtService.java b/common/src/main/java/com/mfsys/service/JwtService.java new file mode 100644 index 0000000..fa2fb77 --- /dev/null +++ b/common/src/main/java/com/mfsys/service/JwtService.java @@ -0,0 +1,98 @@ +package com.mfsys.service; + +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.JwtException; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.security.Keys; +import jakarta.xml.bind.DatatypeConverter; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import javax.crypto.SecretKey; +import java.security.Key; +import java.time.Instant; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.function.Function; + +@Service +public class JwtService { + + @Value("${app.jwtSecretKey}") + private String secret; + + @Value("${app.jwtExpirationMs}") + private Long expiration; + + @Value("${app.jwtMaxIdleMs}") + private Long refreshExpiration; + + public String extractUsername(String token) { + return extractClaim(token, Claims::getSubject); + } + + public Date extractExpiration(String token) { + return extractClaim(token, Claims::getExpiration); + } + + public T extractClaim(String token, Function claimsResolver) { + final Claims claims = extractAllClaims(token); + return claimsResolver.apply(claims); + } + + private Claims extractAllClaims(String token) { + try { + return Jwts.parser() + .verifyWith((SecretKey) getSigningKey()) + .build() + .parseSignedClaims(token) + .getPayload(); + } catch (JwtException e) { + throw new RuntimeException("Invalid JWT token", e); + } + } + + private Boolean isTokenExpired(String token) { + return extractExpiration(token).before(new Date()); + } + + public String generateToken(String subject) { + Map claims = new HashMap<>(); + return createToken(claims, subject, expiration); + } + + public String generateRefreshToken(String subject) { + Map claims = new HashMap<>(); + return createToken(claims, subject, refreshExpiration); + } + + private String createToken(Map claims, String subject, Long expiration) { + Instant now = Instant.now(); + return Jwts.builder() + .claims(claims) + .subject(subject) + .issuedAt(Date.from(now)) + .expiration(Date.from(now.plusMillis(expiration))) + .signWith(getSigningKey()) + .compact(); + } + + public Boolean validateToken(String token, String subject) { + final String username = extractUsername(token); + return (username.equals(subject) && !isTokenExpired(token)); + } + + public Boolean isTokenValid(String token) { + try { + return !isTokenExpired(token); + } catch (Exception e) { + return false; + } + } + + private Key getSigningKey() { + byte[] keyBytes = DatatypeConverter.parseBase64Binary(secret); + return Keys.hmacShaKeyFor(keyBytes); + } +} diff --git a/common/src/main/java/com/mfsys/common/configuration/service/LoggerService.java b/common/src/main/java/com/mfsys/service/LoggerService.java similarity index 82% rename from common/src/main/java/com/mfsys/common/configuration/service/LoggerService.java rename to common/src/main/java/com/mfsys/service/LoggerService.java index 2a44027..f64f800 100644 --- a/common/src/main/java/com/mfsys/common/configuration/service/LoggerService.java +++ b/common/src/main/java/com/mfsys/service/LoggerService.java @@ -1,7 +1,7 @@ -package com.mfsys.common.configuration.service; +package com.mfsys.service; -import com.mfsys.common.configuration.model.Logger; -import com.mfsys.common.configuration.repository.LoggerRepository; +import com.mfsys.model.Logger; +import com.mfsys.repository.LoggerRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; diff --git a/common/src/main/java/com/mfsys/common/configuration/service/PasswordEncryptionService.java b/common/src/main/java/com/mfsys/service/PasswordEncryptionService.java similarity index 89% rename from common/src/main/java/com/mfsys/common/configuration/service/PasswordEncryptionService.java rename to common/src/main/java/com/mfsys/service/PasswordEncryptionService.java index 46962bc..47c5a1c 100644 --- a/common/src/main/java/com/mfsys/common/configuration/service/PasswordEncryptionService.java +++ b/common/src/main/java/com/mfsys/service/PasswordEncryptionService.java @@ -1,4 +1,4 @@ -package com.mfsys.common.configuration.service; +package com.mfsys.service; import org.mindrot.jbcrypt.BCrypt; import org.springframework.stereotype.Service; diff --git a/common/src/main/java/com/mfsys/trust/CustomClaimsProperty.java b/common/src/main/java/com/mfsys/trust/CustomClaimsProperty.java new file mode 100644 index 0000000..96d0ca5 --- /dev/null +++ b/common/src/main/java/com/mfsys/trust/CustomClaimsProperty.java @@ -0,0 +1,17 @@ +package com.mfsys.trust; + +public enum CustomClaimsProperty { + + LAST_ACTIVE_TIME("lastActiveTime"), URLS("urls"); + + CustomClaimsProperty(String code) { + this.code = code; + } + + public String getCode() { + return this.code; + } + + private String code; + +} diff --git a/common/src/main/java/com/mfsys/trust/DefaultUrl.java b/common/src/main/java/com/mfsys/trust/DefaultUrl.java new file mode 100644 index 0000000..2304285 --- /dev/null +++ b/common/src/main/java/com/mfsys/trust/DefaultUrl.java @@ -0,0 +1,32 @@ +package com.mfsys.trust; + +import java.util.Collections; +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class DefaultUrl implements Urls { + + protected final List urls; + protected final String type; + + public DefaultUrl(@JsonProperty("urls") List urls, @JsonProperty("type") String type) { + this.urls = createUrlList(urls); + this.type = type; + } + + private List createUrlList(List urls) { + return Collections.unmodifiableList(urls); + } + + @Override + public List getUrls() { + return urls; + } + + @Override + public String getType() { + return type; + } + +} diff --git a/common/src/main/java/com/mfsys/trust/IncludeAllUrl.java b/common/src/main/java/com/mfsys/trust/IncludeAllUrl.java new file mode 100644 index 0000000..84075f6 --- /dev/null +++ b/common/src/main/java/com/mfsys/trust/IncludeAllUrl.java @@ -0,0 +1,11 @@ +package com.mfsys.trust; + +import java.util.Arrays; + +public final class IncludeAllUrl extends DefaultUrl { + + public IncludeAllUrl() { + super(Arrays.asList("*"), UrlType.INCLUDE_ALL.getCode()); + } + +} diff --git a/common/src/main/java/com/mfsys/trust/JWTToken.java b/common/src/main/java/com/mfsys/trust/JWTToken.java new file mode 100644 index 0000000..75e7728 --- /dev/null +++ b/common/src/main/java/com/mfsys/trust/JWTToken.java @@ -0,0 +1,86 @@ +//package com.mfsys.trust; +// +//import java.security.Key; +//import java.util.Date; +// +//import javax.crypto.spec.SecretKeySpec; +//import jakarta.xml.bind.DatatypeConverter; +// +//import io.jsonwebtoken.Claims; +//import io.jsonwebtoken.ExpiredJwtException; +//import io.jsonwebtoken.JwtBuilder; +//import io.jsonwebtoken.Jwts; +//import io.jsonwebtoken.SignatureAlgorithm; +// +//public final class JWTToken { +// +// // The JWT signature algorithm we will be using to sign the token +// // TODO KM Modify it to RSA algo +// private static SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS512; +// +// private JWTToken() { +// } +// +// public static String generateJWT(String id, String subject, String issuer, String secretKey, long expirationMs, +// String defaultUrl) { +// +// // We will sign our JWT with our ApiKey secret +// byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary(secretKey); +// Key signingKey = new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName()); +// +// // Let's set the JWT Claims +// JwtBuilder builder = Jwts.builder().setId(id).setSubject(subject).setIssuer(issuer).setIssuedAt(new Date()) +// .setExpiration(new Date((new Date()).getTime() + expirationMs)) +// .claim(CustomClaimsProperty.LAST_ACTIVE_TIME.getCode(), new Date()) +// .claim(CustomClaimsProperty.URLS.getCode(), defaultUrl).signWith(signatureAlgorithm, signingKey); +// +// // Builds the JWT and serializes it to a compact, URL-safe string +// return builder.compact(); +// } +// +// public static String refreshJWT(String jwt, String id, String subject, long maxIdleTime, String issuer, +// String secretKey, long expirationMs) { +// try { +// Claims claims = Jwts.parser() +// .setSigningKey(DatatypeConverter.parseBase64Binary(secretKey)) +// .build() +// .parseSignedClaims(jwt) +// .getPayload(); +// +// return generateJWT(id, subject, issuer, secretKey, expirationMs, +// claims.get(CustomClaimsProperty.URLS.getCode(), String.class)); +// } catch (ExpiredJwtException e) { +// if (new Date().getTime() - e.getClaims().get(CustomClaimsProperty.LAST_ACTIVE_TIME.getCode(), Date.class) +// .getTime() > maxIdleTime) { +// throw e; +// } else { +// return generateJWT(id, subject, issuer, secretKey, expirationMs, +// e.getClaims().get(CustomClaimsProperty.URLS.getCode(), String.class)); +// } +// } +// } +// +// public static Claims parseJWT(String jwt, String secretKey) { +// +// // This line will throw an exception if it is not a signed JWS (as expected) +// return Jwts.parser() +// .setSigningKey(DatatypeConverter.parseBase64Binary(secretKey)) +// .build() +// .parseSignedClaims(jwt) +// .getPayload(); +// +// } +// +// public static String updateLastActiveTime(String jwt, String secretKey) { +// byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary(secretKey); +// Claims claims = Jwts.parser() +// .setSigningKey(DatatypeConverter.parseBase64Binary(secretKey)) +// .build() +// .parseSignedClaims(jwt) +// .getPayload(); +// claims.put(CustomClaimsProperty.LAST_ACTIVE_TIME.getCode(), new Date()); +// Key signingKey = new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName()); +// return Jwts.builder().setClaims(claims).signWith(signatureAlgorithm, signingKey).compact(); +// } +// +//} diff --git a/common/src/main/java/com/mfsys/trust/UrlType.java b/common/src/main/java/com/mfsys/trust/UrlType.java new file mode 100644 index 0000000..9bc1a51 --- /dev/null +++ b/common/src/main/java/com/mfsys/trust/UrlType.java @@ -0,0 +1,17 @@ +package com.mfsys.trust; + +public enum UrlType { + + INCLUDE("include"), EXCLUDE("exclude"), INCLUDE_ALL("includeAll"); + + UrlType(String code) { + this.code = code; + } + + public String getCode() { + return this.code; + } + + private String code; + +} diff --git a/common/src/main/java/com/mfsys/trust/Urls.java b/common/src/main/java/com/mfsys/trust/Urls.java new file mode 100644 index 0000000..076a02c --- /dev/null +++ b/common/src/main/java/com/mfsys/trust/Urls.java @@ -0,0 +1,8 @@ +package com.mfsys.trust; + +import java.util.List; + +public interface Urls { + public List getUrls(); + public String getType(); +} diff --git a/common/src/main/java/com/mfsys/common/configuration/util/JSONUtil.java b/common/src/main/java/com/mfsys/util/JSONUtil.java similarity index 98% rename from common/src/main/java/com/mfsys/common/configuration/util/JSONUtil.java rename to common/src/main/java/com/mfsys/util/JSONUtil.java index 95b1e7e..795b912 100644 --- a/common/src/main/java/com/mfsys/common/configuration/util/JSONUtil.java +++ b/common/src/main/java/com/mfsys/util/JSONUtil.java @@ -1,4 +1,4 @@ -package com.mfsys.common.configuration.util; +package com.mfsys.util; import java.io.IOException; import java.io.InputStream; diff --git a/common/src/main/resources/application.properties b/common/src/main/resources/application.properties index 8b13789..e69de29 100644 --- a/common/src/main/resources/application.properties +++ b/common/src/main/resources/application.properties @@ -1 +0,0 @@ - diff --git a/econnect/pom.xml b/econnect/pom.xml index 13b9db9..37987d6 100644 --- a/econnect/pom.xml +++ b/econnect/pom.xml @@ -85,23 +85,23 @@ - - io.jsonwebtoken - jjwt-api - 0.12.3 - - - io.jsonwebtoken - jjwt-impl - 0.12.3 - runtime - - - io.jsonwebtoken - jjwt-jackson - 0.12.3 - runtime - + + + + + + + + + + + + + + + + + @@ -132,6 +132,7 @@ org.springframework spring-context + diff --git a/econnect/src/main/java/com/mfsys/aconnect/client/controller/LoginController.java b/econnect/src/main/java/com/mfsys/aconnect/client/controller/LoginController.java index ffbf6c7..27ddab2 100644 --- a/econnect/src/main/java/com/mfsys/aconnect/client/controller/LoginController.java +++ b/econnect/src/main/java/com/mfsys/aconnect/client/controller/LoginController.java @@ -2,7 +2,7 @@ package com.mfsys.aconnect.client.controller; import com.mfsys.aconnect.client.dto.SigninRequest; import com.mfsys.aconnect.client.service.LoginService; -import com.mfsys.common.configuration.constant.AconnectURI; +import com.mfsys.constant.AconnectURI; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; diff --git a/econnect/src/main/java/com/mfsys/aconnect/client/controller/TransactionController.java b/econnect/src/main/java/com/mfsys/aconnect/client/controller/TransactionController.java index 8be0864..4a96b2d 100644 --- a/econnect/src/main/java/com/mfsys/aconnect/client/controller/TransactionController.java +++ b/econnect/src/main/java/com/mfsys/aconnect/client/controller/TransactionController.java @@ -2,7 +2,7 @@ package com.mfsys.aconnect.client.controller; import com.mfsys.aconnect.client.dto.*; import com.mfsys.aconnect.client.service.TransactionService; -import com.mfsys.common.configuration.constant.AconnectURI; +import com.mfsys.constant.AconnectURI; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.format.annotation.DateTimeFormat; import org.springframework.http.ResponseEntity; diff --git a/econnect/src/main/java/com/mfsys/aconnect/client/service/TransactionService.java b/econnect/src/main/java/com/mfsys/aconnect/client/service/TransactionService.java index 3a468bb..9dd821d 100644 --- a/econnect/src/main/java/com/mfsys/aconnect/client/service/TransactionService.java +++ b/econnect/src/main/java/com/mfsys/aconnect/client/service/TransactionService.java @@ -14,7 +14,7 @@ import java.time.LocalDate; import java.util.Map; -import static com.mfsys.common.configuration.constant.AconnectURI.DEPOSIT_CIIHIVE_ACCOUNT_MISCELLANEOUS_DETAILS_URI; +import static com.mfsys.constant.AconnectURI.DEPOSIT_CIIHIVE_ACCOUNT_MISCELLANEOUS_DETAILS_URI; @Service diff --git a/econnect/src/main/java/com/mfsys/aconnect/security/controller/JwtTestController.java b/econnect/src/main/java/com/mfsys/aconnect/security/controller/JwtTestController.java new file mode 100644 index 0000000..e69ced0 --- /dev/null +++ b/econnect/src/main/java/com/mfsys/aconnect/security/controller/JwtTestController.java @@ -0,0 +1,30 @@ +package com.mfsys.aconnect.security.controller; + +import com.mfsys.service.JwtService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.Base64; + +@RestController +public class JwtTestController { + + @Autowired + private JwtService jwtService; + + // Example: http://localhost:8080/test/generate?username=testuser + // Example: http://localhost:8080/test/generate?username=testuser + @GetMapping("/generate") + public String generateToken(@RequestParam String username) { + return jwtService.generateToken(username); + } +// @PostMapping("/loginUser") +// public ResponseEntity userAuthentication(@RequestBody UserManagement userManagement) throws Exception { +// System.out.println(userManagement.getUserId()); +// byte[] decodedBytes = Base64.getDecoder().decode(userManagement.getUserPassword()); +// String decodedString = new String(decodedBytes); +// +// return userManagementService.userAuthentication(userManagement.getUserId(), decodedString,userManagement.getPorOrgacode()); +// } +} diff --git a/econnect/src/main/java/com/mfsys/aconnect/security/service/AuthenticationService.java b/econnect/src/main/java/com/mfsys/aconnect/security/service/AuthenticationService.java index b90ec02..ef9416c 100644 --- a/econnect/src/main/java/com/mfsys/aconnect/security/service/AuthenticationService.java +++ b/econnect/src/main/java/com/mfsys/aconnect/security/service/AuthenticationService.java @@ -1,7 +1,7 @@ package com.mfsys.aconnect.security.service; -import com.mfsys.common.configuration.service.JwtService; -import com.mfsys.common.configuration.service.PasswordEncryptionService; +import com.mfsys.service.JwtService; +import com.mfsys.service.PasswordEncryptionService; import com.mfsys.aconnect.security.dto.LoginRequest; import com.mfsys.aconnect.security.dto.LoginResponse; import com.mfsys.aconnect.usermanagement.model.User; diff --git a/econnect/src/main/java/com/mfsys/aconnect/usermanagement/filter/SubscriptionFilter.java b/econnect/src/main/java/com/mfsys/aconnect/usermanagement/filter/SubscriptionFilter.java index 5e29ed9..09bc8a6 100644 --- a/econnect/src/main/java/com/mfsys/aconnect/usermanagement/filter/SubscriptionFilter.java +++ b/econnect/src/main/java/com/mfsys/aconnect/usermanagement/filter/SubscriptionFilter.java @@ -1,7 +1,7 @@ package com.mfsys.aconnect.usermanagement.filter; -import com.mfsys.common.configuration.constant.FilterPriority; -import com.mfsys.common.configuration.constant.TokenBypassURI; +import com.mfsys.constant.FilterPriority; +import com.mfsys.constant.TokenBypassURI; import com.mfsys.aconnect.configuration.service.RequestRateLimiterService; import com.mfsys.aconnect.usermanagement.model.Role; import com.mfsys.aconnect.usermanagement.model.User; diff --git a/econnect/src/main/java/com/mfsys/aconnect/usermanagement/service/UserService.java b/econnect/src/main/java/com/mfsys/aconnect/usermanagement/service/UserService.java index 806d23c..486d553 100644 --- a/econnect/src/main/java/com/mfsys/aconnect/usermanagement/service/UserService.java +++ b/econnect/src/main/java/com/mfsys/aconnect/usermanagement/service/UserService.java @@ -1,6 +1,6 @@ package com.mfsys.aconnect.usermanagement.service; -import com.mfsys.common.configuration.service.PasswordEncryptionService; +import com.mfsys.service.PasswordEncryptionService; import com.mfsys.aconnect.usermanagement.dto.UserDTOs; import com.mfsys.aconnect.usermanagement.model.User; import com.mfsys.aconnect.usermanagement.repository.UserRepository; diff --git a/econnect/src/main/resources/application-dev.properties b/econnect/src/main/resources/application-dev.properties index 02b1c3f..97380e7 100644 --- a/econnect/src/main/resources/application-dev.properties +++ b/econnect/src/main/resources/application-dev.properties @@ -15,7 +15,7 @@ spring.jpa.properties.hibernate.connection.useUnicode=true spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect spring.jpa.hibernate.ddl-auto=update -jwt.secret = mySecretKey123456789012345678901234567890 +jwt.secret = KJH72hs8&2jdhA92hd82HDh92Hdh812hd91HDh92!-HSjD92hD9D2hs7dh2HS8dhs72hds jwt.expiration = 86400000 jwt.refresh-expiration= 604800000 diff --git a/econnect/src/main/resources/application-live.properties b/econnect/src/main/resources/application-live.properties index 7768e2b..25d47dc 100644 --- a/econnect/src/main/resources/application-live.properties +++ b/econnect/src/main/resources/application-live.properties @@ -15,7 +15,7 @@ spring.jpa.properties.hibernate.connection.useUnicode=true spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect spring.jpa.hibernate.ddl-auto=update -jwt.secret = mySecretKey123456789012345678901234567890 +jwt.secret = KJH72hs8&2jdhA92hd82HDh92Hdh812hd91HDh92!-HSjD92hD9D2hs7dh2HS8dhs72hds jwt.expiration = 86400000 jwt.refresh-expiration= 604800000 diff --git a/econnect/src/main/resources/application-test.properties b/econnect/src/main/resources/application-test.properties index 4682fe1..dc9c5fe 100644 --- a/econnect/src/main/resources/application-test.properties +++ b/econnect/src/main/resources/application-test.properties @@ -15,7 +15,7 @@ spring.jpa.properties.hibernate.connection.useUnicode=true spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect spring.jpa.hibernate.ddl-auto=update -jwt.secret = mySecretKey123456789012345678901234567890 +jwt.secret = KJH72hs8&2jdhA92hd82HDh92Hdh812hd91HDh92!-HSjD92hD9D2hs7dh2HS8dhs72hds jwt.expiration = 86400000 jwt.refresh-expiration= 604800000 diff --git a/econnect/src/main/resources/application-uat.properties b/econnect/src/main/resources/application-uat.properties index 636d9c7..c92a03e 100644 --- a/econnect/src/main/resources/application-uat.properties +++ b/econnect/src/main/resources/application-uat.properties @@ -15,7 +15,7 @@ spring.jpa.properties.hibernate.connection.useUnicode=true spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect spring.jpa.hibernate.ddl-auto=update -jwt.secret = mySecretKey123456789012345678901234567890 +jwt.secret = KJH72hs8&2jdhA92hd82HDh92Hdh812hd91HDh92!-HSjD92hD9D2hs7dh2HS8dhs72hds jwt.expiration = 86400000 jwt.refresh-expiration= 604800000 diff --git a/econnect/src/main/resources/application.properties b/econnect/src/main/resources/application.properties index 9e1e3fc..fbaf9ee 100644 --- a/econnect/src/main/resources/application.properties +++ b/econnect/src/main/resources/application.properties @@ -14,8 +14,8 @@ spring.jpa.properties.hibernate.connection.CharSet=utf-8 spring.jpa.properties.hibernate.connection.useUnicode=true spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect spring.jpa.hibernate.ddl-auto=update - -jwt.secret = mySecretKey123456789012345678901234567890 +# +jwt.secret = KJH72hs8&2jdhA92hd82HDh92Hdh812hd91HDh92!-HSjD92hD9D2hs7dh2HS8dhs72hds jwt.expiration = 86400000 jwt.refresh-expiration= 604800000 @@ -47,18 +47,18 @@ jwt.refresh-expiration= 604800000 #app.organization.uri=0005 -#app.security.uri=http://localhost:9090/security/auth/user +app.security.uri=http://localhost:9090/security/auth/user # ${CMB_SQL_DB_USER} # ${CMB_SQL_DB_USER} -#app.deposit.uri=http://localhost:9095 -#app.generalledger.uri=http://localhost:9093 -#app.organization.uri=0005 +app.deposit.uri=http://localhost:9095 +app.generalledger.uri=http://localhost:9093 +app.organization.uri=0005 -app.deposit.uri=${CMB_DEPOSIT_SERVER_URL} -app.generalledger.uri=${CMB_GL_SERVER_URL} -app.organization.uri=${CMB_ORGA_CODE} -app.security.uri=${CMB_SECURITY_SERVER_URL}/security/auth/user +#app.deposit.uri=${CMB_DEPOSIT_SERVER_URL} +#app.generalledger.uri=${CMB_GL_SERVER_URL} +#app.organization.uri=${CMB_ORGA_CODE} +#app.security.uri=${CMB_SECURITY_SERVER_URL}/security/auth/user # Deposit URLs @@ -70,3 +70,7 @@ app.security.uri=${CMB_SECURITY_SERVER_URL}/security/auth/user #app.environment.dev.generalLedgerUri=http://localhost:9093/generalledger #app.environment.uat.generalLedgerUri=http://uat-gl-server:9093/generalledger #app.environment.live.generalLedgerUri=https://live-gl-server.com/generalledger +app.jwtIssuer = MFSys +app.jwtSecretKey = U6YLGV8ODCBPqpdZK05SKtR0xSXZPg4lrzF7EeIkB71qU1wUWvEEglwYjd0l0Gen4E+gT4MzsbWgqLBNHwwV6A== +app.jwtExpirationMs = 180000 +app.jwtMaxIdleMs=7200000 \ No newline at end of file diff --git a/parent/pom.xml b/parent/pom.xml index 6b99e99..4c2abac 100644 --- a/parent/pom.xml +++ b/parent/pom.xml @@ -29,10 +29,12 @@ 21 - + 1.6.2 + ../common ../econnect + ../security diff --git a/security/.gitignore b/security/.gitignore new file mode 100644 index 0000000..b83d222 --- /dev/null +++ b/security/.gitignore @@ -0,0 +1 @@ +/target/ diff --git a/security/pom.xml b/security/pom.xml new file mode 100644 index 0000000..ad9a132 --- /dev/null +++ b/security/pom.xml @@ -0,0 +1,46 @@ + + + 4.0.0 + + com.mfsys + parent + 0.0.1 + ../parent/pom.xml + + security + + + security + + + + + jakarta.validation + jakarta.validation-api + + + io.swagger + swagger-annotations + ${swagger-annotations-version} + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + com.mfsys + common + ${project.version} + + + + \ No newline at end of file diff --git a/security/src/main/java/com/mfsys/client/africa/middleware/Error/ErrorClass.java b/security/src/main/java/com/mfsys/client/africa/middleware/Error/ErrorClass.java new file mode 100644 index 0000000..eefbad9 --- /dev/null +++ b/security/src/main/java/com/mfsys/client/africa/middleware/Error/ErrorClass.java @@ -0,0 +1,25 @@ +package com.mfsys.client.africa.middleware.Error; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class ErrorClass { + + @JsonProperty("errorMessage") + private String errorMessage; + + + + public ErrorClass(String errorMessage) { + super(); + this.errorMessage = errorMessage; + } + + public String getErrorMessage() { + return errorMessage; + } + + public void setErrorMessage(String errorMessage) { + this.errorMessage = errorMessage; + } + +} diff --git a/security/src/main/java/com/mfsys/client/africa/middleware/login/controller/LoginApi.java b/security/src/main/java/com/mfsys/client/africa/middleware/login/controller/LoginApi.java new file mode 100644 index 0000000..699372c --- /dev/null +++ b/security/src/main/java/com/mfsys/client/africa/middleware/login/controller/LoginApi.java @@ -0,0 +1,68 @@ +/** + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech) (4.2.3). + * https://openapi-generator.tech + * Do not edit the class manually. + */ +package com.mfsys.client.africa.middleware.login.controller; + +import java.time.OffsetDateTime; +import java.util.Optional; + +import jakarta.validation.Valid; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.context.request.NativeWebRequest; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import io.swagger.annotations.ApiResponse; +import io.swagger.annotations.ApiResponses; +@jakarta.annotation.Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2022-06-22T10:48:53.261561+05:00[Asia/Karachi]") + +@RestController +@Validated +@Api(value = "Login", description = "the Login API") +public interface LoginApi { + + default Optional getRequest() { + return Optional.empty(); + } + + /** + * POST /login : Third Party Authentication + * + * @param clientId (required) + * @param clientKey (required) + * @param channel (required) + * @param contentType (required) + * @param body (optional) + * @return OK (status code 200) + * or Bad request. (status code 400) + * or Authorization information is missing or invalid. (status code 401) + * or Not found. (status code 404) + */ + @ApiOperation(value = "Third Party Authentication", nickname = "login", notes = "", response = OffsetDateTime.class, tags={ "Login", }) + @ApiResponses(value = { + @ApiResponse(code = 200, message = "OK", response = OffsetDateTime.class), + @ApiResponse(code = 400, message = "Bad request."), + @ApiResponse(code = 401, message = "Authorization information is missing or invalid."), + @ApiResponse(code = 404, message = "Not found.") }) + @RequestMapping(value = "/login", + produces = { "application/json" }, + consumes = { "application/json" }, + method = RequestMethod.POST) + default ResponseEntity login(@ApiParam(value = "" ,required=true) @RequestHeader(value="clientId", required=true) String clientId,@ApiParam(value = "" ,required=true) @RequestHeader(value="clientKey", required=true) String clientKey,@ApiParam(value = "" ,required=true) @RequestHeader(value="channel", required=true) String channel,@ApiParam(value = "" ,required=true) @RequestHeader(value="contentType", required=true) String contentType,@ApiParam(value = "" ) @Valid @RequestBody(required = false) String body) { + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + + } + +} diff --git a/security/src/main/java/com/mfsys/client/africa/middleware/login/service/LoginService.java b/security/src/main/java/com/mfsys/client/africa/middleware/login/service/LoginService.java new file mode 100644 index 0000000..67522e7 --- /dev/null +++ b/security/src/main/java/com/mfsys/client/africa/middleware/login/service/LoginService.java @@ -0,0 +1,26 @@ +package com.mfsys.client.africa.middleware.login.service; + +import java.time.OffsetDateTime; + +import jakarta.validation.Valid; + +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; + +import com.mfsys.client.africa.middleware.login.controller.LoginApi; + +import io.swagger.annotations.ApiParam; + +@Service +public class LoginService implements LoginApi{ + + @Override + public ResponseEntity login(@ApiParam(value = "" ,required=true) @RequestHeader(value="clientId", required=true) String clientId,@ApiParam(value = "" ,required=true) @RequestHeader(value="clientKey", required=true) String clientKey,@ApiParam(value = "" ,required=true) @RequestHeader(value="channel", required=true) String channel,@ApiParam(value = "" ,required=true) @RequestHeader(value="contentType", required=true) String contentType,@ApiParam(value = "" ) @Valid @RequestBody(required = false) String body) { + OffsetDateTime offsetDT = OffsetDateTime.now(); + System.out.println(offsetDT); + return ResponseEntity.ok(offsetDT); + + } +} diff --git a/security/src/main/java/com/mfsys/client/africa/middleware/usermanagament/repo/UserManagementRepo.java b/security/src/main/java/com/mfsys/client/africa/middleware/usermanagament/repo/UserManagementRepo.java new file mode 100644 index 0000000..e20d765 --- /dev/null +++ b/security/src/main/java/com/mfsys/client/africa/middleware/usermanagament/repo/UserManagementRepo.java @@ -0,0 +1,42 @@ +package com.mfsys.client.africa.middleware.usermanagament.repo; + +import com.mfsys.client.africa.middleware.usermanagement.model.UserManagement; +import com.mfsys.client.africa.middleware.usermanagement.model.UserManagementId; +import java.util.List; + +import jakarta.transaction.Transactional; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; + +public interface UserManagementRepo extends JpaRepository { + + public List findAllByPorOrgacode(String porOrgaCode); + + public UserManagement findByPorOrgacodeAndUserIdAndUserPassword(String porOrgaCode, String userId, String password); + + public UserManagement findByPorOrgacodeAndUserId(String orgacode,String userId); + + @Modifying + @Transactional + @Query(value = "UPDATE user_management SET first_login=?4,user_password=?2 WHERE user_id=?1 AND por_orgacode=?3", nativeQuery = true) + public void updatePassword(String userId, String newPassword,String orgaCode, boolean firstLogin); + + @Modifying + @Transactional + @Query(value = "UPDATE user_management SET permissions=?2 WHERE user_id=?1 AND por_orgacode=?3", nativeQuery = true) + public void updatePermission(String userId, String Permission,String porOrgaCode); + + @Modifying + @Transactional + @Query(value = "UPDATE user_management SET user_name=?2,user_contact_number=?4,user_home_branch=?5,user_role=?6 WHERE user_id=?1 AND por_orgacode=?3", nativeQuery = true) + public void updateUser(String userId, String name, String porOrgaCode, String phoneNumber, String homeBranch, String role); + + @Query(value = "UPDATE user_management SET failed_attempt = ?1 WHERE user_id = ?2" ,nativeQuery = true) + @Modifying + @Transactional + public void updateFailedAttempts(int failAttempts, String user_id); + + +} diff --git a/security/src/main/java/com/mfsys/client/africa/middleware/usermanagement/controller/UserManagementController.java b/security/src/main/java/com/mfsys/client/africa/middleware/usermanagement/controller/UserManagementController.java new file mode 100644 index 0000000..6469286 --- /dev/null +++ b/security/src/main/java/com/mfsys/client/africa/middleware/usermanagement/controller/UserManagementController.java @@ -0,0 +1,93 @@ +package com.mfsys.client.africa.middleware.usermanagement.controller; + +import com.mfsys.client.africa.middleware.usermanagement.model.UserCred; +import com.mfsys.client.africa.middleware.usermanagement.model.UserManagement; +import com.mfsys.client.africa.middleware.usermanagement.service.UserManagementService; +import java.util.Base64; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.mfsys.filter.RefreshToken; + +@RestController +public class UserManagementController { + @Autowired + UserManagementService userManagementService; + + @PostMapping("/usermanagement") + public ResponseEntity createUser(@RequestBody UserManagement userManagement) { + + return userManagementService.saveUser(userManagement); + } + + @GetMapping("/usermanagement") + public List getUser(@RequestParam(value = "porOrgacode", required = true) String porOrgacode) + { + return userManagementService.showAllUsers(porOrgacode); + + } + + @DeleteMapping("/usermanagement") + public void deleteUser(@RequestBody UserManagement userManagement) + { + userManagementService.deleteUser(userManagement); + + } + + @PutMapping("/usermanagement") + public void updateUser(@RequestBody UserManagement userManagement) { + + userManagementService.updateUser(userManagement.getUserId(),userManagement.getUserName(),userManagement.getPorOrgacode(),userManagement.getUserContactNumber(),userManagement.getUserHomeBranch(),userManagement.getUserRole()); + } + + @PostMapping("/loginUser") + public ResponseEntity userAuthentication(@RequestBody UserManagement userManagement) throws Exception { + System.out.println(userManagement.getUserId()); + byte[] decodedBytes = Base64.getDecoder().decode(userManagement.getUserPassword()); + String decodedString = new String(decodedBytes); + + return userManagementService.userAuthentication(userManagement.getUserId(), decodedString,userManagement.getPorOrgacode()); + } + @PostMapping("/refreshToken") + public ResponseEntity refreshToken(@RequestBody UserCred uCred ) { + return new ResponseEntity(userManagementService.refreshToken(uCred.getToken(), uCred.getCmpUserId(), uCred.getPorOrgacode()),HttpStatus.OK); + + } + + @PostMapping("/changepassword") + public ResponseEntity update(@RequestBody UserManagement userManagement) { + + return userManagementService.updatePassword(userManagement.getUserId(),userManagement.getUserPassword(),userManagement.getPorOrgacode()); + } + + @PutMapping("/updatePermissions") + public void updatePermissions(@RequestBody UserManagement userManagement) { + + userManagementService.updatePermissions(userManagement.getUserId(),userManagement.getPermissions(),userManagement.getPorOrgacode()); + } + + @PostMapping("/getPermissions/{userId}/{porOrgacode}") + public String getPermissions(@PathVariable String userId, @PathVariable String porOrgacode) { + return userManagementService.getPermissions(userId, porOrgacode); + } + + @PostMapping("/changeUserPassword") + public ResponseEntity changeUserPassword(@RequestParam(value = "oldPassword", required = true) String oldPassword,@RequestBody UserManagement userManagement) { + + return userManagementService.changeUserPassword(userManagement.getUserId(),userManagement.getUserPassword(),userManagement.getPorOrgacode(),oldPassword); + } + + + +} diff --git a/security/src/main/java/com/mfsys/client/africa/middleware/usermanagement/model/UserCred.java b/security/src/main/java/com/mfsys/client/africa/middleware/usermanagement/model/UserCred.java new file mode 100644 index 0000000..08351cc --- /dev/null +++ b/security/src/main/java/com/mfsys/client/africa/middleware/usermanagement/model/UserCred.java @@ -0,0 +1,38 @@ +package com.mfsys.client.africa.middleware.usermanagement.model; + +public class UserCred { + private String cmpUserId; + private String porOrgacode; + private String token; + + + public String getCmpUserId() { + return cmpUserId; + } + public void seCmptUserId(String userId) { + this.cmpUserId = userId; + } + public String getPorOrgacode() { + return porOrgacode; + } + public void setPorOrgacode(String porOrgacode) { + this.porOrgacode = porOrgacode; + } + public String getToken() { + return token; + } + public void setToken(String token) { + this.token = token; + } + public UserCred(String cmpUserId, String porOrgacode, String token) { + super(); + this.cmpUserId = cmpUserId; + this.porOrgacode = porOrgacode; + this.token = token; + } + public UserCred() { + super(); + } + + +} diff --git a/security/src/main/java/com/mfsys/client/africa/middleware/usermanagement/model/UserManagement.java b/security/src/main/java/com/mfsys/client/africa/middleware/usermanagement/model/UserManagement.java new file mode 100644 index 0000000..6c78b33 --- /dev/null +++ b/security/src/main/java/com/mfsys/client/africa/middleware/usermanagement/model/UserManagement.java @@ -0,0 +1,161 @@ +package com.mfsys.client.africa.middleware.usermanagement.model; + +import java.util.Date; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.IdClass; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.mfsys.constant.FieldNameLength; + +@Entity +@IdClass(UserManagementId.class) +public class UserManagement { + + @Id + @JsonProperty("porOrgacode") + private String porOrgacode; + + @Id + @JsonProperty("userId") + private String userId; + + @JsonProperty("userName") + private String userName; + + @JsonProperty("userHomeBranch") + private String userHomeBranch; + + @JsonProperty("userContactNumber") + private String userContactNumber; + + @JsonProperty("userPassword") + private String userPassword; + + @JsonProperty("userRole") + private String userRole; + + @JsonProperty("firstLogin") + private Boolean firstLogin; + + @Column(columnDefinition = FieldNameLength.CODE_10000) + @JsonProperty("permissions") + private String permissions; + + // --------------login retry--------------- // + + private boolean accountNonLocked=true; + + private int failedAttempt; + + private Date lockTime; + + + + public String getPermissions() { + return permissions; + } + + public void setPermissions(String permissions) { + this.permissions = permissions; + } + + public String getPorOrgacode() { + return porOrgacode; + } + + public void setPorOrgacode(String porOrgacode) { + this.porOrgacode = porOrgacode; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getUserHomeBranch() { + return userHomeBranch; + } + + public void setUserHomeBranch(String userHomeBranch) { + this.userHomeBranch = userHomeBranch; + } + + public String getUserContactNumber() { + return userContactNumber; + } + + public void setUserContactNumber(String userContactNumber) { + this.userContactNumber = userContactNumber; + } + + public String getUserPassword() { + return userPassword; + } + + public void setUserPassword(String userPassword) { + this.userPassword = userPassword; + } + + public String getUserRole() { + return userRole; + } + + public void setUserRole(String userRole) { + this.userRole = userRole; + } + + public Boolean isFirstLogin() { + + return firstLogin; + } + + public void setFirstLogin(Boolean firstLogin) { + this.firstLogin = firstLogin; + } + + + + + //-----------setter getter ---------------// + + + public boolean isAccountNonLocked() { + return accountNonLocked; + } + + public void setAccountNonLocked(boolean accountNonLocked) { + this.accountNonLocked = accountNonLocked; + } + + public int getFailedAttempt() { + return failedAttempt; + } + + public void setFailedAttempt(int failedAttempt) { + this.failedAttempt = failedAttempt; + } + + public Date getLockTime() { + return lockTime; + } + + public void setLockTime(Date lockTime) { + this.lockTime = lockTime; + } + + +} diff --git a/security/src/main/java/com/mfsys/client/africa/middleware/usermanagement/model/UserManagementId.java b/security/src/main/java/com/mfsys/client/africa/middleware/usermanagement/model/UserManagementId.java new file mode 100644 index 0000000..dedd769 --- /dev/null +++ b/security/src/main/java/com/mfsys/client/africa/middleware/usermanagement/model/UserManagementId.java @@ -0,0 +1,35 @@ +package com.mfsys.client.africa.middleware.usermanagement.model; + +import java.io.Serial; +import java.io.Serializable; + +import com.fasterxml.jackson.annotation.JsonProperty; + + +public class UserManagementId implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @JsonProperty("porOrgacode") + String porOrgacode; + + @JsonProperty("userId") + String userId; + + public String getPorOrgacode() { + return porOrgacode; + } + + public void setPorOrgacode(String porOrgacode) { + this.porOrgacode = porOrgacode; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } +} diff --git a/security/src/main/java/com/mfsys/client/africa/middleware/usermanagement/model/UserPermission.java b/security/src/main/java/com/mfsys/client/africa/middleware/usermanagement/model/UserPermission.java new file mode 100644 index 0000000..d83b4c9 --- /dev/null +++ b/security/src/main/java/com/mfsys/client/africa/middleware/usermanagement/model/UserPermission.java @@ -0,0 +1,50 @@ +package com.mfsys.client.africa.middleware.usermanagement.model; + +public class UserPermission { + + private String userId; + private String userName; + private String userPermission; + private boolean firstLogin; + private String token; + + public UserPermission(String userId, String userName, String userPermission, boolean firstLogin, String token) { + super(); + this.userId = userId; + this.userName = userName; + this.userPermission = userPermission; + this.firstLogin = firstLogin; + this.token = token; + } + public String getUserId() { + return userId; + } + public void setUserId(String userId) { + this.userId = userId; + } + public String getUserName() { + return userName; + } + public void setUserName(String userName) { + this.userName = userName; + } + public String getUserPermission() { + return userPermission; + } + public void setUserPermission(String userPermission) { + this.userPermission = userPermission; + } + public boolean isFirstLogin() { + return firstLogin; + } + public void setFirstLogin(boolean firstLogin) { + this.firstLogin = firstLogin; + } + public String getToken() { + return token; + } + public void setToken(String token) { + this.token = token; + } + +} diff --git a/security/src/main/java/com/mfsys/client/africa/middleware/usermanagement/service/UserManagementService.java b/security/src/main/java/com/mfsys/client/africa/middleware/usermanagement/service/UserManagementService.java new file mode 100644 index 0000000..707f684 --- /dev/null +++ b/security/src/main/java/com/mfsys/client/africa/middleware/usermanagement/service/UserManagementService.java @@ -0,0 +1,221 @@ +package com.mfsys.client.africa.middleware.usermanagement.service; + +import com.mfsys.client.africa.middleware.usermanagement.model.UserManagementId; +import com.mfsys.client.africa.middleware.usermanagement.model.UserPermission; +import java.util.Date; +import java.util.List; + +import com.mfsys.service.JwtService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; + +import com.mfsys.filter.RefreshToken; +import com.mfsys.client.africa.middleware.Error.ErrorClass; +import com.mfsys.client.africa.middleware.usermanagament.repo.UserManagementRepo; +import com.mfsys.client.africa.middleware.usermanagement.model.UserManagement; +import com.mfsys.trust.IncludeAllUrl; + + + +@Service +public class UserManagementService { + + @Autowired + UserManagementRepo userManagementRepo; + @Value("${DefaultUserPassword}") + private String defaultPassword; + + @Autowired + private JwtService jwt; + + public static final int MAX_FAILED_ATTEMPTS = 4; + + private static final long LOCK_TIME_DURATION = 24 * 60 * 60 * 1000; // 24 hours + +// public ResponseEntity saveUser(UserManagement userManagement) { +// if(userManagementRepo.findByPorOrgacodeAndUserId(userManagement.getPorOrgacode(), userManagement.getUserId()) != null) { +// ErrorClass em = new ErrorClass(); +// em.setErrorMessage("UserId Already Exists"); +// return ResponseEntity.ok(em); +// } +// userManagement.setUserPassword(this.defaultPassword); +// userManagement.setFirstLogin(Boolean.TRUE); +// userManagementRepo.save(userManagement); +// return ResponseEntity.ok(userManagement); +// +// } + + public ResponseEntity saveUser(UserManagement userManagement) { + UserManagement existingUser = userManagementRepo.findByPorOrgacodeAndUserId(userManagement.getPorOrgacode(), userManagement.getUserId()); + if (existingUser != null) { + return ResponseEntity.status(HttpStatus.CONFLICT).build(); + } else { + userManagement.setUserPassword(this.defaultPassword); + userManagement.setFirstLogin(Boolean.TRUE); + userManagementRepo.save(userManagement); + return ResponseEntity.ok(userManagement); + } + } + + public void updateUser(String userId, String name, String porOrgaCode, String phoneNumber, String homeBranch, String role) { + userManagementRepo.updateUser(userId, name, porOrgaCode, phoneNumber, homeBranch, role); + } + + public List showAllUsers(String porOrgacode) + { + return userManagementRepo.findAllByPorOrgacode(porOrgacode); + } + + public void deleteUser(UserManagement userManagement) + { + userManagementRepo.delete(userManagement); + } + + public ResponseEntity updatePassword(String userId,String newPassword,String orgaCode) { + UserManagement user = userManagementRepo.findByPorOrgacodeAndUserId(orgaCode, userId); + if (user != null) { + userManagementRepo.updatePassword(userId, newPassword, orgaCode, false); + return ResponseEntity.ok(true); + } else { + //em.setErrorMessage("UserId Does Not Exist"); + return ResponseEntity.notFound().build(); + } + } + + public ResponseEntity changeUserPassword(String userId, String newPassword, String orgaCode, String oldPassword) { + UserManagement user = userManagementRepo.findByPorOrgacodeAndUserIdAndUserPassword(orgaCode, userId, oldPassword); + if (user != null) { + userManagementRepo.updatePassword(userId, newPassword, orgaCode, false); + return ResponseEntity.ok(true); + } else { + return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build(); + } + } + + +// public ResponseEntity changeUserPassword(String userId,String newPassword,String orgaCode,String oldPassword) { +// if (userManagementRepo.findByPorOrgacodeAndUserIdAndUserPassword(orgaCode, userId, oldPassword) != null) +// { +// userManagementRepo.updatePassword(userId, newPassword,orgaCode,false); +// return ResponseEntity.ok(true); +// } +// ErrorClass em = new ErrorClass(); +// em.setErrorMessage("Old Password is Incorrect"); +// return ResponseEntity.ok(em); +// +// } + +public void updatePermissions(String userId,String permissions,String porOrgaCode) { + + userManagementRepo.updatePermission(userId, permissions, porOrgaCode); + + + + } + +public String getPermissions(String userId, String porOrgacode) { + + UserManagement um = new UserManagement(); + UserManagementId umi = new UserManagementId(); + umi.setPorOrgacode(porOrgacode); + umi.setUserId(userId); + um = userManagementRepo.findById(umi).get(); + + return um.getPermissions(); + + + + +} + + + +public ResponseEntity userAuthentication(String userId, String Password, String porOrgacode) { + UserManagement um = userManagementRepo.findByPorOrgacodeAndUserIdAndUserPassword(porOrgacode, userId, Password); + UserManagement um1 = userManagementRepo.findByPorOrgacodeAndUserId(porOrgacode, userId); + + + if (um != null) { + if (!um1.isAccountNonLocked()) { + if (unlockWhenTimeExpired(um1)) { + return ResponseEntity.ok(new ErrorClass("Your account has been unlocked. Please try to login again.")); + } + return ResponseEntity.ok(new ErrorClass("Your account has been locked due to 3 failed attempts." + + " It will be unlocked after 24 hours.")); + } + + + + um.setAccountNonLocked(true); + um.setLockTime(null); + um.setFailedAttempt(0); + userManagementRepo.save(um); + System.out.println(um.getPorOrgacode()); + String token = jwt.generateToken(um.getUserId()); + return ResponseEntity.ok(new UserPermission(userId, um.getUserName(), um.getPermissions(), um.isFirstLogin(), token)); + } else if (um1 != null) { + if (um1.isAccountNonLocked()) { + if (um1.getFailedAttempt() < MAX_FAILED_ATTEMPTS - 1) { + increaseFailedAttempts(um1); + } else { + lock(um1); + return ResponseEntity.ok(new ErrorClass("Your account has been locked due to 3 failed attempts." + + " It will be unlocked after 24 hours.")); + } + return ResponseEntity.ok(new ErrorClass("Password is incorrect. "+"you have "+(2-um1.getFailedAttempt())+" Attempts left" )); + } else if (!um1.isAccountNonLocked()) { + if (unlockWhenTimeExpired(um1)) { + return ResponseEntity.ok(new ErrorClass("Your account has been unlocked. Please try to login again." )); + } + return ResponseEntity.ok(new ErrorClass("Your account has been locked due to 3 failed attempts. It will be unlocked after 24 hours.")); + } + } + return ResponseEntity.ok(new ErrorClass("UserId is incorrect")); +} + + public String refreshToken(String token, String susUsercode, String porOrgacode) { + if(susUsercode!=null && token != null && porOrgacode !=null) + return jwt.generateRefreshToken( susUsercode); + else { + return ""; + } +} + + public void increaseFailedAttempts(UserManagement user) { + int newFailAttempts = user.getFailedAttempt() + 1; + userManagementRepo.updateFailedAttempts(newFailAttempts, user.getUserId()); + } + + public void resetFailedAttempts(String email) { + userManagementRepo.updateFailedAttempts(0, email); + } + + public void lock(UserManagement user) { + user.setAccountNonLocked(false); + user.setLockTime(new Date()); + + userManagementRepo.save(user); + } + + public boolean unlockWhenTimeExpired(UserManagement user) { + long lockTimeInMillis = user.getLockTime().getTime(); + long currentTimeInMillis = System.currentTimeMillis(); + + if (lockTimeInMillis + LOCK_TIME_DURATION < currentTimeInMillis) { + user.setAccountNonLocked(true); + user.setLockTime(null); + user.setFailedAttempt(0); + + userManagementRepo.save(user); + + return true; + } + + return false; + } + + +}