]> _ Git - psq.git/commitdiff
add untracked files
authorLouis Jeckel <louis.jeckel@outlook.com>
Wed, 14 Oct 2020 23:37:36 +0000 (01:37 +0200)
committerLouis Jeckel <louis.jeckel@outlook.com>
Wed, 14 Oct 2020 23:37:36 +0000 (01:37 +0200)
app/Http/Controllers/StripeController.php [new file with mode: 0644]
app/Http/Controllers/StripeWebhookController.php [new file with mode: 0644]
database/migrations/2020_10_14_032810_add_infos_to_users.php [new file with mode: 0644]
database/migrations/2020_10_14_210857_create_unlocked_articles_tables.php [new file with mode: 0644]

diff --git a/app/Http/Controllers/StripeController.php b/app/Http/Controllers/StripeController.php
new file mode 100644 (file)
index 0000000..d1787c8
--- /dev/null
@@ -0,0 +1,46 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\IsStripeUnlockable;
+use App\User;
+use Illuminate\Http\Request;
+
+class StripeController extends Controller
+{
+
+    public function paymentIntents (Request $request)
+    {
+        $class = $request->input('model_type');
+        $id    = $request->input('model_id');
+
+        throw_unless(class_exists($class), "Class $class doesn't exist");
+
+        /** @var IsStripeUnlockable $model */
+        $model = $class::findOrFail($id);
+
+        throw_unless(method_exists($model, 'getUnlockPrice'), 'Could not get unlock price');
+
+        $price = $model->getUnlockPrice();
+
+        /** @var User $user */
+        $user = \Auth::user();
+        $customer = $user->getStripeCustomer();
+
+        $paymentIntent = \Stripe\PaymentIntent::create([
+            "amount" => $price,
+            "currency" => 'eur',
+//            'setup_future_usage' => 'on_session',
+            'customer' => $customer->id,
+            'metadata' => [
+                'model_type' => $class,
+                'model_id' => $id
+            ]
+        ]);
+        // Send Payment Intent details to client
+        return response()->json($paymentIntent);
+    }
+
+
+
+}
diff --git a/app/Http/Controllers/StripeWebhookController.php b/app/Http/Controllers/StripeWebhookController.php
new file mode 100644 (file)
index 0000000..5be2d5f
--- /dev/null
@@ -0,0 +1,80 @@
+<?php
+
+namespace App\Http\Controllers;
+use App\IsStripeUnlockable;
+use App\User;
+use Illuminate\Http\Response;
+use Illuminate\Support\Arr;
+use Illuminate\Http\Request;
+use Laravel\Cashier\Http\Controllers\WebhookController as BaseStripeWebhookController;
+
+class StripeWebhookController extends BaseStripeWebhookController
+{
+
+    /**
+     * @param array $payload
+     * @return \Symfony\Component\HttpFoundation\Response
+     */
+    protected function handlePaymentIntentSucceeded($payload)
+    {
+        $data = Arr::get($payload, 'data.object');
+        $class = $data['metadata']['model_type'];
+        $id    = $data['metadata']['model_id'];
+
+        /** @var IsStripeUnlockable $article */
+        $article = $class::findOrFail($id);
+
+
+        if ($user = $this->getUserByStripeId($data['customer'])) {
+            $article->unlockedUsers()->attach($user->id, [
+                'stripe_payment' => $data
+            ]);
+        }
+
+
+        return $this->successMethod();
+
+    }
+
+    /**
+     * @param $payload
+     * @return \Symfony\Component\HttpFoundation\Response
+     */
+    protected function handlePaymentMethodAttached($payload)
+    {
+
+        $data = Arr::get($payload, 'data.object');
+        if ($user = $this->getUserByStripeId($data['customer'])) {
+            if($data['type'] !== 'card')
+                return $this->successMethod();
+
+            $user->forceFill([
+                'card_brand' => Arr::get($data, 'card.brand'),
+                'card_last_four' => Arr::get($data, 'card.last4')
+            ])->save();
+
+            return $this->successMethod();
+        }
+
+        return new Response('Customer not found', 404);
+    }
+
+
+
+    /**
+     * Get the billable entity instance by Stripe ID.
+     *
+     * @param  string|null  $stripeId
+     * @return User
+     */
+    protected function getUserByStripeId($stripeId)
+    {
+        return User::where('stripe_id', $stripeId)->first();
+    }
+
+    protected function missingMethod($parameters = [])
+    {
+        return new Response('Not found', 404);
+    }
+
+}
diff --git a/database/migrations/2020_10_14_032810_add_infos_to_users.php b/database/migrations/2020_10_14_032810_add_infos_to_users.php
new file mode 100644 (file)
index 0000000..1ec101c
--- /dev/null
@@ -0,0 +1,36 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class AddInfosToUsers extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('users', function (Blueprint $table) {
+            $table->string('service')->nullable();
+            $table->boolean('wants_pdf')->default(0);
+            $table->boolean('accepts_polls')->default(0);
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('users', function (Blueprint $table) {
+            $table->dropColumn('service');
+            $table->dropColumn('wants_pdf');
+            $table->dropColumn('accepts_polls');
+        });
+    }
+}
diff --git a/database/migrations/2020_10_14_210857_create_unlocked_articles_tables.php b/database/migrations/2020_10_14_210857_create_unlocked_articles_tables.php
new file mode 100644 (file)
index 0000000..e51658a
--- /dev/null
@@ -0,0 +1,34 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class CreateUnlockedArticlesTables extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('unlocked_articles_table', function (Blueprint $table) {
+            $table->id();
+            $table->unsignedBigInteger('user_id');
+            $table->morphs('article');
+            $table->json('stripe_payment')->nullable();
+            $table->timestamps();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('unlocked_articles_table');
+    }
+}