Skip to content

Instantly share code, notes, and snippets.

@kubukoz
Created May 16, 2018 13:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kubukoz/8189a70a4bf1f8f85f984993f046dbb5 to your computer and use it in GitHub Desktop.
Save kubukoz/8189a70a4bf1f8f85f984993f046dbb5 to your computer and use it in GitHub Desktop.
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