Add model to store syndication target data

This commit is contained in:
Jonny Barnes 2022-10-22 14:18:21 +01:00
parent 7cd9956b92
commit ea8395a651
Signed by: jonny
SSH key fingerprint: SHA256:CTuSlns5U7qlD9jqHvtnVmfYV3Zwl2Z7WnJ4/dqOaL8
5 changed files with 154 additions and 9 deletions

View file

@ -6,6 +6,7 @@ namespace App\Http\Controllers;
use App\Http\Responses\MicropubResponses; use App\Http\Responses\MicropubResponses;
use App\Models\Place; use App\Models\Place;
use App\Models\SyndicationTarget;
use App\Services\Micropub\HCardService; use App\Services\Micropub\HCardService;
use App\Services\Micropub\HEntryService; use App\Services\Micropub\HEntryService;
use App\Services\Micropub\UpdateService; use App\Services\Micropub\UpdateService;
@ -121,21 +122,19 @@ class MicropubController extends Controller
{ {
try { try {
$tokenData = $this->tokenService->validateToken(request()->input('access_token')); $tokenData = $this->tokenService->validateToken(request()->input('access_token'));
} catch (RequiredConstraintsViolated | InvalidTokenStructure $exception) { } catch (RequiredConstraintsViolated | InvalidTokenStructure) {
$micropubResponses = new MicropubResponses(); return (new MicropubResponses())->invalidTokenResponse();
return $micropubResponses->invalidTokenResponse();
} }
if (request()->input('q') === 'syndicate-to') { if (request()->input('q') === 'syndicate-to') {
return response()->json([ return response()->json([
'syndicate-to' => config('syndication.targets'), 'syndicate-to' => SyndicationTarget::all(),
]); ]);
} }
if (request()->input('q') == 'config') { if (request()->input('q') === 'config') {
return response()->json([ return response()->json([
'syndicate-to' => config('syndication.targets'), 'syndicate-to' => SyndicationTarget::all(),
'media-endpoint' => route('media-endpoint'), 'media-endpoint' => route('media-endpoint'),
]); ]);
} }

View file

@ -0,0 +1,68 @@
<?php
declare(strict_types=1);
namespace App\Models;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class SyndicationTarget extends Model
{
use HasFactory;
/**
* The attributes that are visible when serializing the model.
*
* @var array<string>
*/
protected $visible = [
'uid',
'name',
'service',
'user',
];
/**
* The accessors to append to the model's array form.
*
* @var array
*/
protected $appends = [
'service',
'user',
];
/**
* Get the service data as a single attribute.
*
* @vreturn Attribute
*/
protected function service(): Attribute
{
return Attribute::get(
get: fn ($value, $attributes) => [
'name' => $attributes['service_name'],
'url' => $attributes['service_url'],
'photo' => $attributes['service_photo'],
],
);
}
/**
* Get the user data as a single attribute.
*
* @vreturn Attribute
*/
protected function user(): Attribute
{
return Attribute::get(
get: fn ($value, $attributes) => [
'name' => $attributes['user_name'],
'url' => $attributes['user_url'],
'photo' => $attributes['user_photo'],
],
);
}
}

View file

@ -0,0 +1,30 @@
<?php
namespace Database\Factories;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\SyndicationTarget>
*/
class SyndicationTargetFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition()
{
return [
'uid' => $this->faker->url,
'name' => $this->faker->name,
'service_name' => $this->faker->name,
'service_url' => $this->faker->url,
'service_photo' => $this->faker->url,
'user_name' => $this->faker->name,
'user_url' => $this->faker->url,
'user_photo' => $this->faker->url,
];
}
}

View file

@ -0,0 +1,39 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('syndication_targets', function (Blueprint $table) {
$table->id();
$table->string('uid');
$table->string('name');
$table->string('service_name');
$table->string('service_url');
$table->string('service_photo');
$table->string('user_name');
$table->string('user_url');
$table->string('user_photo');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('syndication_targets');
}
};

View file

@ -9,6 +9,7 @@ use App\Jobs\SyndicateNoteToTwitter;
use App\Models\Media; use App\Models\Media;
use App\Models\Note; use App\Models\Note;
use App\Models\Place; use App\Models\Place;
use App\Models\SyndicationTarget;
use Carbon\Carbon; use Carbon\Carbon;
use Faker\Factory; use Faker\Factory;
use Illuminate\Foundation\Testing\RefreshDatabase; use Illuminate\Foundation\Testing\RefreshDatabase;
@ -51,10 +52,18 @@ class MicropubControllerTest extends TestCase
} }
/** @test */ /** @test */
public function micropubClientsCanRequestSyndicationTargets(): void public function micropubClientsCanRequestSyndicationTargetsCanBeEmpty(): void
{ {
$response = $this->get('/api/post?q=syndicate-to', ['HTTP_Authorization' => 'Bearer ' . $this->getToken()]); $response = $this->get('/api/post?q=syndicate-to', ['HTTP_Authorization' => 'Bearer ' . $this->getToken()]);
$response->assertJsonFragment(['uid' => 'https://twitter.com/jonnybarnes']); $response->assertJsonFragment(['syndicate-to' => []]);
}
/** @test */
public function micropubClientsCanRequestSyndicationTargetsPopulatesFromModel(): void
{
$syndicationTarget = SyndicationTarget::factory()->create();
$response = $this->get('/api/post?q=syndicate-to', ['HTTP_Authorization' => 'Bearer ' . $this->getToken()]);
$response->assertJsonFragment(['uid' => $syndicationTarget->uid]);
} }
/** @test */ /** @test */