Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
145 changes: 128 additions & 17 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,7 @@
[![GitHub Code Style Action Status](https://img.shields.io/github/actions/workflow/status/spatie/laravel-float-sdk/fix-php-code-style-issues.yml?branch=main&label=code%20style&style=flat-square)](https://github.com/spatie/laravel-float-sdk/actions?query=workflow%3A"Fix+PHP+code+style+issues"+branch%3Amain)
[![Total Downloads](https://img.shields.io/packagist/dt/spatie/laravel-float-sdk.svg?style=flat-square)](https://packagist.org/packages/spatie/laravel-float-sdk)

This package provides a seamless integration with the Float.com API for Laravel applications.
## Support us
A Laravel-friendly SDK to interact with the [Float API (v3)](https://developer.float.com/).

[<img src="https://github-ads.s3.eu-central-1.amazonaws.com/laravel-float-sdk.jpg?t=1" width="419px" />](https://spatie.be/github-ad-click/laravel-float-sdk)

Expand Down Expand Up @@ -47,35 +46,147 @@ return [

## Usage

### Making API Requests
### Instantiating the Client

You can use the `FloatClient` to interact with the Float API. Here's an example of fetching all users:
You can use the `FloatClient` class to interact with the Float API.
Why is it called `FloatClient` and not just `Float`, you ask? Well, float is a reserved keyword in PHP.

The `FloatClient` is bound to the Laravel service container and can be injected:

```php
use Spatie\FloatSdk\FloatClient;
use Spatie\FloatSdk\Requests\GetUsers;

public function execute(FloatClient $client)
{
$users = $client->users()->all();
public function __construct(protected FloatClient $client) {}

foreach ($users as $user) {
echo $user->name;
}
public function index()
{
$users = $this->client->users()->all();
}

```

### Available endpoints

The `FloatClient` exposes the following resource groups:
- users()
- projects()
- tasks()

Each group has methods to fetch individual records or lists with optional filters.

### Using the Facade
### Users

#### Get user by ID

```php
use Spatie\FloatSdk\Facades\Float;
$user = $client->users()->get(1);
```

$users = Float::users()->all();
#### Get all users

```php
// Without filters
$users = $client->users()->all();

// With filters
use Spatie\FloatSdk\QueryParameters\GetUsersParameters;

$users = $client->users()->all(
new GetUsersParameters(
active: true,
departmentId: 5,
)
);
```

### Projects

#### Get project by ID

```php
$project = $client->projects()->get(10);
```

#### Get all projects

```php
// Without filters
$projects = $client->projects()->all();

// With filters
use Spatie\FloatSdk\QueryParameters\GetProjectsParameters;

$projects = $client->projects()->all(
new GetProjectsParameters(
clientId: 10,
tagName: 'Design',
fields: ['id', 'name'],
expand: ['client'],
)
);

```

### Tasks

#### Get task by ID

```php
$task = $client->tasks()->get(1);
```

#### Get all tasks

```php
// Without filters
$tasks = $client->tasks()->all();

// With filters
use Spatie\FloatSdk\QueryParameters\GetTasksParameters;

$tasks = $client->tasks()->all(
new GetTasksParameters(
projectId: 42,
billable: true,
fields: ['id', 'name'],
)
);
```

### Pagination & Sorting

You can pass a parameter object to the `all()` methods. All parameters are optional.

- `page` (int): Page number (default: 1)
- `perPage` (int): Number of items per page (default: 50)
- `sort` (string): Sort field (e.g., "name", "modified_since")

```php
new GetUsersParameters(
page: 2,
perPage: 25,
sort: 'name'
);
```

### Selecting fields

Limit which fields are returned by passing the `fields` array:

```php
new GetProjectsParameters(
fields: ['id', 'name', 'client_id']
);
```

### Expanding relationships

Some endpoints support expanding related data using the `expand` array:
```php
new GetProjectsParameters(
expand: ['client']
);

foreach ($users as $user) {
echo $user->name;
}
```

## Testing
Expand Down
11 changes: 9 additions & 2 deletions src/Groups/ProjectsGroup.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,19 @@

use Saloon\Http\BaseResource;
use Saloon\Http\Response;
use Spatie\FloatSdk\QueryParameters\GetProjectsParameters;
use Spatie\FloatSdk\Requests\GetProject;
use Spatie\FloatSdk\Requests\GetProjects;

class ProjectsGroup extends BaseResource
{
public function all(): Response
public function get(int $projectId): Response
{
return $this->connector->send(new GetProjects);
return $this->connector->send(new GetProject($projectId));
}

public function all(?GetProjectsParameters $parameters = null): Response
{
return $this->connector->send(new GetProjects($parameters));
}
}
11 changes: 9 additions & 2 deletions src/Groups/TasksGroup.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,19 @@

use Saloon\Http\BaseResource;
use Saloon\Http\Response;
use Spatie\FloatSdk\QueryParameters\GetTasksParameters;
use Spatie\FloatSdk\Requests\GetTask;
use Spatie\FloatSdk\Requests\GetTasks;

class TasksGroup extends BaseResource
{
public function all(): Response
public function get(int $taskId): Response
{
return $this->connector->send(new GetTasks);
return $this->connector->send(new GetTask($taskId));
}

public function all(?GetTasksParameters $parameters = null): Response
{
return $this->connector->send(new GetTasks($parameters));
}
}
6 changes: 6 additions & 0 deletions src/Groups/UsersGroup.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,16 @@
use Saloon\Http\BaseResource;
use Saloon\Http\Response;
use Spatie\FloatSdk\QueryParameters\GetUsersParameters;
use Spatie\FloatSdk\Requests\GetUser;
use Spatie\FloatSdk\Requests\GetUsers;

class UsersGroup extends BaseResource
{
public function get(int $userId): Response
{
return $this->connector->send(new GetUser($userId));
}

public function all(?GetUsersParameters $parameters = null): Response
{
return $this->connector->send(new GetUsers($parameters));
Expand Down
25 changes: 25 additions & 0 deletions src/Requests/GetProject.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<?php

namespace Spatie\FloatSdk\Requests;

use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Http\Response;
use Spatie\FloatSdk\Resources\ProjectResource;

class GetProject extends Request
{
protected Method $method = Method::GET;

public function __construct(protected int $id) {}

public function resolveEndpoint(): string
{
return "/projects/{$this->id}";
}

public function createDtoFromResponse(Response $response): ProjectResource
{
return ProjectResource::createFromResponse($response->json());
}
}
25 changes: 25 additions & 0 deletions src/Requests/GetTask.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<?php

namespace Spatie\FloatSdk\Requests;

use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Http\Response;
use Spatie\FloatSdk\Resources\TaskResource;

class GetTask extends Request
{
protected Method $method = Method::GET;

public function __construct(protected int $id) {}

public function resolveEndpoint(): string
{
return "/project-tasks/{$this->id}";
}

public function createDtoFromResponse(Response $response): TaskResource
{
return TaskResource::createFromResponse($response->json());
}
}
25 changes: 25 additions & 0 deletions src/Requests/GetUser.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<?php

namespace Spatie\FloatSdk\Requests;

use Saloon\Enums\Method;
use Saloon\Http\Request;
use Saloon\Http\Response;
use Spatie\FloatSdk\Resources\UserResource;

class GetUser extends Request
{
protected Method $method = Method::GET;

public function __construct(protected int $id) {}

public function resolveEndpoint(): string
{
return "/people/{$this->id}";
}

public function createDtoFromResponse(Response $response): UserResource
{
return UserResource::createFromResponse($response->json());
}
}
2 changes: 1 addition & 1 deletion src/Resources/ProjectResource.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ public function __construct(
public string $clientId,
) {}

/** @param array<mixed> $response */
/** @param array<string, mixed> $response */
public static function createFromResponse(array $response): self
{
return new self(
Expand Down
2 changes: 1 addition & 1 deletion src/Resources/TaskResource.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ public function __construct(
public string $projectId,
) {}

/** @param array<mixed> $response */
/** @param array<string, mixed> $response */
public static function createFromResponse(array $response): self
{
return new self(
Expand Down
2 changes: 1 addition & 1 deletion src/Resources/UserResource.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ public function __construct(
public bool $active
) {}

/** @param array<mixed> $response */
/** @param array<string, mixed> $response */
public static function createFromResponse(array $response): self
{
return new self(
Expand Down