V2 #1
|
@ -173,7 +173,7 @@ module Page =
|
|||
rethink<Page list> {
|
||||
withTable Table.Page
|
||||
getAll [ webLogId ] (nameof webLogId)
|
||||
without [ "text", "priorPermalinks", "revisions" ]
|
||||
without [ "text"; "priorPermalinks"; "revisions" ]
|
||||
result; withRetryDefault
|
||||
}
|
||||
|
||||
|
@ -182,7 +182,7 @@ module Page =
|
|||
rethink<Page> {
|
||||
withTable Table.Page
|
||||
get pageId
|
||||
resultOption; withRetryDefault
|
||||
resultOption; withRetryOptionDefault
|
||||
}
|
||||
|> verifyWebLog webLogId (fun it -> it.webLogId)
|
||||
|
||||
|
@ -191,8 +191,8 @@ module Page =
|
|||
rethink<Page> {
|
||||
withTable Table.Page
|
||||
get pageId
|
||||
without [ "priorPermalinks", "revisions" ]
|
||||
resultOption; withRetryDefault
|
||||
without [ "priorPermalinks"; "revisions" ]
|
||||
resultOption; withRetryOptionDefault
|
||||
}
|
||||
|> verifyWebLog webLogId (fun it -> it.webLogId)
|
||||
|
||||
|
@ -201,7 +201,7 @@ module Page =
|
|||
rethink<Page list> {
|
||||
withTable Table.Page
|
||||
getAll [ r.Array (webLogId, permalink) ] (nameof permalink)
|
||||
without [ "priorPermalinks", "revisions" ]
|
||||
without [ "priorPermalinks"; "revisions" ]
|
||||
limit 1
|
||||
result; withRetryDefault
|
||||
}
|
||||
|
@ -212,7 +212,7 @@ module Page =
|
|||
rethink<Permalink list> {
|
||||
withTable Table.Page
|
||||
getAll [ permalink ] "priorPermalinks"
|
||||
filter [ "webLogId", webLogId :> obj ]
|
||||
filter "webLogId" webLogId
|
||||
pluck [ "permalink" ]
|
||||
limit 1
|
||||
result; withRetryDefault
|
||||
|
@ -225,7 +225,7 @@ module Page =
|
|||
withTable Table.Page
|
||||
getAll [ webLogId ] (nameof webLogId)
|
||||
filter [ "showInPageList", true :> obj ]
|
||||
without [ "text", "priorPermalinks", "revisions" ]
|
||||
without [ "text"; "priorPermalinks"; "revisions" ]
|
||||
orderBy "title"
|
||||
result; withRetryDefault
|
||||
}
|
||||
|
@ -235,7 +235,7 @@ module Page =
|
|||
rethink<Page list> {
|
||||
withTable Table.Page
|
||||
getAll [ webLogId ] (nameof webLogId)
|
||||
without [ "priorPermalinks", "revisions" ]
|
||||
without [ "priorPermalinks"; "revisions" ]
|
||||
orderBy "title"
|
||||
skip ((pageNbr - 1) * 25)
|
||||
limit 25
|
||||
|
@ -248,7 +248,7 @@ module Page =
|
|||
withTable Table.Page
|
||||
get page.id
|
||||
update [
|
||||
"title", page.title
|
||||
"title", page.title :> obj
|
||||
"permalink", page.permalink
|
||||
"updatedOn", page.updatedOn
|
||||
"showInPageList", page.showInPageList
|
||||
|
@ -277,7 +277,7 @@ module Post =
|
|||
rethink<Post list> {
|
||||
withTable Table.Post
|
||||
getAll [ r.Array(permalink, webLogId) ] (nameof permalink)
|
||||
without [ "priorPermalinks", "revisions" ]
|
||||
without [ "priorPermalinks"; "revisions" ]
|
||||
limit 1
|
||||
result; withRetryDefault
|
||||
}
|
||||
|
@ -288,7 +288,7 @@ module Post =
|
|||
rethink<Permalink list> {
|
||||
withTable Table.Post
|
||||
getAll [ permalink ] "priorPermalinks"
|
||||
filter [ "webLogId", webLogId :> obj ]
|
||||
filter "webLogId" webLogId
|
||||
pluck [ "permalink" ]
|
||||
limit 1
|
||||
result; withRetryDefault
|
||||
|
@ -301,7 +301,7 @@ module Post =
|
|||
withTable Table.Post
|
||||
getAll [ webLogId ] (nameof webLogId)
|
||||
filter "status" Published
|
||||
without [ "priorPermalinks", "revisions" ]
|
||||
without [ "priorPermalinks"; "revisions" ]
|
||||
orderBy "publishedOn"
|
||||
skip ((pageNbr - 1) * postsPerPage)
|
||||
limit postsPerPage
|
||||
|
@ -335,7 +335,7 @@ module WebLog =
|
|||
rethink<WebLog> {
|
||||
withTable Table.WebLog
|
||||
get webLogId
|
||||
resultOption; withRetryDefault
|
||||
resultOption; withRetryOptionDefault
|
||||
}
|
||||
|
||||
/// Update web log settings
|
||||
|
@ -344,7 +344,7 @@ module WebLog =
|
|||
withTable Table.WebLog
|
||||
get webLog.id
|
||||
update [
|
||||
"name", webLog.name
|
||||
"name", webLog.name :> obj
|
||||
"subtitle", webLog.subtitle
|
||||
"defaultPage", webLog.defaultPage
|
||||
"postsPerPage", webLog.postsPerPage
|
||||
|
|
|
@ -14,7 +14,8 @@
|
|||
<PackageReference Include="Microsoft.FSharpLu.Json" Version="0.11.7" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
|
||||
<PackageReference Include="RethinkDb.Driver" Version="2.3.150" />
|
||||
<PackageReference Include="RethinkDb.Driver.FSharp" Version="0.8.0-alpha-0004" />
|
||||
<PackageReference Include="RethinkDb.Driver.FSharp" Version="0.8.0-alpha-0007" />
|
||||
<PackageReference Update="FSharp.Core" Version="6.0.3" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Markdig" Version="0.28.1" />
|
||||
<PackageReference Update="FSharp.Core" Version="6.0.3" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
|
|
@ -62,16 +62,31 @@ module private Helpers =
|
|||
open System.Security.Claims
|
||||
open System.IO
|
||||
|
||||
/// The HTTP item key for loading the session
|
||||
let private sessionLoadedKey = "session-loaded"
|
||||
|
||||
/// Load the session if it has not been loaded already; ensures async access but not excessive loading
|
||||
let private loadSession (ctx : HttpContext) = task {
|
||||
if not (ctx.Items.ContainsKey sessionLoadedKey) then
|
||||
do! ctx.Session.LoadAsync ()
|
||||
ctx.Items.Add (sessionLoadedKey, "yes")
|
||||
}
|
||||
|
||||
/// Ensure that the session is committed
|
||||
let private commitSession (ctx : HttpContext) = task {
|
||||
if ctx.Items.ContainsKey sessionLoadedKey then do! ctx.Session.CommitAsync ()
|
||||
}
|
||||
|
||||
/// Add a message to the user's session
|
||||
let addMessage (ctx : HttpContext) message = task {
|
||||
do! ctx.Session.LoadAsync ()
|
||||
do! loadSession ctx
|
||||
let msg = match ctx.Session.Get<UserMessage list> "messages" with Some it -> it | None -> []
|
||||
ctx.Session.Set ("messages", message :: msg)
|
||||
}
|
||||
|
||||
/// Get any messages from the user's session, removing them in the process
|
||||
let messages (ctx : HttpContext) = task {
|
||||
do! ctx.Session.LoadAsync ()
|
||||
do! loadSession ctx
|
||||
match ctx.Session.Get<UserMessage list> "messages" with
|
||||
| Some msg ->
|
||||
ctx.Session.Remove "messages"
|
||||
|
@ -98,7 +113,7 @@ module private Helpers =
|
|||
hash.Add ("current_page", ctx.Request.Path.Value.Substring 1)
|
||||
hash.Add ("messages", messages)
|
||||
|
||||
do! ctx.Session.CommitAsync ()
|
||||
do! commitSession ctx
|
||||
|
||||
// NOTE: DotLiquid does not support {% render %} or {% include %} in its templates, so we will do a two-pass
|
||||
// render; the net effect is a "layout" capability similar to Razor or Pug
|
||||
|
@ -120,7 +135,7 @@ module private Helpers =
|
|||
|
||||
/// Redirect after doing some action; commits session and issues a temporary redirect
|
||||
let redirectToGet url : HttpHandler = fun next ctx -> task {
|
||||
do! ctx.Session.CommitAsync ()
|
||||
do! commitSession ctx
|
||||
return! redirectTo false url next ctx
|
||||
}
|
||||
|
||||
|
|
|
@ -16,7 +16,8 @@
|
|||
<ItemGroup>
|
||||
<PackageReference Include="DotLiquid" Version="2.2.610" />
|
||||
<PackageReference Include="Giraffe" Version="6.0.0" />
|
||||
<PackageReference Include="RethinkDB.DistributedCache" Version="0.9.0-alpha03" />
|
||||
<PackageReference Include="RethinkDB.DistributedCache" Version="0.9.0-alpha05" />
|
||||
<PackageReference Update="FSharp.Core" Version="6.0.3" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
|
|
@ -179,9 +179,9 @@ let main args =
|
|||
} |> Async.AwaitTask |> Async.RunSynchronously
|
||||
let _ = builder.Services.AddSingleton<IConnection> conn
|
||||
|
||||
// let _ = builder.Services.AddDistributedRethinkDBCache (fun opts ->
|
||||
// opts.Connection <- conn)
|
||||
let _ = builder.Services.AddDistributedMemoryCache ()
|
||||
let _ = builder.Services.AddDistributedRethinkDBCache (fun opts ->
|
||||
opts.TableName <- "Session"
|
||||
opts.Connection <- conn)
|
||||
let _ = builder.Services.AddSession(fun opts ->
|
||||
opts.IdleTimeout <- TimeSpan.FromMinutes 30
|
||||
opts.Cookie.HttpOnly <- true
|
||||
|
|
|
@ -45,7 +45,7 @@
|
|||
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
|
||||
{% if msg.detail %}
|
||||
<hr>
|
||||
<p>{{ msg.detail.value }}</p>
|
||||
{{ msg.detail.value }}
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endfor %}
|
||||
|
|
|
@ -18,9 +18,9 @@
|
|||
<small>
|
||||
<a href="/{% unless pg.is_default %}{{ pg.permalink }}{% endunless %}" target="_blank">View Page</a>
|
||||
<span class="text-muted"> • </span>
|
||||
<a href="/page/{{ pg.id }}/edit">Edit Page</a>
|
||||
<a href="/page/{{ pg.id }}/edit">Edit</a>
|
||||
<span class="text-muted"> • </span>
|
||||
<a href="#" class="text-danger">Delete Page</a>
|
||||
<a href="#" class="text-danger">Delete</a>
|
||||
</small>
|
||||
</td>
|
||||
<td>{{ pg.updated_on | date: "MMMM d, yyyy" }}</td>
|
||||
|
|
Loading…
Reference in New Issue
Block a user