app/model/User.scala (63 lines of code) (raw):

package model import com.okta.sdk.resource.model.User as OktaUser import play.api.libs.json.{Json, Writes} import utils.StringHelper.nonNullNonEmpty case class User( oktaId: String, legacyIdentityId: String, emailAddress: Option[String], emailValidated: Option[Boolean], userName: Option[String], name: Name, address: Address, phoneNumber: Option[PhoneNumber], registrationLocation: Option[String], registrationLocationState: Option[String], permissions: Seq[Permission] ) object User { def fromOktaUser(oktaUser: OktaUser): User = { User( oktaId = oktaUser.getId, legacyIdentityId = requiredCustomProfileField(oktaUser, "legacyIdentityId"), emailAddress = nonNullNonEmpty(oktaUser.getProfile.getEmail), emailValidated = customProfileField(oktaUser, "emailValidated").flatMap(_.toBooleanOption), userName = None, name = Name.fromOktaUser(oktaUser), address = Address.fromOktaUser(oktaUser), phoneNumber = PhoneNumber.fromOktaUser(oktaUser), registrationLocation = customProfileField(oktaUser, "registrationLocation"), registrationLocationState = customProfileField(oktaUser, "registrationLocationState"), permissions = Nil ) } def customProfileField(oktaUser: OktaUser, fieldName: String): Option[String] = Option(oktaUser.getProfile.getAdditionalProperties.get(fieldName)).collect { case s: String if !s.isBlank => s } def requiredCustomProfileField(oktaUser: OktaUser, fieldName: String): String = oktaUser.getProfile.getAdditionalProperties.get(fieldName).asInstanceOf[String] object writes { // Not implicit because there will be multiple representations of a User and we want to be explicit about which one we're using val me: Writes[User] = user => Json.obj( "identityId" -> user.legacyIdentityId, "emailAddress" -> user.emailAddress, "emailValidated" -> user.emailValidated, "username" -> user.userName, "title" -> user.name.title, "firstName" -> user.name.firstName, "lastName" -> user.name.lastName, "addressLine1" -> user.address.line1, "addressLine2" -> user.address.line2, "addressLine3" -> user.address.line3, "addressLine4" -> user.address.line4, "postcode" -> user.address.postcode, "isoCountryCode" -> user.address.country.map(_.code), "internationalDiallingCode" -> user.phoneNumber.map(_.countryCode), "localNumber" -> user.phoneNumber.map(_.localNumber), "registrationLocation" -> user.registrationLocation, "registrationLocationState" -> user.registrationLocationState, "permissions" -> user.permissions ) } }