forked from tangled.org/core
this repo has no description
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/db" 13 "tangled.sh/tangled.sh/core/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.RepoActionsFragment(w, pages.RepoActionsFragmentParams{ 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.RepoActionsFragment(w, pages.RepoActionsFragmentParams{ 105 IsStarred: false, 106 RepoAt: subjectUri, 107 Stats: db.RepoStats{ 108 StarCount: starCount, 109 }, 110 }) 111 112 return 113 } 114 115}