Skip to content
Snippets Groups Projects
Commit 2f6d1fc6 authored by Maxime FRIESS's avatar Maxime FRIESS :blue_heart:
Browse files

Merge branch 'feature/create-game' into 'develop'

Added game creation

Closes #11

See merge request !11
parents 3a9f8ddc d2b217bd
Branches
Tags
1 merge request!11Added game creation
Pipeline #100900 passed with stages
in 52 seconds
......@@ -3,8 +3,12 @@
namespace App\Http\Controllers\Client;
use App\Http\Controllers\Controller;
use App\Http\Requests\CreateGameRequest;
use App\Models\Game;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
class GameController extends Controller
{
......@@ -88,7 +92,7 @@ public function show($id)
]);
}
/**
/**
* @OA\Get(
* tags={"Client:Game"},
* path="/game/{id}/user",
......@@ -209,12 +213,72 @@ public function index_users($id)
* )
*/
public function show_users($id , $user_id)
public function show_users($id, $user_id)
{
return response()->json([
"user" => Game::findOrFail($id)->users()->findOrFail($user_id)
]);
}
/**
* @OA\Post(
* tags={"Server:Game"},
* path="/game",
* summary="Create a game",
* @OA\RequestBody(
* ref="#/components/requestBodies/CreateGame"
* ),
* @OA\Response(
* response="401",
* ref="#/components/responses/401"
* ),
* @OA\Response(
* response="403",
* ref="#/components/responses/403"
* ),
* @OA\Response(
* response="422",
* ref="#/components/responses/422"
* ),
* @OA\Response(
* response="201",
* description="Resource created",
* @OA\JsonContent(
* @OA\Property(
* property="game",
* ref="#/components/schemas/Game",
* ),
* ),
* ),
* security={{"server-jwt":{}}},
* )
*/
public function store(CreateGameRequest $request)
{
$server = Auth::guard('server')->user();
DB::beginTransaction();
$game = Game::create([
"server_id" => $server->id
]);
foreach ($request->input("users") as $user) {
$user = User::findOrFail($user["id"]);
if ($user->server_id === $server->id && $user->server_state === 'connected') {
$game->users()->attach($user->id, []);
} else {
DB::rollBack();
return response()->json([
"message" => "Forbidden access to user " . $user->id
], 403);
}
}
DB::commit();
return response()->json([
"game" => $game
], 201);
}
}
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
/**
* @OA\RequestBody(
* request="CreateGame",
* required=true,
* @OA\JsonContent(
* required={"users"},
* @OA\Property(
* property="users",
* type="array",
* description="Users who participated in the game",
* @OA\Items(
* @OA\Property(
* property="id",
* type="int",
* description="ID of the user"
* )
* )
* ),
* ),
* ),
*/
class CreateGameRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, mixed>
*/
public function rules()
{
return [
"users" => "required|array|min:2",
"users.*.id" => "required|exists:users,id|distinct"
];
}
}
......@@ -43,7 +43,7 @@
Route::middleware(['api', 'auth:client'])->group(function () {
Route::apiResource('server', Client\ServerController::class);
Route::apiResource('user', Client\UserController::class, ['only' => ['index', 'show']]);
Route::apiResource('user', Client\UserController::class, ['only' => ['index']]);
Route::apiResource('game', Client\GameController::class, ['only' => ['index', 'show']]);
Route::get('server/{id}/game' , [Client\ServerController::class , 'index_games']);
Route::get('user/{id}/game' , [Client\UserController::class , 'index_usergame']);
......@@ -56,8 +56,12 @@
});
Route::middleware(['api', 'auth:server'])->group(function () {
Route::get('user/{id}', [Client\UserController::class, 'show']);
Route::post('user/{id}/accept', [server\AcceptController::class, 'accept']);
Route::resource('game', Client\GameController::class, ['only' => ['store']]);
});
Route::middleware(['api', 'auth:client,server'])->group(function () {
Route::get('user/{id}', [Client\UserController::class, 'show']);
});
Route::fallback(function () {
......
<?php
namespace Tests\Feature;
use App\Models\Server;
use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Tests\TestCase;
class GameCreationTest extends TestCase
{
use RefreshDatabase;
public function test_good()
{
$user1 = User::create([
'username' => 'test',
'email' => 'test@localhost',
'password' => Hash::make('test'),
]);
$user2 = User::create([
'username' => 'test2',
'email' => 'test2@localhost',
'password' => Hash::make('test'),
]);
$server = Server::create([
'login' => 'test',
'password' => Hash::make('test'),
'owner_id' => $user1->id,
'public' => true
]);
$user1->server_id = $server->id;
$user1->server_state = 'connected';
$user1->save();
$user2->server_id = $server->id;
$user2->server_state = 'connected';
$user2->save();
$token = Auth::guard('server')->login($server);
$response = $this->withHeaders([
"Authorization" => "Bearer " . $token
])->postJson('/api/game', [
"users" => [[
"id" => $user1->id
], [
"id" => $user2->id
]]
]);
$response->assertStatus(201);
$this->assertDatabaseCount("games", 1);
$this->assertDatabaseCount("users_games", 2);
}
public function test_user_not_connected()
{
$user1 = User::create([
'username' => 'test',
'email' => 'test@localhost',
'password' => Hash::make('test'),
]);
$user2 = User::create([
'username' => 'test2',
'email' => 'test2@localhost',
'password' => Hash::make('test'),
]);
$server = Server::create([
'login' => 'test',
'password' => Hash::make('test'),
'owner_id' => $user1->id,
'public' => true
]);
$user1->server_id = $server->id;
$user1->server_state = 'connected';
$user1->save();
$token = Auth::guard('server')->login($server);
$response = $this->withHeaders([
"Authorization" => "Bearer " . $token
])->postJson('/api/game', [
"users" => [[
"id" => $user1->id
], [
"id" => $user2->id
]]
]);
$response->assertStatus(403);
$this->assertDatabaseCount("games", 0);
$this->assertDatabaseCount("users_games", 0);
}
public function test_not_enough_users()
{
$user1 = User::create([
'username' => 'test',
'email' => 'test@localhost',
'password' => Hash::make('test'),
]);
$server = Server::create([
'login' => 'test',
'password' => Hash::make('test'),
'owner_id' => $user1->id,
'public' => true
]);
$user1->server_id = $server->id;
$user1->server_state = 'connected';
$user1->save();
$token = Auth::guard('server')->login($server);
$response = $this->withHeaders([
"Authorization" => "Bearer " . $token
])->postJson('/api/game', [
"users" => [[
"id" => $user1->id
]]
]);
$response->assertStatus(422);
$this->assertDatabaseCount("games", 0);
$this->assertDatabaseCount("users_games", 0);
}
public function test_not_same_users()
{
$user1 = User::create([
'username' => 'test',
'email' => 'test@localhost',
'password' => Hash::make('test'),
]);
$server = Server::create([
'login' => 'test',
'password' => Hash::make('test'),
'owner_id' => $user1->id,
'public' => true
]);
$user1->server_id = $server->id;
$user1->server_state = 'connected';
$user1->save();
$token = Auth::guard('server')->login($server);
$response = $this->withHeaders([
"Authorization" => "Bearer " . $token
])->postJson('/api/game', [
"users" => [[
"id" => $user1->id
], [
"id" => $user1->id
]]
]);
$response->assertStatus(422);
$this->assertDatabaseCount("games", 0);
$this->assertDatabaseCount("users_games", 0);
}
public function test_user_connected_to_other_server()
{
$user1 = User::create([
'username' => 'test',
'email' => 'test@localhost',
'password' => Hash::make('test'),
]);
$user2 = User::create([
'username' => 'test2',
'email' => 'test2@localhost',
'password' => Hash::make('test'),
]);
$server = Server::create([
'login' => 'test',
'password' => Hash::make('test'),
'owner_id' => $user1->id,
'public' => true
]);
$server2 = Server::create([
'login' => 'test2',
'password' => Hash::make('test'),
'owner_id' => $user1->id,
'public' => true
]);
$user1->server_id = $server->id;
$user1->server_state = 'connected';
$user1->save();
$user2->server_id = $server2->id;
$user2->server_state = 'connected';
$user2->save();
$token = Auth::guard('server')->login($server);
$response = $this->withHeaders([
"Authorization" => "Bearer " . $token
])->postJson('/api/game', [
"users" => [[
"id" => $user1->id
], [
"id" => $user2->id
]]
]);
$response->assertStatus(403);
$this->assertDatabaseCount("games", 0);
$this->assertDatabaseCount("users_games", 0);
}
}
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment