diff --git a/.env.testing.example b/.env.testing.example index 658141c..a69adf0 100644 --- a/.env.testing.example +++ b/.env.testing.example @@ -2,7 +2,7 @@ APP_NAME=Laravel APP_ENV=testing APP_KEY=base64:UypKzhOMAs2aDu3ovgw/lINvWZQWicbz9nfUXDpDzeQ= APP_DEBUG=true -APP_URL="http://127.0.0.25:8888" +APP_URL="http://127.0.0.1:8888" LOG_CHANNEL=stack LOG_LEVEL=debug diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php index 15f9fb3..0940f66 100644 --- a/app/Exceptions/Handler.php +++ b/app/Exceptions/Handler.php @@ -28,7 +28,8 @@ class Handler extends ExceptionHandler * @var array */ protected $dontReport = [ - ApiErrorException::class + ApiErrorException::class, + RedirectTo::class ]; /** @@ -51,22 +52,6 @@ class Handler extends ExceptionHandler // } - /** - * Report or log an exception. - * - * @param \Throwable $exception - * @return void - * - * @throws \Exception - */ - public function report(Throwable $e) - { - if (get_class($e) == RedirectTo::class) { - abort(redirect($e->url)); - } - parent::report($e); - } - /** * Render an exception into an HTTP response. * diff --git a/app/Http/Controllers/Api/V1/CustomerController.php b/app/Http/Controllers/Api/V1/CustomerController.php index cee4ff1..0482273 100644 --- a/app/Http/Controllers/Api/V1/CustomerController.php +++ b/app/Http/Controllers/Api/V1/CustomerController.php @@ -43,7 +43,7 @@ class CustomerController extends Controller } $brandId = $request->brand_id; - $email = filter_var($request->email, FILTER_SANITIZE_EMAIL); + $email = strtolower(filter_var($request->email, FILTER_SANITIZE_EMAIL)); $firstname = filter_var($request->firstname, FILTER_SANITIZE_STRING); $lastname = filter_var($request->lastname, FILTER_SANITIZE_STRING); $optIn = filter_var($request->opt_in, FILTER_SANITIZE_STRING); @@ -55,7 +55,7 @@ class CustomerController extends Controller // Si le customer n'existe pas déjà if (!$customer) { $customer = new Customer(); - $customer->email = strtolower($email); + $customer->email = $email; $customer->save(); $singleOptin = SingleOptin::where([['email', $email], ['brand_id', $brandId]])->first(); if ($singleOptin) { @@ -103,8 +103,6 @@ class CustomerController extends Controller $customerLogin->last_connection = now(); $customerLogin->brand_id = $brandId; $customerLogin->status = 0; - // Par défaut à 0 pour activation par mail - //$customerLogin->status = $request->status !== null ? 1 : 0; $customer->logins()->save($customerLogin); @@ -295,7 +293,7 @@ class CustomerController extends Controller $login = $customer->logins()->where('brand_id', $brandId)->first(); if ($login) { if (Hash::check($password, $login->password)) { - if ($login->status === 0) { + if ($login->status === false) { $infos = $customer->infos()->where('brand_id', $brandId)->first(); // "Le compte de l'utilisateur n'est pas activé" return new StatusResource( @@ -397,8 +395,8 @@ class CustomerController extends Controller if ($customer) { $login = $customer->logins()->where('brand_id', $brandId)->first(); if ($login) { - if ($login->status === 0) { - $login->status = 1; + if ($login->status === false) { + $login->status = true; $login->save(); // "Le compte a bien été activé" return new StatusResource(['status' => 'OK', 'message' => 'Update complete.']); diff --git a/app/Http/Controllers/Api/V2/CustomerController.php b/app/Http/Controllers/Api/V2/CustomerController.php index 06f48b4..1c00810 100644 --- a/app/Http/Controllers/Api/V2/CustomerController.php +++ b/app/Http/Controllers/Api/V2/CustomerController.php @@ -180,7 +180,7 @@ class CustomerController extends Controller throw new ApiErrorException(ApiError::authFailed()); } - if ($customerLogin->status === 0) { + if (!$customerLogin->status) { throw new ApiErrorException(ApiError::customerNotActivated()); } @@ -201,8 +201,8 @@ class CustomerController extends Controller $this->authorize('customerBelongsToService', $customer); $login = $customer->login($service->brand, Customer::FIRST_OR_FAIL); - if ($login->status === 0) { - $login->status = 1; + if (!$login->status) { + $login->status = true; $login->save(); return response()->json(); } else { diff --git a/app/Http/Controllers/CustomerController.php b/app/Http/Controllers/CustomerController.php index ef34a83..7ae92c5 100644 --- a/app/Http/Controllers/CustomerController.php +++ b/app/Http/Controllers/CustomerController.php @@ -9,6 +9,7 @@ use App\Models\Customer; use App\Models\CustomerInfo; use App\Models\CustomerLogin; use App\Models\SingleOptin; +use Exception; use Illuminate\Database\Query\JoinClause; use Illuminate\Http\Request; use Illuminate\Support\Carbon; @@ -179,11 +180,11 @@ class CustomerController extends Controller $continue = true; // continue case CustomerExportType::customer(): - $i = 0; + $page = 1; /** @var \Illuminate\Database\Eloquent\Builder $req */ $req = CustomerInfo::where('brand_id', $request->brand); $total = $req->count(); - $pages = $total / $pagination; + $pages = \ceil($total / $pagination); do { /** @var \Illuminate\Pagination\LengthAwarePaginator $items */ $items = $req->with('customer', function ($q) { @@ -192,7 +193,7 @@ class CustomerController extends Controller $pagination, ['lastname', 'firstname', 'hashcode', 'customer_id'], 'page', - $i + $page ); $items->map(function (CustomerInfo $customerInfo) use ($w) { $w->insertOne([ @@ -202,7 +203,7 @@ class CustomerController extends Controller 'hashcode' => $customerInfo->hashcode ]); }); - } while ($i++ <= $pages); + } while ($page++ <= $pages); if (!isset($continue)) { break; } @@ -218,6 +219,8 @@ class CustomerController extends Controller ]); }); break; + default: + throw new Exception(sprintf('Unhandled CustomerExportType %s', $exportType->label)); } //we create a callable to output the CSV in chunk diff --git a/app/Http/Requests/Api/V2/BaseApiRequest.php b/app/Http/Requests/Api/V2/BaseApiRequest.php index 4dec00b..851fef6 100644 --- a/app/Http/Requests/Api/V2/BaseApiRequest.php +++ b/app/Http/Requests/Api/V2/BaseApiRequest.php @@ -2,9 +2,11 @@ namespace App\Http\Requests\Api\V2; +use ArondeParon\RequestSanitizer\Sanitizers\Capitalize; use ArondeParon\RequestSanitizer\Sanitizers\Lowercase; use ArondeParon\RequestSanitizer\Sanitizers\RemoveNonNumeric; use ArondeParon\RequestSanitizer\Sanitizers\Trim; +use ArondeParon\RequestSanitizer\Sanitizers\TrimDuplicateSpaces; use ArondeParon\RequestSanitizer\Traits\SanitizesInputs; use Illuminate\Foundation\Http\FormRequest; @@ -13,9 +15,15 @@ abstract class BaseApiRequest extends FormRequest use SanitizesInputs; protected $sanitizers = [ + 'firstname' => [Trim::class, TrimDuplicateSpaces::class, Capitalize::class], + 'lastname' => [Trim::class, TrimDuplicateSpaces::class, Capitalize::class], + 'address' => [Trim::class, TrimDuplicateSpaces::class], + 'address2' => [Trim::class, TrimDuplicateSpaces::class], + 'city' => [Trim::class, TrimDuplicateSpaces::class], 'password' => Trim::class, + 'phone' => Trim::class, 'email' => [Lowercase::class, Trim::class], - 'postcode' => RemoveNonNumeric::class + 'postcode' => [RemoveNonNumeric::class, Trim::class] ]; /** diff --git a/app/Http/Resources/Api/V2/CustomerResource.php b/app/Http/Resources/Api/V2/CustomerResource.php index da2a64a..cbf066c 100644 --- a/app/Http/Resources/Api/V2/CustomerResource.php +++ b/app/Http/Resources/Api/V2/CustomerResource.php @@ -9,13 +9,13 @@ use Illuminate\Http\Resources\Json\JsonResource; class CustomerResource extends JsonResource { - /** @var Customer */ + /** @var \App\Models\Customer */ private $customer; - /** @var CustomerInfo */ + /** @var \App\Models\CustomerInfo */ private $info; - /** @var CustomerLogin */ + /** @var \App\Models\CustomerLogin */ private $login; private static $skeleton = [ @@ -75,7 +75,8 @@ class CustomerResource extends JsonResource $this->getSkeleton() ); - $data['country'] = $this->info->newcountry->value; + $data['country'] = $this->info->newcountry->value; + $data['address2'] = $this->info->address2 ?? ''; return $data; } diff --git a/app/Models/CustomerInfo.php b/app/Models/CustomerInfo.php index e657fc6..3da4e03 100644 --- a/app/Models/CustomerInfo.php +++ b/app/Models/CustomerInfo.php @@ -17,6 +17,10 @@ class CustomerInfo extends Model 'newcountry' => Country::class ]; + protected $casts = [ + 'opt_in' => 'bool' + ]; + protected $fillable = [ 'firstname', 'lastname', @@ -44,7 +48,7 @@ class CustomerInfo extends Model if (ctype_digit($customerInfo->country)) { try { $customerInfo->newcountry = Country::make((int)$customerInfo->country); - } catch (\TypeError $e) { + } catch (\BadMethodCallException $e) { // TODO change this when country column is updated // Set afghanistan as default country for now $customerInfo->newcountry = Country::afghanistan(); @@ -68,7 +72,7 @@ class CustomerInfo extends Model if (ctype_digit($customerInfo->country)) { try { $customerInfo->newcountry = Country::make((int)$customerInfo->country); - } catch (\TypeError $e) { + } catch (\BadMethodCallException $e) { // TODO change this when country column is updated // Set afghanistan as default country for now $customerInfo->newcountry = Country::afghanistan(); diff --git a/app/Models/CustomerLogin.php b/app/Models/CustomerLogin.php index 6922714..5c26542 100644 --- a/app/Models/CustomerLogin.php +++ b/app/Models/CustomerLogin.php @@ -10,10 +10,18 @@ class CustomerLogin extends Model { use HasFactory; + protected $attributes = [ + 'status' => false + ]; + protected $fillable = [ 'password' ]; + protected $casts = [ + 'status' => 'bool' + ]; + protected static function booted() { static::creating(function ($customerLogin) { diff --git a/clients/V2 b/clients/V2 index c5249d3..390033d 160000 --- a/clients/V2 +++ b/clients/V2 @@ -1 +1 @@ -Subproject commit c5249d37a14d125dfa85d49cea495da4efb79490 +Subproject commit 390033d3da4b5f9447410656f3d23787557588b5 diff --git a/composer.json b/composer.json index d723901..b23e82f 100644 --- a/composer.json +++ b/composer.json @@ -1,7 +1,7 @@ { "name": "ldc/ldccrmv2client", "type": "project", - "version": "2.2.1", + "version": "2.2.3", "description": "LDC CRM V2", "authors": [ { @@ -94,8 +94,8 @@ "configclear": "@php artisan config:clear", "runtestmigration": "@php artisan migrate:fresh --env=testing --seed", "runtest": "@php artisan test", - "runserve": "@php artisan serve --host=127.0.0.25 --port=8888 --env=testing&", - "killserve": "kill $(ps -f | grep '[1]27.0.0.25:8888' | awk '{print $2}')", + "runserve": "@php artisan serve --host=127.0.0.1 --port=8888 --env=testing&", + "killserve": "kill $(ps -f | grep '[1]27.0.0.1:8888' | awk '{print $2}')", "post-autoload-dump": [ "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump", "@php artisan package:discover --ansi" diff --git a/phpunit.xml b/phpunit.xml index 7b01f29..8919029 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -19,7 +19,7 @@ - + diff --git a/tests/Unit/CrmClientTester.php b/tests/Unit/CrmClientTester.php index 6059a01..416cc9f 100644 --- a/tests/Unit/CrmClientTester.php +++ b/tests/Unit/CrmClientTester.php @@ -39,7 +39,7 @@ abstract class CrmClientTester extends TestCase } config(['crm.token' => self::$service->bearer_token]); config(['crm.password' => self::$service->bearer_pwd]); - config(['crm.endpoint' => 'http://127.0.0.25:8888']); + config(['crm.endpoint' => 'http://127.0.0.1:8888']); } /** diff --git a/tests/Unit/CrmClientV2CustomerTest.php b/tests/Unit/CrmClientV2CustomerTest.php index 2ea1a2e..e1c348d 100644 --- a/tests/Unit/CrmClientV2CustomerTest.php +++ b/tests/Unit/CrmClientV2CustomerTest.php @@ -155,13 +155,13 @@ class CrmClientV2CustomerTest extends CrmClientTester $this->assertTrue($customer->save()); $customer = $api->getCustomerOrNew(static::$info->hashcode); - $this->assertEquals('toto', $customer->firstname); + $this->assertEquals('Toto', $customer->firstname); $customer->lastname = 'pouet'; $this->assertTrue($customer->save()); $customer = $api->getCustomerOrNew(static::$info->hashcode); - $this->assertEquals('pouet', $customer->lastname); + $this->assertEquals('Pouet', $customer->lastname); $customer->country = Country::belgium(); $customer->save(); @@ -223,7 +223,7 @@ class CrmClientV2CustomerTest extends CrmClientTester $this->assertTrue($customer->save()); - $this->assertEquals('toto', $customer->firstname); + $this->assertEquals('Toto', $customer->firstname); $this->assertEquals(null, $customer->password); }