scala-news-reader

rss/atom news reader in scala

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

Site.scala

(7874B)


      1 package com.joereader
      2 package config
      3 
      4 import model._
      5 import lib._
      6 import api.rest.oauth._
      7 import wordpress._
      8 import facebook._
      9 import net.liftweb._
     10 import http._
     11 import sitemap._
     12 import Loc._
     13 import common._
     14 import net.liftmodules.mongoauth.Locs
     15 import com.joereader.lib.api.rest.oauth.wordpress.WordpressBuilder
     16 
     17 object MenuGroups {
     18   val SettingsGroup = LocGroup("settings")
     19   val TopBarGroup = LocGroup("topbar")
     20   val SitemapGroup = LocGroup("sitemap")
     21 }
     22 
     23 /* Wrapper for Menu locations */
     24 case class MenuLoc(menu: Menu) {
     25   lazy val url: String = S.contextPath + menu.loc.calcDefaultHref
     26   lazy val fullUrl: String = S.hostAndPath + menu.loc.calcDefaultHref
     27 }
     28 
     29 object Site extends Locs {
     30 
     31   import MenuGroups._
     32 
     33   // others
     34   val reader = MenuLoc(Menu.i("Reader") / "reader" >> RequireLoggedIn)
     35   val savedArticles = MenuLoc(Menu.i("Saved Articles") / "reader" / "saved" >> RequireLoggedIn >> TemplateBox(() => Templates("saved" :: Nil)))
     36   val searchCategories = MenuLoc(Menu.i("Search Categories") / "search" / "categories" >> RequireLoggedIn)
     37 
     38   // tmp: should be a menu param that gets a category
     39   val searchWriters = MenuLoc(Menu.i("Search Writers") / "search" / "writers" >> RequireLoggedIn)
     40 
     41   // top level
     42   val notFound = MenuLoc(Menu.i("404") / "404" >> Hidden)
     43   val error = MenuLoc(Menu.i("Error") / "error" >> Hidden)
     44   val home = MenuLoc(Menu.i("Home") / "index" >> TopBarGroup >> Loc.EarlyResponse(
     45     () => Full(RedirectResponse(reader.url)).filter(ignore => User.isLoggedIn)))
     46 
     47   val contact = MenuLoc(Menu.i("Contact") / "help" / "contact" >> TopBarGroup >> SitemapGroup)
     48   val myBlog = MenuLoc(Menu.i("Blog") / "blog" / "readmeans" >> TopBarGroup >> SitemapGroup)
     49   val login = MenuLoc(Menu.i("Login") / "login" >> RequireNotLoggedIn)
     50   val loginToken = MenuLoc(buildLoginTokenMenu)
     51   val inviteToken = MenuLoc(buildInviteTokenMenu)
     52   val logout = MenuLoc(buildLogoutMenu)
     53 
     54   val wordpressSignIn = MenuLoc(WordpressBuilder.buildSignInMenu)
     55   val wordpressCallback = MenuLoc(WordpressBuilder.buildCallbackMenu)
     56   val facebookSignIn = MenuLoc(FacebookBuilder.buildSignInMenu)
     57   val facebookCallback = MenuLoc(FacebookBuilder.buildCallbackMenu)
     58   val facebookSignInSignIn = MenuLoc(FacebookBuilderSignIn.buildSignInMenu)
     59   val facebookSignInCallback = MenuLoc(FacebookBuilderSignIn.buildCallbackMenu)
     60 
     61   // sign up wizard
     62   val signUp1 = MenuLoc(Menu.i("Sign Up ⋅ Writer") / "signup" / "writer" >> RequireNotLoggedIn)
     63   val signUp2 = MenuLoc(Menu.i("Sign Up ⋅ Verify") / "signup" / "verify" >> RequireNotLoggedIn)
     64   val signUp3 = MenuLoc(Menu.i("Sign Up ⋅ Categories") / "signup" / "categories" >> RequireLoggedIn)
     65   val signUp4 = MenuLoc(Menu.i("Sign Up ⋅ Blog") / "signup" / "blog" >> RequireLoggedIn)
     66   val signUp5 = MenuLoc(Menu.i("Sign Up ⋅ User") / "signup" / "user" >> RequireLoggedIn)
     67   val signUp6 = MenuLoc(Menu.i("Sign Up ⋅ Password") / "signup" / "password" >> RequireLoggedIn)
     68   val signUp7 = MenuLoc(Menu.i("Sign Up ⋅ Thank You") / "signup" / "social" >> RequireNotLoggedIn)
     69 
     70   // help pages
     71   val passwordRecovery = MenuLoc(Menu.i("Password Recovery") / "help" / "recovery" >> RequireNotLoggedIn)
     72   val bloggerHelp = MenuLoc(Menu.i("Help Verify Blogger") / "help" / "verify" / "blogger")
     73   val tumblrHelp = MenuLoc(Menu.i("Help Verify Tumblr") / "help" / "verify" / "tumblr")
     74 
     75   // settings
     76   val password = MenuLoc(Menu.i("Password Reset") / "settings" / "password" >> RequireLoggedIn >> Hidden)
     77   val editAccount = MenuLoc(Menu.i("Account") / "settings" / "account" >> SettingsGroup >> RequireLoggedIn)
     78   val editBlogs = MenuLoc(Menu.i("Blogs") / "settings" / "blogs" >> SettingsGroup >> RequireLoggedIn)
     79   val editFollowing = MenuLoc(Menu.i("Following") / "settings" / "following" >> SettingsGroup >> RequireLoggedIn)
     80   val blogVerify = MenuLoc(Menu.i("Blog Verification") / "settings" / "verify" >> RequireLoggedIn)
     81 
     82   // PARAM MENUS
     83 
     84   /* /{user-name} */
     85   private val userProfileParamMenu = Menu.param[User](
     86     "User", "User Profile",
     87     User.findByUsername, _.username.get) / * >>
     88     TemplateBox(() => Templates("user" :: Nil))
     89 
     90   lazy val userProfileLoc = userProfileParamMenu.toLoc
     91 
     92   /* /{user-name}/following */
     93   private val userFollowingParamMenu = Menu.param[User](
     94     "User Following", "User Following",
     95     User.findByUsername, _.username.get) / * / "following" >>
     96     TemplateBox(() => Templates("following" :: Nil))
     97 
     98   lazy val userFollowingLoc = userFollowingParamMenu.toLoc
     99 
    100   /* /blog/{blog-name} */
    101   private val blogProfileParamMenu = Menu.param[Blog](
    102     "Blog Profile", "Blog Profile",
    103     Blog.findByBlogName, _.blogname.get) / "blog"
    104 
    105   lazy val blogProfileLoc = blogProfileParamMenu.toLoc
    106 
    107   /* /blog/{blog-name}/{blog-writer-name} */
    108   private val blogWriterProfileParamMenu = Menu.params[BlogWriterUser](
    109     "Blog Writer", "Blog Writer",
    110     BlogWriterUser.parse, BlogWriterUser.encode) / "blog" / * / * >>
    111     TemplateBox(() => Templates("blogwriter" :: Nil))
    112 
    113   lazy val blogWriterProfileLoc = blogWriterProfileParamMenu.toLoc
    114   
    115   /* /blog/{blog-name}/{blog-writer-name}/preview */
    116   private val blogWriterPreviewParamMenu = Menu.params[BlogWriterUser](
    117     "Blog Writer Preview", "Blog Writer Preview",
    118     BlogWriterUser.parse, BlogWriterUser.encode) / "blog" / * / * / "preview" >>
    119     TemplateBox(() => Templates("preview" :: Nil))
    120 
    121   lazy val blogWriterPreviewLoc = blogWriterPreviewParamMenu.toLoc
    122 
    123   /* /settings/blog/{blog-name} */
    124   private val blogSettingsParamMenu = Menu.param[Blog](
    125     "Blog Settings", "Blog Settings",
    126     Blog.findByBlogName, _.blogname.get) / "settings" / "blog" / * >>
    127     TemplateBox(() => Templates("settings" :: "blog" :: Nil)) >> RequireLoggedIn
    128 
    129   lazy val blogSettingsLoc = blogSettingsParamMenu.toLoc
    130 
    131   /* /settings/blog/{blog-name}/categorize */
    132   private val categoriesParamMenu = Menu.param[Blog](
    133     "Categories", "Categories",
    134     Blog.findByBlogName, _.blogname.get) / "settings" / "blog" / * / "categorize" >>
    135     TemplateBox(() => Templates("settings" :: "categories" :: Nil)) >> RequireLoggedIn
    136 
    137   lazy val categoriesLoc = categoriesParamMenu.toLoc
    138 
    139   private def menus = List(
    140     blogSettingsParamMenu,
    141     userFollowingParamMenu,
    142     blogWriterProfileParamMenu,
    143     blogWriterPreviewParamMenu,
    144     userProfileParamMenu,
    145     blogProfileParamMenu,
    146     categoriesParamMenu,
    147     home.menu,
    148     myBlog.menu,
    149     contact.menu,
    150     login.menu,
    151     loginToken.menu,
    152     inviteToken.menu,
    153     logout.menu,
    154     signUp1.menu,
    155     signUp2.menu,
    156     signUp3.menu,
    157     signUp4.menu,
    158     signUp5.menu,
    159     signUp6.menu,
    160     signUp7.menu,
    161     reader.menu,
    162     savedArticles.menu,
    163     searchCategories.menu,
    164     searchWriters.menu,
    165     editAccount.menu,
    166     password.menu,
    167     editBlogs.menu,
    168     editFollowing.menu,
    169     blogVerify.menu,
    170     passwordRecovery.menu,
    171     bloggerHelp.menu,
    172     tumblrHelp.menu,
    173     wordpressSignIn.menu,
    174     wordpressCallback.menu,
    175     facebookSignIn.menu,
    176     facebookCallback.menu,
    177     facebookSignInSignIn.menu,
    178     facebookSignInCallback.menu,
    179     error.menu,
    180     notFound.menu)
    181 
    182   /*
    183    * Return a SiteMap needed for Lift
    184    */
    185   def siteMap: SiteMap = SiteMap(menus: _*)
    186 
    187   /* Grabs all top-level paths so user-names won't be able to take them. */
    188   val invalidUsernames = siteMap.menus.map {
    189     menu =>
    190       val path = menu.loc.calcDefaultHref
    191       if (path.startsWith("/")) path.split("/")(1)
    192       else ""
    193   }
    194 
    195   def isAvailableMenu(n: String) = invalidUsernames.forall(_ != n)
    196 
    197   def buildInviteTokenMenu = Menu(Loc(
    198     "InviteToken", InviteToken.inviteTokenUrl.split("/").filter(_.length > 0).toList,
    199     S ? "liftmodule-monogoauth.locs.inviteToken", inviteTokenLocParams))
    200 
    201   protected def inviteTokenLocParams =
    202     EarlyResponse(() => User.meta.handleInviteToken()) :: Nil
    203 
    204   def isMarketingPage(path: String): Boolean =
    205     List(home.url, notFound.url, contact.url, "/").exists(path matches)
    206 
    207 }