Skip to content
Open
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
91 changes: 91 additions & 0 deletions health-services/individual/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -60,4 +60,95 @@ g) POST `/individual/v1/_search` - Search Individual, This API is internally cal
## Usage
- Start the service
- Access the API endpoints for searching `individual`
- Pass list parameters for the search fields mentioned in updates


# Household

### Household Service
Household registry is a Health Campaign Service that facilitates maintenance of a household registry. The functionality is exposed via REST API.

### DB UML Diagram

<img width="607" alt="Screenshot 2023-03-29 at 2 37 44 PM" src="https://user-images.githubusercontent.com/123379163/228484993-30fb0910-0f53-47b7-b373-5e8ced21c7c7.png">

### Service Dependencies
- Idgen Service
<<<<<<< Updated upstream

[//]: # (- confirm it)
=======
-
[//]: # (- confirm *
>>>>>>> Stashed changes

### Swagger API Contract
Link to the swagger API contract yaml and editor link like below

https://editor.swagger.io/?url=https://raw.githubusercontent.com/egovernments/health-campaign-services/v1.0.0/docs/health-api-specs/contracts/registries/household.yml

### Service Details

#### API Details
BasePath `/Household`

Household service APIs - contains create, update, delete and search end point

* POST `/member/v1/_create` - Create Household member, This API is used to create/add a new Household member.

* POST `/member/v1/bulk/_create` - Create bulk Household member, This API is used to create/add new household member in bulk.

* POST `/member/v1/_update` - Update Household member, This API is used to update the details of a existing Household member.

* POST `/member/v1/bulk/_update` - Update bulk Household member, This API is used to update the details of existing household member in bulk.

* POST `/member/v1/_delete` - Delete Household member, This API is used to soft delete details of an existing Household member.

* POST `/member/v1/bulk/_delete` - Delete bulk Household member, This API is used to soft delete details of an existing Household member in bulk.

* POST `/member/v1/_search` - Search Household member, This API is used to search existing Household member.

* POST `/v1/_create` - Create Household, This API is used to create/add a new Household.

* POST `/v1/bulk/_create` - Create bulk Household, This API is used to create/add new household in bulk.

* POST `/v1/_update` - Update Household, This API is used to update the details of a existing Household.

* POST `/v1/bulk/_update` - Update bulk Household, This API is used to update the details of existing household in bulk.

* POST `/v1/_delete` - Delete Household, This API is used to soft delete details of an existing Household.

* POST `/v1/bulk/_delete` - Delete bulk Household, This API is used to soft delete details of an existing Household in bulk.

* POST `/v1/_search` - Search Household, This API is used to search existing Household.


### Kafka Consumers

- create-household-bulk-topic
- update-household-bulk-topic
- delete-household-bulk-topic
- household-member-consumer-bulk-create-topic
- household-member-consumer-bulk-update-topic
- household-member-consumer-bulk-delete-topic

### Kafka Producers

- save-household-topic
- update-household-topic
- delete-household-topic
- save-household-member-topic
- update-household-member-topic
- delete-household-member-topic

## Pre commit script

[commit-msg](https://gist.github.com/jayantp-egov/14f55deb344f1648503c6be7e580fa12)

## Updates
- Household Member Search
- `householdId`, `householdClientReferenceId`, `individualId`, and `individualClientReferenceId` now accepts a list of entities instead of single entity to search household member
## Usage
- Start the service
- Access the API endpoints for searching `household member`
- Pass list parameters for the search fields mentioned in updates
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,35 @@ public interface Constants {
String INVALID_BENEFICIARY_ID = "INVALID_BENEFICIARY_ID";
String INVALID_USER_ID = "INVALID_USER_ID";
String BENEFICIARY_ID_ALREADY_ASSIGNED = "BENEFICIARY_ID_ALREADY_ASSIGNED";

// Household and household member related constants
String GET_CLIENT_REFERENCE_ID = "getClientReferenceId";
String ID_FIELD = "id";
String CLIENT_REFERENCE_ID_FIELD = "clientReferenceId";
String GET_HOUSEHOLD_CLIENT_REFERENCE_ID = "getHouseholdClientReferenceId";
String HOUSEHOLD_ID_FIELD = "householdId";
String HOUSEHOLD_CLIENT_REFERENCE_ID_FIELD = "householdClientReferenceId";
String GET_INDIVIDUAL_ID = "getIndividualId";
String GET_INDIVIDUAL_CLIENT_REFERENCE_ID = "getIndividualClientReferenceId";
String GET_HOUSEHOLD_MEMBERS = "getHouseholdMembers";
String SET_HOUSEHOLD_MEMBERS = "setHouseholdMembers";
String INVALID_HOUSEHOLD = "INVALID_HOUSEHOLD";
String INVALID_HOUSEHOLD_MESSAGE = "invalid household id";
String INVALID_HOUSEHOLD_TYPE_MESSAGE = "invalid household type";
String INTERNAL_SERVER_ERROR = "INTERNAL_SERVER_ERROR";
String INDIVIDUAL_ALREADY_MEMBER_OF_HOUSEHOLD = "INDIVIDUAL_ALREADY_MEMBER_OF_HOUSEHOLD";
String INDIVIDUAL_ALREADY_MEMBER_OF_HOUSEHOLD_MESSAGE = "individual is already member of household";
String INDIVIDUAL_NOT_FOUND = "INDIVIDUAL_NOT_FOUND";
String HOUSEHOLD_ALREADY_HAS_HEAD = "HOUSEHOLD_ALREADY_HAS_HEAD";
String HOUSEHOLD_ALREADY_HAS_HEAD_MESSAGE = "household already has head";
String INDIVIDUAL_NOT_FOUND_MESSAGE = "individual id is not found";
String GET_HOUSEHOLDS = "getHouseholds";
String SET_HOUSEHOLDS = "setHouseholds";
String INDIVIDUAL_CANNOT_BE_NULL = "INDIVIDUAL_CANNOT_BE_NULL";
String INDIVIDUAL_CANNOT_BE_NULL_MESSAGE = "individual id and individual client reference id both cannot be null";
String INVALID_HOUSEHOLD_MEMBER_RELATIONSHIP = "INVALID_HOUSEHOLD_MEMBER_RELATIONSHIP";
String INVALID_HOUSEHOLD_MEMBER_RELATIONSHIP_MESSAGE = "household member relationship type is not valid";
String HOUSEHOLD_MEMBER_RELATIONSHIP_CONFIG_NOT_FOUND_MESSAGE = "MDMS config HCM.HOUSEHOLD_MEMBER_RELATIONSHIP_TYPES for household member is not found";
String HOUSEHOLD_MEMBER_RELATIONSHIP_NOT_ALLOWED_MESSAGE = "household member relationship is not allowed";
String TENANT_ID_EXCEPTION = "TENANT_ID_EXCEPTION";
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
package org.egov.individual;

import org.egov.common.utils.MultiStateInstanceUtil;
import org.egov.tracer.config.TracerConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Import;

@Import({ TracerConfiguration.class })
@Import({ TracerConfiguration.class, MultiStateInstanceUtil.class })
@SpringBootApplication
@EnableCaching
public class IndividualApplication {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -90,4 +90,49 @@ public class IndividualProperties {
@Value("${individual.beneficiary.id.validation.enabled:false}")
private Boolean beneficiaryIdValidationEnabled;

@Value("${household.member.kafka.create.topic}")
private String createHouseholdMemberTopic;

@Value("${household.member.kafka.update.topic}")
private String updateHouseholdMemberTopic;

@Value("${household.member.kafka.delete.topic}")
private String deleteHouseholdMemberTopic;

@Value("${household.member.consumer.bulk.create.topic}")
private String createHouseholdMemberBulkTopic;

@Value("${household.member.consumer.bulk.update.topic}")
private String updateHouseholdMemberBulkTopic;

@Value("${household.member.consumer.bulk.delete.topic}")
private String deleteHouseholdMemberBulkTopic;

@Value("${household.kafka.create.topic}")
private String createHouseholdTopic;

@Value("${household.consumer.bulk.create.topic}")
private String createHouseholdBulkTopic;

@Value("${household.kafka.update.topic}")
private String updateHouseholdTopic;

@Value("${household.consumer.bulk.update.topic}")
private String updateHouseholdBulkTopic;

@Value("${household.kafka.delete.topic}")
private String deleteHouseholdTopic;

@Value("${household.consumer.bulk.delete.topic}")
private String deleteHouseholdBulkTopic;

@Value("${household.idgen.id.format}")
private String householdIdFormat;

@Value("${household.type.same.validation}")
private boolean householdTypeSameValidation;

@Value("${household.type.community.creator.role}")
private String communityHouseholdCreatorRoleCode;

}
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,11 @@
import jakarta.annotation.PostConstruct;
import java.util.TimeZone;

@Import({TracerConfiguration.class})
@Configuration
@ComponentScan(basePackages = {"org.egov.individual", "org.egov.encryption", "org.egov.common"},
excludeFilters = @ComponentScan.Filter(type = FilterType.REGEX, pattern = {".*\\.Producer.*"}))
public class MainConfiguration {
@Import({TracerConfiguration.class})
@Configuration
@ComponentScan(basePackages = {"org.egov.individual", "org.egov.encryption", "org.egov.common"},
excludeFilters = @ComponentScan.Filter(type = FilterType.REGEX, pattern = {".*\\.Producer.*"}))
public class MainConfiguration {

@Value("${app.timezone}")
private String timeZone;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
package org.egov.individual.consumer;

import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.egov.common.models.household.Household;
import org.egov.common.models.household.HouseholdBulkRequest;
import org.egov.individual.service.HouseholdService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.kafka.support.KafkaHeaders;
import org.springframework.messaging.handler.annotation.Header;
import org.springframework.stereotype.Component;

import java.util.Collections;
import java.util.List;
import java.util.Map;

@Component
@Slf4j
public class HouseholdConsumer {

private final HouseholdService householdService;

private final ObjectMapper objectMapper;

@Autowired
public HouseholdConsumer(HouseholdService householdService,
@Qualifier("objectMapper") ObjectMapper objectMapper) {
this.householdService = householdService;
this.objectMapper = objectMapper;
}

@KafkaListener(topics = "${household.consumer.bulk.create.topic}")
public List<Household> bulkCreate(Map<String, Object> consumerRecord,
@Header(KafkaHeaders.RECEIVED_TOPIC) String topic) {
try {
HouseholdBulkRequest request = objectMapper.convertValue(consumerRecord, HouseholdBulkRequest.class);
return householdService.create(request, true);
} catch (Exception exception) {
log.error("error in household consumer bulk create: {}", ExceptionUtils.getStackTrace(exception));
return Collections.emptyList();
}
}

@KafkaListener(topics = "${household.consumer.bulk.update.topic}")
public List<Household> bulkUpdate(Map<String, Object> consumerRecord,
@Header(KafkaHeaders.RECEIVED_TOPIC) String topic) {
try {
HouseholdBulkRequest request = objectMapper.convertValue(consumerRecord, HouseholdBulkRequest.class);
return householdService.update(request, true);
} catch (Exception exception) {
log.error("error in household consumer bulk update: {}", ExceptionUtils.getStackTrace(exception));
return Collections.emptyList();
}
}

@KafkaListener(topics = "${household.consumer.bulk.delete.topic}")
public List<Household> bulkDelete(Map<String, Object> consumerRecord,
@Header(KafkaHeaders.RECEIVED_TOPIC) String topic) {
try {
HouseholdBulkRequest request = objectMapper.convertValue(consumerRecord, HouseholdBulkRequest.class);
return householdService.delete(request, true);
} catch (Exception exception) {
log.error("error in household consumer bulk delete: {}", ExceptionUtils.getStackTrace(exception));
return Collections.emptyList();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
package org.egov.individual.consumer;

import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.egov.common.models.household.HouseholdMember;
import org.egov.common.models.household.HouseholdMemberBulkRequest;
import org.egov.individual.service.HouseholdMemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.kafka.support.KafkaHeaders;
import org.springframework.messaging.handler.annotation.Header;
import org.springframework.stereotype.Component;

import java.util.Collections;
import java.util.List;
import java.util.Map;

@Slf4j
@Component
public class HouseholdMemberConsumer {

private final HouseholdMemberService householdMemberService;

private final ObjectMapper objectMapper;

@Autowired
public HouseholdMemberConsumer(HouseholdMemberService householdMemberService,
@Qualifier("objectMapper") ObjectMapper objectMapper) {
this.householdMemberService = householdMemberService;
this.objectMapper = objectMapper;
}

@KafkaListener(topics = "${household.member.consumer.bulk.create.topic}")
public List<HouseholdMember> bulkCreate(Map<String, Object> consumerRecord,
@Header(KafkaHeaders.RECEIVED_TOPIC) String topic) {
try {
HouseholdMemberBulkRequest request = objectMapper.convertValue(consumerRecord, HouseholdMemberBulkRequest.class);
return householdMemberService.create(request, true);
} catch (Exception exception) {
log.error("error in household member consumer bulk create: {}", ExceptionUtils.getStackTrace(exception));
return Collections.emptyList();
}
}

@KafkaListener(topics = "${household.member.consumer.bulk.update.topic}")
public List<HouseholdMember> bulkUpdate(Map<String, Object> consumerRecord,
@Header(KafkaHeaders.RECEIVED_TOPIC) String topic) {
try {
HouseholdMemberBulkRequest request = objectMapper.convertValue(consumerRecord, HouseholdMemberBulkRequest.class);
return householdMemberService.update(request, true);
} catch (Exception exception) {
log.error("error in household member consumer bulk update: {}", ExceptionUtils.getStackTrace(exception));
return Collections.emptyList();
}
}

@KafkaListener(topics = "${household.member.consumer.bulk.delete.topic}")
public List<HouseholdMember> bulkDelete(Map<String, Object> consumerRecord,
@Header(KafkaHeaders.RECEIVED_TOPIC) String topic) {
try {
HouseholdMemberBulkRequest request = objectMapper.convertValue(consumerRecord, HouseholdMemberBulkRequest.class);
return householdMemberService.delete(request, true);
} catch (Exception exception) {
log.error("error in household member consumer bulk delete: {}", ExceptionUtils.getStackTrace(exception));
return Collections.emptyList();
}
}
}

This file was deleted.

Loading
Loading