forked from
tangled.org/core
Monorepo for Tangled — https://tangled.org
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}