scala-news-reader

rss/atom news reader in scala

git clone https://9o.is/git/scala-news-reader.git

Article.scala

(2294B)


      1 package com.joereader.model
      2 
      3 import com.joereader._
      4 import actor._
      5 import lib._
      6 import Helper._
      7 import rss._
      8 
      9 import net.liftweb._
     10 import util._
     11 import http._
     12 import SHtml._
     13 import js._
     14 import JsCmds._
     15 
     16 import scala.xml._
     17 import java.util.Date
     18 
     19 import dispatch._, Defaults._
     20 
     21 trait ArticleTrait {
     22   def partDivider = "-"
     23 
     24   def createId(blog: Blog, entry: FeedEntry) =
     25     blog.id.get + partDivider + entry.guid.str2bytes.bytes2hex
     26 
     27 }
     28 
     29 object Article extends ArticleTrait {
     30 
     31   def sort(articles: List[Article]) =
     32     articles.sortWith((x, y) => x.date.getTime > y.date.getTime)
     33     
     34   def fromString(s: String): Article =
     35     s.split(partDivider).toList match {
     36       case blogId :: guidHex :: Nil =>
     37         val guid = guidHex.hex2bytes.bytes2str
     38         val blog = Blog.findByStringId(blogId)
     39         val entry = EntriesEngine.find(blog, guid)
     40         val bwu = BlogWriterUser.fromBlogFeedEntry(blog, entry)
     41 
     42         entry.map(new Article(bwu, _)) openOr Article.empty
     43       case a =>
     44         error("Invalid article in data store -> " + 
     45             a.mkString(partDivider))
     46         Article.empty
     47     }
     48 
     49   def empty = new Article(BlogWriterUser.empty, FeedEntry.empty)
     50 }
     51 
     52 /**
     53  * The representation of an article at the data store level.
     54  * Article entry content is not saved in data store. Only
     55  * guid.
     56  */
     57 class Article(_bwu: BlogWriterUser, _entry: FeedEntry) {
     58 
     59   /* date is used to sort articles. */
     60   def date: Date = entry.date
     61   def entry = _entry
     62   def bwu = _bwu
     63 
     64   def sharedBy: Option[BlogWriterUser] = None
     65 
     66   def saved: Boolean = User.currentUser.exists(
     67     _.saved.get.exists(_.toString == toString))
     68 
     69   def shared: Boolean = User.currentUser.exists(
     70     _.shared.get.exists(_.toString == toString))
     71 
     72   def save =
     73     for (u <- User.currentUser)
     74       u.saved.add(this).update
     75 
     76   def unSave =
     77     for (u <- User.currentUser)
     78       u.saved.remove(this).update
     79 
     80   def share =
     81     for (u <- User.currentUser) {
     82       val bwu1 = new BlogWriterUser(u)
     83       val sa = new ArticleShared(bwu, entry, new Date, bwu1)
     84       u.shared.add(sa).update
     85     }
     86 
     87   def unShare =
     88     for (u <- User.currentUser)
     89       u.shared.remove(asInstanceOf[ArticleShared]).update
     90 
     91   override def toString: String = {
     92     for (blog <- bwu.blog)
     93       yield Article.createId(blog, entry)
     94   } getOrElse ""
     95 
     96 }