feat: Add user level and experience attributes, and implement reward, task, and quest models with corresponding controllers and migrations
This commit is contained in:
parent
aa50740dcb
commit
fd20278948
17 changed files with 963 additions and 112 deletions
60
backend/app/Http/Controllers/AuthController.php
Normal file
60
backend/app/Http/Controllers/AuthController.php
Normal 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()]);
|
||||
}
|
||||
}
|
70
backend/app/Http/Controllers/QuestController.php
Normal file
70
backend/app/Http/Controllers/QuestController.php
Normal 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
|
||||
]);
|
||||
}
|
||||
}
|
22
backend/app/Http/Controllers/RewardController.php
Normal file
22
backend/app/Http/Controllers/RewardController.php
Normal 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);
|
||||
}
|
||||
}
|
57
backend/app/Http/Controllers/TaskController.php
Normal file
57
backend/app/Http/Controllers/TaskController.php
Normal 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();
|
||||
}
|
||||
}
|
25
backend/app/Http/Controllers/UserController.php
Normal file
25
backend/app/Http/Controllers/UserController.php
Normal 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
|
||||
]);
|
||||
}
|
||||
}
|
31
backend/app/Models/Quest.php
Normal file
31
backend/app/Models/Quest.php
Normal file
|
@ -0,0 +1,31 @@
|
|||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class Quest extends Model
|
||||
{
|
||||
use HasFactory;
|
||||
|
||||
protected $fillable = [
|
||||
'user_id',
|
||||
'task_id',
|
||||
'title',
|
||||
'category',
|
||||
'due_date',
|
||||
'xp_reward',
|
||||
'is_completed'
|
||||
];
|
||||
|
||||
public function user()
|
||||
{
|
||||
return $this->belongsTo(User::class);
|
||||
}
|
||||
|
||||
public function task()
|
||||
{
|
||||
return $this->belongsTo(Task::class);
|
||||
}
|
||||
}
|
22
backend/app/Models/Reward.php
Normal file
22
backend/app/Models/Reward.php
Normal file
|
@ -0,0 +1,22 @@
|
|||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class Reward extends Model
|
||||
{
|
||||
use HasFactory;
|
||||
|
||||
protected $fillable = [
|
||||
'name',
|
||||
'description',
|
||||
'unlocked_at_level'
|
||||
];
|
||||
|
||||
public function users()
|
||||
{
|
||||
return $this->belongsToMany(User::class, 'reward_user');
|
||||
}
|
||||
}
|
25
backend/app/Models/Task.php
Normal file
25
backend/app/Models/Task.php
Normal file
|
@ -0,0 +1,25 @@
|
|||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class Task extends Model
|
||||
{
|
||||
use HasFactory;
|
||||
|
||||
protected $fillable = [
|
||||
'user_id',
|
||||
'title',
|
||||
'description',
|
||||
'category',
|
||||
'priority',
|
||||
'due_date'
|
||||
];
|
||||
|
||||
public function user()
|
||||
{
|
||||
return $this->belongsTo(User::class);
|
||||
}
|
||||
}
|
|
@ -20,6 +20,8 @@ class User extends Authenticatable
|
|||
'name',
|
||||
'email',
|
||||
'password',
|
||||
'level',
|
||||
'xp'
|
||||
];
|
||||
|
||||
/**
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue