Skip to content
Snippets Groups Projects
Commit 30e33f70 authored by OZGCloud's avatar OZGCloud
Browse files

OZG-6523 set createdResource when updating status

parent 1e0c92fe
No related branches found
No related tags found
No related merge requests found
......@@ -36,11 +36,13 @@ import java.util.stream.Stream;
import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.FindAndModifyOptions;
import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.aggregation.ComparisonOperators.Eq;
import org.springframework.data.mongodb.core.aggregation.ConditionalOperators;
import org.springframework.data.mongodb.core.aggregation.ConditionalOperators.Switch;
import org.springframework.data.mongodb.core.aggregation.ConditionalOperators.Switch.CaseOperator;
import org.springframework.data.mongodb.core.aggregation.SetOperation;
......@@ -261,17 +263,30 @@ class CommandRepository {
return query;
}
public Command setRevokeStatus(String id) {
return mongoOperations.findAndModify(queryById(id), buildUpdateStatusRevoke(), FindAndModifyOptions.options().returnNew(true), Command.class);
public Command setRevokeStatusWithResource(String id, String createdResource) {
return mongoOperations.findAndModify(queryById(id), buildUpdateStatusRevoke(createdResource), FindAndModifyOptions.options().returnNew(true),
Command.class);
}
private UpdateDefinition buildUpdateStatusRevoke() {
var switchOperation = Switch.switchCases(
private UpdateDefinition buildUpdateStatusRevoke(String createdResource) {
var setOperation = SetOperation.set(MONGODB_STATUS).toValue(buildSetStatusCondition());
if (StringUtils.isNotBlank(createdResource)) {
setOperation = setOperation.and().set(MONGODB_CREATED_RESOURCE).toValue(buildSetCreatedResourceCondition(createdResource));
}
return Aggregation.newUpdate(setOperation);
}
private Switch buildSetStatusCondition() {
return Switch.switchCases(
CaseOperator.when(Eq.valueOf(MONGODB_STATUS).equalToValue(CommandStatus.NEW)).then(CommandStatus.CANCELED),
CaseOperator.when(Eq.valueOf(MONGODB_STATUS).equalToValue(CommandStatus.PENDING)).then(CommandStatus.REVOKE_PENDING),
CaseOperator.when(Eq.valueOf(MONGODB_STATUS).equalToValue(CommandStatus.FINISHED)).then(CommandStatus.REVOKE_PENDING))
.defaultTo(MONGODB_REFERENCE_STATUS);
return Aggregation.newUpdate(SetOperation.set(MONGODB_STATUS).toValue(switchOperation));
}
private ConditionalOperators.Cond buildSetCreatedResourceCondition(String createdResource) {
return ConditionalOperators.Cond.when(Eq.valueOf(MONGODB_STATUS).equalToValue(CommandStatus.PENDING)).then(createdResource)
.otherwiseValueOf(MONGODB_CREATED_RESOURCE);
}
public Optional<Command> setRevokeStatusIfNotPending(String id) {
......
......@@ -117,7 +117,7 @@ public class CommandService {
public void setCommandFinished(String commandId, String createdResource) {
var command = getById(commandId);
if (shouldRevoke(command)) {
repository.setRevokeStatus(commandId);
command = repository.setRevokeStatusWithResource(commandId, createdResource);
publishRevokeCommandEvent(command);
return;
}
......
......@@ -92,21 +92,20 @@ class CommandRepositoryITCase {
@Nested
class TestFinishCommand {
@BeforeEach
void init() {
mongoOperations.dropCollection(PersistedCommand.COLLECTION_NAME);
}
@DisplayName("should update status to finished")
@ParameterizedTest(name = "with status {0}")
@EnumSource(value = CommandStatus.class, names = { "PENDING", "REVOKE_PENDING" })
void shouldUpdateStatusToFinished(CommandStatus commandStatus) {
var command = mongoOperations.save(CommandTestFactory.createBuilder().id(null).status(commandStatus).build());
var command = mongoOperations.save(CommandTestFactory.createBuilder().id(null).status(commandStatus)
.createdResource(CommandTestFactory.CREATED_RESOURCE).build());
repository.finishCommand(command.getId());
var result = repository.findById(command.getId());
assertThat(result).isPresent().get().extracting(Command::getStatus).isEqualTo(CommandStatus.FINISHED);
assertThat(result).isPresent().get().satisfies(cmd -> {
assertThat(cmd.getStatus()).isEqualTo(CommandStatus.FINISHED);
assertThat(cmd.getCreatedResource()).isEqualTo(CommandTestFactory.CREATED_RESOURCE);
});
}
@DisplayName("should update status to finished")
......@@ -615,30 +614,39 @@ class CommandRepositoryITCase {
void shouldSetCanceled() {
var command = mongoOperations.save(CommandTestFactory.createBuilder().id(null).status(CommandStatus.NEW).build());
repository.setRevokeStatus(command.getId());
setRevokeStatusWithResource(command.getId());
var result = repository.findById(command.getId());
assertThat(result).isPresent().get().extracting(Command::getStatus).isEqualTo(CommandStatus.CANCELED);
assertThat(result).isPresent().get().satisfies(cmd -> {
assertThat(cmd.getStatus()).isEqualTo(CommandStatus.CANCELED);
assertThat(cmd.getCreatedResource()).isBlank();
});
}
@Test
void shouldSetRevokePendingWhenPending() {
var command = mongoOperations.save(CommandTestFactory.createBuilder().id(null).build());
repository.setRevokeStatus(command.getId());
setRevokeStatusWithResource(command.getId());
var result = repository.findById(command.getId());
assertThat(result).isPresent().get().extracting(Command::getStatus).isEqualTo(CommandStatus.REVOKE_PENDING);
assertThat(result).isPresent().get().satisfies(cmd -> {
assertThat(cmd.getStatus()).isEqualTo(CommandStatus.REVOKE_PENDING);
assertThat(cmd.getCreatedResource()).isEqualTo(CommandTestFactory.CREATED_RESOURCE);
});
}
@Test
void shouldSetRevokePendingWhenFinished() {
var command = mongoOperations.save(CommandTestFactory.createBuilder().id(null).status(CommandStatus.FINISHED).build());
repository.setRevokeStatus(command.getId());
setRevokeStatusWithResource(command.getId());
var result = repository.findById(command.getId());
assertThat(result).isPresent().get().extracting(Command::getStatus).isEqualTo(CommandStatus.REVOKE_PENDING);
assertThat(result).isPresent().get().satisfies(cmd -> {
assertThat(cmd.getStatus()).isEqualTo(CommandStatus.REVOKE_PENDING);
assertThat(cmd.getCreatedResource()).isBlank();
});
}
@DisplayName("should not update when")
......@@ -647,10 +655,17 @@ class CommandRepositoryITCase {
void shouldNotUpdate(CommandStatus status) {
var command = mongoOperations.save(CommandTestFactory.createBuilder().id(null).status(status).build());
repository.setRevokeStatus(command.getId());
setRevokeStatusWithResource(command.getId());
var result = repository.findById(command.getId());
assertThat(result).isPresent().get().extracting(Command::getStatus).isEqualTo(status);
assertThat(result).isPresent().get().satisfies(cmd -> {
assertThat(cmd.getStatus()).isEqualTo(status);
assertThat(cmd.getCreatedResource()).isNull();
});
}
private void setRevokeStatusWithResource(String commandId) {
repository.setRevokeStatusWithResource(commandId, CommandTestFactory.CREATED_RESOURCE);
}
}
......
......@@ -214,10 +214,12 @@ class CommandServiceTest {
@Nested
class TestRevokePendingCommand {
private static final Command REVOKE_PENDING_COMMAND = CommandTestFactory.createBuilder().status(CommandStatus.REVOKE_PENDING).build();
private static final Command REVOKE_PENDING_COMMAND = CommandTestFactory.createBuilder().status(CommandStatus.REVOKE_PENDING)
.createdResource(CommandTestFactory.CREATED_RESOURCE).build();
@BeforeEach
void init() {
when(repository.setRevokeStatusWithResource(anyString(), anyString())).thenReturn(REVOKE_PENDING_COMMAND);
doReturn(true).when(service).shouldRevoke(any());
doReturn(REVOKE_PENDING_COMMAND).when(service).getById(anyString());
}
......@@ -233,7 +235,7 @@ class CommandServiceTest {
void shouldCallRepository() {
setCommandFinished();
verify(repository).setRevokeStatus(CommandTestFactory.ID);
verify(repository).setRevokeStatusWithResource(CommandTestFactory.ID, CommandTestFactory.CREATED_RESOURCE);
}
@Test
......
......@@ -168,7 +168,7 @@ class GrpcCommandServiceITCase {
mongoOperations.dropCollection(Command.COLLECTION_NAME);
mongoOperations.dropCollection(VorgangAttachedItem.COLLECTION_NAME);
vorgang = mongoOperations.save(VorgangTestFactory.createBuilder().id(null).build());
vorgang = mongoOperations.save(VorgangTestFactory.createBuilder().id(null).version(0).build());
when(readIsPermitted.test(any())).thenReturn(true);
parentCommand = createParentCommand();
......@@ -259,9 +259,5 @@ class GrpcCommandServiceITCase {
return mongoOperations.findById(grpcCommand.getId(), Command.class);
}
private void assertCommandIsFinished(GrpcCommand grpcCommand) {
var command = mongoOperations.findById(grpcCommand.getId(), Command.class);
assertThat(command.getStatus()).isEqualTo(CommandStatus.FINISHED);
}
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment