diff --git a/src/app/Console/Command.php b/src/app/Console/Command.php new file mode 100644 --- /dev/null +++ b/src/app/Console/Command.php @@ -0,0 +1,61 @@ +getObject(\App\Domain::class, $domain, 'namespace'); + } + + /** + * Find an object. + * + * @param string $objectClass The name of the class + * @param string $objectTitle The name of a database field to match. + * + * @return mixed + */ + public function getObject($objectClass, $objectIdOrTitle, $objectTitle) + { + $object = $objectClass::find($objectIdOrTitle); + + if (!$object && !empty($objectTitle)) { + $object = $objectClass::where($objectTitle, $objectIdOrTitle)->first(); + } + + return $object; + } + + /** + * Find the user. + * + * @param string $user User ID or email + * + * @return \App\User|null + */ + public function getUser($user) + { + return $this->getObject(\App\User::class, $user, 'email'); + } + + /** + * Find the wallet. + * + * @param string $wallet Wallet ID + * + * @return \App\Wallet|null + */ + public function getWallet($wallet) + { + return $this->getObject(\App\Wallet::class, $wallet, null); + } +} diff --git a/src/app/Console/Commands/DBPing.php b/src/app/Console/Commands/DB/PingCommand.php rename from src/app/Console/Commands/DBPing.php rename to src/app/Console/Commands/DB/PingCommand.php --- a/src/app/Console/Commands/DBPing.php +++ b/src/app/Console/Commands/DB/PingCommand.php @@ -1,11 +1,11 @@ currency @@ -16,14 +17,14 @@ * * @var string */ - protected $signature = 'data:countries'; + protected $signature = 'data:import:countries'; /** * The console command description. * * @var string */ - protected $description = 'Fetches countries map from wikipedia'; + protected $description = 'Fetches countries map from country.io'; /** * Execute the console command. @@ -32,43 +33,63 @@ */ public function handle() { + $today = Carbon::now()->toDateString(); + $countries = []; $currencies = []; - $currencies_url = 'http://country.io/currency.json'; - $countries_url = 'http://country.io/names.json'; - - $this->info("Fetching currencies from $currencies_url..."); + $currencySource = 'http://country.io/currency.json'; + $countrySource = 'http://country.io/names.json'; - // fetch currency table and create an index by country page url - $currencies_json = file_get_contents($currencies_url); + // + // countries + // + $file = storage_path("countries-{$today}.json"); - if (!$currencies_json) { - $this->error("Failed to fetch currencies"); - return; - } + $this->info("Retrieving {$countrySource}..."); - $this->info("Fetching countries from $countries_url..."); + \App\Utils::downloadFile($countrySource, $file); - $countries_json = file_get_contents($countries_url); + $countryJson = file_get_contents($file); - if (!$countries_json) { + if (!$countryJson) { $this->error("Failed to fetch countries"); - return; + return 1; } - $currencies = json_decode($currencies_json, true); - $countries = json_decode($countries_json, true); + $countries = json_decode($countryJson, true); if (!is_array($countries) || empty($countries)) { $this->error("Invalid countries data"); + return 1; + } + + // + // currencies + // + $file = storage_path("currencies-{$today}.json"); + + $this->info("Retrieving {$currencySource}..."); + + \App\Utils::downloadFile($currencySource, $file); + + // fetch currency table and create an index by country page url + $currencyJson = file_get_contents($file); + + if (!$currencyJson) { + $this->error("Failed to fetch currencies"); return; } + $currencies = json_decode($currencyJson, true); + if (!is_array($currencies) || empty($currencies)) { $this->error("Invalid currencies data"); - return; + return 1; } + // + // export + // $file = resource_path('countries.php'); $this->info("Generating resource file $file..."); @@ -76,6 +97,7 @@ asort($countries); $out = " $name) { $currency = $currencies[$code] ?? null; @@ -84,12 +106,13 @@ } if (!$currency) { - $this->error("Unknown currency for {$name} ({$code}). Skipped."); + $this->warn("Unknown currency for {$name} ({$code}). Skipped."); continue; } $out .= sprintf(" '%s' => ['%s','%s'],\n", $code, $currency, addslashes($name)); } + $out .= "];\n"; file_put_contents($file, $out); diff --git a/src/app/Console/Commands/Data/ImportCommand.php b/src/app/Console/Commands/Data/ImportCommand.php new file mode 100644 --- /dev/null +++ b/src/app/Console/Commands/Data/ImportCommand.php @@ -0,0 +1,40 @@ +output = $this->output; + $execution->handle(); + } + } +} diff --git a/src/app/Console/Commands/Discount/ReadCommand.php b/src/app/Console/Commands/Discount/ReadCommand.php new file mode 100644 --- /dev/null +++ b/src/app/Console/Commands/Discount/ReadCommand.php @@ -0,0 +1,12 @@ +orderBy('discount')->get()->each( - function ($discount) { - $name = $discount->description; - - if ($discount->code) { - $name .= " [{$discount->code}]"; - } - - $this->info( - sprintf( - "%s %3d%% %s", - $discount->id, - $discount->discount, - $name - ) - ); - } - ); - } -} diff --git a/src/app/Console/Commands/DiscountsCommand.php b/src/app/Console/Commands/DiscountsCommand.php new file mode 100644 --- /dev/null +++ b/src/app/Console/Commands/DiscountsCommand.php @@ -0,0 +1,14 @@ +argument('domain'))->first(); + $domain = $this->getDomain($this->argument('domain')); if (!$domain) { + $this->error("Domain not found."); return 1; } diff --git a/src/app/Console/Commands/DomainList.php b/src/app/Console/Commands/Domain/ListDomains.php rename from src/app/Console/Commands/DomainList.php rename to src/app/Console/Commands/Domain/ListDomains.php --- a/src/app/Console/Commands/DomainList.php +++ b/src/app/Console/Commands/Domain/ListDomains.php @@ -1,11 +1,11 @@ argument('domain'))->first(); + $domain = $this->getDomain($this->argument('domain')); if (!$domain) { + $this->error("Domain not found."); return 1; } diff --git a/src/app/Console/Commands/DomainSetStatus.php b/src/app/Console/Commands/Domain/SetStatus.php rename from src/app/Console/Commands/DomainSetStatus.php rename to src/app/Console/Commands/Domain/SetStatus.php --- a/src/app/Console/Commands/DomainSetStatus.php +++ b/src/app/Console/Commands/Domain/SetStatus.php @@ -1,12 +1,12 @@ argument('domain'))->first(); + $domain = $this->getDomain($this->argument('domain')); if (!$domain) { + $this->error("Domain not found."); return 1; } diff --git a/src/app/Console/Commands/DomainSetWallet.php b/src/app/Console/Commands/Domain/SetWallet.php rename from src/app/Console/Commands/DomainSetWallet.php rename to src/app/Console/Commands/Domain/SetWallet.php --- a/src/app/Console/Commands/DomainSetWallet.php +++ b/src/app/Console/Commands/Domain/SetWallet.php @@ -1,15 +1,15 @@ argument('domain'))->first(); + $domain = $this->getDomain($this->argument('domain')); if (!$domain) { $this->error("Domain not found."); diff --git a/src/app/Console/Commands/DomainStatus.php b/src/app/Console/Commands/Domain/Status.php rename from src/app/Console/Commands/DomainStatus.php rename to src/app/Console/Commands/Domain/Status.php --- a/src/app/Console/Commands/DomainStatus.php +++ b/src/app/Console/Commands/Domain/Status.php @@ -1,11 +1,11 @@ argument('domain'))->first(); + $domain = $this->getDomain($this->argument('domain')); if (!$domain) { + $this->error("Domain not found."); return 1; } diff --git a/src/app/Console/Commands/DomainSuspend.php b/src/app/Console/Commands/Domain/Suspend.php rename from src/app/Console/Commands/DomainSuspend.php rename to src/app/Console/Commands/Domain/Suspend.php --- a/src/app/Console/Commands/DomainSuspend.php +++ b/src/app/Console/Commands/Domain/Suspend.php @@ -1,11 +1,11 @@ argument('domain'))->first(); + $domain = $this->getDomain($this->argument('domain')); if (!$domain) { + $this->error("Domain not found."); return 1; } - $this->info("Found domain: {$domain->id}"); - $domain->suspend(); } } diff --git a/src/app/Console/Commands/DomainUnsuspend.php b/src/app/Console/Commands/Domain/Unsuspend.php rename from src/app/Console/Commands/DomainUnsuspend.php rename to src/app/Console/Commands/Domain/Unsuspend.php --- a/src/app/Console/Commands/DomainUnsuspend.php +++ b/src/app/Console/Commands/Domain/Unsuspend.php @@ -1,11 +1,11 @@ argument('domain'))->first(); + $domain = $this->getDomain($this->argument('domain')); if (!$domain) { + $this->error("Domain not found."); return 1; } - $this->info("Found domain {$domain->id}"); - $domain->unsuspend(); } } diff --git a/src/app/Console/Commands/DomainsCommand.php b/src/app/Console/Commands/DomainsCommand.php new file mode 100644 --- /dev/null +++ b/src/app/Console/Commands/DomainsCommand.php @@ -0,0 +1,12 @@ +argument('domain'))->first(); + $domain = $this->getDomain($this->argument('domain')); if (!$domain) { + $this->error("Domain not found"); return 1; } diff --git a/src/app/Console/Commands/Job/DomainUpdate.php b/src/app/Console/Commands/Job/DomainUpdate.php --- a/src/app/Console/Commands/Job/DomainUpdate.php +++ b/src/app/Console/Commands/Job/DomainUpdate.php @@ -2,8 +2,7 @@ namespace App\Console\Commands\Job; -use App\Domain; -use Illuminate\Console\Command; +use App\Console\Command; class DomainUpdate extends Command { @@ -28,9 +27,10 @@ */ public function handle() { - $domain = Domain::where('namespace', $this->argument('domain'))->first(); + $domain = $this->getDomain($this->argument('domain')); if (!$domain) { + $this->error("Domain not found"); return 1; } diff --git a/src/app/Console/Commands/Job/UserCreate.php b/src/app/Console/Commands/Job/UserCreate.php --- a/src/app/Console/Commands/Job/UserCreate.php +++ b/src/app/Console/Commands/Job/UserCreate.php @@ -2,8 +2,7 @@ namespace App\Console\Commands\Job; -use App\User; -use Illuminate\Console\Command; +use App\Console\Command; class UserCreate extends Command { @@ -28,9 +27,10 @@ */ public function handle() { - $user = User::where('email', $this->argument('user'))->first(); + $user = $this->getUser($this->argument('user')); if (!$user) { + $this->error("User not found"); return 1; } diff --git a/src/app/Console/Commands/Job/UserUpdate.php b/src/app/Console/Commands/Job/UserUpdate.php --- a/src/app/Console/Commands/Job/UserUpdate.php +++ b/src/app/Console/Commands/Job/UserUpdate.php @@ -2,8 +2,7 @@ namespace App\Console\Commands\Job; -use App\User; -use Illuminate\Console\Command; +use App\Console\Command; class UserUpdate extends Command { @@ -28,9 +27,10 @@ */ public function handle() { - $user = User::where('email', $this->argument('user'))->first(); + $user = $this->getUser($this->argument('user')); if (!$user) { + $this->error("User not found"); return 1; } diff --git a/src/app/Console/Commands/Job/WalletCheck.php b/src/app/Console/Commands/Job/WalletCheck.php --- a/src/app/Console/Commands/Job/WalletCheck.php +++ b/src/app/Console/Commands/Job/WalletCheck.php @@ -2,8 +2,8 @@ namespace App\Console\Commands\Job; +use App\Console\Command; use App\Wallet; -use Illuminate\Console\Command; class WalletCheck extends Command { @@ -31,6 +31,7 @@ $wallet = Wallet::find($this->argument('wallet')); if (!$wallet) { + $this->error("Wallet not found"); return 1; } diff --git a/src/app/Console/Commands/MollieInfo.php b/src/app/Console/Commands/MollieInfo.php --- a/src/app/Console/Commands/MollieInfo.php +++ b/src/app/Console/Commands/MollieInfo.php @@ -2,8 +2,7 @@ namespace App\Console\Commands; -use App\User; -use Illuminate\Console\Command; +use App\Console\Command; class MollieInfo extends Command { @@ -29,14 +28,13 @@ public function handle() { if ($this->argument('user')) { - $user = User::where('email', $this->argument('user'))->first(); + $user = $this->getUser($this->argument('user')); if (!$user) { + $this->error("Wallet not found"); return 1; } - $this->info("Found user: {$user->id}"); - $wallet = $user->wallets->first(); $provider = new \App\Providers\Payment\Mollie(); diff --git a/src/app/Console/Commands/ObjectListCommand.php b/src/app/Console/Commands/ObjectListCommand.php new file mode 100644 --- /dev/null +++ b/src/app/Console/Commands/ObjectListCommand.php @@ -0,0 +1,78 @@ +description = "List {$this->objectName}s"; + + $classes = class_uses_recursive($this->objectClass); + + if (in_array(SoftDeletes::class, $classes)) { + $this->signature = sprintf( + "%ss {--with-deleted : Include deleted %ss}", + $this->objectName, + $this->objectName + ); + } else { + $this->signature = "{$this->objectName}s"; + } + + parent::__construct(); + } + + /** + * Execute the console command. + * + * @return mixed + */ + public function handle() + { + $classes = class_uses_recursive($this->objectClass); + + if (in_array(SoftDeletes::class, $classes) && $this->option('with-deleted')) { + $objects = $this->objectClass::withTrashed(); + } else { + $objects = new $this->objectClass(); + } + + $objects->each( + function ($object) { + if (!empty($this->objectTitle)) { + $title = $object->{$this->objectTitle}; + } else { + $title = $object->{$object->getKeyName()}; + } + + if ($object->deleted_at) { + $this->info("{$title} (deleted at {$object->deleted_at}"); + } else { + $this->info("{$title}"); + } + } + ); + } +} diff --git a/src/app/Console/Commands/ObjectReadCommand.php b/src/app/Console/Commands/ObjectReadCommand.php new file mode 100644 --- /dev/null +++ b/src/app/Console/Commands/ObjectReadCommand.php @@ -0,0 +1,56 @@ +description = "Read a {$this->objectName}"; + $this->signature = sprintf( + "%s:read {%s}", + $this->objectName, + $this->objectName + ); + + parent::__construct(); + } + + /** + * Execute the console command. + * + * @return mixed + */ + public function handle() + { + $argument = $this->argument($this->objectName); + + $object = $this->getObject($this->objectClass, $argument, $this->objectTitle); + + if (!$object) { + return 1; + } + + $this->info(var_export($object->toArray(), true)); + } +} diff --git a/src/app/Console/Commands/Package/ReadCommand.php b/src/app/Console/Commands/Package/ReadCommand.php new file mode 100644 --- /dev/null +++ b/src/app/Console/Commands/Package/ReadCommand.php @@ -0,0 +1,12 @@ +option('package')) { + $packages = Package::where('title', $this->option('package'))->get(); + } else { + $packages = Package::all(); + } + + foreach ($packages as $package) { + $this->info("{$package->title}"); + + foreach ($package->skus as $sku) { + $this->info(sprintf(" %s (%d)", $sku->title, $sku->pivot->qty)); + } + } + } +} diff --git a/src/app/Console/Commands/PackageSkus.php b/src/app/Console/Commands/PackageSkus.php deleted file mode 100644 --- a/src/app/Console/Commands/PackageSkus.php +++ /dev/null @@ -1,51 +0,0 @@ -info(sprintf("Package: %s", $package->title)); - - foreach ($package->skus as $sku) { - $this->info(sprintf(" SKU: %s (%d)", $sku->title, $sku->pivot->qty)); - } - } - } -} diff --git a/src/app/Console/Commands/PackagesCommand.php b/src/app/Console/Commands/PackagesCommand.php new file mode 100644 --- /dev/null +++ b/src/app/Console/Commands/PackagesCommand.php @@ -0,0 +1,12 @@ +argument('user')) { - $user = User::where('email', $this->argument('user'))->first(); + $user = $this->getUser($this->argument('user')); if (!$user) { + $this->error("User not found"); return 1; } - $this->info("Found user: {$user->id}"); - $wallet = $user->wallets->first(); $provider = PaymentProvider::factory('stripe'); diff --git a/src/app/Console/Commands/Transaction/ReadCommand.php b/src/app/Console/Commands/Transaction/ReadCommand.php new file mode 100644 --- /dev/null +++ b/src/app/Console/Commands/Transaction/ReadCommand.php @@ -0,0 +1,12 @@ +argument('user'))->first(); + $user = $this->getUser($this->argument('user')); if (!$user) { + $this->error("User not found."); return 1; } diff --git a/src/app/Console/Commands/UserDelete.php b/src/app/Console/Commands/User/Delete.php rename from src/app/Console/Commands/UserDelete.php rename to src/app/Console/Commands/User/Delete.php --- a/src/app/Console/Commands/UserDelete.php +++ b/src/app/Console/Commands/User/Delete.php @@ -1,10 +1,10 @@ argument('user'))->first(); + $user = $this->getUser($this->argument('user')); if (!$user) { + $this->error("User not found."); return 1; } diff --git a/src/app/Console/Commands/UserDiscount.php b/src/app/Console/Commands/User/Discount.php rename from src/app/Console/Commands/UserDiscount.php rename to src/app/Console/Commands/User/Discount.php --- a/src/app/Console/Commands/UserDiscount.php +++ b/src/app/Console/Commands/User/Discount.php @@ -1,10 +1,10 @@ argument('user'))->first(); + $user = $this->getUser($this->argument('user')); if (!$user) { + $this->error("User not found."); return 1; } - $this->info("Found user {$user->id}"); - if ($this->argument('discount') === '0') { $discount = null; } else { $discount = \App\Discount::find($this->argument('discount')); if (!$discount) { + $this->error("Discount not found."); return 1; } } diff --git a/src/app/Console/Commands/UserDomains.php b/src/app/Console/Commands/User/Domains.php rename from src/app/Console/Commands/UserDomains.php rename to src/app/Console/Commands/User/Domains.php --- a/src/app/Console/Commands/UserDomains.php +++ b/src/app/Console/Commands/User/Domains.php @@ -1,20 +1,20 @@ argument('userid'))->first(); + $user = $this->getUser($this->argument('user')); if (!$user) { + $this->error("User not found."); return 1; } diff --git a/src/app/Console/Commands/UserEntitlements.php b/src/app/Console/Commands/User/Entitlements.php rename from src/app/Console/Commands/UserEntitlements.php rename to src/app/Console/Commands/User/Entitlements.php --- a/src/app/Console/Commands/UserEntitlements.php +++ b/src/app/Console/Commands/User/Entitlements.php @@ -1,12 +1,12 @@ argument('userid'))->first(); + $user = $this->getUser($this->argument('userid')); if (!$user) { + $this->error("User not found."); return 1; } - $this->info("Found user: {$user->id}"); - $skus_counted = []; foreach ($user->entitlements as $entitlement) { diff --git a/src/app/Console/Commands/UserForceDelete.php b/src/app/Console/Commands/User/ForceDelete.php rename from src/app/Console/Commands/UserForceDelete.php rename to src/app/Console/Commands/User/ForceDelete.php --- a/src/app/Console/Commands/UserForceDelete.php +++ b/src/app/Console/Commands/User/ForceDelete.php @@ -1,11 +1,11 @@ where('email', $this->argument('user'))->first(); + $id = $this->argument('user'); + + if (is_numeric($id)) { + $user = \App\User::find($id); + } else { + $user = \App\User::withTrashed()->where('email', $id)->first(); + } if (!$user) { + $this->error("User not found."); return 1; } if (!$user->trashed()) { - $this->error('The user is not yet deleted'); + $this->error("The user is not yet deleted"); return 1; } diff --git a/src/app/Console/Commands/User/ReadCommand.php b/src/app/Console/Commands/User/ReadCommand.php new file mode 100644 --- /dev/null +++ b/src/app/Console/Commands/User/ReadCommand.php @@ -0,0 +1,12 @@ +argument('user'))->first(); + $user = $this->getUser($this->argument('user')); if (!$user) { + $this->error("User not found."); return 1; } diff --git a/src/app/Console/Commands/UserSuspend.php b/src/app/Console/Commands/User/Suspend.php rename from src/app/Console/Commands/UserSuspend.php rename to src/app/Console/Commands/User/Suspend.php --- a/src/app/Console/Commands/UserSuspend.php +++ b/src/app/Console/Commands/User/Suspend.php @@ -1,11 +1,11 @@ argument('user'))->first(); + $user = $this->getUser($this->argument('user')); if (!$user) { + $this->error("User not found."); return 1; } - $this->info("Found user: {$user->id}"); - $user->suspend(); } } diff --git a/src/app/Console/Commands/UserUnsuspend.php b/src/app/Console/Commands/User/Unsuspend.php rename from src/app/Console/Commands/UserUnsuspend.php rename to src/app/Console/Commands/User/Unsuspend.php --- a/src/app/Console/Commands/UserUnsuspend.php +++ b/src/app/Console/Commands/User/Unsuspend.php @@ -1,11 +1,11 @@ argument('user'))->first(); + $user = $this->getUser($this->argument('user')); if (!$user) { + $this->error("User not found."); return 1; } - $this->info("Found user {$user->id}"); - $user->unsuspend(); } } diff --git a/src/app/Console/Commands/UserVerify.php b/src/app/Console/Commands/User/Verify.php rename from src/app/Console/Commands/UserVerify.php rename to src/app/Console/Commands/User/Verify.php --- a/src/app/Console/Commands/UserVerify.php +++ b/src/app/Console/Commands/User/Verify.php @@ -1,10 +1,10 @@ argument('user'))->first(); + $user = $this->getUser($this->argument('user')); if (!$user) { + $this->error("User not found."); return 1; } - $this->info("Found user: {$user->id}"); - $job = new \App\Jobs\UserVerify($user); $job->handle(); } diff --git a/src/app/Console/Commands/UserWallets.php b/src/app/Console/Commands/User/Wallets.php rename from src/app/Console/Commands/UserWallets.php rename to src/app/Console/Commands/User/Wallets.php --- a/src/app/Console/Commands/UserWallets.php +++ b/src/app/Console/Commands/User/Wallets.php @@ -1,10 +1,10 @@ argument('user'))->first(); + $user = $this->getUser($this->argument('user')); if (!$user) { + $this->error("User not found."); return 1; } diff --git a/src/app/Console/Commands/UserSetting/ReadCommand.php b/src/app/Console/Commands/UserSetting/ReadCommand.php new file mode 100644 --- /dev/null +++ b/src/app/Console/Commands/UserSetting/ReadCommand.php @@ -0,0 +1,12 @@ +argument('wallet')); if (!$wallet) { + $this->error("Wallet not found"); return 1; } diff --git a/src/app/Console/Commands/WalletBalances.php b/src/app/Console/Commands/Wallet/Balances.php rename from src/app/Console/Commands/WalletBalances.php rename to src/app/Console/Commands/Wallet/Balances.php --- a/src/app/Console/Commands/WalletBalances.php +++ b/src/app/Console/Commands/Wallet/Balances.php @@ -1,10 +1,10 @@ owner) { + $this->error("Wallet not found (or account deleted)."); return 1; } diff --git a/src/app/Console/Commands/WalletExpected.php b/src/app/Console/Commands/Wallet/Expected.php rename from src/app/Console/Commands/WalletExpected.php rename to src/app/Console/Commands/Wallet/Expected.php --- a/src/app/Console/Commands/WalletExpected.php +++ b/src/app/Console/Commands/Wallet/Expected.php @@ -1,10 +1,10 @@ option('user')) { - $user = \App\User::where('email', $this->option('user')) - ->orWhere('id', $this->option('user'))->first(); + $user = $this->getUser($this->option('user')); if (!$user) { + $this->error("User not found"); return 1; } diff --git a/src/app/Console/Commands/WalletGetBalance.php b/src/app/Console/Commands/Wallet/GetBalance.php rename from src/app/Console/Commands/WalletGetBalance.php rename to src/app/Console/Commands/Wallet/GetBalance.php --- a/src/app/Console/Commands/WalletGetBalance.php +++ b/src/app/Console/Commands/Wallet/GetBalance.php @@ -1,10 +1,10 @@ argument('wallet')); if (!$wallet) { + $this->error("Wallet not found"); return 1; } diff --git a/src/app/Console/Commands/WalletGetDiscount.php b/src/app/Console/Commands/Wallet/GetDiscount.php rename from src/app/Console/Commands/WalletGetDiscount.php rename to src/app/Console/Commands/Wallet/GetDiscount.php --- a/src/app/Console/Commands/WalletGetDiscount.php +++ b/src/app/Console/Commands/Wallet/GetDiscount.php @@ -1,10 +1,10 @@ argument('wallet')); if (!$wallet) { + $this->error("Wallet not found"); return 1; } diff --git a/src/app/Console/Commands/WalletMandate.php b/src/app/Console/Commands/Wallet/Mandate.php rename from src/app/Console/Commands/WalletMandate.php rename to src/app/Console/Commands/Wallet/Mandate.php --- a/src/app/Console/Commands/WalletMandate.php +++ b/src/app/Console/Commands/Wallet/Mandate.php @@ -1,11 +1,11 @@ argument('wallet')); if (!$wallet) { + $this->error("Wallet not found"); return 1; } diff --git a/src/app/Console/Commands/Wallet/ReadCommand.php b/src/app/Console/Commands/Wallet/ReadCommand.php new file mode 100644 --- /dev/null +++ b/src/app/Console/Commands/Wallet/ReadCommand.php @@ -0,0 +1,12 @@ +argument('wallet')); if (!$wallet) { + $this->error("Wallet not found"); return 1; } diff --git a/src/app/Console/Commands/WalletSetDiscount.php b/src/app/Console/Commands/Wallet/SetDiscount.php rename from src/app/Console/Commands/WalletSetDiscount.php rename to src/app/Console/Commands/Wallet/SetDiscount.php --- a/src/app/Console/Commands/WalletSetDiscount.php +++ b/src/app/Console/Commands/Wallet/SetDiscount.php @@ -1,10 +1,10 @@ argument('wallet'))->first(); + $wallet = \App\Wallet::find($this->argument('wallet')); if (!$wallet) { + $this->error("Wallet not found"); return 1; } @@ -51,6 +42,7 @@ $discount = \App\Discount::find($this->argument('discount')); if (!$discount) { + $this->error("Discount not found"); return 1; } diff --git a/src/app/Console/Commands/WalletTransactions.php b/src/app/Console/Commands/Wallet/Transactions.php rename from src/app/Console/Commands/WalletTransactions.php rename to src/app/Console/Commands/Wallet/Transactions.php --- a/src/app/Console/Commands/WalletTransactions.php +++ b/src/app/Console/Commands/Wallet/Transactions.php @@ -1,10 +1,10 @@ argument('wallet'))->first(); + $wallet = \App\Wallet::find($this->argument('wallet')); if (!$wallet) { + $this->error("Wallet not found"); return 1; } diff --git a/src/app/Console/Commands/WalletUntil.php b/src/app/Console/Commands/Wallet/Until.php rename from src/app/Console/Commands/WalletUntil.php rename to src/app/Console/Commands/Wallet/Until.php --- a/src/app/Console/Commands/WalletUntil.php +++ b/src/app/Console/Commands/Wallet/Until.php @@ -1,10 +1,10 @@ argument('wallet')); if (!$wallet) { + $this->error("Wallet not found"); return 1; } diff --git a/src/app/Console/Commands/WalletDiscount.php b/src/app/Console/Commands/WalletDiscount.php deleted file mode 100644 --- a/src/app/Console/Commands/WalletDiscount.php +++ /dev/null @@ -1,62 +0,0 @@ -argument('wallet'))->first(); - - if (!$wallet) { - return 1; - } - - // FIXME: Using '0' for delete might be not that obvious - - if ($this->argument('discount') === '0') { - $wallet->discount()->dissociate(); - } else { - $discount = \App\Discount::find($this->argument('discount')); - - if (!$discount) { - return 1; - } - - $wallet->discount()->associate($discount); - } - - $wallet->save(); - } -} diff --git a/src/app/Console/Commands/WalletSetting/ReadCommand.php b/src/app/Console/Commands/WalletSetting/ReadCommand.php new file mode 100644 --- /dev/null +++ b/src/app/Console/Commands/WalletSetting/ReadCommand.php @@ -0,0 +1,12 @@ +diffInDays($end) + 1; } + /** + * Download a file from the interwebz and store it locally. + * + * @param string $source The source location + * @param string $target The target location + * @param bool $force Force the download (and overwrite target) + * + * @return void + */ + public static function downloadFile($source, $target, $force = false) + { + if (is_file($target) && !$force) { + return; + } + + \Log::info("Retrieving {$source}"); + + $fp = fopen($target, 'w'); + + $curl = curl_init(); + curl_setopt($curl, CURLOPT_URL, $source); + curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($curl, CURLOPT_FILE, $fp); + curl_exec($curl); + + if (curl_errno($curl)) { + \Log::error("Request error on {$source}: " . curl_error($curl)); + + curl_close($curl); + fclose($fp); + + unlink($target); + return; + } + + curl_close($curl); + fclose($fp); + } + /** * Provide all unique combinations of elements in $input, with order and duplicates irrelevant. * diff --git a/src/tests/Feature/Console/UserDiscountTest.php b/src/tests/Feature/Console/Domain/AddTest.php rename from src/tests/Feature/Console/UserDiscountTest.php rename to src/tests/Feature/Console/Domain/AddTest.php --- a/src/tests/Feature/Console/UserDiscountTest.php +++ b/src/tests/Feature/Console/Domain/AddTest.php @@ -1,11 +1,14 @@ markTestIncomplete(); diff --git a/src/tests/Feature/Console/UserDiscountTest.php b/src/tests/Feature/Console/Domain/DeleteTest.php copy from src/tests/Feature/Console/UserDiscountTest.php copy to src/tests/Feature/Console/Domain/DeleteTest.php --- a/src/tests/Feature/Console/UserDiscountTest.php +++ b/src/tests/Feature/Console/Domain/DeleteTest.php @@ -1,11 +1,14 @@ markTestIncomplete(); diff --git a/src/tests/Feature/Console/Domain/ListDomainsTest.php b/src/tests/Feature/Console/Domain/ListDomainsTest.php new file mode 100644 --- /dev/null +++ b/src/tests/Feature/Console/Domain/ListDomainsTest.php @@ -0,0 +1,19 @@ +artisan('domain:list') + ->assertExitCode(0); + + $this->markTestIncomplete(); + } +} diff --git a/src/tests/Feature/Console/UserDiscountTest.php b/src/tests/Feature/Console/Domain/ListUsersTest.php copy from src/tests/Feature/Console/UserDiscountTest.php copy to src/tests/Feature/Console/Domain/ListUsersTest.php --- a/src/tests/Feature/Console/UserDiscountTest.php +++ b/src/tests/Feature/Console/Domain/ListUsersTest.php @@ -1,11 +1,14 @@ markTestIncomplete(); diff --git a/src/tests/Feature/Console/UserDiscountTest.php b/src/tests/Feature/Console/Domain/SetStatusTest.php copy from src/tests/Feature/Console/UserDiscountTest.php copy to src/tests/Feature/Console/Domain/SetStatusTest.php --- a/src/tests/Feature/Console/UserDiscountTest.php +++ b/src/tests/Feature/Console/Domain/SetStatusTest.php @@ -1,11 +1,14 @@ markTestIncomplete(); diff --git a/src/tests/Feature/Console/UserDiscountTest.php b/src/tests/Feature/Console/Domain/SetWalletTest.php copy from src/tests/Feature/Console/UserDiscountTest.php copy to src/tests/Feature/Console/Domain/SetWalletTest.php --- a/src/tests/Feature/Console/UserDiscountTest.php +++ b/src/tests/Feature/Console/Domain/SetWalletTest.php @@ -1,11 +1,14 @@ markTestIncomplete(); diff --git a/src/tests/Feature/Console/Domain/StatusTest.php b/src/tests/Feature/Console/Domain/StatusTest.php new file mode 100644 --- /dev/null +++ b/src/tests/Feature/Console/Domain/StatusTest.php @@ -0,0 +1,19 @@ +artisan('domain:status kolab.org') + ->assertExitCode(0); + + $this->markTestIncomplete(); + } +} diff --git a/src/tests/Feature/Console/UserDiscountTest.php b/src/tests/Feature/Console/Domain/SuspendTest.php copy from src/tests/Feature/Console/UserDiscountTest.php copy to src/tests/Feature/Console/Domain/SuspendTest.php --- a/src/tests/Feature/Console/UserDiscountTest.php +++ b/src/tests/Feature/Console/Domain/SuspendTest.php @@ -1,11 +1,14 @@ markTestIncomplete(); diff --git a/src/tests/Feature/Console/UserDiscountTest.php b/src/tests/Feature/Console/Domain/UnsuspendTest.php copy from src/tests/Feature/Console/UserDiscountTest.php copy to src/tests/Feature/Console/Domain/UnsuspendTest.php --- a/src/tests/Feature/Console/UserDiscountTest.php +++ b/src/tests/Feature/Console/Domain/UnsuspendTest.php @@ -1,11 +1,14 @@ markTestIncomplete(); diff --git a/src/tests/Feature/Console/UserDiscountTest.php b/src/tests/Feature/Console/User/AddAliasTest.php copy from src/tests/Feature/Console/UserDiscountTest.php copy to src/tests/Feature/Console/User/AddAliasTest.php --- a/src/tests/Feature/Console/UserDiscountTest.php +++ b/src/tests/Feature/Console/User/AddAliasTest.php @@ -1,11 +1,14 @@ markTestIncomplete(); diff --git a/src/tests/Feature/Console/WalletDiscountTest.php b/src/tests/Feature/Console/User/DeleteTest.php rename from src/tests/Feature/Console/WalletDiscountTest.php rename to src/tests/Feature/Console/User/DeleteTest.php --- a/src/tests/Feature/Console/WalletDiscountTest.php +++ b/src/tests/Feature/Console/User/DeleteTest.php @@ -1,11 +1,14 @@ markTestIncomplete(); diff --git a/src/tests/Feature/Console/UserDiscountTest.php b/src/tests/Feature/Console/User/DiscountTest.php copy from src/tests/Feature/Console/UserDiscountTest.php copy to src/tests/Feature/Console/User/DiscountTest.php --- a/src/tests/Feature/Console/UserDiscountTest.php +++ b/src/tests/Feature/Console/User/DiscountTest.php @@ -1,11 +1,14 @@ markTestIncomplete(); diff --git a/src/tests/Feature/Console/UserDomainsTest.php b/src/tests/Feature/Console/User/DomainsTest.php rename from src/tests/Feature/Console/UserDomainsTest.php rename to src/tests/Feature/Console/User/DomainsTest.php --- a/src/tests/Feature/Console/UserDomainsTest.php +++ b/src/tests/Feature/Console/User/DomainsTest.php @@ -1,11 +1,14 @@ artisan('user:domains john@kolab.org') diff --git a/src/tests/Feature/Console/UserEntitlementsTest.php b/src/tests/Feature/Console/User/EntitlementsTest.php rename from src/tests/Feature/Console/UserEntitlementsTest.php rename to src/tests/Feature/Console/User/EntitlementsTest.php --- a/src/tests/Feature/Console/UserEntitlementsTest.php +++ b/src/tests/Feature/Console/User/EntitlementsTest.php @@ -1,11 +1,14 @@ artisan('user:entitlements john@kolab.org') diff --git a/src/tests/Feature/Console/UserForceDeleteTest.php b/src/tests/Feature/Console/User/ForceDeleteTest.php rename from src/tests/Feature/Console/UserForceDeleteTest.php rename to src/tests/Feature/Console/User/ForceDeleteTest.php --- a/src/tests/Feature/Console/UserForceDeleteTest.php +++ b/src/tests/Feature/Console/User/ForceDeleteTest.php @@ -1,11 +1,11 @@ artisan('user:status john@kolab.org') + ->assertExitCode(0); + + $this->markTestIncomplete(); + } +} diff --git a/src/tests/Feature/Console/UserDiscountTest.php b/src/tests/Feature/Console/User/SuspendTest.php copy from src/tests/Feature/Console/UserDiscountTest.php copy to src/tests/Feature/Console/User/SuspendTest.php --- a/src/tests/Feature/Console/UserDiscountTest.php +++ b/src/tests/Feature/Console/User/SuspendTest.php @@ -1,11 +1,14 @@ markTestIncomplete(); diff --git a/src/tests/Feature/Console/UserDiscountTest.php b/src/tests/Feature/Console/User/UnsuspendTest.php copy from src/tests/Feature/Console/UserDiscountTest.php copy to src/tests/Feature/Console/User/UnsuspendTest.php --- a/src/tests/Feature/Console/UserDiscountTest.php +++ b/src/tests/Feature/Console/User/UnsuspendTest.php @@ -1,11 +1,14 @@ markTestIncomplete(); diff --git a/src/tests/Feature/Console/UserDiscountTest.php b/src/tests/Feature/Console/User/VerifyTest.php copy from src/tests/Feature/Console/UserDiscountTest.php copy to src/tests/Feature/Console/User/VerifyTest.php --- a/src/tests/Feature/Console/UserDiscountTest.php +++ b/src/tests/Feature/Console/User/VerifyTest.php @@ -1,11 +1,14 @@ markTestIncomplete(); diff --git a/src/tests/Feature/Console/UserWalletsTest.php b/src/tests/Feature/Console/User/WalletsTest.php rename from src/tests/Feature/Console/UserWalletsTest.php rename to src/tests/Feature/Console/User/WalletsTest.php --- a/src/tests/Feature/Console/UserWalletsTest.php +++ b/src/tests/Feature/Console/User/WalletsTest.php @@ -1,11 +1,14 @@ artisan('user:wallets john@kolab.org') diff --git a/src/tests/Feature/Console/Wallet/AddTransactionTest.php b/src/tests/Feature/Console/Wallet/AddTransactionTest.php new file mode 100644 --- /dev/null +++ b/src/tests/Feature/Console/Wallet/AddTransactionTest.php @@ -0,0 +1,16 @@ +markTestIncomplete(); + } +} diff --git a/src/tests/Feature/Console/Wallet/BalancesTest.php b/src/tests/Feature/Console/Wallet/BalancesTest.php new file mode 100644 --- /dev/null +++ b/src/tests/Feature/Console/Wallet/BalancesTest.php @@ -0,0 +1,19 @@ +artisan('wallet:balances') + ->assertExitCode(0); + + $this->markTestIncomplete(); + } +} diff --git a/src/tests/Feature/Console/WalletChargeTest.php b/src/tests/Feature/Console/Wallet/ChargeTest.php rename from src/tests/Feature/Console/WalletChargeTest.php rename to src/tests/Feature/Console/Wallet/ChargeTest.php --- a/src/tests/Feature/Console/WalletChargeTest.php +++ b/src/tests/Feature/Console/Wallet/ChargeTest.php @@ -1,11 +1,11 @@ artisan('wallet:expected') + ->assertExitCode(0); + + $this->markTestIncomplete(); + } +} diff --git a/src/tests/Feature/Console/Wallet/GetBalanceTest.php b/src/tests/Feature/Console/Wallet/GetBalanceTest.php new file mode 100644 --- /dev/null +++ b/src/tests/Feature/Console/Wallet/GetBalanceTest.php @@ -0,0 +1,16 @@ +markTestIncomplete(); + } +} diff --git a/src/tests/Feature/Console/Wallet/GetDiscountTest.php b/src/tests/Feature/Console/Wallet/GetDiscountTest.php new file mode 100644 --- /dev/null +++ b/src/tests/Feature/Console/Wallet/GetDiscountTest.php @@ -0,0 +1,16 @@ +markTestIncomplete(); + } +} diff --git a/src/tests/Feature/Console/UserDiscountTest.php b/src/tests/Feature/Console/Wallet/MandateTest.php rename from src/tests/Feature/Console/UserDiscountTest.php rename to src/tests/Feature/Console/Wallet/MandateTest.php --- a/src/tests/Feature/Console/UserDiscountTest.php +++ b/src/tests/Feature/Console/Wallet/MandateTest.php @@ -1,11 +1,14 @@ markTestIncomplete(); diff --git a/src/tests/Feature/Console/Wallet/SetBalanceTest.php b/src/tests/Feature/Console/Wallet/SetBalanceTest.php new file mode 100644 --- /dev/null +++ b/src/tests/Feature/Console/Wallet/SetBalanceTest.php @@ -0,0 +1,16 @@ +markTestIncomplete(); + } +} diff --git a/src/tests/Feature/Console/Wallet/SetDiscountTest.php b/src/tests/Feature/Console/Wallet/SetDiscountTest.php new file mode 100644 --- /dev/null +++ b/src/tests/Feature/Console/Wallet/SetDiscountTest.php @@ -0,0 +1,16 @@ +markTestIncomplete(); + } +} diff --git a/src/tests/Feature/Console/Wallet/TransactionsTest.php b/src/tests/Feature/Console/Wallet/TransactionsTest.php new file mode 100644 --- /dev/null +++ b/src/tests/Feature/Console/Wallet/TransactionsTest.php @@ -0,0 +1,16 @@ +markTestIncomplete(); + } +} diff --git a/src/tests/Feature/Console/Wallet/UntilTest.php b/src/tests/Feature/Console/Wallet/UntilTest.php new file mode 100644 --- /dev/null +++ b/src/tests/Feature/Console/Wallet/UntilTest.php @@ -0,0 +1,48 @@ +deleteTestUser('wallet-charge@kolabnow.com'); + } + + /** + * {@inheritDoc} + */ + public function tearDown(): void + { + $this->deleteTestUser('wallet-charge@kolabnow.com'); + + parent::tearDown(); + } + + /** + * Test command run for a specified wallet + */ + public function testHandleSingle(): void + { + $user = $this->getTestUser('wallet-charge@kolabnow.com'); + $wallet = $user->wallets()->first(); + + // Non-existing wallet + $this->artisan('wallet:until unknown') + ->expectsOutput("Wallet not found") + ->assertExitCode(1); + + // TODO + $this->artisan('wallet:until ' . $wallet->id) + ->assertExitCode(0); + + $this->markTestIncomplete(); + } +}