PHPackages                             ometra/apollo-sdk - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [API Development](/categories/api)
4. /
5. ometra/apollo-sdk

ActiveLibrary[API Development](/categories/api)

ometra/apollo-sdk
=================

Proteus API adapter

3.6.2(3w ago)0349↓85%MITPHPPHP ^8.2CI failing

Since May 8Pushed 1w agoCompare

[ Source](https://github.com/Ometra-Apollo/mx.ometra.apollo.apollo-sdk)[ Packagist](https://packagist.org/packages/ometra/apollo-sdk)[ RSS](/packages/ometra-apollo-sdk/feed)WikiDiscussions main Synced 1w ago

READMEChangelog (10)Dependencies (16)Versions (16)Used By (0)

Apollo SDK
==========

[](#apollo-sdk)

Cliente Laravel/PHP modular para consumir Proteus, Pulse, Flare e Ignis con autenticacion compartida de Caronte.

Instalacion
-----------

[](#instalacion)

```
composer require ometra/apollo-sdk
```

Publica la configuracion si necesitas sobrescribir las URLs de modulos:

```
php artisan vendor:publish --tag=apollo-config
```

El archivo publicado es `config/apollo.php`.

Paginas de error
----------------

[](#paginas-de-error)

Apollo registra automaticamente paginas HTML para los errores HTTP comunes de Laravel (`401`, `403`, `404`, `419`, `429`, `500`, `503`). El SDK agrega sus vistas como fallback, por lo que cualquier archivo local en `resources/views/errors` mantiene prioridad.

Para deshabilitar este fallback:

```
APOLLO_ERROR_PAGES_ENABLED=false
```

Si necesitas personalizar las vistas dentro de la app host, publicalas con:

```
php artisan vendor:publish --tag=apollo-error-pages
```

Tambien puedes publicar configuracion y paginas de error juntas:

```
php artisan vendor:publish --tag=apollo
```

AppMenu compartido
------------------

[](#appmenu-compartido)

El SDK incluye el menu compartido de la suite en `resources/js/shared/AppMenu`. Publicalo en una app host con:

```
php artisan vendor:publish --tag=apollo-app-menu
```

Tambien se publica con el tag agregado `apollo`.

DirectoryTree compartido
------------------------

[](#directorytree-compartido)

El SDK incluye el arbol de directorios en `resources/js/shared/DirectoryTree`. Publicalo en una app host con:

```
php artisan vendor:publish --tag=apollo-directory-tree
```

Tambien se publica con el tag agregado `apollo`.

Documentacion detallada de componentes UI:

- `docs/ui-components.md`

Configuracion
-------------

[](#configuracion)

Apollo solo configura URLs por modulo; la autenticacion sigue viviendo en el SDK de Caronte.

```
PROTEUS_BASE_URL=https://proteus.example.com/api
PULSE_BASE_URL=https://pulse.example.com/api
FLARE_BASE_URL=https://flare.example.com/api
IGNIS_BASE_URL=https://ignis.example.com/api
```

Las llamadas HTTP usan el transporte de Caronte 7.1, incluyendo uploads multipart y respuestas binarias sin parsing. Segun el tipo de request agregan:

- `X-Group-Token` cuando existe una aplicacion grupal; en caso contrario, `X-Application-Token`
- `X-User-Token` en llamadas de usuario
- `X-Tenant-Id` desde `TenantContext` cuando existe

Uso modular
-----------

[](#uso-modular)

```
use Ometra\Apollo\Sdk\Facades\Apollo;

$directories = Apollo::proteus()->directories()->index();

$media = Apollo::proteus()->media()->upload([
    'type' => 'image',
    'directory_id' => $directoryId,
    'media' => [$request->file('image')],
    'metadata' => [
        'source' => 'apollo',
    ],
]);

Apollo::proteus()->media()->setMetadata($mediaId, [
    'metadata' => [
        'title' => 'Hero image',
    ],
]);

$metadata = Apollo::proteus()->metadata()->index($mediaId, [
    'search' => 'title',
]);

$images = Apollo::proteus()->media()->index(['type' => 'image']);

$lightPath = Apollo::proteus()->media()->lightPathUrl($mediaId, [
    'ext' => 'mp4',
    'url_ttl_seconds' => 3600,
]);

$stations = Apollo::flare()->stations()->index(['country' => 'mx']);

$campaigns = Apollo::ignis()->campaigns()->byGroup('group-1');
$campaign = Apollo::ignis()->campaigns()->show('group-1', 11);

Apollo::ignis()->contentHits()->report([
    ['content_id' => 'content-1', 'hits' => 10],
]);

$groups = Apollo::pulse()->groups()->index();
```

### URLs LightPath para media

[](#urls-lightpath-para-media)

Antes de emitir URLs desde un proceso de aplicación, un usuario puede delegar acceso a un directorio. `write` incluye lectura y modificación, pero nunca eliminación:

```
use Ometra\Apollo\Sdk\Modules\Proteus\Enums\DirectoryApplicationPermission;

$directoryGrant = Apollo::proteus()->directories()->grantApplication(
    $directoryId,
    'flare:playlist:42',
    DirectoryApplicationPermission::READ,
);

// En un comando con un token de usuario delegado:
$directoryGrant = Apollo::proteus()->directories()->grantApplicationWithUserToken(
    $directoryId,
    'flare:playlist:42',
    DirectoryApplicationPermission::READ,
    $serviceUserToken,
);
```

LightPath se integra desde el recurso de media de Proteus porque Proteus es la autoridad de permisos y formatos. El SDK solo solicita una URL temporal; no valida tokens ni habla con nodos LightPath.

```
$response = Apollo::proteus()->media()->lightPathUrl($mediaId, [
    'ext' => 'mp4',
    'url_ttl_seconds' => 3600,
    'id_directory_application_grant' => $directoryGrant['data']['id_directory_application_grant'],
]);

$url = $response['data']['url'];
```

La respuesta incluye `id_lightpath_grant` (UUID), `url`, `format`, `url_expires_at`, `renewable_from` y `renewable_until`.

Opciones:

- `ext`: formato a entregar. Si se omite, Proteus usa el formato default.
- `url_ttl_seconds`: vigencia de la URL. Proteus aplica su maximo configurado.

El owner puede extender o eliminar el grant. AppToken y GroupToken validos del mismo tenant tambien pueden administrarlo, aunque no pueden crear grants:

```
$grantId = $response['data']['id_lightpath_grant'];

Apollo::proteus()->lightPath()->extendGrant($grantId, 3600);
Apollo::proteus()->lightPath()->deleteGrant($grantId);

// En un proceso autenticado con AppToken:
Apollo::proteus()->asApplication()->lightPath()->extendGrant($grantId, 3600);
```

### Miniaturas de media

[](#miniaturas-de-media)

Para solicitar la miniatura de un recurso de media, usa `MediaResource::thumbnail()`.

```
$response = Apollo::proteus()->media()->thumbnail($mediaId);
```

Esta llamada aprovecha el mismo endpoint de descarga y solicita el formato `thumb` mediante `ext=thumb`.

La URL generada tiene forma `https://lightpath.example.com/m/{token}`. El token opaco es la unica credencial y quien tenga la URL puede consumirla hasta `url_expires_at`.

### Uso en jobs y contextos sin usuario

[](#uso-en-jobs-y-contextos-sin-usuario)

Cuando necesites hacer llamadas desde un job, un comando o cualquier contexto donde no haya sesion de usuario activa, usa `asApplication()`. Esto fuerza a todas las operaciones del modulo a usar autenticacion de aplicacion (sin `X-User-Token`) en lugar de autenticacion de usuario:

```
// En un job — sin sesion HTTP, sin token de usuario
$proteus = Apollo::proteus()->asApplication();

$proteus->media()->index(['type' => 'audio']);
$proteus->directories()->show($directoryId);
```

Tambien puedes inyectar el entrypoint principal:

```
use Ometra\Apollo\Sdk\Apollo;

public function __invoke(Apollo $apollo): array
{
    return $apollo->proteus()->media()->index(['type' => 'image']);
}
```

Pulse expone `groups()->index()` sobre el endpoint `ignis/groups`.

Exposicion de grupos Ignis (inbound, opt-in)
--------------------------------------------

[](#exposicion-de-grupos-ignis-inbound-opt-in)

Apollo es solo outbound por defecto. Cuando lo habilitas, el SDK registra una ruta inbound `GET /{prefix}/groups` en la app host para que clientes externos (incluido Pulse) puedan descubrir los grupos de la app. No agrega llamadas HTTP hacia Ignis.

### Habilitar la ruta

[](#habilitar-la-ruta)

La ruta esta deshabilitada por defecto. Habilitala con una variable de entorno:

```
APOLLO_IGNIS_GROUPS_ENABLED=true
```

O publica la configuracion y edita `config/apollo.php`:

```
'ignis_groups' => [
    'enabled' => true,
    'route_prefix' => 'api/ignis',
    'middleware' => ['caronte.application:tenant_required'],
],
```

Con `enabled=false` (por defecto) no se registra ninguna ruta y `GET /api/ignis/groups` devuelve `404`.

### Proveer la implementacion del contrato

[](#proveer-la-implementacion-del-contrato)

Para exponer grupos reales, crea una clase que implemente `Ometra\Apollo\Sdk\Contracts\IgnisGroupContract`:

```
namespace App\Services;

use Ometra\Apollo\Sdk\Contracts\IgnisGroupContract;
use Ometra\Apollo\Sdk\DTO\ExternalGroupDTO;

final class HostGroupProvider implements IgnisGroupContract
{
    public function getGroups(): array
    {
        return [
            ExternalGroupDTO::fromArray([
                'name' => 'Mi grupo',
                'external_id' => 'grupo-1',
                'media_type' => ['video', 'audio'],
                'play_modifiers' => ['frequency' => 2],
            ]),
        ];
    }
}
```

Registra esa clase en un service provider de la app host:

```
use App\Services\HostGroupProvider;
use Ometra\Apollo\Sdk\Contracts\IgnisGroupContract;

$this->app->bind(IgnisGroupContract::class, HostGroupProvider::class);
```

Si `APOLLO_IGNIS_GROUPS_ENABLED=true` y la app host no registra el contrato, el SDK falla al arrancar para no exponer datos dummy por accidente.

### Prefijo de ruta y middleware

[](#prefijo-de-ruta-y-middleware)

El prefijo por defecto es `api/ignis` (la ruta queda en `GET /api/ignis/groups`). Cambialo con `route_prefix`:

```
'ignis_groups' => [
    'enabled' => true,
    'route_prefix' => 'api/custom/ignis', // GET /api/custom/ignis/groups
],
```

La ruta esta protegida por el middleware `caronte.application:tenant_required`. Las peticiones sin contexto de tenant valido son rechazadas por Caronte (401/403) antes de llegar al controlador. Puedes overridear la pila de middleware con la clave `middleware`.

API
---

[](#api)

El contrato completo esta en [docs/api-contract.md](docs/api-contract.md).

Pruebas
-------

[](#pruebas)

```
composer test
```

La suite valida identidad Apollo, configuracion modular, autenticacion Caronte, rutas Proteus, ausencia de API flat y limpieza legacy.

###  Health Score

47

—

FairBetter than 93% of packages

Maintenance97

Actively maintained with recent releases

Popularity17

Limited adoption so far

Community12

Small or concentrated contributor base

Maturity54

Maturing project, gaining track record

 Bus Factor2

2 contributors hold 50%+ of commits

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~4 days

Total

14

Last Release

23d ago

Major Versions

2.1.1 → 3.0.02026-05-26

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/984800?v=4)[gruelas](/maintainers/gruelas)[@gruelas](https://github.com/gruelas)

---

Top Contributors

[![karlyoz](https://avatars.githubusercontent.com/u/54610989?v=4)](https://github.com/karlyoz "karlyoz (35 commits)")[![gruelasjr](https://avatars.githubusercontent.com/u/40619710?v=4)](https://github.com/gruelasjr "gruelasjr (20 commits)")[![LauraRivera1607](https://avatars.githubusercontent.com/u/147354444?v=4)](https://github.com/LauraRivera1607 "LauraRivera1607 (14 commits)")[![memoola49](https://avatars.githubusercontent.com/u/55213964?v=4)](https://github.com/memoola49 "memoola49 (13 commits)")[![vicario00](https://avatars.githubusercontent.com/u/101902535?v=4)](https://github.com/vicario00 "vicario00 (11 commits)")[![JuanPablo14001](https://avatars.githubusercontent.com/u/202692718?v=4)](https://github.com/JuanPablo14001 "JuanPablo14001 (5 commits)")

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/ometra-apollo-sdk/health.svg)

```
[![Health](https://phpackages.com/badges/ometra-apollo-sdk/health.svg)](https://phpackages.com/packages/ometra-apollo-sdk)
```

###  Alternatives

[psalm/plugin-laravel

Psalm plugin for Laravel

3345.3M347](/packages/psalm-plugin-laravel)[roots/acorn

Framework for Roots WordPress projects built with Laravel components.

9762.4M133](/packages/roots-acorn)[api-platform/laravel

API Platform support for Laravel

58174.6k17](/packages/api-platform-laravel)[fleetbase/core-api

Core Framework and Resources for Fleetbase API

1235.9k21](/packages/fleetbase-core-api)[simplestats-io/laravel-client

Server-side analytics for Laravel that follows the full funnel from visit to registration to payment, attributed to the channel that drove it. Revenue, MRR, churn and ad-spend profit (ROAS/CAC) per channel. GDPR compliant, ad-blocker proof.

5022.6k](/packages/simplestats-io-laravel-client)[flat3/lodata

OData v4.01 Producer for Laravel

99351.7k](/packages/flat3-lodata)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
