private def writeUpdatesIfRequired()

in app/services/BucketNotificationConfigurations.scala [129:178]


  private def writeUpdatesIfRequired(bucketName:String,
                                     configResponse:GetBucketNotificationConfigurationResponse,
                                     maybeLambdaArn:Option[String],
                                     requiredUpdates:Seq[LambdaFunctionConfiguration])(implicit s3Client:S3Client): Try[(Boolean, Boolean)] = {
    var updateRequired = false

    val initialConfiguration = NotificationConfiguration.builder()
      .lambdaFunctionConfigurations(configResponse.lambdaFunctionConfigurations())
      .eventBridgeConfiguration(configResponse.eventBridgeConfiguration())
      .queueConfigurations(configResponse.queueConfigurations())
      .topicConfigurations(configResponse.topicConfigurations())

    //step one - do we need to add a new monitoring configuration? If so put it into the list
    val addedConfiguration = if (isAdditionRequired(initialConfiguration)) {
      logger.debug(s"$bucketName: No archivehunter lambda found, adding one...")
      maybeLambdaArn match {
        case Some(lambdaArn) =>
          val existingConfigs = configResponse.lambdaFunctionConfigurations().asScala
          val updatedConfigs = existingConfigs :+ createNewNotification(lambdaArn)
          updateRequired = true //the SDK builder is a _java_ object which returns a mutable "self" rather than an immutable copy reference.
          initialConfiguration.lambdaFunctionConfigurations(updatedConfigs.asJava)
        case None =>
          throw new RuntimeException("Cannot add a lambda monitor because externalData.bucketMonitorLambdaARN is not set in the application config file")
      }
    } else {
      initialConfiguration
    }

    //step two - do we need to update any of the existing configurations? If so put them into the list
    val updatedConfiguration = if(requiredUpdates.nonEmpty) {
      updateRequired = true
      addedConfiguration.lambdaFunctionConfigurations(requiredUpdates.asJava)
    } else {
      addedConfiguration
    }

    //step three - if the config we built has no changes then do nothing, otherwise write out the updated configuration to S3
    if(!updateRequired) {
      logger.info(s"$bucketName: No updates were required")
      Success((false, false))
    } else {
      Try {
        s3Client.putBucketNotificationConfiguration(PutBucketNotificationConfigurationRequest.builder()
          .bucket(bucketName)
          .notificationConfiguration(updatedConfiguration.build())
          .skipDestinationValidation(true)
          .build())
      }.map(_ => (true, true))
    }
  }