getsno/relesys-users
Laravel client for the Relesys User Management API that gives you simple access to users, departments, user groups, custom fields and communication endpoints, with sorting, filtering and pagination support.
Architecture fit
users, departments, userGroups, customFields, communication), and method names track endpoint names. This is the single most valuable property for planning: scope, estimates, and acceptance criteria can be written against the vendor's API docs rather than against an invented abstraction.UserPatch), enums (UserStatus), and a query builder (ApiQueryParams with addFilter, sortBy, limit, page). This eliminates the most common and cheapest-to-avoid integration defect class — misspelled fields, wrong enum values, bad date/phone types — and makes PR review tractable without a PHP specialist in the room.relesys.api.users scope and the v1.1 contract. Any roadmap item implying "we get compliance/RBAC for free from Relesys" must be validated against the vendor contract before commitment.Integration feasibility
composer require, two environment variables (RELESYS_CLIENT_ID, RELESYS_CLIENT_SECRET), and a scope grant on the Relesys side. The code work is measured in hours. The non-code work — obtaining credentials, securing the scope, and agreeing data-processing/residency terms — is the real critical path and should appear on the plan as a dependency with lead time, not as a task.getUsers(queryParams: $q, page: 2)), i.e. offset semantics with no cursor or stable-snapshot guarantee. Practical consequence: any bulk sync must tolerate drift and duplicates by design. Specify this as an explicit non-functional requirement rather than hoping it away.phpunit.xml, and a Docker setup. That gives us a working contract-test harness we can extend into an upstream-drift detector — a real differentiator versus hand-rolled Http:: calls.Technical risk
| Risk | Severity | Notes / mitigation |
|---|---|---|
| Bus factor & supply chain | High | 0 stars, 0 dependents, single maintainer, no community. Functionally a private-vendor SDK. Mitigation is cheap and should be mandatory: fork under our org (or vendor the source) and pin an exact version. The codebase is small (HTTP client + DTOs/enums/patches), so a fork is days, not weeks. |
| Version-matrix churn | Medium | Majors track Laravel majors (v2 → Laravel 11, v4 → Laravel 13 + PHP 8.3). Every framework upgrade forces a coordinated package and PHP-floor bump. Plannable, but it must sit in upgrade planning rather than be discovered mid-upgrade. |
| Breaking-change hygiene | Medium | Semver majors have carried real breakage (readonly properties, removal of the CustomFields value object, enum-case renames to camelCase across v1.0.4/1.0.5). Assume minors can break. Pin exactly; do not float ^. |
| Documentation inconsistency | Medium (signal, not blocker) | README install step says composer require getsno/relesys-api while package/repo is getsno/relesys-users; README states PHP 8.1 / Laravel 10 against a v4.0.0 release requiring PHP 8.3 / Laravel 13. These are the first two instructions any adopter follows. Budget half an engineer-day to establish ground truth; treat the README as unreliable in onboarding. |
| Release metadata anomaly | Low, unverified | Latest release is dated 2026-10-22 — future-dated. Before pinning, verify the tag, Packagist version, and commit contents actually match the changelog. |
| Vendor coupling | Inherent | Rate limits, quotas, residency, deprecation policy, and pricing are entirely unmitigated here. The package removes build risk, not vendor risk. |
| API quirks leaking through | Low–Medium | The v1.0.7 fix around customFields ("API doesn't support an empty array on input") shows the vendor contract has edge cases the SDK papers over imperfectly. Reserve a small capacity tail; expect one or two per quarter of active development. |
Key questions
relesys.api.users scope grant, what is the approval path, and what is the lead time?Stack fit
Relesys:: facade calls spread across the domain — confine them behind an internal adapter interface so the SDK is swappable and testable.Migration path
Http:: calls: migrate read paths first (they are low-risk and immediately reduce code), keep write paths on the existing path until contract tests demonstrate parity, then cut over. Budget a modest refactor rather than a rewrite — the DTO layer is the expensive part and it already exists.Compatibility
composer.json; record the resolved Laravel/PHP matrix in the service README; verify tag ↔ Packagist ↔ changelog consistency once.Sequencing
getUsers/getDepartment with pagination against a non-production tenant (days).Maintenance
Support
Scaling
while loop over pages.Failure modes
| Failure | Symptom | Mitigation |
|---|---|---|
| Token expiry / rotation | 401s mid-batch | Central token cache with refresh-and-retry-once |
| Rate limiting | 429s, partial batches | Backoff, jitter, job throttling, measured limits |
| Timeouts / 5xx | Incomplete writes, unknown outcome | Idempotency keys, safe retry, reconciliation sweep |
| Partial batch failure | Silent divergence from Relesys | Per-record status tracking + drift report |
| Offset pagination drift | Duplicates and skipped records | Dedupe by UUID, checkpointing, tolerate re-reads |
Empty customFields quirk |
Rejected payloads | Guard in DTO/serializer; cover with a test |
| No event surface | Stale local data between polls | Defined polling SLA; document staleness to stakeholders |
| Upstream contract change | Runtime deserialization errors | Scheduled contract tests as early warning |
Ramp-up
How can I help you explore Laravel packages today?