override def updateWithRetryAndMerge()

in mobile-save-for-later/src/main/scala/com/gu/sfl/lib/SavedArticlesMerger.scala [33:54]


  override def updateWithRetryAndMerge(userId: String, savedArticles: SavedArticles): Either[SaveForLaterError, SavedArticles] = {

    val deduplicatedArticles = savedArticles.deduped

    savedArticlesPersistence.read(userId) match {
      case Success(Some(currentArticles)) if currentArticles.version == deduplicatedArticles.version =>
        if(currentArticles != deduplicatedArticles) {
          logger.info(s"UserId: $userId. Received version ${deduplicatedArticles.version} which matched the database. DB count: ${currentArticles.articles.length}, client count: ${deduplicatedArticles.articles.length}")
          persistMergedArticles(userId, deduplicatedArticles)(savedArticlesPersistence.update)
        }
        else
          Right(deduplicatedArticles)
      case Success(Some(currentArticles)) =>
        val articlesToSave = currentArticles.copy(articles = MergeLogic.mergeListBy(currentArticles.articles, deduplicatedArticles.articles)(_.id))
        logger.info(s"UserId: $userId. Received version ${deduplicatedArticles.version} from the client but had version ${currentArticles.version} in the database. DB count: ${currentArticles.articles.length}, client count: ${deduplicatedArticles.articles.length}, merged count: ${articlesToSave.articles.length}")
        persistMergedArticles(userId, articlesToSave)(savedArticlesPersistence.update)
      case Success(None) =>
        logger.info(s"UserId: $userId. Storing articles for the first time. Version: ${deduplicatedArticles.version}. Client count: ${deduplicatedArticles.articles.length}")
        persistMergedArticles(userId, deduplicatedArticles)(savedArticlesPersistence.update)
      case _ => Left(SavedArticleMergeError("Could not retrieve current articles"))
    }
  }