diff --git a/app/Http/Controllers/TestSessionsController.php b/app/Http/Controllers/TestSessionsController.php index 99e7f50..3b01fee 100644 --- a/app/Http/Controllers/TestSessionsController.php +++ b/app/Http/Controllers/TestSessionsController.php @@ -35,6 +35,7 @@ public function store(Request $request) $testSession = TestSessionsModel::create([ 'id_booking' => $request->id_booking, 'status_session' => '0', + 'is_active' => '0', ]); return redirect()->route('tutorial-tes.index')->with([ diff --git a/app/Http/Controllers/TobiiDataController.php b/app/Http/Controllers/TobiiDataController.php new file mode 100644 index 0000000..d18b881 --- /dev/null +++ b/app/Http/Controllers/TobiiDataController.php @@ -0,0 +1,64 @@ +id_test_sessions)->first(); - if($data_sessions != null) { - if($request->token_session == $data_sessions->token_session) { - // simpan data tobii ke db - - return response()->json(['message' => 'Data tobii berhasil disimpan.'], 200); + try { + $data_sessions = TestSessionsModel::where('id_test_sessions', $request->id_test_sessions)->first(); + if($data_sessions != null) { + if($request->token_session == $data_sessions->token_session) { + if($data_sessions->status_session == '1') { + $is_valid = '0'; + if($data_sessions->is_active == '1') { + $is_valid = '1'; + } + // simpan data tobii ke db + $data_tobii = TobiiDataModel::create([ + 'gaze_x' => $request->gaze_x, + 'gaze_y' => $request->gaze_y, + 'timestamp' => now(), + 'is_valid' => $is_valid, + 'id_test_sessions' => $request->id_test_sessions, + ]); + return response()->json(['message' => 'Data tobii berhasil disimpan.'], 200); + } else { + return response()->json(['message' => 'Sesi tes belum aktif.'], 403); + } + } else { + return response()->json(['message' => 'Token sesi tidak valid.'], 401); + } } else { - return response()->json(['message' => 'Token sesi tidak valid.'], 401); + return response()->json(['message' => 'Data sesi tes tidak ditemukan.'], 404); } - } else { - return response()->json(['message' => 'Data sesi tes tidak ditemukan.'], 404); + } catch(\Exception $e) { + return response()->json(['message' => 'Terjadi kesalahan saat menyimpan data tobii.', 'error' => $e->getMessage()], 500); } } @@ -47,7 +66,20 @@ public function store(Request $request) */ public function show(string $id) { - // + $data_tobii = TobiiDataModel::where('id_test_sessions', $id)->latest()->first(); + if ($data_tobii->timestamp->lt(now()->subSeconds(5))) { + return response()->json([ + 'status' => false, + 'msg' => 'Data tobii kadaluarsa (' . $id . ')', + 'connected' => false, + ]); + } + return response()->json([ + 'status' => true, + 'connected' => true, + 'msg' => 'Data tobii ditemukan (' . $id . ')', + 'data_tobii' => $data_tobii, + ]); } /** diff --git a/app/Models/TestSessionsModel.php b/app/Models/TestSessionsModel.php index e711429..a05af2d 100644 --- a/app/Models/TestSessionsModel.php +++ b/app/Models/TestSessionsModel.php @@ -17,7 +17,8 @@ class TestSessionsModel extends Model protected $fillable = [ 'status_session', 'token_session', - 'id_booking' + 'id_booking', + 'is_active', ]; protected $casts = [ @@ -36,6 +37,10 @@ protected static function boot() if (empty($model->token_session)) { $model->token_session = \Illuminate\Support\Str::random(50); } + + if (empty($model->is_active)) { + $model->is_active = '0'; + } }); } } diff --git a/app/Models/TobiiDataModel.php b/app/Models/TobiiDataModel.php new file mode 100644 index 0000000..5ecf9a1 --- /dev/null +++ b/app/Models/TobiiDataModel.php @@ -0,0 +1,46 @@ + 'string', + 'gaze_x' => 'float', + 'gaze_y' => 'float', + 'timestamp' => 'datetime', + 'id_test_sessions' => 'string', + ]; + + protected static function boot() + { + parent::boot(); + static::creating(function ($model) { + if (empty($model->id_tobii_data)) { + $model->id_tobii_data = (string) \Illuminate\Support\Str::uuid(); + } + if (empty($model->is_valid)) { + $model->is_valid = '0'; + } + }); + } +} diff --git a/database/migrations/2026_04_05_142734_create_tobii_data_table.php b/database/migrations/2026_04_05_142734_create_tobii_data_table.php new file mode 100644 index 0000000..5908463 --- /dev/null +++ b/database/migrations/2026_04_05_142734_create_tobii_data_table.php @@ -0,0 +1,34 @@ +uuid('id_tobii_data')->primary(); + $table->string('gaze_x')->nullable()->default(0); + $table->string('gaze_y')->nullable()->default(0); + $table->string('timestamp'); + $table->uuid('id_test_sessions'); + $table->timestamps(); + + // Foreign key constraint + $table->foreign('id_test_sessions')->references('id_test_sessions')->on('test_sessions')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('tobii_data'); + } +}; diff --git a/database/migrations/2026_04_06_104855_add_column_in_test_sessions_table.php b/database/migrations/2026_04_06_104855_add_column_in_test_sessions_table.php new file mode 100644 index 0000000..3ba88ed --- /dev/null +++ b/database/migrations/2026_04_06_104855_add_column_in_test_sessions_table.php @@ -0,0 +1,28 @@ +string('is_active')->default('0')->after('token_session'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('test_sessions', function (Blueprint $table) { + $table->dropColumn('is_active'); + }); + } +}; diff --git a/database/migrations/2026_04_06_111933_add_column_in_tobii_data_table.php b/database/migrations/2026_04_06_111933_add_column_in_tobii_data_table.php new file mode 100644 index 0000000..b44cf99 --- /dev/null +++ b/database/migrations/2026_04_06_111933_add_column_in_tobii_data_table.php @@ -0,0 +1,28 @@ +enum('is_valid', ['0', '1'])->default('0')->after('timestamp'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('tobii_data', function (Blueprint $table) { + $table->dropColumn('is_valid'); + }); + } +}; diff --git a/resources/views/user/pages/tutorial_tes/index.blade.php b/resources/views/user/pages/tutorial_tes/index.blade.php index 5564957..5d75770 100644 --- a/resources/views/user/pages/tutorial_tes/index.blade.php +++ b/resources/views/user/pages/tutorial_tes/index.blade.php @@ -47,14 +47,22 @@ +
Sebelum tes dimulai, cek keakuratan device Tobii anda, jika tidak akurat, lakukan kalibrasi kepada administrator.
+ + Mulai Ujian +