offline-twitter/pkg/persistence/list_queries.go
2024-02-24 16:45:08 -08:00

102 lines
2.6 KiB
Go

package persistence
import (
"database/sql"
"errors"
"fmt"
. "gitlab.com/offline-twitter/twitter_offline_engine/pkg/scraper"
)
// Create an empty list, or rename an existing list
func (p Profile) SaveList(l *List) {
// Since the unique column is managed by the database (auto-increment) due to the existence of
// offline lists, we have to check for its existence first
var rowid ListID
if l.IsOnline {
// Online list; look up its rowid by its online ID
// TODO: maybe extract to a function
err := p.DB.Get(&rowid, "select rowid from lists where is_online = 1 and online_list_id = ?", l.ID)
if errors.Is(err, sql.ErrNoRows) {
// Doesn't exist yet
rowid = ListID(0)
} else if err != nil {
panic(err)
}
} else {
// For offline lists, just use the rowid
rowid = l.ID
}
// If `rowid` is 0, then it doesn't exist yet; create it. Otherwise, update it
if rowid == ListID(0) {
result, err := p.DB.NamedExec(`
insert into lists (is_online, online_list_id, name)
values (:is_online, :online_list_id, :name)
`, l)
if err != nil {
panic(err)
}
id, err := result.LastInsertId()
if err != nil {
panic(err)
}
l.ID = ListID(id)
} else {
// Do update
_, err := p.DB.NamedExec(`
update lists set name = :name where rowid = :rowid
`, l)
if err != nil {
panic(err)
}
}
}
func (p Profile) SaveListUsers(list_id ListID, trove TweetTrove) {
for user_id := range trove.Users {
p.SaveListUser(list_id, user_id)
}
}
func (p Profile) SaveListUser(list_id ListID, user_id UserID) {
_, err := p.DB.Exec(`insert into list_users (list_id, user_id) values (?, ?) on conflict do nothing`, list_id, user_id)
if err != nil {
panic(fmt.Errorf("Error executing AddListUser(%d, %d):\n %w", list_id, user_id, err).Error())
}
}
func (p Profile) DeleteListUser(list_id ListID, user_id UserID) {
_, err := p.DB.Exec(`delete from list_users where list_id = ? and user_id = ?`, list_id, user_id)
if err != nil {
panic(fmt.Errorf("Error executing DeleteListUser(%d, %d):\n %w", list_id, user_id, err).Error())
}
}
func (p Profile) GetListById(list_id ListID) List {
var ret List
err := p.DB.Get(&ret, `select rowid, is_online, online_list_id, name from lists where rowid = ?`, list_id)
if err != nil {
panic(err)
}
return ret
}
func (p Profile) GetListUsers(list_id ListID) []User {
var ret []User
err := p.DB.Select(&ret, `
select `+USERS_ALL_SQL_FIELDS+`
from users
where id in (select user_id from list_users where list_id = ?)
`, list_id)
if err != nil {
panic(err)
}
return ret
}
// XXX
// func (p Profile) GetFollowedUsers() List {
// err =
// }