Files
forefront-wireless-portal/README.md
T

115 lines
5.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Forefront Wireless Customer Portal
> **Status:** Scoped & Documented — awaiting build
> **Started:** July 25, 2026
> **Domain:** my.forefrontwireless.com
> **Companion project:** IntelSight (shared auth — same Super Search/deepseek infra)
Self-service customer portal for Forefront Wireless, a WISP operating in Texas. Replaces or augments the existing Splynx customer portal with a modern, branded experience that directly consumes the Splynx API.
---
## Architecture
```
┌─────────────────┐ ┌──────────────────┐ ┌────────────────────────┐
│ my.forefront │────▶│ FastAPI backend │────▶│ Splynx API v2.0 │
│ wireless.com │ │ (api subdomain) │ │ portal.forefront... │
│ (React SPA) │ │ Flask or FastAPI │ │ /api/2.0/ │
└─────────────────┘ └──────────────────┘ └────────────────────────┘
┌─────────▼──────────┐
│ Splynx self-hosted │
│ v4.2 │
│ Forefront Wireless │
└────────────────────┘
```
**Stack:** React SPA → FastAPI → Splynx API v2.0
**Auth:** Signature-based HMAC-SHA256 (nonce + key, secret-driven)
**API Key:** `5a8dc490716424f435306f2c18b4fdcb` (full permissions)
**Hosting:** CloudPanel on app3 (same as other ITPP portals)
---
## Splynx API — Proven Endpoints
### Authentication
```
POST /api/2.0/admin/auth/tokens
Body: {"auth_type":"api_key","key":"...","nonce":<timestamp>,"signature":"..."}
→ Returns access_token (30-min expiry) + refresh_token
OR: Direct signature header (preferred for server-to-server)
Authorization: Splynx-EA (key=K&nonce=N&signature=S)
Nonce: round(microtime * 100) — hundredths of a second
Signature: strtoupper(hash_hmac('sha256', nonce . key, secret))
```
### Working Endpoints
| Method | Path | Description | Status |
|--------|------|-------------|:---:|
| GET | `/admin/customers/customer` | List all customers (43 total, 33 active) | ✓ |
| GET | `/admin/customers/customer/{id}` | Single customer detail | ✓ |
| GET | `/admin/customers/customer-internet-services/{customer_id}` | Services for customer | ✓ |
| POST | `/admin/customers/customer-internet-services` | List with filters (needs `customer_id` in body) | ⚠ 405 on GET |
| GET | `/admin/networking/routers` | All routers (5 CCR2004s) | ✓ |
| GET | `/admin/tariffs/internet` | Internet plans (9 plans, $59.95$299.95) | ✓ |
| GET | `/admin/finance/invoices` | Invoice list | ✓ |
| GET | `/admin/finance/payments` | Payment records | ⚠ untested |
| GET | `/admin/finance/transactions` | Transaction history | ⚠ untested |
| GET | `/admin/support/tickets` | Support tickets | ⚠ untested |
### Inventory Snapshot (July 2026)
| Resource | Count |
|----------|:---:|
| Total customers | 43 |
| Active subscribers | 33 |
| Disabled accounts | 9 |
| Routers | 5 × MikroTik CCR2004 |
| Internet tariffs | 9 plans |
---
## Portal Feature Ladder
### V1 — Core Self-Service
- [ ] Customer login (email + password, or magic link)
- [ ] Dashboard: active services, current bill, data usage
- [ ] View & pay invoices (Stripe integration)
- [ ] Update contact info, phone, email
- [ ] Change WiFi password (via MikroTik API → router)
### V2 — Enhanced
- [ ] Service upgrade/downgrade with proration
- [ ] Support ticket submission & tracking
- [ ] Outage notifications (SMS opt-in)
- [ ] Referral program
### V3 — Operational
- [ ] Usage graphs (daily/weekly/monthly bandwidth)
- [ ] Auto-pay setup
- [ ] Seasonal hold / vacation pause
- [ ] Equipment return workflow
- [ ] Speed test integration
---
## Splynx Quirks (Lessons Learned)
1. **Signature auth is required** — Basic auth returns 401 unless "Unsecure access" is enabled on the key. Signature uses HMAC-SHA256 with a microtime nonce.
2. **Services need customer_id in URL**`GET /admin/customers/customer-internet-services/{id}` works, but `GET /admin/customers/customer-internet-services?customer_id=2` returns 405.
3. **Tariff names may need separate resolution** — The list endpoint may return tariff IDs only; names require a follow-up call to `/admin/tariffs/internet/{id}`.
4. **Data shown is filtered** — Only what the API key has permission for. Current key has full permissions.
---
## Related
- **Splynx v2 docs:** https://api-doc.splynx.com/
- **Splynx v4.2 wiki:** https://wiki.splynx.com/4_2/
- **Admin panel:** https://portal.forefrontwireless.com/admin/
- **Git:** https://git.itpropartner.com/ippadmin/forefront-wireless-portal