From c1f2af5174ae93e86b0f0712838d4dbeb520808a Mon Sep 17 00:00:00 2001 From: yogesh-gohil Date: Sat, 11 Mar 2023 12:39:48 +0530 Subject: [PATCH] add mail sender crud --- .../GetAllMailSendersController.php | 24 ++++ .../Admin/MailSender/MailSenderController.php | 111 +++++++++++++++++ app/Http/Requests/MailSenderRequest.php | 79 ++++++++++++ app/Http/Resources/MailSenderResource.php | 30 +++++ app/Models/MailSender.php | 77 ++++++++++++ ...03_10_125202_create_mail_senders_table.php | 114 ++++++++++++++++++ routes/api.php | 13 +- 7 files changed, 444 insertions(+), 4 deletions(-) create mode 100644 app/Http/Controllers/V1/Admin/MailSender/GetAllMailSendersController.php create mode 100644 app/Http/Controllers/V1/Admin/MailSender/MailSenderController.php create mode 100644 app/Http/Requests/MailSenderRequest.php create mode 100644 app/Http/Resources/MailSenderResource.php create mode 100644 app/Models/MailSender.php create mode 100644 database/migrations/2023_03_10_125202_create_mail_senders_table.php diff --git a/app/Http/Controllers/V1/Admin/MailSender/GetAllMailSendersController.php b/app/Http/Controllers/V1/Admin/MailSender/GetAllMailSendersController.php new file mode 100644 index 00000000..60cf2659 --- /dev/null +++ b/app/Http/Controllers/V1/Admin/MailSender/GetAllMailSendersController.php @@ -0,0 +1,24 @@ +get(); + + return MailSenderResource::collection($mailSenders); + } +} diff --git a/app/Http/Controllers/V1/Admin/MailSender/MailSenderController.php b/app/Http/Controllers/V1/Admin/MailSender/MailSenderController.php new file mode 100644 index 00000000..9b30ec5b --- /dev/null +++ b/app/Http/Controllers/V1/Admin/MailSender/MailSenderController.php @@ -0,0 +1,111 @@ +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, + ]); + } +} diff --git a/app/Http/Requests/MailSenderRequest.php b/app/Http/Requests/MailSenderRequest.php new file mode 100644 index 00000000..70be59f6 --- /dev/null +++ b/app/Http/Requests/MailSenderRequest.php @@ -0,0 +1,79 @@ + [ + '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(); + } +} diff --git a/app/Http/Resources/MailSenderResource.php b/app/Http/Resources/MailSenderResource.php new file mode 100644 index 00000000..e4b14504 --- /dev/null +++ b/app/Http/Resources/MailSenderResource.php @@ -0,0 +1,30 @@ + $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 + ]; + } +} diff --git a/app/Models/MailSender.php b/app/Models/MailSender.php new file mode 100644 index 00000000..61534a12 --- /dev/null +++ b/app/Models/MailSender.php @@ -0,0 +1,77 @@ + '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; + } +} diff --git a/database/migrations/2023_03_10_125202_create_mail_senders_table.php b/database/migrations/2023_03_10_125202_create_mail_senders_table.php new file mode 100644 index 00000000..4573a593 --- /dev/null +++ b/database/migrations/2023_03_10_125202_create_mail_senders_table.php @@ -0,0 +1,114 @@ +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'); + } +} diff --git a/routes/api.php b/routes/api.php index b81cbd79..76bc69bd 100644 --- a/routes/api.php +++ b/routes/api.php @@ -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);