membership-attribute-service/app/services/salesforce/SimpleContactRepository.scala (52 lines of code) (raw):

package services.salesforce import com.gu.monitoring.SafeLogger.LogPrefix import com.gu.okhttp.RequestRunners import com.gu.okhttp.RequestRunners.FutureHttpClient import com.gu.salesforce.ContactDeserializer._ import com.gu.salesforce.{Contact, SFContactId, SalesforceConfig, Scalaforce} import org.apache.pekko.actor.Scheduler import play.api.libs.json._ import scalaz.\/ import scala.concurrent.{ExecutionContext, Future} class SimpleContactRepository(private val salesforce: Scalaforce)(implicit executionContext: ExecutionContext) extends ContactRepository { import com.gu.memsub.subsv2.reads.Trace.{Traceable => T1} import com.gu.memsub.subsv2.services.Trace.Traceable private def toEither[A](j: JsResult[A]): String \/ A = j.fold( { errors => \/.left[String, A](errors.toString) }, \/.right, ) private def get(key: String, value: String)(implicit logPrefix: LogPrefix): Future[String \/ Option[Contact]] = { salesforce.Contact.read(key, value).map { failableJsonContact => (for { resultOpt <- failableJsonContact maybeContact <- resultOpt match { case Some(jsValue) => toEither(jsValue.validate[Contact].withTrace(s"SF001: Invalid read Contact response from Salesforce for $key $value: $jsValue")) .map[Option[Contact]](Some.apply) case None => \/.r[String](None: Option[Contact]) } } yield maybeContact).withTrace(s"SF002: could not get read contact response for $key $value") } } def get( identityId: String, )(implicit logPrefix: LogPrefix): Future[String \/ Option[Contact]] = // this returns right of None if the person isn't a member get(Keys.IDENTITY_ID, identityId) override def update(contactId: String, contactFields: Map[String, String])(implicit logPrefix: LogPrefix): Future[Unit] = salesforce.Contact.update(SFContactId(contactId), contactFields) } object CreateScalaforce { def apply(salesforceConfig: SalesforceConfig, scheduler: Scheduler, appName: String)(implicit executionContext: ExecutionContext): Scalaforce = { val salesforce: Scalaforce = new Scalaforce { val application: String = appName val stage: String = salesforceConfig.envName val sfConfig: SalesforceConfig = salesforceConfig val httpClient: FutureHttpClient = RequestRunners.futureRunner val sfScheduler = scheduler } salesforce.startAuth() salesforce } }