Coordinating volunteers is one of the hardest jobs in any organization — teams, crews, courses, leaders, and shifting availability, all at once.
The pain it solves: Spreadsheets and sticky notes don't scale. Leaders lose track of who's active, who's expired, and who's actually on which team.
How it helps:
The happy workday: Coordinators spend less time asking "who's on this team again?" and more time actually leading people.
Volunteer-driven organizations (churches, non-profits, event producers) succeed or struggle based on how well they can see and manage their people. A dedicated, non-commercial people-planning model avoids forcing volunteer coordination through a system designed for paid memberships or customer records.
The People module is implemented in ExireNexus.Services/Services/UserGroupService.cs (IUserGroupService) against the UserGroup and UserGroupMember models in ExireNexus.Shared/Models.
Key implementation points:
UserGroup supports a UserGroupType enum (Team, Crew, Volunteer, Organization, and commercial membership types), letting the same underlying table and service serve both people-coordination and paid-membership use cases without duplicating models.GetPeopleGroupsAsync(UserGroupType? groupType = null) retrieves non-deleted groups, optionally filtered by type — the dedicated entry point for the People module, kept separate from commerce-oriented membership queries even though they share the same service and table.UserGroupMember) carry ActiveFrom / Expires dates, and GetGroupMembersOrderedAsync returns members ordered leaders-first, then by display order (ItemOrder), then name — giving Backstage UI a ready-made, sensible roster order without client-side sorting logic.GetMembershipsForUserAsync and GetUserGroupsByUserIdAsync support the reverse lookup — "what groups is this person in" — including optional inclusion of expired memberships for historical reporting.GetOrganizationUnitsAsync returns all organization-type groups (with leaders and members eagerly loaded) so the Backstage organization builder can assemble a full hierarchy client-side without N+1 queries.Category (self-referencing through ParentCategoryId), the platform's shared organizational entity, rather than introducing a separate hierarchy concept just for people.Consistent with the platform's architecture principle, volunteer/people planning was added as new capability on the existing UserGroupService rather than a parallel service — keeping a single authoritative source for all group and membership data.