Spring Boot Java Session API

This sample illustrates setting up an API endpoint using Spring Boot to call the Amberflo Session API and return the session token using the JAVA SDK. This session token can be used for all Customer Usage and Billing Portal apps.

Steps:

  1. Setup Amberflo environment
  2. Setup configuration for service discovery of Amberflo Customer Usage and Billing Portal Session client
  3. Create API Endpoint and controller to return Session ID.

Maven dependencies (check for latest versions):

<dependencies>
  <dependency>
    <groupId>io.amberflo</groupId>
    <artifactId>metering-java-client</artifactId>
    <version>2.3.0</version>
  </dependency>
  <dependency>
		<groupId>org.projectlombok</groupId>
		<artifactId>lombok</artifactId>
		<version>1.18.20</version>
	</dependency>
</dependencies>

Setup the environment to configure Amberflo client settings

  1. Setup the environment to configure the Amberflo SDK client settings
  2. Add following entries to the application.properties file
  3. Setup an environment for service discoverable.
amberflo.apiKey=your-api-key-here
amberflo.region=US_West
amberflo.domain=Prod
amberflo.ingestion.frequency.seconds=1
amberflo.ingestion.batch.size=10
amberflo.isDebug=true
PropertyDescriptionOptions
apiKeyAmberflo API key
regionThe region of where the ingestion client is runningUS_West
domainThe domain can be Prod or DevProd, Dev
ingestion.frequency.secondsFrequency at which queued data will be sent to API.1
ingestion.batch.sizeNumber of messages posted to the API.
amberflo.isDebugLog debug info for ingestion code calling the SDK
import com.amberflo.metering.ingest.meter_message.Domain;
import lombok.Getter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import com.amberflo.metering.ingest.meter_message.Region;

@Getter
@Component
public class AmberfloEnvironment {

    @Value("${amberflo.apiKey}")
    private String apiKey;

    @Value("${amberflo.region}")
    private Region region;

    @Value("${amberflo.domain}")
    private Domain domain;

    @Value("${amberflo.ingestion.frequency.seconds}")
    private Double ingestionFrequencyInSeconds;

    @Value("${amberflo.ingestion.batch.size}")
    private Integer ingestionBatchSize;
}

Setup Amberflo client bean for service discoverability

Make the Customer Usage and Billing Portal Session client be a discoverable service that can be injected as a dependency by Spring Boot configuration. This will return the client instance as a bean.

import com.amberflo.metering.customerportal.clients.CustomerPortalSessionClient;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AmberfloClientConfig {

    @Autowired
    private AmberfloEnvironment amberfloEnvironment;
  
    @Bean
    public CustomerPortalSessionClient customerPortalSessionClient(){
        LOGGER.info("Amberflo client CustomerPortalSessionClient initialized");
        return new CustomerPortalSessionClient(this.amberfloEnvironment.getApiKey());
    }
}

API Endpoint to return session token

In most instances, the user or customer ID is passed in a request header. Set IDENTITY_HEADER to this header.

This is a sample REST controller which returns the session token from Amberflo. This session token can be used for any of the Customer Usage and Billing Portal apps.

The endpoint will be https://yourappdomain/amberflo/session

API Reference https://amberflo.readme.io/reference/post_session

import com.amberflo.metering.customerportal.clients.CustomerPortalSessionClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import com.amberflo.metering.customerportal.model.CustomerPortalSessionRequest;
import com.amberflo.metering.customerportal.model.CustomerPortalSessionResponse;

@RestController
@RequestMapping("/amberflo")
public class AmberfloController {
  
  	//TODO: add the identity header
  	private final static String IDENTITY_HEADER = "";
  
    @Autowired
    private CustomerPortalSessionClient customerPortalSessionClient;

    @PostMapping("/session")
    public ResponseEntity getConnectedApps(@RequestAttribute(IDENTITY_HEADER) String customerId){
        final CustomerPortalSessionRequest customerPortalSessionRequest = new CustomerPortalSessionRequest(customerId);
        final CustomerPortalSessionResponse result = this.customerPortalSessionClient.getSession(customerPortalSessionRequest);
        return ResponseEntity.ok(result.getSessionToken());
    }
}