#37: Use public database interface; fixes graupel on ownCloud 9
[grauphel.git] / controller / apicontroller.php
index 7f6bc67d7e9391977cdfaad2107e0cb8fddfe3ad..23a47e796abc0fff201ccde79bb046561137edd0 100644 (file)
@@ -16,8 +16,10 @@ namespace OCA\Grauphel\Controller;
 use \OCP\AppFramework\Controller;
 use \OCP\AppFramework\Http\JSONResponse;
 
 use \OCP\AppFramework\Controller;
 use \OCP\AppFramework\Http\JSONResponse;
 
+use \OCA\Grauphel\Lib\Client;
 use \OCA\Grauphel\Lib\NoteStorage;
 use \OCA\Grauphel\Lib\OAuth;
 use \OCA\Grauphel\Lib\NoteStorage;
 use \OCA\Grauphel\Lib\OAuth;
+use \OCA\Grauphel\Lib\OAuthException;
 use \OCA\Grauphel\Lib\Dependencies;
 use \OCA\Grauphel\Lib\Response\ErrorResponse;
 
 use \OCA\Grauphel\Lib\Dependencies;
 use \OCA\Grauphel\Lib\Response\ErrorResponse;
 
@@ -34,13 +36,13 @@ use \OCA\Grauphel\Lib\Response\ErrorResponse;
  */
 class ApiController extends Controller
 {
  */
 class ApiController extends Controller
 {
-       /**
-        * constructor of the controller
+    /**
+     * constructor of the controller
      *
      *
-        * @param string   $appName Name of the app
-        * @param IRequest $request Instance of the request
-        */
-       public function __construct($appName, \OCP\IRequest $request, $user)
+     * @param string   $appName Name of the app
+     * @param IRequest $request Instance of the request
+     */
+    public function __construct($appName, \OCP\IRequest $request, $user)
     {
         parent::__construct($appName, $request);
         $this->user  = $user;
     {
         parent::__construct($appName, $request);
         $this->user  = $user;
@@ -67,7 +69,7 @@ class ApiController extends Controller
         $urlGen = $deps->urlGen;
 
         try {
         $urlGen = $deps->urlGen;
 
         try {
-            $provider = new \OAuthProvider();
+            $provider = OAuth::getProvider();
             $oauth->registerHandler($provider)
                 ->registerAccessTokenHandler($provider);
             $provider->checkOAuthRequest(
             $oauth->registerHandler($provider)
                 ->registerAccessTokenHandler($provider);
             $provider->checkOAuthRequest(
@@ -79,7 +81,7 @@ class ApiController extends Controller
             $token = $deps->tokens->load('access', $provider->token);
             $username = $token->user;
 
             $token = $deps->tokens->load('access', $provider->token);
             $username = $token->user;
 
-        } catch (\OAuth_Exception $e) {
+        } catch (OAuthException $e) {
             return new ErrorResponse($e->getMessage());
         } catch (\OAuthException $e) {
             if ($e->getCode() != OAUTH_PARAMETER_ABSENT) {
             return new ErrorResponse($e->getMessage());
         } catch (\OAuthException $e) {
             if ($e->getCode() != OAUTH_PARAMETER_ABSENT) {
@@ -104,6 +106,12 @@ class ApiController extends Controller
             'api-version' => '1.0',
         );
 
             'api-version' => '1.0',
         );
 
+        $cl = new Client();
+        $client = $cl->getClient();
+        if ($client !== false) {
+            $data['oauth_authorize_url'] .= '?client=' . urlencode($client);
+        }
+
         if ($authenticated) {
             $data['user-ref'] = array(
                 'api-ref' => $urlGen->getAbsoluteURL(
         if ($authenticated) {
             $data['user-ref'] = array(
                 'api-ref' => $urlGen->getAbsoluteURL(
@@ -111,7 +119,7 @@ class ApiController extends Controller
                         'grauphel.api.user', array('username' => $username)
                     )
                 ),
                         'grauphel.api.user', array('username' => $username)
                     )
                 ),
-                'href' => null,//FIXME
+                'href' => null,
             );
         }
 
             );
         }
 
@@ -147,7 +155,7 @@ class ApiController extends Controller
                 )
             )
         );
                 )
             )
         );
-        $syncdata = $this->notes->loadSyncData($username);
+        $syncdata = $this->notes->loadSyncData();
 
         $data = array(
             'user-name'  => $username,
 
         $data = array(
             'user-name'  => $username,
@@ -159,7 +167,9 @@ class ApiController extends Controller
                         'grauphel.api.notes', array('username' => $username)
                     )
                 ),
                         'grauphel.api.notes', array('username' => $username)
                     )
                 ),
-                'href'    => null,
+                'href'    => $this->deps->urlGen->getAbsoluteURL(
+                    $this->deps->urlGen->linkToRoute('grauphel.gui.index')
+                ),
             ),
             'latest-sync-revision' => $syncdata->latestSyncRevision,
             'current-sync-guid'    => $syncdata->currentSyncGuid,
             ),
             'latest-sync-revision' => $syncdata->latestSyncRevision,
             'current-sync-guid'    => $syncdata->currentSyncGuid,
@@ -184,8 +194,8 @@ class ApiController extends Controller
                 )
             )
         );
                 )
             )
         );
-        $syncdata = $this->notes->loadSyncData($username);
-        return $this->fetchNotes($username, $syncdata);
+        $syncdata = $this->notes->loadSyncData();
+        return $this->fetchNotes($syncdata);
     }
 
     /**
     }
 
     /**
@@ -205,17 +215,17 @@ class ApiController extends Controller
                 )
             )
         );
                 )
             )
         );
-        $syncdata = $this->notes->loadSyncData($username);
-        
+        $syncdata = $this->notes->loadSyncData();
+
         $res = $this->handleNoteSave($username, $syncdata);
         if ($res instanceof \OCP\AppFramework\Http\Response) {
             return $res;
         }
 
         $res = $this->handleNoteSave($username, $syncdata);
         if ($res instanceof \OCP\AppFramework\Http\Response) {
             return $res;
         }
 
-        return $this->fetchNotes($username, $syncdata);
+        return $this->fetchNotes($syncdata);
     }
 
     }
 
-    protected function fetchNotes($username, $syncdata)
+    protected function fetchNotes($syncdata)
     {
         $since = null;
         if (isset($_GET['since'])) {
     {
         $since = null;
         if (isset($_GET['since'])) {
@@ -223,9 +233,9 @@ class ApiController extends Controller
         }
 
         if (isset($_GET['include_notes']) && $_GET['include_notes']) {
         }
 
         if (isset($_GET['include_notes']) && $_GET['include_notes']) {
-            $notes = $this->notes->loadNotesFull($username, $since);
+            $notes = $this->notes->loadNotesFull($since);
         } else {
         } else {
-            $notes = $this->notes->loadNotesOverview($username, $since);
+            $notes = $this->notes->loadNotesOverview($since);
         }
 
         //work around bug https://bugzilla.gnome.org/show_bug.cgi?id=734313
         }
 
         //work around bug https://bugzilla.gnome.org/show_bug.cgi?id=734313
@@ -248,8 +258,8 @@ class ApiController extends Controller
             return;
         }
 
             return;
         }
 
-        //note that we have more data in $arPut than just our JSON
-        // request object merges it with other data
+        //Note that we have more data in $arPut than just our JSON.
+        // The request object merges it with other data.
         $arPut = $this->request->put;
 
         //structural validation
         $arPut = $this->request->put;
 
         //structural validation
@@ -277,23 +287,31 @@ class ApiController extends Controller
         }
 
         //update
         }
 
         //update
-        ++$syncdata->latestSyncRevision;
-        foreach ($arPut['note-changes'] as $noteUpdate) {
-            //owncloud converts object to array, so we reverse
-            $noteUpdate = (object) $noteUpdate;
-
-            $note = $this->notes->load($username, $noteUpdate->guid);
-            if (isset($noteUpdate->command) && $noteUpdate->command == 'delete') {
-                $this->notes->delete($username, $noteUpdate->guid);
-            } else {
-                $this->notes->update(
-                    $note, $noteUpdate, $syncdata->latestSyncRevision
-                );
-                $this->notes->save($username, $note);
+        $db = \OC::$server->getDatabaseConnection();
+        $db->beginTransaction();
+        try {
+            ++$syncdata->latestSyncRevision;
+            foreach ($arPut['note-changes'] as $noteUpdate) {
+                //owncloud converts object to array, so we reverse
+                $noteUpdate = (object) $noteUpdate;
+
+                $note = $this->notes->load($noteUpdate->guid);
+                if (isset($noteUpdate->command) && $noteUpdate->command == 'delete') {
+                    $this->notes->delete($noteUpdate->guid);
+                } else {
+                    $this->notes->update(
+                        $note, $noteUpdate, $syncdata->latestSyncRevision
+                    );
+                    $this->notes->save($note);
+                }
             }
             }
-        }
 
 
-        $this->notes->saveSyncData($username, $syncdata);
+            $this->notes->saveSyncData($syncdata);
+            $db->commit();
+        } catch (\DatabaseException $e) {
+            $db->rollBack();
+            throw $e;
+        }
     }
 
     /**
     }
 
     /**
@@ -303,17 +321,19 @@ class ApiController extends Controller
      * @NoCSRFRequired
      * @PublicPage
      */
      * @NoCSRFRequired
      * @PublicPage
      */
-    public function note()
+    public function note($username, $guid)
     {
     {
-        //FIXME
-        $deps = Dependencies::get();
-        $username = $deps->urlGen->loadUsername();
-        $guid     = $deps->urlGen->loadGuid();
-        $oauth = new \OAuth();
-        $oauth->setDeps($deps);
-        $oauth->verifyOAuthUser($username, $deps->urlGen->note($username, $guid));
+        $this->verifyUser(
+            $username,
+            $this->deps->urlGen->getAbsoluteURL(
+                $this->deps->urlGen->linkToRoute(
+                    'grauphel.api.note',
+                    array('username' => $username, 'guid' => $guid)
+                )
+            )
+        );
 
 
-        $note = $this->notes->load($username, $guid, false);
+        $note = $this->notes->load($guid, false);
         if ($note === null) {
             header('HTTP/1.0 404 Not Found');
             header('Content-type: text/plain');
         if ($note === null) {
             header('HTTP/1.0 404 Not Found');
             header('Content-type: text/plain');
@@ -321,8 +341,7 @@ class ApiController extends Controller
             exit(1);
         }
 
             exit(1);
         }
 
-        $data = array('note' => array($note));
-        $deps->renderer->sendJson($data);
+        return new JSONResponse($note);
     }
 
     /**
     }
 
     /**
@@ -334,13 +353,17 @@ class ApiController extends Controller
      */
     protected function verifyUser($username, $curUrl)
     {
      */
     protected function verifyUser($username, $curUrl)
     {
-        if ($this->user !== null && $this->user->getUID() == $username) {
+        if ($this->user !== null && $this->user->getUid() == $username) {
+            $this->notes->setUsername($username);
             return true;
         }
 
         $oauth = new OAuth();
         $oauth->setDeps($this->deps);
         $oauth->verifyOAuthUser($username, $curUrl);
             return true;
         }
 
         $oauth = new OAuth();
         $oauth->setDeps($this->deps);
         $oauth->verifyOAuthUser($username, $curUrl);
+
+        $this->notes->setUsername($username);
+        return true;
     }
 }
 ?>
     }
 }
 ?>