diff options
author | Maxence Lange <maxence@artificial-owl.com> | 2019-09-27 07:26:20 +0200 |
---|---|---|
committer | Maxence Lange <maxence@artificial-owl.com> | 2019-09-27 07:26:20 +0200 |
commit | d9700dc2dacf3c68ba47a05e5197fad3ddcc8de3 (patch) | |
tree | 81dad39676416f5fcd20cea6f659e306b6211f4f /lib | |
parent | e0e26d9a4971406c9e68c94a8c7800a31dc73fcd (diff) |
new sql structure + write requests
Signed-off-by: Maxence Lange <maxence@artificial-owl.com>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Db/StreamActionsRequest.php | 22 | ||||
-rw-r--r-- | lib/Migration/Version0002Date20190925000001.php | 167 | ||||
-rw-r--r-- | lib/Model/StreamAction.php | 5 | ||||
-rw-r--r-- | lib/Service/BoostService.php | 6 | ||||
-rw-r--r-- | lib/Service/LikeService.php | 8 |
5 files changed, 197 insertions, 11 deletions
diff --git a/lib/Db/StreamActionsRequest.php b/lib/Db/StreamActionsRequest.php index b1e4d84a..5242b98d 100644 --- a/lib/Db/StreamActionsRequest.php +++ b/lib/Db/StreamActionsRequest.php @@ -50,14 +50,23 @@ class StreamActionsRequest extends StreamActionsRequestBuilder { */ public function create(StreamAction $action) { $qb = $this->getStreamActionInsertSql(); + + $values = $action->getValues(); $qb->setValue('actor_id', $qb->createNamedParameter($action->getActorId())) ->setValue('actor_id_prim', $qb->createNamedParameter($this->prim($action->getActorId()))) ->setValue('stream_id', $qb->createNamedParameter($action->getStreamId())) ->setValue('stream_id_prim', $qb->createNamedParameter($this->prim($action->getStreamId()))) ->setValue( 'values', $qb->createNamedParameter( - json_encode($action->getValues(), JSON_UNESCAPED_SLASHES) + json_encode($values, JSON_UNESCAPED_SLASHES) + ) + ) + ->setValue('liked', $qb->createNamedParameter($this->getBool(StreamAction::LIKED, $values, false))) + ->setValue( + 'boosted', $qb->createNamedParameter($this->getBool(StreamAction::BOOSTED, $values, false)) ) + ->setValue( + 'replied', $qb->createNamedParameter($this->getBool(StreamAction::REPLIED, $values, false)) ); $qb->execute(); @@ -74,13 +83,18 @@ class StreamActionsRequest extends StreamActionsRequestBuilder { public function update(StreamAction $action): int { $qb = $this->getStreamActionUpdateSql(); - $values = json_encode($action->getValues(), JSON_UNESCAPED_SLASHES); - $qb->set('values', $qb->createNamedParameter($values)); + $values = $action->getValues(); + $qb->set('values', $qb->createNamedParameter(json_encode($values, JSON_UNESCAPED_SLASHES))) + ->set('liked', $qb->createNamedParameter($this->getBool(StreamAction::LIKED, $values, false))) + ->set('boosted', $qb->createNamedParameter($this->getBool(StreamAction::BOOSTED, $values, false))) + ->set('replied', $qb->createNamedParameter($this->getBool(StreamAction::REPLIED, $values, false))); $this->limitToActorId($qb, $action->getActorId()); $this->limitToStreamId($qb, $action->getStreamId()); - return $qb->execute(); + $count = $qb->execute(); + + return $count; } diff --git a/lib/Migration/Version0002Date20190925000001.php b/lib/Migration/Version0002Date20190925000001.php new file mode 100644 index 00000000..606bf810 --- /dev/null +++ b/lib/Migration/Version0002Date20190925000001.php @@ -0,0 +1,167 @@ +<?php +declare(strict_types=1); + + +/** + * Nextcloud - Social Support + * + * This file is licensed under the Affero General Public License version 3 or + * later. See the COPYING file. + * + * @author Maxence Lange <maxence@artificial-owl.com> + * @copyright 2018, Maxence Lange <maxence@artificial-owl.com> + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + + +namespace OCA\Social\Migration; + + +use Closure; +use Doctrine\DBAL\Exception\UniqueConstraintViolationException; +use Doctrine\DBAL\Schema\SchemaException; +use Exception; +use OCP\DB\ISchemaWrapper; +use OCP\IDBConnection; +use OCP\Migration\IOutput; +use OCP\Migration\SimpleMigrationStep; + + +/** + * Class Version0002Date20190925000001 + * + * @package OCA\Social\Migration + */ +class Version0002Date20190925000001 extends SimpleMigrationStep { + + + /** @var IDBConnection */ + private $connection; + + + /** + * @param IDBConnection $connection + */ + public function __construct(IDBConnection $connection) { + $this->connection = $connection; + } + + + /** + * @param IOutput $output + * @param Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper` + * @param array $options + * + * @return ISchemaWrapper + * @throws SchemaException + */ + public function changeSchema(IOutput $output, Closure $schemaClosure, array $options + ): ISchemaWrapper { + /** @var ISchemaWrapper $schema */ + $schema = $schemaClosure(); + + $table = $schema->getTable('social_a2_stream_action'); + if (!$table->hasColumn('liked')) { + $table->addColumn('liked', 'boolean'); + } + if (!$table->hasColumn('boosted')) { + $table->addColumn('boosted', 'boolean'); + } + if (!$table->hasColumn('replied')) { + $table->addColumn('replied', 'boolean'); + } + + return $schema; + } + + + /** + * @param IOutput $output + * @param Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper` + * @param array $options + * + * @throws Exception + */ + public function postSchemaChange(IOutput $output, Closure $schemaClosure, array $options) { + /** @var ISchemaWrapper $schema */ + $schema = $schemaClosure(); + + $this->fillTableStreamActions($schema); + } + + /** + * @param ISchemaWrapper $schema + */ + private function fillTableStreamActions(ISchemaWrapper $schema) { + + $start = 0; + $limit = 1000; + while (true) { + $qb = $this->connection->getQueryBuilder(); + $qb->select('id', 'actor_id', 'stream_id', 'values') + ->from('social_a2_stream_action') + ->setMaxResults(1000) + ->setFirstResult($start); + + $cursor = $qb->execute(); + $count = 0; + while ($data = $cursor->fetch()) { + $count++; + + $this->updateStreamActions($data); + } + $cursor->closeCursor(); + + $start += $count; + if ($count < $limit) { + break; + } + } + } + + + /** + * @param array $data + */ + private function updateStreamActions(array $data) { + $update = $this->connection->getQueryBuilder(); + $update->update('social_a2_stream_action'); + + $id = $data['id']; + $actorId = $data['actor_id']; + $streamId = $data['stream_id']; + + $values = json_decode($data['values'], true); + $liked = (int)((array_key_exists('liked', $values)) ? $values['liked'] : 0); + $boosted = (int)((array_key_exists('boosted', $values)) ? $values['boosted'] : 0); + $replied = (int)((array_key_exists('replied', $values)) ? $values['replied'] : 0); + + $update->set('actor_id_prim', $update->createNamedParameter(hash('sha512', $actorId))); + $update->set('stream_id_prim', $update->createNamedParameter(hash('sha512', $streamId))); + $update->set('liked', $update->createNamedParameter($liked)); + $update->set('boosted', $update->createNamedParameter($boosted)); + $update->setValue('replied', $update->createNamedParameter($replied)); + + $expr = $update->expr(); + $update->where($expr->eq('id', $update->createNamedParameter($id))); + try { + $update->execute(); + } catch (UniqueConstraintViolationException $e) { + } + } + +} diff --git a/lib/Model/StreamAction.php b/lib/Model/StreamAction.php index 4235960d..798e1d86 100644 --- a/lib/Model/StreamAction.php +++ b/lib/Model/StreamAction.php @@ -48,6 +48,11 @@ class StreamAction implements JsonSerializable { use TStringTools; + const LIKED = 'liked'; + const BOOSTED = 'boosted'; + const REPLIED = 'replied'; + + /** @var integer */ private $id = 0; diff --git a/lib/Service/BoostService.php b/lib/Service/BoostService.php index b865266e..499d2c50 100644 --- a/lib/Service/BoostService.php +++ b/lib/Service/BoostService.php @@ -34,7 +34,6 @@ use daita\MySmallPhpTools\Traits\TStringTools; use Exception; use OCA\Social\AP; use OCA\Social\Db\StreamRequest; -use OCA\Social\Exceptions\ItemNotFoundException; use OCA\Social\Exceptions\ItemUnknownException; use OCA\Social\Exceptions\SocialAppConfigException; use OCA\Social\Exceptions\StreamNotFoundException; @@ -44,6 +43,7 @@ use OCA\Social\Model\ActivityPub\Actor\Person; use OCA\Social\Model\ActivityPub\Object\Announce; use OCA\Social\Model\ActivityPub\Object\Note; use OCA\Social\Model\ActivityPub\Stream; +use OCA\Social\Model\StreamAction; /** @@ -143,7 +143,7 @@ class BoostService { $interface->save($announce); - $this->streamActionService->setActionBool($actor->getId(), $postId, 'boosted', true); + $this->streamActionService->setActionBool($actor->getId(), $postId, StreamAction::BOOSTED, true); $this->signatureService->signObject($actor, $announce); $token = $this->activityService->request($announce); @@ -205,7 +205,7 @@ class BoostService { } catch (StreamNotFoundException $e) { } - $this->streamActionService->setActionBool($actor->getId(), $postId, 'boosted', false); + $this->streamActionService->setActionBool($actor->getId(), $postId, StreamAction::BOOSTED, false); return $undo; } diff --git a/lib/Service/LikeService.php b/lib/Service/LikeService.php index 67600eb4..11f89b4b 100644 --- a/lib/Service/LikeService.php +++ b/lib/Service/LikeService.php @@ -40,13 +40,13 @@ use OCA\Social\Exceptions\ItemUnknownException; use OCA\Social\Exceptions\SocialAppConfigException; use OCA\Social\Exceptions\StreamNotFoundException; use OCA\Social\Model\ActivityPub\ACore; -use OCA\Social\Model\ActivityPub\Object\Like; use OCA\Social\Model\ActivityPub\Activity\Undo; use OCA\Social\Model\ActivityPub\Actor\Person; -use OCA\Social\Model\ActivityPub\Object\Announce; +use OCA\Social\Model\ActivityPub\Object\Like; use OCA\Social\Model\ActivityPub\Object\Note; use OCA\Social\Model\ActivityPub\Stream; use OCA\Social\Model\InstancePath; +use OCA\Social\Model\StreamAction; /** @@ -139,7 +139,7 @@ class LikeService { $interface = AP::$activityPub->getInterfaceFromType(Like::TYPE); $interface->save($like); - $this->streamActionService->setActionBool($actor->getId(), $postId, 'liked', true); + $this->streamActionService->setActionBool($actor->getId(), $postId, StreamAction::LIKED, true); $token = $this->activityService->request($like); return $like; @@ -198,7 +198,7 @@ class LikeService { } catch (ItemNotFoundException $e) { } - $this->streamActionService->setActionBool($actor->getId(), $postId, 'liked', false); + $this->streamActionService->setActionBool($actor->getId(), $postId, StreamAction::LIKED, false); return $undo; } |