namespace MyWebLog.Data.Postgres open BitBadger.Documents open BitBadger.Documents.Postgres open Microsoft.Extensions.Logging open MyWebLog open MyWebLog.Data /// PostgreSQL myWebLog web log data implementation type PostgresWebLogData(log: ILogger) = /// Add a web log let add (webLog: WebLog) = log.LogTrace "WebLog.add" insert Table.WebLog webLog /// Retrieve all web logs let all () = log.LogTrace "WebLog.all" Find.all Table.WebLog /// Delete a web log by its ID let delete webLogId = log.LogTrace "WebLog.delete" Custom.nonQuery $"""{Query.delete Table.PostComment} WHERE data->>'{nameof Comment.Empty.PostId}' IN (SELECT data->>'{nameof Post.Empty.Id}' FROM {Table.Post} WHERE {Query.whereDataContains "@criteria"}); {Query.delete Table.PostRevision} WHERE post_id IN (SELECT data->>'Id' FROM {Table.Post} WHERE {Query.whereDataContains "@criteria"}); {Query.delete Table.PageRevision} WHERE page_id IN (SELECT data->>'Id' FROM {Table.Page} WHERE {Query.whereDataContains "@criteria"}); {Query.byContains (Query.delete Table.Post)}; {Query.byContains (Query.delete Table.Page)}; {Query.byContains (Query.delete Table.Category)}; {Query.byContains (Query.delete Table.TagMap)}; {Query.byContains (Query.delete Table.WebLogUser)}; {Query.delete Table.Upload} WHERE web_log_id = @webLogId; {Query.delete Table.WebLog} WHERE data->>'Id' = @webLogId""" [ webLogIdParam webLogId; webLogContains webLogId ] /// Find a web log by its host (URL base) let findByHost (url: string) = log.LogTrace "WebLog.findByHost" Find.firstByContains Table.WebLog {| UrlBase = url |} /// Find a web log by its ID let findById (webLogId: WebLogId) = log.LogTrace "WebLog.findById" Find.byId Table.WebLog webLogId /// Update redirect rules for a web log let updateRedirectRules (webLog: WebLog) = backgroundTask { log.LogTrace "WebLog.updateRedirectRules" match! findById webLog.Id with | Some _ -> do! Patch.byId Table.WebLog webLog.Id {| RedirectRules = webLog.RedirectRules |} | None -> () } /// Update RSS options for a web log let updateRssOptions (webLog: WebLog) = backgroundTask { log.LogTrace "WebLog.updateRssOptions" match! findById webLog.Id with | Some _ -> do! Patch.byId Table.WebLog webLog.Id {| Rss = webLog.Rss |} | None -> () } /// Update settings for a web log let updateSettings (webLog: WebLog) = log.LogTrace "WebLog.updateSettings" Update.byId Table.WebLog webLog.Id webLog interface IWebLogData with member _.Add webLog = add webLog member _.All() = all () member _.Delete webLogId = delete webLogId member _.FindByHost url = findByHost url member _.FindById webLogId = findById webLogId member _.UpdateRedirectRules webLog = updateRedirectRules webLog member _.UpdateRssOptions webLog = updateRssOptions webLog member _.UpdateSettings webLog = updateSettings webLog