Skip to content

Commit

Permalink
👍 Subscribe email ajax
Browse files Browse the repository at this point in the history
  • Loading branch information
juzaweb committed Dec 29, 2023
1 parent e776624 commit ee5e5b1
Show file tree
Hide file tree
Showing 17 changed files with 168 additions and 78 deletions.
6 changes: 4 additions & 2 deletions changelog.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
### vv1.0.2
### v1.0.3
* :+1: Subscribe ajax

### v1.0.2
* :+1: Subscribe ajax
* :+1: Subscriber management
* :bug: Fix show via
* :+1: Update namespace

5 changes: 5 additions & 0 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,11 @@
"Juzaweb\\Notification\\": "src/"
}
},
"autoload-dev": {
"psr-4": {
"Juzaweb\\Notification\\Tests\\": "tests/"
}
},
"extra": {
"juzaweb": {
"name": "Notification",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,16 @@
public function up(): void
{
Schema::create(
'jw_notification_subscribes',
'jw_notification_email_subscribes',
function (Blueprint $table) {
$table->bigIncrements('id');
$table->uuid();
$table->string('name')->nullable();
$table->string('email')->index();
$table->unsignedBigInteger('site_id')->default(0)->index();
$table->unique(['email', 'site_id']);
$table->unique(['uuid', 'site_id']);
$table->boolean('active')->default(false);
$table->timestamps();
}
);
Expand All @@ -32,6 +35,6 @@ function (Blueprint $table) {
*/
public function down(): void
{
Schema::dropIfExists('jw_notification_subscribes');
Schema::dropIfExists('jw_notification_email_subscribes');
}
};
12 changes: 6 additions & 6 deletions src/Http/Controllers/Backend/SubscribeController.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,18 +16,18 @@
use Juzaweb\Backend\Http\Controllers\Backend\PageController;
use Juzaweb\CMS\Abstracts\DataTable;
use Juzaweb\CMS\Traits\ResourceController;
use Juzaweb\Notification\Http\Datatable\SubscribeDatatable;
use Juzaweb\Notification\Models\Subscribe;
use Juzaweb\Notification\Http\Datatable\EmailSubscribeDatatable;
use Juzaweb\Notification\Models\EmailSubscribe;

class SubscribeController extends PageController
{
use ResourceController;

protected string $viewPrefix = 'jw_notification::subscribe';
protected string $viewPrefix = 'jw_notification::email_subscribe';

protected function getDataTable(...$params): DataTable
{
return new SubscribeDatatable();
return new EmailSubscribeDatatable();
}

protected function validator(array $attributes, ...$params): ValidatorContract
Expand All @@ -38,15 +38,15 @@ protected function validator(array $attributes, ...$params): ValidatorContract
'email' => [
'required',
'email:rfc,dns',
Rule::modelUnique(Subscribe::class, 'email'),
Rule::modelUnique(EmailSubscribe::class, 'email'),
],
]
);
}

protected function getModel(...$params): string
{
return Subscribe::class;
return EmailSubscribe::class;
}

protected function getTitle(...$params): string
Expand Down
16 changes: 10 additions & 6 deletions src/Http/Controllers/Frontend/SubscribeController.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,24 +10,28 @@

namespace Juzaweb\Notification\Http\Controllers\Frontend;

use Illuminate\Http\JsonResponse;
use Illuminate\Http\RedirectResponse;
use Juzaweb\CMS\Http\Controllers\FrontendController;
use Juzaweb\Notification\Http\Requests\SubscribeRequest;
use Juzaweb\Notification\Http\Requests\EmailSubscribeRequest;
use Illuminate\Support\Facades\RateLimiter;
use Juzaweb\Notification\Repositories\SubscribeRepository;
use Juzaweb\Notification\Repositories\EmailSubscribeRepository;

class SubscribeController extends FrontendController
{
public function __construct(protected SubscribeRepository $subscribeRepository)
public function __construct(protected EmailSubscribeRepository $subscribeRepository)
{
}

public function store(SubscribeRequest $request)
public function storeEmail(EmailSubscribeRequest $request): JsonResponse|RedirectResponse
{
$executed = RateLimiter::attempt(
'send-subscribe',
'email-subscribe',
3,
function () use ($request) {
$this->subscribeRepository->create($request->safe()->only(['email', 'name']));
$data = $request->safe()->merge(['active' => true])->toArray();

$this->subscribeRepository->create($data);
}
);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,16 @@
namespace Juzaweb\Notification\Http\Datatable;

use Illuminate\Contracts\Container\BindingResolutionException;
use Illuminate\Contracts\View\Factory;
use Illuminate\Contracts\View\View;
use Illuminate\Database\Eloquent\Builder;
use Juzaweb\CMS\Abstracts\DataTable;
use Juzaweb\CMS\Repositories\Criterias\FilterCriteria;
use Juzaweb\CMS\Repositories\Criterias\SearchCriteria;
use Juzaweb\CMS\Repositories\Criterias\SortCriteria;
use Juzaweb\Notification\Repositories\SubscribeRepository;
use Juzaweb\Notification\Repositories\EmailSubscribeRepository;

class SubscribeDatatable extends DataTable
class EmailSubscribeDatatable extends DataTable
{
/**
* Columns datatable
Expand All @@ -36,6 +38,11 @@ public function columns(): array
'label' => trans('jw_notification::content.name'),
'width' => '25%',
],
'active' => [
'label' => trans('jw_notification::content.name'),
'width' => '15%',
'formatter' => [$this, 'activeFormatter'],
],
'created_at' => [
'label' => trans('Subscribed at'),
'width' => '15%',
Expand All @@ -47,6 +54,14 @@ public function columns(): array
];
}

public function actions(): array
{
$actions = parent::actions();
$actions['activate'] = trans('cms::app.activate');
$actions['inactivate'] = trans('cms::app.inactivate');
return $actions;
}

/**
* Query data datatable
*
Expand All @@ -56,7 +71,7 @@ public function columns(): array
*/
public function query(array $data): Builder
{
return app()->make(SubscribeRepository::class)
return app()->make(EmailSubscribeRepository::class)
->pushCriteria(new SearchCriteria($data))
->pushCriteria(new FilterCriteria($data))
->pushCriteria(new SortCriteria($data))
Expand All @@ -68,9 +83,20 @@ public function bulkActions($action, $ids): void
switch ($action) {
case 'delete':
foreach ($ids as $id) {
app(SubscribeRepository::class)->delete($id);
app(EmailSubscribeRepository::class)->delete($id);
}
break;
case 'activate':
foreach ($ids as $id) {
app(EmailSubscribeRepository::class)->update(['active' => true], $id);
}
}
}

public function activeFormatter($value, $row, $index): Factory|View
{
$status = $row->active ? 'active' : 'inactive';

return view('cms::components.datatable.status', compact('status'));
}
}
32 changes: 12 additions & 20 deletions src/Http/Datatable/NotificationDatatable.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
use Juzaweb\CMS\Abstracts\DataTable;
use Juzaweb\Backend\Models\ManualNotification;
use Juzaweb\CMS\Support\SendNotification;
use Juzaweb\Notification\Jobs\SendNotification as SendNotificationJob;
use Juzaweb\CMS\Jobs\SendNotification as SendNotificationJob;

class NotificationDatatable extends DataTable
{
Expand All @@ -30,10 +30,6 @@ public function columns(): array
return trans('cms::app.all');
}
],
'error' => [
'label' => trans('cms::app.error'),
'width' => '20%',
],
'created_at' => [
'label' => trans('cms::app.created_at'),
'width' => '15%',
Expand All @@ -46,20 +42,16 @@ public function columns(): array
'label' => trans('cms::app.status'),
'width' => '15%',
'formatter' => function ($value, $row, $index) {
switch ($value) {
case 0:
return trans('cms::app.error');
case 1:
return trans('cms::app.sended');
case 2:
return trans('cms::app.pending');
case 3:
return trans('cms::app.sending');
case 4:
return trans('cms::app.unsent');
}
$status = match ($value) {
0 => 'error',
1 => 'sended',
2 => 'pending',
3 => 'sending',
4 => 'unsent',
default => '',
};

return '';
return view('cms::components.datatable.status', ['status' => $status]);
}
]
];
Expand All @@ -81,7 +73,7 @@ public function rowActionsFormatter($value, $row, $index): string

public function query($data): QueryBuilder
{
$query = ManualNotification::query();
$query = ManualNotification::select(['method', 'data', 'created_at', 'status', 'id']);
if ($keyword = Arr::get($data, 'keyword')) {
$query->where(
function (Builder $q) use ($keyword) {
Expand Down Expand Up @@ -115,7 +107,7 @@ public function bulkActions($action, $ids): void
case 'send':
ManualNotification::whereIn('id', $ids)->update(['status' => 2]);

$useMethod = config('notification.method');
$useMethod = config('juzaweb.notification.method');

if (in_array($useMethod, ['sync', 'queue'])) {
foreach ($ids as $id) {
Expand Down
42 changes: 42 additions & 0 deletions src/Http/Requests/EmailSubscribeRequest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
<?php
/**
* JUZAWEB CMS - Laravel CMS for Your Project
*
* @package juzaweb/cms
* @author The Anh Dang
* @link https://juzaweb.com
* @license GNU V2
*/

namespace Juzaweb\Notification\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;
use Juzaweb\Notification\Models\EmailSubscribe;

class EmailSubscribeRequest extends FormRequest
{
public function rules(): array
{
$rules = [
'email' => [
'required',
'email:rfc,dns',
Rule::modelUnique(
EmailSubscribe::class,
'email'
),
],
];

if (get_config('captcha')) {
$rules['g-recaptcha-response'] = [
'bail',
'required',
'recaptcha',
];
}

return $rules;
}
}
26 changes: 0 additions & 26 deletions src/Http/Requests/SubscribeRequest.php

This file was deleted.

12 changes: 9 additions & 3 deletions src/Models/Subscribe.php → src/Models/EmailSubscribe.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,22 @@

use Juzaweb\CMS\Models\Model;
use Juzaweb\CMS\Traits\ResourceModel;
use Juzaweb\CMS\Traits\UseUUIDColumn;

class Subscribe extends Model
class EmailSubscribe extends Model
{
use ResourceModel;
use ResourceModel, UseUUIDColumn;

protected $table = 'jw_notification_subscribes';
protected $table = 'jw_notification_email_subscribes';

protected $fillable = [
'name',
'email',
'active',
];

protected $casts = [
'active' => 'boolean',
];

public function getFieldName(): string
Expand Down
4 changes: 2 additions & 2 deletions src/NotificationAction.php
Original file line number Diff line number Diff line change
Expand Up @@ -50,10 +50,10 @@ public function addAdminMenus(): void
public function addFrontendAjaxs(): void
{
$this->registerFrontendAjax(
'subscribe',
'email-subscribe',
[
'method' => 'POST',
'callback' => [SubscribeController::class, 'store'],
'callback' => [SubscribeController::class, 'storeEmail'],
]
);
}
Expand Down
6 changes: 3 additions & 3 deletions src/Providers/NotificationServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,13 @@
use Juzaweb\CMS\Facades\ActionRegister;
use Juzaweb\Notification\NotificationAction;
use Juzaweb\CMS\Support\ServiceProvider;
use Juzaweb\Notification\Repositories\SubscribeRepository;
use Juzaweb\Notification\Repositories\SubscribeRepositoryEloquent;
use Juzaweb\Notification\Repositories\EmailSubscribeRepository;
use Juzaweb\Notification\Repositories\EmailSubscribeRepositoryEloquent;

class NotificationServiceProvider extends ServiceProvider
{
public array $bindings = [
SubscribeRepository::class => SubscribeRepositoryEloquent::class,
EmailSubscribeRepository::class => EmailSubscribeRepositoryEloquent::class,
];

public function boot(): void
Expand Down
Loading

0 comments on commit ee5e5b1

Please sign in to comment.