app/logic/Favourites.scala (54 lines of code) (raw):
package logic
import java.util.Base64
import com.fasterxml.jackson.core.JsonParseException
import com.fasterxml.jackson.databind.JsonMappingException
import play.api.Logging
import play.api.libs.json.Json
import play.api.mvc.Cookie
object Favourites extends Logging {
def fromCookie(cookie: Cookie): List[String] = {
try {
Json
.parse(Base64.getDecoder.decode(cookie.value))
.validate[List[String]]
.fold(
{ a =>
logger.warn("Could not parse favourites cookie")
Nil
},
identity
)
} catch {
case e @ (_: JsonMappingException | _: JsonParseException |
_: IllegalArgumentException) =>
logger.warn(
s"Failed to parse favourites cookie value: ${cookie.value}",
e
)
Nil
}
}
def fromCookie(cookieOpt: Option[Cookie]): List[String] = {
cookieOpt.map(fromCookie).getOrElse(Nil)
}
def toCookie(favourites: List[String]): Cookie = {
val value = Base64.getEncoder.encodeToString(
Json.stringify(Json.toJson(favourites)).getBytes("UTF-8")
)
Cookie(
"favourites",
value,
maxAge = Some(86400 * 365),
path = "/",
secure = true,
httpOnly = true
)
}
/** Adds favourite if it does not exist, removes if it does
*/
def toggleFavourite(
account: String,
favourites: List[String]
): List[String] = {
if (favourites.contains(account)) favourites.filterNot(_ == account)
else favourites :+ account
}
}