Commit graph jonnybarnes.uk/app/Services
Author SHA1 Message Date
d5706b5f8f
Replace JWT Micropub tokens with revocable opaque tokens
Tokens now store a hashed row in micropub_tokens instead of being
self-contained signed JWTs, so a leaked or unwanted token can actually
be revoked. Since revocation already requires a DB lookup on every
request, JWT's stateless-verification benefit was gone anyway, so this
also drops the lcobucci/jwt dependency entirely.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014625MfkGZ7GVdbqKme4a8L
2026-08-13 16:07:07 +01:00
e08763c526
Migrate outbound HTTP calls from Guzzle to the Http facade
Replaces every raw GuzzleHttp\Client usage (Nominatim, web.archive.org,
webmention fetch/discover/send, Bridgy syndication, IndieAuth client_id
lookup, contact avatar/h-card fetch, profile image download, and the
CloudConvert screenshot pipeline) with Illuminate\Support\Facades\Http,
and enables Http::preventStrayRequests() globally in tests so any
un-faked outbound call now fails loudly instead of silently hitting the
network.

The CloudConvert retry-until-finished middleware in AppServiceProvider
is replaced by a plain polling loop in SaveScreenshot, which also fixes
a latent bug where the old middleware decoded a response object instead
of its body. Bridgy syndication jobs keep their tries=1/no-retry
semantics unchanged to avoid duplicate publishes. Guzzle's PSR-7 helpers
(Header, UriResolver, Utils) stay in SendWebMentions since Http has no
equivalent for them.

Every affected test file's Guzzle MockHandler/HandlerStack boilerplate
is replaced with Http::fake()/Http::sequence().

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01P8j7cJhCiYDsGUgB7obKNQ
2026-07-26 09:12:01 +01:00
9f012b01e4
Upgrade to Laravel 13 2026-04-07 09:01:19 +01:00
e8e2bff5e4
Fix UpdateHandler crash when replace.content is a rich-text object
OwnYourSwarm sends content as an array of objects with `value` and `html`
keys per the Micropub spec. The handler now handles both forms: plain
strings and rich objects, preferring `html` over `value`.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-18 17:43:57 +00:00
4451fc247e
Fix OwnYourSwarm checkin parsing to read from properties.checkin
Real OwnYourSwarm requests send the checkin h-card inside
properties.checkin (as an array), not at the top level. The code
was reading from the top-level key so no Place was ever created,
leaving checkin notes blank.

Update tests to match the real request format.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-14 19:18:00 +00:00
1137d2a07e
Move request parsing into DTOs via fromRequest(), expand update handler
Each DTO now owns its own parsing logic via fromRequest(), removing
the normalization layer from MicropubRequest entirely. UpdateHandler
gains delete support and allows replace/add/delete to compose in a
single request rather than being mutually exclusive.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-13 20:39:50 +00:00
ad15b36f4d
Introduce typed DTOs and sub-namespaces for Micropub handlers
Each handler now declares the data class it needs via dataClass(). The
controller builds the appropriate typed DTO from the raw request array
before calling handle(), giving handlers typed property access instead
of raw array lookups.

Handlers moved to App\Services\Micropub\Handlers, data objects to
App\Services\Micropub\Data. MicropubHandlerRegistry and the interface
are documented with flow diagrams and guidance for adding new types.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22 10:41:33 +00:00
24cb6d61aa
Implement micropub update support with clean exception-based error handling
- Add MicropubUnsupportedModelException for non-note update attempts
- Refactor UpdateHandler to throw exceptions instead of returning JsonResponse objects; extract applySyndication() to DRY up duplicated syndication URL mapping
- Fix MicropubController: InvalidTokenScopeException now returns 401 + insufficient_scope; add catches for ModelNotFoundException (404) and MicropubUnsupportedModelException (500); updates return 200 not 201
- Slim MicropubRequest.normalizeMicropubJson() to branch on action type, keeping update and create fields cleanly separated
- Update tests to match corrected status codes and error keys; remove markTestSkipped() from all update tests

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22 10:15:35 +00:00
51780523b4
Fix unit tests 2026-01-04 10:22:32 +00:00
9e788e0fe8
Images can be uploaded with alt text
This means associating images to notes via a pivot table, we also finish
off the migration of medai from S3.
2026-01-04 10:07:25 +00:00
76db869af5
Allow files to be added to notes
This is specifically when a Micropub client is using the JSON syntax and
initially uploads the photo via the media endpoint
2025-12-27 17:58:43 +00:00
83d10e1a70
Refactor of micropub request handling
Trying to organise the code better. It now temporarily doesn’t support
update requests. Thought the spec defines them as SHOULD features and
not MUST features. So safe for now :)
2025-04-27 16:38:25 +01:00
23c275945a
Refactor micropub token verification 2025-04-12 11:47:30 +01:00
7a58287b34
Remove references to short domain 2025-04-06 17:22:36 +01:00
1dfa17abca
Update Laravel to v12
Some checks failed
PHP Unit / PHPUnit test suite (pull_request) Has been cancelled
Laravel Pint / Laravel Pint (pull_request) Has been cancelled
2025-04-01 21:10:30 +01:00
d7da42b626
Host images locally
Some checks failed
PHP Unit / PHPUnit test suite (pull_request) Has been cancelled
Laravel Pint / Laravel Pint (pull_request) Has been cancelled
We don’t need the complexity of S3. Sepcifically the complexity of
managing my own AWS account, flysystem made the Laravel side easy.

A command is added to copy the the S3 files over to local storage.
2024-10-25 20:40:52 +01:00
cbbe87e23c
Setup support for syndicating to Bluesky 2024-03-23 21:19:54 +00:00
3c0c375fbb
Update composer dependencies 2023-12-06 20:11:41 +00:00
b1407af945
Update Laravel Pint 2023-07-27 21:14:23 +01:00
86ac67698e
Remove activity stream functionality from controllers and providers.
- Remove activity stream related code and files
- Update configuration for HtmlSanitizer and RetryGuzzle
- Add `paginate` macro for `Collection`
- Remove unused code for `Codebird`
- Simplify `FrontPageController` and `NotesController` methods
2023-05-12 15:30:05 +01:00
7ee5bb00ba
Update Laravel Pint 2023-04-20 17:34:06 +01:00
88e1246f8b
Remove Twitter POSSE support 2023-04-08 13:25:36 +01:00
16b120bc73
Upgrade to Laravel 10 2023-02-18 09:34:57 +00:00
6d6e719f52
Update Laravel Pint, fix files in codebase 2023-02-16 16:57:06 +00:00
f2c8f04c2f
Laravel Pint fixes
Also remove a file that wasn’t needed
2023-02-04 10:30:49 +00:00
45c71bbb47
Setup CloudConvert to take webpage screenshots 2023-01-02 09:39:23 +00:00
a8b3dffddb
Update Laravel Sail 2022-12-23 10:30:42 +00:00
6c43363c78
Make some tweaks around dealing with replies 2022-12-03 20:12:39 +00:00
ca6205d2a6
Allow micropub to post notes and articles 2022-11-29 19:58:44 +00:00
72cb4fd7eb
Allow notes to be syndicated to Mastodon 2022-11-04 15:23:31 +00:00
66257e7e9b
Use new syndication target model when processing MicroPub requests 2022-10-23 20:38:12 +01:00
e36f15d391
Fix files with Laravel Pint 2022-07-09 10:08:26 +01:00
48d1c9a00b Improve tests 2022-05-14 17:48:53 +01:00
f73a5587dc No longer need our own token exception 2020-11-28 19:02:37 +00:00
6942fc1d32 Initial php8 work
- switch to GD for image work
 - fix issues around jwt
2020-11-28 18:21:29 +00:00
02e3ce42e0 StyleCI fixes 2 2020-10-17 10:26:02 +01:00
3c3ad3e29d Remove the postgis stuff 2020-10-16 20:45:07 +01:00
b0ad1d272c Some small fixes needed for the tests 2020-06-13 17:26:59 +01:00
215b28b056 Fix errors psalm found scanning at level 7 2020-02-21 22:46:48 +00:00
ef03d2209f Fixing various phpcs issues 2019-10-27 19:31:33 +00:00
9de24c2740 Apply fixes from StyleCI 2019-10-27 16:29:15 +00:00
fb44afd7ad Remove deprecated global helper functions (issue #99)
Squashed commit of the following:

commit 8ff29a8ab51ee5057ef786614ab95b005bf8918c
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date:   Fri Feb 1 18:42:05 2019 +0000

    Replace deprecated global helpers with their facade equivalents
2019-02-01 18:49:35 +00:00
acbb04f5a9 Fix ownyourswarm checkins (closes issue #93)
Squashed commit of the following:

commit b9716fc406664a58ce506aa419f978853d698eff
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date:   Sat Jan 26 15:30:43 2019 +0000

    Location and checkin aren’t part of the properties anymore
2019-01-26 15:38:18 +00:00
151072cd1b Squashed commit of the following:
commit 63912e4c20fc9b3d49670a0f547137d59aaa2ef4
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date:   Fri Oct 12 19:18:21 2018 +0100

    Remove facebook syndication code
2018-10-12 19:38:08 +01:00
79d0e78905 Ignore (for now), OwnYourSwarm requests with h-adr location value 2018-02-17 21:50:46 +00:00
e4fe2ecde3 Struct Types
Squashed commit of the following:

commit 74ed84617fcbecf661695763323e50d049a88db7
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date:   Mon Jan 15 12:46:29 2018 +0000

    Test passes so remove the dump statement

commit a7d3323be02da64f76e8ec88713e3de84a13ded7
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date:   Mon Jan 15 12:40:35 2018 +0000

    Values with spaces need to be quoted

commit 58a120bb238f14346793c388b948b7351d3b51fd
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date:   Mon Jan 15 12:37:23 2018 +0000

    We need a diplay name for the tests to work now we are using strict type checking

commit b46f177053bd697db9a4835d073f2f37e088b26f
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date:   Mon Jan 15 12:31:29 2018 +0000

    Get travis to show more info about failing test

commit 60323f3ce5a0561329a1721ee94821571cdcc86a
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date:   Mon Jan 15 12:23:27 2018 +0000

    Remove un-used namnepsace imports

commit 096d3505920bc94ff8677c77430eca0aae0be58a
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date:   Mon Jan 15 12:21:55 2018 +0000

    we need php7.2 for object type-hint

commit bb818bc19c73d02d510af9f002199f5718a54608
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date:   Mon Jan 15 12:15:48 2018 +0000

    Added lots of strict_types
2018-01-15 14:02:13 +00:00
940d24c462 Simple checkins
Squashed commit of the following:

commit 50f1993f45a9745ff77f2956a01543b747c85b41
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date:   Sun Dec 24 16:00:39 2017 +0000

    Add feature to changelog

commit 64deec40f7bc7941bd77f95c383f3b400952cec5
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date:   Sun Dec 24 14:19:06 2017 +0000

    Only show name of location in note metadata when not a simple checkin

commit 4c9fe397f76981f2eca5749a85ece136f78bb2af
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date:   Sun Dec 24 14:17:49 2017 +0000

    Add a simple checkin for testing purposes

commit 11564ead4aaf442113d380109d0b65972484dbcf
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date:   Sun Dec 24 14:17:05 2017 +0000

    Don’t set a default value for checkins during creation

commit 832c77c205626dd0119fc602727f6808c9d7758f
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date:   Sun Dec 24 14:16:05 2017 +0000

    If note has no content, but an associated place, it is a simple checkin, set a note value appropriately

commit 8c11f9d4b058b3bd248ed02476904301def0e6fc
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date:   Sun Dec 24 14:13:31 2017 +0000

    Allow a note to not have content, in whihc case default the value to null
2017-12-24 16:00:58 +00:00
2a0d188313 Move models to their own subdirectory 2017-12-19 16:00:42 +00:00
2c5b0f3ab5 Remove un-needed exception throwing 2017-12-18 18:23:09 +00:00
43beae2f82 Squashed commit of the following:
commit b87b6b2a96de870f1782b00cfe3f393cc79b7d3b
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date:   Mon Dec 18 14:05:11 2017 +0000

    Even more tests for this micropub refactor

commit 2d967f33c3abeea8fc89f91e1764e970681dc58f
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date:   Sat Dec 16 22:19:53 2017 +0000

    Fill out token endpoint tests

commit 440dcbe3e53f058060c918429bea75911ddafdc1
Merge: 02a25b0 f60164f
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date:   Fri Dec 15 14:32:50 2017 +0000

    Merge pull request #77 from jonnybarnes/analysis-8KABW6

    Apply fixes from StyleCI

commit f60164fe81dbcc1d2343704145d26c6d6412579a
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date:   Fri Dec 15 14:27:40 2017 +0000

    Apply fixes from StyleCI

commit 02a25b083a0305f73d715feb3f9d34f9de8f67d4
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date:   Fri Dec 15 14:17:43 2017 +0000

    phpcs fix

commit 144998de0866bf11f235847d7edc076235294545
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date:   Fri Dec 15 14:16:59 2017 +0000

    Don’t pass the request object to service files, pass request()->all()

commit dd5e52010c51a359665efa349ff8c13d4d6dbf57
Merge: 97b270a 23b145e
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date:   Sun Dec 10 20:01:03 2017 +0000

    Merge pull request #76 from jonnybarnes/analysis-86AVg6

    Apply fixes from StyleCI

commit 23b145e7bf67a358b3cb894ea0793984b65ecab5
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date:   Sun Dec 10 19:50:53 2017 +0000

    Apply fixes from StyleCI

commit 97b270a89abe92e167e0d363029ae0b86608bbc9
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date:   Sun Dec 10 19:43:38 2017 +0000

    Improve test coverage of the refactor

commit 244102264559e4fb0b0614d1738c0283703a71dc
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date:   Fri Dec 8 13:31:13 2017 +0000

    Refactor the note creation code

commit 22b4786cbd7ae508b51a47f0c8cf9a15535edbb1
Author: Jonny Barnes <jonny@jonnybarnes.uk>
Date:   Thu Dec 7 17:39:41 2017 +0000

    Remove ununsed importsed classes in the controller
2017-12-18 15:51:02 +00:00