]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Initial upgraded Atom output for group timelines
authorZach Copley <zach@status.net>
Fri, 12 Feb 2010 20:22:12 +0000 (12:22 -0800)
committerZach Copley <zach@status.net>
Fri, 12 Feb 2010 20:24:29 +0000 (12:24 -0800)
actions/apitimelinegroup.php
classes/User_group.php
lib/api.php
lib/atom10feed.php

index fd2ed9ff93f228f2cfcff616278b36ef9f8a6927..45962fa76fefa3a08f0c3e22dbee1154e96326a9 100644 (file)
@@ -109,38 +109,70 @@ class ApiTimelineGroupAction extends ApiPrivateAuthAction
         $title      = sprintf(_("%s timeline"), $this->group->nickname);
         $taguribase = common_config('integration', 'taguri');
         $id         = "tag:$taguribase:GroupTimeline:" . $this->group->id;
-        $link       = common_local_url(
-            'showgroup',
-            array('nickname' => $this->group->nickname)
-        );
+
         $subtitle   = sprintf(
             _('Updates from %1$s on %2$s!'),
             $this->group->nickname,
             $sitename
         );
-        $logo       = ($avatar) ? $avatar : User_group::defaultLogo(AVATAR_PROFILE_SIZE);
+
+        $logo = ($avatar) ? $avatar : User_group::defaultLogo(AVATAR_PROFILE_SIZE);
 
         switch($this->format) {
         case 'xml':
             $this->showXmlTimeline($this->notices);
             break;
         case 'rss':
-            $this->showRssTimeline($this->notices, $title, $link, $subtitle, null, $logo);
-            break;
-        case 'atom':
-            $selfuri = common_root_url() .
-                'api/statusnet/groups/timeline/' .
-                    $this->group->id . '.atom';
-            $this->showAtomTimeline(
+                $this->showRssTimeline(
                 $this->notices,
                 $title,
-                $id,
-                $link,
+                $this->group->homeUrl(),
                 $subtitle,
                 null,
-                $selfuri,
                 $logo
             );
+            break;
+        case 'atom':
+
+            header('Content-Type: application/atom+xml; charset=utf-8');
+
+            try {
+
+                $atom = new AtomNoticeFeed();
+
+                $atom->setId($id);
+                $atom->setTitle($title);
+                $atom->setSubtitle($subtitle);
+                $atom->setLogo($logo);
+                $atom->setUpdated('now');
+
+                $atom->addAuthorRaw($this->group->asAtomAuthor());
+                $atom->setActivitySubject($this->group->asActivitySubject());
+
+                $atom->addLink($this->group->homeUrl());
+
+                $id = $this->arg('id');
+                $aargs = array('format' => 'atom');
+                if (!empty($id)) {
+                    $aargs['id'] = $id;
+                }
+
+                $atom->addLink(
+                    $this->getSelfUri('ApiTimelineGroup', $aargs),
+                    array('rel' => 'self', 'type' => 'application/atom+xml')
+                );
+
+                $atom->addEntryFromNotices($this->notices);
+
+                $this->raw($atom->getString());
+
+            } catch (Atom10FeedException $e) {
+                $this->serverError(
+                    'Could not generate feed for group - ' . $e->getMessage()
+                );
+                return;
+            }
+
             break;
         case 'json':
             $this->showJsonTimeline($this->notices);
index 1fbb50a6eb2b59cbecf7cc02b3768c2ad57f9b31..379e6b7219fb6d84eed97b069d3e6c410c12ba36 100644 (file)
@@ -355,6 +355,39 @@ class User_group extends Memcached_DataObject
         return $xs->getString();
     }
 
+    function asAtomAuthor()
+    {
+        $xs = new XMLStringer(true);
+
+        $xs->elementStart('author');
+        $xs->element('name', null, $this->nickname);
+        $xs->element('uri', null, $this->permalink());
+        $xs->elementEnd('author');
+
+        return $xs->getString();
+    }
+
+    function asActivitySubject()
+    {
+        $xs = new XMLStringer(true);
+
+        $xs->elementStart('activity:subject');
+        $xs->element('activity:object', null, 'http://activitystrea.ms/schema/1.0/group');
+        $xs->element('id', null, $this->permalink());
+        $xs->element('title', null, $this->getBestName());
+        $xs->element(
+            'link', array(
+                'rel'  => 'avatar',
+                'href' =>  empty($this->homepage_logo)
+                    ? User_group::defaultLogo(AVATAR_PROFILE_SIZE)
+                    : $this->homepage_logo
+            )
+        );
+        $xs->elementEnd('activity:subject');
+
+        return $xs->getString();
+    }
+
     static function register($fields) {
 
         // MAGICALLY put fields into current scope
index 8f1fe1ef712c15b9e0c708ab6b84bc9edb778aed..494b595d17881b65fd5d8bcd34a982883798164e 100644 (file)
@@ -1103,7 +1103,7 @@ class ApiAction extends Action
         }
     }
 
-    function serverError($msg, $code = 500, $content_type = 'json')
+    function serverError($msg, $code = 500, $content_type = 'xml')
     {
         $action = $this->trimmed('action');
 
index ccca76a09e2a76cac4e20c08e91c17d01273543c..806a9684b702f8ec4cd40fd4592d5ad3bcfef257 100644 (file)
@@ -51,6 +51,7 @@ class Atom10Feed extends XMLStringer
     public  $xw;
     private $namespaces;
     private $authors;
+    private $subject;
     private $categories;
     private $contributors;
     private $generator;
@@ -74,6 +75,7 @@ class Atom10Feed extends XMLStringer
     function __construct($indent = true) {
         parent::__construct($indent);
         $this->namespaces = array();
+        $this->authors    = array();
         $this->links      = array();
         $this->entries    = array();
         $this->addNamespace('xmlns', 'http://www.w3.org/2005/Atom');
@@ -93,6 +95,64 @@ class Atom10Feed extends XMLStringer
         $this->namespaces = array_merge($this->namespaces, $ns);
     }
 
+    function addAuthor($name, $uri = null, $email = null)
+    {
+        $xs = new XMLStringer(true);
+
+        $xs->elementStart('author');
+
+        if (!empty($name)) {
+            $xs->element('name', null, $name);
+        } else {
+            throw new Atom10FeedException(
+                'author element must contain a name element.'
+            );
+        }
+
+        if (!is_null($uri)) {
+            $xs->element('uri', null, $uri);
+        }
+
+        if (!is_null(email)) {
+            $xs->element('email', null, $email);
+        }
+
+        $xs->elementEnd('author');
+
+        array_push($this->authors, $xs->getString());
+    }
+
+    /**
+     * Add an Author to the feed via raw XML string
+     *
+     * @param string $xmlAuthor An XML string representation author
+     *
+     * @return void
+     */
+    function addAuthorRaw($xmlAuthor)
+    {
+        array_push($this->authors, $xmlAuthor);
+    }
+
+    function renderAuthors()
+    {
+        foreach ($this->authors as $author) {
+            $this->raw($author);
+        }
+    }
+
+    /**
+     * Add a activity feed subject via raw XML string
+     *
+     * @param string $xmlSubject An XML string representation of the subject
+     *
+     * @return void
+     */
+    function setActivitySubject($xmlSubject)
+    {
+        $this->subject = $xmlSubject;
+    }
+
     function getNamespaces()
     {
         return $this->namespaces;
@@ -136,9 +196,9 @@ class Atom10Feed extends XMLStringer
         }
     }
 
-    function addEntryRaw($entry)
+    function addEntryRaw($xmlEntry)
     {
-        array_push($this->entries, $entry);
+        array_push($this->entries, $xmlEntry);
     }
 
     function addEntry($entry)
@@ -164,6 +224,12 @@ class Atom10Feed extends XMLStringer
         $this->validate();
 
         $this->initFeed();
+        $this->renderAuthors();
+
+        if (!empty($this->subject)) {
+            $this->raw($this->subject);
+        }
+
         $this->renderEntries();
         $this->endFeed();