Skip to content

Commit

Permalink
Merge pull request #609 from nextcloud/enh/606/invited-by
Browse files Browse the repository at this point in the history
+invitedBy
  • Loading branch information
ArtificialOwl authored Jun 3, 2021
2 parents f9cb432 + 827340b commit 53bc03b
Show file tree
Hide file tree
Showing 18 changed files with 432 additions and 34 deletions.
3 changes: 2 additions & 1 deletion lib/AppInfo/Capabilities.php
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,8 @@ private function getCapabilitiesCircleConstants(): array {
Member::TYPE_APP => $this->l10n->t('Nextcloud App')
],
'extra' => [
Member::APP_CIRCLES => 'Circles App'
Member::APP_CIRCLES => 'Circles App',
Member::APP_OCC => 'occ Command Line'
]
]
];
Expand Down
8 changes: 6 additions & 2 deletions lib/Command/MembersList.php
Original file line number Diff line number Diff line change
Expand Up @@ -230,8 +230,8 @@ protected function execute(InputInterface $input, OutputInterface $output): int
$table = new Table($output);
$table->setHeaders(
[
'Circle Id', 'Circle Name', 'Member Id', 'Single Id', 'Type', 'Source', 'Username',
'Instance', 'Level'
'Circle Id', 'Circle Name', 'Member Id', 'Single Id', 'Type', 'Source', 'Invited By',
'Username', 'Instance', 'Level'
]
);
$table->render();
Expand All @@ -251,6 +251,10 @@ protected function execute(InputInterface $input, OutputInterface $output): int
$member->getSingleId(),
Member::$TYPE[$member->getUserType()],
$member->hasBasedOn() ? Circle::$DEF_SOURCE[$member->getBasedOn()->getSource()] : '',
($member->hasInvitedBy()) ? $member->getInvitedBy()->getUserId()
. $this->configService->displayInstance(
$member->getInvitedBy()->getInstance(), true
) : 'Unknown',
($this->input->getOption('display-name')) ?
$member->getBasedOn()->getDisplayName() : $member->getUserId(),
$this->configService->displayInstance($member->getInstance()),
Expand Down
47 changes: 43 additions & 4 deletions lib/Db/CoreQueryBuilder.php
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ class CoreQueryBuilder extends NC22ExtendedQueryBuilder {
const UPSTREAM_MEMBERSHIPS = 'upstreammemberships';
const INHERITANCE_FROM = 'inheritancefrom';
const INHERITED_BY = 'inheritedby';
const INVITED_BY = 'invitedby';
const MOUNT = 'mount';
const MOUNTPOINT = 'mountpoint';
const SHARE = 'share';
Expand Down Expand Up @@ -109,7 +110,7 @@ class CoreQueryBuilder extends NC22ExtendedQueryBuilder {
self::MEMBER => [
self::MEMBERSHIPS,
self::INHERITANCE_FROM,
self::CIRCLE => [
self::CIRCLE => [
self::OPTIONS => [
'getData' => true
],
Expand All @@ -123,10 +124,14 @@ class CoreQueryBuilder extends NC22ExtendedQueryBuilder {
self::BASED_ON,
self::INHERITED_BY => [
self::MEMBERSHIPS
],
self::INVITED_BY => [
self::OWNER,
self::BASED_ON
]
]
],
self::BASED_ON => [
self::BASED_ON => [
self::OWNER,
self::MEMBERSHIPS,
self::INITIATOR => [
Expand All @@ -136,11 +141,15 @@ class CoreQueryBuilder extends NC22ExtendedQueryBuilder {
]
]
],
self::REMOTE => [
self::REMOTE => [
self::MEMBER,
self::CIRCLE => [
self::OWNER
]
],
self::INVITED_BY => [
self::OWNER,
self::BASED_ON
]
],
self::SHARE => [
Expand Down Expand Up @@ -690,6 +699,33 @@ public function leftJoinCircle(
}


/**
* @param string $aliasMember
*
* @throws RequestBuilderException
*/
public function leftJoinInvitedBy(string $aliasMember): void {
if ($this->getType() !== QueryBuilder::SELECT) {
return;
}

try {
$aliasInvitedBy = $this->generateAlias($aliasMember, self::INVITED_BY);
} catch (RequestBuilderException $e) {
return;
}

$expr = $this->expr();
$this->generateCircleSelectAlias($aliasInvitedBy)
->leftJoin(
$aliasMember, CoreRequestBuilder::TABLE_CIRCLE, $aliasInvitedBy,
$expr->eq($aliasMember . '.invited_by', $aliasInvitedBy . '.unique_id')
);

$this->leftJoinOwner($aliasInvitedBy);
}


/**
* @param string $aliasMember
* @param IFederatedUser|null $initiator
Expand Down Expand Up @@ -811,7 +847,10 @@ public function leftJoinMember(
*
* @throws RequestBuilderException
*/
public function leftJoinInheritedMembers(string $alias, string $field = '', string $aliasInheritedBy = ''
public function leftJoinInheritedMembers(
string $alias,
string $field = '',
string $aliasInheritedBy = ''
): void {
$expr = $this->expr();

Expand Down
11 changes: 8 additions & 3 deletions lib/Db/MemberRequest.php
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,11 @@ public function save(Member $member): void {
->setValue('level', $qb->createNamedParameter($member->getLevel()))
->setValue('status', $qb->createNamedParameter($member->getStatus()))
->setValue('contact_id', $qb->createNamedParameter($member->getContactId()))
->setValue('note', $qb->createNamedParameter($member->getNote()));
->setValue('note', $qb->createNamedParameter(json_encode($member->getNotes())));

if ($member->hasInvitedBy()) {
$qb->setValue('invited_by', $qb->createNamedParameter($member->getInvitedBy()->getSingleId()));
}

$qb->execute();
}
Expand All @@ -91,7 +95,7 @@ public function update(Member $member): void {
->set('level', $qb->createNamedParameter($member->getLevel()))
->set('status', $qb->createNamedParameter($member->getStatus()))
->set('contact_id', $qb->createNamedParameter($member->getContactId()))
->set('note', $qb->createNamedParameter($member->getNote()));
->set('note', $qb->createNamedParameter(json_encode($member->getNotes())));

$qb->limitToCircleId($member->getCircleId());
$qb->limitToUserId($member->getUserId());
Expand Down Expand Up @@ -212,6 +216,7 @@ public function getMembers(

$qb->setOptions([CoreQueryBuilder::MEMBER], ['canBeVisitorOnOpen' => true]);
$qb->leftJoinCircle(CoreQueryBuilder::MEMBER, $initiator);
$qb->leftJoinInvitedBy(CoreQueryBuilder::MEMBER);

if (!is_null($remoteInstance)) {
$aliasCircle = $qb->generateAlias(CoreQueryBuilder::MEMBER, CoreQueryBuilder::CIRCLE);
Expand Down Expand Up @@ -351,7 +356,7 @@ public function searchFederatedUsers(string $needle): array {
* @return FederatedUser[]|Member
* @throws RequestBuilderException
*/
public function getAlternateSingleId(IFederatedUser $federatedUser) {
public function getAlternateSingleId(IFederatedUser $federatedUser): array {
$qb = $this->getMemberSelectSql();
$qb->limitToSingleId($federatedUser->getSingleId());

Expand Down
4 changes: 4 additions & 0 deletions lib/FederatedItems/CircleCreate.php
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,10 @@ public function manage(FederatedEvent $event): void {
} catch (MemberNotFoundException $e) {
}

if ($owner->hasInvitedBy()) {
$owner->setNoteObj('invitedBy', $owner->getInvitedBy());
}

$this->circleRequest->save($circle);
$this->memberRequest->save($owner);
$this->membershipService->onUpdate($owner->getSingleId());
Expand Down
2 changes: 1 addition & 1 deletion lib/FederatedItems/MassiveMemberAdd.php
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ public function verify(FederatedEvent $event): void {

foreach ($members as $member) {
try {
$filtered[] = $this->generateMember($circle, $member);
$filtered[] = $this->generateMember($event, $circle, $member);
} catch (Exception $e) {
}
}
Expand Down
31 changes: 29 additions & 2 deletions lib/FederatedItems/SingleMemberAdd.php
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,7 @@ public function verify(FederatedEvent $event): void {
$initiatorHelper = new MemberHelper($initiator);
$initiatorHelper->mustBeModerator();

$member = $this->generateMember($circle, $member);
$member = $this->generateMember($event, $circle, $member);

$event->setMembers([$member]);
$event->setOutcome($member->jsonSerialize());
Expand Down Expand Up @@ -328,7 +328,7 @@ public function result(FederatedEvent $event, array $results): void {
* @throws UserTypeNotFoundException
* @throws RequestBuilderException
*/
protected function generateMember(Circle $circle, Member $member): Member {
protected function generateMember(FederatedEvent $event, Circle $circle, Member $member): Member {
try {
if ($member->getSingleId() !== '') {
$userId = $member->getSingleId() . '@' . $member->getInstance();
Expand Down Expand Up @@ -366,6 +366,10 @@ protected function generateMember(Circle $circle, Member $member): Member {
$member->importFromIFederatedUser($federatedUser);
$member->setCircleId($circle->getSingleId());
$member->setCircle($circle);

$this->confirmPatron($event, $member);
$member->setNoteObj('invitedBy', $member->getInvitedBy());

$this->manageMemberStatus($circle, $member);

$this->circleService->confirmCircleNotFull($circle);
Expand All @@ -387,6 +391,7 @@ protected function generateMember(Circle $circle, Member $member): Member {
* @param Member $member
*
* @throws FederatedItemBadRequestException
* @throws RequestBuilderException
*/
private function manageMemberStatus(Circle $circle, Member $member) {
try {
Expand Down Expand Up @@ -428,6 +433,28 @@ private function manageMemberStatus(Circle $circle, Member $member) {
}


/**
* @param FederatedEvent $event
* @param Member $member
*
* @throws FederatedItemBadRequestException
* @throws FederatedUserException
* @throws RequestBuilderException
*/
private function confirmPatron(FederatedEvent $event, Member $member): void {
if (!$member->hasInvitedBy()) {
throw new FederatedItemBadRequestException(StatusCode::$MEMBER_ADD[129], 129);
}

$patron = $member->getInvitedBy();
if ($patron->getInstance() !== $event->getOrigin()) {
throw new FederatedItemBadRequestException(StatusCode::$MEMBER_ADD[130], 130);
}

$this->federatedUserService->confirmLocalSingleId($patron);
}


/**
* @param Member $member
*
Expand Down
11 changes: 11 additions & 0 deletions lib/Migration/Version0022Date20220526113601.php
Original file line number Diff line number Diff line change
Expand Up @@ -210,6 +210,12 @@ public function changeSchema(IOutput $output, Closure $schemaClosure, array $opt
'length' => 255
]
);
$table->addColumn(
'invited_by', 'string', [
'notnull' => false,
'length' => 31,
]
);
$table->addColumn(
'level', 'smallint', [
'notnull' => true,
Expand Down Expand Up @@ -375,6 +381,11 @@ public function changeSchema(IOutput $output, Closure $schemaClosure, array $opt
'notnull' => false
]
);
$table->addColumn(
'updated', 'datetime', [
'notnull' => false,
]
);
$table->addColumn(
'creation', 'bigint', [
'length' => 14,
Expand Down
96 changes: 96 additions & 0 deletions lib/Migration/Version0022Date20220601121545.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
<?php

declare(strict_types=1);


/**
* Circles - Bring cloud-users closer together.
*
* 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 2021
* @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\Circles\Migration;

use Closure;
use Doctrine\DBAL\Schema\SchemaException;
use OCP\DB\ISchemaWrapper;
use OCP\IDBConnection;
use OCP\Migration\IOutput;
use OCP\Migration\SimpleMigrationStep;


/**
* Class Version0022Date20220526113601
*
* @package OCA\Circles\Migration
*/
class Version0022Date20220601121545 extends SimpleMigrationStep {


/**
* @param IDBConnection $connection
*/
public function __construct(IDBConnection $connection) {
}


/**
* @param IOutput $output
* @param Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper`
* @param array $options
*
* @return null|ISchemaWrapper
* @throws SchemaException
*/
public function changeSchema(IOutput $output, Closure $schemaClosure, array $options): ?ISchemaWrapper {
/** @var ISchemaWrapper $schema */
$schema = $schemaClosure();

if ($schema->hasTable('circles_event')) {
$table = $schema->getTable('circles_event');
if (!$table->hasColumn('updated')) {
$table->addColumn(
'updated', 'datetime', [
'notnull' => false,
]
);
}
}

if ($schema->hasTable('circles_member')) {
$table = $schema->getTable('circles_member');
if (!$table->hasColumn('invited_by')) {
$table->addColumn(
'invited_by', 'string', [
'notnull' => false,
'length' => 31,
]
);
}
}

return $schema;
}

}

Loading

0 comments on commit 53bc03b

Please sign in to comment.