Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions lib/private/Accounts/Account.php
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,28 @@ public function getProperties(): array {
});
}

public function setAllPropertiesFromJson(array $properties): IAccount {
foreach ($properties as $propertyName => $propertyObject) {
if ($this->isCollection($propertyName)) {
$collection = new AccountPropertyCollection($propertyName);
/** @var array<int, IAccountProperty> $collectionProperties */
$collectionProperties = [];
/** @var array<int, array<string, string>> $propertyObject */
foreach ($propertyObject as ['value' => $value, 'scope' => $scope, 'verified' => $verified, 'verificationData' => $verificationData]) {
$collectionProperties[] = new AccountProperty($collection->getName(), $value, $scope, $verified, $verificationData);
}
$collection->setProperties($collectionProperties);
$this->setPropertyCollection($collection);
} else {
/** @var array<string, string> $propertyObject */
['value' => $value, 'scope' => $scope, 'verified' => $verified, 'verificationData' => $verificationData] = $propertyObject;
$this->setProperty($propertyName, $value, $scope, $verified, $verificationData);
}
}

return $this;
}

public function getAllProperties(): Generator {
foreach ($this->properties as $propertyObject) {
if ($propertyObject instanceof IAccountProperty) {
Expand Down
43 changes: 43 additions & 0 deletions lib/public/Accounts/IAccount.php
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,49 @@ public function getProperty(string $property): IAccountProperty;
*/
public function getProperties(): array;

/**
* Set all properties of an account
*
* @param array<string, array<string, string>>|array<string, array<int, array<string, string>>> $properties
*
* e.g. `[
* 'displayname' => [
* 'name' => 'displayname',
* 'value' => 'Jonathan Smith',
* 'scope' => 'v2-federated',
* 'verified' => '0',
* 'verificationData' => '',
* ],
* 'email' => [
* 'name' => 'email',
* 'value' => '[email protected]',
* 'scope' => 'v2-federated',
* 'verified' => '0',
* 'verificationData' => '',
* ],
* // ...
* 'additional_mail' => [
* [
* 'name' => 'additional_mail',
* 'value' => '[email protected]',
* 'scope' => 'v2-local',
* 'verified' => '0',
* 'verificationData' => '',
* ],
* [
* 'name' => 'additional_mail',
* 'value' => '[email protected]',
* 'scope' => 'v2-local',
* 'verified' => '0',
* 'verificationData' => '',
* ],
* ],
* ]`
*
* @since 24.0.0
*/
public function setAllPropertiesFromJson(array $properties): IAccount;

/**
* Get all properties of an account. Array indices are numeric. To get
* the property name, call getName() against the value.
Expand Down
25 changes: 25 additions & 0 deletions tests/lib/Accounts/AccountTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,31 @@ public function testGetAndGetAllProperties() {
$this->assertEquals(array_values($properties), \iterator_to_array($account->getAllProperties()));
}

public function testSetAllPropertiesFromJson() {
$user = $this->createMock(IUser::class);
$properties = [
IAccountManager::PROPERTY_DISPLAYNAME => new AccountProperty(IAccountManager::PROPERTY_DISPLAYNAME, 'Steve', IAccountManager::SCOPE_FEDERATED, IAccountManager::NOT_VERIFIED, ''),
IAccountManager::PROPERTY_ADDRESS => new AccountProperty(IAccountManager::PROPERTY_ADDRESS, '123 Acorn Avenue', IAccountManager::SCOPE_FEDERATED, IAccountManager::NOT_VERIFIED, ''),
IAccountManager::PROPERTY_WEBSITE => new AccountProperty(IAccountManager::PROPERTY_WEBSITE, 'https://www.example.org', IAccountManager::SCOPE_FEDERATED, IAccountManager::VERIFIED, ''),
IAccountManager::PROPERTY_EMAIL => new AccountProperty(IAccountManager::PROPERTY_EMAIL, '[email protected]', IAccountManager::SCOPE_PUBLISHED, IAccountManager::VERIFICATION_IN_PROGRESS, ''),
IAccountManager::PROPERTY_AVATAR => new AccountProperty(IAccountManager::PROPERTY_AVATAR, '', IAccountManager::SCOPE_PUBLISHED, IAccountManager::NOT_VERIFIED, ''),
IAccountManager::PROPERTY_PHONE => new AccountProperty(IAccountManager::PROPERTY_PHONE, '+358407991028', IAccountManager::SCOPE_LOCAL, IAccountManager::NOT_VERIFIED, ''),
IAccountManager::PROPERTY_TWITTER => new AccountProperty(IAccountManager::PROPERTY_TWITTER, 'therealsteve', IAccountManager::SCOPE_PRIVATE, IAccountManager::NOT_VERIFIED, ''),
IAccountManager::PROPERTY_ORGANISATION => new AccountProperty(IAccountManager::PROPERTY_ORGANISATION, 'Steve Incorporated', IAccountManager::SCOPE_FEDERATED, IAccountManager::NOT_VERIFIED, ''),
IAccountManager::PROPERTY_ROLE => new AccountProperty(IAccountManager::PROPERTY_ROLE, 'Founder', IAccountManager::SCOPE_FEDERATED, IAccountManager::NOT_VERIFIED, ''),
IAccountManager::PROPERTY_HEADLINE => new AccountProperty(IAccountManager::PROPERTY_HEADLINE, 'I am Steve', IAccountManager::SCOPE_PUBLISHED, IAccountManager::NOT_VERIFIED, ''),
IAccountManager::PROPERTY_BIOGRAPHY => new AccountProperty(IAccountManager::PROPERTY_BIOGRAPHY, 'Steve is the best', IAccountManager::SCOPE_LOCAL, IAccountManager::NOT_VERIFIED, ''),
IAccountManager::PROPERTY_PROFILE_ENABLED => new AccountProperty(IAccountManager::PROPERTY_PROFILE_ENABLED, '1', IAccountManager::SCOPE_FEDERATED, IAccountManager::NOT_VERIFIED, ''),
IAccountManager::COLLECTION_EMAIL => [
new AccountProperty(IAccountManager::COLLECTION_EMAIL, '[email protected]', IAccountManager::SCOPE_PUBLISHED, IAccountManager::NOT_VERIFIED, ''),
new AccountProperty(IAccountManager::COLLECTION_EMAIL, '[email protected]', IAccountManager::SCOPE_FEDERATED, IAccountManager::NOT_VERIFIED, ''),
],
];
$account = new Account($user);
$account->setAllPropertiesFromJson(json_decode(json_encode($properties), true));
$this->assertEquals($properties, $account->jsonSerialize());
}

public function testGetFilteredProperties() {
$user = $this->createMock(IUser::class);
$properties = [
Expand Down