@ -0,0 +1,18 @@ |
|||||||
|
root = true |
||||||
|
|
||||||
|
[*] |
||||||
|
charset = utf-8 |
||||||
|
end_of_line = lf |
||||||
|
indent_size = 4 |
||||||
|
indent_style = space |
||||||
|
insert_final_newline = true |
||||||
|
trim_trailing_whitespace = true |
||||||
|
|
||||||
|
[*.md] |
||||||
|
trim_trailing_whitespace = false |
||||||
|
|
||||||
|
[*.{yml,yaml}] |
||||||
|
indent_size = 2 |
||||||
|
|
||||||
|
[docker-compose.yml] |
||||||
|
indent_size = 4 |
@ -0,0 +1,47 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
namespace App\Http\Controllers; |
||||||
|
|
||||||
|
use Illuminate\Http\Request; |
||||||
|
use App\Models\Album; |
||||||
|
use Illuminate\Support\Facades\Validator; |
||||||
|
|
||||||
|
class AlbumController extends Controller |
||||||
|
{ |
||||||
|
public function index(Request $request) |
||||||
|
{ |
||||||
|
$albums = Album::paginate(15); |
||||||
|
if (count($albums) > $request->page) return response($albums[$request->page]); |
||||||
|
return response(["message" => "Page not found"], 404); |
||||||
|
} |
||||||
|
|
||||||
|
public function show(Request $request) |
||||||
|
{ |
||||||
|
$album = Album::find($request->id); |
||||||
|
if ($album) return response($album); |
||||||
|
return response(["message" => "Album not found"], 404); |
||||||
|
} |
||||||
|
|
||||||
|
public function store(Request $request) |
||||||
|
{ |
||||||
|
$validator = Validator::make($request->all(), ["name" => "required"]); |
||||||
|
if ($validator->fails()) return response($validator->messages(), 400); |
||||||
|
response(Album::create($request->all())); |
||||||
|
} |
||||||
|
|
||||||
|
public function update(Request $request) |
||||||
|
{ |
||||||
|
$album = Album::find($request->id); |
||||||
|
if (!$album) return response(["message" => "Album not found"], 404); |
||||||
|
$album->update($request->all()); |
||||||
|
return response($album); |
||||||
|
} |
||||||
|
|
||||||
|
public function destroy(Request $request) |
||||||
|
{ |
||||||
|
$album = Album::find($request->id); |
||||||
|
if (!$album) return response(["message" => "Album not found"], 404); |
||||||
|
$album->destroy(); |
||||||
|
return response([]); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,47 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
namespace App\Http\Controllers; |
||||||
|
|
||||||
|
use Illuminate\Http\Request; |
||||||
|
use App\Models\Article; |
||||||
|
use Illuminate\Support\Facades\Validator; |
||||||
|
|
||||||
|
class ArticleController extends Controller |
||||||
|
{ |
||||||
|
public function index(Request $request) |
||||||
|
{ |
||||||
|
$articles = Article::paginate(15); |
||||||
|
if (count($articles) > $request->page) return response($articles[$request->page]); |
||||||
|
return response(["message" => "Page not found"], 404); |
||||||
|
} |
||||||
|
|
||||||
|
public function show(Request $request) |
||||||
|
{ |
||||||
|
$article = Article::find($request->id); |
||||||
|
if ($article) return response($article); |
||||||
|
return response(["message" => "Article not found"], 404); |
||||||
|
} |
||||||
|
|
||||||
|
public function store(Request $request) |
||||||
|
{ |
||||||
|
$validator = Validator::make($request->all(), ["name" => "required"]); |
||||||
|
if ($validator->fails()) return response($validator->messages(), 400); |
||||||
|
response(Article::create($request->all())); |
||||||
|
} |
||||||
|
|
||||||
|
public function update(Request $request) |
||||||
|
{ |
||||||
|
$article = Article::find($request->id); |
||||||
|
if (!$article) return response(["message" => "Article not found"], 404); |
||||||
|
$article->update($request->all()); |
||||||
|
return response($article); |
||||||
|
} |
||||||
|
|
||||||
|
public function destroy(Request $request) |
||||||
|
{ |
||||||
|
$article = Article::find($request->id); |
||||||
|
if (!$article) return response(["message" => "Article not found"], 404); |
||||||
|
$article->destroy(); |
||||||
|
return response([]); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,10 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
namespace App\Http\Controllers; |
||||||
|
|
||||||
|
use Illuminate\Http\Request; |
||||||
|
|
||||||
|
class AuthController extends Controller |
||||||
|
{ |
||||||
|
// |
||||||
|
} |
@ -0,0 +1,45 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
namespace App\Http\Controllers; |
||||||
|
|
||||||
|
use Illuminate\Http\Request; |
||||||
|
use App\Models\Categorie; |
||||||
|
use Illuminate\Support\Facades\Validator; |
||||||
|
|
||||||
|
class CategorieController extends Controller |
||||||
|
{ |
||||||
|
public function index(Request $request) |
||||||
|
{ |
||||||
|
return response(Categorie::all()); |
||||||
|
} |
||||||
|
|
||||||
|
public function show(Request $request) |
||||||
|
{ |
||||||
|
$categorie = Categorie::find($request->id); |
||||||
|
if ($categorie) return response($categorie); |
||||||
|
return response(["message" => "Categorie not found"], 404); |
||||||
|
} |
||||||
|
|
||||||
|
public function store(Request $request) |
||||||
|
{ |
||||||
|
$validator = Validator::make($request->all(), ["name" => "required"]); |
||||||
|
if ($validator->fails()) return response($validator->messages(), 400); |
||||||
|
response(Categorie::create($request->all())); |
||||||
|
} |
||||||
|
|
||||||
|
public function update(Request $request) |
||||||
|
{ |
||||||
|
$categorie = Categorie::find($request->id); |
||||||
|
if (!$categorie) return response(["message" => "Categorie not found"], 404); |
||||||
|
$categorie->update($request->all()); |
||||||
|
return response($categorie); |
||||||
|
} |
||||||
|
|
||||||
|
public function destroy(Request $request) |
||||||
|
{ |
||||||
|
$categorie = Categorie::find($request->id); |
||||||
|
if (!$categorie) return response(["message" => "Categorie not found"], 404); |
||||||
|
$categorie->destroy(); |
||||||
|
return response([]); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,31 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
namespace App\Http\Controllers; |
||||||
|
|
||||||
|
use Illuminate\Http\Request; |
||||||
|
use App\Models\Image; |
||||||
|
use Illuminate\Support\Facades\Validator; |
||||||
|
use Illuminate\Support\Facades\Storage; |
||||||
|
|
||||||
|
class ImageController extends Controller |
||||||
|
{ |
||||||
|
public function store(Request $request) |
||||||
|
{ |
||||||
|
$validator = Validator::make($request->all(), ["image" => "required"]); |
||||||
|
if ($validator->fails()) return response($validator->messages(), 400); |
||||||
|
$path = $request->file("image")->hashName(); |
||||||
|
$request->file('image')->store("public/images"); |
||||||
|
return response(Image::create([ |
||||||
|
"url" => $path |
||||||
|
])); |
||||||
|
} |
||||||
|
|
||||||
|
public function destroy(Request $request) |
||||||
|
{ |
||||||
|
$image = Image::find($request->id); |
||||||
|
if (!$image) return response(["message" => "Image not found"], 404); |
||||||
|
Storage::disk('local')->delete("public/images/". $image->url); |
||||||
|
$image->destroy(); |
||||||
|
return response([]); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,47 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
namespace App\Http\Controllers; |
||||||
|
|
||||||
|
use Illuminate\Http\Request; |
||||||
|
use App\Models\Info; |
||||||
|
use Illuminate\Support\Facades\Validator; |
||||||
|
|
||||||
|
class InfoController extends Controller |
||||||
|
{ |
||||||
|
public function index(Request $request) |
||||||
|
{ |
||||||
|
$infos = Info::paginate(15); |
||||||
|
if (count($infos) > $request->page) return response($infos[$request->page]); |
||||||
|
return response(["message" => "Page not found"], 404); |
||||||
|
} |
||||||
|
|
||||||
|
public function show(Request $request) |
||||||
|
{ |
||||||
|
$info = Info::find($request->id); |
||||||
|
if ($info) return response($info); |
||||||
|
return response(["message" => "Info not found"], 404); |
||||||
|
} |
||||||
|
|
||||||
|
public function store(Request $request) |
||||||
|
{ |
||||||
|
$validator = Validator::make($request->all(), ["name" => "required"]); |
||||||
|
if ($validator->fails()) return response($validator->messages(), 400); |
||||||
|
response(Info::create($request->all())); |
||||||
|
} |
||||||
|
|
||||||
|
public function update(Request $request) |
||||||
|
{ |
||||||
|
$info = Info::find($request->id); |
||||||
|
if (!$info) return response(["message" => "Info not found"], 404); |
||||||
|
$info->update($request->all()); |
||||||
|
return response($info); |
||||||
|
} |
||||||
|
|
||||||
|
public function destroy(Request $request) |
||||||
|
{ |
||||||
|
$info = Info::find($request->id); |
||||||
|
if (!$info) return response(["message" => "Info not found"], 404); |
||||||
|
$info->destroy(); |
||||||
|
return response([]); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,47 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
namespace App\Http\Controllers; |
||||||
|
|
||||||
|
use Illuminate\Http\Request; |
||||||
|
use App\Models\User; |
||||||
|
use Illuminate\Support\Facades\Validator; |
||||||
|
|
||||||
|
class UserController extends Controller |
||||||
|
{ |
||||||
|
public function index(Request $request) |
||||||
|
{ |
||||||
|
$users = User::paginate(15); |
||||||
|
if (count($users) > $request->page) return response($users[$request->page]); |
||||||
|
return response(["message" => "Page not found"], 404); |
||||||
|
} |
||||||
|
|
||||||
|
public function show(Request $request) |
||||||
|
{ |
||||||
|
$user = User::find($request->id); |
||||||
|
if ($user) return response($user); |
||||||
|
return response(["message" => "User not found"], 404); |
||||||
|
} |
||||||
|
|
||||||
|
public function store(Request $request) |
||||||
|
{ |
||||||
|
$validator = Validator::make($request->all(), ["name" => "required"]); |
||||||
|
if ($validator->fails()) return response($validator->messages(), 400); |
||||||
|
response(User::create($request->all())); |
||||||
|
} |
||||||
|
|
||||||
|
public function update(Request $request) |
||||||
|
{ |
||||||
|
$user = User::find($request->id); |
||||||
|
if (!$user) return response(["message" => "User not found"], 404); |
||||||
|
$user->update($request->all()); |
||||||
|
return response($user); |
||||||
|
} |
||||||
|
|
||||||
|
public function destroy(Request $request) |
||||||
|
{ |
||||||
|
$user = User::find($request->id); |
||||||
|
if (!$user) return response(["message" => "User not found"], 404); |
||||||
|
$user->destroy(); |
||||||
|
return response([]); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,30 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
namespace App\Models; |
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Factories\HasFactory; |
||||||
|
use Illuminate\Database\Eloquent\Model; |
||||||
|
|
||||||
|
class Album extends Model |
||||||
|
{ |
||||||
|
use HasFactory; |
||||||
|
|
||||||
|
protected $fillable = [ |
||||||
|
"name", |
||||||
|
"description", |
||||||
|
"created_at", |
||||||
|
"updated_at" |
||||||
|
]; |
||||||
|
|
||||||
|
public function articles() |
||||||
|
{ |
||||||
|
return $this->hasMany(Article::class); |
||||||
|
} |
||||||
|
|
||||||
|
public function images() |
||||||
|
{ |
||||||
|
$images = []; |
||||||
|
foreach($this->articles as $article) $images = array_merge($images, $article->images); |
||||||
|
return $images; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,36 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
namespace App\Models; |
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Factories\HasFactory; |
||||||
|
use Illuminate\Database\Eloquent\Model; |
||||||
|
|
||||||
|
class Article extends Model |
||||||
|
{ |
||||||
|
use HasFactory; |
||||||
|
|
||||||
|
protected $fillable = [ |
||||||
|
"title", |
||||||
|
"description", |
||||||
|
"content", |
||||||
|
"user_id", |
||||||
|
"album_id", |
||||||
|
"created_at", |
||||||
|
"updated_at" |
||||||
|
]; |
||||||
|
|
||||||
|
public function album() |
||||||
|
{ |
||||||
|
return $this->belongsTo(Album::class); |
||||||
|
} |
||||||
|
|
||||||
|
public function user() |
||||||
|
{ |
||||||
|
return $this->belongsTo(User::class); |
||||||
|
} |
||||||
|
|
||||||
|
public function images() |
||||||
|
{ |
||||||
|
return $this->belongsToMany(Image::class, "images_articles"); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,22 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
namespace App\Models; |
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Factories\HasFactory; |
||||||
|
use Illuminate\Database\Eloquent\Model; |
||||||
|
|
||||||
|
class Categorie extends Model |
||||||
|
{ |
||||||
|
use HasFactory; |
||||||
|
|
||||||
|
protected $fillable = [ |
||||||
|
"name", |
||||||
|
"created_at", |
||||||
|
"updated_at" |
||||||
|
]; |
||||||
|
|
||||||
|
public function infos() |
||||||
|
{ |
||||||
|
return $this->hasMany(Info::class); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,17 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
namespace App\Models; |
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Factories\HasFactory; |
||||||
|
use Illuminate\Database\Eloquent\Model; |
||||||
|
|
||||||
|
class Image extends Model |
||||||
|
{ |
||||||
|
use HasFactory; |
||||||
|
|
||||||
|
protected $fillable = [ |
||||||
|
"url", |
||||||
|
"created_at", |
||||||
|
"updated_at" |
||||||
|
]; |
||||||
|
} |
@ -0,0 +1,30 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
namespace App\Models; |
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Factories\HasFactory; |
||||||
|
use Illuminate\Database\Eloquent\Model; |
||||||
|
|
||||||
|
class Info extends Model |
||||||
|
{ |
||||||
|
use HasFactory; |
||||||
|
|
||||||
|
protected $fillable = [ |
||||||
|
"title", |
||||||
|
"content", |
||||||
|
"categorie_id", |
||||||
|
"user_id", |
||||||
|
"created_at", |
||||||
|
"updated_at" |
||||||
|
]; |
||||||
|
|
||||||
|
public function user() |
||||||
|
{ |
||||||
|
return $this->belongsTo(User::class); |
||||||
|
} |
||||||
|
|
||||||
|
public function categorie() |
||||||
|
{ |
||||||
|
return $this->belongsTo(Categorie::class); |
||||||
|
} |
||||||
|
} |
@ -1,26 +0,0 @@ |
|||||||
<?php |
|
||||||
|
|
||||||
namespace App\View\Components; |
|
||||||
|
|
||||||
use Closure; |
|
||||||
use Illuminate\Contracts\View\View; |
|
||||||
use Illuminate\View\Component; |
|
||||||
|
|
||||||
class layout extends Component |
|
||||||
{ |
|
||||||
/** |
|
||||||
* Create a new component instance. |
|
||||||
*/ |
|
||||||
public function __construct() |
|
||||||
{ |
|
||||||
// |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Get the view / contents that represent the component. |
|
||||||
*/ |
|
||||||
public function render(): View|Closure|string |
|
||||||
{ |
|
||||||
return view('components.layout'); |
|
||||||
} |
|
||||||
} |
|
@ -1,83 +0,0 @@ |
|||||||
<?php |
|
||||||
|
|
||||||
use Laravel\Sanctum\Sanctum; |
|
||||||
|
|
||||||
return [ |
|
||||||
|
|
||||||
/* |
|
||||||
|-------------------------------------------------------------------------- |
|
||||||
| Stateful Domains |
|
||||||
|-------------------------------------------------------------------------- |
|
||||||
| |
|
||||||
| Requests from the following domains / hosts will receive stateful API |
|
||||||
| authentication cookies. Typically, these should include your local |
|
||||||
| and production domains which access your API via a frontend SPA. |
|
||||||
| |
|
||||||
*/ |
|
||||||
|
|
||||||
'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf( |
|
||||||
'%s%s', |
|
||||||
'localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1', |
|
||||||
Sanctum::currentApplicationUrlWithPort() |
|
||||||
))), |
|
||||||
|
|
||||||
/* |
|
||||||
|-------------------------------------------------------------------------- |
|
||||||
| Sanctum Guards |
|
||||||
|-------------------------------------------------------------------------- |
|
||||||
| |
|
||||||
| This array contains the authentication guards that will be checked when |
|
||||||
| Sanctum is trying to authenticate a request. If none of these guards |
|
||||||
| are able to authenticate the request, Sanctum will use the bearer |
|
||||||
| token that's present on an incoming request for authentication. |
|
||||||
| |
|
||||||
*/ |
|
||||||
|
|
||||||
'guard' => ['web'], |
|
||||||
|
|
||||||
/* |
|
||||||
|-------------------------------------------------------------------------- |
|
||||||
| Expiration Minutes |
|
||||||
|-------------------------------------------------------------------------- |
|
||||||
| |
|
||||||
| This value controls the number of minutes until an issued token will be |
|
||||||
| considered expired. This will override any values set in the token's |
|
||||||
| "expires_at" attribute, but first-party sessions are not affected. |
|
||||||
| |
|
||||||
*/ |
|
||||||
|
|
||||||
'expiration' => null, |
|
||||||
|
|
||||||
/* |
|
||||||
|-------------------------------------------------------------------------- |
|
||||||
| Token Prefix |
|
||||||
|-------------------------------------------------------------------------- |
|
||||||
| |
|
||||||
| Sanctum can prefix new tokens in order to take advantage of numerous |
|
||||||
| security scanning initiatives maintained by open source platforms |
|
||||||
| that notify developers if they commit tokens into repositories. |
|
||||||
| |
|
||||||
| See: https://docs.github.com/en/code-security/secret-scanning/about-secret-scanning |
|
||||||
| |
|
||||||
*/ |
|
||||||
|
|
||||||
'token_prefix' => env('SANCTUM_TOKEN_PREFIX', ''), |
|
||||||
|
|
||||||
/* |
|
||||||
|-------------------------------------------------------------------------- |
|
||||||
| Sanctum Middleware |
|
||||||
|-------------------------------------------------------------------------- |
|
||||||
| |
|
||||||
| When authenticating your first-party SPA with Sanctum you may need to |
|
||||||
| customize some of the middleware Sanctum uses while processing the |
|
||||||
| request. You may change the middleware listed below as required. |
|
||||||
| |
|
||||||
*/ |
|
||||||
|
|
||||||
'middleware' => [ |
|
||||||
'authenticate_session' => Laravel\Sanctum\Http\Middleware\AuthenticateSession::class, |
|
||||||
'encrypt_cookies' => Illuminate\Cookie\Middleware\EncryptCookies::class, |
|
||||||
'validate_csrf_token' => Illuminate\Foundation\Http\Middleware\ValidateCsrfToken::class, |
|
||||||
], |
|
||||||
|
|
||||||
]; |
|
@ -1,33 +0,0 @@ |
|||||||
<?php |
|
||||||
|
|
||||||
use Illuminate\Database\Migrations\Migration; |
|
||||||
use Illuminate\Database\Schema\Blueprint; |
|
||||||
use Illuminate\Support\Facades\Schema; |
|
||||||
|
|
||||||
return new class extends Migration |
|
||||||
{ |
|
||||||
/** |
|
||||||
* Run the migrations. |
|
||||||
*/ |
|
||||||
public function up(): void |
|
||||||
{ |
|
||||||
Schema::create('personal_access_tokens', function (Blueprint $table) { |
|
||||||
$table->id(); |
|
||||||
$table->morphs('tokenable'); |
|
||||||
$table->string('name'); |
|
||||||
$table->string('token', 64)->unique(); |
|
||||||
$table->text('abilities')->nullable(); |
|
||||||
$table->timestamp('last_used_at')->nullable(); |
|
||||||
$table->timestamp('expires_at')->nullable(); |
|
||||||
$table->timestamps(); |
|
||||||
}); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Reverse the migrations. |
|
||||||
*/ |
|
||||||
public function down(): void |
|
||||||
{ |
|
||||||
Schema::dropIfExists('personal_access_tokens'); |
|
||||||
} |
|
||||||
}; |
|
@ -0,0 +1,35 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration; |
||||||
|
use Illuminate\Database\Schema\Blueprint; |
||||||
|
use Illuminate\Support\Facades\Schema; |
||||||
|
use Illuminate\Support\Facades\DB; |
||||||
|
|
||||||
|
return new class extends Migration |
||||||
|
{ |
||||||
|
/** |
||||||
|
* Run the migrations. |
||||||
|
*/ |
||||||
|
public function up(): void |
||||||
|
{ |
||||||
|
Schema::create('albums', function (Blueprint $table) { |
||||||
|
$table->id(); |
||||||
|
$table->string("name", 255); |
||||||
|
$table->string("description", 800)->nullable(); |
||||||
|
$table->timestamps(); |
||||||
|
}); |
||||||
|
|
||||||
|
DB::table("albums")->insert([ |
||||||
|
"name" => "Autres", |
||||||
|
"description" => "Tout les articles sans album." |
||||||
|
]); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Reverse the migrations. |
||||||
|
*/ |
||||||
|
public function down(): void |
||||||
|
{ |
||||||
|
Schema::dropIfExists('albums'); |
||||||
|
} |
||||||
|
}; |
@ -0,0 +1,33 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration; |
||||||
|
use Illuminate\Database\Schema\Blueprint; |
||||||
|
use Illuminate\Support\Facades\Schema; |
||||||
|
use Illuminate\Support\Facades\DB; |
||||||
|
|
||||||
|
return new class extends Migration |
||||||
|
{ |
||||||
|
/** |
||||||
|
* Run the migrations. |
||||||
|
*/ |
||||||
|
public function up(): void |
||||||
|
{ |
||||||
|
Schema::create('images', function (Blueprint $table) { |
||||||
|
$table->id(); |
||||||
|
$table->string("url", 255)->unique(); |
||||||
|
$table->timestamps(); |
||||||
|
}); |
||||||
|
|
||||||
|
DB::table("images")->insert([ |
||||||
|
"url" => "default-pic.svg" |
||||||
|
]); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Reverse the migrations. |
||||||
|
*/ |
||||||
|
public function down(): void |
||||||
|
{ |
||||||
|
Schema::dropIfExists('images'); |
||||||
|
} |
||||||
|
}; |
@ -0,0 +1,34 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration; |
||||||
|
use Illuminate\Database\Schema\Blueprint; |
||||||
|
use Illuminate\Support\Facades\Schema; |
||||||
|
|
||||||
|
return new class extends Migration |
||||||
|
{ |
||||||
|
/** |
||||||
|
* Run the migrations. |
||||||
|
*/ |
||||||
|
public function up(): void |
||||||
|
{ |
||||||
|
Schema::create('articles', function (Blueprint $table) { |
||||||
|
$table->id(); |
||||||
|
$table->string("title", 255); |
||||||
|
$table->string("description", 800); |
||||||
|
$table->longText("content")->nullable(); |
||||||
|
$table->unsignedBigInteger("user_id"); |
||||||
|
$table->unsignedBigInteger("album_id")->default(0); |
||||||
|
$table->timestamps(); |
||||||
|
$table->foreign("user_id")->references("id")->on("users"); |
||||||
|
$table->foreign("album_id")->references("id")->on("albums"); |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Reverse the migrations. |
||||||
|
*/ |
||||||
|
public function down(): void |
||||||
|
{ |
||||||
|
Schema::dropIfExists('articles'); |
||||||
|
} |
||||||
|
}; |
@ -0,0 +1,33 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration; |
||||||
|
use Illuminate\Database\Schema\Blueprint; |
||||||
|
use Illuminate\Support\Facades\Schema; |
||||||
|
use Illuminate\Support\Facades\DB; |
||||||
|
|
||||||
|
return new class extends Migration |
||||||
|
{ |
||||||
|
/** |
||||||
|
* Run the migrations. |
||||||
|
*/ |
||||||
|
public function up(): void |
||||||
|
{ |
||||||
|
Schema::create('categories', function (Blueprint $table) { |
||||||
|
$table->id(); |
||||||
|
$table->string("name", 255)->unique(); |
||||||
|
$table->timestamps(); |
||||||
|
}); |
||||||
|
|
||||||
|
DB::table("categories")->insert([ |
||||||
|
"name" => "Autres" |
||||||
|
]); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Reverse the migrations. |
||||||
|
*/ |
||||||
|
public function down(): void |
||||||
|
{ |
||||||
|
Schema::dropIfExists('categories'); |
||||||
|
} |
||||||
|
}; |
@ -0,0 +1,33 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration; |
||||||
|
use Illuminate\Database\Schema\Blueprint; |
||||||
|
use Illuminate\Support\Facades\Schema; |
||||||
|
|
||||||
|
return new class extends Migration |
||||||
|
{ |
||||||
|
/** |
||||||
|
* Run the migrations. |
||||||
|
*/ |
||||||
|
public function up(): void |
||||||
|
{ |
||||||
|
Schema::create('infos', function (Blueprint $table) { |
||||||
|
$table->id(); |
||||||
|
$table->string("title", 255); |
||||||
|
$table->longText("content"); |
||||||
|
$table->unsignedBigInteger("categorie_id"); |
||||||
|
$table->unsignedBigInteger("user_id"); |
||||||
|
$table->timestamps(); |
||||||
|
$table->foreign("categorie_id")->references("id")->on("categories"); |
||||||
|
$table->foreign("user_id")->references("id")->on("users"); |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Reverse the migrations. |
||||||
|
*/ |
||||||
|
public function down(): void |
||||||
|
{ |
||||||
|
Schema::dropIfExists('infos'); |
||||||
|
} |
||||||
|
}; |
@ -0,0 +1,29 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration; |
||||||
|
use Illuminate\Database\Schema\Blueprint; |
||||||
|
use Illuminate\Support\Facades\Schema; |
||||||
|
|
||||||
|
return new class extends Migration |
||||||
|
{ |
||||||
|
/** |
||||||
|
* Run the migrations. |
||||||
|
*/ |
||||||
|
public function up(): void |
||||||
|
{ |
||||||
|
Schema::create('images_articles', function (Blueprint $table) { |
||||||
|
$table->id(); |
||||||
|
$table->unsignedBigInteger("image_id"); |
||||||
|
$table->unsignedBigInteger("article_id"); |
||||||
|
$table->timestamps(); |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Reverse the migrations. |
||||||
|
*/ |
||||||
|
public function down(): void |
||||||
|
{ |
||||||
|
Schema::dropIfExists('images_articles'); |
||||||
|
} |
||||||
|
}; |
@ -0,0 +1,24 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
namespace Database\Seeders; |
||||||
|
|
||||||
|
use Illuminate\Database\Console\Seeds\WithoutModelEvents; |
||||||
|
use Illuminate\Database\Seeder; |
||||||
|
use App\Models\Album; |
||||||
|
|
||||||
|
class AlbumsSeeder extends Seeder |
||||||
|
{ |
||||||
|
/** |
||||||
|
* Run the database seeds. |
||||||
|
*/ |
||||||
|
public function run(): void |
||||||
|
{ |
||||||
|
$faker = \Faker\Factory::create(); |
||||||
|
for ($i = 0; $i < 10; $i++) |
||||||
|
Album::create([ |
||||||
|
"name" => $faker->title(), |
||||||
|
"description" => $faker->paragraph(), |
||||||
|
]); |
||||||
|
|
||||||
|
} |
||||||
|
} |
@ -0,0 +1,17 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
namespace Database\Seeders; |
||||||
|
|
||||||
|
use Illuminate\Database\Console\Seeds\WithoutModelEvents; |
||||||
|
use Illuminate\Database\Seeder; |
||||||
|
|
||||||
|
class ArticlesSeeder extends Seeder |
||||||
|
{ |
||||||
|
/** |
||||||
|
* Run the database seeds. |
||||||
|
*/ |
||||||
|
public function run(): void |
||||||
|
{ |
||||||
|
// |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,22 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
namespace Database\Seeders; |
||||||
|
|
||||||
|
use Illuminate\Database\Console\Seeds\WithoutModelEvents; |
||||||
|
use Illuminate\Database\Seeder; |
||||||
|
use App\Models\Categorie; |
||||||
|
|
||||||
|
class CategoriesSeeder extends Seeder |
||||||
|
{ |
||||||
|
/** |
||||||
|
* Run the database seeds. |
||||||
|
*/ |
||||||
|
public function run(): void |
||||||
|
{ |
||||||
|
$faker = \Faker\Factory::create(); |
||||||
|
for ($i = 0; $i < 8; $i++) |
||||||
|
Categorie::create([ |
||||||
|
"name" => $faker->title(), |
||||||
|
]); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,17 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
namespace Database\Seeders; |
||||||
|
|
||||||
|
use Illuminate\Database\Console\Seeds\WithoutModelEvents; |
||||||
|
use Illuminate\Database\Seeder; |
||||||
|
|
||||||
|
class InfosSeeder extends Seeder |
||||||
|
{ |
||||||
|
/** |
||||||
|
* Run the database seeds. |
||||||
|
*/ |
||||||
|
public function run(): void |
||||||
|
{ |
||||||
|
// |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,28 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
namespace Database\Seeders; |
||||||
|
|
||||||
|
use Illuminate\Database\Console\Seeds\WithoutModelEvents; |
||||||
|
use Illuminate\Database\Seeder; |
||||||
|
use App\Models\User; |
||||||
|
use Carbon\Carbon; |
||||||
|
|
||||||
|
class UsersSeeder extends Seeder |
||||||
|
{ |
||||||
|
/** |
||||||
|
* Run the database seeds. |
||||||
|
*/ |
||||||
|
public function run(): void |
||||||
|
{ |
||||||
|
// $faker = \Faker\Factory::create(); |
||||||
|
// for ($i = 0; $i < 15; $i++) |
||||||
|
// User::create([ |
||||||
|
// "name" => $faker->firstName(), |
||||||
|
// "lastname" => $faker->lastName(), |
||||||
|
// "totem" => $faker->company(), |
||||||
|
// "email" => $faker->email(), |
||||||
|
// "phone" => $faker->e164PhoneNumber(), |
||||||
|
// "email_verified_at" => Carbon::now(), |
||||||
|
// ]); |
||||||
|
} |
||||||
|
} |
@ -1,6 +0,0 @@ |
|||||||
export default { |
|
||||||
plugins: { |
|
||||||
tailwindcss: {}, |
|
||||||
autoprefixer: {}, |
|
||||||
}, |
|
||||||
} |
|
Before Width: | Height: | Size: 118 KiB After Width: | Height: | Size: 0 B |
Before Width: | Height: | Size: 516 B |
Before Width: | Height: | Size: 915 B |
Before Width: | Height: | Size: 823 B |
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB |
@ -1,54 +0,0 @@ |
|||||||
# Baslac.ch |
|
||||||
|
|
||||||
# Pages |
|
||||||
* Article |
|
||||||
* lister tout les article |
|
||||||
* montrer un article en detail |
|
||||||
* creer un aricle (Utilisateur) |
|
||||||
* Page info |
|
||||||
* montrer une page info en detail |
|
||||||
* creer une page info (Utilisateur) |
|
||||||
* les page info seront lister dans le menu du site par categorie |
|
||||||
* Contact |
|
||||||
* Lister les utilisateur qui peuvent etre contacté et montre les info de contact |
|
||||||
|
|
||||||
# Fonctionnalité |
|
||||||
* Un utilisateur par chef. |
|
||||||
* Les cutilisateur sont créer uniquement pour les chef. |
|
||||||
* Les article sont postée automatiquement sur les autre réseau. |
|
||||||
* Affiché le programme au formats pdf. |
|
||||||
* Possibilité pour les parents de s'inscrire a une news letter |
|
||||||
* Afficher les informations du groupe |
|
||||||
* Les utilisateur peuvent faire des articles. |
|
||||||
* Les contenu des article peuvent est ecrire dans le meme style que se document. |
|
||||||
* Les utilisateur doivent recevoir un code pour pouvoir sign in, code qui peux etre produit par n'import quel utilisateur. |
|
||||||
* Le premiere utilisateur sera groupe@baslac.ch et sera controller par l'administrateur du site. |
|
||||||
# Donnée |
|
||||||
obligatoire = * |
|
||||||
|
|
||||||
## Utilisateur |
|
||||||
* Nom * |
|
||||||
* Role |
|
||||||
* Totem |
|
||||||
* Photo de profil |
|
||||||
* Email * |
|
||||||
* Numero de telephone |
|
||||||
* Contactable (Oui/Non) |
|
||||||
* Mot de passe |
|
||||||
|
|
||||||
|
|
||||||
## Article |
|
||||||
* titre * |
|
||||||
* description * |
|
||||||
* photos * |
|
||||||
* contenu |
|
||||||
* date |
|
||||||
* auteur(Utilisateur) * |
|
||||||
|
|
||||||
## page info |
|
||||||
* nom de la page |
|
||||||
* contenu |
|
||||||
|
|
||||||
## categorie |
|
||||||
* nom de la categorie |
|
||||||
* lien vers des pages infos |
|
@ -1,7 +0,0 @@ |
|||||||
@tailwind base; |
|
||||||
@tailwind components; |
|
||||||
@tailwind utilities; |
|
||||||
|
|
||||||
:root { |
|
||||||
--menu-back-color:#681536ef; |
|
||||||
} |
|
@ -1,21 +0,0 @@ |
|||||||
<!DOCTYPE html> |
|
||||||
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}" class="dark"> |
|
||||||
<head> |
|
||||||
<meta charset="UTF-8"> |
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0"> |
|
||||||
@if($title) <title>Scouts Baslac - {{ $title }}</title> |
|
||||||
@else <title>Scouts Baslac</title> |
|
||||||
@endif |
|
||||||
|
|
||||||
@vite('resources/css/app.css') |
|
||||||
|
|
||||||
@if($csslinks) {{ $csslinks }} |
|
||||||
@endif |
|
||||||
@if($jslinks) {{ $jslinks }} |
|
||||||
@endif |
|
||||||
</head> |
|
||||||
<body class="w-full h-screen flex laptop:flex-row flex-col dark:bg-black dark:text-white"> |
|
||||||
@include('prefab.menu-list') |
|
||||||
{{ $slot }} |
|
||||||
</body> |
|
||||||
</html> |
|
@ -1,4 +0,0 @@ |
|||||||
<a href="{{ $href }}" class="flex laptop:w-1/2 my-5 mx-10"> |
|
||||||
<img class="laptop:w-[20px] dark:brightness-0 dark:invert" src="/img/{{ $icon }}.svg"> |
|
||||||
<p class="text-xl ml-2">{{ $name }}</p> |
|
||||||
</a> |
|
@ -1,25 +0,0 @@ |
|||||||
<nav class="laptop:h-screen laptop:w-[200px] w-full h-[100px] laptop:border-r border-b border-black dark:border-white"> |
|
||||||
<div class="w-full flex h-full laptop:flex-col laptop:items-center"> |
|
||||||
<div class="laptop:w-4/5 py-2 mx-10"> |
|
||||||
<img class="laptop:h-[100px]" src="/img/baslac.svg"> |
|
||||||
</div> |
|
||||||
<div class="flex laptop:w-full h-full |
|
||||||
laptop:border-t laptop:border-gray-400 laptop:flex-col items-center"> |
|
||||||
@include("prefab.item-list", [ |
|
||||||
"name" => "Infos", |
|
||||||
"href" => "#", |
|
||||||
"icon" => "info_icon" |
|
||||||
]) |
|
||||||
@include("prefab.item-list", [ |
|
||||||
"name" => "Articles", |
|
||||||
"href" => "#", |
|
||||||
"icon" => "article_icon" |
|
||||||
]) |
|
||||||
@include("prefab.item-list", [ |
|
||||||
"name" => "Contact", |
|
||||||
"href" => "#", |
|
||||||
"icon" => "contact_icon" |
|
||||||
]) |
|
||||||
</div> |
|
||||||
</div> |
|
||||||
</nav> |
|
@ -1,8 +0,0 @@ |
|||||||
<?php |
|
||||||
|
|
||||||
use Illuminate\Http\Request; |
|
||||||
use Illuminate\Support\Facades\Route; |
|
||||||
|
|
||||||
Route::get('/user', function (Request $request) { |
|
||||||
return $request->user(); |
|
||||||
})->middleware('auth:sanctum'); |
|
@ -1,13 +1,45 @@ |
|||||||
<?php |
<?php |
||||||
|
|
||||||
use Illuminate\Support\Facades\Route; |
use Illuminate\Support\Facades\Route; |
||||||
|
use App\Http\Controllers\AlbumController; |
||||||
|
use App\Http\Controllers\ArticleController; |
||||||
|
use App\Http\Controllers\CategorieController; |
||||||
|
use App\Http\Controllers\ImageController; |
||||||
|
use App\Http\Controllers\InfoController; |
||||||
|
use App\Http\Controllers\UserController; |
||||||
|
use App\Http\Controllers\AuthController; |
||||||
|
|
||||||
Route::get('/', function () { |
Route::get('/', function () { return view('home'); }); |
||||||
return view('home'); |
|
||||||
}); |
|
||||||
|
|
||||||
Route::get('/home', function () { |
Route::get("/albums", [AlbumController::class, "index"]); |
||||||
return redirect('/'); |
Route::get("/albums/{id}", [AlbumController::class, "show"]); |
||||||
}); |
Route::post("/albums", [AlbumController::class, "store"]); |
||||||
|
Route::put("/albums/{id}", [AlbumController::class, "update"]); |
||||||
|
Route::delete("/albums/{id}", [AlbumController::class, "destroy"]); |
||||||
|
|
||||||
|
Route::get("/article", [ArticleController::class, "index"]); |
||||||
|
Route::get("/article/{id}", [ArticleController::class, "show"]); |
||||||
|
Route::post("/article", [ArticleController::class, "store"]); |
||||||
|
Route::put("/article/{id}", [ArticleController::class, "update"]); |
||||||
|
Route::delete("/article/{id}", [ArticleController::class, "destroy"]); |
||||||
|
|
||||||
|
Route::get("/categories", [CategorieController::class, "index"]); |
||||||
|
Route::get("/categories/{id}", [CategorieController::class, "show"]); |
||||||
|
Route::post("/categories", [CategorieController::class, "store"]); |
||||||
|
Route::put("/categories/{id}", [CategorieController::class, "update"]); |
||||||
|
Route::delete("/categories/{id}", [CategorieController::class, "destroy"]); |
||||||
|
|
||||||
|
Route::get("/users", [UserController::class, "index"]); |
||||||
|
Route::get("/users/{id}", [UserController::class, "show"]); |
||||||
|
Route::post("/users", [UserController::class, "store"]); |
||||||
|
Route::put("/users/{id}", [UserController::class, "update"]); |
||||||
|
Route::delete("/users/{id}", [UserController::class, "destroy"]); |
||||||
|
|
||||||
|
Route::get("/infos", [InfoController::class, "index"]); |
||||||
|
Route::get("/infos/{id}", [InfoController::class, "show"]); |
||||||
|
Route::post("/infos", [InfoController::class, "store"]); |
||||||
|
Route::put("/infos/{id}", [InfoController::class, "update"]); |
||||||
|
Route::delete("/infos/{id}", [InfoController::class, "destroy"]); |
||||||
|
|
||||||
|
Route::post("/images", [ImageController::class, "store"]); |
||||||
|
Route::delete("/images/{id}", [ImageController::class, "destroy"]); |
@ -1,3 +1,4 @@ |
|||||||
* |
* |
||||||
|
!private/ |
||||||
!public/ |
!public/ |
||||||
!.gitignore |
!.gitignore |
||||||
|
@ -0,0 +1,2 @@ |
|||||||
|
* |
||||||
|
!.gitignore |
@ -1,18 +0,0 @@ |
|||||||
/** @type {import('tailwindcss').Config} */ |
|
||||||
export default { |
|
||||||
darkMode: 'class', |
|
||||||
content: [ |
|
||||||
"./resources/**/*.blade.php", |
|
||||||
"./resources/**/*.js", |
|
||||||
"./resources/**/*.vue", |
|
||||||
], |
|
||||||
theme: { |
|
||||||
screens: { |
|
||||||
'tablet': '640px', |
|
||||||
'laptop': '1280px', |
|
||||||
'desktop': '1920px', |
|
||||||
}, |
|
||||||
extend: {}, |
|
||||||
}, |
|
||||||
plugins: [], |
|
||||||
} |
|
@ -1,8 +0,0 @@ |
|||||||
# todo |
|
||||||
* creer base du site laravel vue.js tailwind |
|
||||||
* creer la base de donné et les migration |
|
||||||
* creer les utilisateur |
|
||||||
* creer les controller/API d'authentification |
|
||||||
* creer les models des donnée du site |
|
||||||
* creer les API de ces donnée |
|
||||||
* creer les pages avec vue.js |
|