Skip to content

Commit 45e523c

Browse files
committed
Configurable API base
...also more configurable CORS.
1 parent 2d556ca commit 45e523c

File tree

5 files changed

+41
-15
lines changed

5 files changed

+41
-15
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@
22
/phpdoc/
33
/logs/
44
/.idea/
5+
config.json
File renamed without changes.

api/v1/.gitignore

Lines changed: 0 additions & 1 deletion
This file was deleted.

api/v1/config.example.json renamed to config.example.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,11 @@
33
"dsn": "mysql:host=localhost;dbname=shared-logs",
44
"user": "shared-logs",
55
"password": "s00p3rS3KR37"
6+
},
7+
"api": {
8+
"prefix": "/api/v1"
9+
},
10+
"cors": {
11+
"allow-origin": "http://localhost"
612
}
713
}

api/v1/index.php renamed to index.php

Lines changed: 34 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<?php
22

3-
require_once __DIR__ . '/../../vendor/autoload.php';
3+
require_once __DIR__ . '/vendor/autoload.php';
44

55
use Battis\SharedLogs\Database\Bindings\DevicesBinding;
66
use Battis\SharedLogs\Database\Bindings\EntriesBinding;
@@ -37,7 +37,7 @@
3737
};
3838

3939
/* placeholders as separate arguments */
40-
$container['foundHandler'] = function() {
40+
$container['foundHandler'] = function () {
4141
return new RequestResponseArgs();
4242
};
4343

@@ -55,20 +55,40 @@
5555
return new UsersBinding($c->pdo);
5656
};
5757

58+
$container['cors'] = function ($c) {
59+
return [
60+
'allow-origin' => (empty($c['settings']['cors']['allow-origin'])
61+
? ($_SERVER['HTTPS'] ? 'https://' : 'http://') . $_SERVER['SERVER_NAME']
62+
: $c['settings']['cors']['allow-origin']
63+
),
64+
'allow-headers' => (empty($c['settings']['cors']['allow-headers'])
65+
? 'X-Requested-With, Content-Type, Accept, Origin, Authorization'
66+
: $c['settings']['cors']['allow-headers']
67+
),
68+
'allow-methods' => (empty($c['settings']['cors']['allow-methods'])
69+
? 'GET, POST, PUT, DELETE, OPTIONS'
70+
: $c['settings']['cors']['allow-headers']
71+
)
72+
];
73+
};
74+
75+
$apiPrefix = $container['settings']['api']['prefix'];
76+
5877
/* "lazy CORS" */
59-
$app->options('/{routes:.+}', function ($request, $response, $args) {
78+
$app->options($apiPrefix . '/{routes:.+}', function ($request, $response, $args) {
6079
return $response;
6180
});
6281

6382
$app->add(function (Request $req, Response $res, callable $next) {
6483
$response = $next($req, $res);
6584
return $response
66-
->withHeader('Access-Control-Allow-Origin', ($_SERVER['HTTPS'] ? 'https://' : 'http://') . $_SERVER['SERVER_NAME'])
67-
->withHeader('Access-Control-Allow-Headers', 'X-Requested-With, Content-Type, Accept, Origin, Authorization')
68-
->withHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
85+
->withHeader('Access-Control-Allow-Origin', $this->cors['allow-origin'])
86+
->withHeader('Access-Control-Allow-Headers', $this->cors['allow-headers'])
87+
->withHeader('Access-Control-Allow-Methods', $this->cors['allow-methods']);
6988
});
7089

71-
function callWithNonEmptyParams(callable $method, ...$params) {
90+
function callWithNonEmptyParams(callable $method, ...$params)
91+
{
7292
return $method(...array_filter($params, function ($param) {
7393
return !empty($param);
7494
}));
@@ -77,7 +97,7 @@ function callWithNonEmptyParams(callable $method, ...$params) {
7797
/*
7898
* define routes
7999
*/
80-
$app->group('/devices', function () {
100+
$app->group($apiPrefix . '/devices', function () {
81101
$this->post('', function (Request $request, Response $response) {
82102
return $response->withJson(callWithNonEmptyParams([$this->devices, 'create'], $request->getParsedBody(), $request->getParams()));
83103
});
@@ -97,7 +117,7 @@ function callWithNonEmptyParams(callable $method, ...$params) {
97117
return $response->withJson(callWithNonEmptyParams([$this->logs, 'listByDevice'], $id, $request->getParams()));
98118
});
99119
});
100-
$app->group('/logs', function () {
120+
$app->group($apiPrefix . '/logs', function () {
101121
$this->post('', function (Request $request, Response $response) {
102122
return $response->withJson(callWithNonEmptyParams([$this->logs, 'create'], $request->getParsedBody(), $request->getParams()));
103123
});
@@ -117,8 +137,8 @@ function callWithNonEmptyParams(callable $method, ...$params) {
117137
return $response->withJson(callWithNonEmptyParams([$this->entries, 'listByLog'], $id, $request->getParams()));
118138
});
119139
});
120-
$app->group('/entries', function () {
121-
$this->post('', function (Request $request, Response $response){
140+
$app->group($apiPrefix . '/entries', function () {
141+
$this->post('', function (Request $request, Response $response) {
122142
return $response->withJson(callWithNonEmptyParams([$this->entries, 'create'], $request->getParsedBody(), $request->getParams()));
123143
});
124144
$this->get(id_PATTERN, function (Request $request, Response $response, $id) {
@@ -131,7 +151,7 @@ function callWithNonEmptyParams(callable $method, ...$params) {
131151
return $response->withJson(callWithNonEmptyParams([$this->entries, 'delete'], $id, $request->getParams()));
132152
});
133153
});
134-
$app->group('/users', function () {
154+
$app->group($apiPrefix . '/users', function () {
135155
$this->post('', function (Request $request, Response $response) {
136156
return $response->withJson(callWithNonEmptyParams([$this->users, 'create'], $request->getParsedBody(), $request->getParams()));
137157
});
@@ -142,7 +162,7 @@ function callWithNonEmptyParams(callable $method, ...$params) {
142162
return $response->withJson(callWithNonEmptyParams([$this->users, 'get'], $id, $request->getParams()));
143163
});
144164
$this->get('/{screen_name:\w{' . User::SCREEN_NAME_MINIMUM_LENGTH . ',}}', function (Request $request, Response $response, $screen_name) {
145-
return $response->withJson(callWithNonEmptyParams([$this->users, 'lookupByScreenName'], $screen_name, $request->getParams()));
165+
return $response->withJson(callWithNonEmptyParams([$this->users, 'lookupByScreenName'], $screen_name, $request->getParams()));
146166
});
147167
$this->put(id_PATTERN, function (Request $request, Response $response, $id) {
148168
return $response->withJson(callWithNonEmptyParams([$this->users, 'update'], $id, $request->getParams()));
@@ -153,7 +173,7 @@ function callWithNonEmptyParams(callable $method, ...$params) {
153173
});
154174

155175
/* finish lazy CORS */
156-
$app->map(['GET', 'POST', 'PUT', 'DELETE'], '/{routes:.+}', function($req, $res) {
176+
$app->map(['GET', 'POST', 'PUT', 'DELETE'], $apiPrefix . '/{routes:.+}', function ($req, $res) {
157177
$handler = $this->notFoundHandler;
158178
return $handler($req, $res);
159179
});

0 commit comments

Comments
 (0)