use of io.vertx.ext.mongo.UpdateOptions 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.UpdateOptions 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.UpdateOptions in project okapi by folio-org.
the class MongoUtil method add.
public void add(T env, String id, Handler<ExtendedAsyncResult<Void>> fut) {
JsonObject jq = new JsonObject().put("_id", id);
String s = Json.encodePrettily(env);
JsonObject document = new JsonObject(s);
encode(document, id);
UpdateOptions options = new UpdateOptions().setUpsert(true);
cli.updateCollectionWithOptions(collection, jq, new JsonObject().put("$set", document), options, res -> {
if (res.succeeded()) {
fut.handle(new Success<>());
} else {
fut.handle(new Failure<>(INTERNAL, res.cause()));
}
});
}
use of io.vertx.ext.mongo.UpdateOptions in project hono by eclipse.
the class MongoDbBasedCredentialsDao method update.
/**
* {@inheritDoc}
*/
@Override
public Future<String> update(final CredentialsDto credentials, final Optional<String> resourceVersion, final SpanContext tracingContext) {
Objects.requireNonNull(credentials);
Objects.requireNonNull(resourceVersion);
final Span span = tracer.buildSpan("update Credentials").addReference(References.CHILD_OF, tracingContext).withTag(TracingHelper.TAG_TENANT_ID, credentials.getTenantId()).withTag(TracingHelper.TAG_DEVICE_ID, credentials.getDeviceId()).start();
resourceVersion.ifPresent(v -> TracingHelper.TAG_RESOURCE_VERSION.set(span, v));
credentials.getCredentials().stream().forEach(cred -> cred.encryptFields(fieldLevelEncryption));
final JsonObject replaceCredentialsQuery = MongoDbDocumentBuilder.builder().withVersion(resourceVersion).withTenantId(credentials.getTenantId()).withDeviceId(credentials.getDeviceId()).document();
final var document = JsonObject.mapFrom(credentials);
if (LOG.isTraceEnabled()) {
LOG.trace("updating credentials of device [tenant: {}, device-id: {}, resource-version; {}]:{}{}", credentials.getTenantId(), credentials.getDeviceId(), resourceVersion.orElse(null), System.lineSeparator(), document.encodePrettily());
}
return mongoClient.findOneAndReplaceWithOptions(collectionName, replaceCredentialsQuery, document, new FindOptions(), new UpdateOptions().setReturningNewDocument(true)).compose(result -> {
if (result == null) {
return MongoDbBasedDao.checkForVersionMismatchAndFail(String.format("credentials [tenant-id: %s, device-id: %s]", credentials.getTenantId(), credentials.getDeviceId()), resourceVersion, getByDeviceId(credentials.getTenantId(), credentials.getDeviceId()));
} else {
LOG.debug("successfully updated credentials for device [tenant: {}, device-id: {}]", credentials.getTenantId(), credentials.getDeviceId());
span.log("successfully updated credentials");
if (LOG.isTraceEnabled()) {
LOG.trace("new document in DB:{}{}", System.lineSeparator(), result.encodePrettily());
}
return Future.succeededFuture(result.getString(CredentialsDto.FIELD_VERSION));
}
}).recover(error -> {
if (MongoDbBasedDao.isDuplicateKeyError(error)) {
return Future.failedFuture(new ClientErrorException(credentials.getTenantId(), HttpURLConnection.HTTP_CONFLICT, "credentials (type, auth-id) must be unique for device"));
} else {
return Future.failedFuture(error);
}
}).onFailure(error -> {
LOG.debug("error updating credentials", error);
TracingHelper.logError(span, "error updating credentials", error);
}).recover(this::mapError).onComplete(r -> span.finish());
}
Aggregations