Merge branch 'feature/micropub' into develop
This commit is contained in:
commit
4bed31862e
6 changed files with 128 additions and 46 deletions
|
@ -37,9 +37,7 @@ class MicropubClientController extends Controller
|
||||||
public function newNotePage(Request $request)
|
public function newNotePage(Request $request)
|
||||||
{
|
{
|
||||||
$url = $request->session()->get('me');
|
$url = $request->session()->get('me');
|
||||||
$syndication = $this->parseSyndicationTargets(
|
$syndication = $request->session()->get('syndication');
|
||||||
$request->session()->get('syndication')
|
|
||||||
);
|
|
||||||
|
|
||||||
return view('micropubnewnotepage', [
|
return view('micropubnewnotepage', [
|
||||||
'url' => $url,
|
'url' => $url,
|
||||||
|
@ -113,7 +111,7 @@ class MicropubClientController extends Controller
|
||||||
return redirect('notes/new')->withErrors('Bad response when refreshing syndication targets', 'endpoint');
|
return redirect('notes/new')->withErrors('Bad response when refreshing syndication targets', 'endpoint');
|
||||||
}
|
}
|
||||||
$body = (string) $response->getBody();
|
$body = (string) $response->getBody();
|
||||||
$syndication = str_replace(['&', '[]'], [';', ''], $body);
|
$syndication = $this->parseSyndicationTargets($body);
|
||||||
|
|
||||||
$request->session()->put('syndication', $syndication);
|
$request->session()->put('syndication', $syndication);
|
||||||
|
|
||||||
|
@ -321,10 +319,9 @@ class MicropubClientController extends Controller
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
$syndicateTo = [];
|
$syndicateTo = [];
|
||||||
$parts = explode(';', $syndicationTargets);
|
$data = json_decode($syndicationTargets, true);
|
||||||
foreach ($parts as $part) {
|
foreach ($syndicateTo['syndicate-to'] as $syn) {
|
||||||
$target = explode('=', $part);
|
$syndicateTo[] = $syn['uid'];
|
||||||
$syndicateTo[] = urldecode($target[1]);
|
|
||||||
}
|
}
|
||||||
if (count($syndicateTo) > 0) {
|
if (count($syndicateTo) > 0) {
|
||||||
return $syndicateTo;
|
return $syndicateTo;
|
||||||
|
|
|
@ -27,7 +27,7 @@ class MicropubController extends Controller
|
||||||
protected $placeService;
|
protected $placeService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Injest the dependency.
|
* Inject the dependencies.
|
||||||
*/
|
*/
|
||||||
public function __construct(
|
public function __construct(
|
||||||
TokenService $tokenService = null,
|
TokenService $tokenService = null,
|
||||||
|
@ -59,31 +59,53 @@ class MicropubController extends Controller
|
||||||
$type = $request->input('h');
|
$type = $request->input('h');
|
||||||
if ($type == 'entry') {
|
if ($type == 'entry') {
|
||||||
$note = $this->noteService->createNote($request, $clientId);
|
$note = $this->noteService->createNote($request, $clientId);
|
||||||
$content = 'Note created at ' . $note->longurl;
|
$content = <<<EOD
|
||||||
|
{
|
||||||
|
"response": "created",
|
||||||
|
"location": "$note->longurl"
|
||||||
|
}
|
||||||
|
EOD;
|
||||||
|
|
||||||
return (new Response($content, 201))
|
return (new Response($content, 201))
|
||||||
->header('Location', $note->longurl);
|
->header('Location', $note->longurl)
|
||||||
|
->header('Content-Type', 'application/json');
|
||||||
}
|
}
|
||||||
if ($type == 'card') {
|
if ($type == 'card') {
|
||||||
$place = $this->placeService->createPlace($request);
|
$place = $this->placeService->createPlace($request);
|
||||||
$content = 'Place created at ' . $place->longurl;
|
$content = <<<EOD
|
||||||
|
{
|
||||||
|
"response": "created",
|
||||||
|
"location": "$place->longurl"
|
||||||
|
}
|
||||||
|
EOD;
|
||||||
|
|
||||||
return (new Response($content, 201))
|
return (new Response($content, 201))
|
||||||
->header('Location', $place->longurl);
|
->header('Location', $place->longurl)
|
||||||
|
->header('Content-Type', 'application/json');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$content = http_build_query([
|
$content = <<<EOD
|
||||||
'error' => 'invalid_token',
|
{
|
||||||
'error_description' => 'The token provided is not valid or does not have the necessary scope',
|
"response": "error",
|
||||||
]);
|
"error": "invalid_token",
|
||||||
|
"error_description": "The token provided is not valid or does not have the necessary scope",
|
||||||
|
}
|
||||||
|
EOD;
|
||||||
|
|
||||||
return (new Response($content, 400))
|
return (new Response($content, 400))
|
||||||
->header('Content-Type', 'application/x-www-form-urlencoded');
|
->header('Content-Type', 'application/json');
|
||||||
}
|
}
|
||||||
$content = 'No OAuth token sent with request.';
|
$content = <<<EOD
|
||||||
|
{
|
||||||
|
"response": "error",
|
||||||
|
"error": "no_token",
|
||||||
|
"error_description": "No OAuth token sent with request"
|
||||||
|
}
|
||||||
|
EOD;
|
||||||
|
|
||||||
return new Response($content, 400);
|
return (new Response($content, 400))
|
||||||
|
->header('Content-Type', 'application/json');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -104,16 +126,34 @@ class MicropubController extends Controller
|
||||||
$valid = $this->tokenService->validateToken($token);
|
$valid = $this->tokenService->validateToken($token);
|
||||||
|
|
||||||
if ($valid === null) {
|
if ($valid === null) {
|
||||||
return new Response('Invalid token', 400);
|
$content = <<<EOD
|
||||||
|
{
|
||||||
|
"respose": "error",
|
||||||
|
"error": "invalid_token",
|
||||||
|
"error_description": "The provided token did not pass validation"
|
||||||
|
}
|
||||||
|
EOD;
|
||||||
|
return (new Response($content, 400))
|
||||||
|
->header('Content-Type', 'application/json');
|
||||||
}
|
}
|
||||||
//we have a valid token, is `syndicate-to` set?
|
//we have a valid token, is `syndicate-to` set?
|
||||||
if ($request->input('q') === 'syndicate-to') {
|
if ($request->input('q') === 'syndicate-to') {
|
||||||
$content = http_build_query([
|
return response()->json([
|
||||||
'syndicate-to' => 'twitter.com/jonnybarnes',
|
'syndicate-to' => [[
|
||||||
|
'uid' => 'https://twitter.com/jonnybarnes',
|
||||||
|
'name' => 'jonnybarnes on Twitter',
|
||||||
|
'service' => [
|
||||||
|
'name' => 'Twitter',
|
||||||
|
'url' => 'https://twitter.com',
|
||||||
|
'photo' => 'https://upload.wikimedia.org/wikipedia/en/9/9f/Twitter_bird_logo_2012.svg',
|
||||||
|
],
|
||||||
|
'user' => [
|
||||||
|
'name' => 'jonnybarnes',
|
||||||
|
'url' => 'https://twitter.com/jonnybarnes',
|
||||||
|
'photo' => 'https://pbs.twimg.com/profile_images/1853565405/jmb-bw.jpg',
|
||||||
|
],
|
||||||
|
]],
|
||||||
]);
|
]);
|
||||||
|
|
||||||
return (new Response($content, 200))
|
|
||||||
->header('Content-Type', 'application/x-www-form-urlencoded');
|
|
||||||
}
|
}
|
||||||
//nope, how about a geo URL?
|
//nope, how about a geo URL?
|
||||||
if (substr($request->input('q'), 0, 4) === 'geo:') {
|
if (substr($request->input('q'), 0, 4) === 'geo:') {
|
||||||
|
@ -123,21 +163,51 @@ class MicropubController extends Controller
|
||||||
$longitude = $latlng[1];
|
$longitude = $latlng[1];
|
||||||
$places = Place::near($latitude, $longitude, 1000);
|
$places = Place::near($latitude, $longitude, 1000);
|
||||||
|
|
||||||
return (new Response(json_encode($places), 200))
|
return response()->json([
|
||||||
->header('Content-Type', 'application/json');
|
'response' => 'places',
|
||||||
|
'places' => $places
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
//nope, ho about a config query?
|
||||||
|
if ($request->input('q') == 'config') {
|
||||||
|
return response()->json([
|
||||||
|
'syndicate-to' => [[
|
||||||
|
'uid' => 'https://twitter.com/jonnybarnes',
|
||||||
|
'name' => 'jonnybarnes on Twitter',
|
||||||
|
'service' => [
|
||||||
|
'name' => 'Twitter',
|
||||||
|
'url' => 'https://twitter.com',
|
||||||
|
'photo' => 'https://upload.wikimedia.org/wikipedia/en/9/9f/Twitter_bird_logo_2012.svg',
|
||||||
|
],
|
||||||
|
'user' => [
|
||||||
|
'name' => 'jonnybarnes',
|
||||||
|
'url' => 'https://twitter.com/jonnybarnes',
|
||||||
|
'photo' => 'https://pbs.twimg.com/profile_images/1853565405/jmb-bw.jpg',
|
||||||
|
],
|
||||||
|
]],
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
//nope, just return the token
|
|
||||||
$content = http_build_query([
|
|
||||||
'me' => $valid->getClaim('me'),
|
|
||||||
'scope' => $valid->getClaim('scope'),
|
|
||||||
'client_id' => $valid->getClaim('client_id'),
|
|
||||||
]);
|
|
||||||
|
|
||||||
return (new Response($content, 200))
|
//nope, just return the token
|
||||||
->header('Content-Type', 'application/x-www-form-urlencoded');
|
return response()->json([
|
||||||
|
'response' => 'token',
|
||||||
|
'token' => [
|
||||||
|
'me' => $valid->getClaim('me'),
|
||||||
|
'scope' => $valid->getClaim('scope'),
|
||||||
|
'client_id' => $valid->getClaim('client_id'),
|
||||||
|
],
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
$content = 'No OAuth token sent with request.';
|
$content = 'No OAuth token sent with request.';
|
||||||
|
$content = <<<EOD
|
||||||
|
{
|
||||||
|
"response": "error",
|
||||||
|
"error": "no_token",
|
||||||
|
"error_description": "No token provided with request"
|
||||||
|
}
|
||||||
|
EOD;
|
||||||
|
|
||||||
return new Response($content, 400);
|
return (new Response($content, 400))
|
||||||
|
->header('Content-Type', 'application/json');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,11 +48,11 @@ class NoteService
|
||||||
$this->dispatch(new SendWebMentions($note));
|
$this->dispatch(new SendWebMentions($note));
|
||||||
|
|
||||||
if (//micropub request, syndication sent as array
|
if (//micropub request, syndication sent as array
|
||||||
(is_array($request->input('mp-syndicate-to'))
|
(is_array($request->input('syndicate-to'))
|
||||||
&&
|
&&
|
||||||
(in_array('twitter.com/jonnybarnes', $request->input('mp-syndicate-to')))
|
(in_array('https://twitter.com/jonnybarnes', $request->input('syndicate-to')))
|
||||||
|| //micropub request, syndication sent as string
|
|| //micropub request, syndication sent as string
|
||||||
($request->input('mp-syndicate-to') == 'twitter.com/jonnybarnes')
|
($request->input('syndicate-to') == 'https://twitter.com/jonnybarnes')
|
||||||
|| //local admin cp request
|
|| //local admin cp request
|
||||||
($request->input('twitter') == true))
|
($request->input('twitter') == true))
|
||||||
) {
|
) {
|
||||||
|
|
|
@ -1,5 +1,13 @@
|
||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## Version {next}
|
||||||
|
- Use JSON for syndication endpoint query response
|
||||||
|
- Use JSON for all micropub requests
|
||||||
|
- Add support for `q=config` query of the micropub endpoint
|
||||||
|
|
||||||
|
## Version 0.0.6.3 (2016-06-29)
|
||||||
|
- Fix an issue with dispatching the syndication job
|
||||||
|
|
||||||
## Version 0.0.6.2 (2016-06-28)
|
## Version 0.0.6.2 (2016-06-28)
|
||||||
- Fix an issue with sending webmentions
|
- Fix an issue with sending webmentions
|
||||||
|
|
||||||
|
|
|
@ -32,12 +32,13 @@ class MicropubClientTest extends TestCase
|
||||||
|
|
||||||
public function testClientPageRecentAuth()
|
public function testClientPageRecentAuth()
|
||||||
{
|
{
|
||||||
|
$syndication = ['https://twitter.com/jonnybarnes'];
|
||||||
$this->withSession([
|
$this->withSession([
|
||||||
'me' => $this->appurl,
|
'me' => $this->appurl,
|
||||||
'syndication' => 'mp-syndicate-to=twitter.com%2Fjbl5',
|
'syndication' => $syndication,
|
||||||
])->visit($this->appurl . '/notes/new')
|
])->visit($this->appurl . '/notes/new')
|
||||||
->see($this->appurl)
|
->see($this->appurl)
|
||||||
->see('twitter.com/jbl5');
|
->see('https://twitter.com/jonnybarnes');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -25,26 +25,26 @@ class MicropubTest extends TestCase
|
||||||
{
|
{
|
||||||
$this->call('GET', $this->appurl . '/api/post');
|
$this->call('GET', $this->appurl . '/api/post');
|
||||||
$this->assertResponseStatus(400);
|
$this->assertResponseStatus(400);
|
||||||
$this->see('No OAuth token sent with request.');
|
$this->seeJson(['error_description' => 'No token provided with request']);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testMicropubRequestWithoutValidToken()
|
public function testMicropubRequestWithoutValidToken()
|
||||||
{
|
{
|
||||||
$this->call('GET', $this->appurl . '/api/post', [], [], [], ['HTTP_Authorization' => 'Bearer abc123']);
|
$this->call('GET', $this->appurl . '/api/post', [], [], [], ['HTTP_Authorization' => 'Bearer abc123']);
|
||||||
$this->assertResponseStatus(400);
|
$this->assertResponseStatus(400);
|
||||||
$this->see('Invalid token');
|
$this->seeJson(['error_description' => 'The provided token did not pass validation']);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testMicropubRequestWithValidToken()
|
public function testMicropubRequestWithValidToken()
|
||||||
{
|
{
|
||||||
$this->call('GET', $this->appurl . '/api/post', [], [], [], ['HTTP_Authorization' => 'Bearer ' . $this->getToken()]);
|
$this->call('GET', $this->appurl . '/api/post', [], [], [], ['HTTP_Authorization' => 'Bearer ' . $this->getToken()]);
|
||||||
$this->see('me=https%3A%2F%2Fjonnybarnes.localhost');
|
$this->seeJson(['response' => 'token']);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testMicropubRequestForSyndication()
|
public function testMicropubRequestForSyndication()
|
||||||
{
|
{
|
||||||
$this->call('GET', $this->appurl . '/api/post', ['q' => 'syndicate-to'], [], [], ['HTTP_Authorization' => 'Bearer ' . $this->getToken()]);
|
$this->call('GET', $this->appurl . '/api/post', ['q' => 'syndicate-to'], [], [], ['HTTP_Authorization' => 'Bearer ' . $this->getToken()]);
|
||||||
$this->see('twitter.com%2Fjonnybarnes');
|
$this->seeJson(['uid' => 'https://twitter.com/jonnybarnes']);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testMicropubRequestForNearbyPlacesThatExist()
|
public function testMicropubRequestForNearbyPlacesThatExist()
|
||||||
|
@ -59,6 +59,12 @@ class MicropubTest extends TestCase
|
||||||
$this->see('[]');
|
$this->see('[]');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testMicropubRequestForConfig()
|
||||||
|
{
|
||||||
|
$this->call('GET', $this->appurl . '/api/post', ['q' => 'config'], [], [], ['HTTP_Authorization' => 'Bearer ' . $this->getToken()]);
|
||||||
|
$this->seeJson(['uid' => 'https://twitter.com/jonnybarnes']);
|
||||||
|
}
|
||||||
|
|
||||||
public function testMicropubRequestCreateNewNote()
|
public function testMicropubRequestCreateNewNote()
|
||||||
{
|
{
|
||||||
$faker = \Faker\Factory::create();
|
$faker = \Faker\Factory::create();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue