diff --git a/federation-controller-backend/src/main/scala/acab/devcon0/domain/adapters/federationmember/SharingFolderUpdateCommandHandlerImpl.scala b/federation-controller-backend/src/main/scala/acab/devcon0/domain/adapters/federationmember/SharingFolderUpdateCommandHandlerImpl.scala index 500443cc8b6f85bef99ea62755bada5b347e4f93..c7f479d12765c95ebd62e9e4744853d69460bd70 100644 --- a/federation-controller-backend/src/main/scala/acab/devcon0/domain/adapters/federationmember/SharingFolderUpdateCommandHandlerImpl.scala +++ b/federation-controller-backend/src/main/scala/acab/devcon0/domain/adapters/federationmember/SharingFolderUpdateCommandHandlerImpl.scala @@ -51,17 +51,24 @@ class SharingFolderUpdateCommandHandlerImpl( ): IO[Option[FederationMemberChangelogItem]] = { getSharedFolderChangeLogItem(memberInformation) .flatMap { - case Some(timestamp) if !isNewerMessage(timestamp, message) => logOutOfOrderCase(message, timestamp) + case Some(changelogItem) if !isMessageNewerAndDifferent(changelogItem, message) => + logNotNewerNorDifferent(message, changelogItem.timestamp) case _ => IO.pure(Some(FederationMemberChangelogItem(message.ipfsCid, message.timestamp))) } } - private def getSharedFolderChangeLogItem(information: FederationMemberInformation): IO[Option[Instant]] = { - changelogService.getNewest(information.id).map(_.map(_.timestamp)) + private def getSharedFolderChangeLogItem( + information: FederationMemberInformation + ): IO[Option[FederationMemberChangelogItem]] = { + changelogService.getNewest(information.id) } - private def isNewerMessage(timestamp: Instant, message: FederationMemberSharingFolderUpdateMessage): Boolean = { - message.timestamp.isAfter(timestamp) + private def isMessageNewerAndDifferent( + changelogItem: FederationMemberChangelogItem, + message: FederationMemberSharingFolderUpdateMessage + ): Boolean = { + message.timestamp.isAfter(changelogItem.timestamp) && + !message.ipfsCid.equals(changelogItem.ipfsCid) } private def logResult(cmd: SharingFolderUpdateCommand): IO[Unit] = { @@ -69,12 +76,13 @@ class SharingFolderUpdateCommandHandlerImpl( logger.info(s"Federation member changelog added. nickname=$nickname ipfsCid=${cmd.message.ipfsCid}") } - private def logOutOfOrderCase( + private def logNotNewerNorDifferent( message: FederationMemberSharingFolderUpdateMessage, timestamp: Instant ): IO[Option[FederationMemberChangelogItem]] = { logger.info( - s"Out of order message. Command request not processed. ipfsCid=${message.ipfsCid}, " + + s"Received message is not newer nor different, request dropped. " + + s"ipfsCid=${message.ipfsCid}, " + s"latestTimestamp=$timestamp vs incomingTimestamp=${message.timestamp}" ) >> IO.pure(None)