From aa3b22e473a518fa58059e9f4748a28b3b364840 Mon Sep 17 00:00:00 2001 From: Jonathan Nielson Date: Sun, 12 Oct 2025 22:57:50 -0500 Subject: [PATCH] feat: v1.0 i guess lol --- .../QueueNewArticleAlertForSubscribers.php | 3 +- app/Http/Controllers/WriterController.php | 55 ++++++++++++++++++- app/Models/Article.php | 11 +++- ...024_02_05_014414_create_articles_table.php | 2 + resources/views/writer/dashboard.blade.php | 50 ++++++++++++++--- resources/views/writer/new-article.blade.php | 24 ++++++-- routes/web.php | 9 ++- 7 files changed, 134 insertions(+), 20 deletions(-) diff --git a/app/Console/Commands/QueueNewArticleAlertForSubscribers.php b/app/Console/Commands/QueueNewArticleAlertForSubscribers.php index 116039b..7cae564 100644 --- a/app/Console/Commands/QueueNewArticleAlertForSubscribers.php +++ b/app/Console/Commands/QueueNewArticleAlertForSubscribers.php @@ -39,7 +39,8 @@ class QueueNewArticleAlertForSubscribers extends Command logger(count($articlesForNotification) . ' article(s) ready for notifying.'); - $subscribersToNotify = Subscriber::all(); + // HARD CODE LIMIT 100 subscribers. (Kinda scared of gettings spammed and want to monitor it slowly) + $subscribersToNotify = Subscriber::limit(100)->get(); logger(count($subscribersToNotify) . ' subscribers(s) to notify.'); diff --git a/app/Http/Controllers/WriterController.php b/app/Http/Controllers/WriterController.php index 02c9152..35ff630 100644 --- a/app/Http/Controllers/WriterController.php +++ b/app/Http/Controllers/WriterController.php @@ -49,7 +49,7 @@ class WriterController extends Controller public function newArticle(Request $request): View { - return view('writer.new-article'); + return view('writer.new-article', ['article' => null]); } public function livePreview(Request $request): View @@ -83,7 +83,7 @@ class WriterController extends Controller public function saveArticle(Request $request): RedirectResponse { - $header_image_path = $this->storeHeaderImage($request); + // $header_image_path = $this->storeHeaderImage($request); $article_empty = new Article(); $article_empty->markdown_body = $request->get('markdown-body'); $article_empty->convertMarkdownToMarkup(); @@ -95,13 +95,62 @@ class WriterController extends Controller 'subtitle' => $request->subtitle ?? null, 'body' => $article_empty->body, 'published_at' => $request->get('publication-date') ?? null, - 'header_image_url' => $header_image_path ? asset("storage/$header_image_path") : null, + // 'header_image_url' => $header_image_path ? asset("storage/$header_image_path") : null, 'markdown_body' => $request->get('markdown-body'), ]); return redirect(route('dashboard')); } + public function unpublishArticle(Article $article): RedirectResponse + { + $article->update(['published_at' => null]); + + return back(); + } + + public function deleteArticle(Request $request, Article $article): RedirectResponse + { + $article->delete(); + + return back(); + } + + public function editArticle(Request $request, Article $article): View + { + return view('writer.new-article', ['article' => $article]); + } + + public function persistArticleEdits(Request $request, Article $article): RedirectResponse + { + // $header_image_path = $this->storeHeaderImage($request); + $article_empty = new Article(); + $article_empty->markdown_body = $request->get('markdown-body'); + $article_empty->convertMarkdownToMarkup(); + + $article->update([ + 'title' => $request->title ?? null, + 'slug' => $request->slug ?? null, + 'subtitle' => $request->subtitle ?? null, + 'body' => $article_empty->body, + 'published_at' => $request->get('publication-date') ?? null, + 'markdown_body' => $request->get('markdown-body'), + ]); + + // Article::create([ + // 'title' => $request->title ?? null, + // 'slug' => $request->slug ?? null, + // 'author_id' => auth()->user()->id, + // 'subtitle' => $request->subtitle ?? null, + // 'body' => $article_empty->body, + // 'published_at' => $request->get('publication-date') ?? null, + // // 'header_image_url' => $header_image_path ? asset("storage/$header_image_path") : null, + // 'markdown_body' => $request->get('markdown-body'), + // ]); + + return redirect(route('edit-article', ['article' => $article->id])); + } + private function storeHeaderImage(Request $request): ?string { if(! $request->hasFile('header-image')) return null; diff --git a/app/Models/Article.php b/app/Models/Article.php index 6d4198f..a623477 100644 --- a/app/Models/Article.php +++ b/app/Models/Article.php @@ -7,11 +7,13 @@ use Illuminate\Support\Str; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Factories\HasFactory; +use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Support\Carbon; class Article extends Model { use HasFactory; + use SoftDeletes; /** The name of the database table storing this Model's records. */ protected $table = 'articles'; @@ -38,7 +40,14 @@ class Article extends Model protected function publishedAt(): Attribute { return Attribute::make( - get: fn (string $value) => Carbon::parse($value)->format('D, M jS o, g:i A'), + get: fn (?string $value) => $value ? Carbon::parse($value)->format('D, M jS o, g:i A') : null, + ); + } + + protected function publishedAtRaw(): Attribute + { + return Attribute::make( + get: fn (?string $value, array $attributes) => $attributes['published_at'], ); } diff --git a/database/migrations/2024_02_05_014414_create_articles_table.php b/database/migrations/2024_02_05_014414_create_articles_table.php index 7d35d72..9da580a 100644 --- a/database/migrations/2024_02_05_014414_create_articles_table.php +++ b/database/migrations/2024_02_05_014414_create_articles_table.php @@ -49,6 +49,8 @@ return new class extends Migration $table->dateTime('subscribers_notified_at')->nullable(); $table->timestamps(); + + $table->softDeletes(); }); } diff --git a/resources/views/writer/dashboard.blade.php b/resources/views/writer/dashboard.blade.php index bddfa80..c86b12a 100644 --- a/resources/views/writer/dashboard.blade.php +++ b/resources/views/writer/dashboard.blade.php @@ -19,6 +19,7 @@ Subhead Author Published At + Notifs Sent At Last Updated First Created Actions @@ -29,23 +30,38 @@ {{ $article->id }} {{ $article?->slug ?? '-' }} - {{ $article?->title ?? '-' }} + {{ $article?->title ?? '-' }} {{ $article?->subtitle ?? '-' }} {{ $article?->author?->display_name ?? '-' }} {{ $article?->published_at ?? '-' }} + {{ $article?->subscribers_notified_at ?? '-' }} {{ $article?->updated_at ?? '-' }} {{ $article?->created_at ?? '-' }} {{-- - - + +
+ +
--}} - - - + + @if($article['published_at']) +
+ @csrf + + +
+ @endif + +
+ @csrf + +
+ +
+ +
@empty @@ -54,5 +70,23 @@ + + @endsection diff --git a/resources/views/writer/new-article.blade.php b/resources/views/writer/new-article.blade.php index 2a1c7d0..c34b495 100644 --- a/resources/views/writer/new-article.blade.php +++ b/resources/views/writer/new-article.blade.php @@ -9,12 +9,22 @@ width: 100%; align-items: center; justify-content: space-evenly; + gap: 2em; } + #new-article-form { display: flex; flex-direction: column; } +#new-article-preview-container { + max-height: 90vh; + overflow-y: scroll; + padding: 2em; + background-color: #000; + flex-grow: 1; +} + #markdown-body { width: 40vw; } @@ -74,20 +84,22 @@ document.addEventListener("DOMContentLoaded", (event) => {
-
+ @csrf - + - + - + - + + - +