Skip to content
Open
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
2 changes: 1 addition & 1 deletion .github/workflows/qa.yml
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ jobs:
id: test
run: |
set +e
OUTPUT=$(vendor/bin/phpunit --log-junit test-results.xml 2>&1)
OUTPUT=$(vendor/bin/pest --log-junit test-results.xml 2>&1)
EXIT_CODE=$?
echo "$OUTPUT"

Expand Down
25 changes: 23 additions & 2 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,15 @@
"license": "EUPL-1.2",
"require": {
"php": "^8.2",
"host-uk/core": "@dev",
"host-uk/core": "dev-dev",
"symfony/yaml": "^7.0"
},
"repositories": [
{
"type": "vcs",
"url": "https://github.com/host-uk/core-php.git"
}
],
"autoload": {
"psr-4": {
"Core\\Api\\": "src/Api/",
Expand All @@ -19,6 +25,21 @@
"providers": []
}
},
"require-dev": {
"laravel/pint": "^1.18",
"orchestra/testbench": "^10.0",
"pestphp/pest": "^3.0",
"pestphp/pest-plugin-laravel": "^3.0",
"phpstan/phpstan": "^2.0",
"vimeo/psalm": "^6.0"
},
"minimum-stability": "stable",
"prefer-stable": true
"prefer-stable": true,
"config": {
"github-protocols": ["https"],
"allow-plugins": {
"pestphp/pest-plugin": true,
"phpstan/extension-installer": true
}
}
}
8 changes: 4 additions & 4 deletions docs/authentication.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ The API package provides secure authentication with bcrypt-hashed API keys, scop
### Creating Keys

```php
use Mod\Api\Models\ApiKey;
use Core\Api\Models\ApiKey;

$apiKey = ApiKey::create([
'name' => 'Mobile App Production',
Expand Down Expand Up @@ -262,7 +262,7 @@ Route::middleware('auth:api')->group(function () {
### Scope Enforcement

```php
use Mod\Api\Middleware\EnforceApiScope;
use Core\Api\Middleware\EnforceApiScope;

Route::middleware([EnforceApiScope::class.':posts:write'])
->post('/posts', [PostController::class, 'store']);
Expand All @@ -271,7 +271,7 @@ Route::middleware([EnforceApiScope::class.':posts:write'])
### Rate Limiting

```php
use Mod\Api\Middleware\RateLimitApi;
use Core\Api\Middleware\RateLimitApi;

Route::middleware(RateLimitApi::class)->group(function () {
// Rate-limited routes
Expand Down Expand Up @@ -342,7 +342,7 @@ if ($usage > $threshold) {
namespace Tests\Feature\Api;

use Tests\TestCase;
use Mod\Api\Models\ApiKey;
use Core\Api\Models\ApiKey;

class ApiKeyAuthTest extends TestCase
{
Expand Down
18 changes: 9 additions & 9 deletions docs/building-rest-apis.md
Original file line number Diff line number Diff line change
Expand Up @@ -91,8 +91,8 @@ Build controllers that use the `HasApiResponses` trait for consistent error hand
namespace Mod\Blog\Api;

use App\Http\Controllers\Controller;
use Core\Mod\Api\Concerns\HasApiResponses;
use Core\Mod\Api\Resources\PaginatedCollection;
use Core\Core\Api\Concerns\HasApiResponses;
use Core\Core\Api\Resources\PaginatedCollection;
use Illuminate\Http\Request;
use Mod\Blog\Models\Post;
use Mod\Blog\Resources\PostResource;
Expand Down Expand Up @@ -162,7 +162,7 @@ class PostController extends Controller
The `PaginatedCollection` class provides standardized pagination metadata:

```php
use Core\Mod\Api\Resources\PaginatedCollection;
use Core\Core\Api\Resources\PaginatedCollection;

public function index(Request $request)
{
Expand Down Expand Up @@ -618,10 +618,10 @@ new_post = response.json()
Use attributes to auto-generate OpenAPI documentation:

```php
use Core\Mod\Api\Documentation\Attributes\ApiTag;
use Core\Mod\Api\Documentation\Attributes\ApiParameter;
use Core\Mod\Api\Documentation\Attributes\ApiResponse;
use Core\Mod\Api\Documentation\Attributes\ApiSecurity;
use Core\Core\Api\Documentation\Attributes\ApiTag;
use Core\Core\Api\Documentation\Attributes\ApiParameter;
use Core\Core\Api\Documentation\Attributes\ApiResponse;
use Core\Core\Api\Documentation\Attributes\ApiSecurity;

#[ApiTag('Posts', 'Blog post management')]
#[ApiSecurity('api_key')]
Expand Down Expand Up @@ -661,7 +661,7 @@ class PostController extends Controller
Use the `HasApiResponses` trait for consistent errors:

```php
use Core\Mod\Api\Concerns\HasApiResponses;
use Core\Core\Api\Concerns\HasApiResponses;

class PostController extends Controller
{
Expand Down Expand Up @@ -812,7 +812,7 @@ public function index(Request $request)
namespace Tests\Feature\Api;

use Tests\TestCase;
use Mod\Api\Models\ApiKey;
use Core\Api\Models\ApiKey;
use Mod\Blog\Models\Post;

class PostApiTest extends TestCase
Expand Down
18 changes: 9 additions & 9 deletions docs/documentation.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ return [
### Hiding Endpoints

```php
use Mod\Api\Documentation\Attributes\ApiHidden;
use Core\Api\Documentation\Attributes\ApiHidden;

#[ApiHidden]
class InternalController
Expand All @@ -65,7 +65,7 @@ class PostController
### Tagging Endpoints

```php
use Mod\Api\Documentation\Attributes\ApiTag;
use Core\Api\Documentation\Attributes\ApiTag;

#[ApiTag('Blog Posts')]
class PostController
Expand All @@ -77,7 +77,7 @@ class PostController
### Documenting Parameters

```php
use Mod\Api\Documentation\Attributes\ApiParameter;
use Core\Api\Documentation\Attributes\ApiParameter;

class PostController
{
Expand All @@ -104,7 +104,7 @@ class PostController
### Documenting Responses

```php
use Mod\Api\Documentation\Attributes\ApiResponse;
use Core\Api\Documentation\Attributes\ApiResponse;

class PostController
{
Expand Down Expand Up @@ -138,7 +138,7 @@ class PostController
### Security Requirements

```php
use Mod\Api\Documentation\Attributes\ApiSecurity;
use Core\Api\Documentation\Attributes\ApiSecurity;

#[ApiSecurity(['apiKey' => []])]
class PostController
Expand Down Expand Up @@ -210,7 +210,7 @@ return [

namespace Mod\Blog\Api\Documentation;

use Mod\Api\Documentation\Extension;
use Core\Api\Documentation\Extension;

class BlogExtension extends Extension
{
Expand Down Expand Up @@ -248,7 +248,7 @@ public function onApiRoutes(ApiRoutesRegistering $event): void
**Rate Limit Extension:**

```php
use Mod\Api\Documentation\Extensions\RateLimitExtension;
use Core\Api\Documentation\Extensions\RateLimitExtension;

// Automatically documents rate limits in responses
// Adds X-RateLimit-* headers to all endpoints
Expand All @@ -257,7 +257,7 @@ use Mod\Api\Documentation\Extensions\RateLimitExtension;
**Workspace Header Extension:**

```php
use Mod\Api\Documentation\Extensions\WorkspaceHeaderExtension;
use Core\Api\Documentation\Extensions\WorkspaceHeaderExtension;

// Documents X-Workspace-ID header requirement
// Adds to all workspace-scoped endpoints
Expand All @@ -268,7 +268,7 @@ use Mod\Api\Documentation\Extensions\WorkspaceHeaderExtension;
### Pagination

```php
use Mod\Api\Documentation\Examples\CommonExamples;
use Core\Api\Documentation\Examples\CommonExamples;

#[ApiResponse(
status: 200,
Expand Down
16 changes: 8 additions & 8 deletions docs/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ class Boot
### Creating API Keys

```php
use Mod\Api\Models\ApiKey;
use Core\Api\Models\ApiKey;

$apiKey = ApiKey::create([
'name' => 'Mobile App',
Expand Down Expand Up @@ -117,7 +117,7 @@ X-RateLimit-Reset: 1640995200
### Creating Webhooks

```php
use Mod\Api\Models\WebhookEndpoint;
use Core\Api\Models\WebhookEndpoint;

$webhook = WebhookEndpoint::create([
'url' => 'https://your-app.com/webhooks',
Expand All @@ -130,7 +130,7 @@ $webhook = WebhookEndpoint::create([
### Dispatching Events

```php
use Mod\Api\Services\WebhookService;
use Core\Api\Services\WebhookService;

$service = app(WebhookService::class);

Expand All @@ -144,7 +144,7 @@ $service->dispatch('post.created', [
### Verifying Signatures

```php
use Mod\Api\Services\WebhookSignature;
use Core\Api\Services\WebhookSignature;

$signature = WebhookSignature::verify(
payload: $request->getContent(),
Expand All @@ -164,9 +164,9 @@ if (!$signature) {
Auto-generate OpenAPI documentation with attributes:

```php
use Mod\Api\Documentation\Attributes\ApiTag;
use Mod\Api\Documentation\Attributes\ApiParameter;
use Mod\Api\Documentation\Attributes\ApiResponse;
use Core\Api\Documentation\Attributes\ApiTag;
use Core\Api\Documentation\Attributes\ApiParameter;
use Core\Api\Documentation\Attributes\ApiResponse;

#[ApiTag('Posts')]
class PostController extends Controller
Expand Down Expand Up @@ -305,7 +305,7 @@ Route::middleware('api.rate-limit')
namespace Tests\Feature\Api;

use Tests\TestCase;
use Mod\Api\Models\ApiKey;
use Core\Api\Models\ApiKey;

class PostApiTest extends TestCase
{
Expand Down
4 changes: 2 additions & 2 deletions docs/rate-limiting.md
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ Route::middleware('throttle:api')->group(function () {
### Based on API Key Tier

```php
use Mod\Api\Services\RateLimitService;
use Core\Api\Services\RateLimitService;

$rateLimitService = app(RateLimitService::class);

Expand Down Expand Up @@ -146,7 +146,7 @@ X-RateLimit-Reset: 1640995200
### Check Current Usage

```php
use Mod\Api\Services\RateLimitService;
use Core\Api\Services\RateLimitService;

$service = app(RateLimitService::class);

Expand Down
8 changes: 4 additions & 4 deletions docs/scopes.md
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ Scopes follow the format: `resource:action`
### API Key Creation

```php
use Mod\Api\Models\ApiKey;
use Core\Api\Models\ApiKey;

$apiKey = ApiKey::create([
'name' => 'Mobile App',
Expand Down Expand Up @@ -121,7 +121,7 @@ $token = $user->createToken('mobile-app', [
### Route Protection

```php
use Mod\Api\Middleware\EnforceApiScope;
use Core\Api\Middleware\EnforceApiScope;

// Single scope
Route::middleware(['auth:sanctum', 'scope:posts:write'])
Expand Down Expand Up @@ -236,7 +236,7 @@ Define custom scopes for your modules:

namespace Mod\Shop\Api;

use Mod\Api\Contracts\ScopeProvider;
use Core\Api\Contracts\ScopeProvider;

class ShopScopeProvider implements ScopeProvider
{
Expand Down Expand Up @@ -334,7 +334,7 @@ Route::middleware('scope-any:posts:write,pages:write')->post('/content', ...);
### API Key Scopes

```php
use Mod\Api\Models\ApiKey;
use Core\Api\Models\ApiKey;

$apiKey = ApiKey::findByKey($providedKey);

Expand Down
Loading
Loading