Apps
Academy District 20 provides three standalone web apps for experiences that are shared across district and school websites: Calendar, Directory and School Directory. Each app has its own public address and code repository, but all three use CommCenter-managed data and shared website services.
| App | Public address | Primary purpose |
|---|---|---|
| Calendar | calendar.asd20.org | District and school event calendars, annual calendars and calendar sync status. |
| Directory | directory.asd20.org | Teams, staff search, profiles, organization contact information and public contact forms. |
| School Directory | schools.asd20.org | School and program discovery, school details, attendance boundaries and interactive maps. |
These are public Vue applications hosted separately from CommCenter and the main website. They use shared components from @asd20/ui-next so their layout, controls and notifications remain consistent with other ASD20 web properties.
Shared Data and Functions Pattern
The apps use two primary back-end paths:
- Hasura provides structured CommCenter data such as organizations, calendar subscriptions, teams, offerings, profiles and published program content.
- Azure Functions provide browser-safe access to Azure Search and other protected services. The apps know the Functions base URL through
FUNCTIONS_ENDPOINT; Azure Search keys and downstream delivery credentials remain server-side.
All three apps use the /api/search/messages Function to retrieve notifications for the current host. The Calendar and Directory apps also use additional Functions for their core search or submission workflows.
See Back-End Functions for the complete Functions inventory.
Calendar
The Calendar app presents events from district and school calendar subscriptions. Visitors can:
- select a district or school organization
- view events in monthly grid or list formats
- search event titles and filter by calendar or category
- view printable annual calendars and download annual-calendar PDFs when available
- review calendar synchronization status
- receive website notifications
CommCenter and Hasura provide the organization list, subscription definitions and sync-job history. The public app does not connect to Outlook, iCal sources or Azure Search directly.
Functions interactions
| Function | Interaction |
|---|---|
httpSearchEvents — /api/search/events | The app sends its selected calendars, date range, search terms and filters to this route. The Function queries the event index and returns the events displayed in monthly and annual views. |
httpSearchMessages — /api/search/messages | The app polls this route for notifications that match the calendar host and configured notification channels or destinations. |
httpCalendarSubscriptionSync — /calendar-subscriptions/sync | This upstream job reads each configured iCal or Microsoft Graph calendar and refreshes its events in the search index. The app does not call it during normal browsing, but its event results depend on successful syncs. |
httpCalendarSubscriptionHasuraTrigger — /calendar-subscriptions/hasura-trigger | When an administrator changes a subscription, this Function maintains the Hasura cron schedule that starts future syncs. |
httpListGraphCalendars — /calendar-subscriptions/graph-calendars | CommCenter uses this Function—not the public Calendar app—to help administrators select a Microsoft Graph calendar ID during subscription setup. |
The event flow is: an administrator configures a subscription in CommCenter, the sync Functions import its events into Azure Search, and the Calendar app retrieves those indexed events through httpSearchEvents.
See Calendars for subscription administration.
Directory
The Directory app provides organization, team and employee information. Visitors can:
- select the district or a school
- browse teams and departments
- open team detail pages and view team members
- search and filter public staff profiles
- view person details
- view organization contact and location information
- send a message to an employee without exposing downstream email-service credentials
- open a school's boundary map supplied by the School Directory app
- receive website notifications
The app reads organizations, teams and team membership directly from Hasura. People search uses an Azure Search index because it must support keyword search, organization filters and job-type facets across many profiles.
Functions interactions
| Function | Interaction |
|---|---|
httpSearchPeople — /api/search/people | The app sends staff keywords, organization and job-type filters to this route. The Function queries the people index and returns matching public profiles and facets. |
httpSearchMessages — /api/search/messages | The app polls this route for notifications that match the directory host and configured notification criteria. |
httpSendDirectoryEmail — /api/directory/email | The public contact form sends the recipient ID, sender information, subject, message and CAPTCHA token to this route. The Function validates the recipient, applies CAPTCHA, rate limits and moderation, records the outcome and relays accepted messages. |
httpUpdateEmployees — /update-employees | This scheduled upstream job refreshes the employee snapshot that contributes job, organization, office and contact information to directory profiles. |
httpIndexAllPeople — /index-all-people | This upstream job rebuilds the people search index from profiles, employee records, organizations and team relationships. |
httpUpdateSearchDocument — /update-search-document | Hasura change events use this Function to update supported search documents and relationship fields between full index rebuilds. |
The Directory app also embeds /embed/school/{abbreviation} from the School Directory app on organization location pages. That map is an app-to-app dependency rather than an Azure Functions call.
See Profiles, Teams / Departments and Analytics & Reporting for the related administrative data and email reporting.
School Directory
The School Directory app helps families explore schools, programs and attendance areas. Visitors can:
- browse and search schools
- filter schools by education level, offering, program or distance
- view school and program detail pages
- search by address or use the browser's current location
- identify schools serving a location
- view school boundaries, walking zones and neighboring districts on an interactive map
- use embeddable school maps displayed by the Directory app and other websites
- receive website notifications
The app loads organizations, offerings, boundary data and published program-description messages from Hasura. School and program filtering happens in the browser after that data loads. Address lookup uses OpenStreetMap Nominatim, while Leaflet and Turf provide map display and geographic matching.
Functions interactions
| Function | Interaction |
|---|---|
httpSearchMessages — /api/search/messages | The app polls this route for notifications that match the schools host and configured notification criteria. This is the School Directory app's only direct dependency on the CommCenter Azure Functions app. |
School search itself does not call /api/search/pages, /api/search/people or another Azure Search Function. It searches the Hasura-loaded school and program data locally. The app's /api/directions hosting proxy forwards walking-direction requests to the existing boundary service; it is not a route in asd20-commcenter/functions.
See Schools / Organizations and Organization Offerings for the CommCenter records that drive this app.
Dependency Summary
| App | Direct Functions dependencies | Important upstream Functions |
|---|---|---|
| Calendar | Event search and message/notification search | Calendar schedule maintenance and calendar synchronization |
| Directory | People search, message/notification search and directory email | Employee refresh and people/search-document indexing |
| School Directory | Message/notification search | None for its core school, program or map data; those paths use Hasura and app-owned logic |
Troubleshooting Boundaries
When an app displays incomplete or stale information, first identify which layer owns the missing behavior:
| Problem | Start with |
|---|---|
| Calendar subscription or sync status is wrong | CommCenter calendar configuration, Hasura subscription/job records and the calendar sync Functions. |
| Calendar filters work but events are missing | httpSearchEvents and the Azure Search event index. |
| A team or organization is missing from Directory | CommCenter/Hasura organization and group data. |
| A person is missing from Directory search | Employee/profile data, then the people indexing Functions and httpSearchPeople. |
| A directory message fails | Email Reporting and httpSendDirectoryEmail validation, moderation or delivery status. |
| A school, program, offering or boundary is wrong | CommCenter/Hasura data and the School Directory's client-side filtering or map logic. |
| Notifications are missing from any app | FUNCTIONS_ENDPOINT, notification configuration and httpSearchMessages. |
