diff --git a/src/main/scala/app/ControllerBase.scala b/src/main/scala/app/ControllerBase.scala index d7d7171a2..b4c39ed04 100644 --- a/src/main/scala/app/ControllerBase.scala +++ b/src/main/scala/app/ControllerBase.scala @@ -143,6 +143,9 @@ case class Context(settings: SystemSettingsService.SystemSettings, loginAccount: lazy val currentPath = request.getRequestURI.substring(request.getContextPath.length) + lazy val baseURL = request.getRequestURL.substring(0, request.getRequestURL.length - request.getRequestURI.length) + path + lazy val host = request.getServerName + /** * Get object from cache. * diff --git a/src/main/scala/app/IndexController.scala b/src/main/scala/app/IndexController.scala index 426ec631a..3bc662034 100644 --- a/src/main/scala/app/IndexController.scala +++ b/src/main/scala/app/IndexController.scala @@ -46,6 +46,11 @@ trait IndexControllerBase extends ControllerBase { redirect("/") } + get("/activities.atom"){ + contentType = "application/atom+xml; type=feed" + xml.feed(getRecentActivities()) + } + /** * Set account information into HttpSession and redirect. */ diff --git a/src/main/scala/view/helpers.scala b/src/main/scala/view/helpers.scala index 8e8a61f5e..891bd050d 100644 --- a/src/main/scala/view/helpers.scala +++ b/src/main/scala/view/helpers.scala @@ -15,6 +15,11 @@ object helpers extends AvatarImageProvider with LinkConverter with RequestCache */ def datetime(date: Date): String = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date) + /** + * Format java.util.Date to "yyyy-MM-dd'T'hh:mm:ss'Z'". + */ + def datetimeRFC3339(date: Date): String = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss'Z'").format(date).replaceAll("(\\d\\d)(\\d\\d)$","$1:$2") + /** * Format java.util.Date to "yyyy-MM-dd". */ diff --git a/src/main/twirl/feed.scala.xml b/src/main/twirl/feed.scala.xml new file mode 100644 index 000000000..f870ca3eb --- /dev/null +++ b/src/main/twirl/feed.scala.xml @@ -0,0 +1,30 @@ +@(activities: List[model.Activity])(implicit context: app.Context) +@import context._ +@import view.helpers._ + + @header(activities) + @activities.map { activity => @item(activity) } + + +@header(activities: List[model.Activity]) = {tag:@context.host,2013:gitbucket + Gitbucket's activities + + + Gitbucket + @context.baseURL + + @datetimeRFC3339(activities.map(_.activityDate).max)} + +@item(activity: model.Activity) = { + + tag:@context.host,@date(activity.activityDate):activity:@activity.activityId + @datetimeRFC3339(activity.activityDate) + @datetimeRFC3339(activity.activityDate) + + @activity.activityType + + @activity.activityUserName + @url(activity.activityUserName) + + @activityMessage(activity.message) + } diff --git a/src/main/twirl/helper/activities.scala.html b/src/main/twirl/helper/activities.scala.html index 6e7f324c2..e1458688f 100644 --- a/src/main/twirl/helper/activities.scala.html +++ b/src/main/twirl/helper/activities.scala.html @@ -5,6 +5,9 @@ @if(activities.isEmpty){ No activity } else { +
+ activities +
@activities.map { activity =>
@(activity.activityType match { diff --git a/src/main/webapp/assets/common/images/feed.png b/src/main/webapp/assets/common/images/feed.png new file mode 100644 index 000000000..315c4f4fa Binary files /dev/null and b/src/main/webapp/assets/common/images/feed.png differ