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')]); } }