ultimatepos/Modules/IntegrationHub/Http/Controllers/ODataController.php

110 lines
3.7 KiB
PHP

<?php
namespace Modules\IntegrationHub\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Modules\IntegrationHub\Models\IhOdataToken;
use Modules\IntegrationHub\Services\ODataExportService;
class ODataController extends Controller
{
public function datasets(ODataExportService $odataService)
{
return response()->json([
'value' => collect($odataService->availableDatasets())->map(fn ($dataset) => [
'name' => $dataset,
'url' => url("/integrationhub/api/odata/{$dataset}"),
])->values(),
]);
}
public function show(Request $request, string $dataset, ODataExportService $odataService)
{
$businessId = (int) $request->attributes->get('ih_business_id');
if (! in_array($dataset, $odataService->availableDatasets(), true)) {
return response()->json(['error' => 'Dataset not found'], 404);
}
$filters = $request->only(['start_date', 'end_date', 'location_id', 'low_stock_only', '$top']);
try {
$payload = $odataService->dataset($businessId, $dataset, $filters);
return response()->json($payload);
} catch (\InvalidArgumentException $e) {
return response()->json(['error' => $e->getMessage()], 404);
}
}
public function indexTokens(Request $request)
{
if (! auth()->user()->can('integrationhub.manage_tokens')) {
abort(403);
}
$business_id = (int) $request->session()->get('user.business_id');
$tokens = IhOdataToken::forBusiness($business_id)->latest('id')->paginate(20);
$datasets = app(ODataExportService::class)->availableDatasets();
return view('integrationhub::odata_tokens.index', compact('tokens', 'datasets'));
}
public function createToken(Request $request)
{
if (! auth()->user()->can('integrationhub.manage_tokens')) {
abort(403);
}
$datasets = app(ODataExportService::class)->availableDatasets();
return view('integrationhub::odata_tokens.create', compact('datasets'));
}
public function storeToken(Request $request)
{
if (! auth()->user()->can('integrationhub.manage_tokens')) {
abort(403);
}
$validated = $request->validate([
'name' => 'required|string|max:191',
'scopes' => 'nullable|array',
'scopes.*' => 'string',
'expires_at' => 'nullable|date|after:now',
]);
$business_id = (int) $request->session()->get('user.business_id');
$plainToken = IhOdataToken::generatePlainToken();
IhOdataToken::create([
'business_id' => $business_id,
'name' => $validated['name'],
'token_hash' => IhOdataToken::hashToken($plainToken),
'scopes' => $validated['scopes'] ?? ['*'],
'expires_at' => $validated['expires_at'] ?? null,
]);
return redirect()
->action([self::class, 'indexTokens'])
->with('status', ['success' => 1, 'msg' => __('integrationhub::lang.token_created')])
->with('plain_token', $plainToken);
}
public function destroyToken(Request $request, $id)
{
if (! auth()->user()->can('integrationhub.manage_tokens')) {
abort(403);
}
$business_id = (int) $request->session()->get('user.business_id');
$token = IhOdataToken::forBusiness($business_id)->findOrFail($id);
$token->delete();
return redirect()
->action([self::class, 'indexTokens'])
->with('status', ['success' => 1, 'msg' => __('integrationhub::lang.token_deleted')]);
}
}