diff --git a/CHANGELOG.md b/CHANGELOG.md
index db09c2a..d6fb69f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -15,6 +15,7 @@ v1.5
- Fix FLEXIAPI-166 Reimplement the deprecated email validation URL
- Fix FLEXIAPI-165 Remove for now text/vcard header constraint
- Fix FLEXIAPI-164 Add vcards-storage endpoints
+- Fix FLEXIAPI-163 Complete AccountService hooks
- Fix FLEXIAPI-162 Drop the aliases table and migrate the data to the phone column
- Fix FLEXIAPI-161 Complete the Dictionary tests to cover the collection accessor
- Fix FLEXIAPI-158 Restrict the phone number change API endpoint to return 403 if the account doesn't have a validated Account Creation Token
diff --git a/flexiapi/app/Services/AccountService.php b/flexiapi/app/Services/AccountService.php
index a4ae710..bc8c723 100644
--- a/flexiapi/app/Services/AccountService.php
+++ b/flexiapi/app/Services/AccountService.php
@@ -125,6 +125,7 @@ class AccountService
}
if (function_exists('accountServiceAccountCreatedHook')) {
+ $account->refresh();
accountServiceAccountCreatedHook($request, $account);
}
@@ -172,6 +173,14 @@ class AccountService
$account->phone = $request->get('phone');
$account->save();
+
+ if ($request->has('dictionary')) {
+ $account->dictionaryEntries()->delete();
+
+ foreach ($request->get('dictionary') as $key => $value) {
+ $account->setDictionaryEntry($key, $value);
+ }
+ }
}
Log::channel('events')->info(
@@ -182,6 +191,7 @@ class AccountService
);
if (function_exists('accountServiceAccountEditedHook')) {
+ $account->refresh();
accountServiceAccountEditedHook($request, $account);
}
diff --git a/flexiapi/composer.lock b/flexiapi/composer.lock
index df42be3..cb5a3ad 100644
--- a/flexiapi/composer.lock
+++ b/flexiapi/composer.lock
@@ -2511,16 +2511,16 @@
},
{
"name": "league/flysystem",
- "version": "3.27.0",
+ "version": "3.28.0",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/flysystem.git",
- "reference": "4729745b1ab737908c7d055148c9a6b3e959832f"
+ "reference": "e611adab2b1ae2e3072fa72d62c62f52c2bf1f0c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/4729745b1ab737908c7d055148c9a6b3e959832f",
- "reference": "4729745b1ab737908c7d055148c9a6b3e959832f",
+ "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/e611adab2b1ae2e3072fa72d62c62f52c2bf1f0c",
+ "reference": "e611adab2b1ae2e3072fa72d62c62f52c2bf1f0c",
"shasum": ""
},
"require": {
@@ -2544,10 +2544,13 @@
"composer/semver": "^3.0",
"ext-fileinfo": "*",
"ext-ftp": "*",
+ "ext-mongodb": "^1.3",
"ext-zip": "*",
"friendsofphp/php-cs-fixer": "^3.5",
"google/cloud-storage": "^1.23",
+ "guzzlehttp/psr7": "^2.6",
"microsoft/azure-storage-blob": "^1.1",
+ "mongodb/mongodb": "^1.2",
"phpseclib/phpseclib": "^3.0.36",
"phpstan/phpstan": "^1.10",
"phpunit/phpunit": "^9.5.11|^10.0",
@@ -2585,32 +2588,22 @@
],
"support": {
"issues": "https://github.com/thephpleague/flysystem/issues",
- "source": "https://github.com/thephpleague/flysystem/tree/3.27.0"
+ "source": "https://github.com/thephpleague/flysystem/tree/3.28.0"
},
- "funding": [
- {
- "url": "https://ecologi.com/frankdejonge",
- "type": "custom"
- },
- {
- "url": "https://github.com/frankdejonge",
- "type": "github"
- }
- ],
- "time": "2024-04-07T19:17:50+00:00"
+ "time": "2024-05-22T10:09:12+00:00"
},
{
"name": "league/flysystem-local",
- "version": "3.25.1",
+ "version": "3.28.0",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/flysystem-local.git",
- "reference": "61a6a90d6e999e4ddd9ce5adb356de0939060b92"
+ "reference": "13f22ea8be526ea58c2ddff9e158ef7c296e4f40"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/61a6a90d6e999e4ddd9ce5adb356de0939060b92",
- "reference": "61a6a90d6e999e4ddd9ce5adb356de0939060b92",
+ "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/13f22ea8be526ea58c2ddff9e158ef7c296e4f40",
+ "reference": "13f22ea8be526ea58c2ddff9e158ef7c296e4f40",
"shasum": ""
},
"require": {
@@ -2644,19 +2637,9 @@
"local"
],
"support": {
- "source": "https://github.com/thephpleague/flysystem-local/tree/3.25.1"
+ "source": "https://github.com/thephpleague/flysystem-local/tree/3.28.0"
},
- "funding": [
- {
- "url": "https://ecologi.com/frankdejonge",
- "type": "custom"
- },
- {
- "url": "https://github.com/frankdejonge",
- "type": "github"
- }
- ],
- "time": "2024-03-15T19:58:44+00:00"
+ "time": "2024-05-06T20:05:52+00:00"
},
{
"name": "league/mime-type-detection",
@@ -5050,16 +5033,16 @@
},
{
"name": "react/promise",
- "version": "v3.1.0",
+ "version": "v3.2.0",
"source": {
"type": "git",
"url": "https://github.com/reactphp/promise.git",
- "reference": "e563d55d1641de1dea9f5e84f3cccc66d2bfe02c"
+ "reference": "8a164643313c71354582dc850b42b33fa12a4b63"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/reactphp/promise/zipball/e563d55d1641de1dea9f5e84f3cccc66d2bfe02c",
- "reference": "e563d55d1641de1dea9f5e84f3cccc66d2bfe02c",
+ "url": "https://api.github.com/repos/reactphp/promise/zipball/8a164643313c71354582dc850b42b33fa12a4b63",
+ "reference": "8a164643313c71354582dc850b42b33fa12a4b63",
"shasum": ""
},
"require": {
@@ -5111,7 +5094,7 @@
],
"support": {
"issues": "https://github.com/reactphp/promise/issues",
- "source": "https://github.com/reactphp/promise/tree/v3.1.0"
+ "source": "https://github.com/reactphp/promise/tree/v3.2.0"
},
"funding": [
{
@@ -5119,7 +5102,7 @@
"type": "open_collective"
}
],
- "time": "2023-11-16T16:21:57+00:00"
+ "time": "2024-05-24T10:39:05+00:00"
},
{
"name": "react/socket",
@@ -9331,16 +9314,16 @@
},
{
"name": "composer/pcre",
- "version": "3.1.3",
+ "version": "3.1.4",
"source": {
"type": "git",
"url": "https://github.com/composer/pcre.git",
- "reference": "5b16e25a5355f1f3afdfc2f954a0a80aec4826a8"
+ "reference": "04229f163664973f68f38f6f73d917799168ef24"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/composer/pcre/zipball/5b16e25a5355f1f3afdfc2f954a0a80aec4826a8",
- "reference": "5b16e25a5355f1f3afdfc2f954a0a80aec4826a8",
+ "url": "https://api.github.com/repos/composer/pcre/zipball/04229f163664973f68f38f6f73d917799168ef24",
+ "reference": "04229f163664973f68f38f6f73d917799168ef24",
"shasum": ""
},
"require": {
@@ -9382,7 +9365,7 @@
],
"support": {
"issues": "https://github.com/composer/pcre/issues",
- "source": "https://github.com/composer/pcre/tree/3.1.3"
+ "source": "https://github.com/composer/pcre/tree/3.1.4"
},
"funding": [
{
@@ -9398,7 +9381,7 @@
"type": "tidelift"
}
],
- "time": "2024-03-19T10:26:25+00:00"
+ "time": "2024-05-27T13:40:54+00:00"
},
{
"name": "composer/xdebug-handler",
@@ -9975,16 +9958,16 @@
},
{
"name": "squizlabs/php_codesniffer",
- "version": "3.9.2",
+ "version": "3.10.1",
"source": {
"type": "git",
"url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git",
- "reference": "aac1f6f347a5c5ac6bc98ad395007df00990f480"
+ "reference": "8f90f7a53ce271935282967f53d0894f8f1ff877"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/aac1f6f347a5c5ac6bc98ad395007df00990f480",
- "reference": "aac1f6f347a5c5ac6bc98ad395007df00990f480",
+ "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/8f90f7a53ce271935282967f53d0894f8f1ff877",
+ "reference": "8f90f7a53ce271935282967f53d0894f8f1ff877",
"shasum": ""
},
"require": {
@@ -10051,7 +10034,7 @@
"type": "open_collective"
}
],
- "time": "2024-04-23T20:25:34+00:00"
+ "time": "2024-05-22T21:24:41+00:00"
},
{
"name": "symfony/config",
diff --git a/flexiapi/resources/views/api/documentation_markdown.blade.php b/flexiapi/resources/views/api/documentation_markdown.blade.php
index d24b277..628834e 100644
--- a/flexiapi/resources/views/api/documentation_markdown.blade.php
+++ b/flexiapi/resources/views/api/documentation_markdown.blade.php
@@ -326,6 +326,10 @@ JSON parameters:
* `phone` optional, a phone number, set a phone number to the account
* `dtmf_protocol` optional, values must be `sipinfo`, `sipmessage` or `rfc2833`
+Using this endpoint you can also set a fresh dictionnary if the parameter is set. The existing dictionary entries will be destroyed.
+
+* `dictionary` optional, an associative array attached to the account, see also the related endpoints.
+
### `GET /accounts`
Admin
diff --git a/flexiapi/tests/Feature/ApiAccountTest.php b/flexiapi/tests/Feature/ApiAccountTest.php
index 4d1438c..e9ffb42 100644
--- a/flexiapi/tests/Feature/ApiAccountTest.php
+++ b/flexiapi/tests/Feature/ApiAccountTest.php
@@ -344,8 +344,10 @@ class ApiAccountTest extends TestCase
$entryKey = 'foo';
$entryValue = 'bar';
+ $entryNewKey = 'new_key';
+ $entryNewValue = 'new_value';
- $this->keyAuthenticated($admin)
+ $result = $this->keyAuthenticated($admin)
->json($this->method, $this->route, [
'username' => 'john',
'domain' => 'lennon.com',
@@ -362,6 +364,8 @@ class ApiAccountTest extends TestCase
]
]);
+ $accountId = $result->json('id');
+
$this->keyAuthenticated($admin)
->json($this->method, $this->route, [
'username' => 'john2',
@@ -381,6 +385,43 @@ class ApiAccountTest extends TestCase
'algorithm' => 'SHA-256',
'dictionary' => 'hop'
])->assertJsonValidationErrors(['dictionary']);
+
+ // Account update
+
+ $this->keyAuthenticated($admin)
+ ->json('PUT', $this->route . '/' . $accountId, [
+ 'username' => 'john3',
+ 'password' => 'bar',
+ 'algorithm' => 'SHA-256',
+ 'dictionary' => [
+ $entryNewKey => $entryNewValue
+ ]
+ ])
+ ->assertJsonMissing([
+ 'dictionary' => [
+ $entryKey => $entryValue
+ ]
+ ])
+ ->assertJson([
+ 'dictionary' => [
+ $entryNewKey => $entryNewValue
+ ]
+ ])
+ ->assertStatus(200);
+
+ $this->keyAuthenticated($admin)
+ ->json('GET', $this->route . '/' . $accountId)
+ ->assertStatus(200)
+ ->assertJsonMissing([
+ 'dictionary' => [
+ $entryKey => $entryValue
+ ]
+ ])
+ ->assertJson([
+ 'dictionary' => [
+ $entryNewKey => $entryNewValue
+ ]
+ ]);
}
public function testActivated()