scala-news-reader
rss/atom news reader in scala
git clone https://9o.is/git/scala-news-reader.git
Blog.scala
(2972B)
1 package com.joereader.model
2
3 import net.liftweb._
4 import common._
5 import record.field._
6 import mongodb._
7 import mongodb.record._
8 import mongodb.record.field._
9 import mongodb.BsonDSL._
10 import com.joereader._
11 import model.field._
12 import lib._
13
14 import dispatch._
15
16 import org.bson.types._
17
18 class Blog private () extends MongoRecord[Blog] with ObjectIdPk[Blog] {
19 def meta = Blog
20
21 object name extends StringField(this, 64)
22
23 object description extends TextareaField(this, 500)
24
25 object urlRss extends MongoListField[Blog, String](this)
26
27 object img extends StringField(this, 50)
28
29 object bgImg extends StringField(this, 50)
30
31 /* html web page url of this blog */
32 object urlHtml extends StringField(this, 500) {
33 def format(s: ValueType) = URLFormatter(s).hostAndPath
34 override def setFilter = format _ :: super.setFilter
35 }
36
37 /* blogname is the blog's site url */
38 object blogname extends StringField(this, 64) {
39 override def setFilter = toLower _ :: trim _ :: super.setFilter
40 }
41
42 /* owner is the writer that has control to edit blog */
43 object owner extends ObjectIdRefField(this, User) with ObjectIdRefFieldExtra[Blog, User]
44
45 /* other blog writers */
46 object writers extends BsonRecordListField(this, BlogWriter) with MongoListFieldExtra[Blog, BlogWriter] {
47
48 def find(user: User): Box[BlogWriter] =
49 Box(writers.get.find(_.user.get == user.id.get))
50
51 /* Blog writers that have registered with the website. */
52 def registered: List[BlogWriter] =
53 writers.get.filterNot(bu => bu.user.get == bu.user.defaultValue)
54
55 /* Blog writers that haven't registered with the website. */
56 def unregistered: List[BlogWriter] =
57 writers.get diff registered
58
59 def names: List[String] = writers.get.map(_.name.get)
60 def registeredNames = registered.map(_.name.get)
61 def unregisteredNames = unregistered.map(_.name.get)
62
63 /*
64 * If writer exists, only update user id and image.
65 * (everything except name [because it doesn't change] and followers)
66 */
67 def addSafely(bw: BlogWriter): Blog = {
68 val existing = findStr(bw.name.get).
69 map(_.user(bw.user.get).img(bw.img.get))
70 if (existing.isEmpty) add(bw) else owner
71 }
72 }
73 }
74
75 object Blog extends Blog with MongoMetaRecord[Blog] {
76
77 override def collectionName = "blog.blogs"
78
79 override def formats = super.formats + new PatternSerializer
80
81 ensureIndex(name.name -> 1, unique = false)
82 ensureIndex(blogname.name -> 1, unique = true)
83 ensureIndex(urlHtml.name -> 1, unique = true)
84
85 def findByStringId(id: String): Box[Blog] =
86 if (ObjectId.isValid(id) && id != "0" * 24)
87 find(new ObjectId(id))
88 else
89 Empty
90
91 def findByName(in: String): Box[Blog] = find(name.name, in)
92
93 def findByBlogName(in: String): Box[Blog] = find(blogname.name, in)
94
95 def findByUrl(in: String): Box[Blog] = {
96 val pattern = URLFormatter(in).pattern
97 find("urlHtml" ->
98 ("$regex" -> pattern.pattern) ~ ("$flags" -> pattern.flags))
99 }
100 }