Skip to content

Instantly share code, notes, and snippets.

@kubukoz kubukoz/post.scala
Created May 16, 2018

Embed
What would you like to do?
the description for this gist
def checkAndSave(event: PageViewed,
hostname: String,
clientIp: Option[String]): F[ValidatedNel[PVError, Unit]] = {
val normalizedPath = normalize(event.path)
val uuidF: F[UUID] = Sync[F].delay { UUID.randomUUID() }
val currentTimeF: F[OffsetDateTime] = getCurrentTimeF
val ipValidationF: F[ValidatedNel[PVError, String]] =
clientIp
.toValidNel(PVError.noIp)
.traverse(checkIp(_, hostname, normalizedPath))
.map(_.andThen(identity)
val pathValidationF: F[ValidatedNel[PVError, String]] =
pageExists(hostname, normalizedPath).map(
Validated.condNel(_, normalizedPath, PVError.pageNotFound))
(uuidF, currentTimeF, ipValidationF, pathValidationF).traverseN {
(uuid, currentTime, ipValidation, pathValidation) =>
val timestampV: ValidatedNel[PVError, OffsetDateTime] = event
.displayedAt
.valid
.ensure(PVError.invalidTimestamp)(_.isBefore(currentTime))
.toValidatedNel
(
uuid.valid,
pathValidation,
timestampV,
hostname.valid,
ipValidation
).mapN(PageView).traverse(repository.persist)
}.flatten
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.