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 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 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 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