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 }