72 lines
2.7 KiB
FSharp
72 lines
2.7 KiB
FSharp
namespace MyWebLog.Data.SQLite
|
|
|
|
open BitBadger.Documents
|
|
open BitBadger.Documents.Sqlite
|
|
open Microsoft.Data.Sqlite
|
|
open Microsoft.Extensions.Logging
|
|
open MyWebLog
|
|
open MyWebLog.Data
|
|
|
|
/// SQLite myWebLog person data implementation
|
|
type SQLitePersonData(conn: SqliteConnection, log: ILogger) =
|
|
|
|
/// Add a person
|
|
let add (person: Person) =
|
|
log.LogTrace "Person.add"
|
|
conn.insert Table.Person person
|
|
|
|
/// Find persons by their assignments
|
|
let findByAssignment (assignments: PersonAssignment list) =
|
|
log.LogTrace "Person.findByAssignment"
|
|
conn.findByFieldsOrdered<Person>
|
|
Table.Person All
|
|
[ Field.In (nameof Person.Empty.Id) (assignments |> List.map (fun it -> string it.PersonId)) ]
|
|
[ Field.Named (nameof Person.Empty.Name) ]
|
|
|
|
/// Find a person by their ID
|
|
let findById (personId: PersonId) webLogId =
|
|
log.LogTrace "Person.findById"
|
|
conn.findFirstByFields<Person> Table.Person All [ idField personId; webLogField webLogId ]
|
|
|
|
/// Delete a person by their ID
|
|
let delete personId webLogId = backgroundTask {
|
|
log.LogTrace "Person.delete"
|
|
match! findById personId webLogId with
|
|
| Some _ ->
|
|
// TODO: also remove this person from assignments in episodes and podcasts
|
|
do! conn.customNonQuery
|
|
$"{Query.byId (Query.delete Table.Person) (string personId)}"
|
|
[ idParam personId ]
|
|
return true
|
|
| None -> return false
|
|
}
|
|
|
|
/// Find a page by its permalink for the given web log
|
|
let findByWebLog webLogId =
|
|
log.LogTrace "Person.findByWebLog"
|
|
conn.findByFieldsOrdered<Person>
|
|
Table.Person All [ webLogField webLogId ] [ Field.Named (nameof Person.Empty.Name) ]
|
|
|
|
/// Restore persons from a backup
|
|
let restore persons = backgroundTask {
|
|
log.LogTrace "Person.restore"
|
|
for person in persons do do! add person
|
|
}
|
|
|
|
/// Update a page
|
|
let update (person: Person) = backgroundTask {
|
|
log.LogTrace "Person.update"
|
|
match! findById person.Id person.WebLogId with
|
|
| Some _ -> do! conn.updateById Table.Person person.Id person
|
|
| None -> ()
|
|
}
|
|
|
|
interface IPersonData with
|
|
member _.Add person = add person
|
|
member _.Delete personId webLogId = delete personId webLogId
|
|
member _.FindByAssignment assignments = findByAssignment assignments
|
|
member _.FindById personId webLogId = findById personId webLogId
|
|
member _.FindByWebLog webLogId = findByWebLog webLogId
|
|
member _.Restore pages = restore pages
|
|
member _.Update page = update page
|