···
8
-
comatproto "github.com/bluesky-social/indigo/api/atproto"
9
-
"github.com/bluesky-social/indigo/atproto/syntax"
11
-
lexutil "github.com/bluesky-social/indigo/lex/util"
12
-
// "github.com/posthog/posthog-go"
13
-
"tangled.sh/tangled.sh/core/api/tangled"
14
-
"tangled.sh/tangled.sh/core/appview"
15
-
"tangled.sh/tangled.sh/core/appview/db"
16
-
"tangled.sh/tangled.sh/core/appview/pages"
19
-
func (s *State) React(w http.ResponseWriter, r *http.Request) {
20
-
currentUser := s.oauth.GetUser(r)
22
-
subject := r.URL.Query().Get("subject")
24
-
log.Println("invalid form")
28
-
subjectUri, err := syntax.ParseATURI(subject)
30
-
log.Println("invalid form")
34
-
reactionKind, ok := db.ParseReactionKind(r.URL.Query().Get("kind"))
36
-
log.Println("invalid reaction kind")
40
-
client, err := s.oauth.AuthorizedClient(r)
42
-
log.Println("failed to authorize client", err)
47
-
case http.MethodPost:
48
-
createdAt := time.Now().Format(time.RFC3339)
49
-
rkey := appview.TID()
50
-
resp, err := client.RepoPutRecord(r.Context(), &comatproto.RepoPutRecord_Input{
51
-
Collection: tangled.FeedReactionNSID,
52
-
Repo: currentUser.Did,
54
-
Record: &lexutil.LexiconTypeDecoder{
55
-
Val: &tangled.FeedReaction{
56
-
Subject: subjectUri.String(),
57
-
Reaction: reactionKind.String(),
58
-
CreatedAt: createdAt,
63
-
log.Println("failed to create atproto record", err)
67
-
err = db.AddReaction(s.db, currentUser.Did, subjectUri, reactionKind, rkey)
69
-
log.Println("failed to react", err)
73
-
count, err := db.GetReactionCount(s.db, subjectUri, reactionKind)
75
-
log.Println("failed to get reaction count for ", subjectUri)
78
-
log.Println("created atproto record: ", resp.Uri)
80
-
s.pages.ThreadReactionFragment(w, pages.ThreadReactionFragmentParams{
81
-
ThreadAt: subjectUri,
88
-
case http.MethodDelete:
89
-
reaction, err := db.GetReaction(s.db, currentUser.Did, subjectUri, reactionKind)
91
-
log.Println("failed to get reaction relationship for", currentUser.Did, subjectUri)
95
-
_, err = client.RepoDeleteRecord(r.Context(), &comatproto.RepoDeleteRecord_Input{
96
-
Collection: tangled.FeedReactionNSID,
97
-
Repo: currentUser.Did,
98
-
Rkey: reaction.Rkey,
102
-
log.Println("failed to remove reaction")
106
-
err = db.DeleteReactionByRkey(s.db, currentUser.Did, reaction.Rkey)
108
-
log.Println("failed to delete reaction from DB")
109
-
// this is not an issue, the firehose event might have already done this
112
-
count, err := db.GetReactionCount(s.db, subjectUri, reactionKind)
114
-
log.Println("failed to get reaction count for ", subjectUri)
118
-
s.pages.ThreadReactionFragment(w, pages.ThreadReactionFragmentParams{
119
-
ThreadAt: subjectUri,
120
-
Kind: reactionKind,