package org.jvalue.ods.db;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.google.inject.Inject;
import com.google.inject.assistedinject.Assisted;
import org.ektorp.CouchDbConnector;
import org.ektorp.DocumentNotFoundException;
import org.ektorp.support.CouchDbRepositorySupport;
import org.ektorp.support.View;
import org.jvalue.commons.couchdb.DbConnectorFactory;
import org.jvalue.commons.couchdb.DbDocument;
import org.jvalue.commons.couchdb.DbDocumentAdaptable;
import org.jvalue.commons.couchdb.RepositoryAdapter;
import org.jvalue.ods.api.notifications.Client;
import java.util.List;
public final class NotificationClientRepository extends RepositoryAdapter<
NotificationClientRepository.NotificationClientCouchDbRepository,
NotificationClientRepository.ClientDocument,
Client> {
private static final String DOCUMENT_ID = "doc.value.id != null && doc.value.type != null";
@Inject
NotificationClientRepository(DbConnectorFactory dbConnectorFactory, @Assisted String databaseName) {
super(new NotificationClientCouchDbRepository(dbConnectorFactory.createConnector(databaseName, true)));
}
@View( name = "all", map = "function(doc) { if (" + DOCUMENT_ID + ") emit(null, doc)}")
static class NotificationClientCouchDbRepository
extends CouchDbRepositorySupport<NotificationClientRepository.ClientDocument>
implements DbDocumentAdaptable<ClientDocument, Client> {
public NotificationClientCouchDbRepository(CouchDbConnector connector) {
super(ClientDocument.class, connector);
initStandardDesignDocument();
}
@View(name = "by_id", map = "function(doc) { if (" + DOCUMENT_ID + ") emit(doc.value.id, doc._id)}")
public ClientDocument findById(String clientId) {
List<ClientDocument> clients = queryView("by_id", clientId);
if (clients.isEmpty()) throw new DocumentNotFoundException(clientId);
if (clients.size() > 1) throw new IllegalStateException("found more than one client for id " + clientId);
return clients.get(0);
}
@Override
public ClientDocument createDbDocument(Client client) {
return new ClientDocument(client);
}
@Override
public String getIdForValue(Client client) {
return client.getId();
}
}
static final class ClientDocument extends DbDocument<Client> {
@JsonCreator
public ClientDocument(
@JsonProperty("value") Client client) {
super(client);
}
}
}