kopia lustrzana https://github.com/friendica/friendica
				
				
				
			Update the Introductions domain to use repository, model and collection
							rodzic
							
								
									5a1abb8c7d
								
							
						
					
					
						commit
						6b8db5ad13
					
				| 
						 | 
					@ -31,14 +31,14 @@ function notifications_post(App $a)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if ($request_id) {
 | 
						if ($request_id) {
 | 
				
			||||||
		$Intro = DI::intro()->fetch(['id' => $request_id, 'uid' => local_user()]);
 | 
							$intro = DI::intro()->selectFirst(['id' => $request_id, 'uid' => local_user()]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		switch ($_POST['submit']) {
 | 
							switch ($_POST['submit']) {
 | 
				
			||||||
			case L10n::t('Discard'):
 | 
								case L10n::t('Discard'):
 | 
				
			||||||
				$Intro->discard();
 | 
									$intro->discard();
 | 
				
			||||||
				break;
 | 
									break;
 | 
				
			||||||
			case L10n::t('Ignore'):
 | 
								case L10n::t('Ignore'):
 | 
				
			||||||
				$Intro->ignore();
 | 
									$intro->ignore();
 | 
				
			||||||
				break;
 | 
									break;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,14 @@
 | 
				
			||||||
 | 
					<?php
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Friendica\Collection;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use Friendica\BaseCollection;
 | 
				
			||||||
 | 
					use Friendica\Model\Introduction;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @property Introduction[] $models
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					class Introductions extends BaseCollection
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -33,7 +33,7 @@ use Psr\Log\LoggerInterface;
 | 
				
			||||||
 * @method static Factory\Mastodon\Relationship mstdnRelationship()
 | 
					 * @method static Factory\Mastodon\Relationship mstdnRelationship()
 | 
				
			||||||
 * @method static Model\User\Cookie cookie()
 | 
					 * @method static Model\User\Cookie cookie()
 | 
				
			||||||
 * @method static Model\Notify notify()
 | 
					 * @method static Model\Notify notify()
 | 
				
			||||||
 * @method static Model\Introduction intro()
 | 
					 * @method static Repository\Introduction intro()
 | 
				
			||||||
 * @method static Protocol\Activity activity()
 | 
					 * @method static Protocol\Activity activity()
 | 
				
			||||||
 * @method static Util\ACLFormatter aclFormatter()
 | 
					 * @method static Util\ACLFormatter aclFormatter()
 | 
				
			||||||
 * @method static Util\DateTimeFormat dtFormat()
 | 
					 * @method static Util\DateTimeFormat dtFormat()
 | 
				
			||||||
| 
						 | 
					@ -70,7 +70,7 @@ abstract class DI
 | 
				
			||||||
		'mstdnRelationship'  => Factory\Mastodon\Relationship::class,
 | 
							'mstdnRelationship'  => Factory\Mastodon\Relationship::class,
 | 
				
			||||||
		'cookie'       => Model\User\Cookie::class,
 | 
							'cookie'       => Model\User\Cookie::class,
 | 
				
			||||||
		'notify'       => Model\Notify::class,
 | 
							'notify'       => Model\Notify::class,
 | 
				
			||||||
		'intro'        => Model\Introduction::class,
 | 
							'intro'        => Repository\Introduction::class,
 | 
				
			||||||
		'activity'     => Protocol\Activity::class,
 | 
							'activity'     => Protocol\Activity::class,
 | 
				
			||||||
		'aclFormatter' => Util\ACLFormatter::class,
 | 
							'aclFormatter' => Util\ACLFormatter::class,
 | 
				
			||||||
		'dtFormat'     => Util\DateTimeFormat::class,
 | 
							'dtFormat'     => Util\DateTimeFormat::class,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -23,17 +23,17 @@ class FollowRequest extends BaseFactory
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/**
 | 
						/**
 | 
				
			||||||
	 * @param Introduction $Introduction
 | 
						 * @param Introduction $introduction
 | 
				
			||||||
	 * @return \Friendica\Api\Entity\Mastodon\FollowRequest
 | 
						 * @return \Friendica\Api\Entity\Mastodon\FollowRequest
 | 
				
			||||||
	 * @throws HTTPException\InternalServerErrorException
 | 
						 * @throws HTTPException\InternalServerErrorException
 | 
				
			||||||
	 * @throws \ImagickException
 | 
						 * @throws \ImagickException
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	public function createFromIntroduction(Introduction $Introduction)
 | 
						public function createFromIntroduction(Introduction $introduction)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		$cdata = Contact::getPublicAndUserContacID($Introduction->{'contact-id'}, $Introduction->uid);
 | 
							$cdata = Contact::getPublicAndUserContacID($introduction->{'contact-id'}, $introduction->uid);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (empty($cdata)) {
 | 
							if (empty($cdata)) {
 | 
				
			||||||
			$this->logger->warning('Wrong introduction data', ['Introduction' => $Introduction]);
 | 
								$this->logger->warning('Wrong introduction data', ['Introduction' => $introduction]);
 | 
				
			||||||
			throw new HTTPException\InternalServerErrorException('Wrong introduction data');
 | 
								throw new HTTPException\InternalServerErrorException('Wrong introduction data');
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -42,6 +42,6 @@ class FollowRequest extends BaseFactory
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		$apcontact = APContact::getByURL($publicContact['url'], false);
 | 
							$apcontact = APContact::getByURL($publicContact['url'], false);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		return new \Friendica\Api\Entity\Mastodon\FollowRequest($this->baseUrl, $Introduction->id, $publicContact, $apcontact, $userContact);
 | 
							return new \Friendica\Api\Entity\Mastodon\FollowRequest($this->baseUrl, $introduction->id, $publicContact, $apcontact, $userContact);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,10 +4,13 @@ namespace Friendica\Model;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use Friendica\BaseModel;
 | 
					use Friendica\BaseModel;
 | 
				
			||||||
use Friendica\Core\Protocol;
 | 
					use Friendica\Core\Protocol;
 | 
				
			||||||
 | 
					use Friendica\Database\Database;
 | 
				
			||||||
use Friendica\Network\HTTPException;
 | 
					use Friendica\Network\HTTPException;
 | 
				
			||||||
use Friendica\Protocol\ActivityPub;
 | 
					use Friendica\Protocol\ActivityPub;
 | 
				
			||||||
use Friendica\Protocol\Diaspora;
 | 
					use Friendica\Protocol\Diaspora;
 | 
				
			||||||
 | 
					use Friendica\Repository;
 | 
				
			||||||
use Friendica\Util\DateTimeFormat;
 | 
					use Friendica\Util\DateTimeFormat;
 | 
				
			||||||
 | 
					use Psr\Log\LoggerInterface;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * @property int    uid
 | 
					 * @property int    uid
 | 
				
			||||||
| 
						 | 
					@ -20,33 +23,40 @@ use Friendica\Util\DateTimeFormat;
 | 
				
			||||||
 * @property string datetime
 | 
					 * @property string datetime
 | 
				
			||||||
 * @property bool   blocked
 | 
					 * @property bool   blocked
 | 
				
			||||||
 * @property bool   ignored
 | 
					 * @property bool   ignored
 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * @package Friendica\Model
 | 
					 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
final class Introduction extends BaseModel
 | 
					final class Introduction extends BaseModel
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	static $table_name = 'intro';
 | 
						/** @var Repository\Introduction */
 | 
				
			||||||
 | 
						protected $intro;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public function __construct(Database $dba, LoggerInterface $logger, Repository\Introduction $intro, array $data = [])
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							parent::__construct($dba, $logger, $data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							$this->intro = $intro;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/**
 | 
						/**
 | 
				
			||||||
	 * Confirms a follow request and sends a notic to the remote contact.
 | 
						 * Confirms a follow request and sends a notice to the remote contact.
 | 
				
			||||||
	 *
 | 
						 *
 | 
				
			||||||
	 * @param bool      $duplex Is it a follow back?
 | 
						 * @param bool               $duplex       Is it a follow back?
 | 
				
			||||||
	 * @param bool|null $hidden Should this contact be hidden? null = no change
 | 
						 * @param bool|null          $hidden       Should this contact be hidden? null = no change
 | 
				
			||||||
 | 
						 * @return bool
 | 
				
			||||||
	 * @throws HTTPException\InternalServerErrorException
 | 
						 * @throws HTTPException\InternalServerErrorException
 | 
				
			||||||
	 * @throws \ImagickException
 | 
					 | 
				
			||||||
	 * @throws HTTPException\NotFoundException
 | 
						 * @throws HTTPException\NotFoundException
 | 
				
			||||||
 | 
						 * @throws \ImagickException
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	public function confirm(bool $duplex = false, bool $hidden = null)
 | 
						public function confirm(bool $duplex = false, bool $hidden = null)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		$this->logger->info('Confirming follower', ['cid' => $this->{'contact-id'}]);
 | 
							$this->logger->info('Confirming follower', ['cid' => $this->{'contact-id'}]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		$contact = Contact::selectFirst([], ['id' => $this->{'contact-id'}, 'uid' => $this->uid]);
 | 
							$contact = Model\Contact::selectFirst([], ['id' => $this->{'contact-id'}, 'uid' => $this->uid]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (!$contact) {
 | 
							if (!$contact) {
 | 
				
			||||||
			throw new HTTPException\NotFoundException('Contact record not found.');
 | 
								throw new HTTPException\NotFoundException('Contact record not found.');
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		$new_relation = $contact['rel'];
 | 
							$newRelation = $contact['rel'];
 | 
				
			||||||
		$writable = $contact['writable'];
 | 
							$writable = $contact['writable'];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (!empty($contact['protocol'])) {
 | 
							if (!empty($contact['protocol'])) {
 | 
				
			||||||
| 
						 | 
					@ -61,12 +71,12 @@ final class Introduction extends BaseModel
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (in_array($protocol, [Protocol::DIASPORA, Protocol::ACTIVITYPUB])) {
 | 
							if (in_array($protocol, [Protocol::DIASPORA, Protocol::ACTIVITYPUB])) {
 | 
				
			||||||
			if ($duplex) {
 | 
								if ($duplex) {
 | 
				
			||||||
				$new_relation = Contact::FRIEND;
 | 
									$newRelation = Model\Contact::FRIEND;
 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
				$new_relation = Contact::FOLLOWER;
 | 
									$newRelation = Model\Contact::FOLLOWER;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if ($new_relation != Contact::FOLLOWER) {
 | 
								if ($newRelation != Model\Contact::FOLLOWER) {
 | 
				
			||||||
				$writable = 1;
 | 
									$writable = 1;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					@ -79,43 +89,42 @@ final class Introduction extends BaseModel
 | 
				
			||||||
			'protocol'  => $protocol,
 | 
								'protocol'  => $protocol,
 | 
				
			||||||
			'writable'  => $writable,
 | 
								'writable'  => $writable,
 | 
				
			||||||
			'hidden'    => $hidden ?? $contact['hidden'],
 | 
								'hidden'    => $hidden ?? $contact['hidden'],
 | 
				
			||||||
			'rel'       => $new_relation,
 | 
								'rel'       => $newRelation,
 | 
				
			||||||
		];
 | 
							];
 | 
				
			||||||
		$this->dba->update('contact', $fields, ['id' => $contact['id']]);
 | 
							$this->dba->update('contact', $fields, ['id' => $contact['id']]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		array_merge($contact, $fields);
 | 
							array_merge($contact, $fields);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if ($new_relation == Contact::FRIEND) {
 | 
							if ($newRelation == Model\Contact::FRIEND) {
 | 
				
			||||||
			if ($protocol == Protocol::DIASPORA) {
 | 
								if ($protocol == Protocol::DIASPORA) {
 | 
				
			||||||
				$ret = Diaspora::sendShare(User::getById($contact['uid']), $contact);
 | 
									$ret = Diaspora::sendShare(Model\Contact::getById($contact['uid']), $contact);
 | 
				
			||||||
				$this->logger->info('share returns', ['return' => $ret]);
 | 
									$this->logger->info('share returns', ['return' => $ret]);
 | 
				
			||||||
			} elseif ($protocol == Protocol::ACTIVITYPUB) {
 | 
								} elseif ($protocol == Protocol::ACTIVITYPUB) {
 | 
				
			||||||
				ActivityPub\Transmitter::sendActivity('Follow', $contact['url'], $contact['uid']);
 | 
									ActivityPub\Transmitter::sendActivity('Follow', $contact['url'], $contact['uid']);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		$this->delete();
 | 
							return $this->intro->delete($this);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/**
 | 
						/**
 | 
				
			||||||
	 * Silently ignores the introduction, hides it from notifications and prevents the remote contact from submitting
 | 
						 * Silently ignores the introduction, hides it from notifications and prevents the remote contact from submitting
 | 
				
			||||||
	 * additional follow requests.
 | 
						 * additional follow requests.
 | 
				
			||||||
	 *
 | 
						 *
 | 
				
			||||||
	 * Chainable
 | 
						 * @return bool
 | 
				
			||||||
	 *
 | 
					 | 
				
			||||||
	 * @return Introduction
 | 
					 | 
				
			||||||
	 * @throws \Exception
 | 
						 * @throws \Exception
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	public function ignore()
 | 
						public function ignore()
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		$this->dba->update('intro', ['ignore' => true], ['id' => $this->id]);
 | 
							$this->ignored = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		return $this;
 | 
							return $this->intro->update($this);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/**
 | 
						/**
 | 
				
			||||||
	 * Discards the introduction and sends a rejection message to AP contacts.
 | 
						 * Discards the introduction and sends a rejection message to AP contacts.
 | 
				
			||||||
	 *
 | 
						 *
 | 
				
			||||||
 | 
						 * @return bool
 | 
				
			||||||
	 * @throws HTTPException\InternalServerErrorException
 | 
						 * @throws HTTPException\InternalServerErrorException
 | 
				
			||||||
	 * @throws HTTPException\NotFoundException
 | 
						 * @throws HTTPException\NotFoundException
 | 
				
			||||||
	 * @throws \ImagickException
 | 
						 * @throws \ImagickException
 | 
				
			||||||
| 
						 | 
					@ -127,15 +136,15 @@ final class Introduction extends BaseModel
 | 
				
			||||||
		if (!$this->fid) {
 | 
							if (!$this->fid) {
 | 
				
			||||||
			// When the contact entry had been created just for that intro, we want to get rid of it now
 | 
								// When the contact entry had been created just for that intro, we want to get rid of it now
 | 
				
			||||||
			$condition = ['id' => $this->{'contact-id'}, 'uid' => $this->uid,
 | 
								$condition = ['id' => $this->{'contact-id'}, 'uid' => $this->uid,
 | 
				
			||||||
				'self' => false, 'pending' => true, 'rel' => [0, Contact::FOLLOWER]];
 | 
									'self' => false, 'pending' => true, 'rel' => [0, Model\Contact::FOLLOWER]];
 | 
				
			||||||
			if ($this->dba->exists('contact', $condition)) {
 | 
								if ($this->dba->exists('contact', $condition)) {
 | 
				
			||||||
				Contact::remove($this->{'contact-id'});
 | 
									Model\Contact::remove($this->{'contact-id'});
 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
				$this->dba->update('contact', ['pending' => false], ['id' => $this->{'contact-id'}]);
 | 
									$this->dba->update('contact', ['pending' => false], ['id' => $this->{'contact-id'}]);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		$contact = Contact::selectFirst([], ['id' => $this->{'contact-id'}, 'uid' => $this->uid]);
 | 
							$contact = Model\Contact::selectFirst([], ['id' => $this->{'contact-id'}, 'uid' => $this->uid]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (!$contact) {
 | 
							if (!$contact) {
 | 
				
			||||||
			throw new HTTPException\NotFoundException('Contact record not found.');
 | 
								throw new HTTPException\NotFoundException('Contact record not found.');
 | 
				
			||||||
| 
						 | 
					@ -151,6 +160,6 @@ final class Introduction extends BaseModel
 | 
				
			||||||
			ActivityPub\Transmitter::sendContactReject($contact['url'], $contact['hub-verify'], $contact['uid']);
 | 
								ActivityPub\Transmitter::sendContactReject($contact['url'], $contact['hub-verify'], $contact['uid']);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		$this->delete();
 | 
							return $this->intro->delete($this);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,18 +2,16 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace Friendica\Module\Api\Mastodon;
 | 
					namespace Friendica\Module\Api\Mastodon;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use Friendica\Api\Mastodon;
 | 
					use Friendica\Api\Entity\Mastodon;
 | 
				
			||||||
 | 
					use Friendica\Api\Entity\Mastodon\Relationship;
 | 
				
			||||||
use Friendica\Core\System;
 | 
					use Friendica\Core\System;
 | 
				
			||||||
use Friendica\Database\DBA;
 | 
					 | 
				
			||||||
use Friendica\Model\APContact;
 | 
					 | 
				
			||||||
use Friendica\DI;
 | 
					use Friendica\DI;
 | 
				
			||||||
use Friendica\Model\Contact;
 | 
					use Friendica\Model\Contact;
 | 
				
			||||||
use Friendica\Model\Introduction;
 | 
					 | 
				
			||||||
use Friendica\Module\Base\Api;
 | 
					use Friendica\Module\Base\Api;
 | 
				
			||||||
use Friendica\Network\HTTPException;
 | 
					use Friendica\Network\HTTPException;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * @see https://docs.joinmastodon.org/api/rest/follow-requests/
 | 
					 * @see https://docs.joinmastodon.org/methods/accounts/follow_requests
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
class FollowRequests extends Api
 | 
					class FollowRequests extends Api
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -30,8 +28,11 @@ class FollowRequests extends Api
 | 
				
			||||||
	 * @param array $parameters
 | 
						 * @param array $parameters
 | 
				
			||||||
	 * @throws HTTPException\BadRequestException
 | 
						 * @throws HTTPException\BadRequestException
 | 
				
			||||||
	 * @throws HTTPException\ForbiddenException
 | 
						 * @throws HTTPException\ForbiddenException
 | 
				
			||||||
 | 
						 * @throws HTTPException\InternalServerErrorException
 | 
				
			||||||
	 * @throws HTTPException\NotFoundException
 | 
						 * @throws HTTPException\NotFoundException
 | 
				
			||||||
	 * @throws HTTPException\UnauthorizedException
 | 
						 * @throws HTTPException\UnauthorizedException
 | 
				
			||||||
 | 
						 * @throws \ImagickException
 | 
				
			||||||
 | 
						 *
 | 
				
			||||||
	 * @see https://docs.joinmastodon.org/methods/accounts/follow_requests#accept-follow
 | 
						 * @see https://docs.joinmastodon.org/methods/accounts/follow_requests#accept-follow
 | 
				
			||||||
	 * @see https://docs.joinmastodon.org/methods/accounts/follow_requests#reject-follow
 | 
						 * @see https://docs.joinmastodon.org/methods/accounts/follow_requests#reject-follow
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
| 
						 | 
					@ -39,23 +40,25 @@ class FollowRequests extends Api
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		parent::post($parameters);
 | 
							parent::post($parameters);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		$Intro = DI::intro()->fetch(['id' => $parameters['id'], 'uid' => self::$current_user_id]);
 | 
							$introduction = DI::intro()->selectFirst(['id' => $parameters['id'], 'uid' => self::$current_user_id]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		$contactId = $Intro->{'contact-id'};
 | 
							$contactId = $introduction->{'contact-id'};
 | 
				
			||||||
 | 
					 | 
				
			||||||
		$relationship = new Mastodon\Relationship();
 | 
					 | 
				
			||||||
		$relationship->id = $contactId;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		switch ($parameters['action']) {
 | 
							switch ($parameters['action']) {
 | 
				
			||||||
			case 'authorize':
 | 
								case 'authorize':
 | 
				
			||||||
				$Intro->confirm();
 | 
									$introduction->confirm();
 | 
				
			||||||
				$relationship = Mastodon\Relationship::createFromContact(Contact::getById($contactId));
 | 
					
 | 
				
			||||||
 | 
									$relationship = DI::mstdnRelationship()->createFromContactId($contactId);
 | 
				
			||||||
				break;
 | 
									break;
 | 
				
			||||||
			case 'ignore':
 | 
								case 'ignore':
 | 
				
			||||||
				$Intro->ignore();
 | 
									$introduction->ignore();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									$relationship = DI::mstdnRelationship()->createDefaultFromContactId($contactId);
 | 
				
			||||||
				break;
 | 
									break;
 | 
				
			||||||
			case 'reject':
 | 
								case 'reject':
 | 
				
			||||||
				$Intro->discard();
 | 
									$introduction->discard();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									$relationship = DI::mstdnRelationship()->createDefaultFromContactId($contactId);
 | 
				
			||||||
				break;
 | 
									break;
 | 
				
			||||||
			default:
 | 
								default:
 | 
				
			||||||
				throw new HTTPException\BadRequestException('Unexpected action parameter, expecting "authorize", "ignore" or "reject"');
 | 
									throw new HTTPException\BadRequestException('Unexpected action parameter, expecting "authorize", "ignore" or "reject"');
 | 
				
			||||||
| 
						 | 
					@ -78,41 +81,23 @@ class FollowRequests extends Api
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		$baseUrl = DI::baseUrl();
 | 
							$baseUrl = DI::baseUrl();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (isset($since_id) && isset($max_id)) {
 | 
							$introductions = DI::intro()->selectByBoundaries(
 | 
				
			||||||
			$condition = ['`uid` = ? AND NOT `ignore` AND `id` > ? AND `id` < ?', self::$current_user_id, $since_id, $max_id];
 | 
								['`uid` = ? AND NOT `ignore`', self::$current_user_id],
 | 
				
			||||||
		} elseif (isset($since_id)) {
 | 
								['order' => ['id' => 'DESC']],
 | 
				
			||||||
			$condition = ['`uid` = ? AND NOT `ignore` AND `id` > ?', self::$current_user_id, $since_id];
 | 
								$since_id,
 | 
				
			||||||
		} elseif (isset($max_id)) {
 | 
								$max_id,
 | 
				
			||||||
			$condition = ['`uid` = ? AND NOT `ignore` AND `id` < ?', self::$current_user_id, $max_id];
 | 
								$limit
 | 
				
			||||||
		} else {
 | 
					 | 
				
			||||||
			$condition = ['`uid` = ? AND NOT `ignore`', self::$current_user_id];
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		$count = DBA::count('intro', $condition);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		$intros = DBA::selectToArray(
 | 
					 | 
				
			||||||
			'intro',
 | 
					 | 
				
			||||||
			[],
 | 
					 | 
				
			||||||
			$condition,
 | 
					 | 
				
			||||||
			['order' => ['id' => 'DESC'], 'limit' => $limit]
 | 
					 | 
				
			||||||
		);
 | 
							);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		$return = [];
 | 
							$return = [];
 | 
				
			||||||
		foreach ($intros as $intro) {
 | 
					
 | 
				
			||||||
			$cdata = Contact::getPublicAndUserContacID($intro['contact-id'], $intro['uid']);
 | 
							foreach ($introductions as $key => $introduction) {
 | 
				
			||||||
			if (empty($cdata['public'])) {
 | 
								try {
 | 
				
			||||||
				continue;
 | 
									$return[] = DI::mstdnFollowRequest()->createFromIntroduction($introduction);
 | 
				
			||||||
 | 
								} catch (HTTPException\InternalServerErrorException $exception) {
 | 
				
			||||||
 | 
									DI::intro()->delete($introduction);
 | 
				
			||||||
 | 
									unset($introductions[$key]);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					 | 
				
			||||||
			$publicContact = Contact::getById($cdata['public']);
 | 
					 | 
				
			||||||
			$userContact = Contact::getById($cdata['user']);
 | 
					 | 
				
			||||||
			$apcontact = APContact::getByURL($publicContact['url'], false);
 | 
					 | 
				
			||||||
			$account = Mastodon\Account::create($baseUrl, $publicContact, $apcontact, $userContact);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// Not ideal, the same "account" can have multiple ids depending on the context
 | 
					 | 
				
			||||||
			$account->id = $intro['id'];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			$return[] = $account;
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		$base_query = [];
 | 
							$base_query = [];
 | 
				
			||||||
| 
						 | 
					@ -121,10 +106,10 @@ class FollowRequests extends Api
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		$links = [];
 | 
							$links = [];
 | 
				
			||||||
		if ($count > $limit) {
 | 
							if ($introductions->getTotalCount() > $limit) {
 | 
				
			||||||
			$links[] = '<' . $baseUrl->get() . '/api/v1/follow_requests?' . http_build_query($base_query + ['max_id' => $intros[count($intros) - 1]['id']]) . '>; rel="next"';
 | 
								$links[] = '<' . $baseUrl->get() . '/api/v1/follow_requests?' . http_build_query($base_query + ['max_id' => $introductions[count($introductions) - 1]->id]) . '>; rel="next"';
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		$links[] = '<' . $baseUrl->get() . '/api/v1/follow_requests?' . http_build_query($base_query + ['since_id' => $intros[0]['id']]) . '>; rel="prev"';
 | 
							$links[] = '<' . $baseUrl->get() . '/api/v1/follow_requests?' . http_build_query($base_query + ['since_id' => $introductions[0]->id]) . '>; rel="prev"';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		header('Link: ' . implode(', ', $links));
 | 
							header('Link: ' . implode(', ', $links));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -23,11 +23,11 @@ class FollowConfirm extends BaseModule
 | 
				
			||||||
		$duplex   = intval($_POST['duplex']     ?? 0);
 | 
							$duplex   = intval($_POST['duplex']     ?? 0);
 | 
				
			||||||
		$hidden   = intval($_POST['hidden']     ?? 0);
 | 
							$hidden   = intval($_POST['hidden']     ?? 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		$Intro = DI::intro()->fetch(['id' => $intro_id, 'uid' => local_user()]);
 | 
							$intro = DI::intro()->selectFirst(['id' => $intro_id, 'uid' => local_user()]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		$cid = $Intro->{'contact-id'};
 | 
							$cid = $intro->{'contact-id'};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		$Intro->confirm($duplex, $hidden);
 | 
							$intro->confirm($duplex, $hidden);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		DI::baseUrl()->redirect('contact/' . intval($cid));
 | 
							DI::baseUrl()->redirect('contact/' . intval($cid));
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,30 @@
 | 
				
			||||||
 | 
					<?php
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Friendica\Repository;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use Friendica\BaseRepository;
 | 
				
			||||||
 | 
					use Friendica\Collection;
 | 
				
			||||||
 | 
					use Friendica\Model;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @method Model\Introduction       selectFirst(array $condition)
 | 
				
			||||||
 | 
					 * @method Collection\Introductions select(array $condition = [], array $params = [])
 | 
				
			||||||
 | 
					 * @method Collection\Introductions selectByBoundaries(array $condition = [], array $params = [], int $max_id = null, int $since_id = null, int $limit = self::LIMIT)
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					class Introduction extends BaseRepository
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						protected static $table_name = 'intro';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						protected static $model_class = Model\Introduction::class;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						protected static $collection_class = Collection\Introductions::class;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * @param array $data
 | 
				
			||||||
 | 
						 * @return Model\Introduction
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						protected function create(array $data)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return new Model\Introduction($this->dba, $this->logger, $this, $data);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Ładowanie…
	
		Reference in New Issue