package service;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBQueryExpression;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBScanExpression;
import com.amazonaws.services.dynamodbv2.model.*;
import models.dynamo.Photo;
import models.dynamo.Tag;
import play.Logger;
import play.Play;
import java.text.SimpleDateFormat;
import java.util.*;
/**
* Service class to ease interaction with DynamoDB
* Singleton
* User: pvillega
*/
public enum DynamoDbService {
INSTANCE;
// Load AWS keys from configuration
private String accessKey = Play.application().configuration().getString("aws.accessKey");
private String secretKey = Play.application().configuration().getString("aws.secretKey");
private String endpoint = Play.application().configuration().getString("aws.endpoint");
// Set up connection to Dynamo DB
private AWSCredentials awsCredentials;
private AmazonDynamoDB dynamo;
private DynamoDBMapper mapper;
DynamoDbService() {
awsCredentials = new BasicAWSCredentials(accessKey, secretKey);
dynamo = new AmazonDynamoDBClient(awsCredentials);
dynamo.setEndpoint(endpoint);
mapper = new DynamoDBMapper(dynamo);
}
public List<Tag> getAllTags() {
final DynamoDBScanExpression scanExpression = new DynamoDBScanExpression();
final List<Tag> tags = mapper.scan(Tag.class, scanExpression);
return tags;
}
public void saveTags(List<Tag> tags) {
mapper.batchSave(tags);
}
public List<Photo> getAllPhotos() {
final DynamoDBScanExpression scanExpression = new DynamoDBScanExpression();
final List<Photo> photos = mapper.scan(Photo.class, scanExpression);
return photos;
}
public void savePhotos(List<Photo> photos) {
mapper.batchSave(photos);
}
public List<Photo> getPhotosForTag(String tagId) {
Photo phKey = new Photo();
phKey.setIdTag(tagId);
long yesterdayMilli = (new Date()).getTime() - (24L*60L*60L*1000L);
long yesterdayMicro = yesterdayMilli * 1000L;
final Condition rangeKeyCondition = new Condition()
.withComparisonOperator(ComparisonOperator.GT.toString())
.withAttributeValueList(new AttributeValue().withS( String.valueOf(yesterdayMicro) ));
final DynamoDBQueryExpression<Photo> queryExpression = new DynamoDBQueryExpression<Photo>()
.withHashKeyValues(phKey)
.withRangeKeyCondition("dateStored", rangeKeyCondition);
List<Photo> taggedPhotos = mapper.query(Photo.class, queryExpression);
return taggedPhotos;
}
}