use of io.vertx.ext.mongo.FindOptions in project vertx-zero by silentbalanceyh.
the class MongoReadOpts method toFull.
/**
* Query all records by pager/sorter both
*
* @param pager
* @param sorter
* @return
*/
public static FindOptions toFull(final Pager pager, final Sorter sorter) {
final FindOptions options = new FindOptions();
Fn.safeNull(() -> {
options.setLimit(pager.getSize());
options.setSkip(pager.getStart());
}, pager);
Fn.safeNull(() -> options.setSort(sorter.toJson((mode) -> mode ? 1 : -1)), sorter);
return options;
}
use of io.vertx.ext.mongo.FindOptions in project hono by eclipse.
the class MongoDbBasedTenantDao method getBySubjectDn.
/**
* {@inheritDoc}
*/
@Override
public Future<TenantDto> getBySubjectDn(final X500Principal subjectDn, final SpanContext tracingContext) {
Objects.requireNonNull(subjectDn);
final String dn = subjectDn.getName(X500Principal.RFC2253);
final Span span = tracer.buildSpan("get Tenant by subject DN").addReference(References.CHILD_OF, tracingContext).withTag(TracingHelper.TAG_SUBJECT_DN, dn).start();
return mongoClient.findWithOptions(collectionName, MongoDbDocumentBuilder.builder().withCa(dn).document(), new FindOptions().setLimit(2)).map(matchingDocuments -> {
if (matchingDocuments.size() == 0) {
LOG.debug("could not find tenant with matching trust anchor [subject DN: {}]", dn);
throw new ClientErrorException(HttpURLConnection.HTTP_NOT_FOUND, "no such tenant");
} else if (matchingDocuments.size() == 1) {
final JsonObject tenantJsonResult = matchingDocuments.get(0);
return TenantDto.forRead(tenantJsonResult.getString(Constants.JSON_FIELD_TENANT_ID), tenantJsonResult.getJsonObject(TenantDto.FIELD_TENANT).mapTo(Tenant.class), tenantJsonResult.getInstant(TenantDto.FIELD_CREATED), tenantJsonResult.getInstant(TenantDto.FIELD_UPDATED_ON), tenantJsonResult.getString(TenantDto.FIELD_VERSION));
} else {
LOG.debug("found multiple tenants with matching trust anchor [subject DN: {}]", dn);
throw new ClientErrorException(HttpURLConnection.HTTP_NOT_FOUND, "found multiple tenants with matching trust anchor");
}
}).onFailure(t -> TracingHelper.logError(span, "error retrieving tenant", t)).recover(this::mapError).onComplete(r -> span.finish());
}
use of io.vertx.ext.mongo.FindOptions in project hono by eclipse.
the class MongoDbBasedTenantDao method update.
/**
* {@inheritDoc}
*/
@Override
public Future<String> update(final TenantDto newTenantConfig, final Optional<String> resourceVersion, final SpanContext tracingContext) {
Objects.requireNonNull(newTenantConfig);
Objects.requireNonNull(resourceVersion);
final Span span = tracer.buildSpan("update Tenant").addReference(References.CHILD_OF, tracingContext).withTag(TracingHelper.TAG_TENANT_ID, newTenantConfig.getTenantId()).start();
resourceVersion.ifPresent(v -> TracingHelper.TAG_RESOURCE_VERSION.set(span, v));
final JsonObject updateTenantQuery = MongoDbDocumentBuilder.builder().withVersion(resourceVersion).withTenantId(newTenantConfig.getTenantId()).document();
return validateTrustAnchors(newTenantConfig, span).compose(ok -> mongoClient.findOneAndReplaceWithOptions(collectionName, updateTenantQuery, JsonObject.mapFrom(newTenantConfig), new FindOptions(), new UpdateOptions().setReturningNewDocument(true))).compose(updateResult -> {
if (updateResult == null) {
return MongoDbBasedDao.checkForVersionMismatchAndFail(newTenantConfig.getTenantId(), resourceVersion, getById(newTenantConfig.getTenantId(), false, span));
} else {
LOG.debug("successfully updated tenant [tenant-id: {}]", newTenantConfig.getTenantId());
span.log("successfully updated tenant");
return Future.succeededFuture(updateResult.getString(TenantDto.FIELD_VERSION));
}
}).recover(error -> {
if (MongoDbBasedDao.isDuplicateKeyError(error)) {
LOG.debug("failed to update tenant [{}], tenant alias already in use", newTenantConfig.getTenantId(), error);
final var exception = new ClientErrorException(newTenantConfig.getTenantId(), HttpURLConnection.HTTP_CONFLICT, "tenant alias already in use");
TracingHelper.logError(span, exception);
return Future.failedFuture(exception);
} else {
TracingHelper.logError(span, "error updating tenant", error);
return mapError(error);
}
}).onComplete(r -> span.finish());
}
use of io.vertx.ext.mongo.FindOptions in project hono by eclipse.
the class MongoDbBasedDeviceDao method update.
/**
* {@inheritDoc}
*/
@Override
public Future<String> update(final DeviceDto deviceConfig, final Optional<String> resourceVersion, final SpanContext tracingContext) {
Objects.requireNonNull(deviceConfig);
Objects.requireNonNull(resourceVersion);
final Span span = tracer.buildSpan("update Device").addReference(References.CHILD_OF, tracingContext).withTag(TracingHelper.TAG_TENANT_ID, deviceConfig.getTenantId()).withTag(TracingHelper.TAG_DEVICE_ID, deviceConfig.getDeviceId()).start();
resourceVersion.ifPresent(v -> TracingHelper.TAG_RESOURCE_VERSION.set(span, v));
final JsonObject updateDeviceQuery = MongoDbDocumentBuilder.builder().withVersion(resourceVersion).withTenantId(deviceConfig.getTenantId()).withDeviceId(deviceConfig.getDeviceId()).document();
final var document = JsonObject.mapFrom(deviceConfig);
if (LOG.isTraceEnabled()) {
LOG.trace("replacing existing device document with:{}{}", System.lineSeparator(), document.encodePrettily());
}
return mongoClient.findOneAndReplaceWithOptions(collectionName, updateDeviceQuery, document, new FindOptions(), new UpdateOptions().setReturningNewDocument(true)).compose(result -> {
if (result == null) {
return MongoDbBasedDao.checkForVersionMismatchAndFail(deviceConfig.getDeviceId(), resourceVersion, getById(deviceConfig.getTenantId(), deviceConfig.getDeviceId(), span));
} else {
span.log("successfully updated device");
return Future.succeededFuture(result.getString(DeviceDto.FIELD_VERSION));
}
}).onFailure(t -> TracingHelper.logError(span, "error updating device", t)).recover(this::mapError).onComplete(r -> span.finish());
}
use of io.vertx.ext.mongo.FindOptions in project hono by eclipse.
the class MongoDbBasedDeviceDao method resolveGroupMembers.
/**
* {@inheritDoc}
*/
@Override
public Future<Set<String>> resolveGroupMembers(final String tenantId, final Set<String> viaGroups, final SpanContext tracingContext) {
Objects.requireNonNull(tenantId);
Objects.requireNonNull(viaGroups);
if (viaGroups.isEmpty()) {
return Future.succeededFuture(Set.of());
}
final Span span = tracer.buildSpan("resolve group members").addReference(References.CHILD_OF, tracingContext).withTag(TracingHelper.TAG_TENANT_ID, tenantId).start();
span.log("resolving " + viaGroups.size() + " device groups");
final var deviceMemberOfSpec = new JsonObject().put("$exists", true).put("$in", new JsonArray(List.copyOf(viaGroups)));
final JsonObject resolveGroupMembersQuery = MongoDbDocumentBuilder.builder().withTenantId(tenantId).document().put(PROPERTY_DEVICE_MEMBER_OF, deviceMemberOfSpec);
// retrieve only the deviceId instead of the whole document.
final FindOptions findOptions = new FindOptions().setFields(new JsonObject().put(RegistrationConstants.FIELD_PAYLOAD_DEVICE_ID, true).put("_id", false));
return mongoClient.findWithOptions(collectionName, resolveGroupMembersQuery, findOptions).map(documents -> {
if (documents == null) {
final Set<String> result = Set.of();
return result;
} else {
span.log("successfully resolved " + documents.size() + " group members");
return documents.stream().map(json -> json.getString(RegistrationConstants.FIELD_PAYLOAD_DEVICE_ID)).collect(Collectors.toSet());
}
}).onComplete(r -> span.finish());
}
Aggregations