前回までの状況はこちら。
最新ソースはこちら(gitHub)
https://github.com/takishita2nd/hotel-mng
さて、前回からだいぶ期間が空いてしまいましたが、
続きやります。(思い出すのに時間かかった)
今回は、前回メールに添付したQRコードに書かれた解錠コードを使って解錠する処理を実装するのですが、
実際に解錠を行うのは、外部のデバイスを使用する、という前提として考え、ここではデバイスに入力した解錠コードをサーバに送信し、照合結果を返すAPIを実装します。
このAPIのレスポンスをデバイスが受信して、デバイスが実際に解錠を行います。そういう想定で実装します。
まず、APIのルーティングを作成します。
routes配下のapi.phpに以下を追加します。
Route::group(['middleware' => ['api']], function(){
Route::post('/unlock', 'Api2Controller@unlock');
});
なぜ、今までのようにweb.phpではないかというと、web.phpには
Auth::routes();
がかかれてあり、ログイン状態でアクセスしなければAPIは受け付けられません。
デバイス側にログイン状態というのは意識できないので、この制約が入らないルートに設定しなければなりません。
では、コントローラーを作成します。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use App\Repository\RegisterManagementRepository;
use App\Repository\RoomRepository;
use App\Repository\UserRepository;
class Api2Controller extends Controller
{
public function __construct()
{
$this->registerManagement = new RegisterManagementRepository();
$this->room = new RoomRepository();
$this->user = new UserRepository();
}
public function unlock(Request $request)
{
\Log::debug(print_r($request->input('number'), true));
\Log::debug(print_r($request->input('room'), true));
$registers = $this->registerManagement->getItemsByDate(date('Y-m-d'));
if(is_null($registers) == false)
{
foreach ($registers as $register)
{
$room = $register->rooms()->first();
if(is_null($room) == false)
{
if($room->id == $request->input('room') &&
strcmp($register->lock_number, $request->input('number')) == 0)
{
return response()->json(['result' => true]);
}
}
}
}
return response()->json(['result' => false]);
}
}
Api2Controller.phpを追加しました。
ApiController.phpでは、コンストラクタに
$this->middleware('auth');
と記述しているため、これも上記と同じ理由で使用できません。
入力は部屋番号と解錠コードをjsonで入力します。
現在の日付から予約情報を取得し、部屋番号を解錠コードの比較を行い、一致したときにtrue、一致しない場合はfalseを返します。
思ったように動いているようです。
ただし、このままだと誰でもアクセスできてしまうので、セキュリティ的にガバガバ状態です。
デバイス情報を登録して、それも入力情報に含めるようにしましょうか。
次回やります。