Skip to content

Commit

Permalink
Sponsoring page (#110)
Browse files Browse the repository at this point in the history
* Add NotchPay

* Remove media library configuration

* ✨ Add NotchPay

* ➖ Remove notchpay toolkit

* ♻️ Apply refactoring
  • Loading branch information
mckenziearts authored May 6, 2023
1 parent 7dd597f commit e359771
Show file tree
Hide file tree
Showing 34 changed files with 722 additions and 87 deletions.
2 changes: 2 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -82,3 +82,5 @@ FORMS_FILESYSTEM_DRIVER=${MEDIA_DISK}

SENTRY_LARAVEL_DSN=
SENTRY_TRACES_SAMPLE_RATE=

NOTCHPAY_PUBLIC_KEY=
11 changes: 11 additions & 0 deletions app/Enums/PaymentType.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?php

declare(strict_types=1);

namespace App\Enums;

enum PaymentType: string
{
case SUBSCRIPTION = 'subscription';
case SPONSORING = 'sponsoring';
}
9 changes: 3 additions & 6 deletions app/Enums/PlanType.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,8 @@

namespace App\Enums;

use BenSampo\Enum\Enum;

final class PlanType extends Enum
enum PlanType: string
{
public const DEVELOPER = 'developer';

public const ENTERPRISE = 'enterprise';
case DEVELOPER = 'developer';
case ENTERPRISE = 'enterprise';
}
13 changes: 13 additions & 0 deletions app/Enums/TransactionStatus.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?php

declare(strict_types=1);

namespace App\Enums;

enum TransactionStatus: string
{
case PENDING = 'pending';
case COMPLETE = 'complete';
case CANCELED = 'canceled';
case Failed = 'failed';
}
11 changes: 11 additions & 0 deletions app/Enums/TransactionType.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?php

declare(strict_types=1);

namespace App\Enums;

enum TransactionType: string
{
case ONETIME = 'one-time';
case RECURSIVE = 'recursive';
}
26 changes: 26 additions & 0 deletions app/Http/Controllers/NotchPayCallBackController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<?php

declare(strict_types=1);

namespace App\Http\Controllers;

use App\Models\Transaction;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;

class NotchPayCallBackController extends Controller
{
public function __invoke(Request $request): RedirectResponse
{
$transaction = Transaction::query()
->where('transaction_reference', $request->get('reference'))
->firstOrFail();
$transaction->update(['status' => $request->get('status')]);

// @ToDO Envoie de mail de notification de remerciement pour le sponsoring si l'utilisateur est dans la base de données

session()->flash('status', __('Votre paiement a été pris en compte merci de soutenir Laravel Cameroun.'));

return redirect(route('sponsors'));
}
}
15 changes: 15 additions & 0 deletions app/Http/Controllers/SponsoringController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<?php

declare(strict_types=1);

namespace App\Http\Controllers;

use Illuminate\Contracts\View\View;

class SponsoringController extends Controller
{
public function sponsors(): View
{
return view('sponsors.index');
}
}
95 changes: 95 additions & 0 deletions app/Http/Livewire/Modals/AnonymousSponsors.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
<?php

declare(strict_types=1);

namespace App\Http\Livewire\Modals;

use App\Enums\PaymentType;
use App\Enums\TransactionType;
use App\Models\Transaction;
use App\Models\User;
use Illuminate\Contracts\View\View;
use LivewireUI\Modal\ModalComponent;
use NotchPay\NotchPay;

class AnonymousSponsors extends ModalComponent
{
public ?string $amount = null;
public ?string $option = null;
public ?string $name = null;
public ?string $email = null;
public string $type = 'company';
public ?string $url = null;

public function mount(string $amount, string $option): void
{
$this->amount = $amount;
$this->option = $option;
}

public function submit(): void
{
$this->validate([
'name' => 'required',
'email' => 'required|email',
], [
'name.required' => 'Votre nom est requis',
'email.required' => 'Une adresse e-mail est requise',
'email.email' => 'Veuillez renseigner une adresse e-mail valide',
]);

$adminUser = User::findByEmailAddress('[email protected]');

$notchPay = new NotchPay(config('lcm.notch-pay-public-token'));

try {
// @phpstan-ignore-next-line
$payload = $notchPay->payment->initialize([
'amount' => $this->amount,
'email' => $this->email,
'name' => $this->name,
'currency' => 'XAF',
'reference' => $adminUser->id . '-' . $adminUser->username() . '-' . uniqid(),
'callback' => route('notchpay-callback'),
]);

Transaction::query()->create([
'amount' => $this->amount,
'status' => $payload->transaction->status,
'transaction_reference' => $payload->transaction->reference,
'user_id' => $adminUser->id,
'fees' => $payload->transaction->fee,
'type' => $this->option === 'one-time'
? TransactionType::ONETIME->value
: TransactionType::RECURSIVE->value,
'metadata' => [
'currency' => $payload->transaction->currency,
'reference' => $payload->transaction->reference,
'merchant' => [
'reference' => $payload->transaction->merchant_reference,
'name' => $payload->transaction->customer->name,
'email' => $payload->transaction->customer->email,
'laravel_cm_id' => null,
],
'initiated_at' => $payload->transaction->initiated_at,
'description' => $payload->transaction->description,
'for' => PaymentType::SPONSORING->value,
]
]);

$this->redirect($payload->authorization_url);
} catch (NotchPay\Exception\ApiException $e) {
session()->flash('error', __('Impossible de procéder au paiement, veuillez recommencer plus tard. Merci'));
}
}

public static function modalMaxWidth(): string
{
return 'xl';
}

public function render(): View
{
return view('livewire.modals.anonymous-sponsors');
}
}
2 changes: 1 addition & 1 deletion app/Http/Livewire/Modals/ApprovedArticle.php
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ public function approved(): void

Cache::forget('post-'.$this->article->id); // @phpstan-ignore-line

$this->article->author->notify(new SendApprovedArticle($this->article)); // @phpstan-ignore-line
$this->article->user->notify(new SendApprovedArticle($this->article)); // @phpstan-ignore-line

session()->flash('status', __('L\'article a été approuvé et le mail a été envoyé à l\'auteur pour le notifier.'));

Expand Down
2 changes: 1 addition & 1 deletion app/Http/Livewire/Modals/DeleteArticle.php
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ public function delete(): void

$this->article->delete(); // @phpstan-ignore-line

session()->flash('status', 'La discussion a été supprimé avec tous ses commentaires.');
session()->flash('status', __('La discussion a été supprimé avec tous ses commentaires.'));

$this->redirectRoute('articles');
}
Expand Down
2 changes: 1 addition & 1 deletion app/Http/Livewire/Modals/DeleteDiscussion.php
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ public function delete(): void

$this->discussion->delete(); // @phpstan-ignore-line

session()->flash('status', 'La discussion a été supprimé avec tous ses commentaires.');
session()->flash('status', __('La discussion a été supprimé avec tous ses commentaires.'));

$this->redirectRoute('discussions.index');
}
Expand Down
88 changes: 88 additions & 0 deletions app/Http/Livewire/SponsorSubscription.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
<?php

declare(strict_types=1);

namespace App\Http\Livewire;

use App\Enums\PaymentType;
use App\Enums\TransactionType;
use App\Models\Transaction;
use Illuminate\Contracts\View\View;
use Illuminate\Support\Facades\Auth;
use Livewire\Component;
use NotchPay\NotchPay;

class SponsorSubscription extends Component
{
public string $option = 'one-time';
public string $amount = '';

public function chooseOption(string $option): void
{
$this->option = $option;
}

public function subscribe(): void
{
$this->validate(
['amount' => 'required'],
['amount.required' => __('Votre montant est requis')],
);

if (!Auth::check()) {
$this->emit('openModal', 'modals.anonymous-sponsors', [
'amount' => $this->amount,
'option' => $this->option,
]);
return;
}

$notchPay = new NotchPay(config('lcm.notch-pay-public-token'));

try {
// @phpstan-ignore-next-line
$payload = $notchPay->payment->initialize([
'amount' => $this->amount,
'email' => Auth::user()?->email,
'name' => Auth::user()?->name,
'currency' => 'XAF',
'reference' => Auth::id() . '-' . Auth::user()?->username() . '-' . uniqid(),
'callback' => route('notchpay-callback'),
]);

Transaction::query()->create([
'amount' => $this->amount,
'status' => $payload->transaction->status,
'transaction_reference' => $payload->transaction->reference,
'user_id' => Auth::id(),
'fees' => $payload->transaction->fee,
'type' => $this->option === 'one-time'
? TransactionType::ONETIME->value
: TransactionType::RECURSIVE->value,
'metadata' => [
'currency' => $payload->transaction->currency,
'reference' => $payload->transaction->reference,
'merchant' => [
'reference' => $payload->transaction->merchant_reference,
'name' => $payload->transaction->customer->name,
'email' => $payload->transaction->customer->email,
'phone' => $payload->transaction->customer->phone,
'laravel_cm_id' => Auth::id(),
],
'initiated_at' => $payload->transaction->initiated_at,
'description' => $payload->transaction->description,
'for' => PaymentType::SPONSORING->value,
]
]);

$this->redirect($payload->authorization_url);
} catch (NotchPay\Exception\ApiException $e) {
session()->flash('error', __('Impossible de procéder au paiement, veuillez recommencer plus tard. Merci'));
}
}

public function render(): View
{
return view('livewire.sponsor-subscription');
}
}
27 changes: 27 additions & 0 deletions app/Models/Transaction.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?php

declare(strict_types=1);

namespace App\Models;

use Illuminate\Database\Eloquent\Concerns\HasUuids;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;

class Transaction extends Model
{
use HasFactory;
use HasUuids;

public $guarded = [];

public $casts = [
'metadata' => 'json',
];

public function user(): BelongsTo
{
return $this->belongsTo(User::class);
}
}
8 changes: 6 additions & 2 deletions app/Models/User.php
Original file line number Diff line number Diff line change
Expand Up @@ -242,6 +242,11 @@ public function subscriptions(): HasMany
return $this->hasMany(Subscribe::class);
}

public function transactions(): HasMany
{
return $this->hasMany(Transaction::class);
}

public function deleteThreads(): void
{
// We need to explicitly iterate over the threads and delete them
Expand All @@ -255,8 +260,7 @@ public function deleteReplies(): void
{
// We need to explicitly iterate over the replies and delete them
// separately because all related models need to be deleted.
// @phpstan-ignore-next-line
foreach ($this->replyAble->get() as $reply) {
foreach ($this->replyAble->all() as $reply) {
$reply->delete();
}
}
Expand Down
1 change: 1 addition & 0 deletions app/Traits/WithArticleAttributes.php
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ trait WithArticleAttributes

public int $reading_time = 1;

//@phpstan-ignore-next-line
public $file;

/**
Expand Down
1 change: 1 addition & 0 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
"livewire/livewire": "^2.11",
"lorisleiva/laravel-actions": "^2.5",
"nnjeim/world": "^1.1",
"notchpay/php-sdk": "^2.2",
"qcod/laravel-gamify": "^1.0.6",
"ramsey/uuid": "^4.2",
"rinvex/laravel-subscriptions": "^6.1",
Expand Down
Loading

0 comments on commit e359771

Please sign in to comment.