forked from tangled.org/core
this repo has no description
at master 2.8 kB view raw
1package state 2 3import ( 4 "log" 5 "net/http" 6 "time" 7 8 comatproto "github.com/bluesky-social/indigo/api/atproto" 9 "github.com/bluesky-social/indigo/atproto/syntax" 10 lexutil "github.com/bluesky-social/indigo/lex/util" 11 tangled "tangled.sh/tangled.sh/core/api/tangled" 12 "tangled.sh/tangled.sh/core/appview" 13 "tangled.sh/tangled.sh/core/appview/db" 14 "tangled.sh/tangled.sh/core/appview/pages" 15) 16 17func (s *State) Star(w http.ResponseWriter, r *http.Request) { 18 currentUser := s.auth.GetUser(r) 19 20 subject := r.URL.Query().Get("subject") 21 if subject == "" { 22 log.Println("invalid form") 23 return 24 } 25 26 subjectUri, err := syntax.ParseATURI(subject) 27 if err != nil { 28 log.Println("invalid form") 29 return 30 } 31 32 client, _ := s.auth.AuthorizedClient(r) 33 34 switch r.Method { 35 case http.MethodPost: 36 createdAt := time.Now().Format(time.RFC3339) 37 rkey := appview.TID() 38 resp, err := comatproto.RepoPutRecord(r.Context(), client, &comatproto.RepoPutRecord_Input{ 39 Collection: tangled.FeedStarNSID, 40 Repo: currentUser.Did, 41 Rkey: rkey, 42 Record: &lexutil.LexiconTypeDecoder{ 43 Val: &tangled.FeedStar{ 44 Subject: subjectUri.String(), 45 CreatedAt: createdAt, 46 }}, 47 }) 48 if err != nil { 49 log.Println("failed to create atproto record", err) 50 return 51 } 52 53 err = db.AddStar(s.db, currentUser.Did, subjectUri, rkey) 54 if err != nil { 55 log.Println("failed to star", err) 56 return 57 } 58 59 starCount, err := db.GetStarCount(s.db, subjectUri) 60 if err != nil { 61 log.Println("failed to get star count for ", subjectUri) 62 } 63 64 log.Println("created atproto record: ", resp.Uri) 65 66 s.pages.RepoActionsFragment(w, pages.RepoActionsFragmentParams{ 67 IsStarred: true, 68 RepoAt: subjectUri, 69 Stats: db.RepoStats{ 70 StarCount: starCount, 71 }, 72 }) 73 74 return 75 case http.MethodDelete: 76 // find the record in the db 77 star, err := db.GetStar(s.db, currentUser.Did, subjectUri) 78 if err != nil { 79 log.Println("failed to get star relationship") 80 return 81 } 82 83 _, err = comatproto.RepoDeleteRecord(r.Context(), client, &comatproto.RepoDeleteRecord_Input{ 84 Collection: tangled.FeedStarNSID, 85 Repo: currentUser.Did, 86 Rkey: star.Rkey, 87 }) 88 89 if err != nil { 90 log.Println("failed to unstar") 91 return 92 } 93 94 err = db.DeleteStar(s.db, currentUser.Did, subjectUri) 95 if err != nil { 96 log.Println("failed to delete star from DB") 97 // this is not an issue, the firehose event might have already done this 98 } 99 100 starCount, err := db.GetStarCount(s.db, subjectUri) 101 if err != nil { 102 log.Println("failed to get star count for ", subjectUri) 103 } 104 105 s.pages.RepoActionsFragment(w, pages.RepoActionsFragmentParams{ 106 IsStarred: false, 107 RepoAt: subjectUri, 108 Stats: db.RepoStats{ 109 StarCount: starCount, 110 }, 111 }) 112 113 return 114 } 115 116}