feat: Add user level and experience attributes, and implement reward, task, and quest models with corresponding controllers and migrations

This commit is contained in:
Jonas Pfalzgraf 2024-12-16 09:00:57 +01:00
parent aa50740dcb
commit fd20278948
17 changed files with 963 additions and 112 deletions

View file

@ -0,0 +1,60 @@
<?php
namespace App\Http\Controllers;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
class AuthController extends Controller
{
public function register(Request $request)
{
$request->validate([
'name' => 'required',
'email' => 'required|email|unique:users',
'password' => 'required|min:6'
]);
$user = User::create([
'name' => $request->name,
'email' => $request->email,
'password' => Hash::make($request->password),
'level' => 1,
'xp' => 0
]);
$token = $user->createToken('api_token')->plainTextToken;
return response()->json([
'user' => $user,
'token' => $token
], 201);
}
public function login(Request $request)
{
$request->validate([
'email' => 'required|email',
'password' => 'required'
]);
$user = User::where('email', $request->email)->first();
if (!$user || !Hash::check($request->password, $user->password)) {
return response()->json(['message' => 'Invalid credentials'], 401);
}
$token = $user->createToken('api_token')->plainTextToken;
return response()->json([
'token' => $token,
'user' => $user
]);
}
public function me(Request $request)
{
return response()->json(['user' => $request->user()]);
}
}

View file

@ -0,0 +1,70 @@
<?php
namespace App\Http\Controllers;
use App\Models\Quest;
use App\Models\Task;
use Illuminate\Http\Request;
class QuestController extends Controller
{
public function index(Request $request)
{
$quests = Quest::where('user_id', $request->user()->id)->where('is_completed', false)->get();
return response()->json($quests);
}
public function generate(Request $request)
{
// Vereinfachte Logik: Nimmt die letzten 5 offenen Tasks und macht daraus Quests
$tasks = Task::where('user_id', $request->user()->id)->limit(5)->get();
$quests = [];
foreach ($tasks as $task) {
$quests[] = Quest::create([
'user_id' => $request->user()->id,
'task_id' => $task->id,
'title' => $task->title,
'category' => $task->category,
'due_date' => $task->due_date,
'xp_reward' => 50,
'is_completed' => false
]);
}
return response()->json($quests, 201);
}
public function complete(Request $request, $id)
{
$quest = Quest::where('user_id', $request->user()->id)->findOrFail($id);
if ($quest->is_completed) {
return response()->json(['message' => 'Quest already completed'], 400);
}
// Mark as completed
$quest->update(['is_completed' => true]);
$user = $request->user();
$user->xp += $quest->xp_reward;
// Level-Up Check (vereinfachte Logik)
$xpForNextLevel = $user->level * 100;
$levelUp = false;
while ($user->xp >= $xpForNextLevel) {
$user->level += 1;
$user->xp = $user->xp - $xpForNextLevel;
$xpForNextLevel = $user->level * 100;
$levelUp = true;
}
$user->save();
return response()->json([
'quest' => $quest,
'xp_gained' => $quest->xp_reward,
'new_level' => $user->level,
'level_up' => $levelUp
]);
}
}

View file

@ -0,0 +1,22 @@
<?php
namespace App\Http\Controllers;
use App\Models\Reward;
use Illuminate\Http\Request;
class RewardController extends Controller
{
public function index(Request $request)
{
$rewards = Reward::all();
return response()->json($rewards);
}
public function unlocked(Request $request)
{
$user = $request->user();
$unlocked = $user->belongsToMany(Reward::class, 'reward_user')->get();
return response()->json($unlocked);
}
}

View file

@ -0,0 +1,57 @@
<?php
namespace App\Http\Controllers;
use App\Models\Task;
use Illuminate\Http\Request;
class TaskController extends Controller
{
public function index(Request $request)
{
$tasks = Task::where('user_id', $request->user()->id)->get();
return response()->json($tasks);
}
public function store(Request $request)
{
$request->validate([
'title' => 'required',
'category' => 'in:daily,weekend,vacation,work',
'priority' => 'in:low,medium,high'
]);
$task = Task::create([
'user_id' => $request->user()->id,
'title' => $request->title,
'description' => $request->description,
'category' => $request->category ?? 'daily',
'priority' => $request->priority ?? 'medium',
'due_date' => $request->due_date
]);
return response()->json($task, 201);
}
public function show(Request $request, $id)
{
$task = Task::where('user_id', $request->user()->id)->findOrFail($id);
return response()->json($task);
}
public function update(Request $request, $id)
{
$task = Task::where('user_id', $request->user()->id)->findOrFail($id);
$task->update($request->only('title', 'description', 'category', 'priority', 'due_date'));
return response()->json($task);
}
public function destroy(Request $request, $id)
{
$task = Task::where('user_id', $request->user()->id)->findOrFail($id);
$task->delete();
return response()->noContent();
}
}

View file

@ -0,0 +1,25 @@
<?php
namespace App\Http\Controllers;
use App\Models\Reward;
use Illuminate\Http\Request;
class UserController extends Controller
{
public function status(Request $request)
{
$user = $request->user();
$xpForNextLevel = $user->level * 100;
// Finde noch nicht freigeschaltete Rewards, die in Reichweite sind
$upcomingRewards = Reward::where('unlocked_at_level', '>', $user->level)->limit(5)->get();
return response()->json([
'level' => $user->level,
'xp' => $user->xp,
'xp_for_next_level' => $xpForNextLevel,
'upcoming_rewards' => $upcomingRewards
]);
}
}