--- /dev/null
+<?php
+
+namespace Friendica\Collection;
+
+use Friendica\BaseCollection;
+
+class FSuggests extends BaseCollection
+{
+
+}
// "Repository" namespace
//
+ /**
+ * @return Repository\FSuggest;
+ */
+ public static function fsuggest()
+ {
+ return self::$dice->create(Repository\FSuggest::class);
+ }
+
/**
* @return Repository\Introduction
*/
--- /dev/null
+<?php
+
+namespace Friendica\Model;
+
+use Friendica\BaseModel;
+
+/**
+ * Model for interacting with a friend suggest
+ *
+ * @property int uid
+ * @property int cid
+ * @property string name
+ * @property string url
+ * @property string request
+ * @property string photo
+ * @property string note
+ * @property string created
+ */
+class FSuggest extends BaseModel
+{
+
+}
--- /dev/null
+<?php
+
+namespace Friendica\Module;
+
+use Friendica\BaseModule;
+use Friendica\Core\Protocol;
+use Friendica\Core\Renderer;
+use Friendica\Core\Worker;
+use Friendica\DI;
+use Friendica\Model\Contact as ContactModel;
+use Friendica\Network\HTTPException\ForbiddenException;
+use Friendica\Network\HTTPException\NotFoundException;
+use Friendica\Util\DateTimeFormat;
+use Friendica\Util\Strings;
+use Friendica\Worker\Delivery;
+
+/**
+ * Suggest friends to a known contact
+ */
+class FriendSuggest extends BaseModule
+{
+ public static function init(array $parameters = [])
+ {
+ if (! local_user()) {
+ throw new ForbiddenException(DI::l10n()->t('Permission denied.'));
+ }
+ }
+
+ public static function post(array $parameters = [])
+ {
+ $cid = intval($parameters['contact']);
+
+ // We do query the "uid" as well to ensure that it is our contact
+ if (!DI::dba()->exists('contact', ['id' => $cid, 'uid' => local_user()])) {
+ throw new NotFoundException(DI::l10n()->t('Contact not found.'));
+ }
+
+ $suggest_contact_id = intval($_POST['suggest']);
+ if (empty($suggest_contact_id)) {
+ return;
+ }
+
+ // We do query the "uid" as well to ensure that it is our contact
+ $contact = DI::dba()->selectFirst('contact', ['name', 'url', 'request', 'avatar'], ['id' => $suggest_contact_id, 'uid' => local_user()]);
+ if (empty($contact)) {
+ notice(DI::l10n()->t('Suggested contact not found.'));
+ return;
+ }
+
+ $note = Strings::escapeHtml(trim($_POST['note'] ?? ''));
+
+ $suggest = DI::fsuggest()->insert([
+ 'uid' => local_user(),
+ 'cid' => $cid,
+ 'name' => $contact['name'],
+ 'url' => $contact['url'],
+ 'request' => $contact['request'],
+ 'photo' => $contact['avatar'],
+ 'note' => $note,
+ 'created' => DateTimeFormat::utcNow()
+ ]);
+
+ Worker::add(PRIORITY_HIGH, 'Notifier', Delivery::SUGGESTION, $suggest->id);
+
+ info(DI::l10n()->t('Friend suggestion sent.'));
+ }
+
+ public static function content(array $parameters = [])
+ {
+ $cid = intval($parameters['contact']);
+
+ $contact = DI::dba()->selectFirst('contact', [], ['id' => $cid, 'uid' => local_user()]);
+ if (empty($contact)) {
+ notice(DI::l10n()->t('Contact not found.'));
+ DI::baseUrl()->redirect();
+ }
+
+ $stmtContacts = ContactModel::select(['id', 'name'], [
+ '`uid` = ? AND NOT `self` AND NOT `blocked` AND NOT `pending` AND NOT `archive` AND NOT `deleted` AND `notify` != "" AND `id` != ? AND `networks` = ?',
+ local_user(),
+ $cid,
+ Protocol::DFRN,
+ ]);
+
+ $formattedContacts = [];
+
+ while ($contact = DI::dba()->fetch($stmtContacts)) {
+ $formattedContacts[$contact['id']] = $contact['name'];
+ }
+
+ $tpl = Renderer::getMarkupTemplate('fsuggest.tpl');
+ return Renderer::replaceMacros($tpl, [
+ '$contact_id' => $cid,
+ '$fsuggest_title' => DI::l10n()->t('Suggest Friends'),
+ '$fsuggest_select' => [
+ 'suggest',
+ DI::l10n()->t('Suggest a friend for %s', $contact['name']),
+ '',
+ '',
+ $formattedContacts,
+ ],
+ '$submit' => DI::l10n()->t('Submit'),
+ ]);
+ }
+}
{
$owner = User::getOwnerDataById($uid);
- $suggestion = DBA::selectFirst('fsuggest', ['url', 'note', 'created'], ['id' => $suggestion_id]);
+ $suggestion = DI::fsuggest()->getById($suggestion_id);
$data = ['@context' => ActivityPub::CONTEXT,
'id' => DI::baseUrl() . '/activity/' . System::createGUID(),
'type' => 'Announce',
'actor' => $owner['url'],
- 'object' => $suggestion['url'],
- 'content' => $suggestion['note'],
+ 'object' => $suggestion->url,
+ 'content' => $suggestion->note,
'instrument' => self::getService(),
'to' => [ActivityPub::PUBLIC_COLLECTION],
'cc' => []];
--- /dev/null
+<?php
+
+namespace Friendica\Repository;
+
+use Friendica\BaseRepository;
+use Friendica\Collection;
+use Friendica\Model;
+
+class FSuggest extends BaseRepository
+{
+ protected static $table_name = 'fsuggest';
+
+ protected static $model_class = Model\FSuggest::class;
+
+ protected static $collection_class = Collection\FSuggests::class;
+
+ /**
+ * @param array $data
+ * @return Model\FSuggest
+ */
+ protected function create(array $data)
+ {
+ return new Model\FSuggest($this->dba, $this->logger, $data);
+ }
+
+ /**
+ * Returns the Friend Suggest based on it's ID
+ *
+ * @param int $id The id of the fsuggest
+ *
+ * @return Model\FSuggest
+ *
+ * @throws \Friendica\Network\HTTPException\NotFoundException
+ */
+ public function getById(int $id)
+ {
+ return $this->selectFirst(['id' => $id]);
+ }
+
+ /**
+ * @param array $condition
+ * @return Model\FSuggest
+ * @throws \Friendica\Network\HTTPException\NotFoundException
+ */
+ public function selectFirst(array $condition)
+ {
+ return parent::selectFirst($condition);
+ }
+
+ /**
+ * @param array $condition
+ * @param array $params
+ * @return Collection\FSuggests
+ * @throws \Exception
+ */
+ public function select(array $condition = [], array $params = [])
+ {
+ return parent::select($condition, $params);
+ }
+
+ /**
+ * @param array $condition
+ * @param array $params
+ * @param int|null $max_id
+ * @param int|null $since_id
+ * @param int $limit
+ * @return Collection\FSuggests
+ * @throws \Exception
+ */
+ public function selectByBoundaries(array $condition = [], array $params = [], int $max_id = null, int $since_id = null, int $limit = self::LIMIT)
+ {
+ return parent::selectByBoundaries($condition, $params, $max_id, $since_id, $limit);
+ }
+}
'APDelivery', $cmd, $target_id, $inbox, $uid);
}
} elseif ($cmd == Delivery::SUGGESTION) {
- $suggest = DBA::selectFirst('fsuggest', ['uid', 'cid'], ['id' => $target_id]);
- if (!DBA::isResult($suggest)) {
+ $suggest = DI::fsuggest()->getById($target_id);
+ if (empty($suggest)) {
return;
}
- $uid = $suggest['uid'];
- $recipients[] = $suggest['cid'];
+ $uid = $suggest->uid;
+ $recipients[] = $suggest->cid;
} elseif ($cmd == Delivery::REMOVAL) {
return self::notifySelfRemoval($target_id, $a->queue['priority'], $a->queue['created']);
} elseif ($cmd == Delivery::RELOCATION) {
'/followers/{owner}' => [Module\Followers::class, [R::GET]],
'/following/{owner}' => [Module\Following::class, [R::GET]],
'/friendica[/json]' => [Module\Friendica::class, [R::GET]],
+ '/fsuggest/{contact}' => [Module\FriendSuggest::class, [R::GET, R::POST]],
'/group' => [
'[/]' => [Module\Group::class, [R::GET, R::POST]],
--- /dev/null
+<div class="generic-page-wrapper">
+ <h2>{{$fsuggest_title}}</h2>
+ <form id="fsuggest-form" action="fsuggest/{{$contact_id}}" method="post">
+ {{include file="field_select.tpl" field=$fsuggest_select}}
+ <div id="fsuggest-submit-wrapper">
+ <input id="fsuggest-submit" type="submit" name="submit" value="{{$submit}}" />
+ </div>
+ </form>
+</div>