This repository has no description
0

Configure Feed

Select the types of activity you want to include in your feed.

wip: appview: use text input as spindle selector

Signed-off-by: Seongmin Lee <git@boltless.me>

author
Seongmin Lee
date (Jul 30, 2026, 1:26 AM +0900) commit 593b6ff2 parent 86b2068f change-id orlnlmwn
+16 -120
+7 -115
appview/db/spindle.go
··· 7 7 "strings" 8 8 "time" 9 9 10 + "github.com/bluesky-social/indigo/atproto/syntax" 10 11 "tangled.org/core/appview/models" 11 12 "tangled.org/core/orm" 12 13 ) 14 + 15 + // RecentSpindles lists spindles user recently used. 16 + func RecentSpindles(ctx context.Context, e Execer, user syntax.DID) ([]string, error) { 17 + // NOTE: should I use redis instead..? 18 + panic("unimplemented") 19 + } 13 20 14 21 func GetSpindles(ctx context.Context, e Execer, filters ...orm.Filter) ([]models.Spindle, error) { 15 22 var spindles []models.Spindle ··· 83 90 return spindles, nil 84 91 } 85 92 86 - func AddSpindle(e Execer, spindle models.Spindle) error { 87 - _, err := e.Exec( 88 - `insert into spindles (owner, instance) values (?, ?) 89 - on conflict (owner, instance) do nothing`, 90 - spindle.Owner, 91 - spindle.Instance, 92 - ) 93 - return err 94 - } 95 - 96 93 func VerifySpindle(e Execer, filters ...orm.Filter) (int64, error) { 97 94 var conditions []string 98 95 var args []any ··· 115 112 116 113 return res.RowsAffected() 117 114 } 118 - 119 - func DeleteSpindle(e Execer, filters ...orm.Filter) error { 120 - var conditions []string 121 - var args []any 122 - for _, filter := range filters { 123 - conditions = append(conditions, filter.Condition()) 124 - args = append(args, filter.Arg()...) 125 - } 126 - 127 - whereClause := "" 128 - if conditions != nil { 129 - whereClause = " where " + strings.Join(conditions, " and ") 130 - } 131 - 132 - query := fmt.Sprintf(`delete from spindles %s`, whereClause) 133 - 134 - _, err := e.Exec(query, args...) 135 - return err 136 - } 137 - 138 - func AddSpindleMember(e Execer, member models.SpindleMember) error { 139 - _, err := e.Exec( 140 - `insert or ignore into spindle_members (did, rkey, instance, subject) values (?, ?, ?, ?)`, 141 - member.Did, 142 - member.Rkey, 143 - member.Instance, 144 - member.Subject, 145 - ) 146 - return err 147 - } 148 - 149 - func RemoveSpindleMember(e Execer, filters ...orm.Filter) error { 150 - if len(filters) == 0 { 151 - return fmt.Errorf("RemoveSpindleMember requires at least one filter") 152 - } 153 - 154 - var conditions []string 155 - var args []any 156 - for _, filter := range filters { 157 - conditions = append(conditions, filter.Condition()) 158 - args = append(args, filter.Arg()...) 159 - } 160 - 161 - query := fmt.Sprintf(`delete from spindle_members where %s`, strings.Join(conditions, " and ")) 162 - 163 - _, err := e.Exec(query, args...) 164 - return err 165 - } 166 - 167 - func GetSpindleMembers(e Execer, filters ...orm.Filter) ([]models.SpindleMember, error) { 168 - var members []models.SpindleMember 169 - 170 - var conditions []string 171 - var args []any 172 - for _, filter := range filters { 173 - conditions = append(conditions, filter.Condition()) 174 - args = append(args, filter.Arg()...) 175 - } 176 - 177 - whereClause := "" 178 - if conditions != nil { 179 - whereClause = " where " + strings.Join(conditions, " and ") 180 - } 181 - 182 - query := fmt.Sprintf( 183 - `select id, did, rkey, instance, subject, created 184 - from spindle_members 185 - %s 186 - order by created 187 - `, 188 - whereClause, 189 - ) 190 - 191 - rows, err := e.Query(query, args...) 192 - 193 - if err != nil { 194 - return nil, err 195 - } 196 - defer rows.Close() 197 - 198 - for rows.Next() { 199 - var member models.SpindleMember 200 - var createdAt string 201 - 202 - if err := rows.Scan( 203 - &member.Id, 204 - &member.Did, 205 - &member.Rkey, 206 - &member.Instance, 207 - &member.Subject, 208 - &createdAt, 209 - ); err != nil { 210 - return nil, err 211 - } 212 - 213 - member.Created, err = time.Parse(time.RFC3339, createdAt) 214 - if err != nil { 215 - member.Created = time.Now() 216 - } 217 - 218 - members = append(members, member) 219 - } 220 - 221 - return members, nil 222 - }
+1 -1
appview/repo/repo.go
··· 1418 1418 user := rp.oauth.GetMultiAccountUser(r) 1419 1419 knots := rp.acl.KnotsForUser(r.Context(), user.Did) 1420 1420 1421 - spindles, err := rp.enforcer.GetSpindlesForUser(user.Did) 1421 + spindles, err := db.RecentSpindles(r.Context(), rp.db, syntax.DID(user.Did)) 1422 1422 if err != nil { 1423 1423 l.Error("failed to fetch spindles", "err", err) 1424 1424 }
+7 -3
appview/repo/settings.go
··· 473 473 l := rp.logger.With("handler", "pipelineSettings") 474 474 475 475 f, err := rp.repoResolver.Resolve(r) 476 + if err != nil { 477 + l.Error("failed to get repo and knot", "err", err) 478 + w.WriteHeader(http.StatusBadRequest) 479 + return 480 + } 481 + 476 482 user := rp.oauth.GetMultiAccountUser(r) 477 483 478 - // all spindles that the repo owner is a member of 479 - spindles, err := rp.enforcer.GetSpindlesForUser(f.Did) 484 + spindles, err := db.RecentSpindles(r.Context(), rp.db, syntax.DID(user.Did)) 480 485 if err != nil { 481 486 l.Error("failed to fetch spindles", "err", err) 482 - return 483 487 } 484 488 485 489 var secrets []*tangled.RepoListSecrets_Secret
+1 -1
appview/state/state.go
··· 450 450 user := s.oauth.GetMultiAccountUser(r) 451 451 knots := s.aclService.KnotsForUser(r.Context(), user.Did) 452 452 453 - spindles, err := s.enforcer.GetSpindlesForUser(user.Did) 453 + spindles, err := db.RecentSpindles(r.Context(), s.db, syntax.DID(user.Did)) 454 454 if err != nil { 455 455 s.logger.Error("failed to fetch spindles", "err", err) 456 456 }