package de.anycook.db.drafts.dynamo; import com.amazonaws.auth.AWSCredentials; import com.amazonaws.auth.BasicAWSCredentials; import com.amazonaws.regions.Region; import com.amazonaws.regions.Regions; import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient; import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper; import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapperConfig; import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBQueryExpression; import com.amazonaws.services.dynamodbv2.model.ResourceNotFoundException; import de.anycook.conf.Configuration; import de.anycook.db.drafts.RecipeDraftsStore; import de.anycook.drafts.RecipeDraft; import de.anycook.newrecipe.DraftNumberProvider; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import java.io.IOException; import java.sql.SQLException; import java.util.List; /** * @author Jan Graßegger<jan@anycook.de> */ public class DynamoDBRecipeDraftsStore implements RecipeDraftsStore { private final DynamoDBMapper mapper; private final Logger logger; public DynamoDBRecipeDraftsStore() { this.logger = LogManager.getLogger(getClass()); AWSCredentials credentials = new BasicAWSCredentials(Configuration.getInstance().getDynamoDbAccessKey(), Configuration.getInstance().getDynamoDbAccessSecret()); AmazonDynamoDBClient dynamoDBClient = new AmazonDynamoDBClient(credentials); dynamoDBClient.setRegion(Region.getRegion(Regions.EU_WEST_1)); this.mapper = new DynamoDBMapper(dynamoDBClient, new DynamoDBMapperConfig( DynamoDBMapperConfig.SaveBehavior.UPDATE_SKIP_NULL_ATTRIBUTES)); } @Override public List<RecipeDraft> getDrafts(int userId) throws IOException { RecipeDraft recipeDraft = new RecipeDraft(); recipeDraft.setUserId(userId); DynamoDBQueryExpression<RecipeDraft> queryExpression = new DynamoDBQueryExpression<>(); queryExpression.withHashKeyValues(recipeDraft); return mapper.query(RecipeDraft.class, queryExpression); } @Override public RecipeDraft getDraft(String id, int userId) throws DraftNotFoundException { RecipeDraft recipeDraft = new RecipeDraft(); recipeDraft.setId(id); recipeDraft.setUserId(userId); try { return mapper.load(RecipeDraft.class, userId, id); } catch (ResourceNotFoundException e) { logger.warn(e, e); throw new DraftNotFoundException(id, userId); } } @Override public int countDrafts(int userId) throws IOException { RecipeDraft recipeDraft = new RecipeDraft(); recipeDraft.setUserId(userId); DynamoDBQueryExpression<RecipeDraft> queryExpression = new DynamoDBQueryExpression<>(); queryExpression.withHashKeyValues(recipeDraft); return mapper.count(RecipeDraft.class, queryExpression); } @Override public String newDraft(int userId) throws SQLException { String newKey = Long.toString(System.currentTimeMillis()); RecipeDraft recipeDraft = new RecipeDraft(); recipeDraft.setId(newKey); recipeDraft.setUserId(userId); recipeDraft.setTimestamp(System.currentTimeMillis()); updateDraft(newKey, recipeDraft); DraftNumberProvider.INSTANCE.wakeUpSuspended(userId); return newKey; } @Override public void updateDraft(String id, RecipeDraft recipeDraft) { recipeDraft.setId(id); mapper.save(recipeDraft); } @Override public void deleteDraft(String id, int userId) throws SQLException { RecipeDraft recipeDraft = new RecipeDraft(); recipeDraft.setId(id); recipeDraft.setUserId(userId); mapper.delete(recipeDraft); DraftNumberProvider.INSTANCE.wakeUpSuspended(userId); } @Override public void close() throws Exception { //nothing to do } }