WIP on person table, podcast/ep assignment (#17)

This commit is contained in:
2026-08-02 17:33:38 -04:00
parent 05a810dfc6
commit d9e7c771ba
18 changed files with 471 additions and 101 deletions
+72 -1
View File
@@ -23,6 +23,9 @@ module private RethinkHelpers =
/// The page table
let Page = "Page"
/// The person table
let Person = "Person"
/// The post table
let Post = "Post"
@@ -45,7 +48,8 @@ module private RethinkHelpers =
let WebLogUser = "WebLogUser"
/// A list of all tables
let all = [ Category; Comment; DbVersion; Page; Post; TagMap; Theme; ThemeAsset; Upload; WebLog; WebLogUser ]
let all =
[ Category; Comment; DbVersion; Page; Person; Post; TagMap; Theme; ThemeAsset; Upload; WebLog; WebLogUser ]
/// Index names for indexes not on a data item's name
@@ -615,6 +619,72 @@ type RethinkDbData(conn: Net.IConnection, config: DataConfig, log: ILogger<Rethi
| None -> return false
}
}
member _.Person = {
new IPersonData with
member _.Add person = rethink {
withTable Table.Person
insert person
write; withRetryDefault; ignoreResult conn
}
member _.Delete personId webLogId = backgroundTask {
// TODO: also remove this person from assignments in episodes and podcasts
let! result = rethink<Model.Result> {
withTable Table.Person
getAll [ personId ]
filter (fun row -> row[nameof Person.Empty.WebLogId].Eq webLogId :> obj)
delete
write; withRetryDefault conn
}
return result.Deleted > 0UL
}
member _.FindByAssignment assignments = rethink {
withTable Table.Person
getAll (assignments |> List.map _.PersonId)
orderBy (nameof Person.Empty.Name)
result; withRetryDefault conn
}
member _.FindById personId webLogId =
rethink<Person list> {
withTable Table.Person
getAll [ personId ]
filter (nameof Person.Empty.WebLogId) webLogId
result; withRetryDefault
}
|> tryFirst <| conn
member _.FindByWebLog webLogId = rethink<Person list> {
withTable Table.Person
getAll [ webLogId ] (nameof Person.Empty.WebLogId)
orderBy (nameof Person.Empty.Name)
result; withRetryDefault conn
}
member _.Restore persons = backgroundTask {
for batch in persons |> List.chunkBySize restoreBatchSize do
do! rethink {
withTable Table.Person
insert batch
write; withRetryOnce; ignoreResult conn
}
}
member this.Update person = backgroundTask {
match! this.FindById person.Id person.WebLogId with
| Some _ ->
do! rethink {
withTable Table.Person
get person.Id
replace person
write; withRetryDefault; ignoreResult conn
}
| None -> ()
}
}
member _.Post = {
new IPostData with
@@ -1281,6 +1351,7 @@ type RethinkDbData(conn: Net.IConnection, config: DataConfig, log: ILogger<Rethi
do! ensureIndexes Table.Category [ nameof Category.Empty.WebLogId ]
do! ensureIndexes Table.Comment [ nameof Comment.Empty.PostId ]
do! ensureIndexes Table.Page [ nameof Page.Empty.WebLogId; nameof Page.Empty.AuthorId ]
do! ensureIndexes Table.Person [ nameof Person.Empty.WebLogId ]
do! ensureIndexes Table.Post [ nameof Post.Empty.WebLogId; nameof Post.Empty.AuthorId ]
do! ensureIndexes Table.TagMap []
do! ensureIndexes Table.Upload []