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 }