diff --git a/flexiapi/app/Account.php b/flexiapi/app/Account.php index 2a2dcaa..884a30d 100644 --- a/flexiapi/app/Account.php +++ b/flexiapi/app/Account.php @@ -228,8 +228,7 @@ class Account extends Authenticatable public function toVcard4() { - $vcard = ' -BEGIN:VCARD + $vcard = 'BEGIN:VCARD VERSION:4.0 KIND:individual MEMBER:'.$this->getIdentifierAttribute(); @@ -250,7 +249,6 @@ X-LINPHONE-ACCOUNT-ACTION:'.$action->key.';'.$action->code.';'.$action->protocol } return $vcard . ' -END:VCARD - '; +END:VCARD'; } } diff --git a/flexiapi/app/Http/Controllers/Account/ContactVcardController.php b/flexiapi/app/Http/Controllers/Account/ContactVcardController.php index b57fe2f..1051f85 100644 --- a/flexiapi/app/Http/Controllers/Account/ContactVcardController.php +++ b/flexiapi/app/Http/Controllers/Account/ContactVcardController.php @@ -30,8 +30,7 @@ class ContactVcardController extends Controller return response( $request->user()->contacts->map(function ($contact) { return $contact->toVcard4(); - })->implode(' - ') + })->implode("\n") ); } diff --git a/flexiapi/app/Http/Controllers/Api/AccountContactController.php b/flexiapi/app/Http/Controllers/Api/AccountContactController.php index 520a049..ef4b98e 100644 --- a/flexiapi/app/Http/Controllers/Api/AccountContactController.php +++ b/flexiapi/app/Http/Controllers/Api/AccountContactController.php @@ -27,26 +27,14 @@ class AccountContactController extends Controller { public function index(Request $request) { - $contacts = $request->user()->contacts; - - return $request->has('vcard') - ? response($contacts->map(function ($contact) { - return $contact->toVcard4(); - })->implode(' - ') - ) - : $contacts; + return $request->user()->contacts; } public function show(Request $request, string $sip) { - $contact = $request->user() + return $request->user() ->contacts() ->sip($sip) ->firstOrFail(); - - return $request->has('vcard') - ? $contact->toVcard4() - : $contact; } } diff --git a/flexiapi/resources/views/api/documentation_markdown.blade.php b/flexiapi/resources/views/api/documentation_markdown.blade.php index a5b99ff..de34673 100644 --- a/flexiapi/resources/views/api/documentation_markdown.blade.php +++ b/flexiapi/resources/views/api/documentation_markdown.blade.php @@ -150,6 +150,14 @@ Return the user registered devices. #### `DELETE /accounts/me/devices/{uuid}` Remove one of the user registered devices. +### Accounts devices + +#### `GET /accounts/me/contacts` +Return the user contacts. + +#### `GET /accounts/me/contacts/{sip}` +Return a user contact. + ## Admin endpoints Those endpoints are authenticated and requires an admin account. diff --git a/flexiapi/routes/api.php b/flexiapi/routes/api.php index 01ba16d..aa982aa 100644 --- a/flexiapi/routes/api.php +++ b/flexiapi/routes/api.php @@ -49,8 +49,8 @@ Route::group(['middleware' => ['auth.digest_or_key']], function () { Route::post('accounts/me/email/request', 'Api\EmailController@requestUpdate'); Route::post('accounts/me/password', 'Api\PasswordController@update'); - Route::get('accounts/me/contacts', 'Api\AccountContactController@index'); Route::get('accounts/me/contacts/{sip}', 'Api\AccountContactController@show'); + Route::get('accounts/me/contacts', 'Api\AccountContactController@index'); Route::group(['middleware' => ['auth.admin']], function () { // Accounts diff --git a/flexiapi/tests/Feature/AccountContactsTest.php b/flexiapi/tests/Feature/AccountContactsTest.php index 9af179e..e31ed5c 100644 --- a/flexiapi/tests/Feature/AccountContactsTest.php +++ b/flexiapi/tests/Feature/AccountContactsTest.php @@ -39,6 +39,7 @@ class AccountContactTest extends TestCase { $password1 = Password::factory()->create(); $password2 = Password::factory()->create(); + $password3 = Password::factory()->create(); $typeKey = 'phone'; $actionKey = '123'; @@ -54,6 +55,12 @@ class AccountContactTest extends TestCase $this->assertEquals(1, DB::table('contacts')->count()); + $this->keyAuthenticated($admin->account) + ->json($this->method, $this->route.'/'.$password1->account->id.'/contacts/'.$password3->account->id) + ->assertStatus(200); + + $this->assertEquals(2, DB::table('contacts')->count()); + // Type $this->keyAuthenticated($admin->account) ->json($this->method, '/api/account_types', [ @@ -79,7 +86,7 @@ class AccountContactTest extends TestCase $this->keyAuthenticated($admin->account) ->json($this->method, $this->route.'/'.$password1->account->id.'/contacts/'.$password2->account->id) ->assertStatus(403); - $this->assertEquals(1, DB::table('contacts')->count()); + $this->assertEquals(2, DB::table('contacts')->count()); $this->keyAuthenticated($admin->account) ->get($this->route.'/'.$password1->account->id.'/contacts') @@ -101,6 +108,14 @@ class AccountContactTest extends TestCase 'activated' => true ]]); + $this->keyAuthenticated($password1->account) + ->get($this->route.'/me/contacts/'.$password2->account->identifier) + ->assertStatus(200) + ->assertJson([ + 'username' => $password2->account->username, + 'activated' => true + ]); + // Vcard 4.0 $this->keyAuthenticated($password1->account) ->get('/contacts/vcard') @@ -127,12 +142,12 @@ class AccountContactTest extends TestCase ->delete($this->route.'/'.$password1->account->id.'/contacts/'.$password2->account->id) ->assertStatus(200); - $this->assertEquals(0, DB::table('contacts')->count()); + $this->assertEquals(1, DB::table('contacts')->count()); // Retry $this->keyAuthenticated($admin->account) ->delete($this->route.'/'.$password1->account->id.'/contacts/'.$password2->account->id) ->assertStatus(403); - $this->assertEquals(0, DB::table('contacts')->count()); + $this->assertEquals(1, DB::table('contacts')->count()); } } diff --git a/flexisip-account-manager.spec b/flexisip-account-manager.spec index bc6b87b..c98f9fb 100644 --- a/flexisip-account-manager.spec +++ b/flexisip-account-manager.spec @@ -8,7 +8,7 @@ #%define _datadir %{_datarootdir} #%define _docdir %{_datadir}/doc -%define build_number 108 +%define build_number 109 %define var_dir /var/opt/belledonne-communications %define opt_dir /opt/belledonne-communications/share/flexisip-account-manager