*/ #[NoDiscard] public function search(string $value): Collection { return ConnectionProvider::query() ->whereLike('slug', "%{$value}%") ->orWhereLike('name', "%{$value}%") ->get(); } /** * @throws Throwable */ public function create(StoreConnectionProviderRequestData $data): void { DB::transaction( function () use ($data): void { ConnectionProvider::query()->create($data->toArray()); } ); } /** * @return PaginatedDataCollection */ #[NoDiscard] public function getAll(): PaginatedDataCollection { $data = ConnectionProvider::query()->select(['id', 'name', 'slug'])->paginate(); return ConnectionProviderData::collect($data, PaginatedDataCollection::class); } /** * @throws InvalidArgumentException when id is invalid * @throws Throwable when an error occurs during the update. */ public function update(string $slug, StoreConnectionProviderRequestData $data): void { DB::transaction( fn() => ConnectionProvider::query() ->where('slug', $slug) ->update($data->toArray()) ); } /** * Delete the connection provider and associated connected apps. * @throws ModelNotFoundException when the connection provider is not found. * @throws Throwable when an error occurs during the deletion. */ public function delete(string $slug): void { DB::transaction( function () use ($slug): void { $provider = ConnectionProvider::query() ->where('slug', $slug) ->firstOrFail(); // Note: This performs a mass soft-delete query. // Model events for ConnectedApp will NOT fire. $provider->connectedApps()->delete(); $provider->delete(); } ); } /** * @throws ModelNotFoundException when the connected app is not found. * @throws InvalidArgumentException when id is invalid. */ #[NoDiscard] public function getProvider(string $slug): ConnectionProviderData { $data = ConnectionProvider::query() ->select(['id', 'name', 'slug']) ->where('slug', $slug) ->first(); return ConnectionProviderData::from($data); } }