diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..ee77193 Binary files /dev/null and b/.DS_Store differ diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..dd84ea7 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,38 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: '' +assignees: '' + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Desktop (please complete the following information):** + - OS: [e.g. iOS] + - Browser [e.g. chrome, safari] + - Version [e.g. 22] + +**Smartphone (please complete the following information):** + - Device: [e.g. iPhone6] + - OS: [e.g. iOS8.1] + - Browser [e.g. stock browser, safari] + - Version [e.g. 22] + +**Additional context** +Add any other context about the problem here. diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml new file mode 100644 index 0000000..06b6aa0 --- /dev/null +++ b/.github/workflows/maven.yml @@ -0,0 +1,35 @@ +# This workflow will build a Java project with Maven, and cache/restore any dependencies to improve the workflow execution time +# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-maven + +# This workflow uses actions that are not certified by GitHub. +# They are provided by a third-party and are governed by +# separate terms of service, privacy policy, and support +# documentation. + +name: Java CI with Maven + +on: + push: + branches: [ "main" ] + pull_request: + branches: [ "main" ] + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + - name: Set up JDK 17 + uses: actions/setup-java@v4 + with: + java-version: '17' + distribution: 'temurin' + cache: maven + - name: Build with Maven + run: mvn -B package --file pom.xml + + # Optional: Uploads the full dependency graph to GitHub to improve the quality of Dependabot alerts this repository can receive + - name: Update dependency graph + uses: advanced-security/maven-dependency-submission-action@571e99aab1055c2e71a1e2309b9691de18d6b7d6 diff --git a/pom.xml b/pom.xml index 4dee35b..d4b209a 100644 --- a/pom.xml +++ b/pom.xml @@ -82,6 +82,44 @@ spring-boot-starter-json 2.5.6 + + + org.keycloak + keycloak-admin-client + 21.1.2 + + + + org.keycloak + keycloak-core + 21.1.2 + + + + org.postgresql + postgresql + 42.2.20 + runtime + + + + jakarta.persistence + jakarta.persistence-api + 2.2.3 + + + + org.springframework.data + spring-data-jpa + 2.7.14 + + + + org.springframework.boot + spring-boot-starter-data-jpa + 2.7.14 + + diff --git a/src/main/java/com/tarento/upsmf/userManagement/UserManagementApplication.java b/src/main/java/com/tarento/upsmf/userManagement/UserManagementApplication.java index 37eb3f7..a19266c 100644 --- a/src/main/java/com/tarento/upsmf/userManagement/UserManagementApplication.java +++ b/src/main/java/com/tarento/upsmf/userManagement/UserManagementApplication.java @@ -1,12 +1,22 @@ package com.tarento.upsmf.userManagement; import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.web.client.RestTemplate; @SpringBootApplication +@EnableJpaRepositories +@EnableAutoConfiguration public class UserManagementApplication { public static void main(String[] args) { SpringApplication.run(UserManagementApplication.class, args); } + @Bean + public RestTemplate restTemplate() { + return new RestTemplate(); + } } diff --git a/src/main/java/com/tarento/upsmf/userManagement/controller/UserController.java b/src/main/java/com/tarento/upsmf/userManagement/controller/UserController.java index 52bd240..b52c088 100644 --- a/src/main/java/com/tarento/upsmf/userManagement/controller/UserController.java +++ b/src/main/java/com/tarento/upsmf/userManagement/controller/UserController.java @@ -2,40 +2,110 @@ import com.fasterxml.jackson.databind.JsonNode; import com.tarento.upsmf.userManagement.handler.UserHandler; +import com.tarento.upsmf.userManagement.model.Transaction; +import com.tarento.upsmf.userManagement.services.PaymentService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import java.io.IOException; import java.net.URISyntaxException; +import java.sql.SQLException; +import java.util.List; +import java.util.Map; -@RestController(value = "/api/v1/user)") +@RestController +@RequestMapping(value = "/api/v1/user") public class UserController { + @Autowired + PaymentService paymentService; + @Autowired private UserHandler userHandler; @PostMapping(value = "/create", consumes = "application/json", produces = "application/json") - public ResponseEntity createUser(@RequestBody final JsonNode body) throws URISyntaxException { + public String createUser(@RequestBody final JsonNode body) throws URISyntaxException, IOException { return userHandler.createUser(body); } @PutMapping(value = "/update", consumes = "application/json", produces = "application/json") - public ResponseEntity updateUser(@RequestBody final JsonNode body) throws URISyntaxException { + public String updateUser(@RequestBody final JsonNode body) throws URISyntaxException, IOException { return userHandler.updateUser(body); } + @PostMapping(value = "/details", consumes = "application/json", produces = "application/json") + public String userDetails(@RequestBody final JsonNode body) throws URISyntaxException, IOException { + return userHandler.userDetails(body); + } + + @PostMapping(value = "/emaildetails", consumes = "application/json", produces = "application/json") + public String userEmailDetails(@RequestBody final JsonNode body) throws URISyntaxException, IOException { + return userHandler.userEmailDetails(body); + } + @PostMapping(value = "/list", consumes = "application/json", produces = "application/json") - public ResponseEntity listUser(@RequestBody final JsonNode body) throws URISyntaxException { + public String listUser(@RequestBody final JsonNode body) throws URISyntaxException, IOException { return userHandler.listUser(body); } + @GetMapping(value = "/count", produces = "application/json") + public String userCount() throws IOException { + return userHandler.userCount(); + } + @PostMapping(value = "/activate", consumes = "application/json", produces = "application/json") - public ResponseEntity activateUser(@RequestBody final JsonNode body) throws URISyntaxException { + public String activateUser(@RequestBody final JsonNode body) throws URISyntaxException, IOException { return userHandler.activateUser(body); } @PostMapping(value = "/deactivate", consumes = "application/json", produces = "application/json") - public ResponseEntity deactivateUser(@RequestBody final JsonNode body) throws URISyntaxException { + public String deactivateUser(@RequestBody final JsonNode body) throws URISyntaxException, IOException { return userHandler.deactivateUser(body); } + + @GetMapping(value = "/sms/otp", produces = "application/json") + public ResponseEntity sendOTP(@RequestParam String phoneNumber, @RequestParam String name, @RequestParam String otp) throws URISyntaxException { + return userHandler.sendOTP(phoneNumber, name, otp); + } + + @PostMapping(value = "/keycloak/otp", consumes = "application/json", produces = "application/json") + public ResponseEntity generateOTP(@RequestBody String email) throws URISyntaxException, IOException { + return userHandler.generateOTP(email); + } + + @PostMapping(value = "/keycloak/login", consumes = "application/json", produces = "application/json") + public ResponseEntity login(@RequestBody JsonNode body ) throws URISyntaxException, IOException { + return userHandler.login(body); + } + + @PostMapping(value = "/payment", consumes = {"*/*"}) + public ResponseEntity paymentRedirect(@RequestParam Map requestData) throws URISyntaxException, IOException { + return userHandler.paymentRedirect(requestData); + } + + @PostMapping(value = "/keycloak/usrlogin") + public String usrlogin(@RequestBody JsonNode body) throws IOException { + return userHandler.usrLogin(body); + } + + @PostMapping(value = "/keycloak/usrOTP") + public String usrOTP(@RequestBody JsonNode body) throws IOException { + return userHandler.usrOTP(body); + } + + @GetMapping(value = "/transaction", produces = "application/json") + public ResponseEntity> getAllTransactions() { + return userHandler.getAllTransactions(); + } + + @GetMapping(value = "/transaction/{uniqueRefNumber}", produces = "application/json") + public ResponseEntity getTransactionByUniqueRefNumber(@PathVariable String uniqueRefNumber) { + return userHandler.getTransactionByUniqueRefNumber(uniqueRefNumber); + } + + @PostMapping(value = "/attribute", produces = "application/json") + public ResponseEntity getUserByAttribute(@RequestBody JsonNode body) throws SQLException, IOException, URISyntaxException { + return userHandler.getUserByAttribute(body); + } } diff --git a/src/main/java/com/tarento/upsmf/userManagement/handler/UserHandler.java b/src/main/java/com/tarento/upsmf/userManagement/handler/UserHandler.java index 9172e44..8fd7051 100644 --- a/src/main/java/com/tarento/upsmf/userManagement/handler/UserHandler.java +++ b/src/main/java/com/tarento/upsmf/userManagement/handler/UserHandler.java @@ -1,36 +1,173 @@ package com.tarento.upsmf.userManagement.handler; import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.ObjectNode; +import com.tarento.upsmf.userManagement.model.Transaction; import com.tarento.upsmf.userManagement.services.UserService; +import com.tarento.upsmf.userManagement.utility.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Component; + +import java.io.IOException; import java.net.URISyntaxException; +import java.sql.SQLException; +import java.util.List; +import java.util.Map; @Component public class UserHandler { + private static final Logger logger = LoggerFactory.getLogger(UserHandler.class); @Autowired private UserService userService; - public ResponseEntity createUser(final JsonNode body) throws URISyntaxException { - return userService.createUser(body); + @Autowired + private KeycloakUserCreator keycloakUserCreator; + + @Autowired + private KeycloakUserGetter keycloakUserGetter; + + @Autowired + private KeycloakUserUpdater keycloakUserUpdater; + + @Autowired + private KeycloakUserActivateDeActivate keycloakUserActivateDeActivate; + + private ObjectMapper mapper = new ObjectMapper(); + public String createUser(final JsonNode body) throws URISyntaxException, IOException { + logger.info("creating user with payload {} ", body.toPrettyString()); + String response = keycloakUserCreator.createUser(body); + logger.info("user created ? {}", response); + try { + ResponseEntity user = userService.createUser(body); + logger.info("user created on ed {}",user); + user.toString(); + } catch (Exception e){ + //response = e.getLocalizedMessage(); + logger.error("Error Occured",e); + } + return response; } - public ResponseEntity updateUser(final JsonNode body) throws URISyntaxException{ - return userService.updateUser(body); + public String updateUser(final JsonNode body) throws URISyntaxException, IOException { + JsonNode request = body.get("request"); + logger.info("updating user in keycloak with payload {} ", body.toPrettyString()); + String userName = body.get("userName").asText(); + String respone = keycloakUserUpdater.updateUser(request, userName); + logger.info("updating user with payload {} ", request.toPrettyString()); + try { + ResponseEntity jsonNodeResponseEntity = userService.updateUser(body); + } catch (Exception exception){ + logger.error("Exception while updating user info.", exception); + } + return respone; } - public ResponseEntity listUser(final JsonNode body) throws URISyntaxException{ - return userService.listUser(body); + public String userDetails(final JsonNode body) throws IOException { + JsonNode request = body.get("request"); + String userName = keycloakUserGetter.findUser(request.get("userName").asText(),0,0); + return userName; } - public ResponseEntity activateUser(final JsonNode body) throws URISyntaxException{ - return userService.activateUser(body); + public String userEmailDetails(final JsonNode body) throws IOException { + JsonNode request = body.get("request"); + String userName = keycloakUserGetter.findUserByEmail(request.get("fieldName").asText(), request.get("fieldValue").asText()); + return userName; } - public ResponseEntity deactivateUser(final JsonNode body) throws URISyntaxException{ - return userService.deactivateUser(body); + + public String listUser(final JsonNode body) throws URISyntaxException, IOException { + logger.info("creating user with payload {} ", body.toPrettyString()); + int offset = body.get("offset").asInt(); + int size = body.get("size").asInt(); + String users = keycloakUserGetter.findUser(null,offset,size); + JsonNode jsonNode = mapper.readTree(users); + JsonNode totalcount = mapper.createObjectNode(); + String count = userService.userCount(); + ((ObjectNode)totalcount).put("totalCount",count); + ((ArrayNode)jsonNode).set(0,totalcount); + return jsonNode.toPrettyString(); + } + + public String userCount() throws IOException { + return userService.userCount(); + } + + public String activateUser(final JsonNode body) throws URISyntaxException, IOException { + logger.info("activating user with payload {} ", body.toPrettyString()); + JsonNode request = body.get("request"); + String response = keycloakUserActivateDeActivate.activateDeactivatUser(request.get("userName").asText(), true); + try { + ResponseEntity jsonNodeResponseEntity = userService.activateUser(body); + }catch (Exception exception){ + exception.printStackTrace(); + } + return response; } + public String deactivateUser(final JsonNode body) throws URISyntaxException, IOException { + logger.info("deactivating user with payload {} ", body.toPrettyString()); + + JsonNode request = body.get("request"); + String response = keycloakUserActivateDeActivate.activateDeactivatUser(request.get("userName").asText(), false); + try { + ResponseEntity jsonNodeResponseEntity = userService.deactivateUser(body); + }catch (Exception ex){ + ex.printStackTrace(); + } + return response; + } + + public ResponseEntity sendOTP(String phoneNumber, String name, String otp) throws URISyntaxException { + logger.info("sending to name: {} OTP:{} to phone: {} ", name, phoneNumber,otp); + ResponseEntity stringResponseEntity = userService.sendOTP(phoneNumber, name, otp); + return stringResponseEntity; + } + + public ResponseEntity generateOTP(String email) throws URISyntaxException, IOException { + logger.info("generating otp to {} ", email); + ResponseEntity stringResponseEntity = userService.generateOTP(email); + return stringResponseEntity; + } + + public ResponseEntity login(final JsonNode body) throws URISyntaxException, IOException { + logger.info("login called with payload {} ", body.toPrettyString()); + return userService.login(body); + } + + private String getorDefault(final JsonNode request, final String key, final String defaultValue){ + return request.get(key) != null ? request.get(key).asText() : defaultValue; + } + + public ResponseEntity paymentRedirect(Map requestData) + throws URISyntaxException, IOException { + logger.info("payload from paymentRedirect {}", requestData); + return userService.paymentRedirect(requestData); + } + + public String usrLogin(JsonNode body) throws IOException { + logger.info("login user with body {}",body); + return userService.usrLogin(body); + } + + public String usrOTP(JsonNode body) throws IOException { + logger.info("OTP mail to user with body {}", body); + return userService.usrOTP(body); + } + public ResponseEntity> getAllTransactions() { + return userService.getAllTransactions(); + } + + public ResponseEntity getTransactionByUniqueRefNumber(String uniqueRefNumber) { + return userService.getTransactionByUniqueRefNumber(uniqueRefNumber); + } + + public ResponseEntity getUserByAttribute(JsonNode body) throws SQLException, IOException, URISyntaxException { + return userService.getUserListByAttribute(body); + } } diff --git a/src/main/java/com/tarento/upsmf/userManagement/model/Course.java b/src/main/java/com/tarento/upsmf/userManagement/model/Course.java new file mode 100644 index 0000000..aef8d3a --- /dev/null +++ b/src/main/java/com/tarento/upsmf/userManagement/model/Course.java @@ -0,0 +1,38 @@ +package com.tarento.upsmf.userManagement.model; + +import com.fasterxml.jackson.annotation.JsonBackReference; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonManagedReference; +import lombok.*; + +import javax.persistence.*; +import java.util.List; + +@Entity +@Table(name = "course") +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@ToString +@Builder +public class Course { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String courseCode; + private String courseName; + private String description; + + @ManyToOne + @JoinColumn(name = "institute_id") + @JsonIgnore + private Institute institute; + + @OneToMany(mappedBy = "course") + @JsonIgnore + private List exams; +} \ No newline at end of file diff --git a/src/main/java/com/tarento/upsmf/userManagement/model/Exam.java b/src/main/java/com/tarento/upsmf/userManagement/model/Exam.java new file mode 100644 index 0000000..61caedd --- /dev/null +++ b/src/main/java/com/tarento/upsmf/userManagement/model/Exam.java @@ -0,0 +1,48 @@ +package com.tarento.upsmf.userManagement.model; + +import lombok.*; + +import javax.persistence.*; +import java.time.LocalDate; +import java.time.LocalDateTime; + +@Entity +@Table(name = "exam") +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@ToString +@Builder +public class Exam { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "exam_cycle_id") + private Long examCycleId; // Link to the ExamCycle entity + + @Column(name = "exam_date") + private LocalDate examDate; + + @Column(name = "created_by") + private String createdBy; + + @Column(name = "created_on") + private LocalDateTime createdOn; + + @Column(name = "modified_by") + private String modifiedBy; + + @Column(name = "modified_on") + private LocalDateTime modifiedOn; + + @ManyToOne + @JoinColumn(name = "course_id") + private Course course; + + @Column(name = "obsolete", nullable = false, columnDefinition = "int default 0") + private Integer obsolete = 0; + +} \ No newline at end of file diff --git a/src/main/java/com/tarento/upsmf/userManagement/model/Institute.java b/src/main/java/com/tarento/upsmf/userManagement/model/Institute.java new file mode 100644 index 0000000..a990fb8 --- /dev/null +++ b/src/main/java/com/tarento/upsmf/userManagement/model/Institute.java @@ -0,0 +1,33 @@ +package com.tarento.upsmf.userManagement.model; + +import com.fasterxml.jackson.annotation.JsonBackReference; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonManagedReference; +import lombok.*; + +import javax.persistence.*; +import java.util.List; + +@Entity +@Table(name = "institute") +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@ToString +@Builder +public class Institute { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String instituteName; + private String instituteCode; + private String address; + + @OneToMany(mappedBy = "institute") + @JsonIgnore + private List courses; +} \ No newline at end of file diff --git a/src/main/java/com/tarento/upsmf/userManagement/model/KeyCloakUserDTO.java b/src/main/java/com/tarento/upsmf/userManagement/model/KeyCloakUserDTO.java new file mode 100644 index 0000000..edc0374 --- /dev/null +++ b/src/main/java/com/tarento/upsmf/userManagement/model/KeyCloakUserDTO.java @@ -0,0 +1,37 @@ +package com.tarento.upsmf.userManagement.model; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.*; + +import java.io.Serializable; +import java.util.UUID; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +@ToString +@JsonIgnoreProperties(ignoreUnknown = true) +@EqualsAndHashCode +public class KeyCloakUserDTO implements Serializable { + + @JsonProperty(value = "name", required = true) + private String name; + @JsonProperty(value = "email", required = true) + private String email; + + private String password; + @JsonProperty(value = "phoneNumber", required = true) + private String phoneNumber; + private String instituteID; + private String instituteName; + private String instituteDistrict; + private String aadharNumber; + private String registerNumber; + private String lastName; + private String role; + private String activeStatus; + private String username = UUID.randomUUID().toString(); + +} diff --git a/src/main/java/com/tarento/upsmf/userManagement/model/Payment.java b/src/main/java/com/tarento/upsmf/userManagement/model/Payment.java new file mode 100644 index 0000000..9cf4869 --- /dev/null +++ b/src/main/java/com/tarento/upsmf/userManagement/model/Payment.java @@ -0,0 +1,27 @@ +package com.tarento.upsmf.userManagement.model; + + +import lombok.*; + +import javax.persistence.*; +import javax.persistence.OneToMany.*; +import java.util.List; + + + +@Entity +@Setter +@Getter +@NoArgsConstructor +@AllArgsConstructor +@ToString(includeFieldNames = true) +@Builder +@Table(name = "payment") +public class Payment { + @Id + @GeneratedValue(strategy = GenerationType.AUTO ) + private String feeId; + private String fullName; + private String noOfExams; + private String feeAmount; +} \ No newline at end of file diff --git a/src/main/java/com/tarento/upsmf/userManagement/model/ResponseDto.java b/src/main/java/com/tarento/upsmf/userManagement/model/ResponseDto.java new file mode 100644 index 0000000..0cf4f4a --- /dev/null +++ b/src/main/java/com/tarento/upsmf/userManagement/model/ResponseDto.java @@ -0,0 +1,92 @@ +package com.tarento.upsmf.userManagement.model; + +import java.sql.Timestamp; +import java.util.HashMap; +import java.util.Map; + +import lombok.Getter; +import org.springframework.http.HttpStatus; + + +public class ResponseDto { + + private String id; + private String ver; + @Getter + private String ts; + private ResponseParams params; + private HttpStatus responseCode; + + private transient Map response = new HashMap<>(); + + public ResponseDto() { + this.ver = "v1"; + this.ts = String.valueOf(new Timestamp(System.currentTimeMillis())); + this.params = new ResponseParams(); + } + + public ResponseDto(String id) { + this(); + this.id = id; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getVer() { + return ver; + } + + public void setVer(String ver) { + this.ver = ver; + } + + public void setTs(String ts) { + this.ts = ts; + } + + public ResponseParams getParams() { + return params; + } + + public void setParams(ResponseParams params) { + this.params = params; + } + + public HttpStatus getResponseCode() { + return responseCode; + } + + public void setResponseCode(HttpStatus responseCode) { + this.responseCode = responseCode; + } + + public Map getResult() { + return response; + } + + public void setResult(Map result) { + response = result; + } + + public Object get(String key) { + return response.get(key); + } + + public void put(String key, Object vo) { + response.put(key, vo); + } + + public void putAll(Map map) { + response.putAll(map); + } + + public boolean containsKey(String key) { + return response.containsKey(key); + } +} \ No newline at end of file diff --git a/src/main/java/com/tarento/upsmf/userManagement/model/ResponseParams.java b/src/main/java/com/tarento/upsmf/userManagement/model/ResponseParams.java new file mode 100644 index 0000000..407aedf --- /dev/null +++ b/src/main/java/com/tarento/upsmf/userManagement/model/ResponseParams.java @@ -0,0 +1,50 @@ +package com.tarento.upsmf.userManagement.model; + +public class ResponseParams { + private String resmsgid; + private String msgid; + private String err; + private String status; + private String errmsg; + + public String getResmsgid() { + return resmsgid; + } + + public void setResmsgid(String resmsgid) { + this.resmsgid = resmsgid; + } + + public String getMsgid() { + return msgid; + } + + public void setMsgid(String msgid) { + this.msgid = msgid; + } + + public String getErr() { + return err; + } + + public void setErr(String err) { + this.err = err; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getErrmsg() { + return errmsg; + } + + public void setErrmsg(String errmsg) { + this.errmsg = errmsg; + } + +} \ No newline at end of file diff --git a/src/main/java/com/tarento/upsmf/userManagement/model/Transaction.java b/src/main/java/com/tarento/upsmf/userManagement/model/Transaction.java new file mode 100644 index 0000000..fc08dc8 --- /dev/null +++ b/src/main/java/com/tarento/upsmf/userManagement/model/Transaction.java @@ -0,0 +1,46 @@ +package com.tarento.upsmf.userManagement.model; + +import lombok.*; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; +import java.util.Date; + +@Entity +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +@ToString +@Table(name = "transactions") +public class Transaction { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String responseCode; + private String uniqueRefNumber; + private Double serviceTaxAmount; + private Double processingFeeAmount; + private Double totalAmount; + private Double transactionAmount; + private Date transactionDate; + private String interchangeValue; + private String tdr; + private String paymentMode; + private Integer subMerchantId; + private String referenceNo; + private Long entityId; + private String rs; + private String tps; + private String mandatoryFields; + private String optionalFields; + private String rsv; + private String module; + private String transaction_status; + +} diff --git a/src/main/java/com/tarento/upsmf/userManagement/repository/PaymentRepository.java b/src/main/java/com/tarento/upsmf/userManagement/repository/PaymentRepository.java new file mode 100644 index 0000000..27bd50f --- /dev/null +++ b/src/main/java/com/tarento/upsmf/userManagement/repository/PaymentRepository.java @@ -0,0 +1,15 @@ +package com.tarento.upsmf.userManagement.repository; + +import com.tarento.upsmf.userManagement.model.Payment; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +import java.util.Optional; + +@Repository +public interface PaymentRepository extends JpaRepository { + @Query(value = "SELECT * FROM fee_details f LEFT JOIN exam_details e ON f.fee_id = e.fee_id WHERE f.fee_id = :id", nativeQuery = true) + Optional findByIdWithExamsNative(@Param("id") Integer id); +} \ No newline at end of file diff --git a/src/main/java/com/tarento/upsmf/userManagement/repository/TransactionRepository.java b/src/main/java/com/tarento/upsmf/userManagement/repository/TransactionRepository.java new file mode 100644 index 0000000..f79305e --- /dev/null +++ b/src/main/java/com/tarento/upsmf/userManagement/repository/TransactionRepository.java @@ -0,0 +1,8 @@ +package com.tarento.upsmf.userManagement.repository; + +import com.tarento.upsmf.userManagement.model.Transaction; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface TransactionRepository extends JpaRepository { + Transaction findByUniqueRefNumber(String uniqueRefNumber); +} diff --git a/src/main/java/com/tarento/upsmf/userManagement/services/PaymentService.java b/src/main/java/com/tarento/upsmf/userManagement/services/PaymentService.java new file mode 100644 index 0000000..e068821 --- /dev/null +++ b/src/main/java/com/tarento/upsmf/userManagement/services/PaymentService.java @@ -0,0 +1,15 @@ +package com.tarento.upsmf.userManagement.services; + +import com.tarento.upsmf.userManagement.model.Payment; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; + +import java.io.IOException; +import java.net.URISyntaxException; +import java.util.Map; + + +@Service +public interface PaymentService { + public ResponseEntity makePayment(Map requestData) throws URISyntaxException, IOException; +} \ No newline at end of file diff --git a/src/main/java/com/tarento/upsmf/userManagement/services/UserService.java b/src/main/java/com/tarento/upsmf/userManagement/services/UserService.java index a96e004..a5b66b0 100644 --- a/src/main/java/com/tarento/upsmf/userManagement/services/UserService.java +++ b/src/main/java/com/tarento/upsmf/userManagement/services/UserService.java @@ -1,58 +1,115 @@ package com.tarento.upsmf.userManagement.services; import com.fasterxml.jackson.databind.JsonNode; +import com.tarento.upsmf.userManagement.model.Transaction; +import com.tarento.upsmf.userManagement.repository.TransactionRepository; +import com.tarento.upsmf.userManagement.utility.KeycloakTokenRetriever; +import com.tarento.upsmf.userManagement.utility.KeycloakUserCount; +import com.tarento.upsmf.userManagement.utility.KeycloakUserCredentialPersister; +import com.tarento.upsmf.userManagement.utility.SunbirdRCKeycloakTokenRetriever; import org.apache.http.client.HttpClient; import org.apache.http.impl.client.HttpClientBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.PropertySource; import org.springframework.core.env.Environment; import org.springframework.http.*; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; +import org.springframework.web.util.UriComponentsBuilder; +import javax.annotation.PostConstruct; +import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; +import java.sql.Connection; +import java.sql.SQLException; +import java.util.*; @Component +@PropertySource({ "classpath:application.properties" }) public class UserService { - private static final Logger logger = LoggerFactory.getLogger(UserService.class); @Autowired private Environment env; + @Autowired + private KeycloakTokenRetriever keycloakTokenRetriever; + + @Autowired + private SunbirdRCKeycloakTokenRetriever sunbirdRCKeycloakTokenRetriever; + + @Autowired + private PaymentService paymentService; + + @Autowired + private KeycloakUserCredentialPersister keycloakUserCredentialPersister; + + @Autowired + private TransactionRepository transactionRepository; + + @Autowired + private KeycloakUserCount keycloakUserCount; + + private static Environment environment; + private String BASE_URL; + private String KEYCLOAK_BASEURL; + + private Connection connection; + + @PostConstruct + public void init(){ + environment = env; + BASE_URL = getPopertyValue("BaseURL"); + KEYCLOAK_BASEURL = getPopertyValue("keycloak_BaseURL"); + } + + public static String getPopertyValue(String property){ + return environment.getProperty(property); + } + private final RestTemplate restTemplate = new RestTemplate(); - final String BASE_URL = "https://uphrh.in/api"; private HttpHeaders getHeader(){ - System.out.println(env.getProperty("BaseURL")); - logger.info("Getting headers..."); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); - headers.add("Authorization","Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJSR3RkMkZzeG1EMnJER3I4dkJHZ0N6MVhyalhZUzBSSyJ9.kMLn6177rvY53i0RAN3SPD5m3ctwaLb32pMYQ65nBdA"); - headers.add("x-authenticated-user-token","eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJBbjFzUzNFanlFeUhYRGdlWXUxdGdpTjM2SDdyalFOcld0a3NOQzhnbUNVIn0.eyJqdGkiOiJmODNlZTgzOS05NmM0LTQ3NWMtYTk2Yi1lNDI2MDViYmNjMjMiLCJleHAiOjE2OTA4Mzk2OTgsIm5iZiI6MCwiaWF0IjoxNjkwNzk2NDk4LCJpc3MiOiJodHRwczovL3VwaHJoLmluL2F1dGgvcmVhbG1zL3N1bmJpcmQiLCJhdWQiOlsicmVhbG0tbWFuYWdlbWVudCIsImFjY291bnQiXSwic3ViIjoiYTk3YjQyY2UtNzkwNi00MTRlLWJjMzAtMzFhODk0NjgwZjUzIiwidHlwIjoiQmVhcmVyIiwiYXpwIjoibG1zIiwiYXV0aF90aW1lIjowLCJzZXNzaW9uX3N0YXRlIjoiZjc2NjlhYmItOWE4Ni00MWNjLWI2OWUtM2Q4ZTZjZjE2MjI2IiwiYWNyIjoiMSIsImFsbG93ZWQtb3JpZ2lucyI6WyJodHRwczovL3VwaHJoLmluIl0sInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJvZmZsaW5lX2FjY2VzcyIsImFkbWluIiwidW1hX2F1dGhvcml6YXRpb24iXX0sInJlc291cmNlX2FjY2VzcyI6eyJyZWFsbS1tYW5hZ2VtZW50Ijp7InJvbGVzIjpbIm1hbmFnZS11c2VycyIsInZpZXctdXNlcnMiLCJxdWVyeS1ncm91cHMiLCJxdWVyeS11c2VycyJdfSwiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiIiLCJuYW1lIjoiYWRtaW4gYWRtaW4iLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJhZG1pbiIsImdpdmVuX25hbWUiOiJhZG1pbiIsImZhbWlseV9uYW1lIjoiYWRtaW4iLCJlbWFpbCI6ImFkbWluQHN1bmJpcmQub3JnIn0.fh9Zj8htV_-ecMWF_5E2zNsZTZCITP509uJk7zSm6o-uqLRLXy6YupbNbyUZmAL_CkkmAawCtQcNA4GTyaacSA4mRBDfWrYeLfrguFbmgTMMuLOLGzfCfnTwDYhAoyZlyO8P8pnw9B8a0nKClqbqt1h2kpGYDmNV7fXltrE4f81IDXGGIbxuWrFhqmqT2xXi4gIf6Y6ANXFoU4jYaqRXw3hoYwCyYDFi57Dljzx_KWfCb4UxKqmVF1vlLokNVoYuhMNZSICEwJCBIS_PrY9sfoYZZK1Q04NWs1F6Hppqy85PhWn_EycaEeZ0OAByIvi2HagdT0Ris2sHVFntphQbkA"); + String authToken = environment.getProperty("authorizationToken"); + String xAuthToken = environment.getProperty("x-authenticated-user-token"); + headers.add("Authorization","Bearer " + authToken); + headers.add("x-authenticated-user-token",xAuthToken); + logger.info("Getting headers...{} ", headers); + return headers; + } + + private HttpHeaders getHeaderForKeycloak() throws IOException { + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + JsonNode adminToken = sunbirdRCKeycloakTokenRetriever.getAdminToken(); + String authToken = adminToken.get("access_token").asText(); + headers.add("Authorization","Bearer " + authToken); + logger.info("Getting keycloak headers...{} ", headers); return headers; } public ResponseEntity createUser(final JsonNode body) throws URISyntaxException { - logger.info("Creating user..."); - URI uri = new URI(BASE_URL + "/user/v1/sso/create"); + logger.info("Creating user...{} ", body.toPrettyString()); + URI uri1 = new URI(BASE_URL + "/user/v1/sso/create"); HttpHeaders headers = getHeader(); HttpEntity httpEntity = new HttpEntity(body, headers); - ResponseEntity result = restTemplate.postForEntity(uri,httpEntity,JsonNode.class); + ResponseEntity result = restTemplate.postForEntity(uri1,httpEntity,JsonNode.class); return result; } + public ResponseEntity updateUser(final JsonNode body) throws URISyntaxException { - logger.info("Updating user..."); + logger.info("updateUser user...{} ", body.toPrettyString()); RestTemplate restTemplate = new RestTemplate(); - // Create HttpClient with PATCH support HttpClient httpClient = HttpClientBuilder.create().build(); HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient); restTemplate.setRequestFactory(requestFactory); - URI uri = new URI(BASE_URL + "/user/v1/update"); HttpHeaders headers = getHeader(); HttpEntity httpEntity = new HttpEntity<>(body, headers); @@ -60,9 +117,8 @@ public ResponseEntity updateUser(final JsonNode body) throws URISyntax return result; } - public ResponseEntity listUser(final JsonNode body) throws URISyntaxException{ - logger.info("Listing users..."); + logger.info("listUser user...{} ", body.toPrettyString()); RestTemplate restTemplate = new RestTemplate(); URI uri = new URI(BASE_URL + "/user/v1/search"); HttpHeaders headers = getHeader(); @@ -71,8 +127,12 @@ public ResponseEntity listUser(final JsonNode body) throws URISyntaxEx return result; } + public String userCount() throws IOException { + return keycloakUserCount.getUserCount(); + } + public ResponseEntity activateUser(final JsonNode body) throws URISyntaxException{ - logger.info("Activating user..."); + logger.info("activateUser user...{} ", body.toPrettyString()); RestTemplate restTemplate = new RestTemplate(); URI uri = new URI(BASE_URL + "/user/v1/unblock"); HttpHeaders headers = getHeader(); @@ -82,7 +142,7 @@ public ResponseEntity activateUser(final JsonNode body) throws URISynt } public ResponseEntity deactivateUser(final JsonNode body) throws URISyntaxException { - logger.info("Deactivating user..."); + logger.info("deactivateUser user...{} ", body.toPrettyString()); RestTemplate restTemplate = new RestTemplate(); URI uri = new URI(BASE_URL + "/user/v1/block"); HttpHeaders headers = getHeader(); @@ -90,4 +150,94 @@ public ResponseEntity deactivateUser(final JsonNode body) throws URISy ResponseEntity result = restTemplate.postForEntity(uri,httpEntity,JsonNode.class); return result; } -} + + public ResponseEntity sendOTP(String phoneNumber, String name, String otp) throws URISyntaxException { + logger.info("Sending OTP to name : {} with OTP {} ...", name, otp); + String baseUrl = env.getProperty("otp.baseUrl"); + String username = env.getProperty("otp.userName"); + String password = env.getProperty("otp.password"); + String senderId = env.getProperty("otp.senderID"); + String message = "Hello %s, Your OTP is %s UPSMF, Lucknow"; + String message1 = String.format(message,name,otp); + String msgType = "TXT"; + String response = "Y"; + + UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(baseUrl) + .queryParam("username", username) + .queryParam("pass", password) + .queryParam("senderid", senderId) + .queryParam("message", message1) + .queryParam("dest_mobileno", String.valueOf(phoneNumber)) + .queryParam("msgtype", msgType) + .queryParam("response", response); + + URI uri = builder.build().encode().toUri(); + HttpHeaders headers = new HttpHeaders(); + headers.add("Accept", "application/json"); + HttpEntity httpEntity = new HttpEntity<>(headers); + ResponseEntity result = restTemplate.exchange(uri, HttpMethod.GET, httpEntity, String.class); + return result; + } + + public ResponseEntity generateOTP(String email) throws URISyntaxException, IOException { + logger.info("generate OTP for user...{} ", email); + RestTemplate restTemplate = new RestTemplate(); + URI uri = new URI(KEYCLOAK_BASEURL + "/user/generateOtp"); + logger.info("login user ...{} ", uri.toString()); + HttpHeaders headerForKeycloak = getHeaderForKeycloak(); + HttpEntity httpEntity = new HttpEntity(email, headerForKeycloak); + ResponseEntity result = restTemplate.postForEntity(uri,httpEntity,String.class); + return result; + } + + public ResponseEntity login(final JsonNode body) throws URISyntaxException, IOException { + logger.info("login user ...{} ", body); + RestTemplate restTemplate = new RestTemplate(); + URI uri = new URI(KEYCLOAK_BASEURL + "/user/login"); + logger.info("login user ...{} ", uri.toString()); + HttpHeaders headerForKeycloak = getHeaderForKeycloak(); + HttpEntity httpEntity = new HttpEntity(body, headerForKeycloak); + ResponseEntity result = restTemplate.postForEntity(uri,httpEntity,String.class); + return result; + } + + public ResponseEntity paymentRedirect(Map requestData) throws URISyntaxException, IOException { + return paymentService.makePayment(requestData); + } + + public String usrLogin(JsonNode body) throws IOException { + logger.info("login user with body {}",body); + return keycloakUserCredentialPersister.usrLogin(body); + } + + public String usrOTP(JsonNode body) throws IOException { + logger.info("OTP mail to user with body {}",body); + return keycloakUserCredentialPersister.sendOTPMail(body); + } + public ResponseEntity> getAllTransactions() { + List result = transactionRepository.findAll(); + if (result.isEmpty()) { + return new ResponseEntity<>(HttpStatus.NOT_FOUND); + } + return new ResponseEntity<>(result, HttpStatus.OK); + } + + public ResponseEntity getTransactionByUniqueRefNumber(String uniqueRefNumber) { + Transaction transaction = transactionRepository.findByUniqueRefNumber(uniqueRefNumber); + if (transaction == null) { + return new ResponseEntity<>(HttpStatus.NOT_FOUND); + } + return new ResponseEntity<>(transaction, HttpStatus.OK); + } + + public ResponseEntity getUserListByAttribute(JsonNode body) throws SQLException, IOException, URISyntaxException { + logger.info("fetching user attribute for payload {} ", body.toPrettyString()); + RestTemplate restTemplate = new RestTemplate(); + URI uri = new URI(KEYCLOAK_BASEURL + "/user/attribute"); + HttpHeaders headerForKeycloak = getHeaderForKeycloak(); + HttpEntity httpEntity = new HttpEntity(body, headerForKeycloak); + ResponseEntity result = restTemplate.postForEntity(uri,httpEntity,String.class); + return result; + } + +} \ No newline at end of file diff --git a/src/main/java/com/tarento/upsmf/userManagement/services/impl/PaymentServiceImpl.java b/src/main/java/com/tarento/upsmf/userManagement/services/impl/PaymentServiceImpl.java new file mode 100644 index 0000000..a3ff229 --- /dev/null +++ b/src/main/java/com/tarento/upsmf/userManagement/services/impl/PaymentServiceImpl.java @@ -0,0 +1,257 @@ +package com.tarento.upsmf.userManagement.services.impl; + +import com.tarento.upsmf.userManagement.model.ResponseDto; +import com.tarento.upsmf.userManagement.model.Transaction; +import com.tarento.upsmf.userManagement.repository.TransactionRepository; +import com.tarento.upsmf.userManagement.services.PaymentService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.PropertySource; +import org.springframework.core.env.Environment; +import org.springframework.http.*; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + +import javax.annotation.PostConstruct; +import java.net.URI; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.regex.Pattern; + +@Service +@PropertySource({ "classpath:application.properties" }) +public class PaymentServiceImpl implements PaymentService { + + private static final Logger logger = LoggerFactory.getLogger(PaymentServiceImpl.class); + + @Autowired + private Environment env; + + private static Environment environment; + + @Autowired + TransactionRepository repository; + + private String REGISTRATION_PAYMENT_GATEWAY_ENDPOINT; + private String AFFILIATION_PAYMENT_GATEWAY_ENDPOINT; + private String EXAM_PAYMENT_GATEWAY_ENDPOINT; + private String FEE_STATUS_UPDATE_ENDPOINT; + private String EXAMS_AUTH_TOKEN; + private String AES_KEY_FOR_PAYMENT_SUCCESS; + + @Autowired + private RestTemplate restTemplate; + + @PostConstruct + public void init(){ + environment = env; + REGISTRATION_PAYMENT_GATEWAY_ENDPOINT = getPropertyValue("registration_payment_Gateway_EndPoint"); + AFFILIATION_PAYMENT_GATEWAY_ENDPOINT = getPropertyValue("affiliation_payment_Gateway_EndPoint"); + AES_KEY_FOR_PAYMENT_SUCCESS = getPropertyValue("aes_key_for_payment_success"); + EXAM_PAYMENT_GATEWAY_ENDPOINT = getPropertyValue("exam_payment_Gateway_EndPoint"); + FEE_STATUS_UPDATE_ENDPOINT = getPropertyValue("exam_fee_status_update_EndPoint"); + EXAMS_AUTH_TOKEN = getPropertyValue("exam_service_auth_token"); + } + + public static String getPropertyValue(String property){ + return environment.getProperty(property); + } + + @Override + public ResponseEntity makePayment(Map requestData) { + logger.info("payment details...{} ", requestData); + org.springframework.http.HttpHeaders httpHeaders = new org.springframework.http.HttpHeaders(); + String mandatoryFields = requestData.get("mandatory fields"); + logger.info("mandatory fields details...{} ", mandatoryFields); + if(mandatoryFields != null && !mandatoryFields.isEmpty()) { + String[] split = mandatoryFields.split(Pattern.quote("|")); + List strings = Arrays.asList(split); + String strEndPoint = ""; + if (strings.contains("registration")) { + strEndPoint = REGISTRATION_PAYMENT_GATEWAY_ENDPOINT; + } else if (strings.contains("affiliation")) { + strEndPoint = AFFILIATION_PAYMENT_GATEWAY_ENDPOINT; + } else if(strings.contains("exam") || strings.contains("EXAM")) { + strEndPoint = EXAM_PAYMENT_GATEWAY_ENDPOINT; + // get ref no + String referenceNo = requestData.get("ReferenceNo"); + // update db for provided transaction id + updateStudentFeeStatus(referenceNo); + } + String responseString = "", transaction_status = ""; + String transactionDetails = getTransactionDetails(requestData); + if ((requestData != null) && (requestData.get("Response Code") != null) + && requestData.get("Response Code").equals("E000")) { + responseString = strEndPoint + "?resp=success" + transactionDetails; + transaction_status = "success"; + logger.info("Payment is successful."); + logger.info("Record saved to DB."); + } else { + responseString = strEndPoint + "?resp=failure" + transactionDetails; + transaction_status = "failed."; + logger.info("Payment failed."); + } + logger.info("creating transaction."); + Transaction transaction = getTransaction(requestData, strEndPoint, transaction_status); + repository.save(transaction); + logger.info("Transaction {} saved. ResponseString details...{} ", transaction, responseString); + httpHeaders.setLocation(URI.create(responseString)); + return new ResponseEntity(null, httpHeaders, HttpStatus.FOUND); + } + return new ResponseEntity(null, httpHeaders, HttpStatus.NOT_FOUND); + } + + private void updateStudentFeeStatus(String referenceNo) { + logger.info("updating student fee for ref - {}", referenceNo); + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.setContentType(MediaType.APPLICATION_JSON); + httpHeaders.set("x-authenticated-user-token", EXAMS_AUTH_TOKEN); + HttpEntity entity = new HttpEntity(referenceNo, httpHeaders); + logger.info("exam url - {}", FEE_STATUS_UPDATE_ENDPOINT); + try { + ResponseEntity responseEntity = restTemplate.postForObject(FEE_STATUS_UPDATE_ENDPOINT, entity, ResponseEntity.class); + logger.info("Update student fee status - {}", responseEntity); + if (responseEntity != null && responseEntity.getStatusCode() == HttpStatus.OK) { + logger.info("Student Fee updated successfully"); + } + } catch (Exception e) { + logger.error("Error in processing request"); + } + } + + private String getTransactionDetails(Map requestData) { + String transactionAmount = requestData.get("Transaction Amount") != null ? requestData.get("Transaction Amount") : ""; + String uniqueRefNumber = requestData.get("Unique Ref Number") != null ? requestData.get("Unique Ref Number") : ""; + String response = "&transaction_amount="+transactionAmount+"&transaction_id="+uniqueRefNumber; + logger.info("transaction details {}",response); + return response; + } + + private Transaction getTransaction(final Map requestData, final String strEndPoint, final String transaction_status) { + + Long id = -1L; + if(requestData.get("ID") != null) { + id = Long.valueOf(requestData.get("ID")); + } + + Double transactionAmount = -1.00; + if(requestData.get("Transaction Amount") != null) { + transactionAmount = Double.valueOf(requestData.get("Transaction Amount")); + } + + String paymentMode = ""; + if(requestData.get("Payment Mode") != null) { + paymentMode = requestData.get("Payment Mode"); + } + + String RS = ""; + if(requestData.get("RS") != null) { + RS = requestData.get("RS"); + } + String RSV = ""; + if(requestData.get("RSV") != null) { + RSV = requestData.get("RSV"); + } + String TDR = ""; + if(requestData.get("TDR") != null) { + TDR = requestData.get("TDR"); + } + String interchangeValue = ""; + if(requestData.get("Interchange Value") != null) { + interchangeValue = requestData.get("Interchange Value"); + } + + Double processingFeeAmount = -1.00; + if(requestData.get("Processing Fee Amount") != null) { + processingFeeAmount = Double.valueOf(requestData.get("Processing Fee Amount")); + } + + Double totalAmount = -1.00; + if(requestData.get("Total Amount") != null) { + totalAmount = Double.valueOf(requestData.get("Total Amount")); + } + + String TPS = ""; + if(requestData.get("TPS") != null) { + TPS = requestData.get("TPS"); + } + + Double serviceTaxAmount = -1.00; + if(requestData.get("Service Tax Amount") != null) { + serviceTaxAmount = Double.valueOf(requestData.get("Service Tax Amount")); + } + + String optionalFields = ""; + if(requestData.get("optional fields") != null) { + optionalFields = requestData.get("optional fields"); + } + + String module = ""; + if(requestData.get("module") != null) { + module = requestData.get("module"); + } + + String referenceNo = ""; + if(requestData.get("ReferenceNo") != null) { + referenceNo = requestData.get("ReferenceNo"); + } + + Integer subMerchantId = -1; + if(requestData.get("SubMerchantId") != null) { + subMerchantId = Integer.valueOf(requestData.get("SubMerchantId")); + } + + String uniqueRefNumber = null; + if(requestData.get("Unique Ref Number") != null) { + uniqueRefNumber = requestData.get("Unique Ref Number"); + } + + String responseCode = requestData.get("Response Code"); + + Date transactionDate = null; + try { + String date = requestData.get("Transaction Date") != null ? requestData.get("Transaction Date") : ""; + DateFormat format = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss"); + if(!date.isBlank()) { + transactionDate = format.parse(date); + } + } catch (ParseException e) { + logger.error("parsing date failed.",e); + } + String mandatoryFields = requestData.get("mandatory fields"); + Transaction transaction = Transaction.builder().transactionDate(transactionDate) + .transactionAmount(transactionAmount).paymentMode(paymentMode).rs(RS).rsv(RSV).tdr(TDR) + .entityId(id).interchangeValue(interchangeValue).processingFeeAmount(processingFeeAmount) + .totalAmount(totalAmount).tps(TPS).serviceTaxAmount(serviceTaxAmount).mandatoryFields(mandatoryFields) + .optionalFields(optionalFields).module(module).referenceNo(referenceNo).subMerchantId(subMerchantId) + .uniqueRefNumber(uniqueRefNumber).responseCode(responseCode).transaction_status(transaction_status).build(); + transaction.setModule(strEndPoint); + logger.info("Record to be saved {}",transaction); + return transaction; + } + + private String sha512Hash(String input) { + try { + MessageDigest digest = MessageDigest.getInstance("SHA-512"); + byte[] hashBytes = digest.digest(input.getBytes()); + StringBuilder hexString = new StringBuilder(); + for (byte hashByte : hashBytes) { + String hex = Integer.toHexString(0xff & hashByte); + if (hex.length() == 1) hexString.append('0'); + hexString.append(hex); + } + return hexString.toString(); + } catch (NoSuchAlgorithmException e) { + logger.error("Error occurred while encrypting",e); + return null; + } + } +} diff --git a/src/main/java/com/tarento/upsmf/userManagement/utility/KeycloakTokenRetriever.java b/src/main/java/com/tarento/upsmf/userManagement/utility/KeycloakTokenRetriever.java new file mode 100644 index 0000000..89af786 --- /dev/null +++ b/src/main/java/com/tarento/upsmf/userManagement/utility/KeycloakTokenRetriever.java @@ -0,0 +1,78 @@ +package com.tarento.upsmf.userManagement.utility; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.tarento.upsmf.userManagement.services.UserService; +import org.apache.http.HttpHeaders; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.util.EntityUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.PropertySource; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import java.io.IOException; + +@Component +@PropertySource({ "classpath:application.properties" }) +public class KeycloakTokenRetriever { + + private static final Logger logger = LoggerFactory.getLogger(KeycloakTokenRetriever.class); + + @Autowired + private Environment env; + + private static Environment environment; + + private String ADMIN_TOKEN_ENDPOINT; + + private String ADMIN_TOKEN_SECRET; + + private String ADMIN_USERNAME; + private String ADMIN_PASSWORD; + + private ObjectMapper mapper = new ObjectMapper(); + + @PostConstruct + public void init(){ + environment = env; + ADMIN_TOKEN_ENDPOINT = getPropertyValue("adminToken.endPoint"); + ADMIN_TOKEN_SECRET = getPropertyValue("adminToken.clientSecret"); + ADMIN_USERNAME = getPropertyValue("adminToken.userName"); + ADMIN_PASSWORD = getPropertyValue("adminToken.password"); + } + + public static String getPropertyValue(String property){ + return environment.getProperty(property); + } + public JsonNode getAdminToken() throws IOException { + String tokenEndpoint = ADMIN_TOKEN_ENDPOINT; + logger.info("Token endpoint: {}" ,tokenEndpoint); + + HttpClient httpClient = HttpClients.createDefault(); + HttpPost httpPost = new HttpPost(tokenEndpoint); + httpPost.setHeader(HttpHeaders.CONTENT_TYPE, "application/x-www-form-urlencoded"); + + String requestBody = "username=" + ADMIN_USERNAME + + "&password=" + ADMIN_PASSWORD + + "&grant_type=client_credentials" + + "&client_id=admin-cli" + + "&client_secret=" + ADMIN_TOKEN_SECRET; + logger.info("Request body: {}", requestBody); + + StringEntity entity = new StringEntity(requestBody); + httpPost.setEntity(entity); + + org.apache.http.HttpResponse response = httpClient.execute(httpPost); + String responseBody = EntityUtils.toString(response.getEntity()); + JsonNode jsonNode = mapper.readTree(responseBody); + + return jsonNode; + } +} diff --git a/src/main/java/com/tarento/upsmf/userManagement/utility/KeycloakUserActivateDeActivate.java b/src/main/java/com/tarento/upsmf/userManagement/utility/KeycloakUserActivateDeActivate.java new file mode 100644 index 0000000..2edc46b --- /dev/null +++ b/src/main/java/com/tarento/upsmf/userManagement/utility/KeycloakUserActivateDeActivate.java @@ -0,0 +1,70 @@ +package com.tarento.upsmf.userManagement.utility; + +import com.fasterxml.jackson.databind.JsonNode; +import org.apache.http.HttpHeaders; +import org.apache.http.StatusLine; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpPut; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.util.EntityUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.PropertySource; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import java.io.IOException; + + +@Component +@PropertySource({ "classpath:application.properties" }) +public class KeycloakUserActivateDeActivate { + + private static final Logger logger = LoggerFactory.getLogger(KeycloakUserActivateDeActivate.class); + + @Autowired + private Environment env; + + @Autowired + private KeycloakTokenRetriever keycloakTokenRetriever; + + private static Environment environment; + + private String KEYCLOAK_USER_BASE_URL; + + @PostConstruct + public void init(){ + environment = env; + KEYCLOAK_USER_BASE_URL = getPropertyValue("keycloak.user.baseURL"); + } + + public static String getPropertyValue(String property){ + return environment.getProperty(property); + } + public String activateDeactivatUser(final String userName, boolean activate) throws IOException { + String userEndpoint = KEYCLOAK_USER_BASE_URL + "/" + userName; + logger.info("User {} is being activated ? : {} with userEndPoint : {}",userName, activate, userEndpoint); + JsonNode adminToken = keycloakTokenRetriever.getAdminToken(); + String accessToken = adminToken.get("access_token").asText(); + + HttpClient httpClient = HttpClients.createDefault(); + HttpPut httpPut = new HttpPut(userEndpoint); + + httpPut.setHeader(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken); + httpPut.setHeader(HttpHeaders.CONTENT_TYPE, "application/json"); + + String requestBody = "{\"enabled\": " + activate + "}"; + + StringEntity entity = new StringEntity(requestBody); + httpPut.setEntity(entity); + + org.apache.http.HttpResponse response = httpClient.execute(httpPut); + StatusLine statusLine = response.getStatusLine(); + + String responseBody = statusLine.getStatusCode() + " " + statusLine.getReasonPhrase(); + return responseBody; + } +} diff --git a/src/main/java/com/tarento/upsmf/userManagement/utility/KeycloakUserCount.java b/src/main/java/com/tarento/upsmf/userManagement/utility/KeycloakUserCount.java new file mode 100644 index 0000000..91e3e81 --- /dev/null +++ b/src/main/java/com/tarento/upsmf/userManagement/utility/KeycloakUserCount.java @@ -0,0 +1,59 @@ +package com.tarento.upsmf.userManagement.utility; + +import com.fasterxml.jackson.databind.JsonNode; +import org.apache.http.HttpHeaders; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.util.EntityUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.PropertySource; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import java.io.IOException; + +@Component +@PropertySource({ "classpath:application.properties" }) +public class KeycloakUserCount { + + private static final Logger logger = LoggerFactory.getLogger(KeycloakUserCount.class); + + @Autowired + private Environment env; + + private static Environment environment; + + private String KEYCLOAK_USER_BASE_URL; + + @Autowired + private KeycloakTokenRetriever keycloakTokenRetriever; + + @PostConstruct + public void init(){ + environment = env; + KEYCLOAK_USER_BASE_URL = getPropertyValue("keycloak.user.baseURL"); + } + + public static String getPropertyValue(String property){ + return environment.getProperty(property); + } + + public String getUserCount() throws IOException { + logger.info("userEndpoint {} " ,KEYCLOAK_USER_BASE_URL); + JsonNode adminToken = keycloakTokenRetriever.getAdminToken(); + String accessToken = adminToken.get("access_token").asText(); + HttpClient httpClient = HttpClients.createDefault(); + HttpGet httpGet = new HttpGet(KEYCLOAK_USER_BASE_URL+"/count"); + httpGet.setHeader(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken); + httpGet.setHeader(HttpHeaders.ACCEPT, "application/json"); + org.apache.http.HttpResponse response = httpClient.execute(httpGet); + String responseBody = EntityUtils.toString(response.getEntity()); + logger.info("ResponseBody {}", responseBody); + return responseBody; + } + +} diff --git a/src/main/java/com/tarento/upsmf/userManagement/utility/KeycloakUserCreator.java b/src/main/java/com/tarento/upsmf/userManagement/utility/KeycloakUserCreator.java new file mode 100644 index 0000000..5292c7d --- /dev/null +++ b/src/main/java/com/tarento/upsmf/userManagement/utility/KeycloakUserCreator.java @@ -0,0 +1,103 @@ +package com.tarento.upsmf.userManagement.utility; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.ObjectNode; +import org.apache.http.Header; +import org.apache.http.HttpHeaders; +import org.apache.http.HttpResponse; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.message.BufferedHeader; +import org.apache.http.util.CharArrayBuffer; +import org.apache.http.util.EntityUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.PropertySource; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import java.io.IOException; +import java.util.Arrays; +import java.util.Optional; +import java.util.UUID; + +@Component +@PropertySource({ "classpath:application.properties" }) +public class KeycloakUserCreator { + + private static final Logger logger = LoggerFactory.getLogger(KeycloakUserCreator.class); + + @Autowired + private Environment env; + + @Autowired + private KeycloakTokenRetriever keycloakTokenRetriever; + + @Autowired + private KeycloakUserCredentialPersister keycloakUserCredentialPersister; + + private static Environment environment; + + private String KEYCLOAK_USER_BASE_URL; + + private ObjectMapper mapper = new ObjectMapper(); + + @PostConstruct + public void init(){ + environment = env; + KEYCLOAK_USER_BASE_URL = getPropertyValue("keycloak.user.baseURL"); + } + + public static String getPropertyValue(String property){ + return environment.getProperty(property); + } + public String createUser(final JsonNode request) throws IOException { + JsonNode body = request.get("request"); + String keycloakBaseUrl = KEYCLOAK_USER_BASE_URL; + logger.info("keycloakBaseUrl: " ,keycloakBaseUrl); + JsonNode adminToken = keycloakTokenRetriever.getAdminToken(); + String accessToken = adminToken.get("access_token").asText(); + HttpClient httpClient = HttpClients.createDefault(); + HttpPost httpPost = new HttpPost(keycloakBaseUrl); + + httpPost.setHeader(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken); + httpPost.setHeader(HttpHeaders.ACCEPT, "application/json"); + httpPost.setHeader(HttpHeaders.CONTENT_TYPE, "application/json;charset=UTF-8"); + String userName = UUID.randomUUID().toString(); + ((ObjectNode)body).put("username",userName); + logger.info("Request body: {}", body); + StringEntity entity = new StringEntity(body.toPrettyString()); + httpPost.setEntity(entity); + + HttpResponse response = httpClient.execute(httpPost); + logger.info("Response from httpClient call : {}", response); + String responseBody = EntityUtils.toString(response.getEntity()); + if (response.getStatusLine().getStatusCode() == 201) { + String location = response.getFirstHeader("location").getValue(); + location = location.substring(location.lastIndexOf("/")+1); + String password = ((ArrayNode)body.get("credentials")).get(0).get("value").asText(); + responseBody = location; + try { + logger.info("syncing user {} with pwd {}",userName,password); + String email = body.get("email").asText(); + String strResponse = keycloakUserCredentialPersister.persistUserInfo(email, password); + JsonNode mailPayLoad = mapper.createObjectNode(); + ((ObjectNode)mailPayLoad).put("firstName",body.get("firstName").asText()); + ((ObjectNode)mailPayLoad).put("lastName",body.get("lastName").asText()); + ((ObjectNode)mailPayLoad).put("email",body.get("email").asText()); + ((ObjectNode)mailPayLoad).put("userId",location); + keycloakUserCredentialPersister.sendUserCreateMail(mailPayLoad); + }catch (Exception ex){ + logger.error("error occurred.",ex); + } + } + logger.info("ResponseBody {}", responseBody); + return responseBody; + } +} diff --git a/src/main/java/com/tarento/upsmf/userManagement/utility/KeycloakUserCredentialPersister.java b/src/main/java/com/tarento/upsmf/userManagement/utility/KeycloakUserCredentialPersister.java new file mode 100644 index 0000000..b995451 --- /dev/null +++ b/src/main/java/com/tarento/upsmf/userManagement/utility/KeycloakUserCredentialPersister.java @@ -0,0 +1,130 @@ +package com.tarento.upsmf.userManagement.utility; + +import com.fasterxml.jackson.databind.JsonNode; +import org.apache.http.HttpHeaders; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.util.EntityUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.PropertySource; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import java.io.IOException; +import java.util.UUID; + +@Component +@PropertySource({ "classpath:application.properties" }) +public class KeycloakUserCredentialPersister { + + private static final Logger logger = LoggerFactory.getLogger(KeycloakUserCredentialPersister.class); + + @Autowired + private Environment env; + + @Autowired + private KeycloakUserActivateDeActivate keycloakUserActivateDeActivate; + + @Autowired + private SunbirdRCKeycloakTokenRetriever sunbirdRCKeycloakTokenRetriever; + + private static Environment environment; + + private String REGISTRY_ENDPOINT_SAVE_USERINFO; + + private String OTP_MAIL_ENDPOINT; + + private String USER_CREATE_MAIL_ENDPOINT; + + private String USER_LOGIN; + + @PostConstruct + public void init(){ + environment = env; + REGISTRY_ENDPOINT_SAVE_USERINFO = getPropertyValue("registry.endpoint.save.userinfo"); + OTP_MAIL_ENDPOINT = getPropertyValue("otp.mail.endpoint"); + USER_CREATE_MAIL_ENDPOINT = getPropertyValue("user.create.mail.endpoint"); + USER_LOGIN = getPropertyValue("user.login"); + } + + public static String getPropertyValue(String property){ + return environment.getProperty(property); + } + public String persistUserInfo(final String userName, final String password) throws IOException { + logger.info("saving user info to endpoint {}",REGISTRY_ENDPOINT_SAVE_USERINFO); + HttpClient httpClient = HttpClients.createDefault(); + HttpPost httpPost = new HttpPost(REGISTRY_ENDPOINT_SAVE_USERINFO); + JsonNode adminToken = sunbirdRCKeycloakTokenRetriever.getAdminToken(); + String authToken = adminToken.get("access_token").asText(); + httpPost.setHeader(HttpHeaders.CONTENT_TYPE, "application/json"); + httpPost.setHeader(HttpHeaders.AUTHORIZATION, "Bearer " + authToken); + String requestBody = "{" + + "\"username\": " + "\"" + userName + "\"" + "," + + "\"password\": " + "\"" + password + "\"" + + "}"; + logger.info("payload to save user info with body {} and header {}",requestBody,httpPost.getAllHeaders()); + StringEntity entity = new StringEntity(requestBody); + httpPost.setEntity(entity); + org.apache.http.HttpResponse response = httpClient.execute(httpPost); + logger.info("Response from server {}",response); + String responseBody = EntityUtils.toString(response.getEntity()); + return responseBody; + } + + public String sendOTPMail(JsonNode body) throws IOException { + logger.info("sending OTP to user email endpoint {} ",OTP_MAIL_ENDPOINT); + HttpClient httpClient = HttpClients.createDefault(); + HttpPost httpPost = new HttpPost(OTP_MAIL_ENDPOINT); + JsonNode adminToken = sunbirdRCKeycloakTokenRetriever.getAdminToken(); + String authToken = adminToken.get("access_token").asText(); + httpPost.setHeader(HttpHeaders.CONTENT_TYPE, "application/json"); + httpPost.setHeader(HttpHeaders.AUTHORIZATION, "Bearer " + authToken); + logger.info("payload to send OTP mail to user with body {} and header {}", body, httpPost); + StringEntity entity = new StringEntity(body.toPrettyString()); + httpPost.setEntity(entity); + org.apache.http.HttpResponse response = httpClient.execute(httpPost); + logger.info("Response from server {}",response); + String responseBody = EntityUtils.toString(response.getEntity()); + return responseBody; + } + + public String sendUserCreateMail(JsonNode body) throws IOException { + logger.info("sending user create successful mail to user endpoint {}. ",USER_CREATE_MAIL_ENDPOINT); + HttpClient httpClient = HttpClients.createDefault(); + HttpPost httpPost = new HttpPost(USER_CREATE_MAIL_ENDPOINT); + JsonNode adminToken = sunbirdRCKeycloakTokenRetriever.getAdminToken(); + String authToken = adminToken.get("access_token").asText(); + httpPost.setHeader(HttpHeaders.CONTENT_TYPE, "application/json"); + httpPost.setHeader(HttpHeaders.AUTHORIZATION, "Bearer " + authToken); + logger.info("payload to send user create successful mail to user with body {} and header {}", body, httpPost); + StringEntity entity = new StringEntity(body.toPrettyString()); + httpPost.setEntity(entity); + org.apache.http.HttpResponse response = httpClient.execute(httpPost); + logger.info("Response from server {}",response); + String responseBody = EntityUtils.toString(response.getEntity()); + return responseBody; + } + + public String usrLogin(JsonNode body) throws IOException { + logger.info("login user endpoint {}. ",USER_LOGIN); + HttpClient httpClient = HttpClients.createDefault(); + HttpPost httpPost = new HttpPost(USER_LOGIN); + JsonNode adminToken = sunbirdRCKeycloakTokenRetriever.getAdminToken(); + String authToken = adminToken.get("access_token").asText(); + httpPost.setHeader(HttpHeaders.CONTENT_TYPE, "application/json"); + httpPost.setHeader(HttpHeaders.AUTHORIZATION, "Bearer " + authToken); + logger.info("payload login user with body {} and header {}", body, httpPost); + StringEntity entity = new StringEntity(body.toPrettyString()); + httpPost.setEntity(entity); + org.apache.http.HttpResponse response = httpClient.execute(httpPost); + logger.info("Response from server {}",response); + String responseBody = EntityUtils.toString(response.getEntity()); + return responseBody; + } + +} diff --git a/src/main/java/com/tarento/upsmf/userManagement/utility/KeycloakUserGetter.java b/src/main/java/com/tarento/upsmf/userManagement/utility/KeycloakUserGetter.java new file mode 100644 index 0000000..543b27d --- /dev/null +++ b/src/main/java/com/tarento/upsmf/userManagement/utility/KeycloakUserGetter.java @@ -0,0 +1,110 @@ +package com.tarento.upsmf.userManagement.utility; + +import com.fasterxml.jackson.databind.JsonNode; +import org.apache.http.HttpHeaders; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.util.EntityUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.PropertySource; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; + +@Component +@PropertySource({ "classpath:application.properties" }) +public class KeycloakUserGetter { + + private static final Logger logger = LoggerFactory.getLogger(KeycloakUserCreator.class); + + @Autowired + private Environment env; + + private static Environment environment; + + private String KEYCLOAK_USER_BASE_URL; + + @Autowired + private KeycloakTokenRetriever keycloakTokenRetriever; + + @PostConstruct + public void init(){ + environment = env; + KEYCLOAK_USER_BASE_URL = getPropertyValue("keycloak.user.baseURL"); + } + + public static String getPropertyValue(String property){ + return environment.getProperty(property); + } + public String findUser(final String userID, final int offset, final int size) throws IOException { + String userEndpoint = KEYCLOAK_USER_BASE_URL; + logger.info("userEndpoint: " ,userEndpoint); + if(userID != null ) { + userEndpoint = userEndpoint + "/" + userID; + } else { + String parameter = "?first=%s&max=%s"; + parameter = String.format(parameter,offset,size); + userEndpoint = userEndpoint + parameter; + } + logger.info("userEndpoint {} after adding userId : " ,userEndpoint); + JsonNode adminToken = keycloakTokenRetriever.getAdminToken(); + logger.info("adminToken: {}" ,adminToken); + String accessToken = adminToken.get("access_token").asText(); + logger.info("accessToken: {}" ,accessToken); + + HttpClient httpClient = HttpClients.createDefault(); + HttpGet httpGet = new HttpGet(userEndpoint); + + httpGet.setHeader(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken); + httpGet.setHeader(HttpHeaders.ACCEPT, "application/json"); + + org.apache.http.HttpResponse response = httpClient.execute(httpGet); + String responseBody = EntityUtils.toString(response.getEntity()); + logger.info("ResponseBody {}", responseBody); + return responseBody; + } + + public String findUserByEmail(final String fieldName, final String fieldValue) throws IOException { + String userEndpoint = KEYCLOAK_USER_BASE_URL; + logger.info("userEndpoint: " ,userEndpoint); + if(fieldName != null && fieldValue!= null ) { + if(fieldName.equalsIgnoreCase("email")) { + String encodeEmail = encodeEmail(fieldValue); + userEndpoint = userEndpoint + "?" + fieldName + "=" + encodeEmail; + } else { + userEndpoint = userEndpoint + "?" + fieldName + "=" + fieldValue; + } + + logger.info("userEndpoint {} after adding email : " ,userEndpoint); + JsonNode adminToken = keycloakTokenRetriever.getAdminToken(); + logger.info("adminToken: {}" ,adminToken); + String accessToken = adminToken.get("access_token").asText(); + logger.info("accessToken: {}" ,accessToken); + + HttpClient httpClient = HttpClients.createDefault(); + HttpGet httpGet = new HttpGet(userEndpoint); + + httpGet.setHeader(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken); + httpGet.setHeader(HttpHeaders.ACCEPT, "application/json"); + + org.apache.http.HttpResponse response = httpClient.execute(httpGet); + logger.info("url to be hit {} ",httpGet.toString()); + String responseBody = EntityUtils.toString(response.getEntity()); + logger.info("ResponseBody {}", responseBody); + return responseBody; + } + return "No Response Generated since the inputs were null/empty."; + } + + private String encodeEmail(String email) throws UnsupportedEncodingException { + String encode = URLEncoder.encode(email, "UTF-8"); + return encode; + } +} diff --git a/src/main/java/com/tarento/upsmf/userManagement/utility/KeycloakUserUpdater.java b/src/main/java/com/tarento/upsmf/userManagement/utility/KeycloakUserUpdater.java new file mode 100644 index 0000000..a8fad0d --- /dev/null +++ b/src/main/java/com/tarento/upsmf/userManagement/utility/KeycloakUserUpdater.java @@ -0,0 +1,88 @@ +package com.tarento.upsmf.userManagement.utility; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.ArrayNode; +import org.apache.http.HttpHeaders; +import org.apache.http.HttpResponse; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpPut; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.util.EntityUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.PropertySource; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import java.io.IOException; + +@Component +@PropertySource({ "classpath:application.properties" }) +public class KeycloakUserUpdater { + + @Autowired + private Environment env; + + @Autowired + private KeycloakTokenRetriever keycloakTokenRetriever; + private static Environment environment; + private static final Logger logger = LoggerFactory.getLogger(KeycloakUserUpdater.class); + private String KEYCLOAK_USER_BASE_URL; + + @Autowired + private KeycloakUserCredentialPersister keycloakUserCredentialPersister; + + @PostConstruct + public void init(){ + environment = env; + KEYCLOAK_USER_BASE_URL = getPropertyValue("keycloak.user.baseURL"); + } + + public static String getPropertyValue(String property){ + return environment.getProperty(property); + } + + public String updateUser(final JsonNode requestBody, final String userName) throws IOException { + JsonNode adminToken = keycloakTokenRetriever.getAdminToken(); + logger.info("adminToken: {}" ,adminToken); + String accessToken = adminToken.get("access_token").asText(); + HttpClient httpClient = HttpClients.createDefault(); + HttpPut httpPut = new HttpPut(KEYCLOAK_USER_BASE_URL + "/" + userName); + + httpPut.setHeader(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken); + httpPut.setHeader(HttpHeaders.ACCEPT, "application/json, text/plain, */*"); + httpPut.setHeader(HttpHeaders.CONTENT_TYPE, "application/json;charset=UTF-8"); + logger.info("Request body: {}", requestBody); + StringEntity entity = new StringEntity(requestBody.toPrettyString()); + httpPut.setEntity(entity); + HttpResponse response = httpClient.execute(httpPut); + logger.info("******** Response after execution: {} ********",response); + String responseBody = ""; + if(response.getEntity() != null) { + logger.info("******** Response Entity: {} ********",response.getEntity()); + responseBody = EntityUtils.toString(response.getEntity()); + } + logger.info("ResponseBody {}", responseBody); + logger.info("response.getStatusLine().getStatusCode() {} ", response.getStatusLine().getStatusCode()); + if (response.getStatusLine().getStatusCode() == 204) { + if(requestBody.get("credentials")!=null){ + logger.info("credentials is not null"); + ArrayNode credentials = (ArrayNode)requestBody.get("credentials"); + logger.info("credentials[] {}", credentials); + if(!credentials.isEmpty() && !(credentials.get(0).get("value").asText().isBlank())) { + String email = requestBody.get("email").asText(); + logger.info("email : {}, credentials.get(0).get(\"value\").asText() : {}",email, credentials.get(0).get("value").asText()); + String value = keycloakUserCredentialPersister.persistUserInfo(email, credentials.get(0).get("value").asText()); + logger.info("persistUserInfo response {}", value); + } + } + responseBody = " Status 200. User updated successfully."; + } else { + responseBody = "Failed to update user." + responseBody; + } + return responseBody; + } +} diff --git a/src/main/java/com/tarento/upsmf/userManagement/utility/SunbirdRCKeycloakTokenRetriever.java b/src/main/java/com/tarento/upsmf/userManagement/utility/SunbirdRCKeycloakTokenRetriever.java new file mode 100644 index 0000000..3dc2c01 --- /dev/null +++ b/src/main/java/com/tarento/upsmf/userManagement/utility/SunbirdRCKeycloakTokenRetriever.java @@ -0,0 +1,98 @@ +package com.tarento.upsmf.userManagement.utility; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.tarento.upsmf.userManagement.services.UserService; +import org.apache.http.HttpEntity; +import org.apache.http.HttpHeaders; +import org.apache.http.NameValuePair; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.message.BasicNameValuePair; +import org.apache.http.util.EntityUtils; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.PropertySource; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.nio.charset.StandardCharsets; + +@Component +@PropertySource({ "classpath:application.properties" }) +public class SunbirdRCKeycloakTokenRetriever { + + private static final Logger logger = LoggerFactory.getLogger(SunbirdRCKeycloakTokenRetriever.class); + + @Autowired + private Environment env; + + private static Environment environment; + + private String ADMIN_TOKEN_ENDPOINT; + + private String ADMIN_TOKEN_SECRET; + + private String ADMIN_USERNAME; + private String ADMIN_PASSWORD; + + private String ADMIN_CLIENTID; + + private ObjectMapper mapper = new ObjectMapper(); + + @PostConstruct + public void init(){ + environment = env; + ADMIN_TOKEN_ENDPOINT = getPropertyValue("sunbirdRC.keycloak.adminToken.endPoint"); + ADMIN_TOKEN_SECRET = getPropertyValue("sunbirdRC.keycloak.adminToken.clientSecret"); + ADMIN_USERNAME = getPropertyValue("sunbirdRC.keycloak.adminToken.userName"); + ADMIN_CLIENTID = getPropertyValue("sunbirdRC.keycloak.adminToken.clientID"); + ADMIN_PASSWORD = getPropertyValue("sunbirdRC.keycloak.adminToken.password"); + } + + public static String getPropertyValue(String property){ + return environment.getProperty(property); + } + public JsonNode getAdminToken() throws IOException { + String tokenEndpoint = ADMIN_TOKEN_ENDPOINT; + logger.info("Token endpoint: {}" ,tokenEndpoint); + HttpClient httpClient = HttpClients.createDefault(); + HttpPost httpPost = new HttpPost(tokenEndpoint); + + String requestBody = "username=" + ADMIN_USERNAME + + "&grant_type=client_credentials" + + "&client_id=" + ADMIN_CLIENTID + + "&client_secret=" + ADMIN_TOKEN_SECRET; + + logger.info("Request body: {}", requestBody); + StringEntity entity = new StringEntity(requestBody); + + httpPost.setEntity(entity); + httpPost.setHeader(HttpHeaders.CONTENT_TYPE, "application/x-www-form-urlencoded"); + logger.info("headers {}",httpPost); + + org.apache.http.HttpResponse response = httpClient.execute(httpPost); + HttpEntity httpEntity = response.getEntity(); + String responseBody = EntityUtils.toString(httpEntity, StandardCharsets.UTF_8); + + if (response.getStatusLine().getStatusCode() == 200) { + System.out.println("Access token obtained successfully."); + System.out.println("Response: " + responseBody); + } else { + System.out.println("Failed to obtain access token."); + System.out.println("Response: " + responseBody); + } + + logger.info("Response body: {}", responseBody); + JsonNode jsonNode = mapper.readTree(responseBody); + return jsonNode; + } +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index a3558a9..f1be2bd 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,5 +1,38 @@ -server.port = 5299 -AuthorizationToken = -x-authenticated-user-token = +server.port = 5298 +authorizationToken=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJSR3RkMkZzeG1EMnJER3I4dkJHZ0N6MVhyalhZUzBSSyJ9.kMLn6177rvY53i0RAN3SPD5m3ctwaLb32pMYQ65nBdA +x-authenticated-user-token =eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJBbjFzUzNFanlFeUhYRGdlWXUxdGdpTjM2SDdyalFOcld0a3NOQzhnbUNVIn0.eyJqdGkiOiJmODNlZTgzOS05NmM0LTQ3NWMtYTk2Yi1lNDI2MDViYmNjMjMiLCJleHAiOjE2OTA4Mzk2OTgsIm5iZiI6MCwiaWF0IjoxNjkwNzk2NDk4LCJpc3MiOiJodHRwczovL3VwaHJoLmluL2F1dGgvcmVhbG1zL3N1bmJpcmQiLCJhdWQiOlsicmVhbG0tbWFuYWdlbWVudCIsImFjY291bnQiXSwic3ViIjoiYTk3YjQyY2UtNzkwNi00MTRlLWJjMzAtMzFhODk0NjgwZjUzIiwidHlwIjoiQmVhcmVyIiwiYXpwIjoibG1zIiwiYXV0aF90aW1lIjowLCJzZXNzaW9uX3N0YXRlIjoiZjc2NjlhYmItOWE4Ni00MWNjLWI2OWUtM2Q4ZTZjZjE2MjI2IiwiYWNyIjoiMSIsImFsbG93ZWQtb3JpZ2lucyI6WyJodHRwczovL3VwaHJoLmluIl0sInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJvZmZsaW5lX2FjY2VzcyIsImFkbWluIiwidW1hX2F1dGhvcml6YXRpb24iXX0sInJlc291cmNlX2FjY2VzcyI6eyJyZWFsbS1tYW5hZ2VtZW50Ijp7InJvbGVzIjpbIm1hbmFnZS11c2VycyIsInZpZXctdXNlcnMiLCJxdWVyeS1ncm91cHMiLCJxdWVyeS11c2VycyJdfSwiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiIiLCJuYW1lIjoiYWRtaW4gYWRtaW4iLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJhZG1pbiIsImdpdmVuX25hbWUiOiJhZG1pbiIsImZhbWlseV9uYW1lIjoiYWRtaW4iLCJlbWFpbCI6ImFkbWluQHN1bmJpcmQub3JnIn0.fh9Zj8htV_-ecMWF_5E2zNsZTZCITP509uJk7zSm6o-uqLRLXy6YupbNbyUZmAL_CkkmAawCtQcNA4GTyaacSA4mRBDfWrYeLfrguFbmgTMMuLOLGzfCfnTwDYhAoyZlyO8P8pnw9B8a0nKClqbqt1h2kpGYDmNV7fXltrE4f81IDXGGIbxuWrFhqmqT2xXi4gIf6Y6ANXFoU4jYaqRXw3hoYwCyYDFi57Dljzx_KWfCb4UxKqmVF1vlLokNVoYuhMNZSICEwJCBIS_PrY9sfoYZZK1Q04NWs1F6Hppqy85PhWn_EycaEeZ0OAByIvi2HagdT0Ris2sHVFntphQbkA BaseURL = https://uphrh.in/api +otp.userName = +otp.password = +otp.senderID = +otp.baseUrl = +keycloak_BaseURL = http://localhost:8001/api/v1 +adminToken.endPoint =http://localhost:8080/auth/realms/master/protocol/openid-connect/token +adminToken.clientSecret =2fbb157c-24f0-48cb-83d8-bc85eb4fb982 +adminToken.userName =admin +adminToken.password =Welcome@123 +keycloak.user.baseURL =http://localhost:8080/auth/admin/realms/example/users +registry.endpoint.save.userinfo =http://localhost:8001/api/v1/keycloak/persist/userCredential +sunbirdRC.keycloak.adminToken.endPoint =http://localhost:8080/auth/realms/sunbird-rc/protocol/openid-connect/token +sunbirdRC.keycloak.adminToken.userName =admin +sunbirdRC.keycloak.adminToken.clientID =admin-api +sunbirdRC.keycloak.adminToken.clientSecret =QF5op6Hb3Y9mY1rU0IycdjmD7j3Bvzkh +sunbirdRC.keycloak.adminToken.password =admin +registration_payment_Gateway_EndPoint =https://registration.uphrh.in/payment-response +affiliation_payment_Gateway_EndPoint =https://applicant.upsmfac.org/payment-response +exam_payment_Gateway_EndPoint =https://exam.uphrh.in/payment-response +exam_fee_status_update_EndPoint= +exam_service_auth_token= +spring.datasource.url=jdbc:postgresql://localhost:5432/frac_tool +spring.datasource.username=postgres +spring.datasource.password=password +spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect +spring.jpa.properties.hibernate.format_sql=true +spring.jpa.show-sql=false +spring.jpa.hibernate.ddl-auto=none + +otp.mail.endpoint = /api/v1/keycloak/mail/sendOTP +user.create.mail.endpoint =/api/v1/keycloak/mail/userCreate +user.login =/api/v1/login +aes_key_for_payment_success =XXXXXXXXXXXXXXXXX \ No newline at end of file diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml deleted file mode 100644 index 12645c3..0000000 --- a/src/main/resources/logback.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - %highlight(%date{ISO8601}) %highlight([%level]) %highlight([%10thread]) %colorize(%-40logger{36}) - %colorize(%msg%n) - - - - - ${LOGS}/upsmf-userManagement-logger.log - - %d %p %C{1.} [%t] %m%n - - - - - ${LOGS}/archived/upsmf-userManagement-logger-%d{yyyy-MM-dd}.%i.log - - - 10MB - - - - - - - - -