add mail sender crud

This commit is contained in:
yogesh-gohil
2023-03-11 12:39:48 +05:30
parent 05d5ce26fd
commit c1f2af5174
7 changed files with 444 additions and 4 deletions

View File

@ -0,0 +1,24 @@
<?php
namespace Crater\Http\Controllers\V1\Admin\MailSender;
use Crater\Http\Controllers\Controller;
use Crater\Http\Resources\MailSenderResource;
use Crater\Models\MailSender;
use Illuminate\Http\Request;
class GetAllMailSendersController extends Controller
{
/**
* Handle the incoming request.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function __invoke(Request $request)
{
$mailSenders = MailSender::whereCompany()->get();
return MailSenderResource::collection($mailSenders);
}
}

View File

@ -0,0 +1,111 @@
<?php
namespace Crater\Http\Controllers\V1\Admin\MailSender;
use Crater\Http\Controllers\Controller;
use Crater\Http\Requests\MailSenderRequest;
use Crater\Http\Resources\MailSenderResource;
use Crater\Models\MailSender;
use Illuminate\Http\Request;
class MailSenderController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index(Request $request)
{
$this->authorize('viewAny', MailSender::class);
$limit = $request->has('limit') ? $request->limit : 10;
$mailSenders = MailSender::whereCompany()
->applyFilters($request->all())
->paginateData($limit);
return (MailSenderResource::collection($mailSenders))
->additional(['meta' => [
'mail_sender_total_count' => MailSender::whereCompany()->count(),
]]);
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(MailSenderRequest $request)
{
$this->authorize('create', MailSender::class);
$mailConfiguration = MailSender::where('company_id', $request->header('company'))
->where('is_default', true)
->count();
if ($mailConfiguration > 0 && $request['is_default'] == true) {
return respondJson('default_record_exists', 'Default mail sender already exist');
}
$mailSender = MailSender::createFromRequest($request);
return new MailSenderResource($mailSender);
}
/**
* Display the specified resource.
*
* @param \Crater\Models\SenderMail $senderMail
* @return \Illuminate\Http\Response
*/
public function show(MailSender $mailSender)
{
$this->authorize('view', $mailSender);
return new MailSenderResource($mailSender);
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param \Crater\Models\SenderMail $senderMail
* @return \Illuminate\Http\Response
*/
public function update(MailSenderRequest $request, MailSender $mailSender)
{
$this->authorize('update', $mailSender);
$mailConfiguration = MailSender::where('company_id', $request->header('company'))
->where('is_default', true)
->where('id', '<>', $mailSender->id)
->count();
if ($mailConfiguration > 0 && $request['is_default'] == true) {
return respondJson('default_record_exists', 'Default mail sender already exist');
}
$mailSender->updateFromRequest($request);
return new MailSenderResource($mailSender);
}
/**
* Remove the specified resource from storage.
*
* @param \Crater\Models\SenderMail $senderMail
* @return \Illuminate\Http\Response
*/
public function destroy(MailSender $mailSender)
{
$this->authorize('delete', $mailSender);
$mailSender->delete();
return response()->json([
'success' => true,
]);
}
}

View File

@ -0,0 +1,79 @@
<?php
namespace Crater\Http\Requests;
use Illuminate\Validation\Rule;
use Illuminate\Foundation\Http\FormRequest;
class MailSenderRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return false;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
$rules = [
'name' => [
'required',
Rule::unique('mail_senders')
->where('company_id', $this->header('company'))
],
'driver' => [
'required',
],
'is_default' => [
'nullable'
],
'bcc' => [
'nullable'
],
'cc' => [
'nullable'
],
'from_address' => [
'nullable'
],
'from_name' => [
'nullable'
],
'settings' => [
'nullable'
],
'settings.*' => [
'nullable'
]
];
if ($this->isMethod('PUT')) {
$rules['name'] = [
'nullable',
Rule::unique('mail_senders')
->ignore($this->route('mail_sender')->id)
->where('company_id', $this->header('company'))
];
}
return $rules;
}
public function getMailSenderPayload()
{
return collect($this->validated())
->merge([
'company_id' => $this->header('company'),
])
->toArray();
}
}

View File

@ -0,0 +1,30 @@
<?php
namespace Crater\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
class MailSenderResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable
*/
public function toArray($request)
{
return [
'id' => $this->id,
'name' => $this->name,
'driver' => $this->driver,
'is_default' => $this->is_default,
'bcc' => $this->bcc,
'cc' => $this->cc,
'from_address' => $this->from_address,
'from_name' => $this->from_name,
'company_id' => $this->company_id,
'settings' => $this->settings
];
}
}

77
app/Models/MailSender.php Normal file
View File

@ -0,0 +1,77 @@
<?php
namespace Crater\Models;
use Crater\Http\Requests\MailSenderRequest;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class MailSender extends Model
{
use HasFactory;
protected $guarded = [
'id'
];
protected $casts = [
'settings' => 'array',
'is_default' => 'boolean'
];
public function company()
{
return $this->belongsTo(Company::class);
}
public function setSettingsAttribute($value)
{
$this->attributes['settings'] = json_encode($value);
}
public function scopeWhereOrder($query, $orderByField, $orderBy)
{
$query->orderBy($orderByField, $orderBy);
}
public function scopeApplyFilters($query, array $filters)
{
$filters = collect($filters);
if ($filters->get('orderByField') || $filters->get('orderBy')) {
$field = $filters->get('orderByField') ? $filters->get('orderByField') : 'name';
$orderBy = $filters->get('orderBy') ? $filters->get('orderBy') : 'desc';
$query->whereOrder($field, $orderBy);
}
}
public function scopePaginateData($query, $limit)
{
if ($limit == 'all') {
return $query->get();
}
return $query->paginate($limit);
}
public function scopeWhereCompany($query)
{
$query->where('mail_senders.company_id', request()->header('company'));
}
public static function createFromRequest(MailSenderRequest $request)
{
$senderMail = self::create($request->getMailSenderPayload());
return $senderMail;
}
public function updateFromRequest(MailSenderRequest $request)
{
$data = $request->getMailSenderPayload();
$this->update($data);
return $this;
}
}

View File

@ -0,0 +1,114 @@
<?php
use Crater\Models\Company;
use Crater\Models\MailSender;
use Crater\Models\User;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
use Silber\Bouncer\BouncerFacade;
class CreateMailSendersTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('mail_senders', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('driver');
$table->boolean('is_default')->default(false);
$table->string('bcc')->nullable();
$table->string('cc')->nullable();
$table->string('from_address')->nullable();
$table->string('from_name')->nullable();
$table->json('settings')->nullable();
$table->integer('company_id')->unsigned()->nullable();
$table->foreign('company_id')->references('id')->on('companies');
$table->timestamps();
});
$user = User::where('role', 'super admin')->first();
if ($user) {
$users = User::where('role', 'super admin')->get();
foreach ($users as $user) {
$user->allow('view-mail-sender');
$user->allow('create-mail-sender');
$user->allow('edit-mail-sender');
$user->allow('delete-mail-sender');
BouncerFacade::allow($user)->toOwn(MailSender::class);
}
$companies = Company::all();
$companies->map(function ($company) {
if (env('MAIL_DRIVER') == 'smtp') {
$settings = [
'MAIL_HOST' => env('MAIL_HOST'),
'MAIL_PORT' => env('MAIL_PORT'),
'MAIL_USERNAME' => env('MAIL_USERNAME'),
'MAIL_PASSWORD' => env('MAIL_PASSWORD'),
'MAIL_ENCRYPTION' => env('MAIL_ENCRYPTION')
];
$this->insertData($settings, $company->id);
}
if (env('MAIL_DRIVER') == 'mail' || env('MAIL_DRIVER') == 'sendmail') {
$this->insertData(null, $company->id);
}
if (env('MAIL_DRIVER') == 'mailgun') {
$settings = [
'MAILGUN_DOMAIN' => env('MAILGUN_DOMAIN'),
'MAILGUN_SECRET' => env('MAILGUN_SECRET'),
'MAILGUN_ENDPOINT' => env('MAILGUN_ENDPOINT'),
];
$this->insertData($settings, $company->id);
}
if (env('MAIL_DRIVER') == 'ses') {
$settings = [
'MAIL_HOST' => env('MAIL_HOST'),
'MAIL_PORT' => env('MAIL_PORT'),
'MAIL_ENCRYPTION' => env('MAIL_ENCRYPTION'),
'MAILGUN_DOMAIN' => env('MAILGUN_DOMAIN'),
'SES_KEY' => env('SES_KEY'),
'SES_SECRET' => env('SES_SECRET'),
];
$this->insertData($settings, $company->id);
}
});
}
}
public function insertData($settings, $company_id)
{
$data = [
'name' => env('MAIL_DRIVER'),
'driver' => env('MAIL_DRIVER'),
'is_default' => true,
'from_address' => env('MAIL_FROM_ADDRESS'),
'from_name' => env('MAIL_FROM_NAME'),
'settings' => $settings ?? null,
'company_id' => $company_id
];
MailSender::create($data);
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('mail_senders');
}
}

View File

@ -47,6 +47,8 @@ use Crater\Http\Controllers\V1\Admin\Invoice\SendInvoiceController;
use Crater\Http\Controllers\V1\Admin\Invoice\SendInvoicePreviewController;
use Crater\Http\Controllers\V1\Admin\Item\ItemsController;
use Crater\Http\Controllers\V1\Admin\Item\UnitsController;
use Crater\Http\Controllers\V1\Admin\MailSender\GetAllMailSendersController;
use Crater\Http\Controllers\V1\Admin\MailSender\MailSenderController;
use Crater\Http\Controllers\V1\Admin\Mobile\AuthController;
use Crater\Http\Controllers\V1\Admin\Modules\ApiTokenController;
use Crater\Http\Controllers\V1\Admin\Modules\CompleteModuleInstallationController;
@ -403,11 +405,14 @@ Route::prefix('/v1')->group(function () {
Route::get('/mail/drivers', [MailConfigurationController::class, 'getMailDrivers']);
Route::get('/mail/config', [MailConfigurationController::class, 'getMailEnvironment']);
Route::post('/mail/config', [MailConfigurationController::class, 'saveMailEnvironment']);
Route::post('/mail/test', [MailConfigurationController::class, 'testEmailConfig']);
// Route::get('/mail/config', [MailConfigurationController::class, 'getMailEnvironment']);
// Route::post('/mail/config', [MailConfigurationController::class, 'saveMailEnvironment']);
Route::apiResource('mail-sender', MailSenderController::class);
Route::get('mail-senders', GetAllMailSendersController::class);
Route::get('/company/mail/config', GetCompanyMailConfigurationController::class);