add models, setup livewire, setup mongodb

This commit is contained in:
yuriko 🦊 2025-05-21 15:14:30 -04:00
parent 9a47b58881
commit c0590a3412
Signed by: jaiden
SSH key fingerprint: SHA256:f8tvveBoXBrKZIQDWLLcpQrKbATUCGg98x2N4YzkDM8
19 changed files with 1281 additions and 318 deletions

View file

@ -4,7 +4,7 @@ root = true
charset = utf-8
end_of_line = lf
indent_size = 4
indent_style = space
indent_style = tab
insert_final_newline = true
trim_trailing_whitespace = true

View file

@ -7,6 +7,7 @@ use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;
use MongoDB\Laravel\Auth\User as Authenticatable;
use MongoDB\Laravel\Relations\HasMany;
class User extends Authenticatable
{
@ -33,4 +34,9 @@ class User extends Authenticatable
'password' => 'hashed',
];
}
public function posts(): HasMany
{
return $this->hasMany(Post::class);
}
}

View file

@ -3,8 +3,11 @@
namespace App\Providers;
use App\Models\PersonalAccessToken;
use Illuminate\Support\Facades\Event;
use Illuminate\Support\ServiceProvider;
use Laravel\Sanctum\Sanctum;
use SocialiteProviders\Authentik\Provider as AuthentikProvider;
use SocialiteProviders\Manager\SocialiteWasCalled;
class AppServiceProvider extends ServiceProvider
{
@ -22,5 +25,10 @@ class AppServiceProvider extends ServiceProvider
public function boot(): void
{
Sanctum::usePersonalAccessTokenModel(PersonalAccessToken::class);
// Authentik
Event::listen(function (SocialiteWasCalled $event) {
$event->extendSocialite('authentik', AuthentikProvider::class);
});
}
}

View file

@ -1,8 +1,10 @@
<?php
use App\Http\Controllers\AuthController;
use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;
use Illuminate\Support\Facades\Route;
return Application::configure(basePath: dirname(__DIR__))
->withRouting(
@ -10,6 +12,14 @@ return Application::configure(basePath: dirname(__DIR__))
api: __DIR__.'/../routes/api.php',
commands: __DIR__.'/../routes/console.php',
health: '/up',
then: function()
{
// Auth routing
Route::middleware('web')
->prefix('auth')
->controller(AuthController::class)
->group(base_path('routes/auth.php'));
}
)
->withMiddleware(function (Middleware $middleware) {
//

View file

@ -3,4 +3,5 @@
return [
App\Providers\AppServiceProvider::class,
MongoDB\Laravel\MongoDBServiceProvider::class,
SocialiteProviders\Manager\ServiceProvider::class,
];

View file

@ -10,10 +10,18 @@
"license": "MIT",
"require": {
"php": "^8.2",
"ext-gmp": "*",
"intervention/image-driver-vips": "^1.0",
"intervention/image-laravel": "^1.5",
"laravel/framework": "^12.0",
"laravel/sanctum": "^4.0",
"laravel/tinker": "^2.10.1",
"mongodb/laravel-mongodb": "^5.4"
"league/flysystem": "^3.29",
"league/flysystem-gridfs": "3.x-dev",
"livewire/livewire": "^3.6",
"mongodb/laravel-mongodb": "^5.4",
"predis/predis": "^3.0",
"socialiteproviders/authentik": "^5.2"
},
"require-dev": {
"fakerphp/faker": "^1.23",

1173
composer.lock generated

File diff suppressed because it is too large Load diff

View file

@ -90,6 +90,16 @@ return [
'driver' => 'octane',
],
'mongodb' => [
'driver' => 'mongodb',
'connection' => 'mongodb',
'collection' => 'cache',
'lock_connection' => 'mongodb',
'lock_collection' => 'cache_locks',
'lock_lottery' => [2, 100],
'lock_timeout' => 86400,
],
],
/*

View file

@ -60,6 +60,11 @@ return [
'report' => false,
],
'gridfs' => [
'driver' => 'gridfs',
'connection' => 'mongodb',
],
],
/*

View file

@ -35,4 +35,11 @@ return [
],
],
'authentik' => [
'base_url' => env('AUTHENTIK_BASE_URL'),
'client_id' => env('AUTHENTIK_CLIENT_ID'),
'client_secret' => env('AUTHENTIK_CLIENT_SECRET'),
'redirect' => env('AUTHENTIK_REDIRECT_URI'),
],
];

View file

@ -1,8 +1,9 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
use MongoDB\Laravel\Schema\Blueprint;
return new class extends Migration
{
@ -34,6 +35,7 @@ return new class extends Migration
$table->text('user_agent')->nullable();
$table->longText('payload');
$table->integer('last_activity')->index();
$table->expire('expires_at', 0);
});
}

View file

@ -1,8 +1,9 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Schema;
use MongoDB\Laravel\Schema\Blueprint;
return new class extends Migration
{

View file

@ -1,8 +1,8 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
use MongoDB\Laravel\Schema\Blueprint;
return new class extends Migration
{

View file

@ -1,8 +1,8 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
use MongoDB\Laravel\Schema\Blueprint;
return new class extends Migration
{

View file

@ -6,11 +6,9 @@
"dev": "vite"
},
"devDependencies": {
"@tailwindcss/vite": "^4.0.0",
"axios": "^1.8.2",
"concurrently": "^9.0.1",
"laravel-vite-plugin": "^1.2.0",
"tailwindcss": "^4.0.0",
"vite": "^6.2.4"
}
}

View file

@ -1,11 +1,52 @@
@import 'tailwindcss';
@import url('https://early.webawesome.com/webawesome@3.0.0-alpha.13/dist/styles/webawesome.css');
@import url('https://early.webawesome.com/webawesome@3.0.0-alpha.13/dist/styles/utilities.css');
@import url('https://early.webawesome.com/webawesome@3.0.0-alpha.13/dist/styles/themes/tailspin.css');
@import url('https://early.webawesome.com/webawesome@3.0.0-alpha.13/dist/styles/color/bright.css');
@import url('https://early.webawesome.com/webawesome@3.0.0-alpha.13/dist/styles/brand/purple.css');
@import url('https://early.webawesome.com/webawesome@3.0.0-alpha.13/dist/styles/themes/awesome/typography.css');
html,
body {
min-height: 100%;
height: 100%;
padding: 0;
margin: 0;
}
:where(:root),
:host,
.wa-theme-nyaabooru {
--wa-icon-family: classic;
--wa-icon-variant: light;
--wa-border-radius-scale: 0.5;
--wa-space-scale: 1;
--wa-border-width-scale: 1;
}
wa-page {
--menu-width: 15rem;
--aside-width: 15rem;
}
wa-page[view='desktop'] {
[slot*='navigation'] {
border-inline-end: var(--wa-border-width-s) var(--wa-border-style) var(--wa-color-surface-border);
}
}
wa-page[view='mobile'] {
--menu-width: auto;
--aside-width: auto;
}
[slot='header'] {
--wa-link-decoration-default: none;
border-block-end: var(--wa-border-width-s) var(--wa-border-style) var(--wa-color-surface-border);
}
@source '../../vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php';
@source '../../storage/framework/views/*.php';
@source '../**/*.blade.php';
@source '../**/*.js';
@theme {
--font-sans: 'Instrument Sans', ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji',
'Segoe UI Symbol', 'Noto Color Emoji';
}

File diff suppressed because one or more lines are too long

View file

@ -1,7 +1,27 @@
<?php
use App\Livewire\App\Home as AppHome;
use App\Livewire\Pages\Upload as UploadPage;
use App\Livewire\Posts\Index as PostsPage;
use App\Livewire\Posts\Edit as EditPost;
use App\Livewire\Posts\View as ViewPost;
use App\Models\Post;
use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\Storage;
Route::get('/', function () {
return view('welcome');
Route::get('/', AppHome::class)->name('home');
// Authenticated routes
Route::middleware('auth')->group(function () {
Route::get('/upload', UploadPage::class)->name('upload');
});
// Post routes
Route::middleware('auth')->prefix('posts')->group(function () {
Route::get('/', PostsPage::class)->name('posts.home');
Route::get('/{post}', ViewPost::class);
Route::get('/{post}/edit', EditPost::class);
Route::get('/{post}/download', function(Post $post) {
return Storage::download("posts/$post->id/full", config('app.name') . "_$post->id.$post->extension");
});
});

View file

@ -1,6 +1,5 @@
import { defineConfig } from 'vite';
import laravel from 'laravel-vite-plugin';
import tailwindcss from '@tailwindcss/vite';
export default defineConfig({
plugins: [
@ -8,6 +7,5 @@ export default defineConfig({
input: ['resources/css/app.css', 'resources/js/app.js'],
refresh: true,
}),
tailwindcss(),
],
});