def updateDeliveryAddress()

in membership-attribute-service/app/controllers/ContactController.scala [27:58]


  def updateDeliveryAddress(contactId: String): Action[AnyContent] =
    AuthorizeForRecentLogin(Return401IfNotSignedInRecently, requiredScopes = List(updateSelf)).async { request =>
      import request.logPrefix
      metrics.measureDuration("PUT /user-attributes/me/delivery-address/:contactId") {
        logger.info(s"Updating delivery address for contact $contactId")

        isContactOwnedByRequester(request, contactId) flatMap { valid =>
          if (valid) {
            val submitted = Exception.allCatch.either {
              request.body.asJson map (_.as[DeliveryAddress])
            }

            submitted match {
              case Left(parsingFailure) => Future.successful(BadRequest(parsingFailure.getMessage))
              case Right(None) => Future.successful(BadRequest(s"Not json: ${request.body}"))
              case Right(Some(address)) =>
                val contactRepository = request.touchpoint.contactRepository
                update(contactRepository, contactId, address) map { _ =>
                  NoContent
                } recover { case updateFailure =>
                  BadGateway(updateFailure.getMessage)
                }
            }
          } else
            Future.successful(
              BadRequest(
                s"Contact $contactId not related to current user ${request.redirectAdvice.userId}",
              ),
            )
        }
      }
    }