sforkowany z mirror/social
saving follows in database
Signed-off-by: Maxence Lange <maxence@artificial-owl.com>alpha1
rodzic
31867cfbb7
commit
ee7e735722
|
@ -35,7 +35,9 @@ return [
|
|||
['name' => 'Local#newPost', 'url' => '/api/v1/post', 'verb' => 'POST'],
|
||||
['name' => 'Local#timeline', 'url' => '/api/v1/timeline', 'verb' => 'GET'],
|
||||
['name' => 'Local#direct', 'url' => '/api/v1/direct', 'verb' => 'PUT'],
|
||||
['name' => 'Local#accountSearch', 'url' => '/api/v1/accounts/search', 'verb' => 'GET'],
|
||||
['name' => 'Local#accountsSearch', 'url' => '/api/v1/accounts/search', 'verb' => 'GET'],
|
||||
['name' => 'Local#accountFollow', 'url' => '/api/v1/account/follow', 'verb' => 'PUT'],
|
||||
['name' => 'Local#accountUnfollow', 'url' => '/api/v1/account/follow', 'verb' => 'DELETE'],
|
||||
['name' => 'Local#actorInfo', 'url' => '/api/v1/actor/info', 'verb' => 'GET']
|
||||
|
||||
]
|
||||
|
|
|
@ -35,6 +35,7 @@ use daita\MySmallPhpTools\Traits\Nextcloud\TNCDataResponse;
|
|||
use Exception;
|
||||
use OCA\Social\AppInfo\Application;
|
||||
use OCA\Social\Model\Post;
|
||||
use OCA\Social\Service\ActivityPub\FollowService;
|
||||
use OCA\Social\Service\ActivityPub\NoteService;
|
||||
use OCA\Social\Service\ActivityPub\PersonService;
|
||||
use OCA\Social\Service\ActorService;
|
||||
|
@ -63,6 +64,9 @@ class LocalController extends Controller {
|
|||
/** @var PersonService */
|
||||
private $personService;
|
||||
|
||||
/** @var FollowService */
|
||||
private $followService;
|
||||
|
||||
/** @var ActorService */
|
||||
private $actorService;
|
||||
|
||||
|
@ -82,15 +86,16 @@ class LocalController extends Controller {
|
|||
* @param IRequest $request
|
||||
* @param string $userId
|
||||
* @param PersonService $personService
|
||||
* @param FollowService $followService
|
||||
* @param ActorService $actorService
|
||||
* @param PostService $postService
|
||||
* @param NoteService $noteService
|
||||
* @param MiscService $miscService
|
||||
*/
|
||||
public function __construct(
|
||||
IRequest $request, string $userId, PersonService $personService, ActorService $actorService,
|
||||
PostService $postService,
|
||||
NoteService $noteService,
|
||||
IRequest $request, string $userId, PersonService $personService,
|
||||
FollowService $followService, ActorService $actorService,
|
||||
PostService $postService, NoteService $noteService,
|
||||
MiscService $miscService
|
||||
) {
|
||||
parent::__construct(Application::APP_NAME, $request);
|
||||
|
@ -99,6 +104,7 @@ class LocalController extends Controller {
|
|||
|
||||
$this->actorService = $actorService;
|
||||
$this->personService = $personService;
|
||||
$this->followService = $followService;
|
||||
$this->postService = $postService;
|
||||
$this->noteService = $noteService;
|
||||
$this->miscService = $miscService;
|
||||
|
@ -189,7 +195,7 @@ class LocalController extends Controller {
|
|||
*
|
||||
* @return DataResponse
|
||||
*/
|
||||
public function accountSearch(string $search): DataResponse {
|
||||
public function accountsSearch(string $search): DataResponse {
|
||||
try {
|
||||
$accounts = $this->personService->searchCachedAccounts($search);
|
||||
|
||||
|
@ -200,6 +206,56 @@ class LocalController extends Controller {
|
|||
}
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
* // TODO: Delete the NoCSRF check
|
||||
*
|
||||
* @NoCSRFRequired
|
||||
* @NoAdminRequired
|
||||
* @NoSubAdminRequired
|
||||
*
|
||||
* @param string $account
|
||||
*
|
||||
* @return DataResponse
|
||||
*/
|
||||
public function accountFollow(string $account): DataResponse {
|
||||
try {
|
||||
$actor = $this->actorService->getActorFromUserId($this->userId);
|
||||
$this->followService->followAccount($actor, $account);
|
||||
|
||||
// $accounts = $this->personService->searchCachedAccounts($account);
|
||||
|
||||
return $this->success([]);
|
||||
} catch (Exception $e) {
|
||||
return $this->fail($e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
* // TODO: Delete the NoCSRF check
|
||||
*
|
||||
* @NoCSRFRequired
|
||||
* @NoAdminRequired
|
||||
* @NoSubAdminRequired
|
||||
*
|
||||
* @param string $account
|
||||
*
|
||||
* @return DataResponse
|
||||
*/
|
||||
public function accountUnfollow(string $account): DataResponse {
|
||||
try {
|
||||
$actor = $this->actorService->getActorFromUserId($this->userId);
|
||||
$this->followService->unfollowAccount($actor, $account);
|
||||
|
||||
return $this->success([]);
|
||||
} catch (Exception $e) {
|
||||
return $this->fail($e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
* // TODO: Delete the NoCSRF check
|
||||
|
|
|
@ -153,6 +153,28 @@ class CoreRequestBuilder {
|
|||
}
|
||||
|
||||
|
||||
/**
|
||||
* Limit the request to the ServiceId
|
||||
*
|
||||
* @param IQueryBuilder $qb
|
||||
* @param string $actorId
|
||||
*/
|
||||
protected function limitToActorId(IQueryBuilder &$qb, string $actorId) {
|
||||
$this->limitToDBField($qb, 'actor_id', $actorId);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Limit the request to the ServiceId
|
||||
*
|
||||
* @param IQueryBuilder $qb
|
||||
* @param string $objectId
|
||||
*/
|
||||
protected function limitToObjectId(IQueryBuilder &$qb, string $objectId) {
|
||||
$this->limitToDBField($qb, 'object_id', $objectId);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Limit the request to the account
|
||||
*
|
||||
|
|
|
@ -32,7 +32,9 @@ namespace OCA\Social\Db;
|
|||
|
||||
|
||||
use Exception;
|
||||
use OCA\Social\Exceptions\FollowDoesNotExistException;
|
||||
use OCA\Social\Model\ActivityPub\Follow;
|
||||
use OCA\Social\Model\ActivityPub\Person;
|
||||
|
||||
|
||||
/**
|
||||
|
@ -47,42 +49,49 @@ class FollowsRequest extends FollowsRequestBuilder {
|
|||
* Insert a new Note in the database.
|
||||
*
|
||||
* @param Follow $follow
|
||||
*
|
||||
* @return int
|
||||
* @throws Exception
|
||||
*/
|
||||
public function save(Follow $follow): int {
|
||||
public function save(Follow $follow) {
|
||||
$qb = $this->getFollowsInsertSql();
|
||||
$qb->setValue('id', $qb->createNamedParameter($follow->getId()))
|
||||
->setValue('actor_id', $qb->createNamedParameter($follow->getActorId()))
|
||||
->setValue('object_id', $qb->createNamedParameter($follow->getObjectId()));
|
||||
|
||||
try {
|
||||
$qb = $this->getFollowsInsertSql();
|
||||
$qb->setValue('id', $qb->createNamedParameter($follow->getId()))
|
||||
->setValue('actor_id', $qb->createNamedParameter($follow->getActorId()))
|
||||
->setValue('object_id', $qb->createNamedParameter($follow->getObjectId()));
|
||||
$qb->execute();
|
||||
}
|
||||
|
||||
$qb->execute();
|
||||
|
||||
return $qb->getLastInsertId();
|
||||
} catch (Exception $e) {
|
||||
throw $e;
|
||||
/**
|
||||
* @param Person $actor
|
||||
* @param Person $remote
|
||||
*
|
||||
* @return Follow
|
||||
* @throws FollowDoesNotExistException
|
||||
*/
|
||||
public function getByPersons(Person $actor, Person $remote) {
|
||||
$qb = $this->getFollowsSelectSql();
|
||||
$this->limitToActorId($qb, $actor->getId());
|
||||
$this->limitToObjectId($qb, $remote->getId());
|
||||
|
||||
$cursor = $qb->execute();
|
||||
$data = $cursor->fetch();
|
||||
$cursor->closeCursor();
|
||||
|
||||
if ($data === false) {
|
||||
throw new FollowDoesNotExistException();
|
||||
}
|
||||
|
||||
return $this->parseFollowsSelectSql($data);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param Follow $follow
|
||||
*
|
||||
* @throws Exception
|
||||
*/
|
||||
public function delete(Follow $follow) {
|
||||
$qb = $this->getFollowsDeleteSql();
|
||||
$this->limitToIdString($qb, $follow->getId());
|
||||
|
||||
try {
|
||||
$qb = $this->getFollowsDeleteSql();
|
||||
$this->limitToIdString($qb, $follow->getId());
|
||||
|
||||
$qb->execute();
|
||||
} catch (Exception $e) {
|
||||
throw $e;
|
||||
}
|
||||
$qb->execute();
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -0,0 +1,8 @@
|
|||
<?php
|
||||
|
||||
namespace OCA\Social\Exceptions;
|
||||
|
||||
class FollowDoesNotExistException extends \Exception {
|
||||
|
||||
}
|
||||
|
|
@ -133,7 +133,6 @@ abstract class ACore implements JsonSerializable {
|
|||
return $this->id;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param string $id
|
||||
*
|
||||
|
@ -145,6 +144,15 @@ abstract class ACore implements JsonSerializable {
|
|||
return $this;
|
||||
}
|
||||
|
||||
public function generateUniqueId(string $base) {
|
||||
$uuid = sprintf(
|
||||
'%04x%04x-%04x-%04x-%04x-%04x%04x%04x', mt_rand(0, 0xffff), mt_rand(0, 0xffff),
|
||||
mt_rand(0, 0xffff), mt_rand(0, 0xfff) | 0x4000, mt_rand(0, 0x3fff) | 0x8000,
|
||||
mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff)
|
||||
);
|
||||
|
||||
$this->setId($base . '/' . $uuid);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
|
|
|
@ -33,10 +33,14 @@ namespace OCA\Social\Service\ActivityPub;
|
|||
|
||||
use Exception;
|
||||
use OCA\Social\Db\FollowsRequest;
|
||||
use OCA\Social\Exceptions\FollowDoesNotExistException;
|
||||
use OCA\Social\Exceptions\RequestException;
|
||||
use OCA\Social\Exceptions\SocialAppConfigException;
|
||||
use OCA\Social\Model\ActivityPub\ACore;
|
||||
use OCA\Social\Model\ActivityPub\Person;
|
||||
use OCA\Social\Model\ActivityPub\Follow;
|
||||
use OCA\Social\Model\ActivityPub\OrderedCollection;
|
||||
use OCA\Social\Model\ActivityPub\Person;
|
||||
use OCA\Social\Service\ConfigService;
|
||||
use OCA\Social\Service\ICoreService;
|
||||
use OCA\Social\Service\MiscService;
|
||||
|
||||
|
@ -47,6 +51,12 @@ class FollowService implements ICoreService {
|
|||
/** @var FollowsRequest */
|
||||
private $followsRequest;
|
||||
|
||||
/** @var PersonService */
|
||||
private $personService;
|
||||
|
||||
/** @var ConfigService */
|
||||
private $configService;
|
||||
|
||||
/** @var MiscService */
|
||||
private $miscService;
|
||||
|
||||
|
@ -55,14 +65,60 @@ class FollowService implements ICoreService {
|
|||
* NoteService constructor.
|
||||
*
|
||||
* @param FollowsRequest $followsRequest
|
||||
* @param PersonService $personService
|
||||
* @param ConfigService $configService
|
||||
* @param MiscService $miscService
|
||||
*/
|
||||
public function __construct(FollowsRequest $followsRequest, MiscService $miscService) {
|
||||
public function __construct(
|
||||
FollowsRequest $followsRequest, PersonService $personService, ConfigService $configService,
|
||||
MiscService $miscService
|
||||
) {
|
||||
$this->followsRequest = $followsRequest;
|
||||
$this->personService = $personService;
|
||||
$this->configService = $configService;
|
||||
$this->miscService = $miscService;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param Person $actor
|
||||
* @param string $account
|
||||
*
|
||||
* @throws RequestException
|
||||
* @throws SocialAppConfigException
|
||||
*/
|
||||
public function followAccount(Person $actor, string $account) {
|
||||
$remoteActor = $this->personService->getFromAccount($account);
|
||||
$follow = new Follow();
|
||||
$follow->generateUniqueId($this->configService->getCloudAddress());
|
||||
$follow->setActorId($actor->getId());
|
||||
$follow->setObjectId($remoteActor->getId());
|
||||
|
||||
try {
|
||||
$this->followsRequest->getByPersons($actor, $remoteActor);
|
||||
} catch (FollowDoesNotExistException $e) {
|
||||
$this->followsRequest->save($follow);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param Person $actor
|
||||
* @param string $account
|
||||
*
|
||||
* @throws RequestException
|
||||
*/
|
||||
public function unfollowAccount(Person $actor, string $account) {
|
||||
$remoteActor = $this->personService->getFromAccount($account);
|
||||
|
||||
try {
|
||||
$follow = $this->followsRequest->getByPersons($actor, $remoteActor);
|
||||
$this->followsRequest->delete($follow);
|
||||
} catch (FollowDoesNotExistException $e) {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param Person $actor
|
||||
*
|
||||
|
|
|
@ -234,7 +234,7 @@ class ConfigService {
|
|||
return $result;
|
||||
}
|
||||
|
||||
return $address;
|
||||
return $this->withoutEndSlash($address, false, false);
|
||||
}
|
||||
|
||||
|
||||
|
@ -243,7 +243,7 @@ class ConfigService {
|
|||
* @throws SocialAppConfigException
|
||||
*/
|
||||
public function getRoot(): string {
|
||||
return $this->withoutEndSlash($this->getCloudAddress(), false, false) . '/apps/social/';
|
||||
return $this->getCloudAddress() . '/apps/social/';
|
||||
}
|
||||
|
||||
|
||||
|
|
Ładowanie…
Reference in New Issue