app/controllers/PeopleService.scala (44 lines of code) (raw):
package controllers
import com.gu.pandomainauth.PanDomainAuthSettingsRefresher
import com.gu.permissions.PermissionsProvider
import config.Config
import play.api.libs.json.Json
import play.api.libs.ws.WSClient
import play.api.mvc.{BaseController, ControllerComponents}
import java.util.concurrent.{Executors, TimeUnit}
class PeopleService(
override val config: Config,
override val controllerComponents: ControllerComponents,
override val wsClient: WSClient,
override val panDomainSettings: PanDomainAuthSettingsRefresher,
override val permissions: PermissionsProvider,
) extends BaseController with PanDomainAuthActions {
@volatile private var emailsPartsCache: Set[(String, Array[String])] = Set.empty
private def buildEmailsPartsCache() = permissions.allUserEmails().flatMap(email =>
email.toLowerCase()
.split('@').headOption.map(
email -> _.split('.')
)
)
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {
override def run(): Unit = {
emailsPartsCache = buildEmailsPartsCache()
}
}, 1, 15, TimeUnit.MINUTES)
def searchPeople(prefix: String) = APIAuthAction {
val searchParts = prefix.toLowerCase().split(Array(' ', '.'))
def allSearchPartsMatch(partsBeforeAt: Array[String]) = searchParts.forall(searchPart =>
partsBeforeAt.exists(
_.startsWith(searchPart)
)
)
val emailsParts = if(emailsPartsCache.isEmpty) buildEmailsPartsCache() else emailsPartsCache
Ok(
Json.toJson(
emailsParts.collect{
case (email, partsBeforeAt) if allSearchPartsMatch(partsBeforeAt) => email
}.take(5)
)
)
}
}