Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Merge branch 'release'
  • Loading branch information
jimchen5209 committed May 11, 2023
2 parents 8caba47 + aeacf9f commit 71c5075
Show file tree
Hide file tree
Showing 8 changed files with 236 additions and 1 deletion.
29 changes: 29 additions & 0 deletions app/Console/Commands/MqttSub.php
Expand Up @@ -6,6 +6,7 @@
use Illuminate\Console\Command;
use PhpMqtt\Client\Facades\MQTT;
use App\Http\Controllers\LockerController;
use App\Models\OfflineSyncLog;

class mqttSub extends Command
{
Expand Down Expand Up @@ -47,6 +48,34 @@ public function handle()
list($lockerEncoding, $error) = explode(",", $message, 2);
DB::table("lockers")->where('lockerEncoding', $lockerEncoding)->update(['error' => (int)$error]);
}, 0);
$mqtt->subscribe('locker/offline', function (string $topic, string $message) {
echo sprintf("Received QoS level 0 message on topic [%s]: \r\n%s\r\n", $topic, $message);
list($mode, $error) = explode(",", $message, 2);
switch ($mode) {
case 'auto':
OfflineSyncLog::create([
'mode' => $mode,
'error' => (int)$error,
]);
break;
case 'manual':
$log = OfflineSyncLog::where(['mode' => $mode, 'error' => null])
->orderBy('created_at', 'desc')
->first();
if ($log) {
$log->update(['error' => (int)$error]);
OfflineSyncLog::where(['mode' => $mode, 'error' => null])->update(['error' => 1]);
} else {
OfflineSyncLog::create([
'mode' => $mode,
'error' => (int)$error,
]);
}
break;
default:
break;
}
}, 0);
$mqtt->loop(true);
} catch (\Exception $e) {
echo sprintf($e->getMessage());
Expand Down
24 changes: 24 additions & 0 deletions app/Http/Controllers/LockerController.php
Expand Up @@ -164,6 +164,30 @@ public function RPIunlock(Request $request)
return response()->json($response, $httpstatus);
}

/**
* Display a listing of the resource.
*
* @OA\Get(
* tags={"Locker"},
* path="/api/RPIList",
* security={{"sanctum":{}}},
* @OA\Response(response=200, description="OK", @OA\JsonContent()),
* )
*
* @return AnonymousResourceCollection
*/
public function RPIList()
{
$locker = Locker::with('User:id,cardId')
->orderBy('id', 'asc')
->get(['id', 'lockerNo', 'lockerEncoding', 'userId'])
->map(function ($item) {
return Arr::except($item, ['userId']);
});
return response()->json($locker, 200);
}


/**
* Display a listing of the resource.
*
Expand Down
85 changes: 85 additions & 0 deletions app/Http/Controllers/OfflineDataController.php
@@ -0,0 +1,85 @@
<?php

namespace App\Http\Controllers;

use App\Http\Resources\OfflineSyncLogResource;
use App\Models\OfflineSyncLog;
use App\Models\User;
use Illuminate\Http\Request;
use PhpMqtt\Client\Facades\MQTT;

class OfflineDataController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
$offlineSyncLogs = OfflineSyncLog::orderBy('created_at', 'desc')->get();
return response()->json(OfflineSyncLogResource::collection($offlineSyncLogs), 200);
}
/**
* Request Sync
*
* @return \Illuminate\Http\Response
*/
public function requestSync(Request $request)
{
$token = $request->header('token');
$user = User::where('remember_token', '=', $token)->first();
$user->OfflineSyncLog()->create(['mode' => 'manual']);

$mqtt = MQTT::connection();
$mqtt->publish('locker/offline', 'sync', 0);
$mqtt->loop(true, true);

return response()->json(['message' => 'Sync request sent'], 200);
}

/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
//
}

/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
{
//
}

/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
{
//
}

/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy($id)
{
//
}
}
25 changes: 25 additions & 0 deletions app/Http/Resources/OfflineSyncLogResource.php
@@ -0,0 +1,25 @@
<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class OfflineSyncLogResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable
*/
public function toArray($request)
{
return [
'id' => $this->id,
'time' => $this->created_at,
'mode' => $this->mode,
'error' => $this->error,
'user' => $this->user,
];
}
}
22 changes: 22 additions & 0 deletions app/Models/OfflineSyncLog.php
@@ -0,0 +1,22 @@
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class OfflineSyncLog extends Model
{
use HasFactory;

protected $fillable = [
'mode',
'error',
'userId',
];

public function User()
{
return $this->belongsTo(User::class, 'userId', 'id');
}
}
5 changes: 5 additions & 0 deletions app/Models/User.php
Expand Up @@ -70,4 +70,9 @@ public function Record()
{
return $this->hasMany(Record::class, 'userId', 'id');
}

public function OfflineSyncLog()
{
return $this->hasMany(OfflineSyncLog::class, 'userId', 'id');
}
}
@@ -0,0 +1,35 @@
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('offline_sync_logs', function (Blueprint $table) {
$table->id();
$table->string('mode', 10);
$table->boolean('error')->nullable()->default(null);
$table->foreignUuid('userId')->nullable();
$table->foreign('userId')->references('id')->on('users')->nullOnDelete();
$table->timestamps();
});
}

/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('offline_sync_logs');
}
};
12 changes: 11 additions & 1 deletion routes/api.php
Expand Up @@ -4,6 +4,7 @@
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\UserController;
use App\Http\Controllers\LockerController;
use App\Http\Controllers\OfflineDataController;
use App\Http\Controllers\RecordController;
use App\Http\Middleware\Localization;
use App\Http\Middleware\UnlockMiddleware;
Expand Down Expand Up @@ -45,6 +46,15 @@
Route::post('unlock', [LockerController::class, 'unlock']);

Route::get('record/{lockerNo}', [RecordController::class, 'show']);

Route::controller(OfflineDataController::class)->group(function () {
Route::get('offline', 'index');
Route::post('offline', 'requestSync');
});
});

Route::middleware([UnlockMiddleware::class])->group(function () {
Route::post('RPIunlock', [LockerController::class, 'RPIunlock']);
Route::get('RPIList', [LockerController::class, 'RPIList']);
});
Route::post('RPIunlock', [LockerController::class, 'RPIunlock'])->middleware(UnlockMiddleware::class);
});

0 comments on commit 71c5075

Please sign in to comment.