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 }