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