News letter subscription added

This commit is contained in:
2020-08-22 19:54:40 +05:00
parent 215c14eb14
commit aac9f030cb
7 changed files with 136 additions and 14 deletions

View File

@@ -0,0 +1,29 @@
<?php
namespace App\Http\Controllers\API;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\NewsLetter;
use Illuminate\Http\JsonResponse;
class NewsLetterAPIController extends Controller
{
/**
* Subscribe to the news
*
* @param mixed $request
* @return JsonResponse
*/
public function store(Request $request): JsonResponse
{
NewsLetter::create($request->validate([
"email" => "required|email|unique:news_letters"
], ["email.unique" => "You are already subscribed to our newsletter!"]));
return response()->json([
"status" => "success",
"message" => "You have successfully subscribed to our newsletter!"
]);
}
}

View File

@@ -29,9 +29,9 @@ class TopicsAPIController extends Controller
*/ */
public function show(Topic $topic) public function show(Topic $topic)
{ {
return [ return response()->json([
'topic' => new TopicResource($topic), 'topic' => new TopicResource($topic),
'articles' => $topic->articles()->with('source')->latest('published_date')->paginate(8) 'articles' => $topic->articles()->with('source')->latest('published_date')->paginate(8)
]; ]);
} }
} }

10
app/NewsLetter.php Normal file
View File

@@ -0,0 +1,10 @@
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class NewsLetter extends Model
{
protected $guarded = [];
}

View File

@@ -0,0 +1,32 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateNewsLettersTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('news_letters', function (Blueprint $table) {
$table->id();
$table->string('email');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('news_letters');
}
}

View File

@@ -0,0 +1,59 @@
<template>
<div class="flex flex-row w-2/3 lg:w-1/3">
<div class="flex-col w-full">
<div
class="w-full border border-gray-800 rounded bg-white text-gray-800 p-5 mb-4"
v-if="message"
v-text="message"
>
</div>
<div class="flex w-full">
<input
class="bg-gray-100 h-10 px-2 rounded flex-1"
type="email"
name="email"
v-model="form.email"
placeholder="Subscribe for News Letters"
/>
<button
@click="submit()"
:disabled="form.email == ''"
class="ml-4 text-white h-10 flex items-center justify-center px-4 bg-main-link rounded shadow font-medium"
>
Subscribe
</button>
</div>
</div>
</div>
</template>
<script>
export default {
name: "news-letter",
data() {
return {
form: {
email: ""
},
errors: false,
message: ""
};
},
methods: {
submit() {
axios
.post("/api/newsletter/subscribe", this.form)
.then(response => {
this.message = response.data.message;
})
.catch(error => {
this.errors = true;
this.message = error.response.data.errors.email[0];
});
}
}
};
</script>

View File

@@ -12,18 +12,7 @@
</li> </li>
</ul> </ul>
<div class="flex flex-row w-2/3 lg:w-1/3"> <news-letter></news-letter>
<div class="flex-col w-full">
<div class="flex w-full">
<input class="bg-gray-100 h-10 px-2 rounded flex-1" type="email" name="email"
placeholder="Subscribe for News Letters">
<button
class="ml-4 text-white h-10 flex items-center justify-center px-4 bg-main-link rounded shadow font-medium">
Subscribe
</button>
</div>
</div>
</div>
<div class="py-8 flex"> <div class="py-8 flex">

View File

@@ -6,6 +6,7 @@ use App\Http\Controllers\API\ArticlesAPIController;
use App\Http\Controllers\API\SourcesAPIController; use App\Http\Controllers\API\SourcesAPIController;
use App\Http\Controllers\API\TopicsAPIController; use App\Http\Controllers\API\TopicsAPIController;
use App\Http\Controllers\API\MyListAPIController; use App\Http\Controllers\API\MyListAPIController;
use App\Http\Controllers\API\NewsLetterAPIController;
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
@@ -29,3 +30,5 @@ Route::get('source/{source:slug}',[SourcesAPIController::class, 'show'])->name('
Route::get('article/{article:id}', [ArticlesAPIController::class, 'show'])->name('api.article.show'); Route::get('article/{article:id}', [ArticlesAPIController::class, 'show'])->name('api.article.show');
Route::post('newsletter/subscribe', [NewsLetterAPIController::class, 'store'])->name('api.newsletter.store');