• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

bleedingdeacons / reach / 33367259862
86%

Build:
DEFAULT BRANCH: main
Ran 31 Aug 2026 07:14AM UTC
Jobs 1
Files 95
Run time 1min
Badge
Embed ▾
README BADGES
x

If you need to use a raster PNG badge, change the '.svg' to '.png' in the link

Markdown

Textile

RDoc

HTML

Rst

31 Aug 2026 07:11AM UTC coverage: 86.257% (-1.9%) from 88.161%
33367259862

push

github

web-flow
feat(alerts): let a handset raise, reply to and resend messages (#104)

Hand has been receive-only: no route creates an alert, and raising one
is PHP-only through reach_send_alert(). An officer who needed to tell
the rota something had to find a laptop, and a responder who took a job
and then could not do it had no way to put it back.

Three new routes on the handset side, all authenticated exactly as the
existing ones are:

  POST /alerts              raise a message to a member or a committee
  POST /alerts/{id}/reply   free text back to whoever raised it
  POST /alerts/{id}/resend  put an acknowledged job back out

Any enrolled handset may send. There is no capability to check, and
reaching for Capabilities::SEND_ALERTS would be incoherent - that is a
WordPress capability and there is no WordPress user behind a device
token. A handset exists only because ResponderGate passed at enrolment
and passes again on every request, so "authenticated" already means
"certified responder". A per-device throttle stands in for the check
that was deliberately not written.

Replying works after somebody else has answered, which is the point of
it, and needs no exception: maySee() asks about targeting rather than
acknowledgement, so the poll suppression and the notice that clears the
card are untouched.

A resend mints a NEW message_uuid. Reusing the original would raise
something born suppressed - pendingFor() drops any alert whose message
already carries an acknowledgement - so it would have reached nobody.
Targeting is copied, so a broadcast goes back to the rota it came from,
and the contact travels with it so whoever picks it up can still ring
the caller. That hand-over gets its own Scrutiny entry: reads were
already answerable, but passing details to a new audience is a wider
disclosure that happens without anybody reading anything.

Also two read routes for the picker:

  GET /members     anonymous name + home group, marked reachable
  GET /committees  the tr... (continued)

6289 of 7291 relevant lines covered (86.26%)

14.02 hits per line

Coverage Regressions

Lines Coverage ∆ File
95
0.0
0.0% reach/reach/src/Admin/AlertsListTable.php
40
90.33
-5.09% reach/reach/src/Rest/AlertController.php
17
95.79
0.0% reach/reach/src/Admin/DevicesPage.php
12
82.76
-0.77% reach/reach/src/Plugin.php
6
94.74
2.77% reach/reach/src/Admin/SendMessagePage.php
6
96.93
0.04% reach/reach/src/Alerts/WpdbAlertRepository.php
3
96.23
0.23% reach/reach/src/Alerts/AlertRequest.php
2
88.89
0.43% reach/reach/src/Core/Schema.php
Jobs
ID Job ID Ran Files Coverage
1 33367259862.1 31 Aug 2026 07:14AM UTC 95
86.26
GitHub Action Run
Source Files on build 33367259862
  • Tree
  • List 95
  • Changed 12
  • Source Changed 0
  • Coverage Changed 12
Coverage ∆ File Lines Relevant Covered Missed Hits/Line
  • Back to Repo
  • Github Actions Build #33367259862
  • 11196529 on github
  • Prev Build on main (#33354183864)
  • Next Build on main (#33415488055)
  • Delete
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc