package org.atlasapi.persistence.content.mongo;
import static com.google.common.base.Preconditions.checkNotNull;
import java.util.List;
import org.atlasapi.media.entity.ChildRef;
import org.atlasapi.media.entity.Organisation;
import org.atlasapi.media.entity.Person;
import org.atlasapi.persistence.lookup.entry.LookupEntry;
import org.atlasapi.persistence.lookup.entry.LookupEntryStore;
import org.atlasapi.persistence.media.entity.ContentTranslator;
import org.atlasapi.persistence.media.entity.CrewMemberTranslator;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Iterables;
import com.metabroadcast.common.persistence.mongo.DatabasedMongo;
import com.metabroadcast.common.persistence.mongo.MongoConstants;
import com.mongodb.BasicDBObject;
import com.mongodb.DBCollection;
public class ItemCrewRefUpdater {
private static final String PERSON_URI_KEY =
ContentTranslator.PEOPLE+"."+CrewMemberTranslator.PERSON_URI;
private static final String PERSON_ID_UPDATE_KEY =
ContentTranslator.PEOPLE+".$."+CrewMemberTranslator.PERSON_ID;
private final MongoContentTables tables;
private final LookupEntryStore entryStore;
public ItemCrewRefUpdater(DatabasedMongo db, LookupEntryStore entryStore) {
this.entryStore = entryStore;
this.tables = new MongoContentTables(checkNotNull(db));
}
public void updateCrewRefInItems(Person person) {
if (person.getCanonicalUri() == null || person.getId() == null) {
return;
}
for (ChildRef content : person.getContents()) {
setRefInContent(person.getCanonicalUri(), person.getId(), content);
}
}
public void updateCrewRefInItems(Organisation organisation) {
if (organisation.getCanonicalUri() == null || organisation.getId() == null) {
return;
}
for (ChildRef content : organisation.getContents()) {
setRefInContent(organisation.getCanonicalUri(), organisation.getId(), content);
}
}
private void setRefInContent(String personUri, Long personId, ChildRef content) {
DBCollection coll = collectionFor(content);
if (coll == null) {
return;
}
coll.update(
new BasicDBObject(ImmutableMap.of(
MongoConstants.ID, content.getUri(),
PERSON_URI_KEY, personUri
)),
new BasicDBObject(
MongoConstants.SET,
new BasicDBObject(PERSON_ID_UPDATE_KEY, personId)
),
MongoConstants.NO_UPSERT,
MongoConstants.SINGLE
);
}
private DBCollection collectionFor(ChildRef content) {
List<String> uris = ImmutableList.of(content.getUri());
Iterable<LookupEntry> entries = entryStore.entriesForCanonicalUris(uris);
LookupEntry entry = Iterables.getOnlyElement(entries, null);
if (entry != null) {
return tables.collectionFor(entry.lookupRef().category());
}
return null;
}
}