feat: Multiple Systems

This commit is contained in:
2024-03-18 01:26:54 +01:00
parent 22ea1930c4
commit 12d8f3913c
29 changed files with 2556 additions and 90 deletions

View File

@@ -0,0 +1,130 @@
<?php
namespace App\Http\Controllers;
use App\Models\BookRecommendation;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
class BookRecommendationController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index()
{
$relations = [];
if (request()->has('with')) {
$relations = explode(',', request()->with);
}
return BookRecommendation::with($relations)->get();
}
/**
* Show the form for creating a new resource.
*/
public function create()
{
//
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
$request->validate([
'book_name' => 'required|string|max:255',
'author' => 'required|string|max:255',
'description' => 'nullable|string',
'isbn' => 'required|string|unique:book_recommendations,isbn',
'pages' => 'required|integer',
'status' => 'in:PENDING,COMPLETED,REJECTED,ACTIVE',
'cover_image' => 'nullable|image|mimes:jpeg,png,jpg,gif|max:2048',
]);
$data = $request->all();
if ($request->hasFile('cover_image')) {
$imagePath = $request->file('cover_image')->store('cover_images', 'public');
$data['cover_image'] = $imagePath;
}
$bookRecommendation = BookRecommendation::create([...$request->all(), 'recommended_by' => auth()->id()]);
return response()->json($bookRecommendation, 201);
}
/**
* Display the specified resource.
*/
public function show(string $id)
{
$relations = [];
if (request()->has('with')) {
$relations = explode(',', request()->with);
}
$bookRecommendation = BookRecommendation::with($relations)->findOrFail($id);
return response()->json($bookRecommendation);
}
/**
* Show the form for editing the specified resource.
*/
public function edit(string $id)
{
//
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, string $id)
{
$bookRecommendation = BookRecommendation::findOrFail($id);
$request->validate([
'book_name' => 'string|max:255',
'author' => 'string|max:255',
'description' => 'nullable|string',
'isbn' => 'string|unique:book_recommendations,isbn,'.$bookRecommendation->id,
'pages' => 'integer',
'recommended_by' => 'exists:users,id',
'status' => 'in:PENDING,COMPLETED,REJECTED,ACTIVE',
'cover_image' => 'nullable|image|mimes:jpeg,png,jpg,gif|max:2048',
]);
if ($bookRecommendation->recommended_by !== auth()->id() && !(auth()->user()->hasRole('admin')) ) {
return response()->json(['message' => 'Keine Berechtigung.'], 403);
}
$data = $request->all();
if ($request->hasFile('cover_image')) {
// Delete old image if exists
if ($bookRecommendation->cover_image) {
Storage::delete($bookRecommendation->cover_image);
}
$imagePath = $request->file('cover_image')->store('cover_images', 'public');
$data['cover_image'] = $imagePath;
}
$bookRecommendation->update($data);
return response()->json($bookRecommendation);
}
/**
* Remove the specified resource from storage.
*/
public function destroy(string $id)
{
$bookRecommendation = BookRecommendation::findOrFail($id);
if ($bookRecommendation->recommended_by !== auth()->id() && !(auth()->user()->hasRole('admin')) ) {
return response()->json(['message' => 'Keine Berechtigung.'], 403);
}
$bookRecommendation->delete();
return response()->json(null, 204);
}
}

View File

@@ -0,0 +1,32 @@
<?php
namespace App\Http\Controllers;
use App\Models\BookRecommendation;
use App\Models\Vote;
use Illuminate\Http\Request;
class VoteController extends Controller
{
public function castVote(Request $request)
{
$request->validate([
'book_recommendation_id' => 'required|exists:book_recommendations,id',
]);
$user = $request->user();
if ($user->total_votes > 0) {
$user->decrement('total_votes');
Vote::create([
'user_id' => $user->id,
'book_recommendation_id' => $request->book_recommendation_id,
]);
return response()->json(['message' => 'Vote successfully cast.']);
}
return response()->json(['message' => 'No remaining votes.'], 403);
}
}

View File

@@ -0,0 +1,34 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class BookRecommendation extends Model
{
protected $table = 'book_recommendations';
protected $fillable = [
'book_name',
'author',
'description',
'isbn',
'pages',
'recommended_by',
'cover_image',
'status',
];
/**
* Get the user that recommended the book.
*/
public function recommender()
{
return $this->belongsTo(User::class, 'recommended_by');
}
public function votes()
{
return $this->hasMany(Vote::class);
}
}

View File

@@ -24,6 +24,7 @@ class User extends Authenticatable implements MustVerifyEmail
'email',
'avatar',
'password',
'total_votes',
];
/**
@@ -57,6 +58,11 @@ class User extends Authenticatable implements MustVerifyEmail
return $this->hasMany(UserProvider::class);
}
public function votes()
{
return $this->hasMany(Vote::class);
}
public function mustVerifyEmail(): bool
{
return $this instanceof MustVerifyEmail && !$this->hasVerifiedEmail();

26
app/Models/Vote.php Normal file
View File

@@ -0,0 +1,26 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Vote extends Model
{
use HasFactory;
protected $fillable = [
'user_id',
'book_recommendation_id',
];
public function user()
{
return $this->belongsTo(User::class);
}
public function bookRecommendation()
{
return $this->belongsTo(BookRecommendation::class);
}
}