forked from
tangled.org/core
fork
Configure Feed
Select the types of activity you want to include in your feed.
Monorepo for Tangled
fork
Configure Feed
Select the types of activity you want to include in your feed.
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.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.DeleteStarByRkey(s.db, currentUser.Did, star.Rkey)
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}