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}