Design Refresh

This commit is contained in:
Roscoe 2026-01-23 23:16:08 +00:00
commit e7202174f7
Signed by: RoscoeDaWah
SSH key fingerprint: SHA256:Hqn452XQ1ETzUt/FthJu6+OFkS4NBxCv5VQSEvuk7CE
44 changed files with 593 additions and 228 deletions

View file

@ -0,0 +1,40 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class LoginController extends Controller {
public function showLoginForm() {
return view('auth.login');
}
public function login(Request $request) {
$credentials = $request->validate([
'username' => 'required|string|max:50',
'password' => 'required|string',
]);
if (Auth::attempt($credentials)) {
$request->session()->regenerate();
return redirect()->intended('/');
}
return back()->withErrors([
'username' => 'Invalid credentials',
])->withInput();
}
public function logout(Request $request) {
Auth::logout();
$request->session()->invalidate();
$request->session()->regenerateToken();
return redirect('/');
}
}

View file

@ -4,6 +4,9 @@
use App\Models\BookmarkSite;
use App\Models\BookmarkCategory;
use App\Models\GuestbookEntry;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\View\View;
class BookmarksController extends Controller
@ -12,4 +15,40 @@ public function show() : View {
$categories = BookmarkCategory::with('sites')->get();
return view('bookmarks', compact('categories'));
}
public function createBookmark() {
$categories = BookmarkCategory::all();
return view('admin.create-bookmark', [
'categories' => $categories
]);
}
public function addBookmark(Request $request): RedirectResponse {
$newEntry = BookmarkSite::create($request);
return redirect()->route('bookmarks');
}
public function destroyBookmark($id): RedirectResponse {
$site = BookmarkSite::findOrFail($id);
$site->delete();
return redirect()->route('bookmarks');
}
public function createCategory() {
return view('admin.create-category');
}
public function addCategory(Request $request): RedirectResponse {
$newEntry = BookmarkCategory::create($request);
return redirect()->route('bookmarks');
}
public function destroyCategory($id): RedirectResponse {
if (BookmarkSite::where('category', $id)->count() <= 0) {
$category = BookmarkCategory::findOrFail($id);
$category->delete();
}
return redirect()->route('bookmarks');
}
}

View file

@ -6,12 +6,13 @@
use Illuminate\Http\Request;
use Illuminate\Http\RedirectResponse;
use Illuminate\Contracts\View\View;
use Illuminate\Support\Facades\Http;
use Illuminate\Validation\ValidationException;
use UAParser\Parser;
class GuestbookController extends Controller {
public function show(): View {
$entries = GuestbookEntry::selectEntries();
$entries = GuestbookEntry::get();
$parser = Parser::create();
return view('guestbook')
@ -27,7 +28,46 @@ public function show(): View {
* @throws ValidationException
*/
public function addEntry(Request $request): RedirectResponse {
GuestbookEntry::insertGuestbookEntry($request);
$newEntry = GuestbookEntry::create($request);
$response = Http::withBasicAuth(config('services.mailjet.key'), config('services.mailjet.secret'))->post('https://api.mailjet.com/v3.1/send', [
'Messages' => [
[
'From' => [
'Email' => 'wah@wah.moe',
'Name' => 'wah dot moe'
],
'To' => [
[
'Email' => 'roscoe@wah.moe',
'Name' => 'Roscoe D. Wah'
]
],
'Subject' => 'New Guestbook Entry!',
'HtmlPart' => '
<style> td { padding: 5px } </style>
<table border="1">
<tr><td><b>Name:</b></td><td>'.htmlentities($newEntry->name).'</td></tr>
<tr><td><b>IP:</b></td><td>'.$newEntry->ip.'</td></tr>
<tr><td><b>Agent:</b></td><td>'.htmlentities($newEntry->agent).'</td></tr>
<tr><td><b>Message:</b></td><td>'.htmlentities($newEntry->message).'</td></tr>
</table>'
]
]
]);
return back()->with('success', 'Entry submitted successfully!');
}
public function destroy($id): RedirectResponse {
$entry = GuestbookEntry::findOrFail($id);
$entry->delete();
return redirect()->route('guestbook');
}
public function flag($id): RedirectResponse {
$entry = GuestbookEntry::where("id", $id)->get()->first;
$entry->update([
"flagged" => !$entry->flagged,
]);
return redirect()->route('guestbook');
}
}

View file

@ -4,18 +4,29 @@
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Http\Request;
class BookmarkCategory extends Model
{
use HasFactory;
protected $table = "bookmark__categories";
protected $fillable = ['name'];
protected $fillable = ['name', 'shuffled'];
protected $casts = ['shuffled' => 'boolean'];
public function sites() {
return $this->hasMany(BookmarkSite::class, 'category');
}
public static function insertBookmarkCategory(string $name) {
public static function create(Request $request): BookmarkCategory {
$newCategory = new BookmarkCategory();
$newCategory->name = $request->get('name');
$newCategory->shuffled = $request->has('shuffled');
$newCategory->save();
return $newCategory;
}
public static function insertBookmarkCategory(string $name): void {
$newBookmarkCategory = new BookmarkCategory;
$newBookmarkCategory->name = $name;
$newBookmarkCategory->save();
@ -24,13 +35,4 @@ public static function selectBookmarks(int $id) {
$bookmarks = BookmarkSite::where('category', '=', $id)->firstOrFail();
return $bookmarks;
}
public static function importBookmarkCategory(array $data) {
foreach ($data as $category) {
$newBookmarkCategory = new BookmarkCategory;
$newBookmarkCategory->name = $category['name'];
$newBookmarkCategory->priority = intval($category['priority']);
$newBookmarkCategory->save();
}
}
}

View file

@ -4,16 +4,31 @@
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
class BookmarkSite extends Model {
use HasFactory;
protected $table = "bookmark__sites";
protected $fillable = ['name', 'description', 'url', 'category'];
public function category() {
public function category(): BelongsTo {
return $this->belongsTo(BookmarkCategory::class, 'category');
}
public static function insertBookmark(string $name, string $url, int $category) {
public static function create(Request $request): BookmarkSite {
$category = BookmarkCategory::where('id', $request->get('category'))->firstOrFail();
$newSite = new BookmarkSite;
$newSite->name = $request->get('name');
$newSite->url = $request->get('url');
$newSite->description = $request->get('description');
$newSite->category = $category->id;
$newSite->save();
return $newSite;
}
public static function insertBookmark(string $name, string $url, int $category): void {
$category = BookmarkCategory::where('id', $category)->firstOrFail();
$newBookmark = new BookmarkSite;
$newBookmark->name = $name;
@ -21,15 +36,4 @@ public static function insertBookmark(string $name, string $url, int $category)
$newBookmark->category = $category->id;
$newBookmark->save();
}
public static function importBookmark(array $data) {
foreach ($data as $site) {
$newBookmark = new BookmarkSite;
$newBookmark->name = $site['name'];
$newBookmark->description = $site['description'];
$newBookmark->url = $site['url'];
$newBookmark->category = $site['category_id'];
$newBookmark->save();
}
}
}

View file

@ -5,46 +5,37 @@
use Illuminate\Http\Request;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Auth;
class GuestbookEntry extends Model
{
use HasFactory;
protected $table = "guestbook__entries";
protected $fillable = ['name', 'message'];
protected $fillable = ['name', 'message',
'flagged'
];
/**
* Creates a new guestbook entry.
*
* @param Request $request The HTTP POST request
* @return void
* @return GuestbookEntry
*/
public static function insertGuestbookEntry(Request $request) {
public static function create(Request $request): GuestbookEntry {
$newEntry = new GuestbookEntry;
$newEntry->name = $request->get('name');
$newEntry->message = $request->get('message');
$newEntry->ip = $request->ip();
$newEntry->agent = $request->userAgent();
$newEntry->legacy_flagged = isLegacy();
$newEntry->flagged = true;
$newEntry->save();
return $newEntry;
}
public static function selectEntries() {
$entries = GuestbookEntry::where("legacy_flagged", false)->orderBy('created_at', 'desc')->get();
return $entries;
}
public static function importGuestbookEntry(array $data) {
foreach ($data as $entry) {
$dt = new \DateTime('@' . $entry['timestamp']);
$newEntry = new GuestbookEntry;
$newEntry->name = $entry['name'];
$newEntry->ip = $entry['ip_address'];
$newEntry->agent = $entry['agent'];
$newEntry->admin = $entry['site_owner'];
$newEntry->message = $entry['message'];
$newEntry->created_at = $dt;
$newEntry->updated_at = $dt;
$newEntry->save();
public static function get() {
if (Auth::check()) {
return GuestbookEntry::select()->orderBy('created_at', 'desc')->get();
}
return GuestbookEntry::where("flagged", false)->orderBy('created_at', 'desc')->get();
}
}

42
app/Models/User.php Normal file
View file

@ -0,0 +1,42 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
class User extends Authenticatable {
use HasFactory, Notifiable;
/**
* The attributes that are mass assignable.
*
* @var array<int, string>
*/
protected $fillable = [
'username',
'email',
'password',
];
/**
* The attributes that should be hidden for serialization.
*
* @var array<int, string>
*/
protected $hidden = [
'password',
'remember_token',
];
/**
* The attributes that should be cast.
*
* @var array<string, string>
*/
protected $casts = [
'email_verified_at' => 'datetime',
'password' => 'hashed',
];
}