Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/package.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ jobs:
uses: actions/setup-java@v2
with:
java-version: 17
distribution: 'zulu'
distribution: 'adopt'

- name: Build with Maven
run: mvn clean install -DENV_VAR=${{ env.ENV_VAR }}
Expand All @@ -35,7 +35,7 @@ jobs:
run: mvn -B package --file pom.xml

- name: Upload WAR file as artifact
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
with:
name: ECD-API
path: target/ecdapi.war
64 changes: 38 additions & 26 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -28,25 +28,21 @@
<org.mapstruct.version>1.2.0.Final</org.mapstruct.version>
</properties>
<dependencies>
<!--
https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-aop -->
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-aop -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
<version>3.2.2</version>
</dependency>

<dependency>
<groupId>co.elastic.logging</groupId>
<artifactId>logback-ecs-encoder</artifactId>
<version>1.3.2</version>
<dependency>
<groupId>co.elastic.logging</groupId>
<artifactId>logback-ecs-encoder</artifactId>
<version>1.3.2</version>
</dependency>

<!--<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
<version>3.2.2</version>
</dependency>-->
<!--<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId>
<version>3.2.2</version> </dependency> -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
Expand Down Expand Up @@ -101,8 +97,7 @@
<version>8.2.0</version>
</dependency>

<!--
https://mvnrepository.com/artifact/jakarta.persistence/jakarta.persistence-api -->
<!-- https://mvnrepository.com/artifact/jakarta.persistence/jakarta.persistence-api -->
<dependency>
<groupId>jakarta.persistence</groupId>
<artifactId>jakarta.persistence-api</artifactId>
Expand Down Expand Up @@ -169,15 +164,14 @@
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.5</version>
<!-- <exclusions>-->
<!-- <exclusion>-->
<!-- <groupId>org.apache.commons</groupId>-->
<!-- <artifactId>commons-compress</artifactId>-->
<!-- </exclusion>-->
<!-- </exclusions>-->
</dependency>
<!--
https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis -->
<!-- <exclusions> -->
<!-- <exclusion> -->
<!-- <groupId>org.apache.commons</groupId> -->
<!-- <artifactId>commons-compress</artifactId> -->
<!-- </exclusion> -->
<!-- </exclusions> -->
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
Expand Down Expand Up @@ -219,8 +213,7 @@
<artifactId>jackson-datatype-joda</artifactId>
<version>2.17.0</version>
</dependency>
<!--
https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
Expand All @@ -232,6 +225,26 @@
<artifactId>jackson-core</artifactId>
<version>2.17.0-rc1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt-api -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.12.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt-impl -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.12.6</version>
<scope>runtime</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt-jackson -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>0.12.6</version>
<scope>runtime</scope>
</dependency>
</dependencies>


Expand Down Expand Up @@ -315,8 +328,7 @@
${target-properties} and
${source-properties}
</echo>
<concat destfile="${target-properties}"
append="yes"
<concat destfile="${target-properties}" append="yes"
force="yes">
<fileset file="${source-properties}">
</fileset>
Expand Down
9 changes: 8 additions & 1 deletion src/main/environment/ecd_ci.properties
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,17 @@ secondary.datasource.driver-class-name=com.mysql.jdbc.Driver
registerBeneficiaryUrl=@env.COMMON_API@/beneficiary/create

##Beneficiary Edit Url

beneficiaryEditUrl =@env.COMMON_API_BASE_URL@/beneficiary/update
jwt.secret=@env.JWT_SECRET_KEY@

beneficiaryEditUrl =@env.COMMON_API@/beneficiary/update


#ELK logging file name
logging.file.name=@env.ECD_API_LOGGING_FILE_NAME@


springdoc.api-docs.enabled=false
springdoc.swagger-ui.enabled=false
springdoc.swagger-ui.enabled=false

6 changes: 5 additions & 1 deletion src/main/environment/ecd_dev.properties
Original file line number Diff line number Diff line change
Expand Up @@ -16,5 +16,9 @@ registerBeneficiaryUrl=<Enter your socket address here>/commonapi-v1.0/beneficia
##Beneficiary Edit Url
beneficiaryEditUrl =<Enter your socket address here>/commonapi-v1.0/beneficiary/update

jwt.secret=


springdoc.api-docs.enabled=true
springdoc.swagger-ui.enabled=true
springdoc.swagger-ui.enabled=true

6 changes: 5 additions & 1 deletion src/main/environment/ecd_test.properties
Original file line number Diff line number Diff line change
Expand Up @@ -16,5 +16,9 @@ registerBeneficiaryUrl=<Enter your socket address here>/commonapi-v1.0/beneficia
##Beneficiary Edit Url
beneficiaryEditUrl =<Enter your socket address here>/commonapi-v1.0/beneficiary/update

jwt.secret=


springdoc.api-docs.enabled=true
springdoc.swagger-ui.enabled=true
springdoc.swagger-ui.enabled=true

6 changes: 5 additions & 1 deletion src/main/environment/ecd_uat.properties
Original file line number Diff line number Diff line change
Expand Up @@ -16,5 +16,9 @@ registerBeneficiaryUrl=<Enter your socket address here>/commonapi-v1.0/beneficia
##Beneficiary Edit Url
beneficiaryEditUrl =<Enter your socket address here>/commonapi-v1.0/beneficiary/update

jwt.secret=


springdoc.api-docs.enabled=true
springdoc.swagger-ui.enabled=true
springdoc.swagger-ui.enabled=true

22 changes: 22 additions & 0 deletions src/main/java/com/iemr/ecd/EcdApiApplication.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,13 @@
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import com.iemr.ecd.dao.Users;

import io.swagger.v3.oas.annotations.OpenAPIDefinition;
import io.swagger.v3.oas.annotations.info.Contact;
Expand All @@ -37,4 +44,19 @@ public static void main(String[] args) {
SpringApplication.run(EcdApiApplication.class, args);
}

@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);

// Use StringRedisSerializer for keys (userId)
template.setKeySerializer(new StringRedisSerializer());

// Use Jackson2JsonRedisSerializer for values (Users objects)
Jackson2JsonRedisSerializer<Users> serializer = new Jackson2JsonRedisSerializer<>(Users.class);
template.setValueSerializer(serializer);

return template;
}
Comment thread
sandipkarmakar3 marked this conversation as resolved.

}
23 changes: 23 additions & 0 deletions src/main/java/com/iemr/ecd/config/RedisConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,19 @@
package com.iemr.ecd.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import com.iemr.ecd.dao.Users;

@Configuration
@EnableCaching
Comment thread
sandipkarmakar3 marked this conversation as resolved.
public class RedisConfig {

private @Value("${spring.redis.host}") String redisHost;
Expand All @@ -37,4 +45,19 @@ LettuceConnectionFactory lettuceConnectionFactory() {
return new LettuceConnectionFactory(redisHost, redisPort);
}

@Bean
public RedisTemplate<String, Users> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Users> template = new RedisTemplate<>();
template.setConnectionFactory(factory);

// Use StringRedisSerializer for keys (userId)
template.setKeySerializer(new StringRedisSerializer());

// Use Jackson2JsonRedisSerializer for values (Users objects)
Jackson2JsonRedisSerializer<Users> serializer = new Jackson2JsonRedisSerializer<>(Users.class);
template.setValueSerializer(serializer);
Comment thread
sandipkarmakar3 marked this conversation as resolved.

return template;
}
Comment thread
sandipkarmakar3 marked this conversation as resolved.

}
103 changes: 103 additions & 0 deletions src/main/java/com/iemr/ecd/dao/Users.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
package com.iemr.ecd.dao;

import java.io.Serializable;
import java.sql.Timestamp;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.google.gson.annotations.Expose;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import lombok.Data;

@Data
@Entity
@Table(name = "m_user")
Comment on lines +17 to +19

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

πŸ› οΈ Refactor suggestion

Add validation constraints

The entity lacks input validation annotations for critical fields.

Add appropriate validations:

 @Data
 @Entity
 @Table(name = "m_user")
+@EntityListeners(AuditingEntityListener.class)
 public class Users {

Example field validations:

+ @NotBlank(message = "Username is required")
+ @Size(min = 3, max = 50)
  private String userName;

+ @Email(message = "Invalid email format")
  private String emailID;

+ @Pattern(regexp = "^[0-9]{12}$", message = "Invalid Aadhaar format")
  private String aadhaarNo;

Committable suggestion skipped: line range outside the PR's diff.

@JsonIgnoreProperties(ignoreUnknown = true)
public class Users implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Expose
@Column(name = "UserID")
private Long userID;
@Expose
@Column(name = "TitleID") private Short titleID;
@Expose
@Column(name = "FirstName")
private String firstName;
@Expose
@Column(name = "MiddleName")
private String middleName;
@Expose
@Column(name = "lastName")
private String lastName;
@Expose
@Column(name = "GenderID")
private Short genderID;
@Expose
@Column(name = "MaritalStatusID")
private Short maritalStatusID;
@Expose
@Column(name = "AadhaarNo")
private String aadhaarNo;
@Expose
@Column(name = "PAN")
private String pan;
Comment on lines +45 to +49

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Critical: PII data protection required

Aadhaar and PAN are sensitive PII (Personally Identifiable Information) that require special handling:

  1. Should be encrypted at rest
  2. Should not be exposed in JSON responses
  3. Access should be logged

Recommendations:

  1. Implement field-level encryption
  2. Remove @expose annotations
  3. Add audit logging
  4. Consider implementing data masking

@Expose
@Column(name = "DOB")
private Timestamp dob;
@Expose
@Column(name = "DOJ")
private Timestamp doj;
@Expose
@Column(name = "QualificationID")
private Integer qualificationID;
@Expose
@Column(name = "UserName")
private String userName;
@Expose
@Column(name = "Password")
private String password;
Comment on lines +63 to +64

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Critical: Secure password handling required

The password field lacks proper security measures:

  1. No encryption/hashing annotations
  2. @expose annotation could leak passwords in JSON responses

Add password hashing and remove @expose:

- @Expose
  @Column(name = "Password")
  private String password;

Consider using:

  • Spring Security's password encoder
  • @JsonIgnore to prevent serialization

Committable suggestion skipped: line range outside the PR's diff.

@Expose
@Column(name = "AgentID")
private String agentID;
@Expose
@Column(name = "AgentPassword")
private String agentPassword;
@Expose
@Column(name = "EmailID")
private String emailID;
@Expose
@Column(name = "StatusID")
private Short statusID;
@Expose
@Column(name = "EmergencyContactPerson")
private String emergencyContactPerson;
@Expose
@Column(name = "EmergencyContactNo")
private String emergencyContactNo;
@Expose
@Column(name = "IsSupervisor")
private Boolean isSupervisor;
@Expose
@Column(name = "Deleted")
private Boolean deleted;
@Expose
@Column(name = "CreatedBy")
private String createdBy;
@Expose
@Column(name = "CreatedDate")
private Timestamp createdDate;
@Expose
@Column(name = "ModifiedBy")
private String modifiedBy;
@Expose
@Column(name = "LastModDate")
private Timestamp lastModDate;

}

16 changes: 16 additions & 0 deletions src/main/java/com/iemr/ecd/repository/ecd/UserLoginRepo.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.iemr.ecd.repository.ecd;

import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import com.iemr.ecd.dao.Users;

@Repository
public interface UserLoginRepo extends CrudRepository<Users, Long> {

@Query(" SELECT u FROM Users u WHERE u.userID = :userID AND u.deleted = false ")
public Users getUserByUserID(@Param("userID") Long userID);

}
Loading