Skip to content

Commit

Permalink
Merge pull request #109 from alimranahmed/feature/81-redesign-using-t…
Browse files Browse the repository at this point in the history
…ailwind

Feature/81 redesign using tailwind
  • Loading branch information
alimranahmed authored Jul 8, 2021
2 parents 37a5a89 + 49490c8 commit ae2607b
Show file tree
Hide file tree
Showing 109 changed files with 115,113 additions and 4,582 deletions.
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
name: Laravel
name: Build and Test

on:
push:
Expand Down
1 change: 1 addition & 0 deletions .phpunit.result.cache
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
C:37:"PHPUnit\Runner\DefaultTestResultCache":4106:{a:2:{s:7:"defects";a:35:{s:42:"Tests\Unit\ArticleTest::testPublishedScope";i:4;s:43:"Tests\Unit\ArticleTest::testNotDeletedScope";i:4;s:53:"Tests\Unit\ArticleTest::testPublishedAtHumanAttribute";i:4;s:51:"Tests\Unit\ArticleTest::testCreatedAtHumanAttribute";i:4;s:51:"Tests\Unit\ArticleTest::testUpdatedAtHumanAttribute";i:4;s:49:"Tests\Unit\ArticleTest::testCategoryNameAttribute";i:4;s:47:"Tests\Unit\CategoryTest::testCreatedAtAttribute";i:4;s:40:"Tests\Unit\CategoryTest::testActiveScope";i:4;s:41:"Tests\Unit\CategoryTest::testNonEmptyOnly";i:4;s:42:"Tests\Unit\CommentTest::testPublishedScope";i:4;s:41:"Tests\Unit\CommentTest::testNoRepliesTest";i:4;s:51:"Tests\Unit\CommentTest::testCreatedAtHumanAttribute";i:4;s:53:"Tests\Unit\CommentTest::testPublishedAtHumanAttribute";i:4;s:30:"Tests\Unit\ConfigTest::testGet";i:4;s:39:"Tests\Unit\ConfigTest::testAllFormatted";i:4;s:52:"Tests\Unit\FeedbackTest::testCreatedAtHumanAttribute";i:4;s:46:"Tests\Unit\HitLoggerTest::testCountryAttribute";i:4;s:43:"Tests\Unit\HitLoggerTest::testCityAttribute";i:4;s:51:"Tests\Unit\KeywordTest::testCreatedAtHumanAttribute";i:4;s:41:"Tests\Unit\KeywordTest::testGetArticleIds";i:3;s:40:"Tests\Unit\ReaderTest::testVerifiedScope";i:4;s:42:"Tests\Unit\ReaderTest::testSubscribedScope";i:4;s:36:"Tests\Feature\ArticleTest::testIndex";i:3;s:44:"Tests\Feature\ArticleTest::testShowPublished";i:3;s:50:"Tests\Feature\ArticleTest::testHideShowUnpublished";i:4;s:36:"Tests\Feature\CommentTest::testStore";i:3;s:46:"Tests\Feature\CommentTest::testStoreValidation";i:4;s:45:"Tests\Feature\CommentTest::testConfirmComment";i:4;s:37:"Tests\Feature\FeedbackTest::testStore";i:3;s:36:"Tests\Feature\PageTest::testHomePage";i:3;s:37:"Tests\Feature\PageTest::testLoginPage";i:3;s:40:"Tests\Feature\UserTest::testUserCanLogin";i:4;s:37:"Tests\Feature\UserTest::testSubscribe";i:3;s:39:"Tests\Feature\UserTest::testUnsubscribe";i:4;s:47:"Tests\Feature\UserTest::testConfirmSubscription";i:4;}s:5:"times";a:36:{s:42:"Tests\Unit\ArticleTest::testPublishedScope";d:1.221;s:43:"Tests\Unit\ArticleTest::testNotDeletedScope";d:0.097;s:53:"Tests\Unit\ArticleTest::testPublishedAtHumanAttribute";d:0.096;s:51:"Tests\Unit\ArticleTest::testCreatedAtHumanAttribute";d:0.084;s:51:"Tests\Unit\ArticleTest::testUpdatedAtHumanAttribute";d:0.079;s:49:"Tests\Unit\ArticleTest::testCategoryNameAttribute";d:0.117;s:47:"Tests\Unit\CategoryTest::testCreatedAtAttribute";d:0.024;s:40:"Tests\Unit\CategoryTest::testActiveScope";d:0.028;s:41:"Tests\Unit\CategoryTest::testNonEmptyOnly";d:0.112;s:42:"Tests\Unit\CommentTest::testPublishedScope";d:0.095;s:41:"Tests\Unit\CommentTest::testNoRepliesTest";d:0.083;s:51:"Tests\Unit\CommentTest::testCreatedAtHumanAttribute";d:0.1;s:53:"Tests\Unit\CommentTest::testPublishedAtHumanAttribute";d:0.149;s:30:"Tests\Unit\ConfigTest::testGet";d:0.031;s:39:"Tests\Unit\ConfigTest::testAllFormatted";d:0.034;s:52:"Tests\Unit\FeedbackTest::testCreatedAtHumanAttribute";d:0.034;s:33:"Tests\Unit\GeoIpTest::testExample";d:0.024;s:46:"Tests\Unit\HitLoggerTest::testCountryAttribute";d:0.218;s:43:"Tests\Unit\HitLoggerTest::testCityAttribute";d:0.088;s:51:"Tests\Unit\KeywordTest::testCreatedAtHumanAttribute";d:0.133;s:41:"Tests\Unit\KeywordTest::testGetArticleIds";d:0.154;s:40:"Tests\Unit\ReaderTest::testVerifiedScope";d:0.148;s:42:"Tests\Unit\ReaderTest::testSubscribedScope";d:0.1;s:36:"Tests\Feature\ArticleTest::testIndex";d:0.385;s:44:"Tests\Feature\ArticleTest::testShowPublished";d:0.171;s:50:"Tests\Feature\ArticleTest::testHideShowUnpublished";d:0.126;s:36:"Tests\Feature\CommentTest::testStore";d:0.101;s:46:"Tests\Feature\CommentTest::testStoreValidation";d:0.085;s:45:"Tests\Feature\CommentTest::testConfirmComment";d:0.081;s:37:"Tests\Feature\FeedbackTest::testStore";d:0.031;s:36:"Tests\Feature\PageTest::testHomePage";d:0.034;s:37:"Tests\Feature\PageTest::testLoginPage";d:0.032;s:40:"Tests\Feature\UserTest::testUserCanLogin";d:0.183;s:37:"Tests\Feature\UserTest::testSubscribe";d:0.08;s:39:"Tests\Feature\UserTest::testUnsubscribe";d:0.079;s:47:"Tests\Feature\UserTest::testConfirmSubscription";d:0.078;}}}
16 changes: 0 additions & 16 deletions .travis.yml

This file was deleted.

5 changes: 5 additions & 0 deletions app/Helpers/helpers.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,8 @@ function assoc2JsonArray(array $associativeArray): string
}
return json_encode($arrayElements);
}

function exceptionLine(Exception $e): string
{
return $e->getLine() . ': ' . $e->getFile() . ' ' . $e->getMessage();
}
27 changes: 7 additions & 20 deletions app/Http/Controllers/ArticleController.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,29 +20,16 @@ class ArticleController extends Controller
public function index(Request $request)
{
$articles = Article::getPaginate($request);
return view('frontend.articles', compact('articles'));
return view("frontend.articles.index", compact('articles'));
}

public function show($articleId, $articleHeading = '')
{
$article = Article::where('id', $articleId)
->published()
->notDeleted()
->with(
[
'user',
'category',
'keywords',
'comments' => function ($comments) {
return $comments->published();
},
'comments.user',
'comments.replies' => function ($replies) {
return $replies->published();
},
'comments.replies.user'
]
)->first();
->with(['user', 'category', 'keywords',])
->first();

if (is_null($article)) {
return redirect()->route('home')->with('warningMsg', 'Article not found');
Expand All @@ -55,7 +42,7 @@ public function show($articleId, $articleHeading = '')

$relatedArticles = $this->getRelatedArticles($article);

return view('frontend.article', compact('article', 'relatedArticles'));
return view("frontend.articles.show", compact('article', 'relatedArticles'));
}

private function isEditable(Article $article)
Expand Down Expand Up @@ -207,14 +194,14 @@ public function search(Request $request)
->where('heading', 'LIKE', "%$queryString%")
->orWhere('content', 'LIKE', "%$queryString%")
->latest()
->paginate(config('view.item_per_page'));
->paginate(config('blog.item_per_page'));

$articles->setPath(url("search/?query_string=$queryString"));

$searched = new \stdClass();
$searched->articles = $articles;
$searched->query = $queryString;
return view('frontend.search_result', compact('searched'));
return view("frontend.articles.search_result", compact('searched'));
}

public function adminArticles()
Expand All @@ -231,7 +218,7 @@ public function adminArticles()
$articles = $articles->where('category_id', request('category'));
}

$articles = $articles->paginate(config('view.item_per_page'));
$articles = $articles->paginate(config('blog.item_per_page'));

return view('backend.articleList', compact('articles'));
}
Expand Down
2 changes: 1 addition & 1 deletion app/Http/Controllers/CategoryController.php
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ public function getArticles(Request $request, $categoryAlias)
{
$articles = Article::getPaginate($request);

return view('frontend.articles', compact('articles'));
return view("frontend.articles.index", compact('articles'));
}

public function destroy($categoryId)
Expand Down
72 changes: 2 additions & 70 deletions app/Http/Controllers/CommentController.php
Original file line number Diff line number Diff line change
Expand Up @@ -30,84 +30,16 @@ public function index()
->with('article', 'user', 'replies')
->latest()
->noReplies()
->paginate(config('view.item_per_page'));
->paginate(config('blog.item_per_page'));
} else {
$comments = Comment::with('article', 'user', 'replies')
->latest()
->noReplies()
->paginate(config('view.item_per_page'));
->paginate(config('blog.item_per_page'));
}
return view('backend.commentList', compact('comments'));
}

public function store(CommentRequest $request, $articleId)
{
$article = Article::find($articleId);
if (is_null($article)) {
return response()->json(['errorMsg' => 'Article not found'], Response::HTTP_NOT_FOUND);
}

if (!$article->is_comment_enabled) {
return response()->json(
['errorMsg' => 'Comment is not allowed for this article'],
Response::HTTP_FORBIDDEN
);
}

$clientIP = $_SERVER['REMOTE_ADDR'] ?? '';
$newComment = $request->only('content', 'parent_comment_id');
$newAddress = ['ip' => $clientIP];
try {
DB::beginTransaction();
//Create new address
$newAddress = Address::create($newAddress);
//Create new comment
$newComment['address_id'] = $newAddress->id;
$newComment['article_id'] = $articleId;
$newComment['token'] = \Hash::make($newComment['content']);
$newComment['is_published'] = 0;

$newUser = User::where('email', $request->get('email'))->first();
if (is_null($newUser)) {
$newUser = $request->only('email');
$newUser = User::create($newUser);
$newUser->assignRole(Role::where('name', 'reader')->first());

$newUser->reader()->create(['notify' => $request->has('notify'),]);
} elseif ($newUser->isReader()) {
$newUser->reader->update(['notify' => $request->has('notify')]);
}
if ($request->has('name')) {
$newUser->name = $request->get('name');
}
$newUser->last_ip = $clientIP;
$newUser->token = Hash::make($newComment['content']);
$newUser->save();
$newComment['user_id'] = $newUser->id;
$newComment = Comment::create($newComment);
Article::where('id', $articleId)->increment('comment_count');

DB::commit();
//$this->dispatch(new SendConfirmCommentMail($newComment));
} catch (\Exception $e) {
Log::error($this->getLogMsg($e));
return response()->json(['errorMsg' => $this->getMessage($e)], Response::HTTP_INTERNAL_SERVER_ERROR);
}

$comments = Comment::where('article_id', $articleId)
->published()
->noReplies()
->get();

//event(new CommentOnArticle('New comment posted!'));
Mail::to($request->get('email'))->queue(new CommentConfirmation($newComment));

Mail::to(Config::get('admin_email'))
->queue(new NotifyAdmin($newComment, route('get-article', $articleId)));

return view('frontend._comments', compact('comments', 'article'));
}

public function update(Request $request, $commentId)
{
$comment = Comment::find($commentId);
Expand Down
8 changes: 8 additions & 0 deletions app/Http/Controllers/Controller.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,14 @@ class Controller extends BaseController
{
use AuthorizesRequests, DispatchesJobs, ValidatesRequests;

protected $frontView;

public function __construct()
{
$frontendDesign = config('blog.frontend_design');
$this->frontView = "frontend.{$frontendDesign}";
}

public function getMessage(\Exception $e, $msg = null)
{
if ($e instanceof ValidationException) {
Expand Down
2 changes: 1 addition & 1 deletion app/Http/Controllers/FeedbackController.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ class FeedbackController extends Controller
{
public function index()
{
$feedbacks = Feedback::where('is_closed', 0)->paginate(config('view.item_per_page'));
$feedbacks = Feedback::where('is_closed', 0)->paginate(config('blog.item_per_page'));
return view('backend.feedbackList', compact('feedbacks'));
}

Expand Down
3 changes: 1 addition & 2 deletions app/Http/Controllers/HomeController.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,7 @@ public function index(Request $request)
$dashboard = new DashboardController();
return $dashboard->index();
} else {
$articles = Article::getPaginate($request);
return view('frontend.articles', compact('articles'));
return (new ArticleController())->index($request);
}
}
}
2 changes: 1 addition & 1 deletion app/Http/Controllers/KeywordController.php
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,6 @@ public function getArticles(Request $request, $keywordName)
{
$articles = Article::getPaginate($request);

return view('frontend.articles', compact('articles'));
return view("frontend.articles.index", compact('articles'));
}
}
38 changes: 38 additions & 0 deletions app/Http/Controllers/SubscriptionController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
<?php

namespace App\Http\Controllers;

use App\Models\Subscriber;
use Illuminate\Http\Request;

class SubscriptionController extends Controller
{
public function confirm(Request $request)
{
$this->validate($request, ['token' => 'required']);

$subscriber = Subscriber::where('token', $request->token)->first();

if (is_null($subscriber)) {
return redirect()->route('home')->with('error', 'Invalid request');
}

$subscriber->update(['verified_at' => now()]);

return redirect()->route('home')->with('success', 'Congratulation, we are connected now!');
}

public function unsubscribe(Request $request)
{
$this->validate($request, ['token' => 'required']);

$subscriber = Subscriber::where('token', $request->token)->first();

if (is_null($subscriber)) {
return redirect()->route('home')->with('errorMsg', 'Invalid request');
}

$subscriber->update(['unsubscribed_at' => now()]);
return redirect()->route('home')->with('successMsg', 'You have unsubscribed');
}
}
87 changes: 1 addition & 86 deletions app/Http/Controllers/UserController.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,22 +4,18 @@

use App\Http\Requests\ChangePasswordRequest;
use App\Http\Requests\UserRequest;
use App\Mail\SubscribeConfirmation;
use App\Models\Address;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Mail;
use Spatie\Permission\Models\Role;

class UserController extends Controller
{
public function index()
{
$users = User::with('roles')->paginate(config('view.item_per_page'));
$users = User::with('roles')->paginate(config('blog.item_per_page'));
return view('backend.userList', compact('users'));
}

Expand Down Expand Up @@ -116,87 +112,6 @@ public function profile()
return view('backend.userDetails', compact('user'));
}

public function subscribe(Request $request)
{
$clientIP = $_SERVER['REMOTE_ADDR'] ?? null;
$newAddress = ['ip' => $clientIP];

try {
$this->validate($request, ['name' => 'required', 'email' => 'required|email']);

DB::beginTransaction();
$newAddress = Address::create($newAddress);
$newUser = User::where('email', $request->get('email'))->first();

if (is_null($newUser)) {
$newUser = $request->only('email', 'name');
$newUser['last_ip'] = $clientIP;
$newUser['address_id'] = $newAddress->id;
$newUser['token'] = Hash::make($request->get('email'));
$newUser = User::create($newUser);
$newUser->assignRole(Role::where('name', 'reader')->first());

$newUser->reader()->create(['notify' => 0, 'is_verified' => 0]);
Mail::to($request->get('email'))->queue(new SubscribeConfirmation($newUser));
} else {
return back()->with('warningMsg', 'You have already subscribed, please contact with admin');
}
DB::commit();
} catch (\Exception $e) {
Log::error($this->getLogMsg($e));
return back()->with('errorMsg', $this->getMessage($e));
}
return back()->with('successMsg', 'Thanks, a mail has been to confirm you subscription');
}

public function confirmSubscribe(Request $request, $userId)
{
try {
$this->validate($request, ['token' => 'required']);

$user = User::where('id', $userId)
->where('token', $request->get('token'))
->first();

if (is_null($user)) {
return redirect()->route('home')->with('errorMsg', 'Invalid request');
}

if ($user->isReader()) {
$user->reader->update(['is_verified' => 1, 'notify' => 1]);
return redirect()->route('home')->with('successMsg', 'Congratulation, your subscription confirmed');
}
} catch (\Exception $e) {
Log::error($this->getLogMsg($e));
return response()->json(['errorMsg' => $this->getMessage($e)]);
}
return redirect()->route('home')->with('warningMsg', 'Something went wrong');
}

public function unSubscribe(Request $request, $userId)
{
try {
$this->validate($request, ['token' => 'required']);

$user = User::where('id', $userId)
->where('token', $request->get('token'))
->first();

if (is_null($user)) {
return redirect()->route('home')->with('errorMsg', 'Invalid request');
}

if ($user->isReader() && $user->reader->notify) {
$user->reader->update(['is_verified' => 1, 'notify' => 0]);
return redirect()->route('home')->with('successMsg', 'You have un-subscribed confirmed');
}
} catch (\Exception $e) {
Log::error($this->getLogMsg($e));
return response()->json(['errorMsg' => $this->getMessage($e)]);
}
return redirect()->route('home')->with('errorMsg', 'No subscription found');
}

public function toggleActive($userId)
{
try {
Expand Down
Loading

0 comments on commit ae2607b

Please sign in to comment.