Skip to content
This repository was archived by the owner on Feb 9, 2021. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion app/Model/Categories.php
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ class Categories extends Model
/**
* Undocumented function.
*
* @return void
* @return string
*/
public function getRouteKeyName()
{
Expand Down Expand Up @@ -101,4 +101,13 @@ public function editor()
{
return $this->belongsTo(Account::class, 'editor_id', 'id');
}

/**
* @param string $slug
* @return \Illuminate\Database\Eloquent\Builder|\Illuminate\Database\Eloquent\Model|null|object
*/
public static function firstWhereSlug(string $slug)
{
return self::query()->where('slug', '=', $slug)->first();
}
}
26 changes: 16 additions & 10 deletions app/Model/Concerns/Publishers.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,19 +14,25 @@ trait Publishers
*/
public static function bootPublishers()
{
if (auth()->check()) {
static::creating(function ($model) {
$model->setAttribute('creator_id', auth()->id());
$model->setAttribute('editor_id', auth()->id());
});
static::creating(function ($model) {
if (auth()->check()) {
$model->fill([
'creator_id' => auth()->id(),
'editor_id' => auth()->id(),
]);
}
});

static::deleting(function ($model) {
static::deleting(function ($model) {
if (auth()->check()) {
return $model->setAttribute('editor_id', auth()->id());
});
}
});

static::updating(function ($model) {
static::updating(function ($model) {
if (auth()->check()) {
return $model->setAttribute('editor_id', auth()->id());
});
}
}
});
}
}
56 changes: 2 additions & 54 deletions app/Modules/Articles/BackendController.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@

namespace App\Modules\Articles;

use App\Modules\Articles\Events\ArticleDeleted;
use Carbon\Carbon;
use App\Model\Article;
use App\Model\Categories;
use Illuminate\Http\Request;
use App\Modules\ModuleEngine;
use App\Classes\Repositories\ArticleRepository;
use App\Modules\Articles\Events\ArticleCreated;
use App\Modules\Articles\Events\ArticleDeleted;
use App\Modules\Articles\Events\ArticleUpdated;
use App\Classes\Repositories\ArticleCategoryRepository;

Expand Down Expand Up @@ -64,7 +64,7 @@ public function create()
* Generate a form for editing or creating a model.
*
* @param Article $article model to be used.
* @return void
* @return \Illuminate\Contracts\View\View
*/
public function form(Article $article)
{
Expand All @@ -89,17 +89,6 @@ public function store(Request $request)
return redirect()->route('admin.articles.index');
}

/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
{
//
}

/**
* Show the form for editing the specified resource.
*
Expand Down Expand Up @@ -148,47 +137,6 @@ public function destroy($slug)
return response()->json(['status' => 'true', 'redirect' => route('admin.articles.index')]);
}

/**
* Category Index.
* @param ArticleCategoryRepository $categoryRepository
* @return \Illuminate\Contracts\View\View
*/
public function categories(ArticleCategoryRepository $categoryRepository)
{
return $this->make('categories')->with('categories', $categoryRepository->all());
}

/**
* @param Request $request
* @return \Illuminate\Http\RedirectResponse
*/
public function categories_store(Request $request)
{
$this->validate($request, ['unique:title']);

$category = new Categories;
$category->title = $request['name'];
$category->save();

return redirect()->route('admin.articles.categories.index');
}

/**
* @param int $id
* @param ArticleCategoryRepository $categoryRepository
* @return \Illuminate\Http\RedirectResponse
*
* @throws \Exception
*/
public function categories_destroy(int $id, ArticleCategoryRepository $categoryRepository)
{
$category = $categoryRepository->whereID($id);

$category->delete();

return redirect()->route('admin.articles.categories.index');
}

/**
* Save the data for the menu to the database.
*
Expand Down
10 changes: 2 additions & 8 deletions app/Modules/Articles/Blade/categories.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
<div class="searchbar" style="background-color: white">
<div class="text form-row">
<div class="col">
<input type="text" name="name" class="form-control" placeholder="Enter Category Name" required>
<input type="text" name="title" class="form-control" placeholder="Enter Category Name" required>
</div>
</div>
<div class="ml-2">
Expand All @@ -30,8 +30,6 @@

<div class="webshelf-table">

<?php /** @var App\Mo $category */ ?>

@foreach($categories as $category)
<div class="row">

Expand All @@ -46,11 +44,7 @@

<div class="console">
<ul class="list-unstyled">
{{--<li>{!! css()->link->edit(route('admin.articles.edit', $article->slug)) !!}</li>--}}
{{--<li>{!! css()->status->sitemap($article->sitemap) !!}</li>--}}
{{--<li>{!! css()->status->status($article->status) !!}</li>--}}
<li>{!! css()->link->destroy(route('admin.articles.categories.destroy', $category->id)) !!}</li>
{{--<li>{!! css()->link->view(url($article->route())) !!}</li>--}}
<li><a href="{{ route('admin.articles.categories.destroy', $category->slug) }}" data-type="alert" data-confirm="Are you sure you want to delete this category?" data-method="delete">Delete</a></li>
</ul>
</div>

Expand Down
63 changes: 63 additions & 0 deletions app/Modules/Articles/CategoryController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
<?php

namespace App\Modules\Articles;

use App\Model\Categories;
use Illuminate\Http\Request;
use App\Modules\ModuleEngine;
use Illuminate\Foundation\Testing\RefreshDatabase;

/**
* Class CategoryController.
*/
class CategoryController extends ModuleEngine
{
use RefreshDatabase;

/**
* Category Index.
*
* @return \Illuminate\Contracts\View\View
*/
public function index()
{
return $this->make('categories')->with('categories', Categories::all());
}

/**
* Store a new category created by the form.
*
* @param Request $request
* @param Categories $category
* @return \Illuminate\Http\RedirectResponse
*/
public function store(Request $request, Categories $category)
{
$this->validate($request, ['unique:title']);

$category->fill([
'title' => $request->get('title'),
'slug' => str_slug($request->get('title')),
])->save();

return redirect()->route('admin.articles.categories.index');
}

/**
* Destroy or delete an exiting category.
*
* @param string $slug
* @return \Illuminate\Http\RedirectResponse
* @throws \Exception
*/
public function destroy(string $slug)
{
$category = Categories::firstWhereSlug($slug);

if (count($category->articles) == 0) {
$category->delete();
}

return response()->json(['status' => 'true', 'redirect' => route('admin.articles.categories.index')]);
}
}
8 changes: 5 additions & 3 deletions app/Modules/Articles/Routes/backend.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
| allowing these to be loading one time per update.
|
*/
Route::get('admin/articles/categories')->uses('BackendController@categories')->name('admin.articles.categories.index');
Route::post('admin/articles/categories')->uses('BackendController@categories_store')->name('admin.articles.categories.store');
Route::resource('admin/articles', 'BackendController', ['as' => 'admin']);
//Route::get('admin/articles/categories')->uses('BackendController@categories')->name('admin.articles.categories.index');
//Route::post('admin/articles/categories')->uses('BackendController@categories_store')->name('admin.articles.categories.store');

Route::resource('admin/articles', 'BackendController', ['as' => 'admin'])->except(['show']);
Route::resource('admin/articles/categories', 'CategoryController', ['as' => 'admin.articles'])->except(['show']);
53 changes: 52 additions & 1 deletion tests/Article/ArticleBackendTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,58 @@

class ArticleBackendTest extends TestCase
{
//use RefreshDatabase;
use RefreshDatabase;

/**
* @test
*/
public function index_should_return_an_article_listing()
{
// the database should have an article.
$article = factory('App\Model\Article')->create();

// so that when a user signs in.
$this->signIn();

// and visits the articles listing.
$response = $this->visit('admin/articles');

// they should see the article in the database on the page.
$response->assertSee(ucwords($article->title));
}

/**
* @test
*/
public function a_form_can_be_used_to_create_articles()
{
// when a user signs in.
$this->signIn();

// they can visit a url.
$response = $this->visit('admin/articles/create');

// and see a form.
$response->assertSee('<button type="submit" class="btn btn-create">Create Article</button>');
}

/**
* @test
*/
public function a_form_can_be_used_to_edit_articles()
{
// when a user signs in.
$this->signIn();

// looks up an already existing article.
$article = factory('App\Model\Article')->create();

// and attempts to edit.
$response = $this->get("admin/articles/{$article->slug}/edit");

// they should see a form.
$response->assertSee('<button type="submit" class="btn btn-create">Edit Article</button>');
}

/**
* @test
Expand Down
72 changes: 72 additions & 0 deletions tests/Article/ArticleCategoryBackendTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
<?php

namespace Tests\Article;

use Tests\TestCase;
use App\Model\Categories;
use Illuminate\Foundation\Testing\RefreshDatabase;

/**
* Class ArticleCategoryBackendTest.
*/
class ArticleCategoryBackendTest extends TestCase
{
use RefreshDatabase;

/**
* @test
*/
public function a_category_listing_index_is_shown()
{
$this->signIn();

$category = factory('App\Model\Categories')->create();

$response = $this->visit('admin/articles/categories');

$response->assertSee($category->title);
}

/**
* @test
* @var Categories
*/
public function a_category_can_be_created_and_stored()
{
$this->signIn();

$this->post('admin/articles/categories', ['title' => 'foo']);

$this->assertDatabaseHas('article_categories', ['title' => 'foo', 'slug' => 'foo']);
}

/**
* @test
*/
public function an_exiting_category_can_be_deleted()
{
$this->signIn();

$category = factory('App\Model\Categories')->create();

$this->delete("admin/articles/categories/{$category->slug}");

$this->assertDatabaseHas('article_categories', ['title' => $category->title, 'deleted_at' => now()]);
}

/**
* @test
*/
public function an_category_cannot_be_deleted_when_articles_belong_to_it()
{
$this->signIn();

$category = factory('App\Model\Categories')->create();

factory('App\Model\Article')->create(['category_id'=>$category->id]);

$this->delete("admin/articles/categories/{$category->slug}");

$this->assertDatabaseHas('article_categories', ['title' => $category->title, 'deleted_at' => null]);
}
}