code.gitea.io/gitea@v1.21.7/routers/web/feed/profile.go (about)

     1  // Copyright 2021 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package feed
     5  
     6  import (
     7  	"time"
     8  
     9  	activities_model "code.gitea.io/gitea/models/activities"
    10  	"code.gitea.io/gitea/modules/context"
    11  	"code.gitea.io/gitea/modules/markup"
    12  	"code.gitea.io/gitea/modules/markup/markdown"
    13  
    14  	"github.com/gorilla/feeds"
    15  )
    16  
    17  // ShowUserFeedRSS show user activity as RSS feed
    18  func ShowUserFeedRSS(ctx *context.Context) {
    19  	showUserFeed(ctx, "rss")
    20  }
    21  
    22  // ShowUserFeedAtom show user activity as Atom feed
    23  func ShowUserFeedAtom(ctx *context.Context) {
    24  	showUserFeed(ctx, "atom")
    25  }
    26  
    27  // showUserFeed show user activity as RSS / Atom feed
    28  func showUserFeed(ctx *context.Context, formatType string) {
    29  	includePrivate := ctx.IsSigned && (ctx.Doer.IsAdmin || ctx.Doer.ID == ctx.ContextUser.ID)
    30  
    31  	actions, _, err := activities_model.GetFeeds(ctx, activities_model.GetFeedsOptions{
    32  		RequestedUser:   ctx.ContextUser,
    33  		Actor:           ctx.Doer,
    34  		IncludePrivate:  includePrivate,
    35  		OnlyPerformedBy: !ctx.ContextUser.IsOrganization(),
    36  		IncludeDeleted:  false,
    37  		Date:            ctx.FormString("date"),
    38  	})
    39  	if err != nil {
    40  		ctx.ServerError("GetFeeds", err)
    41  		return
    42  	}
    43  
    44  	ctxUserDescription, err := markdown.RenderString(&markup.RenderContext{
    45  		Ctx: ctx,
    46  		Links: markup.Links{
    47  			Base: ctx.ContextUser.HTMLURL(),
    48  		},
    49  		Metas: map[string]string{
    50  			"user": ctx.ContextUser.GetDisplayName(),
    51  		},
    52  	}, ctx.ContextUser.Description)
    53  	if err != nil {
    54  		ctx.ServerError("RenderString", err)
    55  		return
    56  	}
    57  
    58  	feed := &feeds.Feed{
    59  		Title:       ctx.Tr("home.feed_of", ctx.ContextUser.DisplayName()),
    60  		Link:        &feeds.Link{Href: ctx.ContextUser.HTMLURL()},
    61  		Description: ctxUserDescription,
    62  		Created:     time.Now(),
    63  	}
    64  
    65  	feed.Items, err = feedActionsToFeedItems(ctx, actions)
    66  	if err != nil {
    67  		ctx.ServerError("convert feed", err)
    68  		return
    69  	}
    70  
    71  	writeFeed(ctx, feed, formatType)
    72  }
    73  
    74  // writeFeed write a feeds.Feed as atom or rss to ctx.Resp
    75  func writeFeed(ctx *context.Context, feed *feeds.Feed, formatType string) {
    76  	if formatType == "atom" {
    77  		ctx.Resp.Header().Set("Content-Type", "application/atom+xml;charset=utf-8")
    78  		if err := feed.WriteAtom(ctx.Resp); err != nil {
    79  			ctx.ServerError("Render Atom failed", err)
    80  		}
    81  	} else {
    82  		ctx.Resp.Header().Set("Content-Type", "application/rss+xml;charset=utf-8")
    83  		if err := feed.WriteRss(ctx.Resp); err != nil {
    84  			ctx.ServerError("Render RSS failed", err)
    85  		}
    86  	}
    87  }