2021-10-16 17:21:16 +03:00
// Copyright 2021 The Gitea Authors. All rights reserved.
2022-11-27 21:20:29 +03:00
// SPDX-License-Identifier: MIT
2021-10-16 17:21:16 +03:00
package feed
import (
"time"
2022-08-25 05:31:57 +03:00
activities_model "code.gitea.io/gitea/models/activities"
2023-04-04 06:39:47 +03:00
"code.gitea.io/gitea/modules/markup"
"code.gitea.io/gitea/modules/markup/markdown"
2024-02-27 10:12:22 +03:00
"code.gitea.io/gitea/services/context"
2021-10-16 17:21:16 +03:00
"github.com/gorilla/feeds"
)
2022-03-26 12:04:22 +03:00
// ShowUserFeedRSS show user activity as RSS feed
func ShowUserFeedRSS ( ctx * context . Context ) {
showUserFeed ( ctx , "rss" )
}
// ShowUserFeedAtom show user activity as Atom feed
func ShowUserFeedAtom ( ctx * context . Context ) {
showUserFeed ( ctx , "atom" )
}
// showUserFeed show user activity as RSS / Atom feed
func showUserFeed ( ctx * context . Context , formatType string ) {
2022-10-08 00:06:04 +03:00
includePrivate := ctx . IsSigned && ( ctx . Doer . IsAdmin || ctx . Doer . ID == ctx . ContextUser . ID )
2023-02-25 00:15:10 +03:00
actions , _ , err := activities_model . GetFeeds ( ctx , activities_model . GetFeedsOptions {
2022-03-26 12:04:22 +03:00
RequestedUser : ctx . ContextUser ,
2022-03-22 10:03:22 +03:00
Actor : ctx . Doer ,
2022-10-08 00:06:04 +03:00
IncludePrivate : includePrivate ,
2022-03-26 12:04:22 +03:00
OnlyPerformedBy : ! ctx . ContextUser . IsOrganization ( ) ,
2021-10-16 17:21:16 +03:00
IncludeDeleted : false ,
Date : ctx . FormString ( "date" ) ,
} )
2022-03-13 19:40:47 +03:00
if err != nil {
ctx . ServerError ( "GetFeeds" , err )
2021-10-16 17:21:16 +03:00
return
}
2023-04-04 06:39:47 +03:00
ctxUserDescription , err := markdown . RenderString ( & markup . RenderContext {
2024-01-15 11:49:24 +03:00
Ctx : ctx ,
Links : markup . Links {
Base : ctx . ContextUser . HTMLURL ( ) ,
} ,
2023-04-04 06:39:47 +03:00
Metas : map [ string ] string {
"user" : ctx . ContextUser . GetDisplayName ( ) ,
} ,
} , ctx . ContextUser . Description )
if err != nil {
ctx . ServerError ( "RenderString" , err )
return
}
2021-10-16 17:21:16 +03:00
feed := & feeds . Feed {
2024-02-15 00:48:45 +03:00
Title : ctx . Locale . TrString ( "home.feed_of" , ctx . ContextUser . DisplayName ( ) ) ,
2022-03-26 12:04:22 +03:00
Link : & feeds . Link { Href : ctx . ContextUser . HTMLURL ( ) } ,
2024-03-01 10:11:51 +03:00
Description : string ( ctxUserDescription ) ,
2021-10-16 17:21:16 +03:00
Created : time . Now ( ) ,
}
feed . Items , err = feedActionsToFeedItems ( ctx , actions )
if err != nil {
ctx . ServerError ( "convert feed" , err )
return
}
writeFeed ( ctx , feed , formatType )
}
// writeFeed write a feeds.Feed as atom or rss to ctx.Resp
func writeFeed ( ctx * context . Context , feed * feeds . Feed , formatType string ) {
if formatType == "atom" {
ctx . Resp . Header ( ) . Set ( "Content-Type" , "application/atom+xml;charset=utf-8" )
if err := feed . WriteAtom ( ctx . Resp ) ; err != nil {
ctx . ServerError ( "Render Atom failed" , err )
}
} else {
ctx . Resp . Header ( ) . Set ( "Content-Type" , "application/rss+xml;charset=utf-8" )
if err := feed . WriteRss ( ctx . Resp ) ; err != nil {
ctx . ServerError ( "Render RSS failed" , err )
}
}
}