Skip to content

Commit 7072b16

Browse files
authored
Merge pull request #68 from laravelcm/premium-feature
Premium feature
2 parents d7f818a + 06aa986 commit 7072b16

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

51 files changed

+76028
-520
lines changed

README.md

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,6 @@ Groupe Slack: https://laravelcm.slack.com <br />
2323
Nous tenons à remercier ces **entreprises extraordinaires** pour leur parrainage. Si vous souhaitez devenir sponsor, veuillez visiter <a href="https://github.com/sponsors/mckenziearts">la page Laravel.cm Github de Sponsoring</a>.
2424

2525
- **[Laravel Shopper](https://laravelshopper.io)**
26-
- [Localhost Academy](https://localhostkmer.xyz)
27-
- [Lotin Corp](https://lotincorp.biz)
2826

2927
## Caractéristiques Serveur
3028

app/Enums/PlanType.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\Enums;
6+
7+
use BenSampo\Enum\Enum;
8+
9+
final class PlanType extends Enum
10+
{
11+
const DEVELOPER = 'developer';
12+
13+
const ENTERPRISE = 'enterprise';
14+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<?php
2+
3+
namespace App\Http\Controllers\Api;
4+
5+
use App\Http\Controllers\Controller;
6+
use App\Http\Resources\PremiumUserResource;
7+
use App\Models\User;
8+
use Illuminate\Http\JsonResponse;
9+
use Illuminate\Support\Facades\Cache;
10+
11+
class PremiumController extends Controller
12+
{
13+
public function users(): JsonResponse
14+
{
15+
$users = Cache::remember('premium_users', now()->addMonth(), function () {
16+
return User::select('name', 'username')->limit(48)->get();
17+
});
18+
19+
$premium = collect();
20+
21+
foreach ($users->chunk(16) as $key => $usersRow) {
22+
$usersArray[$key] = [];
23+
foreach ($usersRow as $user) {
24+
array_push($usersArray[$key], new PremiumUserResource($user));
25+
}
26+
$premium->push($usersArray[$key]);
27+
}
28+
29+
return response()->json($premium);
30+
}
31+
}

app/Http/Controllers/HomeController.php

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,24 @@
44

55
use App\Models\Article;
66
use App\Models\Discussion;
7+
use App\Models\Premium\Plan;
78
use App\Models\Thread;
89
use GuzzleHttp\Client;
910
use GuzzleHttp\Exception\GuzzleException;
11+
use Illuminate\Database\Eloquent\Builder;
1012
use Illuminate\Http\Request;
1113
use Illuminate\Support\Facades\Cache;
1214

1315
class HomeController extends Controller
1416
{
1517
public function index()
1618
{
19+
$plans = Cache::remember('plans', now()->addYear(), function () {
20+
return Plan::with('features')
21+
->developer()
22+
->get();
23+
});
24+
1725
$latestArticles = Cache::remember('latestArticles', now()->addHour(), function () {
1826
return Article::with('tags')
1927
->published()
@@ -48,7 +56,12 @@ public function index()
4856
->twitterSite('laravelcm')
4957
->withUrl();
5058

51-
return view('home', compact('latestArticles', 'latestThreads', 'latestDiscussions'));
59+
return view('home', compact(
60+
'latestArticles',
61+
'latestThreads',
62+
'latestDiscussions',
63+
'plans'
64+
));
5265
}
5366

5467
public function slack(Request $request)

app/Http/Livewire/Articles/Create.php

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
use App\Traits\WithTagsAssociation;
1212
use Illuminate\Contracts\View\View;
1313
use Illuminate\Support\Facades\Auth;
14-
use Illuminate\Support\Str;
1514
use Livewire\Component;
1615
use Livewire\WithFileUploads;
1716

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?php
2+
3+
namespace App\Http\Resources;
4+
5+
use Illuminate\Http\Resources\Json\JsonResource;
6+
7+
class PremiumUserResource extends JsonResource
8+
{
9+
/**
10+
* Transform the resource into an array.
11+
*
12+
* @param \Illuminate\Http\Request $request
13+
* @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable
14+
*/
15+
public function toArray($request)
16+
{
17+
return [
18+
'name' => $this->name,
19+
'username' => $this->username,
20+
'image' => $this->profile_photo_url,
21+
];
22+
}
23+
}

app/Markdown/MarkdownHelper.php

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,8 @@ public static function parseLiquidTags($html): string
1010

1111
// If we find at least one liquid tag
1212
if (preg_match_all('/{% .* %}/', $html, $matches) && $matches[0]) {
13-
1413
// loop through each of the liquid tags
1514
foreach ($matches[0] as $index => $match) {
16-
1715
// replace multiple spaces with single space
1816
$matchArray = explode(' ', preg_replace('!\s+!', ' ', $match));
1917

app/Models/Premium/Feature.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?php
2+
3+
namespace App\Models\Premium;
4+
5+
use Illuminate\Database\Eloquent\Factories\HasFactory;
6+
use Rinvex\Subscriptions\Models\PlanFeature as Model;
7+
8+
class Feature extends Model
9+
{
10+
use HasFactory;
11+
}

app/Models/Premium/Plan.php

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?php
2+
3+
namespace App\Models\Premium;
4+
5+
use Illuminate\Database\Eloquent\Builder;
6+
use Illuminate\Database\Eloquent\Factories\HasFactory;
7+
use Rinvex\Subscriptions\Models\Plan as Model;
8+
9+
class Plan extends Model
10+
{
11+
use HasFactory;
12+
13+
public function scopeDeveloper(Builder $query): Builder
14+
{
15+
return $query->where('type', \App\Enums\PlanType::DEVELOPER);
16+
}
17+
18+
public function scopeEnterprise(Builder $query): Builder
19+
{
20+
return $query->where('type', \App\Enums\PlanType::ENTERPRISE);
21+
}
22+
}

app/Models/Premium/Subscription.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?php
2+
3+
namespace App\Models\Premium;
4+
5+
use Illuminate\Database\Eloquent\Factories\HasFactory;
6+
use Rinvex\Subscriptions\Models\PlanSubscription as Model;
7+
8+
class Subscription extends Model
9+
{
10+
use HasFactory;
11+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?php
2+
3+
namespace App\Models\Premium;
4+
5+
use Illuminate\Database\Eloquent\Factories\HasFactory;
6+
use Rinvex\Subscriptions\Models\PlanSubscriptionUsage as Model;
7+
8+
class SubscriptionUsage extends Model
9+
{
10+
use HasFactory;
11+
}

app/Models/User.php

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
use Illuminate\Notifications\Notification;
1515
use Illuminate\Support\Facades\Auth;
1616
use QCod\Gamify\Gamify;
17+
use Rinvex\Subscriptions\Traits\HasPlanSubscriptions;
1718
use Spatie\MediaLibrary\HasMedia;
1819
use Spatie\MediaLibrary\InteractsWithMedia;
1920
use Spatie\Permission\Traits\HasRoles;
@@ -23,13 +24,14 @@
2324
*/
2425
class User extends Authenticatable implements MustVerifyEmail, HasMedia
2526
{
26-
use Gamify,
27-
HasFactory,
28-
HasProfilePhoto,
29-
HasRoles,
30-
InteractsWithMedia,
31-
Notifiable,
32-
Reacts;
27+
use Gamify;
28+
use HasFactory;
29+
use HasPlanSubscriptions;
30+
use HasProfilePhoto;
31+
use HasRoles;
32+
use InteractsWithMedia;
33+
use Notifiable;
34+
use Reacts;
3335

3436
/**
3537
* The attributes that are mass assignable.

app/Providers/AppServiceProvider.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,11 @@ class AppServiceProvider extends ServiceProvider
3232
public function register(): void
3333
{
3434
$this->registerBladeDirective();
35+
36+
if ($this->app->environment('local')) {
37+
$this->app->register(\Laravel\Telescope\TelescopeServiceProvider::class);
38+
$this->app->register(TelescopeServiceProvider::class);
39+
}
3540
}
3641

3742
public function boot(): void
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
<?php
2+
3+
namespace App\Providers;
4+
5+
use Illuminate\Support\Facades\Gate;
6+
use Laravel\Telescope\IncomingEntry;
7+
use Laravel\Telescope\Telescope;
8+
use Laravel\Telescope\TelescopeApplicationServiceProvider;
9+
10+
class TelescopeServiceProvider extends TelescopeApplicationServiceProvider
11+
{
12+
/**
13+
* Register any application services.
14+
*
15+
* @return void
16+
*/
17+
public function register()
18+
{
19+
// Telescope::night();
20+
21+
$this->hideSensitiveRequestDetails();
22+
23+
Telescope::filter(function (IncomingEntry $entry) {
24+
if ($this->app->environment('local')) {
25+
return true;
26+
}
27+
28+
return $entry->isReportableException() ||
29+
$entry->isFailedRequest() ||
30+
$entry->isFailedJob() ||
31+
$entry->isScheduledTask() ||
32+
$entry->hasMonitoredTag();
33+
});
34+
}
35+
36+
/**
37+
* Prevent sensitive request details from being logged by Telescope.
38+
*
39+
* @return void
40+
*/
41+
protected function hideSensitiveRequestDetails()
42+
{
43+
if ($this->app->environment('local')) {
44+
return;
45+
}
46+
47+
Telescope::hideRequestParameters(['_token']);
48+
49+
Telescope::hideRequestHeaders([
50+
'cookie',
51+
'x-csrf-token',
52+
'x-xsrf-token',
53+
]);
54+
}
55+
56+
/**
57+
* Register the Telescope gate.
58+
*
59+
* This gate determines who can access Telescope in non-local environments.
60+
*
61+
* @return void
62+
*/
63+
protected function gate()
64+
{
65+
Gate::define('viewTelescope', function ($user) {
66+
return in_array($user->email, [
67+
'monneylobe@gmail.com',
68+
'support@laravel.cm',
69+
'arthur@laravel.cm',
70+
]);
71+
});
72+
}
73+
}

0 commit comments

Comments
 (0)