Mirror of @tangled.org/core. Running on a Raspberry Pi Zero 2 (Please be gentle).
0
fork

Configure Feed

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

appview: replace all occurrences of TID with global tid package

Signed-off-by: oppiliappan <me@oppi.li>

oppiliappan 4145917b cb4cc5e0

+39 -394
+6 -6
appview/issues/issues.go
··· 16 16 "github.com/go-chi/chi/v5" 17 17 18 18 "tangled.sh/tangled.sh/core/api/tangled" 19 - "tangled.sh/tangled.sh/core/appview" 20 19 "tangled.sh/tangled.sh/core/appview/config" 21 20 "tangled.sh/tangled.sh/core/appview/db" 22 21 "tangled.sh/tangled.sh/core/appview/idresolver" ··· 24 25 "tangled.sh/tangled.sh/core/appview/pages" 25 26 "tangled.sh/tangled.sh/core/appview/pagination" 26 27 "tangled.sh/tangled.sh/core/appview/reporesolver" 28 + "tangled.sh/tangled.sh/core/tid" 27 29 ) 28 30 29 31 type Issues struct { ··· 120 120 DidHandleMap: didHandleMap, 121 121 122 122 OrderedReactionKinds: db.OrderedReactionKinds, 123 - Reactions: reactionCountMap, 124 - UserReacted: userReactions, 123 + Reactions: reactionCountMap, 124 + UserReacted: userReactions, 125 125 }) 126 126 127 127 } ··· 171 171 _, err = client.RepoPutRecord(r.Context(), &comatproto.RepoPutRecord_Input{ 172 172 Collection: tangled.RepoIssueStateNSID, 173 173 Repo: user.Did, 174 - Rkey: appview.TID(), 174 + Rkey: tid.TID(), 175 175 Record: &lexutil.LexiconTypeDecoder{ 176 176 Val: &tangled.RepoIssueState{ 177 177 Issue: issue.IssueAt, ··· 275 275 } 276 276 277 277 commentId := mathrand.IntN(1000000) 278 - rkey := appview.TID() 278 + rkey := tid.TID() 279 279 280 280 err := db.NewIssueComment(rp.db, &db.Comment{ 281 281 OwnerDid: user.Did, ··· 726 726 resp, err := client.RepoPutRecord(r.Context(), &comatproto.RepoPutRecord_Input{ 727 727 Collection: tangled.RepoIssueNSID, 728 728 Repo: user.Did, 729 - Rkey: appview.TID(), 729 + Rkey: tid.TID(), 730 730 Record: &lexutil.LexiconTypeDecoder{ 731 731 Val: &tangled.RepoIssue{ 732 732 Repo: atUri,
+2 -2
appview/knots/knots.go
··· 13 13 14 14 "github.com/go-chi/chi/v5" 15 15 "tangled.sh/tangled.sh/core/api/tangled" 16 - "tangled.sh/tangled.sh/core/appview" 17 16 "tangled.sh/tangled.sh/core/appview/config" 18 17 "tangled.sh/tangled.sh/core/appview/db" 19 18 "tangled.sh/tangled.sh/core/appview/idresolver" ··· 22 23 "tangled.sh/tangled.sh/core/eventconsumer" 23 24 "tangled.sh/tangled.sh/core/knotclient" 24 25 "tangled.sh/tangled.sh/core/rbac" 26 + "tangled.sh/tangled.sh/core/tid" 25 27 26 28 comatproto "github.com/bluesky-social/indigo/api/atproto" 27 29 lexutil "github.com/bluesky-social/indigo/lex/util" ··· 436 436 resp, err := client.RepoPutRecord(r.Context(), &comatproto.RepoPutRecord_Input{ 437 437 Collection: tangled.KnotMemberNSID, 438 438 Repo: currentUser.Did, 439 - Rkey: appview.TID(), 439 + Rkey: tid.TID(), 440 440 Record: &lexutil.LexiconTypeDecoder{ 441 441 Val: &tangled.KnotMember{ 442 442 Subject: subjectIdentity.DID.String(),
+4 -4
appview/pulls/pulls.go
··· 14 14 "time" 15 15 16 16 "tangled.sh/tangled.sh/core/api/tangled" 17 - "tangled.sh/tangled.sh/core/appview" 18 17 "tangled.sh/tangled.sh/core/appview/config" 19 18 "tangled.sh/tangled.sh/core/appview/db" 20 19 "tangled.sh/tangled.sh/core/appview/idresolver" ··· 23 24 "tangled.sh/tangled.sh/core/appview/reporesolver" 24 25 "tangled.sh/tangled.sh/core/knotclient" 25 26 "tangled.sh/tangled.sh/core/patchutil" 27 + "tangled.sh/tangled.sh/core/tid" 26 28 "tangled.sh/tangled.sh/core/types" 27 29 28 30 "github.com/bluekeyes/go-gitdiff/gitdiff" ··· 668 668 atResp, err := client.RepoPutRecord(r.Context(), &comatproto.RepoPutRecord_Input{ 669 669 Collection: tangled.RepoPullCommentNSID, 670 670 Repo: user.Did, 671 - Rkey: appview.TID(), 671 + Rkey: tid.TID(), 672 672 Record: &lexutil.LexiconTypeDecoder{ 673 673 Val: &tangled.RepoPullComment{ 674 674 Repo: &atUri, ··· 1038 1038 body = formatPatches[0].Body 1039 1039 } 1040 1040 1041 - rkey := appview.TID() 1041 + rkey := tid.TID() 1042 1042 initialSubmission := db.PullSubmission{ 1043 1043 Patch: patch, 1044 1044 SourceRev: sourceRev, ··· 2168 2168 2169 2169 title := fp.Title 2170 2170 body := fp.Body 2171 - rkey := appview.TID() 2171 + rkey := tid.TID() 2172 2172 2173 2173 initialSubmission := db.PullSubmission{ 2174 2174 Patch: fp.Raw,
+2 -2
appview/repo/artifact.go
··· 14 14 "github.com/go-git/go-git/v5/plumbing" 15 15 "github.com/ipfs/go-cid" 16 16 "tangled.sh/tangled.sh/core/api/tangled" 17 - "tangled.sh/tangled.sh/core/appview" 18 17 "tangled.sh/tangled.sh/core/appview/db" 19 18 "tangled.sh/tangled.sh/core/appview/pages" 20 19 "tangled.sh/tangled.sh/core/appview/reporesolver" 21 20 "tangled.sh/tangled.sh/core/knotclient" 21 + "tangled.sh/tangled.sh/core/tid" 22 22 "tangled.sh/tangled.sh/core/types" 23 23 ) 24 24 ··· 64 64 65 65 log.Println("uploaded blob", humanize.Bytes(uint64(uploadBlobResp.Blob.Size)), uploadBlobResp.Blob.Ref.String()) 66 66 67 - rkey := appview.TID() 67 + rkey := tid.TID() 68 68 createdAt := time.Now() 69 69 70 70 putRecordResp, err := client.RepoPutRecord(r.Context(), &comatproto.RepoPutRecord_Input{
+2 -2
appview/repo/repo.go
··· 16 16 "time" 17 17 18 18 "tangled.sh/tangled.sh/core/api/tangled" 19 - "tangled.sh/tangled.sh/core/appview" 20 19 "tangled.sh/tangled.sh/core/appview/commitverify" 21 20 "tangled.sh/tangled.sh/core/appview/config" 22 21 "tangled.sh/tangled.sh/core/appview/db" ··· 29 30 "tangled.sh/tangled.sh/core/knotclient" 30 31 "tangled.sh/tangled.sh/core/patchutil" 31 32 "tangled.sh/tangled.sh/core/rbac" 33 + "tangled.sh/tangled.sh/core/tid" 32 34 "tangled.sh/tangled.sh/core/types" 33 35 34 36 securejoin "github.com/cyphar/filepath-securejoin" ··· 1088 1088 forkSourceUrl := fmt.Sprintf("%s://%s/%s/%s", uri, f.Knot, f.OwnerDid(), f.RepoName) 1089 1089 sourceAt := f.RepoAt.String() 1090 1090 1091 - rkey := appview.TID() 1091 + rkey := tid.TID() 1092 1092 repo := &db.Repo{ 1093 1093 Did: user.Did, 1094 1094 Name: forkName,
+2 -2
appview/settings/settings.go
··· 12 12 13 13 "github.com/go-chi/chi/v5" 14 14 "tangled.sh/tangled.sh/core/api/tangled" 15 - "tangled.sh/tangled.sh/core/appview" 16 15 "tangled.sh/tangled.sh/core/appview/config" 17 16 "tangled.sh/tangled.sh/core/appview/db" 18 17 "tangled.sh/tangled.sh/core/appview/email" 19 18 "tangled.sh/tangled.sh/core/appview/middleware" 20 19 "tangled.sh/tangled.sh/core/appview/oauth" 21 20 "tangled.sh/tangled.sh/core/appview/pages" 21 + "tangled.sh/tangled.sh/core/tid" 22 22 23 23 comatproto "github.com/bluesky-social/indigo/api/atproto" 24 24 lexutil "github.com/bluesky-social/indigo/lex/util" ··· 366 366 return 367 367 } 368 368 369 - rkey := appview.TID() 369 + rkey := tid.TID() 370 370 371 371 tx, err := s.Db.Begin() 372 372 if err != nil {
+2 -2
appview/spindles/spindles.go
··· 10 10 11 11 "github.com/go-chi/chi/v5" 12 12 "tangled.sh/tangled.sh/core/api/tangled" 13 - "tangled.sh/tangled.sh/core/appview" 14 13 "tangled.sh/tangled.sh/core/appview/config" 15 14 "tangled.sh/tangled.sh/core/appview/db" 16 15 "tangled.sh/tangled.sh/core/appview/idresolver" ··· 18 19 "tangled.sh/tangled.sh/core/appview/pages" 19 20 verify "tangled.sh/tangled.sh/core/appview/spindleverify" 20 21 "tangled.sh/tangled.sh/core/rbac" 22 + "tangled.sh/tangled.sh/core/tid" 21 23 22 24 comatproto "github.com/bluesky-social/indigo/api/atproto" 23 25 "github.com/bluesky-social/indigo/atproto/syntax" ··· 524 524 s.Enforcer.E.LoadPolicy() 525 525 }() 526 526 527 - rkey := appview.TID() 527 + rkey := tid.TID() 528 528 529 529 // add member to db 530 530 if err = db.AddSpindleMember(tx, db.SpindleMember{
+4 -4
appview/state/follow.go
··· 8 8 comatproto "github.com/bluesky-social/indigo/api/atproto" 9 9 lexutil "github.com/bluesky-social/indigo/lex/util" 10 10 "tangled.sh/tangled.sh/core/api/tangled" 11 - "tangled.sh/tangled.sh/core/appview" 12 11 "tangled.sh/tangled.sh/core/appview/db" 13 12 "tangled.sh/tangled.sh/core/appview/pages" 13 + "tangled.sh/tangled.sh/core/tid" 14 14 ) 15 15 16 16 func (s *State) Follow(w http.ResponseWriter, r *http.Request) { ··· 41 41 switch r.Method { 42 42 case http.MethodPost: 43 43 createdAt := time.Now().Format(time.RFC3339) 44 - rkey := appview.TID() 44 + rkey := tid.TID() 45 45 resp, err := client.RepoPutRecord(r.Context(), &comatproto.RepoPutRecord_Input{ 46 46 Collection: tangled.GraphFollowNSID, 47 47 Repo: currentUser.Did, ··· 60 60 log.Println("created atproto record: ", resp.Uri) 61 61 62 62 follow := &db.Follow{ 63 - UserDid: currentUser.Did, 63 + UserDid: currentUser.Did, 64 64 SubjectDid: subjectIdent.DID.String(), 65 - Rkey: rkey, 65 + Rkey: rkey, 66 66 } 67 67 68 68 err = db.AddFollow(s.db, follow)
+8 -8
appview/state/reaction.go
··· 10 10 11 11 lexutil "github.com/bluesky-social/indigo/lex/util" 12 12 "tangled.sh/tangled.sh/core/api/tangled" 13 - "tangled.sh/tangled.sh/core/appview" 14 13 "tangled.sh/tangled.sh/core/appview/db" 15 14 "tangled.sh/tangled.sh/core/appview/pages" 15 + "tangled.sh/tangled.sh/core/tid" 16 16 ) 17 17 18 18 func (s *State) React(w http.ResponseWriter, r *http.Request) { ··· 45 45 switch r.Method { 46 46 case http.MethodPost: 47 47 createdAt := time.Now().Format(time.RFC3339) 48 - rkey := appview.TID() 48 + rkey := tid.TID() 49 49 resp, err := client.RepoPutRecord(r.Context(), &comatproto.RepoPutRecord_Input{ 50 50 Collection: tangled.FeedReactionNSID, 51 51 Repo: currentUser.Did, ··· 77 77 log.Println("created atproto record: ", resp.Uri) 78 78 79 79 s.pages.ThreadReactionFragment(w, pages.ThreadReactionFragmentParams{ 80 - ThreadAt: subjectUri, 81 - Kind: reactionKind, 82 - Count: count, 80 + ThreadAt: subjectUri, 81 + Kind: reactionKind, 82 + Count: count, 83 83 IsReacted: true, 84 84 }) 85 85 ··· 115 115 } 116 116 117 117 s.pages.ThreadReactionFragment(w, pages.ThreadReactionFragmentParams{ 118 - ThreadAt: subjectUri, 119 - Kind: reactionKind, 120 - Count: count, 118 + ThreadAt: subjectUri, 119 + Kind: reactionKind, 120 + Count: count, 121 121 IsReacted: false, 122 122 }) 123 123
+4 -4
appview/state/star.go
··· 9 9 "github.com/bluesky-social/indigo/atproto/syntax" 10 10 lexutil "github.com/bluesky-social/indigo/lex/util" 11 11 "tangled.sh/tangled.sh/core/api/tangled" 12 - "tangled.sh/tangled.sh/core/appview" 13 12 "tangled.sh/tangled.sh/core/appview/db" 14 13 "tangled.sh/tangled.sh/core/appview/pages" 14 + "tangled.sh/tangled.sh/core/tid" 15 15 ) 16 16 17 17 func (s *State) Star(w http.ResponseWriter, r *http.Request) { ··· 38 38 switch r.Method { 39 39 case http.MethodPost: 40 40 createdAt := time.Now().Format(time.RFC3339) 41 - rkey := appview.TID() 41 + rkey := tid.TID() 42 42 resp, err := client.RepoPutRecord(r.Context(), &comatproto.RepoPutRecord_Input{ 43 43 Collection: tangled.FeedStarNSID, 44 44 Repo: currentUser.Did, ··· 57 57 58 58 star := &db.Star{ 59 59 StarredByDid: currentUser.Did, 60 - RepoAt: subjectUri, 61 - Rkey: rkey, 60 + RepoAt: subjectUri, 61 + Rkey: rkey, 62 62 } 63 63 64 64 err = db.AddStar(s.db, star)
+2 -346
appview/state/state.go
··· 10 10 "time" 11 11 12 12 comatproto "github.com/bluesky-social/indigo/api/atproto" 13 - "github.com/bluesky-social/indigo/atproto/syntax" 14 13 lexutil "github.com/bluesky-social/indigo/lex/util" 15 14 securejoin "github.com/cyphar/filepath-securejoin" 16 15 "github.com/go-chi/chi/v5" ··· 31 32 "tangled.sh/tangled.sh/core/knotclient" 32 33 tlog "tangled.sh/tangled.sh/core/log" 33 34 "tangled.sh/tangled.sh/core/rbac" 35 + "tangled.sh/tangled.sh/core/tid" 34 36 ) 35 37 36 38 type State struct { ··· 39 39 notifier notify.Notifier 40 40 oauth *oauth.OAuth 41 41 enforcer *rbac.Enforcer 42 - tidClock syntax.TIDClock 43 42 pages *pages.Pages 44 43 sess *session.SessionStore 45 44 idResolver *idresolver.Resolver ··· 60 61 if err != nil { 61 62 return nil, fmt.Errorf("failed to create enforcer: %w", err) 62 63 } 63 - 64 - clock := syntax.NewTIDClock(0) 65 64 66 65 pgs := pages.NewPages(config) 67 66 ··· 142 145 notifier, 143 146 oauth, 144 147 enforcer, 145 - clock, 146 148 pgs, 147 149 sess, 148 150 res, ··· 154 158 } 155 159 156 160 return state, nil 157 - } 158 - 159 - func TID(c *syntax.TIDClock) string { 160 - return c.Next().String() 161 161 } 162 162 163 163 func (s *State) Timeline(w http.ResponseWriter, r *http.Request) { ··· 200 208 return 201 209 } 202 210 203 - // requires auth 204 - // func (s *State) RegistrationKey(w http.ResponseWriter, r *http.Request) { 205 - // switch r.Method { 206 - // case http.MethodGet: 207 - // // list open registrations under this did 208 - // 209 - // return 210 - // case http.MethodPost: 211 - // session, err := s.oauth.Stores().Get(r, oauth.SessionName) 212 - // if err != nil || session.IsNew { 213 - // log.Println("unauthorized attempt to generate registration key") 214 - // http.Error(w, "Forbidden", http.StatusUnauthorized) 215 - // return 216 - // } 217 - // 218 - // did := session.Values[oauth.SessionDid].(string) 219 - // 220 - // // check if domain is valid url, and strip extra bits down to just host 221 - // domain := r.FormValue("domain") 222 - // if domain == "" { 223 - // http.Error(w, "Invalid form", http.StatusBadRequest) 224 - // return 225 - // } 226 - // 227 - // key, err := db.GenerateRegistrationKey(s.db, domain, did) 228 - // 229 - // if err != nil { 230 - // log.Println(err) 231 - // http.Error(w, "unable to register this domain", http.StatusNotAcceptable) 232 - // return 233 - // } 234 - // 235 - // w.Write([]byte(key)) 236 - // } 237 - // } 238 - 239 211 func (s *State) Keys(w http.ResponseWriter, r *http.Request) { 240 212 user := chi.URLParam(r, "user") 241 213 user = strings.TrimPrefix(user, "@") ··· 231 275 w.Write([]byte(fmt.Sprintln(key))) 232 276 } 233 277 } 234 - 235 - // create a signed request and check if a node responds to that 236 - // func (s *State) InitKnotServer(w http.ResponseWriter, r *http.Request) { 237 - // user := s.oauth.GetUser(r) 238 - // 239 - // noticeId := "operation-error" 240 - // defaultErr := "Failed to register spindle. Try again later." 241 - // fail := func() { 242 - // s.pages.Notice(w, noticeId, defaultErr) 243 - // } 244 - // 245 - // domain := chi.URLParam(r, "domain") 246 - // if domain == "" { 247 - // http.Error(w, "malformed url", http.StatusBadRequest) 248 - // return 249 - // } 250 - // log.Println("checking ", domain) 251 - // 252 - // secret, err := db.GetRegistrationKey(s.db, domain) 253 - // if err != nil { 254 - // log.Printf("no key found for domain %s: %s\n", domain, err) 255 - // return 256 - // } 257 - // 258 - // client, err := knotclient.NewSignedClient(domain, secret, s.config.Core.Dev) 259 - // if err != nil { 260 - // log.Println("failed to create client to ", domain) 261 - // } 262 - // 263 - // resp, err := client.Init(user.Did) 264 - // if err != nil { 265 - // w.Write([]byte("no dice")) 266 - // log.Println("domain was unreachable after 5 seconds") 267 - // return 268 - // } 269 - // 270 - // if resp.StatusCode == http.StatusConflict { 271 - // log.Println("status conflict", resp.StatusCode) 272 - // w.Write([]byte("already registered, sorry!")) 273 - // return 274 - // } 275 - // 276 - // if resp.StatusCode != http.StatusNoContent { 277 - // log.Println("status nok", resp.StatusCode) 278 - // w.Write([]byte("no dice")) 279 - // return 280 - // } 281 - // 282 - // // verify response mac 283 - // signature := resp.Header.Get("X-Signature") 284 - // signatureBytes, err := hex.DecodeString(signature) 285 - // if err != nil { 286 - // return 287 - // } 288 - // 289 - // expectedMac := hmac.New(sha256.New, []byte(secret)) 290 - // expectedMac.Write([]byte("ok")) 291 - // 292 - // if !hmac.Equal(expectedMac.Sum(nil), signatureBytes) { 293 - // log.Printf("response body signature mismatch: %x\n", signatureBytes) 294 - // return 295 - // } 296 - // 297 - // tx, err := s.db.BeginTx(r.Context(), nil) 298 - // if err != nil { 299 - // log.Println("failed to start tx", err) 300 - // http.Error(w, err.Error(), http.StatusInternalServerError) 301 - // return 302 - // } 303 - // defer func() { 304 - // tx.Rollback() 305 - // err = s.enforcer.E.LoadPolicy() 306 - // if err != nil { 307 - // log.Println("failed to rollback policies") 308 - // } 309 - // }() 310 - // 311 - // // mark as registered 312 - // err = db.Register(tx, domain) 313 - // if err != nil { 314 - // log.Println("failed to register domain", err) 315 - // http.Error(w, err.Error(), http.StatusInternalServerError) 316 - // return 317 - // } 318 - // 319 - // // set permissions for this did as owner 320 - // reg, err := db.RegistrationByDomain(tx, domain) 321 - // if err != nil { 322 - // log.Println("failed to register domain", err) 323 - // http.Error(w, err.Error(), http.StatusInternalServerError) 324 - // return 325 - // } 326 - // 327 - // // add basic acls for this domain 328 - // err = s.enforcer.AddKnot(domain) 329 - // if err != nil { 330 - // log.Println("failed to setup owner of domain", err) 331 - // http.Error(w, err.Error(), http.StatusInternalServerError) 332 - // return 333 - // } 334 - // 335 - // // add this did as owner of this domain 336 - // err = s.enforcer.AddKnotOwner(domain, reg.ByDid) 337 - // if err != nil { 338 - // log.Println("failed to setup owner of domain", err) 339 - // http.Error(w, err.Error(), http.StatusInternalServerError) 340 - // return 341 - // } 342 - // 343 - // err = tx.Commit() 344 - // if err != nil { 345 - // log.Println("failed to commit changes", err) 346 - // http.Error(w, err.Error(), http.StatusInternalServerError) 347 - // return 348 - // } 349 - // 350 - // err = s.enforcer.E.SavePolicy() 351 - // if err != nil { 352 - // log.Println("failed to update ACLs", err) 353 - // http.Error(w, err.Error(), http.StatusInternalServerError) 354 - // return 355 - // } 356 - // 357 - // // add this knot to knotstream 358 - // go s.knotstream.AddSource( 359 - // context.Background(), 360 - // eventconsumer.NewKnotSource(domain), 361 - // ) 362 - // 363 - // w.Write([]byte("check success")) 364 - // } 365 - 366 - // func (s *State) KnotServerInfo(w http.ResponseWriter, r *http.Request) { 367 - // domain := chi.URLParam(r, "domain") 368 - // if domain == "" { 369 - // http.Error(w, "malformed url", http.StatusBadRequest) 370 - // return 371 - // } 372 - // 373 - // user := s.oauth.GetUser(r) 374 - // reg, err := db.RegistrationByDomain(s.db, domain) 375 - // if err != nil { 376 - // w.Write([]byte("failed to pull up registration info")) 377 - // return 378 - // } 379 - // 380 - // var members []string 381 - // if reg.Registered != nil { 382 - // members, err = s.enforcer.GetUserByRole("server:member", domain) 383 - // if err != nil { 384 - // w.Write([]byte("failed to fetch member list")) 385 - // return 386 - // } 387 - // } 388 - // 389 - // var didsToResolve []string 390 - // for _, m := range members { 391 - // didsToResolve = append(didsToResolve, m) 392 - // } 393 - // didsToResolve = append(didsToResolve, reg.ByDid) 394 - // resolvedIds := s.idResolver.ResolveIdents(r.Context(), didsToResolve) 395 - // didHandleMap := make(map[string]string) 396 - // for _, identity := range resolvedIds { 397 - // if !identity.Handle.IsInvalidHandle() { 398 - // didHandleMap[identity.DID.String()] = fmt.Sprintf("@%s", identity.Handle.String()) 399 - // } else { 400 - // didHandleMap[identity.DID.String()] = identity.DID.String() 401 - // } 402 - // } 403 - // 404 - // ok, err := s.enforcer.IsKnotOwner(user.Did, domain) 405 - // isOwner := err == nil && ok 406 - // 407 - // p := pages.KnotParams{ 408 - // LoggedInUser: user, 409 - // DidHandleMap: didHandleMap, 410 - // Registration: reg, 411 - // Members: members, 412 - // IsOwner: isOwner, 413 - // } 414 - // 415 - // s.pages.Knot(w, p) 416 - // } 417 - 418 - // get knots registered by this user 419 - // func (s *State) Knots(w http.ResponseWriter, r *http.Request) { 420 - // // for now, this is just pubkeys 421 - // user := s.oauth.GetUser(r) 422 - // registrations, err := db.RegistrationsByDid(s.db, user.Did) 423 - // if err != nil { 424 - // log.Println(err) 425 - // } 426 - // 427 - // s.pages.Knots(w, pages.KnotsParams{ 428 - // LoggedInUser: user, 429 - // Registrations: registrations, 430 - // }) 431 - // } 432 - 433 - // list members of domain, requires auth and requires owner status 434 - // func (s *State) ListMembers(w http.ResponseWriter, r *http.Request) { 435 - // domain := chi.URLParam(r, "domain") 436 - // if domain == "" { 437 - // http.Error(w, "malformed url", http.StatusBadRequest) 438 - // return 439 - // } 440 - // 441 - // // list all members for this domain 442 - // memberDids, err := s.enforcer.GetUserByRole("server:member", domain) 443 - // if err != nil { 444 - // w.Write([]byte("failed to fetch member list")) 445 - // return 446 - // } 447 - // 448 - // w.Write([]byte(strings.Join(memberDids, "\n"))) 449 - // return 450 - // } 451 - 452 - // add member to domain, requires auth and requires invite access 453 - // func (s *State) AddMember(w http.ResponseWriter, r *http.Request) { 454 - // domain := chi.URLParam(r, "domain") 455 - // if domain == "" { 456 - // http.Error(w, "malformed url", http.StatusBadRequest) 457 - // return 458 - // } 459 - // 460 - // subjectIdentifier := r.FormValue("subject") 461 - // if subjectIdentifier == "" { 462 - // http.Error(w, "malformed form", http.StatusBadRequest) 463 - // return 464 - // } 465 - // 466 - // subjectIdentity, err := s.idResolver.ResolveIdent(r.Context(), subjectIdentifier) 467 - // if err != nil { 468 - // w.Write([]byte("failed to resolve member did to a handle")) 469 - // return 470 - // } 471 - // log.Printf("adding %s to %s\n", subjectIdentity.Handle.String(), domain) 472 - // 473 - // // announce this relation into the firehose, store into owners' pds 474 - // client, err := s.oauth.AuthorizedClient(r) 475 - // if err != nil { 476 - // http.Error(w, "failed to authorize client", http.StatusInternalServerError) 477 - // return 478 - // } 479 - // currentUser := s.oauth.GetUser(r) 480 - // createdAt := time.Now().Format(time.RFC3339) 481 - // resp, err := client.RepoPutRecord(r.Context(), &comatproto.RepoPutRecord_Input{ 482 - // Collection: tangled.KnotMemberNSID, 483 - // Repo: currentUser.Did, 484 - // Rkey: appview.TID(), 485 - // Record: &lexutil.LexiconTypeDecoder{ 486 - // Val: &tangled.KnotMember{ 487 - // Subject: subjectIdentity.DID.String(), 488 - // Domain: domain, 489 - // CreatedAt: createdAt, 490 - // }}, 491 - // }) 492 - // 493 - // // invalid record 494 - // if err != nil { 495 - // log.Printf("failed to create record: %s", err) 496 - // return 497 - // } 498 - // log.Println("created atproto record: ", resp.Uri) 499 - // 500 - // secret, err := db.GetRegistrationKey(s.db, domain) 501 - // if err != nil { 502 - // log.Printf("no key found for domain %s: %s\n", domain, err) 503 - // return 504 - // } 505 - // 506 - // ksClient, err := knotclient.NewSignedClient(domain, secret, s.config.Core.Dev) 507 - // if err != nil { 508 - // log.Println("failed to create client to ", domain) 509 - // return 510 - // } 511 - // 512 - // ksResp, err := ksClient.AddMember(subjectIdentity.DID.String()) 513 - // if err != nil { 514 - // log.Printf("failed to make request to %s: %s", domain, err) 515 - // return 516 - // } 517 - // 518 - // if ksResp.StatusCode != http.StatusNoContent { 519 - // w.Write([]byte(fmt.Sprint("knotserver failed to add member: ", err))) 520 - // return 521 - // } 522 - // 523 - // err = s.enforcer.AddKnotMember(domain, subjectIdentity.DID.String()) 524 - // if err != nil { 525 - // w.Write([]byte(fmt.Sprint("failed to add member: ", err))) 526 - // return 527 - // } 528 - // 529 - // w.Write([]byte(fmt.Sprint("added member: ", subjectIdentity.Handle.String()))) 530 - // } 531 - 532 - // func (s *State) RemoveMember(w http.ResponseWriter, r *http.Request) { 533 - // } 534 278 535 279 func validateRepoName(name string) error { 536 280 // check for path traversal attempts ··· 330 674 return 331 675 } 332 676 333 - rkey := appview.TID() 677 + rkey := tid.TID() 334 678 repo := &db.Repo{ 335 679 Did: user.Did, 336 680 Name: repoName,
-11
appview/tid.go
··· 1 - package appview 2 - 3 - import ( 4 - "github.com/bluesky-social/indigo/atproto/syntax" 5 - ) 6 - 7 - var c syntax.TIDClock = syntax.NewTIDClock(0) 8 - 9 - func TID() string { 10 - return c.Next().String() 11 - }
+1 -1
go.mod
··· 7 7 require ( 8 8 github.com/Blank-Xu/sql-adapter v1.1.1 9 9 github.com/alecthomas/chroma/v2 v2.15.0 10 + github.com/avast/retry-go/v4 v4.6.1 10 11 github.com/bluekeyes/go-gitdiff v0.8.1 11 12 github.com/bluesky-social/indigo v0.0.0-20250520232546-236dd575c91e 12 13 github.com/bluesky-social/jetstream v0.0.0-20241210005130-ea96859b93d1 ··· 50 49 github.com/Microsoft/go-winio v0.6.2 // indirect 51 50 github.com/ProtonMail/go-crypto v1.2.0 // indirect 52 51 github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be // indirect 53 - github.com/avast/retry-go/v4 v4.6.1 // indirect 54 52 github.com/aymerick/douceur v0.2.0 // indirect 55 53 github.com/beorn7/perks v1.0.1 // indirect 56 54 github.com/bmatcuk/doublestar/v4 v4.7.1 // indirect