diff --git a/_ide_helper.php b/_ide_helper.php index 099bb772..7c881b2e 100644 --- a/_ide_helper.php +++ b/_ide_helper.php @@ -3,7 +3,7 @@ /** * A helper file for Laravel, to provide autocomplete information to your IDE - * Generated for Laravel 6.18.3 on 2020-04-28 07:53:27. + * Generated for Laravel 7.14.1 on 2020-06-18 06:11:46. * * This file should not be included in your code, only analyzed by your IDE! * @@ -700,6 +700,19 @@ namespace Illuminate\Support\Facades { return $instance->getCachedEventsPath(); } + /** + * Add new prefix to list of absolute path prefixes. + * + * @param string $prefix + * @return \Illuminate\Foundation\Application + * @static + */ + public static function addAbsoluteCachePathPrefix($prefix) + { + /** @var \Illuminate\Foundation\Application $instance */ + return $instance->addAbsoluteCachePathPrefix($prefix); + } + /** * Determine if the application is currently down for maintenance. * @@ -1228,9 +1241,10 @@ namespace Illuminate\Support\Facades { * Call the given Closure / class@method and inject its dependencies. * * @param callable|string $callback - * @param array $parameters + * @param \Illuminate\Container\array $parameters * @param string|null $defaultMethod * @return mixed + * @throws \InvalidArgumentException * @static */ public static function call($callback, $parameters = [], $defaultMethod = null) @@ -1260,6 +1274,7 @@ namespace Illuminate\Support\Facades { * @param string $abstract * @param array $parameters * @return mixed + * @throws \Illuminate\Contracts\Container\BindingResolutionException * @static */ public static function makeWith($abstract, $parameters = []) @@ -1288,7 +1303,7 @@ namespace Illuminate\Support\Facades { /** * Instantiate a concrete instance of the given type. * - * @param string $concrete + * @param \Closure|string $concrete * @return mixed * @throws \Illuminate\Contracts\Container\BindingResolutionException * @static @@ -1844,7 +1859,7 @@ namespace Illuminate\Support\Facades { /** * Get the ID for the currently authenticated user. * - * @return int|null + * @return int|string|null * @static */ public static function id() @@ -2415,6 +2430,47 @@ namespace Illuminate\Support\Facades { return $instance->check($name, ...$parameters); } + /** + * Register a class-based component alias directive. + * + * @param string $class + * @param string|null $alias + * @param string $prefix + * @return void + * @static + */ + public static function component($class, $alias = null, $prefix = '') + { + /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ + $instance->component($class, $alias, $prefix); + } + + /** + * Register an array of class-based components. + * + * @param array $components + * @param string $prefix + * @return void + * @static + */ + public static function components($components, $prefix = '') + { + /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ + $instance->components($components, $prefix); + } + + /** + * Get the registered class component aliases. + * + * @return array + * @static + */ + public static function getClassComponentAliases() + { + /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ + return $instance->getClassComponentAliases(); + } + /** * Register a component alias directive. * @@ -2423,10 +2479,10 @@ namespace Illuminate\Support\Facades { * @return void * @static */ - public static function component($path, $alias = null) + public static function aliasComponent($path, $alias = null) { /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ - $instance->component($path, $alias); + $instance->aliasComponent($path, $alias); } /** @@ -2443,6 +2499,20 @@ namespace Illuminate\Support\Facades { $instance->include($path, $alias); } + /** + * Register an include alias directive. + * + * @param string $path + * @param string|null $alias + * @return void + * @static + */ + public static function aliasInclude($path, $alias = null) + { + /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ + $instance->aliasInclude($path, $alias); + } + /** * Register a handler for custom directives. * @@ -2470,6 +2540,19 @@ namespace Illuminate\Support\Facades { return $instance->getCustomDirectives(); } + /** + * Register a new precompiler. + * + * @param callable $precompiler + * @return void + * @static + */ + public static function precompiler($precompiler) + { + /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ + $instance->precompiler($precompiler); + } + /** * Set the echo format to be used by the compiler. * @@ -2507,6 +2590,18 @@ namespace Illuminate\Support\Facades { $instance->withoutDoubleEncoding(); } + /** + * Indicate that component tags should not be compiled. + * + * @return void + * @static + */ + public static function withoutComponentTags() + { + /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ + $instance->withoutComponentTags(); + } + /** * Get the path to the compiled version of a view. * @@ -2534,6 +2629,70 @@ namespace Illuminate\Support\Facades { /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ return $instance->isExpired($path); } + + /** + * Get a new component hash for a component name. + * + * @param string $component + * @return string + * @static + */ + public static function newComponentHash($component) + { + return \Illuminate\View\Compilers\BladeCompiler::newComponentHash($component); + } + + /** + * Compile a class component opening. + * + * @param string $component + * @param string $alias + * @param string $data + * @param string $hash + * @return string + * @static + */ + public static function compileClassComponentOpening($component, $alias, $data, $hash) + { + return \Illuminate\View\Compilers\BladeCompiler::compileClassComponentOpening($component, $alias, $data, $hash); + } + + /** + * Compile the end-component statements into valid PHP. + * + * @return string + * @static + */ + public static function compileEndComponentClass() + { + /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ + return $instance->compileEndComponentClass(); + } + + /** + * Sanitize the given component attribute value. + * + * @param mixed $value + * @return mixed + * @static + */ + public static function sanitizeComponentAttribute($value) + { + return \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value); + } + + /** + * Compile Blade echos into valid PHP. + * + * @param string $value + * @return string + * @static + */ + public static function compileEchos($value) + { + /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ + return $instance->compileEchos($value); + } } @@ -2781,7 +2940,7 @@ namespace Illuminate\Support\Facades { /** * Assert if a job was dispatched based on a truth-test callback. * - * @param string $command + * @param string|\Closure $command * @param callable|int|null $callback * @return void * @static @@ -2809,7 +2968,7 @@ namespace Illuminate\Support\Facades { /** * Determine if a job was dispatched based on a truth-test callback. * - * @param string $command + * @param string|\Closure $command * @param callable|null $callback * @return void * @static @@ -2823,7 +2982,7 @@ namespace Illuminate\Support\Facades { /** * Assert if a job was dispatched after the response was sent based on a truth-test callback. * - * @param string $command + * @param string|\Closure $command * @param callable|int|null $callback * @return void * @static @@ -2851,7 +3010,7 @@ namespace Illuminate\Support\Facades { /** * Determine if a job was dispatched based on a truth-test callback. * - * @param string $command + * @param string|\Closure $command * @param callable|null $callback * @return void * @static @@ -2921,6 +3080,8 @@ namespace Illuminate\Support\Facades { /** * * + * @method static \Illuminate\Contracts\Cache\Lock lock(string $name, int $seconds = 0, mixed $owner = null) + * @method static \Illuminate\Contracts\Cache\Lock restoreLock(string $name, string $owner) * @see \Illuminate\Cache\CacheManager * @see \Illuminate\Cache\Repository */ @@ -3810,7 +3971,7 @@ namespace Illuminate\Support\Facades { * @param string $key * @param mixed $default * @param string|null $path - * @return \Symfony\Component\HttpFoundation\Cookie + * @return \Symfony\Component\HttpFoundation\Cookie|null * @static */ public static function queued($key, $default = null, $path = null) @@ -4079,6 +4240,20 @@ namespace Illuminate\Support\Facades { return $instance->reconnect($name); } + /** + * Set the default database connection for the callback execution. + * + * @param string $name + * @param callable $callback + * @return mixed + * @static + */ + public static function usingConnection($name, $callback) + { + /** @var \Illuminate\Database\DatabaseManager $instance */ + return $instance->usingConnection($name, $callback); + } + /** * Get the default connection name. * @@ -4973,7 +5148,7 @@ namespace Illuminate\Support\Facades { * @param \Closure $callback * @param int $attempts * @return mixed - * @throws \Exception|\Throwable + * @throws \Throwable * @static */ public static function transaction($callback, $attempts = 1) @@ -4987,7 +5162,7 @@ namespace Illuminate\Support\Facades { * Start a new database transaction. * * @return void - * @throws \Exception + * @throws \Throwable * @static */ public static function beginTransaction() @@ -5001,6 +5176,7 @@ namespace Illuminate\Support\Facades { * Commit the active database transaction. * * @return void + * @throws \Throwable * @static */ public static function commit() @@ -5015,7 +5191,7 @@ namespace Illuminate\Support\Facades { * * @param int|null $toLevel * @return void - * @throws \Exception + * @throws \Throwable * @static */ public static function rollBack($toLevel = null) @@ -5277,7 +5453,7 @@ namespace Illuminate\Support\Facades { /** * Assert if an event was dispatched based on a truth-test callback. * - * @param string $event + * @param string|\Closure $event * @param callable|int|null $callback * @return void * @static @@ -5305,7 +5481,7 @@ namespace Illuminate\Support\Facades { /** * Determine if an event was dispatched based on a truth-test callback. * - * @param string $event + * @param string|\Closure $event * @param callable|null $callback * @return void * @static @@ -5624,6 +5800,19 @@ namespace Illuminate\Support\Facades { return $instance->extension($path); } + /** + * Guess the file extension from the mime-type of a given file. + * + * @param string $path + * @return string|null + * @static + */ + public static function guessExtension($path) + { + /** @var \Illuminate\Filesystem\Filesystem $instance */ + return $instance->guessExtension($path); + } + /** * Get the file type of a given file. * @@ -6324,7 +6513,7 @@ namespace Illuminate\Support\Facades { /** * Get a driver instance. * - * @param string $driver + * @param string|null $driver * @return mixed * @throws \InvalidArgumentException * @static @@ -6932,339 +7121,87 @@ namespace Illuminate\Support\Facades { class Mail { /** - * Set the global from address and name. + * Get a mailer instance by name. * - * @param string $address * @param string|null $name - * @return void - * @static - */ - public static function alwaysFrom($address, $name = null) - { - /** @var \Illuminate\Mail\Mailer $instance */ - $instance->alwaysFrom($address, $name); - } - - /** - * Set the global reply-to address and name. - * - * @param string $address - * @param string|null $name - * @return void - * @static - */ - public static function alwaysReplyTo($address, $name = null) - { - /** @var \Illuminate\Mail\Mailer $instance */ - $instance->alwaysReplyTo($address, $name); - } - - /** - * Set the global to address and name. - * - * @param string $address - * @param string|null $name - * @return void - * @static - */ - public static function alwaysTo($address, $name = null) - { - /** @var \Illuminate\Mail\Mailer $instance */ - $instance->alwaysTo($address, $name); - } - - /** - * Begin the process of mailing a mailable class instance. - * - * @param mixed $users - * @return \Illuminate\Mail\PendingMail - * @static - */ - public static function to($users) - { - /** @var \Illuminate\Mail\Mailer $instance */ - return $instance->to($users); - } - - /** - * Begin the process of mailing a mailable class instance. - * - * @param mixed $users - * @return \Illuminate\Mail\PendingMail - * @static - */ - public static function cc($users) - { - /** @var \Illuminate\Mail\Mailer $instance */ - return $instance->cc($users); - } - - /** - * Begin the process of mailing a mailable class instance. - * - * @param mixed $users - * @return \Illuminate\Mail\PendingMail - * @static - */ - public static function bcc($users) - { - /** @var \Illuminate\Mail\Mailer $instance */ - return $instance->bcc($users); - } - - /** - * Send a new message with only an HTML part. - * - * @param string $html - * @param mixed $callback - * @return void - * @static - */ - public static function html($html, $callback) - { - /** @var \Illuminate\Mail\Mailer $instance */ - $instance->html($html, $callback); - } - - /** - * Send a new message with only a raw text part. - * - * @param string $text - * @param mixed $callback - * @return void - * @static - */ - public static function raw($text, $callback) - { - /** @var \Illuminate\Mail\Mailer $instance */ - $instance->raw($text, $callback); - } - - /** - * Send a new message with only a plain part. - * - * @param string $view - * @param array $data - * @param mixed $callback - * @return void - * @static - */ - public static function plain($view, $data, $callback) - { - /** @var \Illuminate\Mail\Mailer $instance */ - $instance->plain($view, $data, $callback); - } - - /** - * Render the given message as a view. - * - * @param string|array $view - * @param array $data - * @return string - * @static - */ - public static function render($view, $data = []) - { - /** @var \Illuminate\Mail\Mailer $instance */ - return $instance->render($view, $data); - } - - /** - * Send a new message using a view. - * - * @param \Illuminate\Contracts\Mail\Mailable|string|array $view - * @param array $data - * @param \Closure|string|null $callback - * @return void - * @static - */ - public static function send($view, $data = [], $callback = null) - { - /** @var \Illuminate\Mail\Mailer $instance */ - $instance->send($view, $data, $callback); - } - - /** - * Queue a new e-mail message for sending. - * - * @param \Illuminate\Contracts\Mail\Mailable $view - * @param string|null $queue - * @return mixed - * @throws \InvalidArgumentException - * @static - */ - public static function queue($view, $queue = null) - { - /** @var \Illuminate\Mail\Mailer $instance */ - return $instance->queue($view, $queue); - } - - /** - * Queue a new e-mail message for sending on the given queue. - * - * @param string $queue - * @param \Illuminate\Contracts\Mail\Mailable $view - * @return mixed - * @static - */ - public static function onQueue($queue, $view) - { - /** @var \Illuminate\Mail\Mailer $instance */ - return $instance->onQueue($queue, $view); - } - - /** - * Queue a new e-mail message for sending on the given queue. - * - * This method didn't match rest of framework's "onQueue" phrasing. Added "onQueue". - * - * @param string $queue - * @param \Illuminate\Contracts\Mail\Mailable $view - * @return mixed - * @static - */ - public static function queueOn($queue, $view) - { - /** @var \Illuminate\Mail\Mailer $instance */ - return $instance->queueOn($queue, $view); - } - - /** - * Queue a new e-mail message for sending after (n) seconds. - * - * @param \DateTimeInterface|\DateInterval|int $delay - * @param \Illuminate\Contracts\Mail\Mailable $view - * @param string|null $queue - * @return mixed - * @throws \InvalidArgumentException - * @static - */ - public static function later($delay, $view, $queue = null) - { - /** @var \Illuminate\Mail\Mailer $instance */ - return $instance->later($delay, $view, $queue); - } - - /** - * Queue a new e-mail message for sending after (n) seconds on the given queue. - * - * @param string $queue - * @param \DateTimeInterface|\DateInterval|int $delay - * @param \Illuminate\Contracts\Mail\Mailable $view - * @return mixed - * @static - */ - public static function laterOn($queue, $delay, $view) - { - /** @var \Illuminate\Mail\Mailer $instance */ - return $instance->laterOn($queue, $delay, $view); - } - - /** - * Get the array of failed recipients. - * - * @return array - * @static - */ - public static function failures() - { - /** @var \Illuminate\Mail\Mailer $instance */ - return $instance->failures(); - } - - /** - * Get the Swift Mailer instance. - * - * @return \Swift_Mailer - * @static - */ - public static function getSwiftMailer() - { - /** @var \Illuminate\Mail\Mailer $instance */ - return $instance->getSwiftMailer(); - } - - /** - * Get the view factory instance. - * - * @return \Illuminate\Contracts\View\Factory - * @static - */ - public static function getViewFactory() - { - /** @var \Illuminate\Mail\Mailer $instance */ - return $instance->getViewFactory(); - } - - /** - * Set the Swift Mailer instance. - * - * @param \Swift_Mailer $swift - * @return void - * @static - */ - public static function setSwiftMailer($swift) - { - /** @var \Illuminate\Mail\Mailer $instance */ - $instance->setSwiftMailer($swift); - } - - /** - * Set the queue manager instance. - * - * @param \Illuminate\Contracts\Queue\Factory $queue * @return \Illuminate\Mail\Mailer * @static */ - public static function setQueue($queue) + public static function mailer($name = null) { - /** @var \Illuminate\Mail\Mailer $instance */ - return $instance->setQueue($queue); + /** @var \Illuminate\Mail\MailManager $instance */ + return $instance->mailer($name); } /** - * Register a custom macro. + * Get a mailer driver instance. + * + * @param string|null $driver + * @return \Illuminate\Mail\Mailer + * @static + */ + public static function driver($driver = null) + { + /** @var \Illuminate\Mail\MailManager $instance */ + return $instance->driver($driver); + } + + /** + * Create a new transport instance. + * + * @param array $config + * @return \Swift_Transport + * @static + */ + public static function createTransport($config) + { + /** @var \Illuminate\Mail\MailManager $instance */ + return $instance->createTransport($config); + } + + /** + * Get the default mail driver name. + * + * @return string + * @static + */ + public static function getDefaultDriver() + { + /** @var \Illuminate\Mail\MailManager $instance */ + return $instance->getDefaultDriver(); + } + + /** + * Set the default mail driver name. * * @param string $name - * @param object|callable $macro * @return void * @static */ - public static function macro($name, $macro) + public static function setDefaultDriver($name) { - \Illuminate\Mail\Mailer::macro($name, $macro); + /** @var \Illuminate\Mail\MailManager $instance */ + $instance->setDefaultDriver($name); } /** - * Mix another object into the class. + * Register a custom transport creator Closure. * - * @param object $mixin - * @param bool $replace - * @return void - * @throws \ReflectionException + * @param string $driver + * @param \Closure $callback + * @return \Illuminate\Mail\MailManager * @static */ - public static function mixin($mixin, $replace = true) + public static function extend($driver, $callback) { - \Illuminate\Mail\Mailer::mixin($mixin, $replace); - } - - /** - * Checks if macro is registered. - * - * @param string $name - * @return bool - * @static - */ - public static function hasMacro($name) - { - return \Illuminate\Mail\Mailer::hasMacro($name); + /** @var \Illuminate\Mail\MailManager $instance */ + return $instance->extend($driver, $callback); } /** * Assert if a mailable was sent based on a truth-test callback. * - * @param string $mailable + * @param string|\Closure $mailable * @param callable|int|null $callback * @return void * @static @@ -7304,7 +7241,7 @@ namespace Illuminate\Support\Facades { /** * Assert if a mailable was queued based on a truth-test callback. * - * @param string $mailable + * @param string|\Closure $mailable * @param callable|int|null $callback * @return void * @static @@ -7394,6 +7331,102 @@ namespace Illuminate\Support\Facades { /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ return $instance->hasQueued($mailable); } + + /** + * Begin the process of mailing a mailable class instance. + * + * @param mixed $users + * @return \Illuminate\Mail\PendingMail + * @static + */ + public static function to($users) + { + /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ + return $instance->to($users); + } + + /** + * Begin the process of mailing a mailable class instance. + * + * @param mixed $users + * @return \Illuminate\Mail\PendingMail + * @static + */ + public static function bcc($users) + { + /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ + return $instance->bcc($users); + } + + /** + * Send a new message with only a raw text part. + * + * @param string $text + * @param \Closure|string $callback + * @return void + * @static + */ + public static function raw($text, $callback) + { + /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ + $instance->raw($text, $callback); + } + + /** + * Send a new message using a view. + * + * @param string|array $view + * @param array $data + * @param \Closure|string|null $callback + * @return void + * @static + */ + public static function send($view, $data = [], $callback = null) + { + /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ + $instance->send($view, $data, $callback); + } + + /** + * Queue a new e-mail message for sending. + * + * @param string|array $view + * @param string|null $queue + * @return mixed + * @static + */ + public static function queue($view, $queue = null) + { + /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ + return $instance->queue($view, $queue); + } + + /** + * Queue a new e-mail message for sending after (n) seconds. + * + * @param \DateTimeInterface|\DateInterval|int $delay + * @param \Illuminate\Contracts\Mail\Mailable|string|array $view + * @param string|null $queue + * @return mixed + * @static + */ + public static function later($delay, $view, $queue = null) + { + /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ + return $instance->later($delay, $view, $queue); + } + + /** + * Get the array of failed recipients. + * + * @return array + * @static + */ + public static function failures() + { + /** @var \Illuminate\Support\Testing\Fakes\MailFake $instance */ + return $instance->failures(); + } } @@ -7499,7 +7532,7 @@ namespace Illuminate\Support\Facades { /** * Get a driver instance. * - * @param string $driver + * @param string|null $driver * @return mixed * @throws \InvalidArgumentException * @static @@ -7543,7 +7576,7 @@ namespace Illuminate\Support\Facades { * Assert if a notification was sent based on a truth-test callback. * * @param mixed $notifiable - * @param string $notification + * @param string|\Closure $notification * @param callable|null $callback * @return void * @throws \Exception @@ -7574,7 +7607,7 @@ namespace Illuminate\Support\Facades { * Determine if a notification was sent based on a truth-test callback. * * @param mixed $notifiable - * @param string $notification + * @param string|\Closure $notification * @param callable|null $callback * @return void * @throws \Exception @@ -7685,8 +7718,8 @@ namespace Illuminate\Support\Facades { /** * * - * @method static string sendResetLink(array $credentials) * @method static mixed reset(array $credentials, \Closure $callback) + * @method static string sendResetLink(array $credentials) * @see \Illuminate\Auth\Passwords\PasswordBroker */ class Password { @@ -7912,7 +7945,7 @@ namespace Illuminate\Support\Facades { /** * Assert if a job was pushed based on a truth-test callback. * - * @param string $job + * @param string|\Closure $job * @param callable|int|null $callback * @return void * @static @@ -7927,7 +7960,7 @@ namespace Illuminate\Support\Facades { * Assert if a job was pushed based on a truth-test callback. * * @param string $queue - * @param string $job + * @param string|\Closure $job * @param callable|null $callback * @return void * @static @@ -7970,7 +8003,7 @@ namespace Illuminate\Support\Facades { /** * Determine if a job was pushed based on a truth-test callback. * - * @param string $job + * @param string|\Closure $job * @param callable|null $callback * @return void * @static @@ -8388,6 +8421,40 @@ namespace Illuminate\Support\Facades { return $instance->route($route, $parameters, $status, $headers); } + /** + * Create a new redirect response to a signed named route. + * + * @param string $route + * @param mixed $parameters + * @param \DateTimeInterface|\DateInterval|int|null $expiration + * @param int $status + * @param array $headers + * @return \Illuminate\Http\RedirectResponse + * @static + */ + public static function signedRoute($route, $parameters = [], $expiration = null, $status = 302, $headers = []) + { + /** @var \Illuminate\Routing\Redirector $instance */ + return $instance->signedRoute($route, $parameters, $expiration, $status, $headers); + } + + /** + * Create a new redirect response to a signed named route. + * + * @param string $route + * @param \DateTimeInterface|\DateInterval|int|null $expiration + * @param mixed $parameters + * @param int $status + * @param array $headers + * @return \Illuminate\Http\RedirectResponse + * @static + */ + public static function temporarySignedRoute($route, $expiration, $parameters = [], $status = 302, $headers = []) + { + /** @var \Illuminate\Routing\Redirector $instance */ + return $instance->temporarySignedRoute($route, $expiration, $parameters, $status, $headers); + } + /** * Create a new redirect response to a controller action. * @@ -8726,7 +8793,7 @@ namespace Illuminate\Support\Facades { /** * Get the client user agent. * - * @return string + * @return string|null * @static */ public static function userAgent() @@ -9102,7 +9169,6 @@ namespace Illuminate\Support\Facades { * to keep BC with an existing system. It should not be used for any * other purpose. * - * @param callable|null $callable A PHP callable * @static */ public static function setFactory($callable) @@ -9198,7 +9264,6 @@ namespace Illuminate\Support\Facades { * It builds a normalized query string, where keys/value pairs are alphabetized, * have consistent escaping and unneeded delimiters are removed. * - * @param string $qs Query string * @return string A normalized query string for the Request * @static */ @@ -9570,7 +9635,6 @@ namespace Illuminate\Support\Facades { * - "/a/b/c/other" -> "other" * - "/a/x/y" -> "../../x/y" * - * @param string $path The target path * @return string The relative target path * @static */ @@ -9637,7 +9701,6 @@ namespace Illuminate\Support\Facades { /** * Sets the request method. * - * @param string $method * @static */ public static function setMethod($method) @@ -9686,7 +9749,6 @@ namespace Illuminate\Support\Facades { /** * Gets the mime type associated with the format. * - * @param string $format The format * @return string|null The associated mime type (null if not found) * @static */ @@ -9700,7 +9762,6 @@ namespace Illuminate\Support\Facades { /** * Gets the mime types associated with the format. * - * @param string $format The format * @return array The associated mime types * @static */ @@ -9713,7 +9774,6 @@ namespace Illuminate\Support\Facades { /** * Gets the format associated with the mime type. * - * @param string $mimeType The associated mime type * @return string|null The format (null if not found) * @static */ @@ -9727,7 +9787,6 @@ namespace Illuminate\Support\Facades { /** * Associates a format with mime types. * - * @param string $format The format * @param string|array $mimeTypes The associated mime types (the preferred one must be the first as it will be used as the content type) * @static */ @@ -9748,7 +9807,6 @@ namespace Illuminate\Support\Facades { * * $default * * @see getPreferredFormat - * @param string|null $default The default format * @return string|null The request format * @static */ @@ -9762,7 +9820,6 @@ namespace Illuminate\Support\Facades { /** * Sets the request format. * - * @param string $format The request format * @static */ public static function setRequestFormat($format) @@ -9788,7 +9845,6 @@ namespace Illuminate\Support\Facades { /** * Sets the default locale. * - * @param string $locale * @static */ public static function setDefaultLocale($locale) @@ -9814,7 +9870,6 @@ namespace Illuminate\Support\Facades { /** * Sets the locale. * - * @param string $locale * @static */ public static function setLocale($locale) @@ -9954,8 +10009,8 @@ namespace Illuminate\Support\Facades { /** * Gets the preferred format for the response by inspecting, in the following order: - * * the request format set using setRequestFormat - * * the values of the Accept HTTP header + * * the request format set using setRequestFormat; + * * the values of the Accept HTTP header. * * Note that if you use this method, you should send the "Vary: Accept" header * in the response to prevent any issues with intermediary HTTP caches. @@ -10052,6 +10107,19 @@ namespace Illuminate\Support\Facades { return $instance->isXmlHttpRequest(); } + /** + * Checks whether the client browser prefers safe content or not according to RFC8674. + * + * @see https://tools.ietf.org/html/rfc8674 + * @static + */ + public static function preferSafeContent() + { + //Method inherited from \Symfony\Component\HttpFoundation\Request + /** @var \Illuminate\Http\Request $instance */ + return $instance->preferSafeContent(); + } + /** * Indicates whether this request originated from a trusted proxy. * @@ -10799,7 +10867,7 @@ namespace Illuminate\Support\Facades { * Create a new redirect response to a named route. * * @param string $route - * @param array $parameters + * @param mixed $parameters * @param int $status * @param array $headers * @return \Illuminate\Http\RedirectResponse @@ -10815,7 +10883,7 @@ namespace Illuminate\Support\Facades { * Create a new redirect response to a controller action. * * @param string $action - * @param array $parameters + * @param mixed $parameters * @param int $status * @param array $headers * @return \Illuminate\Http\RedirectResponse @@ -10903,13 +10971,13 @@ namespace Illuminate\Support\Facades { /** * * - * @method static \Illuminate\Routing\RouteRegistrar prefix(string $prefix) - * @method static \Illuminate\Routing\RouteRegistrar where(array $where) - * @method static \Illuminate\Routing\RouteRegistrar middleware(array|string|null $middleware) * @method static \Illuminate\Routing\RouteRegistrar as(string $value) * @method static \Illuminate\Routing\RouteRegistrar domain(string $value) + * @method static \Illuminate\Routing\RouteRegistrar middleware(array|string|null $middleware) * @method static \Illuminate\Routing\RouteRegistrar name(string $value) * @method static \Illuminate\Routing\RouteRegistrar namespace(string $value) + * @method static \Illuminate\Routing\RouteRegistrar prefix(string $prefix) + * @method static \Illuminate\Routing\RouteRegistrar where(array $where) * @see \Illuminate\Routing\Router */ class Route { @@ -10918,7 +10986,7 @@ namespace Illuminate\Support\Facades { * Register a new GET route with the router. * * @param string $uri - * @param \Closure|array|string|callable|null $action + * @param array|string|callable|null $action * @return \Illuminate\Routing\Route * @static */ @@ -10932,7 +11000,7 @@ namespace Illuminate\Support\Facades { * Register a new POST route with the router. * * @param string $uri - * @param \Closure|array|string|callable|null $action + * @param array|string|callable|null $action * @return \Illuminate\Routing\Route * @static */ @@ -10946,7 +11014,7 @@ namespace Illuminate\Support\Facades { * Register a new PUT route with the router. * * @param string $uri - * @param \Closure|array|string|callable|null $action + * @param array|string|callable|null $action * @return \Illuminate\Routing\Route * @static */ @@ -10960,7 +11028,7 @@ namespace Illuminate\Support\Facades { * Register a new PATCH route with the router. * * @param string $uri - * @param \Closure|array|string|callable|null $action + * @param array|string|callable|null $action * @return \Illuminate\Routing\Route * @static */ @@ -10974,7 +11042,7 @@ namespace Illuminate\Support\Facades { * Register a new DELETE route with the router. * * @param string $uri - * @param \Closure|array|string|callable|null $action + * @param array|string|callable|null $action * @return \Illuminate\Routing\Route * @static */ @@ -10988,7 +11056,7 @@ namespace Illuminate\Support\Facades { * Register a new OPTIONS route with the router. * * @param string $uri - * @param \Closure|array|string|callable|null $action + * @param array|string|callable|null $action * @return \Illuminate\Routing\Route * @static */ @@ -11002,7 +11070,7 @@ namespace Illuminate\Support\Facades { * Register a new route responding to all verbs. * * @param string $uri - * @param \Closure|array|string|callable|null $action + * @param array|string|callable|null $action * @return \Illuminate\Routing\Route * @static */ @@ -11015,7 +11083,7 @@ namespace Illuminate\Support\Facades { /** * Register a new Fallback route with the router. * - * @param \Closure|array|string|callable|null $action + * @param array|string|callable|null $action * @return \Illuminate\Routing\Route * @static */ @@ -11074,7 +11142,7 @@ namespace Illuminate\Support\Facades { * * @param array|string $methods * @param string $uri - * @param \Closure|array|string|callable|null $action + * @param array|string|callable|null $action * @return \Illuminate\Routing\Route * @static */ @@ -11160,13 +11228,14 @@ namespace Illuminate\Support\Facades { * Merge the given array with the last group stack. * * @param array $new + * @param bool $prependExistingPrefix * @return array * @static */ - public static function mergeWithLastGroup($new) + public static function mergeWithLastGroup($new, $prependExistingPrefix = true) { /** @var \Illuminate\Routing\Router $instance */ - return $instance->mergeWithLastGroup($new); + return $instance->mergeWithLastGroup($new, $prependExistingPrefix); } /** @@ -11186,7 +11255,7 @@ namespace Illuminate\Support\Facades { * * @param array|string $methods * @param string $uri - * @param \Closure|array|string|callable|null $action + * @param array|string|callable|null $action * @return \Illuminate\Routing\Route * @static */ @@ -11196,6 +11265,21 @@ namespace Illuminate\Support\Facades { return $instance->addRoute($methods, $uri, $action); } + /** + * Create a new Route object. + * + * @param array|string $methods + * @param string $uri + * @param mixed $action + * @return \Illuminate\Routing\Route + * @static + */ + public static function newRoute($methods, $uri, $action) + { + /** @var \Illuminate\Routing\Router $instance */ + return $instance->newRoute($methods, $uri, $action); + } + /** * Return the response returned by the given route. * @@ -11657,55 +11741,6 @@ namespace Illuminate\Support\Facades { return $instance->currentRouteUses($action); } - /** - * Register the typical authentication routes for an application. - * - * @param array $options - * @return void - * @static - */ - public static function auth($options = []) - { - /** @var \Illuminate\Routing\Router $instance */ - $instance->auth($options); - } - - /** - * Register the typical reset password routes for an application. - * - * @return void - * @static - */ - public static function resetPassword() - { - /** @var \Illuminate\Routing\Router $instance */ - $instance->resetPassword(); - } - - /** - * Register the typical confirm password routes for an application. - * - * @return void - * @static - */ - public static function confirmPassword() - { - /** @var \Illuminate\Routing\Router $instance */ - $instance->confirmPassword(); - } - - /** - * Register the typical email verification routes for an application. - * - * @return void - * @static - */ - public static function emailVerification() - { - /** @var \Illuminate\Routing\Router $instance */ - $instance->emailVerification(); - } - /** * Set the unmapped global resource parameters to singular. * @@ -11748,7 +11783,7 @@ namespace Illuminate\Support\Facades { /** * Get the underlying route collection. * - * @return \Illuminate\Routing\RouteCollection + * @return \Illuminate\Routing\RouteCollectionInterface * @static */ public static function getRoutes() @@ -11770,6 +11805,19 @@ namespace Illuminate\Support\Facades { $instance->setRoutes($routes); } + /** + * Set the compiled route collection instance. + * + * @param array $routes + * @return void + * @static + */ + public static function setCompiledRoutes($routes) + { + /** @var \Illuminate\Routing\Router $instance */ + $instance->setCompiledRoutes($routes); + } + /** * Register a custom macro. * @@ -12147,6 +12195,30 @@ namespace Illuminate\Support\Facades { */ class Session { + /** + * Determine if requests for the same session should wait for each to finish before executing. + * + * @return bool + * @static + */ + public static function shouldBlock() + { + /** @var \Illuminate\Session\SessionManager $instance */ + return $instance->shouldBlock(); + } + + /** + * Get the name of the cache store / driver that should be used to acquire session locks. + * + * @return string|null + * @static + */ + public static function blockDriver() + { + /** @var \Illuminate\Session\SessionManager $instance */ + return $instance->blockDriver(); + } + /** * Get the session configuration. * @@ -12187,7 +12259,7 @@ namespace Illuminate\Support\Facades { /** * Get a driver instance. * - * @param string $driver + * @param string|null $driver * @return mixed * @throws \InvalidArgumentException * @static @@ -13832,7 +13904,7 @@ namespace Illuminate\Support\Facades { /** * Set the route collection. * - * @param \Illuminate\Routing\RouteCollection $routes + * @param \Illuminate\Routing\RouteCollectionInterface $routes * @return \Illuminate\Routing\UrlGenerator * @static */ @@ -14508,15 +14580,15 @@ namespace Illuminate\Support\Facades { /** * Start a component rendering process. * - * @param string $name + * @param \Illuminate\View\View|\Closure|string $view * @param array $data * @return void * @static */ - public static function startComponent($name, $data = []) + public static function startComponent($view, $data = []) { /** @var \Illuminate\View\Factory $instance */ - $instance->startComponent($name, $data); + $instance->startComponent($view, $data); } /** @@ -15041,6 +15113,227 @@ namespace Intervention\Image\Facades { } +namespace Cartalyst\Stripe\Laravel\Facades { + + /** + * + * + */ + class Stripe { + + /** + * Create a new Stripe API instance. + * + * @param string $apiKey + * @param string $apiVersion + * @return \Cartalyst\Stripe\Stripe + * @static + */ + public static function make($apiKey = null, $apiVersion = null) + { + return \Cartalyst\Stripe\Stripe::make($apiKey, $apiVersion); + } + + /** + * Returns the current package version. + * + * @return string + * @static + */ + public static function getVersion() + { + return \Cartalyst\Stripe\Stripe::getVersion(); + } + + /** + * Returns the Config repository instance. + * + * @return \Cartalyst\Stripe\ConfigInterface + * @static + */ + public static function getConfig() + { + /** @var \Cartalyst\Stripe\Stripe $instance */ + return $instance->getConfig(); + } + + /** + * Sets the Config repository instance. + * + * @param \Cartalyst\Stripe\ConfigInterface $config + * @return \Cartalyst\Stripe\Stripe + * @static + */ + public static function setConfig($config) + { + /** @var \Cartalyst\Stripe\Stripe $instance */ + return $instance->setConfig($config); + } + + /** + * Returns the Stripe API key. + * + * @return string + * @static + */ + public static function getApiKey() + { + /** @var \Cartalyst\Stripe\Stripe $instance */ + return $instance->getApiKey(); + } + + /** + * Sets the Stripe API key. + * + * @param string $apiKey + * @return \Cartalyst\Stripe\Stripe + * @static + */ + public static function setApiKey($apiKey) + { + /** @var \Cartalyst\Stripe\Stripe $instance */ + return $instance->setApiKey($apiKey); + } + + /** + * Returns the Stripe API version. + * + * @return string + * @static + */ + public static function getApiVersion() + { + /** @var \Cartalyst\Stripe\Stripe $instance */ + return $instance->getApiVersion(); + } + + /** + * Sets the Stripe API version. + * + * @param string $apiVersion + * @return \Cartalyst\Stripe\Stripe + * @static + */ + public static function setApiVersion($apiVersion) + { + /** @var \Cartalyst\Stripe\Stripe $instance */ + return $instance->setApiVersion($apiVersion); + } + + /** + * Sets the idempotency key. + * + * @param string $idempotencyKey + * @return \Cartalyst\Stripe\Stripe + * @static + */ + public static function idempotent($idempotencyKey) + { + /** @var \Cartalyst\Stripe\Stripe $instance */ + return $instance->idempotent($idempotencyKey); + } + + /** + * Sets the account id. + * + * @param string $accountId + * @return \Cartalyst\Stripe\Stripe + * @static + */ + public static function accountId($accountId) + { + /** @var \Cartalyst\Stripe\Stripe $instance */ + return $instance->accountId($accountId); + } + + /** + * Returns the application's information. + * + * @return array|null + * @static + */ + public static function getAppInfo() + { + /** @var \Cartalyst\Stripe\Stripe $instance */ + return $instance->getAppInfo(); + } + + /** + * Sets the application's information. + * + * @param string $appName + * @param string $appVersion + * @param string $appUrl + * @param string $appPartnerId + * @return \Cartalyst\Stripe\Stripe + * @static + */ + public static function setAppInfo($appName, $appVersion = null, $appUrl = null, $appPartnerId = null) + { + /** @var \Cartalyst\Stripe\Stripe $instance */ + return $instance->setAppInfo($appName, $appVersion, $appUrl, $appPartnerId); + } + + /** + * Returns the amount converter class and method name. + * + * @return string + * @static + */ + public static function getAmountConverter() + { + return \Cartalyst\Stripe\Stripe::getAmountConverter(); + } + + /** + * Sets the amount converter class and method name. + * + * @param $amountConverter string + * @return void + * @static + */ + public static function setAmountConverter($amountConverter) + { + \Cartalyst\Stripe\Stripe::setAmountConverter($amountConverter); + } + + /** + * Disables the amount converter. + * + * @return void + * @static + */ + public static function disableAmountConverter() + { + \Cartalyst\Stripe\Stripe::disableAmountConverter(); + } + + /** + * Returns the default amount converter. + * + * @return string + * @static + */ + public static function getDefaultAmountConverter() + { + return \Cartalyst\Stripe\Stripe::getDefaultAmountConverter(); + } + + /** + * Sets the default amount converter; + * + * @return void + * @static + */ + public static function setDefaultAmountConverter() + { + \Cartalyst\Stripe\Stripe::setDefaultAmountConverter(); + } + + } + +} + namespace Facade\Ignition\Facades { /** @@ -15463,7 +15756,7 @@ namespace { * @param \Closure|array|string $column * @param mixed $operator * @param mixed $value - * @return \Illuminate\Database\Eloquent\Builder|static + * @return \Illuminate\Database\Eloquent\Builder * @static */ public static function orWhere($column, $operator = null, $value = null) @@ -15590,7 +15883,7 @@ namespace { * @return \Illuminate\Database\Eloquent\Model|static * @static */ - public static function firstOrNew($attributes, $values = []) + public static function firstOrNew($attributes = [], $values = []) { /** @var \Illuminate\Database\Eloquent\Builder $instance */ return $instance->firstOrNew($attributes, $values); @@ -15853,6 +16146,19 @@ namespace { return $instance->newModelInstance($attributes); } + /** + * Apply query-time casts to the model instance. + * + * @param array $casts + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function withCasts($casts) + { + /** @var \Illuminate\Database\Eloquent\Builder $instance */ + return $instance->withCasts($casts); + } + /** * Get the underlying query builder instance. * @@ -16187,7 +16493,7 @@ namespace { * Add a relationship count / exists condition to the query with where clauses and an "or". * * @param string $relation - * @param \Closure $callback + * @param \Closure|null $callback * @param string $operator * @param int $count * @return \Illuminate\Database\Eloquent\Builder|static @@ -16217,7 +16523,7 @@ namespace { * Add a relationship count / exists condition to the query with where clauses and an "or". * * @param string $relation - * @param \Closure $callback + * @param \Closure|null $callback * @return \Illuminate\Database\Eloquent\Builder|static * @static */ @@ -16313,7 +16619,7 @@ namespace { * * @param string $relation * @param string|array $types - * @param \Closure $callback + * @param \Closure|null $callback * @param string $operator * @param int $count * @return \Illuminate\Database\Eloquent\Builder|static @@ -16345,7 +16651,7 @@ namespace { * * @param string $relation * @param string|array $types - * @param \Closure $callback + * @param \Closure|null $callback * @return \Illuminate\Database\Eloquent\Builder|static * @static */ @@ -16399,7 +16705,7 @@ namespace { * * @param \Closure|\Illuminate\Database\Query\Builder|string $query * @param string $as - * @return \Illuminate\Database\Query\Builder|static + * @return \Illuminate\Database\Query\Builder * @throws \InvalidArgumentException * @static */ @@ -16414,7 +16720,7 @@ namespace { * * @param string $expression * @param array $bindings - * @return \Illuminate\Database\Query\Builder|static + * @return \Illuminate\Database\Query\Builder * @static */ public static function selectRaw($expression, $bindings = []) @@ -16428,7 +16734,7 @@ namespace { * * @param \Closure|\Illuminate\Database\Query\Builder|string $query * @param string $as - * @return \Illuminate\Database\Query\Builder|static + * @return \Illuminate\Database\Query\Builder * @throws \InvalidArgumentException * @static */ @@ -16443,7 +16749,7 @@ namespace { * * @param string $expression * @param mixed $bindings - * @return \Illuminate\Database\Query\Builder|static + * @return \Illuminate\Database\Query\Builder * @static */ public static function fromRaw($expression, $bindings = []) @@ -16517,7 +16823,7 @@ namespace { * @param string $operator * @param string $second * @param string $type - * @return \Illuminate\Database\Query\Builder|static + * @return \Illuminate\Database\Query\Builder * @static */ public static function joinWhere($table, $first, $operator, $second, $type = 'inner') @@ -16536,7 +16842,7 @@ namespace { * @param string|null $second * @param string $type * @param bool $where - * @return \Illuminate\Database\Query\Builder|static + * @return \Illuminate\Database\Query\Builder * @throws \InvalidArgumentException * @static */ @@ -16553,7 +16859,7 @@ namespace { * @param \Closure|string $first * @param string|null $operator * @param string|null $second - * @return \Illuminate\Database\Query\Builder|static + * @return \Illuminate\Database\Query\Builder * @static */ public static function leftJoin($table, $first, $operator = null, $second = null) @@ -16569,7 +16875,7 @@ namespace { * @param \Closure|string $first * @param string $operator * @param string $second - * @return \Illuminate\Database\Query\Builder|static + * @return \Illuminate\Database\Query\Builder * @static */ public static function leftJoinWhere($table, $first, $operator, $second) @@ -16586,7 +16892,7 @@ namespace { * @param \Closure|string $first * @param string|null $operator * @param string|null $second - * @return \Illuminate\Database\Query\Builder|static + * @return \Illuminate\Database\Query\Builder * @static */ public static function leftJoinSub($query, $as, $first, $operator = null, $second = null) @@ -16602,7 +16908,7 @@ namespace { * @param \Closure|string $first * @param string|null $operator * @param string|null $second - * @return \Illuminate\Database\Query\Builder|static + * @return \Illuminate\Database\Query\Builder * @static */ public static function rightJoin($table, $first, $operator = null, $second = null) @@ -16618,7 +16924,7 @@ namespace { * @param \Closure|string $first * @param string $operator * @param string $second - * @return \Illuminate\Database\Query\Builder|static + * @return \Illuminate\Database\Query\Builder * @static */ public static function rightJoinWhere($table, $first, $operator, $second) @@ -16635,7 +16941,7 @@ namespace { * @param \Closure|string $first * @param string|null $operator * @param string|null $second - * @return \Illuminate\Database\Query\Builder|static + * @return \Illuminate\Database\Query\Builder * @static */ public static function rightJoinSub($query, $as, $first, $operator = null, $second = null) @@ -16651,7 +16957,7 @@ namespace { * @param \Closure|string|null $first * @param string|null $operator * @param string|null $second - * @return \Illuminate\Database\Query\Builder|static + * @return \Illuminate\Database\Query\Builder * @static */ public static function crossJoin($table, $first = null, $operator = null, $second = null) @@ -16697,7 +17003,7 @@ namespace { * @param string|null $operator * @param string|null $second * @param string|null $boolean - * @return \Illuminate\Database\Query\Builder|static + * @return \Illuminate\Database\Query\Builder * @static */ public static function whereColumn($first, $operator = null, $second = null, $boolean = 'and') @@ -16712,7 +17018,7 @@ namespace { * @param string|array $first * @param string|null $operator * @param string|null $second - * @return \Illuminate\Database\Query\Builder|static + * @return \Illuminate\Database\Query\Builder * @static */ public static function orWhereColumn($first, $operator = null, $second = null) @@ -16741,7 +17047,7 @@ namespace { * * @param string $sql * @param mixed $bindings - * @return \Illuminate\Database\Query\Builder|static + * @return \Illuminate\Database\Query\Builder * @static */ public static function orWhereRaw($sql, $bindings = []) @@ -16771,7 +17077,7 @@ namespace { * * @param string $column * @param mixed $values - * @return \Illuminate\Database\Query\Builder|static + * @return \Illuminate\Database\Query\Builder * @static */ public static function orWhereIn($column, $values) @@ -16786,7 +17092,7 @@ namespace { * @param string $column * @param mixed $values * @param string $boolean - * @return \Illuminate\Database\Query\Builder|static + * @return \Illuminate\Database\Query\Builder * @static */ public static function whereNotIn($column, $values, $boolean = 'and') @@ -16800,7 +17106,7 @@ namespace { * * @param string $column * @param mixed $values - * @return \Illuminate\Database\Query\Builder|static + * @return \Illuminate\Database\Query\Builder * @static */ public static function orWhereNotIn($column, $values) @@ -16825,6 +17131,20 @@ namespace { return $instance->whereIntegerInRaw($column, $values, $boolean, $not); } + /** + * Add an "or where in raw" clause for integer values to the query. + * + * @param string $column + * @param \Illuminate\Contracts\Support\Arrayable|array $values + * @return \Illuminate\Database\Query\Builder + * @static + */ + public static function orWhereIntegerInRaw($column, $values) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->orWhereIntegerInRaw($column, $values); + } + /** * Add a "where not in raw" clause for integer values to the query. * @@ -16840,6 +17160,20 @@ namespace { return $instance->whereIntegerNotInRaw($column, $values, $boolean); } + /** + * Add an "or where not in raw" clause for integer values to the query. + * + * @param string $column + * @param \Illuminate\Contracts\Support\Arrayable|array $values + * @return \Illuminate\Database\Query\Builder + * @static + */ + public static function orWhereIntegerNotInRaw($column, $values) + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->orWhereIntegerNotInRaw($column, $values); + } + /** * Add a "where null" clause to the query. * @@ -16859,7 +17193,7 @@ namespace { * Add an "or where null" clause to the query. * * @param string $column - * @return \Illuminate\Database\Query\Builder|static + * @return \Illuminate\Database\Query\Builder * @static */ public static function orWhereNull($column) @@ -16873,7 +17207,7 @@ namespace { * * @param string|array $columns * @param string $boolean - * @return \Illuminate\Database\Query\Builder|static + * @return \Illuminate\Database\Query\Builder * @static */ public static function whereNotNull($columns, $boolean = 'and') @@ -16903,7 +17237,7 @@ namespace { * * @param string $column * @param array $values - * @return \Illuminate\Database\Query\Builder|static + * @return \Illuminate\Database\Query\Builder * @static */ public static function orWhereBetween($column, $values) @@ -16918,7 +17252,7 @@ namespace { * @param string $column * @param array $values * @param string $boolean - * @return \Illuminate\Database\Query\Builder|static + * @return \Illuminate\Database\Query\Builder * @static */ public static function whereNotBetween($column, $values, $boolean = 'and') @@ -16932,7 +17266,7 @@ namespace { * * @param string $column * @param array $values - * @return \Illuminate\Database\Query\Builder|static + * @return \Illuminate\Database\Query\Builder * @static */ public static function orWhereNotBetween($column, $values) @@ -16945,7 +17279,7 @@ namespace { * Add an "or where not null" clause to the query. * * @param string $column - * @return \Illuminate\Database\Query\Builder|static + * @return \Illuminate\Database\Query\Builder * @static */ public static function orWhereNotNull($column) @@ -16961,7 +17295,7 @@ namespace { * @param string $operator * @param \DateTimeInterface|string|null $value * @param string $boolean - * @return \Illuminate\Database\Query\Builder|static + * @return \Illuminate\Database\Query\Builder * @static */ public static function whereDate($column, $operator, $value = null, $boolean = 'and') @@ -16976,7 +17310,7 @@ namespace { * @param string $column * @param string $operator * @param \DateTimeInterface|string|null $value - * @return \Illuminate\Database\Query\Builder|static + * @return \Illuminate\Database\Query\Builder * @static */ public static function orWhereDate($column, $operator, $value = null) @@ -16992,7 +17326,7 @@ namespace { * @param string $operator * @param \DateTimeInterface|string|null $value * @param string $boolean - * @return \Illuminate\Database\Query\Builder|static + * @return \Illuminate\Database\Query\Builder * @static */ public static function whereTime($column, $operator, $value = null, $boolean = 'and') @@ -17007,7 +17341,7 @@ namespace { * @param string $column * @param string $operator * @param \DateTimeInterface|string|null $value - * @return \Illuminate\Database\Query\Builder|static + * @return \Illuminate\Database\Query\Builder * @static */ public static function orWhereTime($column, $operator, $value = null) @@ -17023,7 +17357,7 @@ namespace { * @param string $operator * @param \DateTimeInterface|string|null $value * @param string $boolean - * @return \Illuminate\Database\Query\Builder|static + * @return \Illuminate\Database\Query\Builder * @static */ public static function whereDay($column, $operator, $value = null, $boolean = 'and') @@ -17038,7 +17372,7 @@ namespace { * @param string $column * @param string $operator * @param \DateTimeInterface|string|null $value - * @return \Illuminate\Database\Query\Builder|static + * @return \Illuminate\Database\Query\Builder * @static */ public static function orWhereDay($column, $operator, $value = null) @@ -17054,7 +17388,7 @@ namespace { * @param string $operator * @param \DateTimeInterface|string|null $value * @param string $boolean - * @return \Illuminate\Database\Query\Builder|static + * @return \Illuminate\Database\Query\Builder * @static */ public static function whereMonth($column, $operator, $value = null, $boolean = 'and') @@ -17069,7 +17403,7 @@ namespace { * @param string $column * @param string $operator * @param \DateTimeInterface|string|null $value - * @return \Illuminate\Database\Query\Builder|static + * @return \Illuminate\Database\Query\Builder * @static */ public static function orWhereMonth($column, $operator, $value = null) @@ -17085,7 +17419,7 @@ namespace { * @param string $operator * @param \DateTimeInterface|string|int|null $value * @param string $boolean - * @return \Illuminate\Database\Query\Builder|static + * @return \Illuminate\Database\Query\Builder * @static */ public static function whereYear($column, $operator, $value = null, $boolean = 'and') @@ -17100,7 +17434,7 @@ namespace { * @param string $column * @param string $operator * @param \DateTimeInterface|string|int|null $value - * @return \Illuminate\Database\Query\Builder|static + * @return \Illuminate\Database\Query\Builder * @static */ public static function orWhereYear($column, $operator, $value = null) @@ -17114,7 +17448,7 @@ namespace { * * @param \Closure $callback * @param string $boolean - * @return \Illuminate\Database\Query\Builder|static + * @return \Illuminate\Database\Query\Builder * @static */ public static function whereNested($callback, $boolean = 'and') @@ -17138,7 +17472,7 @@ namespace { /** * Add another query builder as a nested where to the query builder. * - * @param \Illuminate\Database\Query\Builder|static $query + * @param $this $query * @param string $boolean * @return \Illuminate\Database\Query\Builder * @static @@ -17169,7 +17503,7 @@ namespace { * * @param \Closure $callback * @param bool $not - * @return \Illuminate\Database\Query\Builder|static + * @return \Illuminate\Database\Query\Builder * @static */ public static function orWhereExists($callback, $not = false) @@ -17183,7 +17517,7 @@ namespace { * * @param \Closure $callback * @param string $boolean - * @return \Illuminate\Database\Query\Builder|static + * @return \Illuminate\Database\Query\Builder * @static */ public static function whereNotExists($callback, $boolean = 'and') @@ -17196,7 +17530,7 @@ namespace { * Add a where not exists clause to the query. * * @param \Closure $callback - * @return \Illuminate\Database\Query\Builder|static + * @return \Illuminate\Database\Query\Builder * @static */ public static function orWhereNotExists($callback) @@ -17405,7 +17739,7 @@ namespace { * @param string $column * @param string|null $operator * @param string|null $value - * @return \Illuminate\Database\Query\Builder|static + * @return \Illuminate\Database\Query\Builder * @static */ public static function orHaving($column, $operator = null, $value = null) @@ -17421,7 +17755,7 @@ namespace { * @param array $values * @param string $boolean * @param bool $not - * @return \Illuminate\Database\Query\Builder|static + * @return \Illuminate\Database\Query\Builder * @static */ public static function havingBetween($column, $values, $boolean = 'and', $not = false) @@ -17450,7 +17784,7 @@ namespace { * * @param string $sql * @param array $bindings - * @return \Illuminate\Database\Query\Builder|static + * @return \Illuminate\Database\Query\Builder * @static */ public static function orHavingRaw($sql, $bindings = []) @@ -17462,7 +17796,7 @@ namespace { /** * Add an "order by" clause to the query. * - * @param \Closure|\Illuminate\Database\Query\Builder|string $column + * @param \Closure|\Illuminate\Database\Query\Builder|\Illuminate\Database\Query\Expression|string $column * @param string $direction * @return \Illuminate\Database\Query\Builder * @throws \InvalidArgumentException @@ -17518,7 +17852,7 @@ namespace { * Alias to set the "offset" value of the query. * * @param int $value - * @return \Illuminate\Database\Query\Builder|static + * @return \Illuminate\Database\Query\Builder * @static */ public static function skip($value) @@ -17544,7 +17878,7 @@ namespace { * Alias to set the "limit" value of the query. * * @param int $value - * @return \Illuminate\Database\Query\Builder|static + * @return \Illuminate\Database\Query\Builder * @static */ public static function take($value) @@ -17571,7 +17905,7 @@ namespace { * * @param int $page * @param int $perPage - * @return \Illuminate\Database\Query\Builder|static + * @return \Illuminate\Database\Query\Builder * @static */ public static function forPage($page, $perPage = 15) @@ -17586,7 +17920,7 @@ namespace { * @param int $perPage * @param int|null $lastId * @param string $column - * @return \Illuminate\Database\Query\Builder|static + * @return \Illuminate\Database\Query\Builder * @static */ public static function forPageBeforeId($perPage = 15, $lastId = 0, $column = 'id') @@ -17601,7 +17935,7 @@ namespace { * @param int $perPage * @param int|null $lastId * @param string $column - * @return \Illuminate\Database\Query\Builder|static + * @return \Illuminate\Database\Query\Builder * @static */ public static function forPageAfterId($perPage = 15, $lastId = 0, $column = 'id') @@ -17610,12 +17944,24 @@ namespace { return $instance->forPageAfterId($perPage, $lastId, $column); } + /** + * Remove all existing orders and optionally add a new order. + * + * @return \Illuminate\Database\Query\Builder + * @static + */ + public static function reorder($column = null, $direction = 'asc') + { + /** @var \Illuminate\Database\Query\Builder $instance */ + return $instance->reorder($column, $direction); + } + /** * Add a union statement to the query. * * @param \Illuminate\Database\Query\Builder|\Closure $query * @param bool $all - * @return \Illuminate\Database\Query\Builder|static + * @return \Illuminate\Database\Query\Builder * @static */ public static function union($query, $all = false) @@ -17628,7 +17974,7 @@ namespace { * Add a union all statement to the query. * * @param \Illuminate\Database\Query\Builder|\Closure $query - * @return \Illuminate\Database\Query\Builder|static + * @return \Illuminate\Database\Query\Builder * @static */ public static function unionAll($query) @@ -18202,6 +18548,8 @@ namespace { class Image extends \Intervention\Image\Facades\Image {} + class Stripe extends \Cartalyst\Stripe\Laravel\Facades\Stripe {} + class Flare extends \Facade\Ignition\Facades\Flare {} } diff --git a/app/Http/Controllers/Admin/GatewayController.php b/app/Http/Controllers/Admin/GatewayController.php index ff3235dd..4ff9852a 100644 --- a/app/Http/Controllers/Admin/GatewayController.php +++ b/app/Http/Controllers/Admin/GatewayController.php @@ -5,6 +5,8 @@ namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller; use App\Http\Resources\GatewayCollection; use App\Http\Resources\GatewayResource; +use App\Http\Resources\InvoiceCollection; +use App\Invoice; use App\PaymentGateway; use Illuminate\Http\Request; @@ -33,6 +35,19 @@ class GatewayController extends Controller return new GatewayResource($gateway); } + /** + * Get single payment gateway by slug + * + * @param $slug + * @return InvoiceCollection + */ + public function show_transactions($slug) + { + return new InvoiceCollection( + Invoice::where('provider', $slug)->get() + ); + } + /** * Update payment gateway options * diff --git a/app/Http/Controllers/Admin/PlanController.php b/app/Http/Controllers/Admin/PlanController.php index c36ee62e..3ff87882 100644 --- a/app/Http/Controllers/Admin/PlanController.php +++ b/app/Http/Controllers/Admin/PlanController.php @@ -8,12 +8,21 @@ use App\Http\Resources\PlanResource; use App\Http\Resources\UserResource; use App\Http\Resources\UsersCollection; use App\Plan; +use App\Services\StripeService; use App\User; use Illuminate\Http\Request; use Rinvex\Subscriptions\Models\PlanFeature; class PlanController extends Controller { + /** + * PlanController constructor. + */ + public function __construct(StripeService $stripe) + { + $this->stripe = $stripe; + } + /** * Get all plans * @@ -22,7 +31,7 @@ class PlanController extends Controller public function index() { return new PlanCollection( - app('rinvex.subscriptions.plan')->all() + $this->stripe->getPlans() ); } @@ -35,7 +44,7 @@ class PlanController extends Controller public function show($id) { return new PlanResource( - app('rinvex.subscriptions.plan')->find($id) + $this->stripe->getPlan($id) ); } @@ -47,26 +56,9 @@ class PlanController extends Controller */ public function store(Request $request) { - $plan = app('rinvex.subscriptions.plan')->create([ - 'description' => $request->input('attributes.description'), - 'price' => $request->input('attributes.price'), - 'name' => $request->input('attributes.name'), - 'currency' => 'USD', - 'invoice_period' => 1, - 'sort_order' => 1, - 'signup_fee' => 0, - ]); - - // Create multiple plan features at once - $plan->features()->saveMany([ - new PlanFeature([ - 'name' => 'Storage capacity', - 'value' => $request->input('attributes.capacity'), - 'sort_order' => 1 - ]), - ]); - - return new PlanResource($plan); + return new PlanResource( + $this->stripe->createPlan($request) + ); } /** @@ -78,18 +70,24 @@ class PlanController extends Controller */ public function update(Request $request, $id) { - // TODO: validation request - $plan = app('rinvex.subscriptions.plan')->find($id); - - if ($request->name === 'capacity') { - $plan->getFeatureBySlug('storage-capacity')->update(['value' => $request->value]); - } else { - $plan->update(make_single_input($request)); - } + $this->stripe->updatePlan($request, $id); return response('Saved!', 204); } + /** + * Delete plan + * + * @param $id + * @return \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response + */ + public function delete($id) + { + $this->stripe->deletePlan($id); + + return response('Done!', 204); + } + /** * Get subscriptions * diff --git a/app/Http/Controllers/FileFunctions/EditItemsController.php b/app/Http/Controllers/FileFunctions/EditItemsController.php index cc018293..6527dc51 100644 --- a/app/Http/Controllers/FileFunctions/EditItemsController.php +++ b/app/Http/Controllers/FileFunctions/EditItemsController.php @@ -258,11 +258,6 @@ class EditItemsController extends Controller return Demo::upload($request); } - // Check if user can upload - if (config('vuefilemanager.limit_storage_by_capacity') && user_storage_percentage() >= 100) { - abort(423, 'You exceed your storage limit!'); - } - // Check permission to upload for authenticated editor if ($request->user()->tokenCan('editor')) { diff --git a/app/Http/Controllers/General/PricingController.php b/app/Http/Controllers/General/PricingController.php index 47f6ad23..1c7ff0d6 100644 --- a/app/Http/Controllers/General/PricingController.php +++ b/app/Http/Controllers/General/PricingController.php @@ -4,19 +4,32 @@ namespace App\Http\Controllers\General; use App\Http\Controllers\Controller; use App\Http\Resources\PricingCollection; +use App\Services\StripeService; use Illuminate\Http\Request; class PricingController extends Controller { + /** + * PlanController constructor. + */ + public function __construct(StripeService $stripe) + { + $this->stripe = $stripe; + } + /** * Get all active plans * * @return PricingCollection */ - public function index() { - - return new PricingCollection( - app('rinvex.subscriptions.plan')->where('is_active', 1)->get() + public function index() + { + $collection = new PricingCollection( + $this->stripe->getActivePlans() ); + + return $collection->sortBy('product.metadata.capacity') + ->values() + ->all(); } } diff --git a/app/Http/Controllers/User/PaymentCardsController.php b/app/Http/Controllers/User/PaymentCardsController.php new file mode 100644 index 00000000..e1d4ccd9 --- /dev/null +++ b/app/Http/Controllers/User/PaymentCardsController.php @@ -0,0 +1,107 @@ +payment = $payment; + } + + /** + * Update card detail + * + * @param Request $request + * @param $id + */ + public function update(Request $request, $id) + { + $user = Auth::user(); + + // Update DefaultPayment Method + $user->updateDefaultPaymentMethod($id); + + // Sync default payment method + $user->updateDefaultPaymentMethodFromStripe(); + } + + /** + * Delete user credit card + * + */ + public function delete($id) + { + $user = Auth::user(); + + // Get payment method + $paymentMethod = $user->findPaymentMethod($id); + + // Delete payment method + $paymentMethod->delete(); + + // Sync default payment method + $user->updateDefaultPaymentMethodFromStripe(); + + return response('Done!', 204); + } + + /** + * Get user payment methods sorted by default and others + * + * @return array + */ + public function payment_methods() + { + $user = Auth::user(); + + // Get default payment method + $defaultPaymentMethodObject = $user->defaultPaymentMethod(); + + $defaultPaymentMethod = $defaultPaymentMethodObject instanceof PaymentMethod + ? $defaultPaymentMethodObject->asStripePaymentMethod() + : $defaultPaymentMethodObject; + + // filter payment methods without default payment + $paymentMethods = $user->paymentMethods()->filter(function ($paymentMethod) use ($defaultPaymentMethod) { + return $paymentMethod->id !== $defaultPaymentMethod->id; + }); + + // Get payment methods + $paymentMethodsMapped = $paymentMethods->map(function ($paymentMethod) { + return $paymentMethod->asStripePaymentMethod(); + })->values()->all(); + + if (is_null($paymentMethodsMapped) && is_null($paymentMethodsMapped)) { + return [ + 'default' => null, + 'others' => [], + ]; + } + + return [ + 'default' => $defaultPaymentMethod instanceof PaymentMethod + ? new PaymentCardResource($defaultPaymentMethod) + : new PaymentDefaultCardResource($defaultPaymentMethod), + 'others' => new PaymentCardCollection($paymentMethodsMapped), + ]; + } +} diff --git a/app/Http/Controllers/User/SubscriptionController.php b/app/Http/Controllers/User/SubscriptionController.php index bacbf5e9..80bf0437 100644 --- a/app/Http/Controllers/User/SubscriptionController.php +++ b/app/Http/Controllers/User/SubscriptionController.php @@ -3,53 +3,82 @@ namespace App\Http\Controllers\User; use App\Http\Controllers\Controller; +use App\Http\Requests\Subscription\StoreUpgradeAccountRequest; +use App\Http\Resources\UserSubscription; use App\Invoice; +use App\Services\PaymentService; +use App\Services\StripeService; use Auth; +use Cartalyst\Stripe\Exception\CardErrorException; +use Illuminate\Contracts\Routing\ResponseFactory; use Illuminate\Http\Request; +use Laravel\Cashier\Exceptions\IncompletePayment; +use Symfony\Component\HttpKernel\Exception\HttpException; class SubscriptionController extends Controller { + private $stripe; + + /** + * SubscriptionController constructor. + * @param $payment + */ + public function __construct(StripeService $stripe) + { + $this->stripe = $stripe; + } + + /** + * Generate setup intent + * + * @return \Stripe\SetupIntent + */ + public function stripe_setup_intent() + { + // Get user + $user = Auth::user(); + + // Create stripe customer if not exist + $user->createOrGetStripeCustomer(); + + // Return setup intent + return $user->createSetupIntent(); + } + + public function show() + { + return new UserSubscription( + Auth::user() + ); + } + /** * Upgrade account to subscription * - * @param Request $request - * @return \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response + * @param StoreUpgradeAccountRequest $request + * @return ResponseFactory|\Illuminate\Http\Response */ - public function upgrade(Request $request) + public function upgrade(StoreUpgradeAccountRequest $request) { - // TODO: validation request - // Get user $user = Auth::user(); // Get requested plan - $plan = app('rinvex.subscriptions.plan') - ->find($request->input('plan.data.id')); + $plan = $this->stripe->getPlan($request->input('plan.data.id')); - // Check if user have subscription - if ($user->activeSubscriptions()->count() !== 0) { + // Set user billing + $user->setBilling($request->input('billing')); - // Get old subscription - $subscription = $user->subscription('main'); - - // Change subscription plan - $subscription->changePlan($plan); - - } else { - - // Create subscription - $user->newSubscription('main', $plan); - } + // Make subscription + $this->stripe->createOrReplaceSubscription($request, $user); // Update user storage limit $user->settings()->update([ - 'storage_capacity' => $plan->features->first()->value + 'storage_capacity' => $plan['product']['metadata']['capacity'] ]); // Store invoice - Invoice::create( - get_invoice_data($user, $plan) - ); + Invoice::create(get_invoice_data($user, $plan, 'stripe')); return response('Done!', 204); } @@ -57,15 +86,25 @@ class SubscriptionController extends Controller /** * Cancel Subscription * - * @return \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response + * @return ResponseFactory|\Illuminate\Http\Response */ - public function cancel() { - - // Get user - $user = Auth::user(); - + public function cancel() + { // Cancel subscription - $user->subscription('main')->cancel(); + Auth::user()->subscription('main')->cancel(); + + return response('Done!', 204); + } + + /** + * Resume Subscription + * + * @return ResponseFactory|\Illuminate\Http\Response + */ + public function resume() + { + // Resume subscription + Auth::user()->subscription('main')->resume(); return response('Done!', 204); } diff --git a/app/Http/helpers.php b/app/Http/Helpers/helpers.php similarity index 88% rename from app/Http/helpers.php rename to app/Http/Helpers/helpers.php index 960d2bf5..6450c67c 100644 --- a/app/Http/helpers.php +++ b/app/Http/Helpers/helpers.php @@ -27,7 +27,14 @@ function get_invoice_number() } } -function get_invoice_data($user, $plan) +/** + * Get data to render in invoice tempalte + * @param $user + * @param $plan + * @param $provider + * @return array + */ +function get_invoice_data($user, $plan, $provider) { $subscription = $user->subscription('main'); $order_number = get_invoice_number(); @@ -36,15 +43,17 @@ function get_invoice_data($user, $plan) return [ 'token' => $token, 'order' => $order_number, + 'provider' => $provider, 'user_id' => $user->id, - 'plan_id' => $plan->id, - 'total' => $plan->price, + 'plan_id' => $plan['plan']['id'], + 'total' => $plan['plan']['amount'], 'currency' => 'USD', 'bag' => [ [ - 'description' => 'Subscription - ' . $plan->name, - 'date' => format_date($subscription->starts_at, '%d. %B. %Y') . ' - ' . format_date($subscription->ends_at, '%d. %B. %Y'), - 'amount' => $plan->price, + 'description' => 'Subscription - ' . $plan['product']['name'], + //'date' => format_date($subscription->starts_at, '%d. %B. %Y') . ' - ' . format_date($subscription->ends_at, '%d. %B. %Y'), + 'date' => format_date(Carbon::now(),'%d. %B. %Y'), + 'amount' => $plan['plan']['amount'], ] ], 'seller' => [ @@ -282,15 +291,21 @@ function get_storage_fill_percentage($used, $capacity) } /** - * Get user capacity fill percentage + * Get user capacity fill by percentage * * @return string */ -function user_storage_percentage() +function user_storage_percentage($id, $additionals = null) { - $user = Auth::user(); + $user = \App\User::findOrFail($id); - return get_storage_fill_percentage($user->used_capacity, $user->settings->storage_capacity); + $used = $user->used_capacity; + + if ($additionals) { + $used = $user->used_capacity + $additionals; + } + + return get_storage_fill_percentage($used, $user->settings->storage_capacity); } /** diff --git a/app/Http/Helpers/subscription.php b/app/Http/Helpers/subscription.php new file mode 100644 index 00000000..62b31d41 --- /dev/null +++ b/app/Http/Helpers/subscription.php @@ -0,0 +1,23 @@ +all(); + + $unsubscribed = $plans->filter(function ($item) use ($plan) { + return $item->id !== $plan->id; + }); + + $capacities = $unsubscribed->map(function ($item) { + return $item->features->first()->value; + }); + + return max(Arr::flatten($capacities)) < $plan->features->first()->value ? 1 : 0; +} diff --git a/app/Http/Requests/Subscription/StoreUpgradeAccountRequest.php b/app/Http/Requests/Subscription/StoreUpgradeAccountRequest.php new file mode 100644 index 00000000..1ce25905 --- /dev/null +++ b/app/Http/Requests/Subscription/StoreUpgradeAccountRequest.php @@ -0,0 +1,56 @@ + 'required|array', + 'billing.billing_address' => 'required|string', + 'billing.billing_city' => 'required|string', + 'billing.billing_country' => 'required|string', + 'billing.billing_name' => 'required|string', + 'billing.billing_phone_number' => 'required|string', + 'billing.billing_postal_code' => 'required|string', + 'billing.billing_state' => 'required|string', + + // Payment + 'payment' => 'required|array', + 'payment.type' => 'required|string', + 'payment.meta' => 'required|sometimes|array', + 'payment.meta.pm' => 'required|sometimes|string', + + // Plan + 'plan.data' => 'required|array', + 'plan.data.attributes' => 'required|array', + 'plan.data.attributes.capacity' => 'required|digits_between:1,9', + 'plan.data.attributes.capacity_formatted' => 'required|string', + 'plan.data.attributes.currency' => 'required|string', + 'plan.data.attributes.description' => 'required|string', + 'plan.data.attributes.name' => 'required|string', + 'plan.data.attributes.price' => 'required|string', + 'plan.data.id' => 'required|string', + 'plan.data.type' => 'required|string', + ]; + } +} diff --git a/app/Http/Resources/GatewayResource.php b/app/Http/Resources/GatewayResource.php index a0e43f24..8c7a02fc 100644 --- a/app/Http/Resources/GatewayResource.php +++ b/app/Http/Resources/GatewayResource.php @@ -19,15 +19,16 @@ class GatewayResource extends JsonResource 'id' => (string)$this->id, 'type' => 'gateways', 'attributes' => [ - 'status' => $this->status, - 'sandbox' => $this->sandbox, - 'name' => $this->name, - 'slug' => $this->slug, - 'logo' => $this->logo, - 'client_id' => $this->client_id, - 'secret' => $this->secret, - 'webhook' => $this->webhook, - 'optional' => $this->optional, + 'status' => $this->status, + 'sandbox' => $this->sandbox, + 'name' => $this->name, + 'slug' => $this->slug, + 'logo' => $this->logo, + 'client_id' => $this->client_id, + 'secret' => $this->secret, + 'webhook' => $this->webhook, + 'payment_processed' => $this->payment_processed, + 'optional' => $this->optional, ] ] ]; diff --git a/app/Http/Resources/PaymentCardCollection.php b/app/Http/Resources/PaymentCardCollection.php new file mode 100644 index 00000000..96cb6cc8 --- /dev/null +++ b/app/Http/Resources/PaymentCardCollection.php @@ -0,0 +1,23 @@ + $this->collection, + ]; + } +} diff --git a/app/Http/Resources/PaymentCardResource.php b/app/Http/Resources/PaymentCardResource.php new file mode 100644 index 00000000..ccb9c8b7 --- /dev/null +++ b/app/Http/Resources/PaymentCardResource.php @@ -0,0 +1,35 @@ + [ + 'id' => (string)$this['id'], + 'type' => 'payment_method', + 'attributes' => [ + 'provider' => 'stripe', + 'card_id' => $this['id'], + 'brand' => strtolower($this['card']['brand']), + 'last4' => $this['card']['last4'], + 'exp_month' => $this['card']['exp_month'], + 'exp_year' => $this['card']['exp_year'], + 'created_at' => format_date($this['created_at'], '%d. %B. %Y'), + 'status' => 'active', + 'default' => 0, + ] + ] + ]; + } +} diff --git a/app/Http/Resources/PaymentDefaultCardResource.php b/app/Http/Resources/PaymentDefaultCardResource.php new file mode 100644 index 00000000..3c102cbc --- /dev/null +++ b/app/Http/Resources/PaymentDefaultCardResource.php @@ -0,0 +1,35 @@ + [ + 'id' => (string)$this['id'], + 'type' => 'payment_method', + 'attributes' => [ + 'provider' => 'stripe', + 'card_id' => $this['id'], + 'brand' => isset($this['brand']) ? strtolower($this['brand']) : strtolower($this['card']['brand']), + 'last4' => isset($this['last4']) ? $this['last4'] : $this['card']['last4'], + 'exp_month' => isset($this['exp_month']) ? $this['exp_month'] : $this['card']['exp_month'], + 'exp_year' => isset($this['exp_year']) ? $this['exp_year'] : $this['card']['exp_year'], + 'created_at' => format_date($this['created_at'], '%d. %B. %Y'), + 'status' => 'active', + 'default' => 0, + ] + ] + ]; + } +} diff --git a/app/Http/Resources/PlanResource.php b/app/Http/Resources/PlanResource.php index 64d873e3..03b7bb22 100644 --- a/app/Http/Resources/PlanResource.php +++ b/app/Http/Resources/PlanResource.php @@ -16,19 +16,18 @@ class PlanResource extends JsonResource { return [ 'data' => [ - 'id' => (string)$this->id, + 'id' => $this['plan']['id'], 'type' => 'plans', 'attributes' => [ - 'subscribers' => $this->subscriptions->count(), - 'status' => $this->is_active, - 'name' => $this->name, - 'description' => $this->description, - 'price' => $this->price, - 'capacity_formatted' => format_gigabytes($this->features->first()->value), - 'capacity' => $this->features->first()->value, - 'created_at_formatted' => format_date($this->created_at), - 'created_at' => $this->created_at, - 'updated_at' => $this->updated_at, + 'subscribers' => $this['plan']['aggregate_usage'], + 'status' => $this['plan']['active'], + 'name' => $this['product']['name'], + 'description' => $this['product']['description'], + 'price' => $this['plan']['amount'], + 'capacity_formatted' => format_gigabytes($this['product']['metadata']['capacity']), + 'capacity' => $this['product']['metadata']['capacity'], + 'created_at_formatted' => format_date($this['plan']['created']), + 'created_at' => $this['plan']['created'], ] ] ]; diff --git a/app/Http/Resources/PricingResource.php b/app/Http/Resources/PricingResource.php index 0889543c..3e157553 100644 --- a/app/Http/Resources/PricingResource.php +++ b/app/Http/Resources/PricingResource.php @@ -3,28 +3,29 @@ namespace App\Http\Resources; use Illuminate\Http\Resources\Json\JsonResource; +use Laravel\Cashier\Cashier; class PricingResource extends JsonResource { /** * Transform the resource into an array. * - * @param \Illuminate\Http\Request $request + * @param \Illuminate\Http\Request $request * @return array */ public function toArray($request) { return [ 'data' => [ - 'id' => (string)$this->id, + 'id' => $this['plan']['id'], 'type' => 'plans', 'attributes' => [ - 'name' => $this->name, - 'description' => $this->description, - 'price' => $this->price, - 'capacity_formatted' => format_gigabytes($this->features->first()->value), - 'capacity' => (int) $this->features->first()->value, - 'currency' => 'USD', + 'name' => $this['product']['name'], + 'description' => $this['product']['description'], + 'price' => Cashier::formatAmount($this['plan']['amount']), + 'capacity_formatted' => format_gigabytes($this['product']['metadata']['capacity']), + 'capacity' => (int) $this['product']['metadata']['capacity'], + 'currency' => 'USD', ] ] ]; diff --git a/app/Http/Resources/UserResource.php b/app/Http/Resources/UserResource.php index 5d3e0092..1842f009 100644 --- a/app/Http/Resources/UserResource.php +++ b/app/Http/Resources/UserResource.php @@ -2,6 +2,9 @@ namespace App\Http\Resources; +use App\Services\StripeService; +use App\User; +use Cartalyst\Stripe\Api\PaymentMethods; use Faker\Factory; use Illuminate\Http\Resources\Json\JsonResource; @@ -27,16 +30,14 @@ class UserResource extends JsonResource 'email' => env('APP_DEMO') ? $faker->email : $this->email, 'avatar' => $this->avatar, 'role' => $this->role, + 'subscription' => $this->subscribed('main'), 'created_at_formatted' => format_date($this->created_at, '%d. %B. %Y'), 'created_at' => $this->created_at, 'updated_at' => $this->updated_at, ] ], 'relationships' => [ - 'subscription' => $this->activeSubscriptions()->count() !== 0 - ? new UserSubscription($this->subscription('main')) - : null, - 'settings' => [ + 'settings' => [ 'data' => [ 'id' => (string)$this->settings->id, 'type' => 'settings', @@ -51,14 +52,14 @@ class UserResource extends JsonResource ] ] ], - 'storage' => [ + 'storage' => [ 'data' => [ 'id' => '1', 'type' => 'storage', 'attributes' => $this->storage ] ], - 'favourites' => [ + 'favourites' => [ 'data' => [ 'id' => '1', 'type' => 'folders_favourite', @@ -67,7 +68,7 @@ class UserResource extends JsonResource ], ], ], - 'tree' => [ + 'tree' => [ 'data' => [ 'id' => '1', 'type' => 'folders_tree', @@ -76,6 +77,7 @@ class UserResource extends JsonResource ], ], ], + 'payment_methods' => new PaymentCardCollection($this->payment_cards) ] ]; } diff --git a/app/Http/Resources/UserSubscription.php b/app/Http/Resources/UserSubscription.php index 6a7ad7e2..d757f162 100644 --- a/app/Http/Resources/UserSubscription.php +++ b/app/Http/Resources/UserSubscription.php @@ -14,21 +14,33 @@ class UserSubscription extends JsonResource */ public function toArray($request) { + $stripe = resolve('App\Services\StripeService'); + + $active_subscription = $this->subscription('main')->asStripeSubscription(); + + // Get subscription details + $subscription = $stripe->getPlan($this->subscription('main')->stripe_plan); + + // Retrieve the timestamp from Stripe + $current_period_end = $active_subscription["current_period_end"]; + $current_period_start = $active_subscription["current_period_start"]; + $canceled_at = $active_subscription["canceled_at"]; + return [ 'data' => [ - 'id' => $this->id, + 'id' => $subscription['plan']['id'], 'type' => 'subscription', 'attributes' => [ - 'active' => $this->active(), - 'canceled' => $this->canceled(), - 'name' => $this->plan->name, - 'capacity' => (int) $this->plan->features->first()->value, - 'capacity_formatted' => format_gigabytes($this->plan->features->first()->value), - 'slug' => $this->slug, - 'canceled_at' => format_date($this->created_at, '%d. %B. %Y'), - 'created_at' => format_date($this->created_at, '%d. %B. %Y'), - 'starts_at' => format_date($this->starts_at, '%d. %B. %Y'), - 'ends_at' => format_date($this->ends_at, '%d. %B. %Y'), + /*'is_highest' => is_highest_plan($this->plan),*/ + 'active' => $subscription['plan']['active'], + 'canceled' => $this->subscription('main')->cancelled(), + 'name' => $subscription['product']['name'], + 'capacity' => (int)$subscription['product']['metadata']['capacity'], + 'capacity_formatted' => format_gigabytes($subscription['product']['metadata']['capacity']), + 'slug' => $subscription['plan']['id'], + 'canceled_at' => format_date($canceled_at, '%d. %B. %Y'), + 'created_at' => format_date($current_period_start, '%d. %B. %Y'), + 'ends_at' => format_date($current_period_end, '%d. %B. %Y'), ] ] ]; diff --git a/app/Http/Tools/Editor.php b/app/Http/Tools/Editor.php index 756a317c..c7c50598 100644 --- a/app/Http/Tools/Editor.php +++ b/app/Http/Tools/Editor.php @@ -197,14 +197,20 @@ class Editor */ public static function upload($request, $shared = null) { - // Get user data - $user_scope = is_null($shared) ? $request->user()->token()->scopes[0] : 'editor'; - $user_id = is_null($shared) ? Auth::id() : $shared->user_id; - // Get parent_id from request $folder_id = $request->parent_id === 0 ? 0 : $request->parent_id; $file = $request->file('file'); + // Get user data + $user_scope = is_null($shared) ? $request->user()->token()->scopes[0] : 'editor'; + $user_id = is_null($shared) ? Auth::id() : $shared->user_id; + $user_storage_used = user_storage_percentage($user_id, $file->getSize()); + + // Check if user can upload + if (config('vuefilemanager.limit_storage_by_capacity') && $user_storage_used >= 100) { + abort(423, 'You exceed your storage limit!'); + } + // File $filename = Str::random() . '-' . str_replace(' ', '', $file->getClientOriginalName()); $filetype = get_file_type($file); diff --git a/app/Invoice.php b/app/Invoice.php index 1f52890b..7bcc7b62 100644 --- a/app/Invoice.php +++ b/app/Invoice.php @@ -4,6 +4,43 @@ namespace App; use Illuminate\Database\Eloquent\Model; +/** + * App\Invoice + * + * @property int $id + * @property string $token + * @property string $order + * @property string|null $provider + * @property string $user_id + * @property string $plan_id + * @property array $seller + * @property array $client + * @property array $bag + * @property string|null $notes + * @property string $total + * @property string $currency + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + * @property-read \App\User|null $user + * @method static \Illuminate\Database\Eloquent\Builder|\App\Invoice newModelQuery() + * @method static \Illuminate\Database\Eloquent\Builder|\App\Invoice newQuery() + * @method static \Illuminate\Database\Eloquent\Builder|\App\Invoice query() + * @method static \Illuminate\Database\Eloquent\Builder|\App\Invoice whereBag($value) + * @method static \Illuminate\Database\Eloquent\Builder|\App\Invoice whereClient($value) + * @method static \Illuminate\Database\Eloquent\Builder|\App\Invoice whereCreatedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|\App\Invoice whereCurrency($value) + * @method static \Illuminate\Database\Eloquent\Builder|\App\Invoice whereId($value) + * @method static \Illuminate\Database\Eloquent\Builder|\App\Invoice whereNotes($value) + * @method static \Illuminate\Database\Eloquent\Builder|\App\Invoice whereOrder($value) + * @method static \Illuminate\Database\Eloquent\Builder|\App\Invoice wherePlanId($value) + * @method static \Illuminate\Database\Eloquent\Builder|\App\Invoice whereProvider($value) + * @method static \Illuminate\Database\Eloquent\Builder|\App\Invoice whereSeller($value) + * @method static \Illuminate\Database\Eloquent\Builder|\App\Invoice whereToken($value) + * @method static \Illuminate\Database\Eloquent\Builder|\App\Invoice whereTotal($value) + * @method static \Illuminate\Database\Eloquent\Builder|\App\Invoice whereUpdatedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|\App\Invoice whereUserId($value) + * @mixin \Eloquent + */ class Invoice extends Model { protected $guarded = [ diff --git a/app/PaymentGateway.php b/app/PaymentGateway.php index e6f11e04..1c9a9935 100644 --- a/app/PaymentGateway.php +++ b/app/PaymentGateway.php @@ -4,6 +4,36 @@ namespace App; use Illuminate\Database\Eloquent\Model; +/** + * App\PaymentGateway + * + * @property int $id + * @property int $status + * @property int $sandbox + * @property string $name + * @property string $slug + * @property string $logo + * @property string|null $client_id + * @property string|null $secret + * @property string|null $webhook + * @property string|null $optional + * @property int|null $payment_processed + * @method static \Illuminate\Database\Eloquent\Builder|\App\PaymentGateway newModelQuery() + * @method static \Illuminate\Database\Eloquent\Builder|\App\PaymentGateway newQuery() + * @method static \Illuminate\Database\Eloquent\Builder|\App\PaymentGateway query() + * @method static \Illuminate\Database\Eloquent\Builder|\App\PaymentGateway whereClientId($value) + * @method static \Illuminate\Database\Eloquent\Builder|\App\PaymentGateway whereId($value) + * @method static \Illuminate\Database\Eloquent\Builder|\App\PaymentGateway whereLogo($value) + * @method static \Illuminate\Database\Eloquent\Builder|\App\PaymentGateway whereName($value) + * @method static \Illuminate\Database\Eloquent\Builder|\App\PaymentGateway whereOptional($value) + * @method static \Illuminate\Database\Eloquent\Builder|\App\PaymentGateway wherePaymentProcessed($value) + * @method static \Illuminate\Database\Eloquent\Builder|\App\PaymentGateway whereSandbox($value) + * @method static \Illuminate\Database\Eloquent\Builder|\App\PaymentGateway whereSecret($value) + * @method static \Illuminate\Database\Eloquent\Builder|\App\PaymentGateway whereSlug($value) + * @method static \Illuminate\Database\Eloquent\Builder|\App\PaymentGateway whereStatus($value) + * @method static \Illuminate\Database\Eloquent\Builder|\App\PaymentGateway whereWebhook($value) + * @mixin \Eloquent + */ class PaymentGateway extends Model { protected $guarded = ['id']; diff --git a/app/Services/PaymentService.php b/app/Services/PaymentService.php new file mode 100644 index 00000000..abb93c5d --- /dev/null +++ b/app/Services/PaymentService.php @@ -0,0 +1,199 @@ +stripe = Stripe::make(config('services.stripe.secret'), '2020-03-02'); + } + + /** + * Get and charge customer + * + * @param $request + * @param $plan + * @param $user + */ + public function getAndChargeCustomer($request, $plan, $user) + { + // Get Stripe Customer + $customer = $this->findOrCreateStripeCustomer($user); + + $paymentIntent = $this->stripe->paymentIntents()->create([ + 'amount' => $plan->price, + 'currency' => 'USD', + 'payment_method_types' => [ + 'card', + ], + ]); + + dd($paymentIntent); + + // Try charge customer + try { + if ($request->has('payment.meta.card_token')) { + + // Register customer credit card + $created_card = $this->registerStripeCreditCard($customer, $request->input('payment.meta.card_token')); + + // Charge with created credit card + /*$this->stripe->charges()->create([ + 'description' => 'Subscription ' . $plan->name, + 'customer' => $customer['id'], + 'amount' => $plan->price, + 'currency' => 'USD', + 'source' => $created_card->card_id + ]);*/ + + } else { + + // Charge with customer default creadit card + $this->stripe->charges()->create([ + 'description' => 'Subscription ' . $plan->name, + 'customer' => $customer['id'], + 'amount' => $plan->price, + 'currency' => 'USD', + ]); + } + + } catch (CardErrorException $error) { + + //dd($error); + + // Remove previously registered card + if (in_array($error->getErrorCode(), ['rejected_card', 'card_declined']) + && $request->has('payment.meta.card_token') + && isset($error->getRawOutput()['error']['charge'])) { + + // Get charge + $charge = $this->stripe->charges()->find($error->getRawOutput()['error']['charge']); + + // Remove card from stripe + $this->deleteStripeCard($user->settings->stripe_customer_id, $charge['payment_method']); + + // Get card + $error_card = UserCard::where('card_id', $charge['payment_method'])->first(); + + // Delete card + $error_card->delete(); + } + + throw new HttpException($error->getCode(), $error->getMessage()); + } + + // Increase payment processed column + PaymentGateway::where('slug', 'stripe')->first()->increment('payment_processed'); + } + + + /** + * Find or create stripe customer + * + * @param $user + * @return array + */ + private function findOrCreateStripeCustomer($user) + { + // Get existing stripe customer + if ($user->settings->stripe_customer_id) { + + return $this->stripe->customers()->find($user->settings->stripe_customer_id); + } + + // Create new stripe costumer + if (!$user->settings->stripe_customer_id) { + + $customer = $this->stripe->customers()->create([ + 'email' => $user->email, + 'name' => $user->name, + 'address' => [ + 'city' => $user->settings->billing_city, + 'country' => $user->settings->billing_country, + 'line1' => $user->settings->billing_address, + 'state' => $user->settings->billing_state, + 'postal_code' => $user->settings->billing_postal_code, + ] + ]); + + // Store user stripe_customer_id + $user->settings()->update([ + 'stripe_customer_id' => $customer['id'] + ]); + + return $customer; + } + } + + /** + * Register stripe credit card + * + * @param $customer + * @param $card_id + * @return object + */ + private function registerStripeCreditCard($customer, $card_id) + { + // Register user card + $card = $this->stripe->cards()->create($customer['id'], $card_id); + + // Get user settings + $user_settings = UserSettings::where('stripe_customer_id', $customer['id'])->first(); + + // Set default status + $default_card = UserCard::where('user_id', $user_settings->user_id)->get()->count() > 0 ? 0 : 1; + + // Store user card + $card = UserCard::create([ + 'user_id' => $user_settings->user_id, + 'status' => 'active', + 'default' => $default_card, + 'provider' => 'stripe', + 'card_id' => $card['id'], + 'brand' => $card['brand'], + 'last4' => $card['last4'], + 'exp_month' => $card['exp_month'], + 'exp_year' => $card['exp_year'], + ]); + + return $card; + } + + /** + * Set new default source from existing credit card + * + * @param $stripe_customer_id + * @param $card_id + */ + public function setDefaultStripeCard($stripe_customer_id, $card_id) + { + $this->stripe->customers()->update($stripe_customer_id, [ + 'default_source' => $card_id, + ]); + } + + /** + * Delete customer stripe credit card + * + * @param $stripe_customer_id + * @param $card_id + */ + public function deleteStripeCard($stripe_customer_id, $card_id) + { + $this->stripe->cards()->delete($stripe_customer_id, $card_id); + } +} \ No newline at end of file diff --git a/app/Services/StripeService.php b/app/Services/StripeService.php new file mode 100644 index 00000000..6ea0c98d6 --- /dev/null +++ b/app/Services/StripeService.php @@ -0,0 +1,229 @@ +stripe = Stripe::make(env('STRIPE_SECRET'), '2020-03-02'); + } + + /** + * Get default payment option or set new default payment + * + * @param $request + * @param $user + * @return mixed + */ + public function getOrSetDefaultPaymentMethod($request, $user) + { + // Check payment method + if (! $request->has('payment.meta.pm') && $user->hasDefaultPaymentMethod()) { + + // Get default payment + return $user->defaultPaymentMethod()->paymentMethod; + + } else if ( $request->has('payment.meta.pm') && $user->hasDefaultPaymentMethod() ) { + + // Set new payment + return $user->addPaymentMethod($request->input('payment.meta.pm'))->paymentMethod; + + } else if ( $request->has('payment.meta.pm') && ! $user->hasDefaultPaymentMethod() ) { + + // Set new payment + return $user->updateDefaultPaymentMethod($request->input('payment.meta.pm'))->paymentMethod; + + } else { + + throw new HttpException(400, 'Something went wrong.'); + } + } + + /** + * Create new subscription or replace by new subscription + * + * @param $request + * @param $user + * @param $paymentMethod + */ + public function createOrReplaceSubscription($request, $user) + { + try { + + // Get payment method + $paymentMethod = $this->getOrSetDefaultPaymentMethod($request, $user); + + // Check if user have subscription + if ($user->subscribed('main')) { + + // Change subscription plan + $user->subscription('main')->skipTrial()->swap($request->input('plan.data.id')); + + } else { + + // Create subscription + $user->newSubscription('main', $request->input('plan.data.id'))->create($paymentMethod); + } + + } catch (IncompletePayment $exception) { + + throw new HttpException(400, 'We can\'t charge your card'); + } + } + + /** + * Create plan + * + * @param $request + * @return mixed + */ + public function createPlan($request) + { + $product = $this->stripe->products()->create([ + 'name' => $request->input('attributes.name'), + 'description' => $request->input('attributes.description'), + 'metadata' => [ + 'capacity' => $request->input('attributes.capacity') + ] + ]); + + $plan = $this->stripe->plans()->create([ + 'id' => Str::slug($request->input('attributes.name')), + 'amount' => $request->input('attributes.price'), + 'currency' => 'USD', + 'interval' => 'month', + 'product' => $product['id'], + ]); + + return compact('plan', 'product'); + } + + /** + * Update plan + * + * @param $request + * @param $id + */ + public function updatePlan($request, $id) + { + $plan_colls = ['is_active', 'price']; + $product_colls = ['name', 'description', 'capacity']; + + $plan = $this->stripe->plans()->find($id); + + // Update product + if (in_array($request->name, $product_colls)) { + + if ($request->name === 'capacity') { + $this->stripe->products()->update($plan['product'], ['metadata' => ['capacity' => $request->value]]); + } + if ($request->name === 'name') { + $this->stripe->products()->update($plan['product'], ['name' => $request->value]); + } + if ($request->name === 'description') { + $this->stripe->products()->update($plan['product'], ['description' => $request->value]); + } + } + + // Update plan + if (in_array($request->name, $plan_colls)) { + + if ($request->name === 'is_active') { + $this->stripe->plans()->update($id, ['active' => $request->value]); + } + } + } + + /** + * Get plan details + * + * @param $id + * @return mixed + */ + public function getPlan($id) + { + $plan = $this->stripe->plans()->find($id); + $product = $this->stripe->products()->find($plan['product']); + + return compact('plan', 'product'); + } + + /** + * Get all plans + * + * @return mixed + */ + public function getPlans() + { + // Get stripe plans + $stripe_plans = $this->stripe->plans()->all(); + + // Plans container + $plans = []; + + foreach ($stripe_plans['data'] as $plan) { + + // Get stripe product + $product = $this->stripe->products()->find($plan['product']); + + // Push data to $plan container + array_push($plans, [ + 'plan' => $plan, + 'product' => $product, + ]); + } + + return $plans; + } + + /** + * Get all active plans + * + * @return mixed + */ + public function getActivePlans() + { + // Get stripe plans + $stripe_plans = $this->stripe->plans()->all(); + + // Plans container + $plans = []; + + foreach ($stripe_plans['data'] as $plan) { + + if ($plan['active']) { + + // Get stripe product + $product = $this->stripe->products()->find($plan['product']); + + // Push data to $plan container + array_push($plans, [ + 'plan' => $plan, + 'product' => $product, + ]); + } + } + + return $plans; + } + + /** + * Delete plan + * + * @param $slug + */ + public function deletePlan($slug) + { + $this->stripe->plans()->delete($slug); + } +} \ No newline at end of file diff --git a/app/User.php b/app/User.php index 99d8a7fe..da356e4d 100644 --- a/app/User.php +++ b/app/User.php @@ -10,6 +10,7 @@ use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Notification; +use Laravel\Cashier\Billable; use Laravel\Passport\HasApiTokens; use Rinvex\Subscriptions\Traits\HasSubscriptions; @@ -53,10 +54,31 @@ use Rinvex\Subscriptions\Traits\HasSubscriptions; * @method static \Illuminate\Database\Eloquent\Builder|\App\User whereRememberToken($value) * @method static \Illuminate\Database\Eloquent\Builder|\App\User whereUpdatedAt($value) * @mixin \Eloquent + * @property string $role + * @property string|null $stripe_id + * @property string|null $card_brand + * @property string|null $card_last_four + * @property string|null $trial_ends_at + * @property-read \Illuminate\Database\Eloquent\Collection|\App\FileManagerFolder[] $favourite_folders + * @property-read int|null $favourite_folders_count + * @property-read mixed $folder_tree + * @property-read mixed $storage + * @property-read \Illuminate\Database\Eloquent\Collection|\App\Invoice[] $invoices + * @property-read int|null $invoices_count + * @property-read \Illuminate\Database\Eloquent\Collection|\App\UserCard[] $payment_cards + * @property-read int|null $payment_cards_count + * @property-read \App\UserSettings|null $settings + * @property-read \Illuminate\Database\Eloquent\Collection|\Laravel\Cashier\Subscription[] $subscriptions + * @property-read int|null $subscriptions_count + * @method static \Illuminate\Database\Eloquent\Builder|\App\User whereCardBrand($value) + * @method static \Illuminate\Database\Eloquent\Builder|\App\User whereCardLastFour($value) + * @method static \Illuminate\Database\Eloquent\Builder|\App\User whereRole($value) + * @method static \Illuminate\Database\Eloquent\Builder|\App\User whereStripeId($value) + * @method static \Illuminate\Database\Eloquent\Builder|\App\User whereTrialEndsAt($value) */ class User extends Authenticatable { - use HasApiTokens, Notifiable, HasSubscriptions; + use HasApiTokens, Notifiable, Billable; /** * The attributes that are mass assignable. @@ -95,11 +117,11 @@ class User extends Authenticatable * * @return mixed */ - public function getStorageAttribute() { - + public function getStorageAttribute() + { return [ - 'used' => (float) get_storage_fill_percentage($this->used_capacity, $this->settings->storage_capacity), - 'capacity' => $this->settings->storage_capacity, + 'used' => (float)get_storage_fill_percentage($this->used_capacity, $this->settings->storage_capacity), + 'capacity' => $this->settings->storage_capacity, 'capacity_formatted' => format_gigabytes($this->settings->storage_capacity), ]; } @@ -109,8 +131,8 @@ class User extends Authenticatable * * @return mixed */ - public function getUsedCapacityAttribute() { - + public function getUsedCapacityAttribute() + { $user_capacity = $this->files_with_trashed->map(function ($item) { return $item->getRawOriginal(); })->sum('filesize'); @@ -118,7 +140,8 @@ class User extends Authenticatable return $user_capacity; } - public function getFolderTreeAttribute() { + public function getFolderTreeAttribute() + { return FileManagerFolder::with(['folders.shared', 'shared:token,id,item_id,permission,protected']) ->where('parent_id', 0) ->where('user_id', $this->id) @@ -139,6 +162,24 @@ class User extends Authenticatable return url('/assets/images/' . 'default-avatar.png'); } + /** + * Set user billing info + * + * @param $billing + */ + public function setBilling($billing) + { + $this->settings()->update([ + 'billing_address' => $billing['billing_address'], + 'billing_city' => $billing['billing_city'], + 'billing_country' => $billing['billing_country'], + 'billing_name' => $billing['billing_name'], + 'billing_phone_number' => $billing['billing_phone_number'], + 'billing_postal_code' => $billing['billing_postal_code'], + 'billing_state' => $billing['billing_state'], + ]); + } + /** * Send the password reset notification. * @@ -165,8 +206,8 @@ class User extends Authenticatable * * @return \Illuminate\Database\Eloquent\Relations\HasMany|\Illuminate\Database\Query\Builder */ - public function latest_uploads() { - + public function latest_uploads() + { return $this->hasMany(FileManagerFile::class)->with(['parent'])->orderBy('created_at', 'DESC')->take(40); } @@ -175,8 +216,8 @@ class User extends Authenticatable * * @return \Illuminate\Database\Eloquent\Relations\HasMany */ - public function files() { - + public function files() + { return $this->hasMany(FileManagerFile::class); } @@ -185,8 +226,8 @@ class User extends Authenticatable * * @return \Illuminate\Database\Eloquent\Relations\HasMany */ - public function files_with_trashed() { - + public function files_with_trashed() + { return $this->hasMany(FileManagerFile::class)->withTrashed(); } @@ -195,8 +236,8 @@ class User extends Authenticatable * * @return \Illuminate\Database\Eloquent\Relations\HasOne */ - public function settings() { - + public function settings() + { return $this->hasOne(UserSettings::class); } @@ -205,8 +246,18 @@ class User extends Authenticatable * * @return \Illuminate\Database\Eloquent\Relations\HasOne */ - public function invoices() { - + public function invoices() + { return $this->hasMany(Invoice::class); } + + /** + * Get user payment cards + * + * @return \Illuminate\Database\Eloquent\Relations\HasOne + */ + public function payment_cards() + { + return $this->hasMany(UserCard::class); + } } diff --git a/app/UserCard.php b/app/UserCard.php new file mode 100644 index 00000000..f1e5cbae --- /dev/null +++ b/app/UserCard.php @@ -0,0 +1,48 @@ +hasOne(User::class); + } +} diff --git a/composer.json b/composer.json index b44dde72..fe5fe77c 100644 --- a/composer.json +++ b/composer.json @@ -9,18 +9,19 @@ "license": "MIT", "require": { "php": "^7.2", + "cartalyst/stripe-laravel": "^12.0", "doctrine/dbal": "^2.10", "fideloper/proxy": "^4.0", "fruitcake/laravel-cors": "^1.0", "gabrielelana/byte-units": "^0.5.0", "intervention/image": "^2.5", + "laravel/cashier": "^12.0", "laravel/framework": "^7.0", "laravel/passport": "^8.4", "laravel/scout": "^7.2", "laravel/tinker": "^2.0", "league/flysystem-aws-s3-v3": "^1.0", "league/flysystem-cached-adapter": "^1.0", - "rinvex/laravel-subscriptions": "^4.0", "teamtnt/laravel-scout-tntsearch-driver": "^8.3" }, "require-dev": { @@ -50,7 +51,8 @@ "database/factories" ], "files": [ - "app/Http/helpers.php" + "app/Http//Helpers/helpers.php", + "app/Http//Helpers/subscription.php" ] }, "autoload-dev": { diff --git a/composer.lock b/composer.lock index cc76efd7..b9f0de6c 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "32b62c653a002d0eea89b606c0f5982a", + "content-hash": "e30e23b1a0df4073ff74004cde20ddb8", "packages": [ { "name": "asm89/stack-cors", @@ -188,6 +188,122 @@ ], "time": "2020-04-15T15:59:35+00:00" }, + { + "name": "cartalyst/stripe", + "version": "v2.4.1", + "source": { + "type": "git", + "url": "https://github.com/cartalyst/stripe.git", + "reference": "f7753a8c947aa7c58abad96db8714e1594160b0c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cartalyst/stripe/zipball/f7753a8c947aa7c58abad96db8714e1594160b0c", + "reference": "f7753a8c947aa7c58abad96db8714e1594160b0c", + "shasum": "" + }, + "require": { + "guzzlehttp/guzzle": "~6.0", + "php": ">=5.5.9" + }, + "require-dev": { + "mockery/mockery": "~0.9", + "phpunit/phpunit": "~4.8" + }, + "type": "library", + "extra": { + "component": "package", + "branch-alias": { + "dev-master": "2.4.x-dev" + } + }, + "autoload": { + "psr-4": { + "Cartalyst\\Stripe\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Cartalyst LLC", + "email": "help@cartalyst.com", + "homepage": "https://cartalyst.com" + } + ], + "description": "A comprehensive Stripe API package.", + "keywords": [ + "cartalyst", + "php", + "stripe" + ], + "time": "2020-01-03T12:02:51+00:00" + }, + { + "name": "cartalyst/stripe-laravel", + "version": "v12.0.0", + "source": { + "type": "git", + "url": "https://github.com/cartalyst/stripe-laravel.git", + "reference": "e171e6721e3491daa7eaa8d85ca6d4536086c327" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cartalyst/stripe-laravel/zipball/e171e6721e3491daa7eaa8d85ca6d4536086c327", + "reference": "e171e6721e3491daa7eaa8d85ca6d4536086c327", + "shasum": "" + }, + "require": { + "cartalyst/stripe": "^2.0", + "illuminate/support": "^7.0", + "php": "^7.2.5" + }, + "require-dev": { + "cartalyst/php-cs-fixer-config": "^1.0", + "phpunit/phpunit": "^8.0" + }, + "type": "library", + "extra": { + "component": "implementation", + "branch-alias": { + "dev-master": "12.0.x-dev" + }, + "laravel": { + "providers": [ + "Cartalyst\\Stripe\\Laravel\\StripeServiceProvider" + ], + "aliases": { + "Stripe": "Cartalyst\\Stripe\\Laravel\\Facades\\Stripe" + } + } + }, + "autoload": { + "psr-4": { + "Cartalyst\\Stripe\\Laravel\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Cartalyst LLC", + "email": "help@cartalyst.com", + "homepage": "https://cartalyst.com" + } + ], + "description": "Laravel 7 integration for the Cartalyst Stripe package.", + "keywords": [ + "cartalyst", + "laravel", + "php", + "stripe" + ], + "time": "2020-03-03T18:50:48+00:00" + }, { "name": "defuse/php-encryption", "version": "v2.2.1", @@ -675,6 +791,72 @@ ], "time": "2020-05-25T17:44:05+00:00" }, + { + "name": "dompdf/dompdf", + "version": "v0.8.5", + "source": { + "type": "git", + "url": "https://github.com/dompdf/dompdf.git", + "reference": "6782abfc090b132134cd6cea0ec6d76f0fce2c56" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dompdf/dompdf/zipball/6782abfc090b132134cd6cea0ec6d76f0fce2c56", + "reference": "6782abfc090b132134cd6cea0ec6d76f0fce2c56", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-mbstring": "*", + "phenx/php-font-lib": "^0.5.1", + "phenx/php-svg-lib": "^0.3.3", + "php": "^7.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.5", + "squizlabs/php_codesniffer": "^3.5" + }, + "suggest": { + "ext-gd": "Needed to process images", + "ext-gmagick": "Improves image processing performance", + "ext-imagick": "Improves image processing performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-develop": "0.7-dev" + } + }, + "autoload": { + "psr-4": { + "Dompdf\\": "src/" + }, + "classmap": [ + "lib/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1" + ], + "authors": [ + { + "name": "Fabien Ménager", + "email": "fabien.menager@gmail.com" + }, + { + "name": "Brian Sweeney", + "email": "eclecticgeek@gmail.com" + }, + { + "name": "Gabriel Bull", + "email": "me@gabrielbull.com" + } + ], + "description": "DOMPDF is a CSS 2.1 compliant HTML to PDF converter", + "homepage": "https://github.com/dompdf/dompdf", + "time": "2020-02-20T03:52:51+00:00" + }, { "name": "dragonmantank/cron-expression", "version": "v2.3.0", @@ -1462,6 +1644,80 @@ ], "time": "2020-05-20T16:45:56+00:00" }, + { + "name": "laravel/cashier", + "version": "v12.0.1", + "source": { + "type": "git", + "url": "https://github.com/laravel/cashier.git", + "reference": "e3479f548a7d167ff1c241e718041162e66306a5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/cashier/zipball/e3479f548a7d167ff1c241e718041162e66306a5", + "reference": "e3479f548a7d167ff1c241e718041162e66306a5", + "shasum": "" + }, + "require": { + "dompdf/dompdf": "^0.8.0", + "ext-json": "*", + "illuminate/contracts": "^6.0|^7.0", + "illuminate/database": "^6.0|^7.0", + "illuminate/http": "^6.0|^7.0", + "illuminate/log": "^6.0|^7.0", + "illuminate/notifications": "^6.0|^7.0", + "illuminate/routing": "^6.0|^7.0", + "illuminate/support": "^6.0|^7.0", + "illuminate/view": "^6.0|^7.0", + "moneyphp/money": "^3.2", + "nesbot/carbon": "^2.0", + "php": "^7.2", + "stripe/stripe-php": "^7.0", + "symfony/http-kernel": "^4.3|^5.0", + "symfony/intl": "^4.3|^5.0" + }, + "require-dev": { + "mockery/mockery": "^1.0", + "orchestra/testbench": "^4.0|^5.0", + "phpunit/phpunit": "^8.0|^9.0" + }, + "suggest": { + "ext-intl": "Allows for more locales besides the default \"en\" when formatting money values." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "12.x-dev" + }, + "laravel": { + "providers": [ + "Laravel\\Cashier\\CashierServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Cashier\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylorotwell@gmail.com" + } + ], + "description": "Laravel Cashier provides an expressive, fluent interface to Stripe's subscription billing services.", + "keywords": [ + "billing", + "laravel", + "stripe" + ], + "time": "2020-06-16T18:54:05+00:00" + }, { "name": "laravel/framework", "version": "v7.14.1", @@ -2254,6 +2510,88 @@ ], "time": "2020-04-29T22:14:38+00:00" }, + { + "name": "moneyphp/money", + "version": "v3.3.1", + "source": { + "type": "git", + "url": "https://github.com/moneyphp/money.git", + "reference": "122664c2621a95180a13c1ac81fea1d2ef20781e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/moneyphp/money/zipball/122664c2621a95180a13c1ac81fea1d2ef20781e", + "reference": "122664c2621a95180a13c1ac81fea1d2ef20781e", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": ">=5.6" + }, + "require-dev": { + "cache/taggable-cache": "^0.4.0", + "doctrine/instantiator": "^1.0.5", + "ext-bcmath": "*", + "ext-gmp": "*", + "ext-intl": "*", + "florianv/exchanger": "^1.0", + "florianv/swap": "^3.0", + "friends-of-phpspec/phpspec-code-coverage": "^3.1.1 || ^4.3", + "moneyphp/iso-currencies": "^3.2.1", + "php-http/message": "^1.4", + "php-http/mock-client": "^1.0.0", + "phpspec/phpspec": "^3.4.3", + "phpunit/phpunit": "^5.7.27 || ^6.5.14 || ^7.5.18 || ^8.5", + "psr/cache": "^1.0", + "symfony/phpunit-bridge": "^4" + }, + "suggest": { + "ext-bcmath": "Calculate without integer limits", + "ext-gmp": "Calculate without integer limits", + "ext-intl": "Format Money objects with intl", + "florianv/exchanger": "Exchange rates library for PHP", + "florianv/swap": "Exchange rates library for PHP", + "psr/cache-implementation": "Used for Currency caching" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Money\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mathias Verraes", + "email": "mathias@verraes.net", + "homepage": "http://verraes.net" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + }, + { + "name": "Frederik Bosch", + "email": "f.bosch@genkgo.nl" + } + ], + "description": "PHP implementation of Fowler's Money pattern", + "homepage": "http://moneyphp.org", + "keywords": [ + "Value Object", + "money", + "vo" + ], + "time": "2020-03-18T17:49:59+00:00" + }, { "name": "monolog/monolog", "version": "2.1.0", @@ -2686,6 +3024,83 @@ ], "time": "2018-07-02T15:55:56+00:00" }, + { + "name": "phenx/php-font-lib", + "version": "0.5.2", + "source": { + "type": "git", + "url": "https://github.com/PhenX/php-font-lib.git", + "reference": "ca6ad461f032145fff5971b5985e5af9e7fa88d8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PhenX/php-font-lib/zipball/ca6ad461f032145fff5971b5985e5af9e7fa88d8", + "reference": "ca6ad461f032145fff5971b5985e5af9e7fa88d8", + "shasum": "" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5 || ^6 || ^7" + }, + "type": "library", + "autoload": { + "psr-4": { + "FontLib\\": "src/FontLib" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0" + ], + "authors": [ + { + "name": "Fabien Ménager", + "email": "fabien.menager@gmail.com" + } + ], + "description": "A library to read, parse, export and make subsets of different types of font files.", + "homepage": "https://github.com/PhenX/php-font-lib", + "time": "2020-03-08T15:31:32+00:00" + }, + { + "name": "phenx/php-svg-lib", + "version": "v0.3.3", + "source": { + "type": "git", + "url": "https://github.com/PhenX/php-svg-lib.git", + "reference": "5fa61b65e612ce1ae15f69b3d223cb14ecc60e32" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PhenX/php-svg-lib/zipball/5fa61b65e612ce1ae15f69b3d223cb14ecc60e32", + "reference": "5fa61b65e612ce1ae15f69b3d223cb14ecc60e32", + "shasum": "" + }, + "require": { + "sabberworm/php-css-parser": "^8.3" + }, + "require-dev": { + "phpunit/phpunit": "^5.5|^6.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Svg\\": "src/Svg" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0" + ], + "authors": [ + { + "name": "Fabien Ménager", + "email": "fabien.menager@gmail.com" + } + ], + "description": "A library to read, parse and export to PDF SVG files.", + "homepage": "https://github.com/PhenX/php-svg-lib", + "time": "2019-09-11T20:02:13+00:00" + }, { "name": "php-http/message-factory", "version": "v1.0.2", @@ -3546,16 +3961,16 @@ }, { "name": "rinvex/laravel-subscriptions", - "version": "v4.0.6", + "version": "dev-subscription-query-fix", "source": { "type": "git", - "url": "https://github.com/rinvex/laravel-subscriptions.git", - "reference": "f54539dfc98dbfa54d59e28c563e981fd28ad1f0" + "url": "https://github.com/MakingCG/laravel-subscriptions.git", + "reference": "0ed71077f34b9ca21c3755fcf09463b37802c0e8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/rinvex/laravel-subscriptions/zipball/f54539dfc98dbfa54d59e28c563e981fd28ad1f0", - "reference": "f54539dfc98dbfa54d59e28c563e981fd28ad1f0", + "url": "https://api.github.com/repos/MakingCG/laravel-subscriptions/zipball/0ed71077f34b9ca21c3755fcf09463b37802c0e8", + "reference": "0ed71077f34b9ca21c3755fcf09463b37802c0e8", "shasum": "" }, "require": { @@ -3590,20 +4005,29 @@ "Rinvex\\Subscriptions\\": "src" } }, - "notification-url": "https://packagist.org/downloads/", + "autoload-dev": { + "psr-4": { + "Rinvex\\Subscriptions\\Tests\\": "tests" + } + }, + "scripts": { + "test": [ + "vendor/bin/phpunit" + ] + }, "license": [ "MIT" ], "authors": [ { "name": "Rinvex LLC", - "email": "help@rinvex.com", - "homepage": "https://rinvex.com" + "homepage": "https://rinvex.com", + "email": "help@rinvex.com" }, { "name": "Abdelrahman Omran", - "email": "me@omranic.com", "homepage": "https://omranic.com", + "email": "me@omranic.com", "role": "Project Lead" }, { @@ -3622,7 +4046,13 @@ "subscription", "value" ], - "time": "2020-05-30T02:21:52+00:00" + "support": { + "email": "help@rinvex.com", + "issues": "https://github.com/rinvex/laravel-subscriptions/issues", + "source": "https://github.com/rinvex/laravel-subscriptions", + "docs": "https://github.com/rinvex/laravel-subscriptions/blob/master/README.md" + }, + "time": "2020-06-15T13:17:55+00:00" }, { "name": "rinvex/laravel-support", @@ -3707,6 +4137,51 @@ ], "time": "2020-05-30T02:22:01+00:00" }, + { + "name": "sabberworm/php-css-parser", + "version": "8.3.1", + "source": { + "type": "git", + "url": "https://github.com/sabberworm/PHP-CSS-Parser.git", + "reference": "d217848e1396ef962fb1997cf3e2421acba7f796" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sabberworm/PHP-CSS-Parser/zipball/d217848e1396ef962fb1997cf3e2421acba7f796", + "reference": "d217848e1396ef962fb1997cf3e2421acba7f796", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "require-dev": { + "codacy/coverage": "^1.4", + "phpunit/phpunit": "~4.8" + }, + "type": "library", + "autoload": { + "psr-0": { + "Sabberworm\\CSS": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Raphael Schweikert" + } + ], + "description": "Parser for CSS Files written in PHP", + "homepage": "http://www.sabberworm.com/blog/2010/6/10/php-css-parser", + "keywords": [ + "css", + "parser", + "stylesheet" + ], + "time": "2020-06-01T09:10:00+00:00" + }, { "name": "spatie/eloquent-sortable", "version": "3.8.0", @@ -3934,6 +4409,63 @@ ], "time": "2020-04-30T10:01:26+00:00" }, + { + "name": "stripe/stripe-php", + "version": "v7.37.1", + "source": { + "type": "git", + "url": "https://github.com/stripe/stripe-php.git", + "reference": "e3e29131a131785c3d2f85556b0154e8170e9bba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/stripe/stripe-php/zipball/e3e29131a131785c3d2f85556b0154e8170e9bba", + "reference": "e3e29131a131785c3d2f85556b0154e8170e9bba", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "ext-json": "*", + "ext-mbstring": "*", + "php": ">=5.6.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "2.16.1", + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5.7", + "squizlabs/php_codesniffer": "^3.3", + "symfony/process": "~3.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "psr-4": { + "Stripe\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Stripe and contributors", + "homepage": "https://github.com/stripe/stripe-php/contributors" + } + ], + "description": "Stripe PHP Library", + "homepage": "https://stripe.com/", + "keywords": [ + "api", + "payment processing", + "stripe" + ], + "time": "2020-06-11T16:27:35+00:00" + }, { "name": "swiftmailer/swiftmailer", "version": "v6.2.3", @@ -4570,6 +5102,82 @@ "homepage": "https://symfony.com", "time": "2020-05-31T06:14:18+00:00" }, + { + "name": "symfony/intl", + "version": "v5.1.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/intl.git", + "reference": "b21d69ebb33adfcb7e6d8b0a0a8799db7090705b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/intl/zipball/b21d69ebb33adfcb7e6d8b0a0a8799db7090705b", + "reference": "b21d69ebb33adfcb7e6d8b0a0a8799db7090705b", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-intl-icu": "~1.0", + "symfony/polyfill-php80": "^1.15" + }, + "require-dev": { + "symfony/filesystem": "^4.4|^5.0" + }, + "suggest": { + "ext-intl": "to use the component with locales other than \"en\"" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Intl\\": "" + }, + "classmap": [ + "Resources/stubs" + ], + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + }, + { + "name": "Eriksen Costa", + "email": "eriksen.costa@infranology.com.br" + }, + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A PHP replacement layer for the C intl extension that includes additional data from the ICU library.", + "homepage": "https://symfony.com", + "keywords": [ + "i18n", + "icu", + "internationalization", + "intl", + "l10n", + "localization" + ], + "time": "2020-05-30T20:35:19+00:00" + }, { "name": "symfony/mime", "version": "v5.1.0", @@ -4810,6 +5418,64 @@ ], "time": "2020-05-12T16:47:27+00:00" }, + { + "name": "symfony/polyfill-intl-icu", + "version": "v1.17.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-icu.git", + "reference": "4ef3923e4a86e1b6ef72d42be59dbf7d33a685e3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/4ef3923e4a86e1b6ef72d42be59dbf7d33a685e3", + "reference": "4ef3923e4a86e1b6ef72d42be59dbf7d33a685e3", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "symfony/intl": "~2.3|~3.0|~4.0|~5.0" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.17-dev" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's ICU-related data and classes", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "icu", + "intl", + "polyfill", + "portable", + "shim" + ], + "time": "2020-05-12T16:14:59+00:00" + }, { "name": "symfony/polyfill-intl-idn", "version": "v1.17.0", @@ -8661,7 +9327,9 @@ ], "aliases": [], "minimum-stability": "dev", - "stability-flags": [], + "stability-flags": { + "rinvex/laravel-subscriptions": 20 + }, "prefer-stable": true, "prefer-lowest": false, "platform": { diff --git a/config/app.php b/config/app.php index c8c8a019..2e2f910e 100644 --- a/config/app.php +++ b/config/app.php @@ -193,51 +193,50 @@ return [ 'aliases' => [ - 'App' => Illuminate\Support\Facades\App::class, - 'Arr' => Illuminate\Support\Arr::class, - 'Artisan' => Illuminate\Support\Facades\Artisan::class, - 'Auth' => Illuminate\Support\Facades\Auth::class, - 'Blade' => Illuminate\Support\Facades\Blade::class, - 'Broadcast' => Illuminate\Support\Facades\Broadcast::class, - 'Bus' => Illuminate\Support\Facades\Bus::class, - 'Cache' => Illuminate\Support\Facades\Cache::class, - 'Config' => Illuminate\Support\Facades\Config::class, - 'Cookie' => Illuminate\Support\Facades\Cookie::class, - 'Crypt' => Illuminate\Support\Facades\Crypt::class, - 'DB' => Illuminate\Support\Facades\DB::class, - 'Eloquent' => Illuminate\Database\Eloquent\Model::class, - 'Event' => Illuminate\Support\Facades\Event::class, - 'File' => Illuminate\Support\Facades\File::class, - 'Gate' => Illuminate\Support\Facades\Gate::class, - 'Hash' => Illuminate\Support\Facades\Hash::class, - 'Lang' => Illuminate\Support\Facades\Lang::class, - 'Log' => Illuminate\Support\Facades\Log::class, - 'Mail' => Illuminate\Support\Facades\Mail::class, + 'App' => Illuminate\Support\Facades\App::class, + 'Arr' => Illuminate\Support\Arr::class, + 'Artisan' => Illuminate\Support\Facades\Artisan::class, + 'Auth' => Illuminate\Support\Facades\Auth::class, + 'Blade' => Illuminate\Support\Facades\Blade::class, + 'Broadcast' => Illuminate\Support\Facades\Broadcast::class, + 'Bus' => Illuminate\Support\Facades\Bus::class, + 'Cache' => Illuminate\Support\Facades\Cache::class, + 'Config' => Illuminate\Support\Facades\Config::class, + 'Cookie' => Illuminate\Support\Facades\Cookie::class, + 'Crypt' => Illuminate\Support\Facades\Crypt::class, + 'DB' => Illuminate\Support\Facades\DB::class, + 'Eloquent' => Illuminate\Database\Eloquent\Model::class, + 'Event' => Illuminate\Support\Facades\Event::class, + 'File' => Illuminate\Support\Facades\File::class, + 'Gate' => Illuminate\Support\Facades\Gate::class, + 'Hash' => Illuminate\Support\Facades\Hash::class, + 'Lang' => Illuminate\Support\Facades\Lang::class, + 'Log' => Illuminate\Support\Facades\Log::class, + 'Mail' => Illuminate\Support\Facades\Mail::class, 'Notification' => Illuminate\Support\Facades\Notification::class, - 'Password' => Illuminate\Support\Facades\Password::class, - 'Queue' => Illuminate\Support\Facades\Queue::class, - 'Redirect' => Illuminate\Support\Facades\Redirect::class, - 'Redis' => Illuminate\Support\Facades\Redis::class, - 'Request' => Illuminate\Support\Facades\Request::class, - 'Response' => Illuminate\Support\Facades\Response::class, - 'Route' => Illuminate\Support\Facades\Route::class, - 'Schema' => Illuminate\Support\Facades\Schema::class, - 'Session' => Illuminate\Support\Facades\Session::class, - 'Storage' => Illuminate\Support\Facades\Storage::class, - 'Str' => Illuminate\Support\Str::class, - 'URL' => Illuminate\Support\Facades\URL::class, - 'Validator' => Illuminate\Support\Facades\Validator::class, - 'View' => Illuminate\Support\Facades\View::class, - - 'Image' => Intervention\Image\Facades\Image::class - + 'Password' => Illuminate\Support\Facades\Password::class, + 'Queue' => Illuminate\Support\Facades\Queue::class, + 'Redirect' => Illuminate\Support\Facades\Redirect::class, + 'Redis' => Illuminate\Support\Facades\Redis::class, + 'Request' => Illuminate\Support\Facades\Request::class, + 'Response' => Illuminate\Support\Facades\Response::class, + 'Route' => Illuminate\Support\Facades\Route::class, + 'Schema' => Illuminate\Support\Facades\Schema::class, + 'Session' => Illuminate\Support\Facades\Session::class, + 'Storage' => Illuminate\Support\Facades\Storage::class, + 'Str' => Illuminate\Support\Str::class, + 'URL' => Illuminate\Support\Facades\URL::class, + 'Validator' => Illuminate\Support\Facades\Validator::class, + 'View' => Illuminate\Support\Facades\View::class, + 'Image' => Intervention\Image\Facades\Image::class, + 'Stripe' => Cartalyst\Stripe\Laravel\Facades\Stripe::class, ], 'deploy_secret' => env('APP_DEPLOY_SECRET'), 'deploy_branch' => env('APP_DEPLOY_BRANCH'), 'debug_blacklist' => [ - '_ENV' => [ + '_ENV' => [ 'APP_KEY', 'DB_PASSWORD', 'REDIS_PASSWORD', @@ -262,7 +261,7 @@ return [ 'AWS_ACCESS_KEY_ID', 'AWS_SECRET_ACCESS_KEY', ], - '_POST' => [ + '_POST' => [ 'password', ], ], diff --git a/config/services.php b/config/services.php index fc420a10..a353817b 100644 --- a/config/services.php +++ b/config/services.php @@ -34,5 +34,4 @@ return [ 'client_id' => env('PASSPORT_CLIENT_ID'), 'client_secret' => env('PASSPORT_CLIENT_SECRET'), ], - ]; diff --git a/database/factories/UserCardFactory.php b/database/factories/UserCardFactory.php new file mode 100644 index 00000000..518d1859 --- /dev/null +++ b/database/factories/UserCardFactory.php @@ -0,0 +1,12 @@ +define(UserCard::class, function (Faker $faker) { + return [ + // + ]; +}); diff --git a/database/migrations/2019_08_15_171345_create_file_manager_files.php b/database/migrations/2019_08_15_171345_create_file_manager_files.php index 139dbefd..adfc7983 100644 --- a/database/migrations/2019_08_15_171345_create_file_manager_files.php +++ b/database/migrations/2019_08_15_171345_create_file_manager_files.php @@ -26,7 +26,7 @@ class CreateFileManagerFiles extends Migration $table->text('mimetype')->nullable(); $table->text('filesize')->nullable(); - $table->enum('type', ['image', 'file'])->nullable(); + $table->text('type')->nullable(); $table->softDeletes(); $table->timestamps(); diff --git a/database/migrations/2020_04_02_055021_change_type_attribute_in_file_manager_files_table.php b/database/migrations/2020_04_02_055021_change_type_attribute_in_file_manager_files_table.php deleted file mode 100644 index c6c12f50..00000000 --- a/database/migrations/2020_04_02_055021_change_type_attribute_in_file_manager_files_table.php +++ /dev/null @@ -1,32 +0,0 @@ -text('client_id')->nullable(); $table->text('secret')->nullable(); $table->text('webhook')->nullable(); + $table->bigInteger('payment_processed')->default(0); $table->longText('optional')->nullable(); }); } diff --git a/database/migrations/2020_06_02_094048_create_invoices_table.php b/database/migrations/2020_06_02_094048_create_invoices_table.php index 47d8cf55..0fcc023c 100644 --- a/database/migrations/2020_06_02_094048_create_invoices_table.php +++ b/database/migrations/2020_06_02_094048_create_invoices_table.php @@ -17,6 +17,7 @@ class CreateInvoicesTable extends Migration $table->bigIncrements('id'); $table->text('token'); $table->text('order'); + $table->text('provider'); $table->text('user_id'); $table->text('plan_id'); $table->longText('seller'); diff --git a/database/migrations/2020_06_11_060418_create_user_cards_table.php b/database/migrations/2020_06_11_060418_create_user_cards_table.php new file mode 100644 index 00000000..4fb23626 --- /dev/null +++ b/database/migrations/2020_06_11_060418_create_user_cards_table.php @@ -0,0 +1,38 @@ +id(); + $table->bigInteger('user_id'); + $table->text('provider'); + $table->text('card_id'); + $table->text('brand'); + $table->text('last4'); + $table->text('exp_month'); + $table->text('exp_year'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('user_cards'); + } +} diff --git a/database/migrations/2020_06_16_062109_add_status_to_user_cards_table.php b/database/migrations/2020_06_16_062109_add_status_to_user_cards_table.php new file mode 100644 index 00000000..e2e4d962 --- /dev/null +++ b/database/migrations/2020_06_16_062109_add_status_to_user_cards_table.php @@ -0,0 +1,34 @@ +text('status')->after('provider'); + $table->boolean('default')->default(0)->after('provider'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('user_cards', function (Blueprint $table) { + $table->removeColumn('status'); + $table->removeColumn('default'); + }); + } +} diff --git a/database/migrations/rinvex/laravel-subscriptions/2020_06_04_063306_create_plans_table.php b/database/migrations/rinvex/laravel-subscriptions/2020_06_04_063306_create_plans_table.php deleted file mode 100644 index ab09c9b6..00000000 --- a/database/migrations/rinvex/laravel-subscriptions/2020_06_04_063306_create_plans_table.php +++ /dev/null @@ -1,69 +0,0 @@ -increments('id'); - $table->string('slug'); - $table->{$this->jsonable()}('name'); - $table->{$this->jsonable()}('description')->nullable(); - $table->boolean('is_active')->default(true); - $table->decimal('price')->default('0.00'); - $table->decimal('signup_fee')->default('0.00'); - $table->string('currency', 3); - $table->smallInteger('trial_period')->unsigned()->default(0); - $table->string('trial_interval')->default('day'); - $table->smallInteger('invoice_period')->unsigned()->default(0); - $table->string('invoice_interval')->default('month'); - $table->smallInteger('grace_period')->unsigned()->default(0); - $table->string('grace_interval')->default('day'); - $table->tinyInteger('prorate_day')->unsigned()->nullable(); - $table->tinyInteger('prorate_period')->unsigned()->nullable(); - $table->tinyInteger('prorate_extend_due')->unsigned()->nullable(); - $table->smallInteger('active_subscribers_limit')->unsigned()->nullable(); - $table->mediumInteger('sort_order')->unsigned()->default(0); - $table->timestamps(); - $table->softDeletes(); - - // Indexes - $table->unique('slug'); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down(): void - { - Schema::dropIfExists(config('rinvex.subscriptions.tables.plans')); - } - - /** - * Get jsonable column data type. - * - * @return string - */ - protected function jsonable(): string - { - $driverName = DB::connection()->getPdo()->getAttribute(PDO::ATTR_DRIVER_NAME); - $dbVersion = DB::connection()->getPdo()->getAttribute(PDO::ATTR_SERVER_VERSION); - $isOldVersion = version_compare($dbVersion, '5.7.8', 'lt'); - - return $driverName === 'mysql' && $isOldVersion ? 'text' : 'json'; - } -} diff --git a/database/migrations/rinvex/laravel-subscriptions/2020_06_04_063307_create_plan_features_table.php b/database/migrations/rinvex/laravel-subscriptions/2020_06_04_063307_create_plan_features_table.php deleted file mode 100644 index f781680f..00000000 --- a/database/migrations/rinvex/laravel-subscriptions/2020_06_04_063307_create_plan_features_table.php +++ /dev/null @@ -1,61 +0,0 @@ -increments('id'); - $table->integer('plan_id')->unsigned(); - $table->string('slug'); - $table->{$this->jsonable()}('name'); - $table->{$this->jsonable()}('description')->nullable(); - $table->string('value'); - $table->smallInteger('resettable_period')->unsigned()->default(0); - $table->string('resettable_interval')->default('month'); - $table->mediumInteger('sort_order')->unsigned()->default(0); - $table->timestamps(); - $table->softDeletes(); - - // Indexes - $table->unique(['plan_id', 'slug']); - $table->foreign('plan_id')->references('id')->on(config('rinvex.subscriptions.tables.plans')) - ->onDelete('cascade')->onUpdate('cascade'); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down(): void - { - Schema::dropIfExists(config('rinvex.subscriptions.tables.plan_features')); - } - - /** - * Get jsonable column data type. - * - * @return string - */ - protected function jsonable(): string - { - $driverName = DB::connection()->getPdo()->getAttribute(PDO::ATTR_DRIVER_NAME); - $dbVersion = DB::connection()->getPdo()->getAttribute(PDO::ATTR_SERVER_VERSION); - $isOldVersion = version_compare($dbVersion, '5.7.8', 'lt'); - - return $driverName === 'mysql' && $isOldVersion ? 'text' : 'json'; - } -} diff --git a/database/migrations/rinvex/laravel-subscriptions/2020_06_04_063308_create_plan_subscriptions_table.php b/database/migrations/rinvex/laravel-subscriptions/2020_06_04_063308_create_plan_subscriptions_table.php deleted file mode 100644 index 7891b99c..00000000 --- a/database/migrations/rinvex/laravel-subscriptions/2020_06_04_063308_create_plan_subscriptions_table.php +++ /dev/null @@ -1,63 +0,0 @@ -increments('id'); - $table->morphs('user'); - $table->integer('plan_id')->unsigned(); - $table->string('slug'); - $table->{$this->jsonable()}('name'); - $table->{$this->jsonable()}('description')->nullable(); - $table->dateTime('trial_ends_at')->nullable(); - $table->dateTime('starts_at')->nullable(); - $table->dateTime('ends_at')->nullable(); - $table->dateTime('cancels_at')->nullable(); - $table->dateTime('canceled_at')->nullable(); - $table->string('timezone')->nullable(); - $table->timestamps(); - $table->softDeletes(); - - // Indexes - $table->unique('slug'); - $table->foreign('plan_id')->references('id')->on(config('rinvex.subscriptions.tables.plans')) - ->onDelete('cascade')->onUpdate('cascade'); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down(): void - { - Schema::dropIfExists(config('rinvex.subscriptions.tables.plan_subscriptions')); - } - - /** - * Get jsonable column data type. - * - * @return string - */ - protected function jsonable(): string - { - $driverName = DB::connection()->getPdo()->getAttribute(PDO::ATTR_DRIVER_NAME); - $dbVersion = DB::connection()->getPdo()->getAttribute(PDO::ATTR_SERVER_VERSION); - $isOldVersion = version_compare($dbVersion, '5.7.8', 'lt'); - - return $driverName === 'mysql' && $isOldVersion ? 'text' : 'json'; - } -} diff --git a/database/migrations/rinvex/laravel-subscriptions/2020_06_04_063309_create_plan_subscription_usage_table.php b/database/migrations/rinvex/laravel-subscriptions/2020_06_04_063309_create_plan_subscription_usage_table.php deleted file mode 100644 index 9c9b5383..00000000 --- a/database/migrations/rinvex/laravel-subscriptions/2020_06_04_063309_create_plan_subscription_usage_table.php +++ /dev/null @@ -1,44 +0,0 @@ -increments('id'); - $table->integer('subscription_id')->unsigned(); - $table->integer('feature_id')->unsigned(); - $table->smallInteger('used')->unsigned(); - $table->dateTime('valid_until')->nullable(); - $table->string('timezone')->nullable(); - $table->timestamps(); - $table->softDeletes(); - - $table->unique(['subscription_id', 'feature_id']); - $table->foreign('subscription_id')->references('id')->on(config('rinvex.subscriptions.tables.plan_subscriptions')) - ->onDelete('cascade')->onUpdate('cascade'); - $table->foreign('feature_id')->references('id')->on(config('rinvex.subscriptions.tables.plan_features')) - ->onDelete('cascade')->onUpdate('cascade'); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down(): void - { - Schema::dropIfExists(config('rinvex.subscriptions.tables.plan_subscription_usage')); - } -} diff --git a/public/assets/icons/alipay.svg b/public/assets/icons/alipay.svg new file mode 100755 index 00000000..b0b5d228 --- /dev/null +++ b/public/assets/icons/alipay.svg @@ -0,0 +1 @@ + diff --git a/public/assets/icons/amex.svg b/public/assets/icons/amex.svg new file mode 100755 index 00000000..9007e03f --- /dev/null +++ b/public/assets/icons/amex.svg @@ -0,0 +1 @@ + diff --git a/public/assets/icons/code.svg b/public/assets/icons/code.svg new file mode 100755 index 00000000..a6b5b48f --- /dev/null +++ b/public/assets/icons/code.svg @@ -0,0 +1 @@ + diff --git a/public/assets/icons/diners.svg b/public/assets/icons/diners.svg new file mode 100755 index 00000000..3f1827bf --- /dev/null +++ b/public/assets/icons/diners.svg @@ -0,0 +1 @@ + diff --git a/public/assets/icons/discover.svg b/public/assets/icons/discover.svg new file mode 100755 index 00000000..e6ee9656 --- /dev/null +++ b/public/assets/icons/discover.svg @@ -0,0 +1 @@ + diff --git a/public/assets/icons/elo.svg b/public/assets/icons/elo.svg new file mode 100755 index 00000000..e529cd9e --- /dev/null +++ b/public/assets/icons/elo.svg @@ -0,0 +1 @@ + diff --git a/public/assets/icons/generic.svg b/public/assets/icons/generic.svg new file mode 100755 index 00000000..e0dd349d --- /dev/null +++ b/public/assets/icons/generic.svg @@ -0,0 +1 @@ + diff --git a/public/assets/icons/hiper.svg b/public/assets/icons/hiper.svg new file mode 100644 index 00000000..9546d2b8 --- /dev/null +++ b/public/assets/icons/hiper.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + diff --git a/public/assets/icons/hipercard.svg b/public/assets/icons/hipercard.svg new file mode 100755 index 00000000..f4d18577 --- /dev/null +++ b/public/assets/icons/hipercard.svg @@ -0,0 +1 @@ + diff --git a/public/assets/icons/jcb.svg b/public/assets/icons/jcb.svg new file mode 100755 index 00000000..b1143c01 --- /dev/null +++ b/public/assets/icons/jcb.svg @@ -0,0 +1 @@ + diff --git a/public/assets/icons/maestro.svg b/public/assets/icons/maestro.svg new file mode 100755 index 00000000..f0c862eb --- /dev/null +++ b/public/assets/icons/maestro.svg @@ -0,0 +1 @@ + diff --git a/public/assets/icons/mastercard.svg b/public/assets/icons/mastercard.svg new file mode 100644 index 00000000..56a70e7f --- /dev/null +++ b/public/assets/icons/mastercard.svg @@ -0,0 +1 @@ + diff --git a/public/assets/icons/mir.svg b/public/assets/icons/mir.svg new file mode 100644 index 00000000..b660cab1 --- /dev/null +++ b/public/assets/icons/mir.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/public/assets/icons/paypal.svg b/public/assets/icons/paypal.svg new file mode 100755 index 00000000..554e12fb --- /dev/null +++ b/public/assets/icons/paypal.svg @@ -0,0 +1 @@ + diff --git a/public/assets/icons/unionpay.svg b/public/assets/icons/unionpay.svg new file mode 100755 index 00000000..145428d7 --- /dev/null +++ b/public/assets/icons/unionpay.svg @@ -0,0 +1 @@ + diff --git a/public/assets/icons/visa.svg b/public/assets/icons/visa.svg new file mode 100644 index 00000000..2f649e5f --- /dev/null +++ b/public/assets/icons/visa.svg @@ -0,0 +1 @@ + diff --git a/public/mix-manifest.json b/public/mix-manifest.json index 9631f960..4d68a293 100644 --- a/public/mix-manifest.json +++ b/public/mix-manifest.json @@ -1,253 +1,287 @@ { "/js/main.js": "/js/main.js", "/css/app.css": "/css/app.css", - "/js/main.db73e300d42a147d92c9.hot-update.js": "/js/main.db73e300d42a147d92c9.hot-update.js", - "/js/main.0ea5df0b535e6454abdc.hot-update.js": "/js/main.0ea5df0b535e6454abdc.hot-update.js", - "/js/main.2cda68eaebe1626133c7.hot-update.js": "/js/main.2cda68eaebe1626133c7.hot-update.js", - "/js/main.88f0e74490296b17f12b.hot-update.js": "/js/main.88f0e74490296b17f12b.hot-update.js", - "/js/main.8ba41725bdb9b08ea41b.hot-update.js": "/js/main.8ba41725bdb9b08ea41b.hot-update.js", - "/js/main.7b5e66db24a0d8fffc66.hot-update.js": "/js/main.7b5e66db24a0d8fffc66.hot-update.js", - "/js/main.e44f7ecf17c7e0268ae4.hot-update.js": "/js/main.e44f7ecf17c7e0268ae4.hot-update.js", - "/js/main.6749d2651a3d98182751.hot-update.js": "/js/main.6749d2651a3d98182751.hot-update.js", - "/js/main.5c564e162157c5e6fb80.hot-update.js": "/js/main.5c564e162157c5e6fb80.hot-update.js", - "/js/main.c6a1574884392a89cbaa.hot-update.js": "/js/main.c6a1574884392a89cbaa.hot-update.js", - "/js/main.cdebd19025c701560b92.hot-update.js": "/js/main.cdebd19025c701560b92.hot-update.js", - "/js/main.f896b7d13aad9732ad0e.hot-update.js": "/js/main.f896b7d13aad9732ad0e.hot-update.js", - "/js/main.14e6ae82553043793d06.hot-update.js": "/js/main.14e6ae82553043793d06.hot-update.js", - "/js/main.e1d8968eaca9c7a94e14.hot-update.js": "/js/main.e1d8968eaca9c7a94e14.hot-update.js", - "/js/main.ee5e426715877748a226.hot-update.js": "/js/main.ee5e426715877748a226.hot-update.js", - "/js/main.54454754153a4b810c68.hot-update.js": "/js/main.54454754153a4b810c68.hot-update.js", - "/js/main.73250572619a4dca0d35.hot-update.js": "/js/main.73250572619a4dca0d35.hot-update.js", - "/js/main.4dbe97b31e06a3c1bebf.hot-update.js": "/js/main.4dbe97b31e06a3c1bebf.hot-update.js", - "/js/main.809268a1e86deba22298.hot-update.js": "/js/main.809268a1e86deba22298.hot-update.js", - "/js/main.4490e500053d12748641.hot-update.js": "/js/main.4490e500053d12748641.hot-update.js", - "/js/main.3953c82fcb9e8aa236f4.hot-update.js": "/js/main.3953c82fcb9e8aa236f4.hot-update.js", - "/js/main.90a12056f475838d806c.hot-update.js": "/js/main.90a12056f475838d806c.hot-update.js", - "/js/main.fba13eb0d8bdc2de63f9.hot-update.js": "/js/main.fba13eb0d8bdc2de63f9.hot-update.js", - "/js/main.2d77e5427d4b8b55419b.hot-update.js": "/js/main.2d77e5427d4b8b55419b.hot-update.js", - "/js/main.966dba3cdb08000411ae.hot-update.js": "/js/main.966dba3cdb08000411ae.hot-update.js", - "/js/main.8a320a785898586b8d10.hot-update.js": "/js/main.8a320a785898586b8d10.hot-update.js", - "/js/main.28edbc28a0031b3f4913.hot-update.js": "/js/main.28edbc28a0031b3f4913.hot-update.js", - "/js/main.79eb3750c72852c42485.hot-update.js": "/js/main.79eb3750c72852c42485.hot-update.js", - "/js/main.9703ef1a8f855482838f.hot-update.js": "/js/main.9703ef1a8f855482838f.hot-update.js", - "/js/main.1cbfcf8465e5d6aa0096.hot-update.js": "/js/main.1cbfcf8465e5d6aa0096.hot-update.js", - "/js/main.f1e7b129d14fc15d72e8.hot-update.js": "/js/main.f1e7b129d14fc15d72e8.hot-update.js", - "/js/main.58f0f9d441ec01c7d553.hot-update.js": "/js/main.58f0f9d441ec01c7d553.hot-update.js", - "/js/main.45858a0dfab5dd3a911a.hot-update.js": "/js/main.45858a0dfab5dd3a911a.hot-update.js", - "/js/main.ade5cf3ef31b2e506425.hot-update.js": "/js/main.ade5cf3ef31b2e506425.hot-update.js", - "/js/main.c4304b2de45e8f06f7b5.hot-update.js": "/js/main.c4304b2de45e8f06f7b5.hot-update.js", - "/js/main.0961cf18a9605cb65e3f.hot-update.js": "/js/main.0961cf18a9605cb65e3f.hot-update.js", - "/js/main.5a371d0e098a933c4640.hot-update.js": "/js/main.5a371d0e098a933c4640.hot-update.js", - "/js/main.d3c2f6bd4ce092746115.hot-update.js": "/js/main.d3c2f6bd4ce092746115.hot-update.js", - "/js/main.e191340cc52008653ed0.hot-update.js": "/js/main.e191340cc52008653ed0.hot-update.js", - "/js/main.3cb43f27a625a07fcc0b.hot-update.js": "/js/main.3cb43f27a625a07fcc0b.hot-update.js", - "/js/main.1410e64aed21b84592e7.hot-update.js": "/js/main.1410e64aed21b84592e7.hot-update.js", - "/js/main.08a6a51c0acea91879f7.hot-update.js": "/js/main.08a6a51c0acea91879f7.hot-update.js", - "/js/main.f3a5ecf31e3df2d23957.hot-update.js": "/js/main.f3a5ecf31e3df2d23957.hot-update.js", - "/js/main.7c67297040c94f2a585e.hot-update.js": "/js/main.7c67297040c94f2a585e.hot-update.js", - "/js/main.d7c58200175c3d4ab962.hot-update.js": "/js/main.d7c58200175c3d4ab962.hot-update.js", - "/js/main.58979cee95bba3ec04c5.hot-update.js": "/js/main.58979cee95bba3ec04c5.hot-update.js", - "/js/main.94f329f8b9d0aa2d4182.hot-update.js": "/js/main.94f329f8b9d0aa2d4182.hot-update.js", - "/js/main.23a1f3a1d28f2b39e1b7.hot-update.js": "/js/main.23a1f3a1d28f2b39e1b7.hot-update.js", - "/js/main.a7df7455225c5d05227f.hot-update.js": "/js/main.a7df7455225c5d05227f.hot-update.js", - "/js/main.7b16550bbd8be6cc9b8d.hot-update.js": "/js/main.7b16550bbd8be6cc9b8d.hot-update.js", - "/js/main.780968811eb17fef25a7.hot-update.js": "/js/main.780968811eb17fef25a7.hot-update.js", - "/js/main.aad31e3890b61350c4fa.hot-update.js": "/js/main.aad31e3890b61350c4fa.hot-update.js", - "/js/main.41b4b985c13b8890717d.hot-update.js": "/js/main.41b4b985c13b8890717d.hot-update.js", - "/js/main.e025100d60c74d0392d1.hot-update.js": "/js/main.e025100d60c74d0392d1.hot-update.js", - "/js/main.67661103ba5d1dd3cac6.hot-update.js": "/js/main.67661103ba5d1dd3cac6.hot-update.js", - "/js/main.4859f6f2e961eba13edf.hot-update.js": "/js/main.4859f6f2e961eba13edf.hot-update.js", - "/js/main.2412ccd7b9afcb3dd059.hot-update.js": "/js/main.2412ccd7b9afcb3dd059.hot-update.js", - "/js/main.0a9300e8875685257a5a.hot-update.js": "/js/main.0a9300e8875685257a5a.hot-update.js", - "/js/main.6e32369655d811852893.hot-update.js": "/js/main.6e32369655d811852893.hot-update.js", - "/js/main.07e4dcb8b14f80943019.hot-update.js": "/js/main.07e4dcb8b14f80943019.hot-update.js", - "/js/main.a970e8749724b2c1488f.hot-update.js": "/js/main.a970e8749724b2c1488f.hot-update.js", - "/js/main.26c44e4e22a245d1e8a9.hot-update.js": "/js/main.26c44e4e22a245d1e8a9.hot-update.js", - "/js/main.de6ddacb5c245c079fab.hot-update.js": "/js/main.de6ddacb5c245c079fab.hot-update.js", - "/js/main.564a42509ff2e25ba549.hot-update.js": "/js/main.564a42509ff2e25ba549.hot-update.js", - "/js/main.c63aad49b7cd674b91a7.hot-update.js": "/js/main.c63aad49b7cd674b91a7.hot-update.js", - "/js/main.81931bb64710a2f54368.hot-update.js": "/js/main.81931bb64710a2f54368.hot-update.js", - "/js/main.34efd0ebe70125b4d9cd.hot-update.js": "/js/main.34efd0ebe70125b4d9cd.hot-update.js", - "/js/main.3de56aa8af78d2912a79.hot-update.js": "/js/main.3de56aa8af78d2912a79.hot-update.js", - "/js/main.3492d8df8ba23f79e39f.hot-update.js": "/js/main.3492d8df8ba23f79e39f.hot-update.js", - "/js/main.1a1f505e34d61bf5c741.hot-update.js": "/js/main.1a1f505e34d61bf5c741.hot-update.js", - "/js/main.7d6fa20346e95f934020.hot-update.js": "/js/main.7d6fa20346e95f934020.hot-update.js", - "/js/main.e5fa1224b06e6203aaa4.hot-update.js": "/js/main.e5fa1224b06e6203aaa4.hot-update.js", - "/js/main.a2e4f55324730e0a1137.hot-update.js": "/js/main.a2e4f55324730e0a1137.hot-update.js", - "/js/main.82081e3a97b9075cbf38.hot-update.js": "/js/main.82081e3a97b9075cbf38.hot-update.js", - "/js/main.ab06dcdaa2fc897e4576.hot-update.js": "/js/main.ab06dcdaa2fc897e4576.hot-update.js", - "/js/main.8aee157f69acbf01d692.hot-update.js": "/js/main.8aee157f69acbf01d692.hot-update.js", - "/js/main.82087e18f1767795f3cc.hot-update.js": "/js/main.82087e18f1767795f3cc.hot-update.js", - "/js/main.f2c483d7d1261df861b3.hot-update.js": "/js/main.f2c483d7d1261df861b3.hot-update.js", - "/js/main.ef75264f1a02af5ca3cd.hot-update.js": "/js/main.ef75264f1a02af5ca3cd.hot-update.js", - "/js/main.cd61e67651fe4e61f358.hot-update.js": "/js/main.cd61e67651fe4e61f358.hot-update.js", - "/js/main.97ba89c984ffe538a333.hot-update.js": "/js/main.97ba89c984ffe538a333.hot-update.js", - "/js/main.a23de6f4cea6b80806b4.hot-update.js": "/js/main.a23de6f4cea6b80806b4.hot-update.js", - "/js/main.90440654186ae45a6f63.hot-update.js": "/js/main.90440654186ae45a6f63.hot-update.js", - "/js/main.483297e74b80dfdc50c3.hot-update.js": "/js/main.483297e74b80dfdc50c3.hot-update.js", - "/js/main.e2831389d5cdf78e4bd3.hot-update.js": "/js/main.e2831389d5cdf78e4bd3.hot-update.js", - "/js/main.3af60e2033e8130d75f6.hot-update.js": "/js/main.3af60e2033e8130d75f6.hot-update.js", - "/js/main.1b1ac80d4947b920ea2f.hot-update.js": "/js/main.1b1ac80d4947b920ea2f.hot-update.js", - "/js/main.8a52e7d2eff934f9de4d.hot-update.js": "/js/main.8a52e7d2eff934f9de4d.hot-update.js", - "/js/main.b67e5558feff737183b6.hot-update.js": "/js/main.b67e5558feff737183b6.hot-update.js", - "/js/main.2202ff72b0fe9ff3f0c2.hot-update.js": "/js/main.2202ff72b0fe9ff3f0c2.hot-update.js", - "/js/main.d9cb8d8e4ca7d410b22f.hot-update.js": "/js/main.d9cb8d8e4ca7d410b22f.hot-update.js", - "/js/main.a1d688c433c9fcf14bab.hot-update.js": "/js/main.a1d688c433c9fcf14bab.hot-update.js", - "/js/main.b2cf91ae6a0fbc682e64.hot-update.js": "/js/main.b2cf91ae6a0fbc682e64.hot-update.js", - "/js/main.63e1d96c978ec4ca4e3a.hot-update.js": "/js/main.63e1d96c978ec4ca4e3a.hot-update.js", - "/js/main.6e476cf8eabaf496f17a.hot-update.js": "/js/main.6e476cf8eabaf496f17a.hot-update.js", - "/js/main.fa9bfaf5cf5b454739e7.hot-update.js": "/js/main.fa9bfaf5cf5b454739e7.hot-update.js", - "/js/main.b246393843e1e04d1472.hot-update.js": "/js/main.b246393843e1e04d1472.hot-update.js", - "/js/main.cfeac3c0594ca2e18cbc.hot-update.js": "/js/main.cfeac3c0594ca2e18cbc.hot-update.js", - "/js/main.ffaf8712fd1cd702ea8a.hot-update.js": "/js/main.ffaf8712fd1cd702ea8a.hot-update.js", - "/js/main.1a9b77d1d99fa0cbe049.hot-update.js": "/js/main.1a9b77d1d99fa0cbe049.hot-update.js", - "/js/main.35f70fbeab261f617c64.hot-update.js": "/js/main.35f70fbeab261f617c64.hot-update.js", - "/js/main.2adec493e4879764b552.hot-update.js": "/js/main.2adec493e4879764b552.hot-update.js", - "/js/main.84e27e090764f99a5f8d.hot-update.js": "/js/main.84e27e090764f99a5f8d.hot-update.js", - "/js/main.d5fad1aae15440174c3b.hot-update.js": "/js/main.d5fad1aae15440174c3b.hot-update.js", - "/js/main.f082a5aa1a7d811653b0.hot-update.js": "/js/main.f082a5aa1a7d811653b0.hot-update.js", - "/js/main.cd15a772e4d701a910b1.hot-update.js": "/js/main.cd15a772e4d701a910b1.hot-update.js", - "/js/main.1e62178bd569cacdace7.hot-update.js": "/js/main.1e62178bd569cacdace7.hot-update.js", - "/js/main.19bca5f612f96fe6d127.hot-update.js": "/js/main.19bca5f612f96fe6d127.hot-update.js", - "/js/main.c775d381b77c164f7fc4.hot-update.js": "/js/main.c775d381b77c164f7fc4.hot-update.js", - "/js/main.f8c6cffd1559d9578b83.hot-update.js": "/js/main.f8c6cffd1559d9578b83.hot-update.js", - "/js/main.c7ff369b0854108f96c7.hot-update.js": "/js/main.c7ff369b0854108f96c7.hot-update.js", - "/js/main.062ff67378e519023a1e.hot-update.js": "/js/main.062ff67378e519023a1e.hot-update.js", - "/js/main.6e66fc4d78272a71315e.hot-update.js": "/js/main.6e66fc4d78272a71315e.hot-update.js", - "/js/main.a8e90242995935949f17.hot-update.js": "/js/main.a8e90242995935949f17.hot-update.js", - "/js/main.4e224f3aad42c7f5ed0b.hot-update.js": "/js/main.4e224f3aad42c7f5ed0b.hot-update.js", - "/js/main.385eb38db8eb0702b502.hot-update.js": "/js/main.385eb38db8eb0702b502.hot-update.js", - "/js/main.996d84214f93de3c1c0b.hot-update.js": "/js/main.996d84214f93de3c1c0b.hot-update.js", - "/js/main.38d70851a7c72784d66d.hot-update.js": "/js/main.38d70851a7c72784d66d.hot-update.js", - "/js/main.dbbfab82de065b7b60cd.hot-update.js": "/js/main.dbbfab82de065b7b60cd.hot-update.js", - "/js/main.574aea784108ee1eac07.hot-update.js": "/js/main.574aea784108ee1eac07.hot-update.js", - "/js/main.9de756c799555e75db7d.hot-update.js": "/js/main.9de756c799555e75db7d.hot-update.js", - "/js/main.83ab95777680fb06e0aa.hot-update.js": "/js/main.83ab95777680fb06e0aa.hot-update.js", - "/js/main.e666c42f96b6bdb22969.hot-update.js": "/js/main.e666c42f96b6bdb22969.hot-update.js", - "/js/main.03428097b17bfe163a16.hot-update.js": "/js/main.03428097b17bfe163a16.hot-update.js", - "/js/main.05d6a5f7f8c614a903e8.hot-update.js": "/js/main.05d6a5f7f8c614a903e8.hot-update.js", - "/js/main.7d8ff39260c5f281d28f.hot-update.js": "/js/main.7d8ff39260c5f281d28f.hot-update.js", - "/js/main.ad2349f007227d33ace3.hot-update.js": "/js/main.ad2349f007227d33ace3.hot-update.js", - "/js/main.61787afe25ca75dad5ec.hot-update.js": "/js/main.61787afe25ca75dad5ec.hot-update.js", - "/js/main.f130f7974630d2357291.hot-update.js": "/js/main.f130f7974630d2357291.hot-update.js", - "/js/main.194f15b84f0ba10c3558.hot-update.js": "/js/main.194f15b84f0ba10c3558.hot-update.js", - "/js/main.c9d4446b200a7919a284.hot-update.js": "/js/main.c9d4446b200a7919a284.hot-update.js", - "/js/main.a8a11f9957cb0472fcb1.hot-update.js": "/js/main.a8a11f9957cb0472fcb1.hot-update.js", - "/js/main.15201b3e0fd22133a26a.hot-update.js": "/js/main.15201b3e0fd22133a26a.hot-update.js", - "/js/main.24c3c7e84b88e524c006.hot-update.js": "/js/main.24c3c7e84b88e524c006.hot-update.js", - "/js/main.4a9d275860a5b9a8d2d2.hot-update.js": "/js/main.4a9d275860a5b9a8d2d2.hot-update.js", - "/js/main.1a78e45577ac640daa18.hot-update.js": "/js/main.1a78e45577ac640daa18.hot-update.js", - "/js/main.91f804d23d8cd6a0562e.hot-update.js": "/js/main.91f804d23d8cd6a0562e.hot-update.js", - "/js/main.37f4690a9d8970b2a997.hot-update.js": "/js/main.37f4690a9d8970b2a997.hot-update.js", - "/js/main.39cc460540d3e54e861d.hot-update.js": "/js/main.39cc460540d3e54e861d.hot-update.js", - "/js/main.97e2ae5d288287b185a4.hot-update.js": "/js/main.97e2ae5d288287b185a4.hot-update.js", - "/js/main.bcaa46e78128bc1ce527.hot-update.js": "/js/main.bcaa46e78128bc1ce527.hot-update.js", - "/js/main.f9b275607e4c5781a474.hot-update.js": "/js/main.f9b275607e4c5781a474.hot-update.js", - "/js/main.3625f6f0997dd72db8fb.hot-update.js": "/js/main.3625f6f0997dd72db8fb.hot-update.js", - "/js/main.8aac94e8b65eb3822505.hot-update.js": "/js/main.8aac94e8b65eb3822505.hot-update.js", - "/js/main.962286776eaf79087cff.hot-update.js": "/js/main.962286776eaf79087cff.hot-update.js", - "/js/main.a66ab1c4d2fa23744e67.hot-update.js": "/js/main.a66ab1c4d2fa23744e67.hot-update.js", - "/js/main.9a1ab04495b8495aa7a3.hot-update.js": "/js/main.9a1ab04495b8495aa7a3.hot-update.js", - "/js/main.394df0e7d4886f791e9a.hot-update.js": "/js/main.394df0e7d4886f791e9a.hot-update.js", - "/js/main.bbd2e296d4d14fafbc5c.hot-update.js": "/js/main.bbd2e296d4d14fafbc5c.hot-update.js", - "/js/main.c9330023b054be206d4d.hot-update.js": "/js/main.c9330023b054be206d4d.hot-update.js", - "/js/main.5d81a2f9c58ce58a43cd.hot-update.js": "/js/main.5d81a2f9c58ce58a43cd.hot-update.js", - "/js/main.86fa688fb982fbd12aca.hot-update.js": "/js/main.86fa688fb982fbd12aca.hot-update.js", - "/js/main.645f6368417b7c4fd590.hot-update.js": "/js/main.645f6368417b7c4fd590.hot-update.js", - "/js/main.6edba403d405425e87cf.hot-update.js": "/js/main.6edba403d405425e87cf.hot-update.js", - "/js/main.ca0cd44c7d8d17cc9991.hot-update.js": "/js/main.ca0cd44c7d8d17cc9991.hot-update.js", - "/js/main.b831183422933c78119c.hot-update.js": "/js/main.b831183422933c78119c.hot-update.js", - "/js/main.80db7eb954bc974b52ec.hot-update.js": "/js/main.80db7eb954bc974b52ec.hot-update.js", - "/js/main.8bee745b28ee104901f8.hot-update.js": "/js/main.8bee745b28ee104901f8.hot-update.js", - "/js/main.e0e4ec61d482c4f3dbe8.hot-update.js": "/js/main.e0e4ec61d482c4f3dbe8.hot-update.js", - "/js/main.bb3ed5bb83568a1abbda.hot-update.js": "/js/main.bb3ed5bb83568a1abbda.hot-update.js", - "/js/main.0fca3fcc3088a5f8b7e0.hot-update.js": "/js/main.0fca3fcc3088a5f8b7e0.hot-update.js", - "/js/main.fb7b96cb40ab22050c79.hot-update.js": "/js/main.fb7b96cb40ab22050c79.hot-update.js", - "/js/main.9348fa55f71efc5060b8.hot-update.js": "/js/main.9348fa55f71efc5060b8.hot-update.js", - "/js/main.0122b6629f01a705476d.hot-update.js": "/js/main.0122b6629f01a705476d.hot-update.js", - "/js/main.ffc029e04518fabf33cd.hot-update.js": "/js/main.ffc029e04518fabf33cd.hot-update.js", - "/js/main.0666ac365d039c279130.hot-update.js": "/js/main.0666ac365d039c279130.hot-update.js", - "/js/main.844c2113c0c54845083c.hot-update.js": "/js/main.844c2113c0c54845083c.hot-update.js", - "/js/main.04c649da59688caed7f4.hot-update.js": "/js/main.04c649da59688caed7f4.hot-update.js", - "/js/main.df8852739b6eb0d8ddd8.hot-update.js": "/js/main.df8852739b6eb0d8ddd8.hot-update.js", - "/js/main.2bb035b765159291e6d4.hot-update.js": "/js/main.2bb035b765159291e6d4.hot-update.js", - "/js/main.6eb45c6e294e847c45ea.hot-update.js": "/js/main.6eb45c6e294e847c45ea.hot-update.js", - "/js/main.c6070c2ada89c43fa419.hot-update.js": "/js/main.c6070c2ada89c43fa419.hot-update.js", - "/js/main.f828168b89124130bc68.hot-update.js": "/js/main.f828168b89124130bc68.hot-update.js", - "/js/main.e5eb5a13e710543f7bd9.hot-update.js": "/js/main.e5eb5a13e710543f7bd9.hot-update.js", - "/js/main.63b69c5bbda8f437d459.hot-update.js": "/js/main.63b69c5bbda8f437d459.hot-update.js", - "/js/main.a72c8891596b66b212b6.hot-update.js": "/js/main.a72c8891596b66b212b6.hot-update.js", - "/js/main.19e0710bc40f03b262e6.hot-update.js": "/js/main.19e0710bc40f03b262e6.hot-update.js", - "/js/main.0134afb94f91a4a36def.hot-update.js": "/js/main.0134afb94f91a4a36def.hot-update.js", - "/js/main.9a24933aefa3e49663f7.hot-update.js": "/js/main.9a24933aefa3e49663f7.hot-update.js", - "/js/main.cc27c9bc9c27f1b845bb.hot-update.js": "/js/main.cc27c9bc9c27f1b845bb.hot-update.js", - "/js/main.b93834f4ca3df91cd540.hot-update.js": "/js/main.b93834f4ca3df91cd540.hot-update.js", - "/js/main.5937cb7e39356fd7d4c4.hot-update.js": "/js/main.5937cb7e39356fd7d4c4.hot-update.js", - "/js/main.cea013f04296667aee3a.hot-update.js": "/js/main.cea013f04296667aee3a.hot-update.js", - "/js/main.bff0613b9adee03ca219.hot-update.js": "/js/main.bff0613b9adee03ca219.hot-update.js", - "/js/main.a43ba373208207664417.hot-update.js": "/js/main.a43ba373208207664417.hot-update.js", - "/js/main.4ff290116a377da3d41f.hot-update.js": "/js/main.4ff290116a377da3d41f.hot-update.js", - "/js/main.96a5134be5a0a98693e4.hot-update.js": "/js/main.96a5134be5a0a98693e4.hot-update.js", - "/js/main.e0432d1e9c7975c2ab9d.hot-update.js": "/js/main.e0432d1e9c7975c2ab9d.hot-update.js", - "/js/main.d62433ce757652be6f54.hot-update.js": "/js/main.d62433ce757652be6f54.hot-update.js", - "/js/main.fa91e0076416ce9b9eac.hot-update.js": "/js/main.fa91e0076416ce9b9eac.hot-update.js", - "/js/main.6791a0db3468e2abbb01.hot-update.js": "/js/main.6791a0db3468e2abbb01.hot-update.js", - "/js/main.f34c60f7b8d27d185789.hot-update.js": "/js/main.f34c60f7b8d27d185789.hot-update.js", - "/js/main.e0ac013a5685366884b0.hot-update.js": "/js/main.e0ac013a5685366884b0.hot-update.js", - "/js/main.45f929f9501bca0a3a2b.hot-update.js": "/js/main.45f929f9501bca0a3a2b.hot-update.js", - "/js/main.c17c98fa0aac463d62ec.hot-update.js": "/js/main.c17c98fa0aac463d62ec.hot-update.js", - "/js/main.0e03c020348420598462.hot-update.js": "/js/main.0e03c020348420598462.hot-update.js", - "/js/main.0a76373d676f6bc3f8b7.hot-update.js": "/js/main.0a76373d676f6bc3f8b7.hot-update.js", - "/js/main.7d0b5e6140d5a76d8a6e.hot-update.js": "/js/main.7d0b5e6140d5a76d8a6e.hot-update.js", - "/js/main.5faa42142a298e5ab92b.hot-update.js": "/js/main.5faa42142a298e5ab92b.hot-update.js", - "/js/main.3eaf20665f37c24473fd.hot-update.js": "/js/main.3eaf20665f37c24473fd.hot-update.js", - "/js/main.6d0cf380525ddd49bb4b.hot-update.js": "/js/main.6d0cf380525ddd49bb4b.hot-update.js", - "/js/main.96ceb1a99c9ccca2fbbe.hot-update.js": "/js/main.96ceb1a99c9ccca2fbbe.hot-update.js", - "/js/main.3557a28505eb1edad3c6.hot-update.js": "/js/main.3557a28505eb1edad3c6.hot-update.js", - "/js/main.f85533ba77bc9daa2b28.hot-update.js": "/js/main.f85533ba77bc9daa2b28.hot-update.js", - "/js/main.844ced51412415958d01.hot-update.js": "/js/main.844ced51412415958d01.hot-update.js", - "/js/main.4aef58634b3a86124e7f.hot-update.js": "/js/main.4aef58634b3a86124e7f.hot-update.js", - "/js/main.6de5f0faf8a05f2fc5a7.hot-update.js": "/js/main.6de5f0faf8a05f2fc5a7.hot-update.js", - "/js/main.c62abbf47cf5f738c9b5.hot-update.js": "/js/main.c62abbf47cf5f738c9b5.hot-update.js", - "/js/main.87c321a637ae5ab917ce.hot-update.js": "/js/main.87c321a637ae5ab917ce.hot-update.js", - "/js/main.90ad40b9a9f360d249f9.hot-update.js": "/js/main.90ad40b9a9f360d249f9.hot-update.js", - "/js/main.91b09e11f41e643af61b.hot-update.js": "/js/main.91b09e11f41e643af61b.hot-update.js", - "/js/main.6e993020f81c4506f7f1.hot-update.js": "/js/main.6e993020f81c4506f7f1.hot-update.js", - "/js/main.eb69554875d7f6f0af13.hot-update.js": "/js/main.eb69554875d7f6f0af13.hot-update.js", - "/js/main.b00263659caf576e365f.hot-update.js": "/js/main.b00263659caf576e365f.hot-update.js", - "/js/main.3731a12d7df03dd0b1ac.hot-update.js": "/js/main.3731a12d7df03dd0b1ac.hot-update.js", - "/js/main.14283c0c8928f2bac642.hot-update.js": "/js/main.14283c0c8928f2bac642.hot-update.js", - "/js/main.5d22154675bb7301f3c3.hot-update.js": "/js/main.5d22154675bb7301f3c3.hot-update.js", - "/js/main.68f901614ec25bb9be2e.hot-update.js": "/js/main.68f901614ec25bb9be2e.hot-update.js", - "/js/main.94b2828776f652bbecd1.hot-update.js": "/js/main.94b2828776f652bbecd1.hot-update.js", - "/js/main.a5193c2c4b1f57e843ac.hot-update.js": "/js/main.a5193c2c4b1f57e843ac.hot-update.js", - "/js/main.50b2e366bd6b72990a03.hot-update.js": "/js/main.50b2e366bd6b72990a03.hot-update.js", - "/js/main.f7a87e8ee0dc7a8c3d35.hot-update.js": "/js/main.f7a87e8ee0dc7a8c3d35.hot-update.js", - "/js/main.460fb4a8eadec50eafc0.hot-update.js": "/js/main.460fb4a8eadec50eafc0.hot-update.js", - "/js/main.b56efb8b6dda94e0e837.hot-update.js": "/js/main.b56efb8b6dda94e0e837.hot-update.js", - "/js/main.7696e7ea10b668afeccc.hot-update.js": "/js/main.7696e7ea10b668afeccc.hot-update.js", - "/js/main.7d32beb20b5719f11726.hot-update.js": "/js/main.7d32beb20b5719f11726.hot-update.js", - "/js/main.6325449e7341db20a9ce.hot-update.js": "/js/main.6325449e7341db20a9ce.hot-update.js", - "/js/main.2cc0ebd3eba768b8429c.hot-update.js": "/js/main.2cc0ebd3eba768b8429c.hot-update.js", - "/js/main.22edc66a07d0d7fc8d83.hot-update.js": "/js/main.22edc66a07d0d7fc8d83.hot-update.js", - "/js/main.60bed97815a1ea0a09d6.hot-update.js": "/js/main.60bed97815a1ea0a09d6.hot-update.js", - "/js/main.f6a63bab2aa5511566e7.hot-update.js": "/js/main.f6a63bab2aa5511566e7.hot-update.js", - "/js/main.121e2dd11bc35045482b.hot-update.js": "/js/main.121e2dd11bc35045482b.hot-update.js", - "/js/main.541def265ec163ed2d5f.hot-update.js": "/js/main.541def265ec163ed2d5f.hot-update.js", - "/js/main.c9814fe8d127f6265fdf.hot-update.js": "/js/main.c9814fe8d127f6265fdf.hot-update.js", - "/js/main.0c31610719dd6fbfd7ab.hot-update.js": "/js/main.0c31610719dd6fbfd7ab.hot-update.js", - "/js/main.73d20180f790009a0536.hot-update.js": "/js/main.73d20180f790009a0536.hot-update.js", - "/js/main.bd8cd2b0d65c5499a5fa.hot-update.js": "/js/main.bd8cd2b0d65c5499a5fa.hot-update.js", - "/js/main.4b941ee3158e8f359e0b.hot-update.js": "/js/main.4b941ee3158e8f359e0b.hot-update.js", - "/js/main.4eed502c18c3384e017c.hot-update.js": "/js/main.4eed502c18c3384e017c.hot-update.js", - "/js/main.0ff9c65b54e9f2fd3f09.hot-update.js": "/js/main.0ff9c65b54e9f2fd3f09.hot-update.js", - "/js/main.0c5bcf3373897713488f.hot-update.js": "/js/main.0c5bcf3373897713488f.hot-update.js", - "/js/main.5d00a679a40bb2c37b11.hot-update.js": "/js/main.5d00a679a40bb2c37b11.hot-update.js", - "/js/main.2559125fe1eef3ee7dd3.hot-update.js": "/js/main.2559125fe1eef3ee7dd3.hot-update.js", - "/js/main.55d5f2f55034cb7a4da6.hot-update.js": "/js/main.55d5f2f55034cb7a4da6.hot-update.js", - "/js/main.890897a7ce8479317a97.hot-update.js": "/js/main.890897a7ce8479317a97.hot-update.js", - "/js/main.988a45b98fc8b8c5e41c.hot-update.js": "/js/main.988a45b98fc8b8c5e41c.hot-update.js", - "/js/main.33577380f3a58be208ee.hot-update.js": "/js/main.33577380f3a58be208ee.hot-update.js", - "/js/main.ada254f372b54b162118.hot-update.js": "/js/main.ada254f372b54b162118.hot-update.js", - "/js/main.afa97b2d282c673884a9.hot-update.js": "/js/main.afa97b2d282c673884a9.hot-update.js" + "/js/main.c592c1b513edd7534891.hot-update.js": "/js/main.c592c1b513edd7534891.hot-update.js", + "/js/main.80ad9909faceb74207f1.hot-update.js": "/js/main.80ad9909faceb74207f1.hot-update.js", + "/js/main.4b91997785e85d7d6e32.hot-update.js": "/js/main.4b91997785e85d7d6e32.hot-update.js", + "/js/main.e787780098edc245ae3c.hot-update.js": "/js/main.e787780098edc245ae3c.hot-update.js", + "/js/main.e55b17a6a5a315b93bef.hot-update.js": "/js/main.e55b17a6a5a315b93bef.hot-update.js", + "/js/main.28fdd591cc524a88c846.hot-update.js": "/js/main.28fdd591cc524a88c846.hot-update.js", + "/js/main.2b812942c78e860c03db.hot-update.js": "/js/main.2b812942c78e860c03db.hot-update.js", + "/js/main.211081d76c54b5482de5.hot-update.js": "/js/main.211081d76c54b5482de5.hot-update.js", + "/js/main.fd6434aee58e09a56ff4.hot-update.js": "/js/main.fd6434aee58e09a56ff4.hot-update.js", + "/js/main.4c1d8cba619a7927638c.hot-update.js": "/js/main.4c1d8cba619a7927638c.hot-update.js", + "/js/main.aff41805a3b84c8ebae5.hot-update.js": "/js/main.aff41805a3b84c8ebae5.hot-update.js", + "/js/main.6f72ba9701b9e19c9be0.hot-update.js": "/js/main.6f72ba9701b9e19c9be0.hot-update.js", + "/js/main.0e4c6671c2367b10695d.hot-update.js": "/js/main.0e4c6671c2367b10695d.hot-update.js", + "/js/main.1985d2920179f9a6f78f.hot-update.js": "/js/main.1985d2920179f9a6f78f.hot-update.js", + "/js/main.9f9975790f0a229f2cb2.hot-update.js": "/js/main.9f9975790f0a229f2cb2.hot-update.js", + "/js/main.0fba79cfcfa3990cf559.hot-update.js": "/js/main.0fba79cfcfa3990cf559.hot-update.js", + "/js/main.03715cbb9f7cdc53e0ff.hot-update.js": "/js/main.03715cbb9f7cdc53e0ff.hot-update.js", + "/js/main.b6aaa5a10b3ddcee7f9d.hot-update.js": "/js/main.b6aaa5a10b3ddcee7f9d.hot-update.js", + "/js/main.d7271130fb59906d5182.hot-update.js": "/js/main.d7271130fb59906d5182.hot-update.js", + "/js/main.957b7763ea3c9accc8cc.hot-update.js": "/js/main.957b7763ea3c9accc8cc.hot-update.js", + "/js/main.e23eea5ec4310f745400.hot-update.js": "/js/main.e23eea5ec4310f745400.hot-update.js", + "/js/main.6e342ea527f2c3f9b013.hot-update.js": "/js/main.6e342ea527f2c3f9b013.hot-update.js", + "/js/main.612f96382ad8ba3d109c.hot-update.js": "/js/main.612f96382ad8ba3d109c.hot-update.js", + "/js/main.aba02ea167c96d2b7634.hot-update.js": "/js/main.aba02ea167c96d2b7634.hot-update.js", + "/js/main.9d67410798c6c29f0842.hot-update.js": "/js/main.9d67410798c6c29f0842.hot-update.js", + "/js/main.e4515959db9d0f8747f2.hot-update.js": "/js/main.e4515959db9d0f8747f2.hot-update.js", + "/js/main.cb089a2ecaf1fd0be078.hot-update.js": "/js/main.cb089a2ecaf1fd0be078.hot-update.js", + "/js/main.5ba809ade4770806836a.hot-update.js": "/js/main.5ba809ade4770806836a.hot-update.js", + "/js/main.990c352366666e2ca2f2.hot-update.js": "/js/main.990c352366666e2ca2f2.hot-update.js", + "/js/main.4c12e8bb7d017220e3fa.hot-update.js": "/js/main.4c12e8bb7d017220e3fa.hot-update.js", + "/js/main.0bd1b62237741b506f57.hot-update.js": "/js/main.0bd1b62237741b506f57.hot-update.js", + "/js/main.90a24d55baa0b9e45607.hot-update.js": "/js/main.90a24d55baa0b9e45607.hot-update.js", + "/js/main.f0152d5ede68576fab2f.hot-update.js": "/js/main.f0152d5ede68576fab2f.hot-update.js", + "/js/main.f87dba2f8ad4b673eef3.hot-update.js": "/js/main.f87dba2f8ad4b673eef3.hot-update.js", + "/js/main.7738f2b3cc86dadbfcf9.hot-update.js": "/js/main.7738f2b3cc86dadbfcf9.hot-update.js", + "/js/main.a6bc9844316ff7a73a3a.hot-update.js": "/js/main.a6bc9844316ff7a73a3a.hot-update.js", + "/js/main.30f1c08c6c5c716bc99b.hot-update.js": "/js/main.30f1c08c6c5c716bc99b.hot-update.js", + "/js/main.52f9059179cdfa541c49.hot-update.js": "/js/main.52f9059179cdfa541c49.hot-update.js", + "/js/main.bd918a21f99459ac0c5a.hot-update.js": "/js/main.bd918a21f99459ac0c5a.hot-update.js", + "/js/main.cd35d127280aa3ed72bf.hot-update.js": "/js/main.cd35d127280aa3ed72bf.hot-update.js", + "/js/main.fad01e38ba0a025fff8e.hot-update.js": "/js/main.fad01e38ba0a025fff8e.hot-update.js", + "/js/main.5f401e8ed55572e305cb.hot-update.js": "/js/main.5f401e8ed55572e305cb.hot-update.js", + "/js/main.0781bb19d4803f1c18cd.hot-update.js": "/js/main.0781bb19d4803f1c18cd.hot-update.js", + "/js/main.4647329b218e437cd36f.hot-update.js": "/js/main.4647329b218e437cd36f.hot-update.js", + "/js/main.cbadabd16ec66f6c56d6.hot-update.js": "/js/main.cbadabd16ec66f6c56d6.hot-update.js", + "/js/main.2b9b5409dee799203a6c.hot-update.js": "/js/main.2b9b5409dee799203a6c.hot-update.js", + "/js/main.21dd08ba11f996085687.hot-update.js": "/js/main.21dd08ba11f996085687.hot-update.js", + "/js/main.afe5395def9a1c6bfba3.hot-update.js": "/js/main.afe5395def9a1c6bfba3.hot-update.js", + "/js/main.bce3823ed3f28958fa5f.hot-update.js": "/js/main.bce3823ed3f28958fa5f.hot-update.js", + "/js/main.6d0abf817c91fcbc246d.hot-update.js": "/js/main.6d0abf817c91fcbc246d.hot-update.js", + "/js/main.d20577f503f0d098d7d3.hot-update.js": "/js/main.d20577f503f0d098d7d3.hot-update.js", + "/js/main.609a2280828ed517bdc1.hot-update.js": "/js/main.609a2280828ed517bdc1.hot-update.js", + "/js/main.d7ad5e9d5b97bbdc37db.hot-update.js": "/js/main.d7ad5e9d5b97bbdc37db.hot-update.js", + "/js/main.66dc93a5bf413b7786be.hot-update.js": "/js/main.66dc93a5bf413b7786be.hot-update.js", + "/js/main.e616a0e15889e0865a7b.hot-update.js": "/js/main.e616a0e15889e0865a7b.hot-update.js", + "/js/main.58f7b99d0ee0f875e7dc.hot-update.js": "/js/main.58f7b99d0ee0f875e7dc.hot-update.js", + "/js/main.e79958d0a6039bd1c735.hot-update.js": "/js/main.e79958d0a6039bd1c735.hot-update.js", + "/js/main.f88db9bb087b351dc1a4.hot-update.js": "/js/main.f88db9bb087b351dc1a4.hot-update.js", + "/js/main.8a872d714e919c2818ad.hot-update.js": "/js/main.8a872d714e919c2818ad.hot-update.js", + "/js/main.8a719961322acc70e9ef.hot-update.js": "/js/main.8a719961322acc70e9ef.hot-update.js", + "/js/main.a46e2e1d1032e2bb09ac.hot-update.js": "/js/main.a46e2e1d1032e2bb09ac.hot-update.js", + "/js/main.f4e3d15c80b88b4936be.hot-update.js": "/js/main.f4e3d15c80b88b4936be.hot-update.js", + "/js/main.afca50dd54922bf43026.hot-update.js": "/js/main.afca50dd54922bf43026.hot-update.js", + "/js/main.22a33372319fe8c233e6.hot-update.js": "/js/main.22a33372319fe8c233e6.hot-update.js", + "/js/main.066da2d957bdd49143d0.hot-update.js": "/js/main.066da2d957bdd49143d0.hot-update.js", + "/js/main.1b2ebbdc84449535f397.hot-update.js": "/js/main.1b2ebbdc84449535f397.hot-update.js", + "/js/main.4ac37a1720ab1578cec3.hot-update.js": "/js/main.4ac37a1720ab1578cec3.hot-update.js", + "/js/main.623f3b31b7a87a8668b4.hot-update.js": "/js/main.623f3b31b7a87a8668b4.hot-update.js", + "/js/main.7632e72183adc326096a.hot-update.js": "/js/main.7632e72183adc326096a.hot-update.js", + "/js/main.6f007dc67a704a23e916.hot-update.js": "/js/main.6f007dc67a704a23e916.hot-update.js", + "/js/main.e553af47e4049586ac44.hot-update.js": "/js/main.e553af47e4049586ac44.hot-update.js", + "/js/main.92b31d53366c3ad8622b.hot-update.js": "/js/main.92b31d53366c3ad8622b.hot-update.js", + "/js/main.e09827aea6d23ff07c1e.hot-update.js": "/js/main.e09827aea6d23ff07c1e.hot-update.js", + "/js/main.04281820cee21428693e.hot-update.js": "/js/main.04281820cee21428693e.hot-update.js", + "/js/main.f4067ec10e4cf8bd8a64.hot-update.js": "/js/main.f4067ec10e4cf8bd8a64.hot-update.js", + "/js/main.430e98b75c1019f0292d.hot-update.js": "/js/main.430e98b75c1019f0292d.hot-update.js", + "/js/main.578582fa836e0594b831.hot-update.js": "/js/main.578582fa836e0594b831.hot-update.js", + "/js/main.0513b4f06058ecad6d0f.hot-update.js": "/js/main.0513b4f06058ecad6d0f.hot-update.js", + "/js/main.311234d50f9c449dc26b.hot-update.js": "/js/main.311234d50f9c449dc26b.hot-update.js", + "/js/main.aced0a5d0980fe602161.hot-update.js": "/js/main.aced0a5d0980fe602161.hot-update.js", + "/js/main.ad0cab16daa356d285bc.hot-update.js": "/js/main.ad0cab16daa356d285bc.hot-update.js", + "/js/main.40423454c85a1c529658.hot-update.js": "/js/main.40423454c85a1c529658.hot-update.js", + "/js/main.5f56f327d2ee898c55f5.hot-update.js": "/js/main.5f56f327d2ee898c55f5.hot-update.js", + "/js/main.d4206606dda50af813c6.hot-update.js": "/js/main.d4206606dda50af813c6.hot-update.js", + "/js/main.b2fbfa55f560e77648b4.hot-update.js": "/js/main.b2fbfa55f560e77648b4.hot-update.js", + "/js/main.e05f4750489ca893d94d.hot-update.js": "/js/main.e05f4750489ca893d94d.hot-update.js", + "/js/main.af394e802253a7191c04.hot-update.js": "/js/main.af394e802253a7191c04.hot-update.js", + "/js/main.ce416ea8ea898d2b842c.hot-update.js": "/js/main.ce416ea8ea898d2b842c.hot-update.js", + "/js/main.c1b17e139a6bffd834f5.hot-update.js": "/js/main.c1b17e139a6bffd834f5.hot-update.js", + "/js/main.46df392fd59c5498018f.hot-update.js": "/js/main.46df392fd59c5498018f.hot-update.js", + "/js/main.5b083225fa62793303a5.hot-update.js": "/js/main.5b083225fa62793303a5.hot-update.js", + "/js/main.ff1635f87e05dae40c64.hot-update.js": "/js/main.ff1635f87e05dae40c64.hot-update.js", + "/js/main.181ca1486b6c63df043a.hot-update.js": "/js/main.181ca1486b6c63df043a.hot-update.js", + "/js/main.aed85b7900a1ffb09898.hot-update.js": "/js/main.aed85b7900a1ffb09898.hot-update.js", + "/js/main.a96f14da0f826e0f73fe.hot-update.js": "/js/main.a96f14da0f826e0f73fe.hot-update.js", + "/js/main.19bc16cb52d3dc751604.hot-update.js": "/js/main.19bc16cb52d3dc751604.hot-update.js", + "/js/main.13103769e6134409fa2a.hot-update.js": "/js/main.13103769e6134409fa2a.hot-update.js", + "/js/main.a8ddc0df618dca5b1160.hot-update.js": "/js/main.a8ddc0df618dca5b1160.hot-update.js", + "/js/main.98abd09248c9893c4a30.hot-update.js": "/js/main.98abd09248c9893c4a30.hot-update.js", + "/js/main.4b42b13afb3e6e18a916.hot-update.js": "/js/main.4b42b13afb3e6e18a916.hot-update.js", + "/js/main.da8ab6e69627bbcff9a1.hot-update.js": "/js/main.da8ab6e69627bbcff9a1.hot-update.js", + "/js/main.fb5fe1c0ead4cb6c3647.hot-update.js": "/js/main.fb5fe1c0ead4cb6c3647.hot-update.js", + "/js/main.ecbde6764e0032ecaaff.hot-update.js": "/js/main.ecbde6764e0032ecaaff.hot-update.js", + "/js/main.45cdddc1e11584321f8f.hot-update.js": "/js/main.45cdddc1e11584321f8f.hot-update.js", + "/js/main.5e716c4399d6c4e7c60c.hot-update.js": "/js/main.5e716c4399d6c4e7c60c.hot-update.js", + "/js/main.85b156a9d0ebbe510f72.hot-update.js": "/js/main.85b156a9d0ebbe510f72.hot-update.js", + "/js/main.5de3358896db4e70d82d.hot-update.js": "/js/main.5de3358896db4e70d82d.hot-update.js", + "/js/main.ede66032dd422936528c.hot-update.js": "/js/main.ede66032dd422936528c.hot-update.js", + "/js/main.5465d00f698d022075f8.hot-update.js": "/js/main.5465d00f698d022075f8.hot-update.js", + "/js/main.aa025d5f6feec8c0dab2.hot-update.js": "/js/main.aa025d5f6feec8c0dab2.hot-update.js", + "/js/main.820910b8cdce9f354543.hot-update.js": "/js/main.820910b8cdce9f354543.hot-update.js", + "/js/main.d14ee47779985cb32ec0.hot-update.js": "/js/main.d14ee47779985cb32ec0.hot-update.js", + "/js/main.8d266a1d740fa389c2bf.hot-update.js": "/js/main.8d266a1d740fa389c2bf.hot-update.js", + "/js/main.99143ecd6bfafab9b677.hot-update.js": "/js/main.99143ecd6bfafab9b677.hot-update.js", + "/js/main.bbb2be0d78aaec9dfda1.hot-update.js": "/js/main.bbb2be0d78aaec9dfda1.hot-update.js", + "/js/main.76904835fe400dd9848f.hot-update.js": "/js/main.76904835fe400dd9848f.hot-update.js", + "/js/main.cafd83e6c2744baad34a.hot-update.js": "/js/main.cafd83e6c2744baad34a.hot-update.js", + "/js/main.2002a76681e8d0433941.hot-update.js": "/js/main.2002a76681e8d0433941.hot-update.js", + "/js/main.2fd100a299a791164337.hot-update.js": "/js/main.2fd100a299a791164337.hot-update.js", + "/js/main.3abd3c2a19f02f47bebc.hot-update.js": "/js/main.3abd3c2a19f02f47bebc.hot-update.js", + "/js/main.2bc80b9424efd6eadbed.hot-update.js": "/js/main.2bc80b9424efd6eadbed.hot-update.js", + "/js/main.48a8f2b34315a51837ed.hot-update.js": "/js/main.48a8f2b34315a51837ed.hot-update.js", + "/js/main.bb7c8231d66a0cb23884.hot-update.js": "/js/main.bb7c8231d66a0cb23884.hot-update.js", + "/js/main.f3c27d8639d237140393.hot-update.js": "/js/main.f3c27d8639d237140393.hot-update.js", + "/js/main.aa88aa732da3530ef6fc.hot-update.js": "/js/main.aa88aa732da3530ef6fc.hot-update.js", + "/js/main.2f10611b4cb0849baf9a.hot-update.js": "/js/main.2f10611b4cb0849baf9a.hot-update.js", + "/js/main.cdb3c9099ecd3aef1c6d.hot-update.js": "/js/main.cdb3c9099ecd3aef1c6d.hot-update.js", + "/js/main.4f6cbd01f21463974339.hot-update.js": "/js/main.4f6cbd01f21463974339.hot-update.js", + "/js/main.75e920f256de199321da.hot-update.js": "/js/main.75e920f256de199321da.hot-update.js", + "/js/main.3aa153417b65e9dd8e66.hot-update.js": "/js/main.3aa153417b65e9dd8e66.hot-update.js", + "/js/main.412dd1fb982791c51e22.hot-update.js": "/js/main.412dd1fb982791c51e22.hot-update.js", + "/js/main.f7dace814dd7cf6cd2d2.hot-update.js": "/js/main.f7dace814dd7cf6cd2d2.hot-update.js", + "/js/main.107c49051b193edea885.hot-update.js": "/js/main.107c49051b193edea885.hot-update.js", + "/js/main.b31481977f618806d60a.hot-update.js": "/js/main.b31481977f618806d60a.hot-update.js", + "/js/main.44dcaa7eb8423dcba8c0.hot-update.js": "/js/main.44dcaa7eb8423dcba8c0.hot-update.js", + "/js/main.ff751f6b0426846af09f.hot-update.js": "/js/main.ff751f6b0426846af09f.hot-update.js", + "/js/main.2b668837a746a960d470.hot-update.js": "/js/main.2b668837a746a960d470.hot-update.js", + "/js/main.c26ae7faad32e3f752f9.hot-update.js": "/js/main.c26ae7faad32e3f752f9.hot-update.js", + "/js/main.71819bd2c52cfd992c49.hot-update.js": "/js/main.71819bd2c52cfd992c49.hot-update.js", + "/js/main.b2a492cb77c7a3dbc8b8.hot-update.js": "/js/main.b2a492cb77c7a3dbc8b8.hot-update.js", + "/js/main.755b3b6f634d7ea41269.hot-update.js": "/js/main.755b3b6f634d7ea41269.hot-update.js", + "/js/main.63a686c9457eecec0aed.hot-update.js": "/js/main.63a686c9457eecec0aed.hot-update.js", + "/js/main.bc7270bc738d06bf003c.hot-update.js": "/js/main.bc7270bc738d06bf003c.hot-update.js", + "/js/main.6a812e6a9a8fdec9e0f9.hot-update.js": "/js/main.6a812e6a9a8fdec9e0f9.hot-update.js", + "/js/main.605b505026463b82cf92.hot-update.js": "/js/main.605b505026463b82cf92.hot-update.js", + "/js/main.67ec3e67dc7fe249a511.hot-update.js": "/js/main.67ec3e67dc7fe249a511.hot-update.js", + "/js/main.60f7f14041f1b1c43ba7.hot-update.js": "/js/main.60f7f14041f1b1c43ba7.hot-update.js", + "/js/main.378fefdc90168f530ced.hot-update.js": "/js/main.378fefdc90168f530ced.hot-update.js", + "/js/main.50bcdbbb6689ab1f3ff8.hot-update.js": "/js/main.50bcdbbb6689ab1f3ff8.hot-update.js", + "/js/main.bad32b198b2701141385.hot-update.js": "/js/main.bad32b198b2701141385.hot-update.js", + "/js/main.054d269f4a98578503c1.hot-update.js": "/js/main.054d269f4a98578503c1.hot-update.js", + "/js/main.41b69188f146b379f87b.hot-update.js": "/js/main.41b69188f146b379f87b.hot-update.js", + "/js/main.3e018a3648dfc61d3df3.hot-update.js": "/js/main.3e018a3648dfc61d3df3.hot-update.js", + "/js/main.2936652ac5660f94a796.hot-update.js": "/js/main.2936652ac5660f94a796.hot-update.js", + "/js/main.fcc623fc42f160e06cfe.hot-update.js": "/js/main.fcc623fc42f160e06cfe.hot-update.js", + "/js/main.93d580e0883dc95e1116.hot-update.js": "/js/main.93d580e0883dc95e1116.hot-update.js", + "/js/main.28d29c71ea1ed0a0b0b4.hot-update.js": "/js/main.28d29c71ea1ed0a0b0b4.hot-update.js", + "/js/main.2a76ff437524f4ee71c0.hot-update.js": "/js/main.2a76ff437524f4ee71c0.hot-update.js", + "/js/main.cff525ce21d6a17180c1.hot-update.js": "/js/main.cff525ce21d6a17180c1.hot-update.js", + "/js/main.160476920d84b7b64f03.hot-update.js": "/js/main.160476920d84b7b64f03.hot-update.js", + "/js/main.30dda3674a213af39664.hot-update.js": "/js/main.30dda3674a213af39664.hot-update.js", + "/js/main.c011a2db86676be81958.hot-update.js": "/js/main.c011a2db86676be81958.hot-update.js", + "/js/main.3b1eb2be045aeb2794d7.hot-update.js": "/js/main.3b1eb2be045aeb2794d7.hot-update.js", + "/js/main.06a1a0a0d13e736f4b21.hot-update.js": "/js/main.06a1a0a0d13e736f4b21.hot-update.js", + "/js/main.e01d5781e9a5c7916665.hot-update.js": "/js/main.e01d5781e9a5c7916665.hot-update.js", + "/js/main.a8be6a86ef7ea1fa09aa.hot-update.js": "/js/main.a8be6a86ef7ea1fa09aa.hot-update.js", + "/js/main.10ef93f11f9971bffcd0.hot-update.js": "/js/main.10ef93f11f9971bffcd0.hot-update.js", + "/js/main.8272060c881465e5c1b8.hot-update.js": "/js/main.8272060c881465e5c1b8.hot-update.js", + "/js/main.3c4afd1bbc5dbddbc2f5.hot-update.js": "/js/main.3c4afd1bbc5dbddbc2f5.hot-update.js", + "/js/main.5095c746248692e2fab9.hot-update.js": "/js/main.5095c746248692e2fab9.hot-update.js", + "/js/main.b7e058950b6450f5be86.hot-update.js": "/js/main.b7e058950b6450f5be86.hot-update.js", + "/js/main.0cd416bcfc7be3e736b4.hot-update.js": "/js/main.0cd416bcfc7be3e736b4.hot-update.js", + "/js/main.074d97f29afb98992021.hot-update.js": "/js/main.074d97f29afb98992021.hot-update.js", + "/js/main.b832de402f7a0bb84f16.hot-update.js": "/js/main.b832de402f7a0bb84f16.hot-update.js", + "/js/main.e2acc484ee30d5bc511b.hot-update.js": "/js/main.e2acc484ee30d5bc511b.hot-update.js", + "/js/main.6062f643e9e4b8ca338f.hot-update.js": "/js/main.6062f643e9e4b8ca338f.hot-update.js", + "/js/main.2e9db006c2bd6ed06276.hot-update.js": "/js/main.2e9db006c2bd6ed06276.hot-update.js", + "/js/main.c5440e1711c2366531e8.hot-update.js": "/js/main.c5440e1711c2366531e8.hot-update.js", + "/js/main.9621c2052cd66aab368f.hot-update.js": "/js/main.9621c2052cd66aab368f.hot-update.js", + "/js/main.0fe5939166b86f760041.hot-update.js": "/js/main.0fe5939166b86f760041.hot-update.js", + "/js/main.9a08a8a2109d7993ea97.hot-update.js": "/js/main.9a08a8a2109d7993ea97.hot-update.js", + "/js/main.bf10e2245b146a2cf6c0.hot-update.js": "/js/main.bf10e2245b146a2cf6c0.hot-update.js", + "/js/main.9c0628dcaf454d8ef45e.hot-update.js": "/js/main.9c0628dcaf454d8ef45e.hot-update.js", + "/js/main.93b39c613c426756176e.hot-update.js": "/js/main.93b39c613c426756176e.hot-update.js", + "/js/main.cddfc9fafcd6885f21e7.hot-update.js": "/js/main.cddfc9fafcd6885f21e7.hot-update.js", + "/js/main.cca75105094aa748a70d.hot-update.js": "/js/main.cca75105094aa748a70d.hot-update.js", + "/js/main.c8c27998c2b3cf45a66b.hot-update.js": "/js/main.c8c27998c2b3cf45a66b.hot-update.js", + "/js/main.329fc90f8bb0ac52ca61.hot-update.js": "/js/main.329fc90f8bb0ac52ca61.hot-update.js", + "/js/main.6f31b38bb7c9668fbbce.hot-update.js": "/js/main.6f31b38bb7c9668fbbce.hot-update.js", + "/js/main.1fd945801f700932880d.hot-update.js": "/js/main.1fd945801f700932880d.hot-update.js", + "/js/main.d4f2e81b634d134be133.hot-update.js": "/js/main.d4f2e81b634d134be133.hot-update.js", + "/js/main.b80e30c83de500fc196d.hot-update.js": "/js/main.b80e30c83de500fc196d.hot-update.js", + "/js/main.8d8063569f01acb69bc7.hot-update.js": "/js/main.8d8063569f01acb69bc7.hot-update.js", + "/js/main.d4d7a8a2373540a95962.hot-update.js": "/js/main.d4d7a8a2373540a95962.hot-update.js", + "/js/main.4b0768ce7a19f5093747.hot-update.js": "/js/main.4b0768ce7a19f5093747.hot-update.js", + "/js/main.34079aa9b29123a2083c.hot-update.js": "/js/main.34079aa9b29123a2083c.hot-update.js", + "/js/main.ec6c429db76fb2dd0212.hot-update.js": "/js/main.ec6c429db76fb2dd0212.hot-update.js", + "/js/main.2ab0c9706b0b5f27748f.hot-update.js": "/js/main.2ab0c9706b0b5f27748f.hot-update.js", + "/js/main.01b547932ef0a411f639.hot-update.js": "/js/main.01b547932ef0a411f639.hot-update.js", + "/js/main.f9d0e38a0c8267727c41.hot-update.js": "/js/main.f9d0e38a0c8267727c41.hot-update.js", + "/js/main.47a584d9a6bfa1cbaca6.hot-update.js": "/js/main.47a584d9a6bfa1cbaca6.hot-update.js", + "/js/main.a891f426506bbc45d3f6.hot-update.js": "/js/main.a891f426506bbc45d3f6.hot-update.js", + "/js/main.0ab4b48148074ad23aec.hot-update.js": "/js/main.0ab4b48148074ad23aec.hot-update.js", + "/js/main.d851fe54d559c0c439d4.hot-update.js": "/js/main.d851fe54d559c0c439d4.hot-update.js", + "/js/main.965fc731cb2a00fcde50.hot-update.js": "/js/main.965fc731cb2a00fcde50.hot-update.js", + "/js/main.7efc63569bd16d43be96.hot-update.js": "/js/main.7efc63569bd16d43be96.hot-update.js", + "/js/main.b56f81dd7b7cf2b4a9b2.hot-update.js": "/js/main.b56f81dd7b7cf2b4a9b2.hot-update.js", + "/js/main.6b538f47d7084fc5c056.hot-update.js": "/js/main.6b538f47d7084fc5c056.hot-update.js", + "/js/main.0847c2f8c76446ffc1e1.hot-update.js": "/js/main.0847c2f8c76446ffc1e1.hot-update.js", + "/js/main.fa9ded0194e51af751b4.hot-update.js": "/js/main.fa9ded0194e51af751b4.hot-update.js", + "/js/main.8e479c4cc567a7f86fbf.hot-update.js": "/js/main.8e479c4cc567a7f86fbf.hot-update.js", + "/js/main.c2131ca9020d74887a86.hot-update.js": "/js/main.c2131ca9020d74887a86.hot-update.js", + "/js/main.ae7a03f5a01e1b1fb79f.hot-update.js": "/js/main.ae7a03f5a01e1b1fb79f.hot-update.js", + "/js/main.4719a377f8009f031b35.hot-update.js": "/js/main.4719a377f8009f031b35.hot-update.js", + "/js/main.c87c48fa6a02b2403911.hot-update.js": "/js/main.c87c48fa6a02b2403911.hot-update.js", + "/js/main.47109b08d1688186ca0f.hot-update.js": "/js/main.47109b08d1688186ca0f.hot-update.js", + "/js/main.74b35f583dd235319010.hot-update.js": "/js/main.74b35f583dd235319010.hot-update.js", + "/js/main.8ad646c7fdf758fc3077.hot-update.js": "/js/main.8ad646c7fdf758fc3077.hot-update.js", + "/js/main.f43a2d4521fab4b9a94e.hot-update.js": "/js/main.f43a2d4521fab4b9a94e.hot-update.js", + "/js/main.3435832fdb3175879cf7.hot-update.js": "/js/main.3435832fdb3175879cf7.hot-update.js", + "/js/main.c58b3c90adbd372bdd97.hot-update.js": "/js/main.c58b3c90adbd372bdd97.hot-update.js", + "/js/main.c08fa8f3335ed51d3f75.hot-update.js": "/js/main.c08fa8f3335ed51d3f75.hot-update.js", + "/js/main.4c82e15c2d67b287e8f8.hot-update.js": "/js/main.4c82e15c2d67b287e8f8.hot-update.js", + "/js/main.508fada0c3ecbb174a11.hot-update.js": "/js/main.508fada0c3ecbb174a11.hot-update.js", + "/js/main.61da2361919afdd32838.hot-update.js": "/js/main.61da2361919afdd32838.hot-update.js", + "/js/main.602057bf75bb7533497a.hot-update.js": "/js/main.602057bf75bb7533497a.hot-update.js", + "/js/main.08f17d3db95a580ebcff.hot-update.js": "/js/main.08f17d3db95a580ebcff.hot-update.js", + "/js/main.fde740604ac11217991e.hot-update.js": "/js/main.fde740604ac11217991e.hot-update.js", + "/js/main.470a4e47222c5cd0ca6c.hot-update.js": "/js/main.470a4e47222c5cd0ca6c.hot-update.js", + "/js/main.78a6535c7174d7490de2.hot-update.js": "/js/main.78a6535c7174d7490de2.hot-update.js", + "/js/main.c8a4f8f465ce6970b2ea.hot-update.js": "/js/main.c8a4f8f465ce6970b2ea.hot-update.js", + "/js/main.d8e90a128296036c0c15.hot-update.js": "/js/main.d8e90a128296036c0c15.hot-update.js", + "/js/main.4f84cab5a93c6fca138b.hot-update.js": "/js/main.4f84cab5a93c6fca138b.hot-update.js", + "/js/main.ff08fabb70c77845dacf.hot-update.js": "/js/main.ff08fabb70c77845dacf.hot-update.js", + "/js/main.73b58a7269460f4044f6.hot-update.js": "/js/main.73b58a7269460f4044f6.hot-update.js", + "/js/main.bffdfdca5226e1971a1f.hot-update.js": "/js/main.bffdfdca5226e1971a1f.hot-update.js", + "/js/main.5d24f494cb656c4aea06.hot-update.js": "/js/main.5d24f494cb656c4aea06.hot-update.js", + "/js/main.284dea61b9e166ccf9f0.hot-update.js": "/js/main.284dea61b9e166ccf9f0.hot-update.js", + "/js/main.0865fc8f9bcc9f534bd5.hot-update.js": "/js/main.0865fc8f9bcc9f534bd5.hot-update.js", + "/js/main.6d388afa93af449e99fd.hot-update.js": "/js/main.6d388afa93af449e99fd.hot-update.js", + "/js/main.108d51ae66a3b2e72dbc.hot-update.js": "/js/main.108d51ae66a3b2e72dbc.hot-update.js", + "/js/main.f78ad0c36590167303c7.hot-update.js": "/js/main.f78ad0c36590167303c7.hot-update.js", + "/js/main.607a892f908136301269.hot-update.js": "/js/main.607a892f908136301269.hot-update.js", + "/js/main.85d4f345841dfbb40e07.hot-update.js": "/js/main.85d4f345841dfbb40e07.hot-update.js", + "/js/main.945083b1b0445126d561.hot-update.js": "/js/main.945083b1b0445126d561.hot-update.js", + "/js/main.b09684c47f389bcc887e.hot-update.js": "/js/main.b09684c47f389bcc887e.hot-update.js", + "/js/main.19d37869465800d743bb.hot-update.js": "/js/main.19d37869465800d743bb.hot-update.js", + "/js/main.c54cd5dfd83b055f78af.hot-update.js": "/js/main.c54cd5dfd83b055f78af.hot-update.js", + "/js/main.672249e68aa26cdc3467.hot-update.js": "/js/main.672249e68aa26cdc3467.hot-update.js", + "/js/main.784cd47e7b5a14f729ac.hot-update.js": "/js/main.784cd47e7b5a14f729ac.hot-update.js", + "/js/main.6bb6b81e129e23fb017c.hot-update.js": "/js/main.6bb6b81e129e23fb017c.hot-update.js", + "/js/main.db67acf9cd2003665508.hot-update.js": "/js/main.db67acf9cd2003665508.hot-update.js", + "/js/main.42bbb785d8bc3374175e.hot-update.js": "/js/main.42bbb785d8bc3374175e.hot-update.js", + "/js/main.0985aa644d053b57a808.hot-update.js": "/js/main.0985aa644d053b57a808.hot-update.js", + "/js/main.49338628cefc585d505e.hot-update.js": "/js/main.49338628cefc585d505e.hot-update.js", + "/js/main.efce52309183dd157590.hot-update.js": "/js/main.efce52309183dd157590.hot-update.js", + "/js/main.35aeb37a9609024aeac9.hot-update.js": "/js/main.35aeb37a9609024aeac9.hot-update.js", + "/js/main.53a1fde399bfc98f701c.hot-update.js": "/js/main.53a1fde399bfc98f701c.hot-update.js", + "/js/main.f822941031e6e082f07c.hot-update.js": "/js/main.f822941031e6e082f07c.hot-update.js", + "/js/main.ca79ce64147b6e0e55cb.hot-update.js": "/js/main.ca79ce64147b6e0e55cb.hot-update.js", + "/js/main.937e0ee30a05573041b3.hot-update.js": "/js/main.937e0ee30a05573041b3.hot-update.js", + "/js/main.e7d9b3bc53ac4b3053bc.hot-update.js": "/js/main.e7d9b3bc53ac4b3053bc.hot-update.js", + "/js/main.96bcd5ef0412bc46d1ed.hot-update.js": "/js/main.96bcd5ef0412bc46d1ed.hot-update.js", + "/js/main.b07bbcaf5c0f638640a0.hot-update.js": "/js/main.b07bbcaf5c0f638640a0.hot-update.js", + "/js/main.25e093e405cc4a690242.hot-update.js": "/js/main.25e093e405cc4a690242.hot-update.js", + "/js/main.6e0fa93bb2ee5213af77.hot-update.js": "/js/main.6e0fa93bb2ee5213af77.hot-update.js", + "/js/main.ef2172323fe57a1a3c55.hot-update.js": "/js/main.ef2172323fe57a1a3c55.hot-update.js", + "/js/main.91c8655cf52d84f6a284.hot-update.js": "/js/main.91c8655cf52d84f6a284.hot-update.js", + "/js/main.8864391e1b0b56720f7c.hot-update.js": "/js/main.8864391e1b0b56720f7c.hot-update.js", + "/js/main.bdb661bd0667afb07d42.hot-update.js": "/js/main.bdb661bd0667afb07d42.hot-update.js", + "/js/main.a907b2a57b6a2917f3da.hot-update.js": "/js/main.a907b2a57b6a2917f3da.hot-update.js", + "/js/main.8bd891d1410908be3f0b.hot-update.js": "/js/main.8bd891d1410908be3f0b.hot-update.js", + "/js/main.70b0ed0c55368738458d.hot-update.js": "/js/main.70b0ed0c55368738458d.hot-update.js", + "/js/main.0c542c7f0c6e83b4fa18.hot-update.js": "/js/main.0c542c7f0c6e83b4fa18.hot-update.js", + "/js/main.69f8ec453d307c1f58d5.hot-update.js": "/js/main.69f8ec453d307c1f58d5.hot-update.js", + "/js/main.3b0d20392d7731b198b2.hot-update.js": "/js/main.3b0d20392d7731b198b2.hot-update.js", + "/js/main.9755e76f416f1eb7566c.hot-update.js": "/js/main.9755e76f416f1eb7566c.hot-update.js", + "/js/main.8fd8b140290b7b62e8bf.hot-update.js": "/js/main.8fd8b140290b7b62e8bf.hot-update.js", + "/js/main.a61786216f1a7f65d8c4.hot-update.js": "/js/main.a61786216f1a7f65d8c4.hot-update.js", + "/js/main.ab0a2ac4fee47195d276.hot-update.js": "/js/main.ab0a2ac4fee47195d276.hot-update.js", + "/js/main.ea5986d9d962e977f388.hot-update.js": "/js/main.ea5986d9d962e977f388.hot-update.js", + "/js/main.e9ecf936319bd5e5a9ba.hot-update.js": "/js/main.e9ecf936319bd5e5a9ba.hot-update.js", + "/js/main.83747ba398461b3dae0c.hot-update.js": "/js/main.83747ba398461b3dae0c.hot-update.js" } diff --git a/resources/js/App.vue b/resources/js/App.vue index e61fd547..df554e10 100644 --- a/resources/js/App.vue +++ b/resources/js/App.vue @@ -8,6 +8,9 @@ + + + @@ -42,6 +45,7 @@ import MobileNavigation from '@/components/Others/MobileNavigation' import MobileMenu from '@/components/FilesView/MobileMenu' import ShareCreate from '@/components/Others/ShareCreate' + import Confirm from '@/components/Others/Popup/Confirm' import ShareEdit from '@/components/Others/ShareEdit' import MoveItem from '@/components/Others/MoveItem' import Vignette from '@/components/Others/Vignette' @@ -61,6 +65,7 @@ ShareEdit, MoveItem, Vignette, + Confirm, MenuBar, Alert, }, diff --git a/resources/js/components/FilesView/Alert.vue b/resources/js/components/FilesView/Alert.vue index 9a87d760..349ae843 100644 --- a/resources/js/components/FilesView/Alert.vue +++ b/resources/js/components/FilesView/Alert.vue @@ -136,6 +136,7 @@ } .popup-content { + .title { @include font-size(22); text-transform: uppercase; diff --git a/resources/js/components/FilesView/DesktopToolbar.vue b/resources/js/components/FilesView/DesktopToolbar.vue index 5b67263c..734b5fa8 100644 --- a/resources/js/components/FilesView/DesktopToolbar.vue +++ b/resources/js/components/FilesView/DesktopToolbar.vue @@ -110,7 +110,8 @@ 'homeDirectory', ]), hasCapacity() { - return this.$store.getters.user.relationships.storage.data.attributes.used <= 100 + //return this.$store.getters.user.relationships.storage.data.attributes.used <= 100 + return true }, directoryName() { return this.currentFolder ? this.currentFolder.name : this.homeDirectory.name diff --git a/resources/js/components/Others/ColorLabel.vue b/resources/js/components/Others/ColorLabel.vue index f4580ea9..7a5e5d04 100644 --- a/resources/js/components/Others/ColorLabel.vue +++ b/resources/js/components/Others/ColorLabel.vue @@ -37,6 +37,11 @@ color: $theme; background: rgba($theme, 0.1); } + + &.red { + color: $danger; + background: rgba($danger, 0.1); + } } @media only screen and (max-width: 1024px) { diff --git a/resources/js/components/Others/Layout/PageTab.vue b/resources/js/components/Others/Layout/PageTab.vue index 7eaf6e8b..cccfc98c 100644 --- a/resources/js/components/Others/Layout/PageTab.vue +++ b/resources/js/components/Others/Layout/PageTab.vue @@ -1,12 +1,21 @@ diff --git a/resources/js/components/Others/PlanPricingTables.vue b/resources/js/components/Others/PlanPricingTables.vue index 52e8f3f3..ea8e1309 100644 --- a/resources/js/components/Others/PlanPricingTables.vue +++ b/resources/js/components/Others/PlanPricingTables.vue @@ -15,7 +15,7 @@