All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.codeheadsystems.featureflag.manager.impl.DdbFeatureLookupManager Maven / Gradle / Ivy

package org.codeheadsystems.featureflag.manager.impl;

import java.util.Map;
import java.util.Optional;
import org.codeheadsystems.featureflag.manager.FeatureLookupManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
import software.amazon.awssdk.services.dynamodb.model.AttributeValue;
import software.amazon.awssdk.services.dynamodb.model.DeleteItemRequest;
import software.amazon.awssdk.services.dynamodb.model.GetItemRequest;
import software.amazon.awssdk.services.dynamodb.model.PutItemRequest;

/**
 * The type Ddb feature lookup manager.
 */
public class DdbFeatureLookupManager implements FeatureLookupManager {

  private static final Logger LOGGER = LoggerFactory.getLogger(DdbFeatureLookupManager.class);

  private final DynamoDbConfiguration dbConfiguration;
  private final DynamoDbClient dbClient;

  /**
   * Instantiates a new Ddb feature lookup manager.
   *
   * @param dbConfiguration the db configuration
   * @param dbClient        the db client
   */
  public DdbFeatureLookupManager(final DynamoDbConfiguration dbConfiguration,
                                 final DynamoDbClient dbClient) {
    LOGGER.info("DdbFeatureLookupManager({}, {})", dbConfiguration, dbClient);
    this.dbConfiguration = dbConfiguration;
    this.dbClient = dbClient;
  }

  @Override
  public Optional lookupPercentage(final String featureId) {
    LOGGER.trace("lookupPercentage({})", featureId);
    final GetItemRequest request = GetItemRequest.builder()
        .key(getHashLookup(featureId))
        .attributesToGet(dbConfiguration.percentageColumn())
        .tableName(dbConfiguration.tableName())
        .build();
    final Map returnedItem = dbClient.getItem(request).item();
    if (returnedItem.containsKey(dbConfiguration.percentageColumn())) {
      return Optional.of(Double.parseDouble(returnedItem.get(dbConfiguration.percentageColumn()).n()));
    } else {
      return Optional.empty();
    }
  }

  @Override
  public boolean setPercentage(final String featureId, final double percentage) {
    LOGGER.trace("setPercentage({}, {})", featureId, percentage);
    final PutItemRequest request = PutItemRequest.builder()
        .item(Map.of(
            dbConfiguration.featureHashColumn(),
            AttributeValue.builder().s(featureId).build(),
            dbConfiguration.percentageColumn(),
            AttributeValue.builder().n(Double.toString(percentage)).build()))
        .tableName(dbConfiguration.tableName())
        .build();
    dbClient.putItem(request);
    return true;
  }

  @Override
  public void deletePercentage(final String featureId) {
    LOGGER.trace("deletePercentage({})", featureId);
    final DeleteItemRequest request = DeleteItemRequest.builder()
        .key(getHashLookup(featureId))
        .tableName(dbConfiguration.tableName())
        .build();
    dbClient.deleteItem(request);
  }

  private Map getHashLookup(final String featureId) {
    LOGGER.trace("getHashLookup({})", featureId);
    return Map.of(
        dbConfiguration.featureHashColumn(),
        AttributeValue.builder().s(featureId).build());
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy