···
···
"github.com/bluesky-social/indigo/atproto/syntax"
lexutil "github.com/bluesky-social/indigo/lex/util"
"github.com/go-chi/chi/v5"
17
+
"github.com/gorilla/feeds"
"tangled.sh/tangled.sh/core/api/tangled"
"tangled.sh/tangled.sh/core/appview/db"
"tangled.sh/tangled.sh/core/appview/pages"
···
209
+
func (s *State) feedFromRequest(w http.ResponseWriter, r *http.Request) *feeds.Feed {
210
+
ident, ok := r.Context().Value("resolvedId").(identity.Identity)
212
+
s.pages.Error404(w)
216
+
feed, err := s.GetProfileFeed(r.Context(), ident.Handle.String(), ident.DID.String())
218
+
s.pages.Error500(w)
225
+
func (s *State) AtomFeedPage(w http.ResponseWriter, r *http.Request) {
226
+
feed := s.feedFromRequest(w, r)
231
+
atom, err := feed.ToAtom()
233
+
s.pages.Error500(w)
237
+
w.Header().Set("content-type", "application/atom+xml")
238
+
w.Write([]byte(atom))
241
+
func (s *State) GetProfileFeed(ctx context.Context, handle string, did string) (*feeds.Feed, error) {
242
+
timeline, err := db.MakeProfileTimeline(s.db, did)
247
+
author := &feeds.Author{
248
+
Name: fmt.Sprintf("@%s", handle),
250
+
feed := &feeds.Feed{
251
+
Title: fmt.Sprintf("timeline feed for %s", author.Name),
252
+
Link: &feeds.Link{Href: fmt.Sprintf("%s/@%s", s.config.Core.AppviewHost, handle), Type: "text/html", Rel: "alternate"},
253
+
Items: make([]*feeds.Item, 0),
254
+
Updated: time.UnixMilli(0),
257
+
for _, byMonth := range timeline.ByMonth {
258
+
for _, pull := range byMonth.PullEvents.Items {
259
+
owner, err := s.idResolver.ResolveIdent(ctx, pull.Repo.Did)
263
+
feed.Items = append(feed.Items, &feeds.Item{
264
+
Title: fmt.Sprintf("%s created pull request '%s' in @%s/%s", author.Name, pull.Title, owner.Handle, pull.Repo.Name),
265
+
Link: &feeds.Link{Href: fmt.Sprintf("%s/@%s/%s/pulls/%d", s.config.Core.AppviewHost, owner.Handle, pull.Repo.Name, pull.PullId), Type: "text/html", Rel: "alternate"},
266
+
Created: pull.Created,
269
+
for _, submission := range pull.Submissions {
270
+
feed.Items = append(feed.Items, &feeds.Item{
271
+
Title: fmt.Sprintf("%s submitted pull request '%s' (round #%d) in @%s/%s", author.Name, pull.Title, submission.RoundNumber, owner.Handle, pull.Repo.Name),
272
+
Link: &feeds.Link{Href: fmt.Sprintf("%s/@%s/%s/pulls/%d", s.config.Core.AppviewHost, owner.Handle, pull.Repo.Name, pull.PullId), Type: "text/html", Rel: "alternate"},
273
+
Created: submission.Created,
278
+
for _, issue := range byMonth.IssueEvents.Items {
279
+
owner, err := s.idResolver.ResolveIdent(ctx, issue.Metadata.Repo.Did)
283
+
feed.Items = append(feed.Items, &feeds.Item{
284
+
Title: fmt.Sprintf("%s created issue '%s' in @%s/%s", author.Name, issue.Title, owner.Handle, issue.Metadata.Repo.Name),
285
+
Link: &feeds.Link{Href: fmt.Sprintf("%s/@%s/%s/issues/%d", s.config.Core.AppviewHost, owner.Handle, issue.Metadata.Repo.Name, issue.IssueId), Type: "text/html", Rel: "alternate"},
286
+
Created: issue.Created,
290
+
for _, repo := range byMonth.RepoEvents {
292
+
if repo.Source != nil {
293
+
id, err := s.idResolver.ResolveIdent(ctx, repo.Source.Did)
297
+
title = fmt.Sprintf("%s forked repository @%s/%s to '%s'", author.Name, id.Handle, repo.Source.Name, repo.Repo.Name)
299
+
title = fmt.Sprintf("%s created repository '%s'", author.Name, repo.Repo.Name)
301
+
feed.Items = append(feed.Items, &feeds.Item{
303
+
Link: &feeds.Link{Href: fmt.Sprintf("%s/@%s/%s", s.config.Core.AppviewHost, handle, repo.Repo.Name), Type: "text/html", Rel: "alternate"},
304
+
Created: repo.Repo.Created,
309
+
slices.SortFunc(feed.Items, func(a *feeds.Item, b *feeds.Item) int {
310
+
return int(b.Created.UnixMilli()) - int(a.Created.UnixMilli())
312
+
if len(feed.Items) > 0 {
313
+
feed.Updated = feed.Items[0].Created
func (s *State) UpdateProfileBio(w http.ResponseWriter, r *http.Request) {
user := s.oauth.GetUser(r)