Skip to content
This repository was archived by the owner on May 30, 2023. It is now read-only.

Commit 5821e25

Browse files
author
Robert Kummer
committed
initial commit
1 parent 9b28cda commit 5821e25

File tree

85 files changed

+5637
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

85 files changed

+5637
-0
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
# Created by .ignore support plugin (hsz.mobi)
22
.idea
33
composer.lock
4+
vendor

composer.json

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
"type": "library",
55
"require": {
66
"php": ">=7.0",
7+
"laravel/framework": "^5.2",
78
"illuminate/support": "^5.2",
89
"illuminate/contracts": "^5.2",
910
"illuminate/http": "^5.2",

config/json-api.php

+105
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
<?php
2+
3+
return [
4+
/**
5+
* Route Options
6+
*/
7+
'routes' => [
8+
/**
9+
* configure routes by package
10+
*/
11+
'configure' => true,
12+
13+
/**
14+
* public route option
15+
* No JWT check, no user authenticated
16+
*/
17+
'public-route' => [
18+
'prefix' => 'public',
19+
'controller' => \Ipunkt\LaravelJsonApi\Http\Controllers\JsonApiController::class,
20+
],
21+
22+
/**
23+
* secure route option
24+
* JWT check, user authenticated
25+
*/
26+
'secure-route' => [
27+
'prefix' => 'secure',
28+
'controller' => \Ipunkt\LaravelJsonApi\Http\Controllers\JsonApiController::class,
29+
'middleware' => 'jwt.auth',
30+
],
31+
],
32+
33+
/**
34+
* Response Options
35+
*/
36+
'response' => [
37+
/**
38+
* Handle Resource Request Responses
39+
*/
40+
'resources' => [
41+
/**
42+
* What about links?
43+
*/
44+
'links' => [
45+
/**
46+
* self link is optional
47+
*/
48+
'self' => true,
49+
],
50+
51+
/**
52+
* related item calls
53+
*/
54+
'item' => [
55+
/**
56+
* What about links?
57+
*/
58+
'links' => [
59+
/**
60+
* self link is optional
61+
*/
62+
'self' => true,
63+
],
64+
],
65+
],
66+
67+
/**
68+
* Handle Relationship Request Responses
69+
*/
70+
'relationships' => [
71+
/**
72+
* What about links?
73+
*/
74+
'links' => [
75+
/**
76+
* self link is optional
77+
*/
78+
'self' => true,
79+
/**
80+
* related link is optional
81+
*/
82+
'related' => true,
83+
],
84+
85+
/**
86+
* related item calls
87+
*/
88+
'item' => [
89+
/**
90+
* What about links?
91+
*/
92+
'links' => [
93+
/**
94+
* self link is optional
95+
*/
96+
'self' => true,
97+
/**
98+
* related link is optional
99+
*/
100+
'related' => true,
101+
],
102+
],
103+
],
104+
],
105+
];

routes/api.php

+139
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
<?php
2+
3+
/** @var $router \Illuminate\Routing\Router */
4+
5+
// public route configuration
6+
$router->group(['prefix' => config('json-api.routes.public-route.prefix'), 'middleware' => 'api', 'namespace' => ''],
7+
function (\Illuminate\Routing\Router $router) {
8+
9+
$router->group(['prefix' => 'v{version}'], function (\Illuminate\Routing\Router $router) {
10+
11+
$router->get('/{resource}', [
12+
'uses' => config('json-api.routes.public-route.controller') . '@collection',
13+
'as' => 'api.resource',
14+
])->where(['resource' => '[a-z\-]+']);
15+
16+
$router->post('/{resource}', [
17+
'uses' => config('json-api.routes.public-route.controller') . '@create',
18+
]);
19+
20+
$router->get('/{resource}/{id}', [
21+
'uses' => config('json-api.routes.public-route.controller') . '@item',
22+
'as' => 'api.resource.item',
23+
])->where(['resource' => '[a-z\-]+']);
24+
25+
$router->patch('/{resource}/{id}', [
26+
'uses' => config('json-api.routes.public-route.controller') . '@patch',
27+
]);
28+
29+
$router->delete('/{resource}/{id}', [
30+
'uses' => config('json-api.routes.public-route.controller') . '@delete',
31+
]);
32+
33+
$router->get('/{resource}/{id}/relationships/{relationship}', [
34+
'uses' => config('json-api.routes.public-route.controller') . '@relatedCollection',
35+
'as' => 'api.resource.relationship',
36+
])->where(['resource' => '[a-z\-]+', 'relationship' => '[a-z\-]+']);
37+
38+
$router->post('/{resource}/{id}/relationships/{relationship}', [
39+
'uses' => config('json-api.routes.public-route.controller') . '@relatedPost',
40+
])->where(['resource' => '[a-z\-]+', 'relationship' => '[a-z\-]+']);
41+
42+
$router->patch('/{resource}/{id}/relationships/{relationship}', [
43+
'uses' => config('json-api.routes.public-route.controller') . '@relatedPatch',
44+
])->where(['resource' => '[a-z\-]+', 'relationship' => '[a-z\-]+']);
45+
46+
$router->get('/{resource}/{id}/relationships/{relationship}/{parameter}', [
47+
'uses' => config('json-api.routes.public-route.controller') . '@relatedItem',
48+
'as' => 'api.resource.relationship.item',
49+
])->where(['resource' => '[a-z\-]+', 'relationship' => '[a-z\-]+']);
50+
51+
$router->delete('/{resource}/{id}/relationships/{relationship}', [
52+
'uses' => config('json-api.routes.public-route.controller') . '@relatedDelete',
53+
])->where(['resource' => '[a-z\-]+', 'relationship' => '[a-z\-]+']);
54+
55+
$router->delete('/{resource}/{id}/relationships/{relationship}/{parameter}', [
56+
'uses' => config('json-api.routes.public-route.controller') . '@relatedItemDelete',
57+
])->where(['resource' => '[a-z\-]+', 'relationship' => '[a-z\-]+']);
58+
});
59+
});
60+
61+
// secure route configuration
62+
$router->group([
63+
'prefix' => config('json-api.routes.secure-route.prefix'),
64+
'middleware' => 'secure-api',
65+
'namespace' => ''
66+
], function (\Illuminate\Routing\Router $router) {
67+
68+
$router->group(['prefix' => 'v{version}'], function (\Illuminate\Routing\Router $router) {
69+
70+
$router->post('/tokens/refresh', [
71+
'middleware' => 'jwt.refresh',
72+
'as' => 'token.refresh',
73+
'uses' => function () {
74+
return response()->json([], 201, [
75+
'Access-Control-Expose-Headers' => 'Authorization'
76+
]);
77+
}
78+
]);
79+
80+
$router->get('/{resource}', [
81+
'uses' => config('json-api.routes.secure-route.controller') . '@collection',
82+
'as' => 'secure-api.resource',
83+
'middleware' => config('json-api.routes.secure-route.middleware', 'jwt.auth'),
84+
])->where(['resource' => '[a-z\-]+']);
85+
86+
$router->post('/{resource}', [
87+
'uses' => config('json-api.routes.secure-route.controller') . '@create',
88+
'middleware' => config('json-api.routes.secure-route.middleware', 'jwt.auth'),
89+
])->where(['resource' => '[a-z\-]+']);
90+
91+
$router->get('/{resource}/{id}', [
92+
'uses' => config('json-api.routes.secure-route.controller') . '@item',
93+
'as' => 'secure-api.resource.item',
94+
'middleware' => config('json-api.routes.secure-route.middleware', 'jwt.auth'),
95+
])->where(['resource' => '[a-z\-]+']);
96+
97+
$router->patch('/{resource}/{id}', [
98+
'uses' => config('json-api.routes.public-route.controller') . '@patch',
99+
'middleware' => config('json-api.routes.secure-route.middleware', 'jwt.auth'),
100+
]);
101+
102+
$router->delete('/{resource}/{id}', [
103+
'uses' => config('json-api.routes.public-route.controller') . '@delete',
104+
'middleware' => config('json-api.routes.secure-route.middleware', 'jwt.auth'),
105+
]);
106+
107+
$router->get('/{resource}/{id}/relationships/{relationship}', [
108+
'uses' => config('json-api.routes.secure-route.controller') . '@relatedCollection',
109+
'as' => 'secure-api.resource.relationship',
110+
'middleware' => config('json-api.routes.secure-route.middleware', 'jwt.auth'),
111+
])->where(['resource' => '[a-z\-]+', 'relationship' => '[a-z\-]+']);
112+
113+
$router->post('/{resource}/{id}/relationships/{relationship}', [
114+
'uses' => config('json-api.routes.public-route.controller') . '@relatedPost',
115+
'middleware' => config('json-api.routes.secure-route.middleware', 'jwt.auth'),
116+
])->where(['resource' => '[a-z\-]+', 'relationship' => '[a-z\-]+']);
117+
118+
$router->patch('/{resource}/{id}/relationships/{relationship}', [
119+
'uses' => config('json-api.routes.public-route.controller') . '@relatedPatch',
120+
'middleware' => config('json-api.routes.secure-route.middleware', 'jwt.auth'),
121+
])->where(['resource' => '[a-z\-]+', 'relationship' => '[a-z\-]+']);
122+
123+
$router->get('/{resource}/{id}/relationships/{relationship}/{parameter}', [
124+
'uses' => config('json-api.routes.secure-route.controller') . '@relatedItem',
125+
'as' => 'secure-api.resource.relationship.item',
126+
'middleware' => config('json-api.routes.secure-route.middleware', 'jwt.auth'),
127+
])->where(['resource' => '[a-z\-]+', 'relationship' => '[a-z\-]+']);
128+
129+
$router->delete('/{resource}/{id}/relationships/{relationship}', [
130+
'uses' => config('json-api.routes.secure-route.controller') . '@relatedDelete',
131+
'middleware' => config('json-api.routes.secure-route.middleware', 'jwt.auth'),
132+
])->where(['resource' => '[a-z\-]+', 'relationship' => '[a-z\-]+']);
133+
134+
$router->delete('/{resource}/{id}/relationships/{relationship}/{parameter}', [
135+
'uses' => config('json-api.routes.secure-route.controller') . '@relatedItemDelete',
136+
'middleware' => config('json-api.routes.secure-route.middleware', 'jwt.auth'),
137+
])->where(['resource' => '[a-z\-]+', 'relationship' => '[a-z\-]+']);
138+
});
139+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?php
2+
3+
namespace Ipunkt\LaravelJsonApi\Contracts\Exceptions;
4+
5+
interface ExtendedLoggingInformation
6+
{
7+
/**
8+
* returns context for exception
9+
*
10+
* @return array
11+
*/
12+
public function context();
13+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<?php
2+
3+
namespace Ipunkt\LaravelJsonApi\Contracts\FilterFactories;
4+
5+
use Ipunkt\LaravelJsonApi\FilterFactories\FilterFactoryNotFoundException;
6+
7+
interface FilterFactory
8+
{
9+
/**
10+
* Gibt alle bekannten Filter zurück.
11+
* Format: 'filtername' => 'Klassenfpad'
12+
*
13+
* @return array|string[]
14+
*/
15+
function allAvailable();
16+
17+
/**
18+
* @param string $name
19+
* @param mixed $value
20+
* @return \Ipunkt\LaravelJsonApi\Contracts\Repositories\Conditions\RepositoryCondition
21+
* @throws FilterFactoryNotFoundException when no filter found
22+
*/
23+
function make($name, $value);
24+
25+
/**
26+
* returns default filter
27+
*
28+
* @return null|string
29+
*/
30+
function getDefaultFilter();
31+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?php
2+
3+
namespace Ipunkt\LaravelJsonApi\Contracts;
4+
5+
use Illuminate\Database\Eloquent\Collection;
6+
use Illuminate\Database\Eloquent\Model;
7+
8+
interface OneToManyRelationRepository extends RelatedRepository
9+
{
10+
/**
11+
* returns collection request
12+
*
13+
* @param Model|mixed $model
14+
* @return Model[]|Collection|mixed
15+
*/
16+
public function getMany($model);
17+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?php
2+
3+
namespace Ipunkt\LaravelJsonApi\Contracts;
4+
5+
use Illuminate\Database\Eloquent\Model;
6+
7+
interface OneToOneRelationRepository extends RelatedRepository
8+
{
9+
/**
10+
* returns collection request
11+
*
12+
* @param Model|mixed $model
13+
* @return Model|mixed
14+
*/
15+
public function getOne($model);
16+
}

src/Contracts/RelatedRepository.php

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?php
2+
3+
namespace Ipunkt\LaravelJsonApi\Contracts;
4+
5+
use Illuminate\Database\Eloquent\Model;
6+
7+
interface RelatedRepository
8+
{
9+
/**
10+
* returns item request
11+
*
12+
* @param Model|mixed $model
13+
* @param string|int $id
14+
* @return Model|mixed
15+
*/
16+
public function findRelated($model, $id);
17+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?php
2+
3+
namespace Ipunkt\LaravelJsonApi\Contracts\Repositories;
4+
5+
use Ipunkt\LaravelJsonApi\Contracts\Repositories\Conditions\RepositoryCondition;
6+
7+
interface ConditionAwareRepository
8+
{
9+
/**
10+
* @param RepositoryCondition $constraint
11+
* @return void
12+
*/
13+
function applyCondition(RepositoryCondition $constraint);
14+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?php
2+
3+
namespace Ipunkt\LaravelJsonApi\Contracts\Repositories\Conditions;
4+
5+
interface RepositoryCondition
6+
{
7+
/**
8+
* apply a builder
9+
*
10+
* @param TakesConditions $builder
11+
*/
12+
function apply(TakesConditions $builder);
13+
}

0 commit comments

Comments
 (0)