package org.atlasapi.persistence.content.mongo;
import org.atlasapi.persistence.audit.PersistenceAuditLog;
import org.atlasapi.persistence.content.ContentCategory;
import org.atlasapi.persistence.media.entity.IdentifiedTranslator;
import com.metabroadcast.common.persistence.mongo.DatabasedMongo;
import com.metabroadcast.common.time.Clock;
import com.mongodb.DBCollection;
import org.atlasapi.media.entity.ContentGroup;
import org.atlasapi.persistence.content.ContentGroupWriter;
import org.atlasapi.persistence.ids.MongoSequentialIdGenerator;
import org.atlasapi.persistence.media.entity.ContentGroupTranslator;
import static com.google.common.base.Preconditions.checkNotNull;
import static com.metabroadcast.common.persistence.mongo.MongoBuilders.where;
public class MongoContentGroupWriter implements ContentGroupWriter {
private final Clock clock;
private final ContentGroupTranslator contentGroupTranslator;
private final MongoSequentialIdGenerator idGenerator;
private final DBCollection contentGroups;
private final PersistenceAuditLog persistenceAuditLog;
public MongoContentGroupWriter(DatabasedMongo mongo,
PersistenceAuditLog persistenceAuditLog, Clock clock) {
MongoContentTables contentTables = new MongoContentTables(mongo);
this.clock = clock;
this.contentGroups = contentTables.collectionFor(ContentCategory.CONTENT_GROUP);
this.contentGroupTranslator = new ContentGroupTranslator();
this.persistenceAuditLog = persistenceAuditLog;
this.idGenerator = new MongoSequentialIdGenerator(mongo, ContentCategory.CONTENT_GROUP.tableName());
}
@Override
public void createOrUpdate(ContentGroup contentGroup) {
checkNotNull(contentGroup, "Tried to persist null content group");
contentGroup.setLastFetched(clock.now());
if (!contentGroup.hashChanged(contentGroupTranslator.hashCodeOf(contentGroup))) {
persistenceAuditLog.logNoWrite(contentGroup);
return;
} else {
ensureId(contentGroup);
contentGroup.setThisOrChildLastUpdated(clock.now());
persistenceAuditLog.logWrite(contentGroup);
contentGroups.save(contentGroupTranslator.toDBObject(null, contentGroup));
}
}
private void ensureId(ContentGroup contentGroup) {
boolean noId = contentGroup.getId() == null;
boolean noStoredId = contentGroup.getId() != null && contentGroups.count(where().fieldEquals(IdentifiedTranslator.ID, contentGroup.getId()).build()) == 0;
if (noId || noStoredId) {
contentGroup.setId(idGenerator.generateRaw());
}
}
}