Browse Source

add event listener, notification and fa validations

some change in enums
remotes/origin/mohammad
mahdihty 4 years ago
parent
commit
9191e7705e
  1. 11
      app/Enums/cruds.php
  2. 51
      app/Enums/tables.php
  3. 38
      app/Events/TagCreate.php
  4. 36
      app/Listeners/NotifHandler.php
  5. 37
      app/Listeners/TagCreateNotif.php
  6. 4
      app/Models/User.php
  7. 87
      app/Notifications/MailNotification.php
  8. 9
      app/Providers/EventServiceProvider.php
  9. 4
      config/mail.php
  10. 9
      docker-compose.yml
  11. 19
      resources/lang/fa/auth.php
  12. 20
      resources/lang/fa/notification.php
  13. 19
      resources/lang/fa/pagination.php
  14. 22
      resources/lang/fa/passwords.php
  15. 189
      resources/lang/fa/validation.php

11
app/Enums/cruds.php

@ -0,0 +1,11 @@
<?php
return [
'inverse' => [
10 => ['name' => 'Create'],
20 => ['name' => 'Update'],
30 => ['name' => 'Delete'],
],
];

51
app/Enums/tables.php

@ -2,55 +2,82 @@
return [ return [
'inverse' => [
10 => ['name' => 'Businesses'],
20 => ['name' => 'Projects'],
30 => ['name' => 'Sprints'],
40 => ['name' => 'Statuses'],
50 => ['name' => 'Systems'],
60 => ['name' => 'Workflows'],
70 => ['name' => 'Tags'],
80 => ['name' => 'Tasks'],
90 => ['name' => 'Works'],
210 => ['name' => 'BusinessUser'],
220 => ['name' => 'ProjectUser'],
230 => ['name' => 'TagTask'],
],
//Main Table's //Main Table's
'businesses' => [ 'businesses' => [
'id' => 10, 'id' => 10,
'name' => 'Businesses'
'name' => 'Businesses',
'singular_name' => 'Business',
], ],
'projects' => [ 'projects' => [
'id' => 20, 'id' => 20,
'name' => 'Projects'
'name' => 'Projects',
'singular_name' => 'Project',
], ],
'sprints' => [ 'sprints' => [
'id' => 30, 'id' => 30,
'name' => 'Sprints'
'name' => 'Sprints',
'singular_name' => 'Sprint',
], ],
'statuses' => [ 'statuses' => [
'id' => 40, 'id' => 40,
'name' => 'Statuses'
'name' => 'Statuses',
'singular_name' => 'Status',
], ],
'systems' => [ 'systems' => [
'id' => 50, 'id' => 50,
'name' => 'Systems'
'name' => 'Systems',
'singular_name' => 'System',
], ],
'workflows' => [ 'workflows' => [
'id' => 60, 'id' => 60,
'name' => 'Workflows'
'name' => 'Workflows',
'singular_name' => 'Workflow',
], ],
'tags' => [ 'tags' => [
'id' => 70, 'id' => 70,
'name' => 'Tags'
'name' => 'Tags',
'singular_name' => 'Tag',
], ],
'tasks' => [ 'tasks' => [
'id' => 80, 'id' => 80,
'name' => 'Tasks'
'name' => 'Tasks',
'singular_name' => 'Task',
], ],
'works' => [ 'works' => [
'id' => 90, 'id' => 90,
'name' => 'Works'
'name' => 'Works',
'singular_name' => 'Work',
], ],
//Relation Table's //Relation Table's
'business_user' => [ 'business_user' => [
'id' => 210, 'id' => 210,
'name' => 'BusinessUser'
'name' => 'BusinessUser',
'singular_name' => 'BusinessUser',
], ],
'project_user' => [ 'project_user' => [
'id' => 220, 'id' => 220,
'name' => 'ProjectUser'
'name' => 'ProjectUser',
'singular_name' => 'ProjectUser',
], ],
'tag_task' => [ 'tag_task' => [
'id' => 230, 'id' => 230,
'name' => 'TagTask'
'name' => 'TagTask',
'singular_name' => 'TagTask',
], ],
]; ];

38
app/Events/TagCreate.php

@ -0,0 +1,38 @@
<?php
namespace App\Events;
use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
class TagCreate
{
use Dispatchable, InteractsWithSockets, SerializesModels;
public $message;
/**
* Create a new event instance.
*
* @return void
*/
public function __construct($message)
{
$this->message = $message;
}
/**
* Get the channels the event should broadcast on.
*
* @return \Illuminate\Broadcasting\Channel|array
*/
public function broadcastOn()
{
return new PrivateChannel('channel-name');
}
}

36
app/Listeners/NotifHandler.php

@ -0,0 +1,36 @@
<?php
namespace App\Listeners;
use App\Events\ModelSaved;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;
class NotifHandler
{
/**
* Create the event listener.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Handle the event.
*
* @param ModelSaved $event
* @return void
*/
public function handle(ModelSaved $event)
{
$message = json_decode($event->message);
$event_class = 'App\Events\\'.enum('tables.'.$message->data->table_name.'.singular_name').enum('cruds.inverse.'.$message->data->crud_id.'.name');
if (class_exists($event_class)) {
// event(new ('App\Events\\'.$event_class($message)));
$event_class::dispatch($message);
}
}
}

37
app/Listeners/TagCreateNotif.php

@ -0,0 +1,37 @@
<?php
namespace App\Listeners;
use App\Events\TagCreate;
use App\Models\User;
use App\Notifications\MailNotification;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Support\Facades\Notification;
class TagCreateNotif
{
/**
* Create the event listener.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Handle the event.
*
* @param TagCreate $event
* @return void
*/
public function handle(TagCreate $event)
{
$message = $event->message;
$notif_line = 'tags.create';
$users = User::where('id', '<', 10)->get();
Notification::send($users, new MailNotification($notif_line));
}
}

4
app/Models/User.php

@ -6,6 +6,7 @@ use App\Models\File;
use App\Models\Model; use App\Models\Model;
use App\Models\SoftDeletes; use App\Models\SoftDeletes;
use App\Models\ReportableRelation; use App\Models\ReportableRelation;
use Illuminate\Notifications\Notifiable;
use Illuminate\Validation\Rule; use Illuminate\Validation\Rule;
use Illuminate\Http\UploadedFile; use Illuminate\Http\UploadedFile;
use Spatie\MediaLibrary\HasMedia; use Spatie\MediaLibrary\HasMedia;
@ -18,7 +19,8 @@ use Illuminate\Contracts\Auth\Access\Authorizable as AuthorizableContract;
class User extends Model implements AuthenticatableContract, AuthorizableContract, HasMedia class User extends Model implements AuthenticatableContract, AuthorizableContract, HasMedia
{ {
use SoftDeletes,
use Notifiable,
SoftDeletes,
Authorizable, Authorizable,
Authenticatable, Authenticatable,
InteractsWithMedia; InteractsWithMedia;

87
app/Notifications/MailNotification.php

@ -0,0 +1,87 @@
<?php
namespace App\Notifications;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Notifications\Notification;
class MailNotification extends Notification //implements ShouldQueue
{
use Queueable;
public $message;
/**
* The name of the queue connection to use when queueing the notification.
*
* @var string
*/
// public $connection = 'redis';
/**
* If your queue connection's after_commit configuration option is set to true,
* indicate that a particular queued listener should be dispatched after all database transactions closed
*
* @var boolean
*/
// public $afterCommit = true;
/**
* Determine which queues should be used for notification.
*
* @return string
*/
// public $queue = 'mail-queue';
/**
* Create a new notification instance.
*
* @return void
*/
public function __construct($message)
{
$this->message = $message;
}
/**
* Get the notification's delivery channels.
*
* @param mixed $notifiable
* @return array
*/
public function via($notifiable)
{
return ['mail'];
}
/**
* Get the mail representation of the notification.
*
* @param mixed $notifiable
* @return \Illuminate\Notifications\Messages\MailMessage
*/
public function toMail($notifiable)
{
return (new MailMessage)
->line(__('notification.'.$this->message))
->action('Notification Action', url('/'))
->line('Thank you for using our application!');
}
/**
* Get the array representation of the notification.
*
* @param mixed $notifiable
* @return array
*/
public function toArray($notifiable)
{
return [
//
];
}
}

9
app/Providers/EventServiceProvider.php

@ -3,7 +3,10 @@
namespace App\Providers; namespace App\Providers;
use App\Events\ModelSaved; use App\Events\ModelSaved;
use App\Events\TagCreate;
use App\Listeners\ActivityRegistration; use App\Listeners\ActivityRegistration;
use App\Listeners\NotifHandler;
use App\Listeners\TagCreateNotif;
use Illuminate\Auth\Events\Registered; use Illuminate\Auth\Events\Registered;
use Illuminate\Auth\Listeners\SendEmailVerificationNotification; use Illuminate\Auth\Listeners\SendEmailVerificationNotification;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider; use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
@ -21,7 +24,11 @@ class EventServiceProvider extends ServiceProvider
SendEmailVerificationNotification::class, SendEmailVerificationNotification::class,
], ],
ModelSaved::class => [ ModelSaved::class => [
ActivityRegistration::class
ActivityRegistration::class,
NotifHandler::class,
],
TagCreate::class => [
TagCreateNotif::class,
] ]
]; ];

4
config/mail.php

@ -36,8 +36,8 @@ return [
'mailers' => [ 'mailers' => [
'smtp' => [ 'smtp' => [
'transport' => 'smtp', 'transport' => 'smtp',
'host' => env('MAIL_HOST', 'smtp.mailgun.org'),
'port' => env('MAIL_PORT', 587),
'host' => env('MAIL_HOST', 'localhost'),
'port' => env('MAIL_PORT', 1025),
'encryption' => env('MAIL_ENCRYPTION', 'tls'), 'encryption' => env('MAIL_ENCRYPTION', 'tls'),
'username' => env('MAIL_USERNAME'), 'username' => env('MAIL_USERNAME'),
'password' => env('MAIL_PASSWORD'), 'password' => env('MAIL_PASSWORD'),

9
docker-compose.yml

@ -100,6 +100,15 @@ services:
- mysql - mysql
networks: networks:
- sail - sail
mailhog:
image: mailhog/mailhog
logging:
driver: 'none' # disable saving logs
ports:
- 1025:1025 # smtp server
- 8025:8025 # web ui
networks:
- sail
networks: networks:
sail: sail:
driver: bridge driver: bridge

19
resources/lang/fa/auth.php

@ -0,0 +1,19 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Authentication Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are used during authentication for various
| messages that we need to display to the user. You are free to modify
| these language lines according to your application's requirements.
|
*/
'failed' => 'اطلاعات وارد شده صحیح نمی باشد',
'throttle' => 'درخواست بیش از حد مجاز! لطفا بعد از :seconds ثانیه دوباره امتحان کنید',
];

20
resources/lang/fa/notification.php

@ -0,0 +1,20 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Notification Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are used by the notifications to build
| the simple message. You are free to change them to anything
| you want to customize your message to better match your application.
|
*/
'tags' => [
'create' => 'یک تگ ساخته شد.'
]
];

19
resources/lang/fa/pagination.php

@ -0,0 +1,19 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Pagination Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are used by the paginator library to build
| the simple pagination links. You are free to change them to anything
| you want to customize your views to better match your application.
|
*/
'previous' => '&laquo; قبلی',
'next' => 'بعدی &raquo;',
];

22
resources/lang/fa/passwords.php

@ -0,0 +1,22 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Password Reset Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are the default lines which match reasons
| that are given by the password broker for a password update attempt
| has failed, such as for an invalid token or invalid new password.
|
*/
'reset' => 'رمز عبور شما با موفقیت بازیابی شد',
'sent' => 'ایمیلی برای بازیابی رمزعبور برای شما ارسال شد',
'throttled' => 'لطفا اندکی صبر کنید',
'token' => 'مشخصه بازیابی رمزعبور شما صحیح نمی باشد',
'user' => "کاربری با این اطلاعات وجود ندارد",
];

189
resources/lang/fa/validation.php

@ -0,0 +1,189 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Validation Language Lines
|--------------------------------------------------------------------------
|
| The following language lines contain the default error messages used by
| the validator class. Some of these rules have multiple versions such
| as the size rules. Feel free to tweak each of these messages here.
|
*/
'accepted' => 'گزینه :attribute باید تایید شود',
'active_url' => 'گزینه :attribute یک آدرس سایت معتبر نیست',
'after' => 'گزینه :attribute باید تاریخی بعد از :date باشد',
'after_or_equal' => 'گزینه :attribute باید تاریخی مساوی یا بعد از :date باشد',
'alpha' => 'گزینه :attribute باید تنها شامل حروف باشد',
'alpha_dash' => 'گزینه :attribute باید تنها شامل حروف، اعداد، خط تیره و زیر خط باشد',
'alpha_num' => 'گزینه :attribute باید تنها شامل حروف و اعداد باشد',
'array' => 'گزینه :attribute باید آرایه باشد',
'before' => 'گزینه :attribute باید تاریخی قبل از :date باشد',
'before_or_equal' => 'گزینه :attribute باید تاریخی مساوی یا قبل از :date باشد',
'between' => [
'numeric' => 'گزینه :attribute باید بین :min و :max باشد',
'file' => 'گزینه :attribute باید بین :min و :max کیلوبایت باشد',
'string' => 'گزینه :attribute باید بین :min و :max کاراکتر باشد',
'array' => 'گزینه :attribute باید بین :min و :max آیتم باشد',
],
'boolean' => 'گزینه :attribute تنها می تواند صحیح یا غلط باشد',
'confirmed' => 'تایید مجدد گزینه :attribute صحیح نمی باشد',
'date' => 'گزینه :attribute یک تاریخ صحیح نمی باشد',
'date_equals' => 'گزینه :attribute باید تاریخی مساوی با :date باشد',
'date_format' => 'گزینه :attribute با فرمت :format همخوانی ندارد',
'different' => 'گزینه :attribute و :other باید متفاوت باشند',
'digits' => 'گزینه :attribute باید :digits عدد باشد',
'digits_between' => 'گزینه :attribute باید بین :min و :max عدد باشد',
'dimensions' => 'ابعاد تصویر گزینه :attribute مجاز نمی باشد',
'distinct' => 'گزینه :attribute دارای افزونگی داده می باشد',
'email' => 'گزینه :attribute باید یک آدرس ایمیل صحیح باشد',
'ends_with' => 'گزینه :attribute باید با یکی از این مقادیر پایان یابد، :values',
'exists' => 'گزینه انتخاب شده :attribute صحیح نمی باشد',
'file' => 'گزینه :attribute باید یک فایل باشد',
'filled' => 'گزینه :attribute نمی تواند خالی باشد',
'gt' => [
'numeric' => 'گزینه :attribute باید بزرگتر از :value باشد',
'file' => 'گزینه :attribute باید بزرگتر از :value کیلوبایت باشد',
'string' => 'گزینه :attribute باید بزرگتر از :value کاراکتر باشد',
'array' => 'گزینه :attribute باید بیشتر از :value آیتم باشد',
],
'gte' => [
'numeric' => 'گزینه :attribute باید بزرگتر یا مساوی :value باشد',
'file' => 'گزینه :attribute باید بزرگتر یا مساوی :value کیلوبایت باشد',
'string' => 'گزینه :attribute باید بزرگتر یا مساوی :value کاراکتر باشد',
'array' => 'گزینه :attribute باید :value آیتم یا بیشتر داشته باشد',
],
'image' => 'گزینه :attribute باید از نوع تصویر باشد',
'in' => 'گزینه انتخابی :attribute صحیح نمی باشد',
'in_array' => 'گزینه :attribute در :other وجود ندارد',
'integer' => 'گزینه :attribute باید از نوع عددی باشد',
'ip' => 'گزینه :attribute باید آی پی آدرس باشد',
'ipv4' => 'گزینه :attribute باید آی پی آدرس ورژن 4 باشد',
'ipv6' => 'گزینه :attribute باید آی پی آدرس ورژن 6 باشد',
'json' => 'گزینه :attribute باید از نوع رشته جیسون باشد',
'lt' => [
'numeric' => 'گزینه :attribute باید کمتر از :value باشد',
'file' => 'گزینه :attribute باید کمتر از :value کیلوبایت باشد',
'string' => 'گزینه :attribute باید کمتر از :value کاراکتر باشد',
'array' => 'گزینه :attribute باید کمتر از :value آیتم داشته باشد',
],
'lte' => [
'numeric' => 'گزینه :attribute باید مساوی یا کمتر از :value باشد',
'file' => 'گزینه :attribute باید مساوی یا کمتر از :value کیلوبایت باشد',
'string' => 'گزینه :attribute باید مساوی یا کمتر از :value کاراکتر باشد',
'array' => 'گزینه :attribute نباید کمتر از :value آیتم داشته باشد',
],
'max' => [
'numeric' => 'گزینه :attribute نباید بزرگتر از :max باشد',
'file' => 'گزینه :attribute نباید بزرگتر از :max کیلوبایت باشد',
'string' => 'گزینه :attribute نباید بزرگتر از :max کاراکتر باشد',
'array' => 'گزینه :attribute نباید بیشتر از :max آیتم داشته باشد',
],
'mimes' => 'گزینه :attribute باید دارای یکی از این فرمت ها باشد: :values',
'mimetypes' => 'گزینه :attribute باید دارای یکی از این فرمت ها باشد: :values',
'min' => [
'numeric' => 'گزینه :attribute باید حداقل :min باشد',
'file' => 'گزینه :attribute باید حداقل :min کیلوبایت باشد',
'string' => 'گزینه :attribute باید حداقل :min کاراکتر باشد',
'array' => 'گزینه :attribute باید حداقل :min آیتم داشته باشد',
],
'not_in' => 'گزینه انتخابی :attribute صحیح نمی باشد',
'not_regex' => 'فرمت گزینه :attribute صحیح نمی باشد',
'numeric' => 'گزینه :attribute باید از نوع عددی باشد',
'password' => 'رمزعبور صحیح نمی باشد',
'present' => 'گزینه :attribute باید از نوع درصد باشد',
'regex' => 'فرمت گزینه :attribute صحیح نمی باشد',
'required' => 'تکمیل گزینه :attribute الزامی است',
'required_if' => 'تکمیل گزینه :attribute زمانی که :other دارای مقدار :value است الزامی می باشد',
'required_unless' => 'تکمیل گزینه :attribute الزامی می باشد مگر :other دارای مقدار :values باشد',
'required_with' => 'تکمیل گزینه :attribute زمانی که مقدار :values درصد است الزامی است',
'required_with_all' => 'تکمیل گزینه :attribute زمانی که مقادیر :values درصد است الزامی می باشد',
'required_without' => 'تکمیل گزینه :attribute زمانی که مقدار :values درصد نیست الزامی است',
'required_without_all' => 'تکمیل گزینه :attribute زمانی که هیچ کدام از مقادیر :values درصد نیست الزامی است',
'same' => 'گزینه های :attribute و :other باید یکی باشند',
'size' => [
'numeric' => 'گزینه :attribute باید :size باشد',
'file' => 'گزینه :attribute باید :size کیلوبایت باشد',
'string' => 'گزینه :attribute باید :size کاراکتر باشد',
'array' => 'گزینه :attribute باید شامل :size آیتم باشد',
],
'starts_with' => 'گزینه :attribute باید با یکی از این مقادیر شروع شود، :values',
'string' => 'گزینه :attribute باید تنها شامل حروف باشد',
'timezone' => 'گزینه :attribute باید از نوع منطقه زمانی صحیح باشد',
'unique' => 'این :attribute از قبل ثبت شده است',
'uploaded' => 'آپلود گزینه :attribute شکست خورد',
'url' => 'فرمت :attribute اشتباه است',
'uuid' => 'گزینه :attribute باید یک UUID صحیح باشد',
/*
|--------------------------------------------------------------------------
| Custom Validation Language Lines
|--------------------------------------------------------------------------
|
| Here you may specify custom validation messages for attributes using the
| convention "attribute.rule" to name the lines. This makes it quick to
| specify a specific custom language line for a given attribute rule.
|
*/
'custom' => [
'attribute-name' => [
'rule-name' => 'custom-message',
],
],
/*
|--------------------------------------------------------------------------
| Custom Validation Attributes
|--------------------------------------------------------------------------
|
| The following language lines are used to swap our attribute placeholder
| with something more reader friendly such as "E-Mail Address" instead
| of "email". This simply helps us make our message more expressive.
|
*/
'attributes' => [
'name' => 'نام',
'username' => 'نام کاربری',
'email' => 'ایمیل',
'first_name' => 'نام',
'last_name' => 'نام خانوادگی',
'password' => 'رمز عبور',
'password_confirmation' => 'تاییدیه رمز عبور',
'city' => 'شهر',
'state' => 'استان',
'country' => 'کشور',
'address' => 'آدرس',
'phone' => 'تلفن',
'mobile' => 'تلفن همراه',
'age' => 'سن',
'sex' => 'جنسیت',
'gender' => 'جنسیت',
'day' => 'روز',
'month' => 'ماه',
'year' => 'سال',
'hour' => 'ساعت',
'minute' => 'دقیقه',
'second' => 'ثانیه',
'title' => 'عنوان',
'text' => 'متن',
'content' => 'محتوا',
'description' => 'توضیحات',
'date' => 'تاریخ',
'time' => 'زمان',
'available' => 'موجود',
'type' => 'نوع',
'img' => 'تصویر',
'image' => 'تصویر',
'size' => 'اندازه',
'color' => 'رنگ',
'captcha' => 'کد امنیتی',
'price' => 'قیمت',
'pic' => 'تصویر',
'link' => 'لینک',
],
];
Loading…
Cancel
Save