HiSports Tech Specs
API (api.hisports.app)
Node.js / Loopback 3
Postgres with Knex schema migrations.
Loopback provides majority of the ORM functionality, with some additional patches to add support for joins and custom querying needed for authorization filtering
Passport / oauth2orize
Authorization based on hierarchical RBAC
Administrative users assigned a role in an office
Team staff and game officials have dynamic roles based on account participant
RabbitMQ event queueing
Scoresheet events are queued to be processed through scoresheet library (see below) and stored in database
Scheduling changes synced to Assignr (one-way)
Email notifications sent on scoresheet completed event
Hosted on Elastic Beanstalk / EC2 / Aurora / SES
Lambda running scheduled trigger for HCR sync via API request
Scorekeeper app (hisports.app)
Scoresheet editor for all game functions - lineups, goals, penalties, etc
AngularJS 1.5
redux + redux-offline
When offline, events are queued and persisted to storage until online, but also actioned locally for local state. On initial load, state from server is used
ui-router 1
SASS / Ionic 1
Ionic mostly removed except for base styling
webpack / babel build
SPA hosted on Netlify
Admin app (admin.hisports.app)
Scheduling, account management, roster management, reporting, CMS editor, officiating assignments
react-admin / material-ui
final-form
Slate editor
webpack / babel (CRA)
SPA hosted on Netlify
Website (*.hisports.site)
Public facing websites for leagues to show schedule, stats, standings, player profiles and CMS. Each league has its own website deployed
Bootstrap
react-router
webpack / babel build
SPAs hosted on Netlify (individual site per league with build-level config)
Game Report (pdf.hisports.app, reports.hisports.app)
Official game report showing printable game summary
React
SASS
webpack / babel build
SPA hosted on Netlify
Puppeteer Lambda to generate PDFs of Netlify site
Users access SPA indirectly through lambda
Reporting (metabase.hisports.app)
Scoring, penalty and AP reports for a league/team/player
Metabase
Embedded iframes in admin; users do not have direct access
Libraries
Scoresheet
redux event handling
yup event validation
Shared across all apps
Stats
Stats are generated based on a scoresheet provided and map-reduced into relevant stats, using selectors/utilities from scoresheet library
Scheduler
General patterns extracted from a template to generate a set of matchups for any number of teams/weeks
Operations
Cloudflare DNS
Buddy CI (buddy.works)
Sentry error reporting
Github repository