forked from tangled.org/core
Monorepo for Tangled — https://tangled.org
at master 2.9 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.org/core/api/tangled" 12 "tangled.org/core/appview/db" 13 "tangled.org/core/appview/models" 14 "tangled.org/core/appview/pages" 15 "tangled.org/core/tid" 16) 17 18func (s *State) Star(w http.ResponseWriter, r *http.Request) { 19 currentUser := s.oauth.GetUser(r) 20 21 subject := r.URL.Query().Get("subject") 22 if subject == "" { 23 log.Println("invalid form") 24 return 25 } 26 27 subjectUri, err := syntax.ParseATURI(subject) 28 if err != nil { 29 log.Println("invalid form") 30 return 31 } 32 33 client, err := s.oauth.AuthorizedClient(r) 34 if err != nil { 35 log.Println("failed to authorize client", err) 36 return 37 } 38 39 switch r.Method { 40 case http.MethodPost: 41 createdAt := time.Now().Format(time.RFC3339) 42 rkey := tid.TID() 43 resp, err := comatproto.RepoPutRecord(r.Context(), client, &comatproto.RepoPutRecord_Input{ 44 Collection: tangled.FeedStarNSID, 45 Repo: currentUser.Did, 46 Rkey: rkey, 47 Record: &lexutil.LexiconTypeDecoder{ 48 Val: &tangled.FeedStar{ 49 Subject: subjectUri.String(), 50 CreatedAt: createdAt, 51 }}, 52 }) 53 if err != nil { 54 log.Println("failed to create atproto record", err) 55 return 56 } 57 log.Println("created atproto record: ", resp.Uri) 58 59 star := &models.Star{ 60 Did: currentUser.Did, 61 RepoAt: subjectUri, 62 Rkey: rkey, 63 } 64 65 err = db.AddStar(s.db, star) 66 if err != nil { 67 log.Println("failed to star", err) 68 return 69 } 70 71 starCount, err := db.GetStarCount(s.db, subjectUri) 72 if err != nil { 73 log.Println("failed to get star count for ", subjectUri) 74 } 75 76 s.notifier.NewStar(r.Context(), star) 77 78 s.pages.StarBtnFragment(w, pages.StarBtnFragmentParams{ 79 IsStarred: true, 80 SubjectAt: subjectUri, 81 StarCount: starCount, 82 }) 83 84 return 85 case http.MethodDelete: 86 // find the record in the db 87 star, err := db.GetStar(s.db, currentUser.Did, subjectUri) 88 if err != nil { 89 log.Println("failed to get star relationship") 90 return 91 } 92 93 _, err = comatproto.RepoDeleteRecord(r.Context(), client, &comatproto.RepoDeleteRecord_Input{ 94 Collection: tangled.FeedStarNSID, 95 Repo: currentUser.Did, 96 Rkey: star.Rkey, 97 }) 98 99 if err != nil { 100 log.Println("failed to unstar") 101 return 102 } 103 104 err = db.DeleteStarByRkey(s.db, currentUser.Did, star.Rkey) 105 if err != nil { 106 log.Println("failed to delete star from DB") 107 // this is not an issue, the firehose event might have already done this 108 } 109 110 starCount, err := db.GetStarCount(s.db, subjectUri) 111 if err != nil { 112 log.Println("failed to get star count for ", subjectUri) 113 return 114 } 115 116 s.notifier.DeleteStar(r.Context(), star) 117 118 s.pages.StarBtnFragment(w, pages.StarBtnFragmentParams{ 119 IsStarred: false, 120 SubjectAt: subjectUri, 121 StarCount: starCount, 122 }) 123 124 return 125 } 126 127}