forked from tangled.org/core
this repo has no description
at master 3.1 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 11 lexutil "github.com/bluesky-social/indigo/lex/util" 12 "tangled.org/core/api/tangled" 13 "tangled.org/core/appview/db" 14 "tangled.org/core/appview/models" 15 "tangled.org/core/appview/pages" 16 "tangled.org/core/tid" 17) 18 19func (s *State) React(w http.ResponseWriter, r *http.Request) { 20 currentUser := s.oauth.GetUser(r) 21 22 subject := r.URL.Query().Get("subject") 23 if subject == "" { 24 log.Println("invalid form") 25 return 26 } 27 28 subjectUri, err := syntax.ParseATURI(subject) 29 if err != nil { 30 log.Println("invalid form") 31 return 32 } 33 34 reactionKind, ok := models.ParseReactionKind(r.URL.Query().Get("kind")) 35 if !ok { 36 log.Println("invalid reaction kind") 37 return 38 } 39 40 client, err := s.oauth.AuthorizedClient(r) 41 if err != nil { 42 log.Println("failed to authorize client", err) 43 return 44 } 45 46 switch r.Method { 47 case http.MethodPost: 48 createdAt := time.Now().Format(time.RFC3339) 49 rkey := tid.TID() 50 resp, err := client.RepoPutRecord(r.Context(), &comatproto.RepoPutRecord_Input{ 51 Collection: tangled.FeedReactionNSID, 52 Repo: currentUser.Did, 53 Rkey: rkey, 54 Record: &lexutil.LexiconTypeDecoder{ 55 Val: &tangled.FeedReaction{ 56 Subject: subjectUri.String(), 57 Reaction: reactionKind.String(), 58 CreatedAt: createdAt, 59 }, 60 }, 61 }) 62 if err != nil { 63 log.Println("failed to create atproto record", err) 64 return 65 } 66 67 err = db.AddReaction(s.db, currentUser.Did, subjectUri, reactionKind, rkey) 68 if err != nil { 69 log.Println("failed to react", err) 70 return 71 } 72 73 count, err := db.GetReactionCount(s.db, subjectUri, reactionKind) 74 if err != nil { 75 log.Println("failed to get reaction count for ", subjectUri) 76 } 77 78 log.Println("created atproto record: ", resp.Uri) 79 80 s.pages.ThreadReactionFragment(w, pages.ThreadReactionFragmentParams{ 81 ThreadAt: subjectUri, 82 Kind: reactionKind, 83 Count: count, 84 IsReacted: true, 85 }) 86 87 return 88 case http.MethodDelete: 89 reaction, err := db.GetReaction(s.db, currentUser.Did, subjectUri, reactionKind) 90 if err != nil { 91 log.Println("failed to get reaction relationship for", currentUser.Did, subjectUri) 92 return 93 } 94 95 _, err = client.RepoDeleteRecord(r.Context(), &comatproto.RepoDeleteRecord_Input{ 96 Collection: tangled.FeedReactionNSID, 97 Repo: currentUser.Did, 98 Rkey: reaction.Rkey, 99 }) 100 101 if err != nil { 102 log.Println("failed to remove reaction") 103 return 104 } 105 106 err = db.DeleteReactionByRkey(s.db, currentUser.Did, reaction.Rkey) 107 if err != nil { 108 log.Println("failed to delete reaction from DB") 109 // this is not an issue, the firehose event might have already done this 110 } 111 112 count, err := db.GetReactionCount(s.db, subjectUri, reactionKind) 113 if err != nil { 114 log.Println("failed to get reaction count for ", subjectUri) 115 return 116 } 117 118 s.pages.ThreadReactionFragment(w, pages.ThreadReactionFragmentParams{ 119 ThreadAt: subjectUri, 120 Kind: reactionKind, 121 Count: count, 122 IsReacted: false, 123 }) 124 125 return 126 } 127}