Monorepo for Tangled
Something went wrong. Try again.
Go
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223package db
import ( "context" "database/sql" "fmt" "strings" "time"
"tangled.org/core/appview/models" "tangled.org/core/orm")
func GetSpindles(ctx context.Context, e Execer, filters ...orm.Filter) ([]models.Spindle, error) { var spindles []models.Spindle
var conditions []string var args []any for _, filter := range filters { conditions = append(conditions, filter.Condition()) args = append(args, filter.Arg()...) }
whereClause := "" if conditions != nil { whereClause = " where " + strings.Join(conditions, " and ") }
query := fmt.Sprintf( `select id, owner, instance, verified, created, needs_upgrade from spindles %s order by created `, whereClause, )
rows, err := e.QueryContext(ctx, query, args...)
if err != nil { return nil, err } defer rows.Close()
for rows.Next() { var spindle models.Spindle var createdAt string var verified sql.NullString var needsUpgrade int
if err := rows.Scan( &spindle.Id, &spindle.Owner, &spindle.Instance, &verified, &createdAt, &needsUpgrade, ); err != nil { return nil, err }
spindle.Created, err = time.Parse(time.RFC3339, createdAt) if err != nil { spindle.Created = time.Now() }
if verified.Valid { t, err := time.Parse(time.RFC3339, verified.String) if err != nil { now := time.Now() spindle.Verified = &now } spindle.Verified = &t }
if needsUpgrade != 0 { spindle.NeedsUpgrade = true }
spindles = append(spindles, spindle) }
return spindles, nil}
func AddSpindle(e Execer, spindle models.Spindle) error { _, err := e.Exec( `insert into spindles (owner, instance) values (?, ?) on conflict (owner, instance) do nothing`, spindle.Owner, spindle.Instance, ) return err}
func VerifySpindle(e Execer, filters ...orm.Filter) (int64, error) { var conditions []string var args []any for _, filter := range filters { conditions = append(conditions, filter.Condition()) args = append(args, filter.Arg()...) }
whereClause := "" if conditions != nil { whereClause = " where " + strings.Join(conditions, " and ") }
query := fmt.Sprintf(`update spindles set verified = strftime('%%Y-%%m-%%dT%%H:%%M:%%SZ', 'now'), needs_upgrade = 0 %s`, whereClause)
res, err := e.Exec(query, args...) if err != nil { return 0, err }
return res.RowsAffected()}
func DeleteSpindle(e Execer, filters ...orm.Filter) error { var conditions []string var args []any for _, filter := range filters { conditions = append(conditions, filter.Condition()) args = append(args, filter.Arg()...) }
whereClause := "" if conditions != nil { whereClause = " where " + strings.Join(conditions, " and ") }
query := fmt.Sprintf(`delete from spindles %s`, whereClause)
_, err := e.Exec(query, args...) return err}
func AddSpindleMember(e Execer, member models.SpindleMember) error { _, err := e.Exec( `insert or ignore into spindle_members (did, rkey, instance, subject) values (?, ?, ?, ?)`, member.Did, member.Rkey, member.Instance, member.Subject, ) return err}
func RemoveSpindleMember(e Execer, filters ...orm.Filter) error { if len(filters) == 0 { return fmt.Errorf("RemoveSpindleMember requires at least one filter") }
var conditions []string var args []any for _, filter := range filters { conditions = append(conditions, filter.Condition()) args = append(args, filter.Arg()...) }
query := fmt.Sprintf(`delete from spindle_members where %s`, strings.Join(conditions, " and "))
_, err := e.Exec(query, args...) return err}
func GetSpindleMembers(e Execer, filters ...orm.Filter) ([]models.SpindleMember, error) { var members []models.SpindleMember
var conditions []string var args []any for _, filter := range filters { conditions = append(conditions, filter.Condition()) args = append(args, filter.Arg()...) }
whereClause := "" if conditions != nil { whereClause = " where " + strings.Join(conditions, " and ") }
query := fmt.Sprintf( `select id, did, rkey, instance, subject, created from spindle_members %s order by created `, whereClause, )
rows, err := e.Query(query, args...)
if err != nil { return nil, err } defer rows.Close()
for rows.Next() { var member models.SpindleMember var createdAt string
if err := rows.Scan( &member.Id, &member.Did, &member.Rkey, &member.Instance, &member.Subject, &createdAt, ); err != nil { return nil, err }
member.Created, err = time.Parse(time.RFC3339, createdAt) if err != nil { member.Created = time.Now() }
members = append(members, member) }
return members, nil}