Skip to main content

Overview

The FamiliesHandler protocol provides a standardized API for managing families, relationships, and family-related queries in a congregation management system. It supports CRUD operations, relationship management, family discovery, and family tree building.

Protocol Definition

public protocol FamiliesHandler: Sendable

Family CRUD Operations

fetchAll

Fetches all families with pagination.
func fetchAll(pageNumber: Int, pageSize: Int) async throws -> FamilyResponse

Parameters

  • pageNumber: The page number to fetch (1-indexed)
  • pageSize: Number of families per page

Returns

A FamilyResponse containing families and metadata.

Example

let congregation = CongregationKit(auth: auth)
let response = try await congregation.families.fetchAll(
    pageNumber: 1,
    pageSize: 20
)

print("Fetched \(response.families.count) families")
if let metadata = response.metadata {
    print("Total families: \(metadata.total)")
    print("Has next page: \(metadata.hasNextPage)")
}

fetch

Fetches a single family by ID.
func fetch(id: FamilyID) async throws -> Family

Parameters

  • id: The family’s unique identifier

Returns

The Family if found.

fetchMembers

Fetches all members belonging to a family.
func fetchMembers(familyId: FamilyID) async throws -> [Member]

Parameters

  • familyId: The family’s unique identifier

Returns

Array of Member objects in the family.

Example

let members = try await congregation.families.fetchMembers(
    familyId: FamilyID(rawValue: "FAM001")!
)

for member in members {
    print("- \(member.memberName ?? "Unknown")")
}

fetchFamilyInfo

Fetches detailed family information including members and relationships.
func fetchFamilyInfo(familyId: FamilyID) async throws -> FamilyInfo

Parameters

  • familyId: The family’s unique identifier

Returns

FamilyInfo with rich family information and statistics.

Example

let familyInfo = try await congregation.families.fetchFamilyInfo(
    familyId: familyId
)

print("Family size: \(familyInfo.familySize)")
print("Adults: \(familyInfo.adultCount)")
print("Children: \(familyInfo.childCount)")
print("Has minors: \(familyInfo.hasMinors)")

if familyInfo.isSingleParentFamily {
    print("Single-parent family")
}

if familyInfo.isMultiGenerational {
    print("Multi-generational family")
}

createFamily

Creates a new family.
func createFamily(_ family: Family) async throws -> Family

Parameters

  • family: The family to create

Returns

The created family with server-assigned ID.

updateFamily

Updates an existing family.
func updateFamily(_ family: Family) async throws -> Family

Parameters

  • family: The family with updated information

Returns

The updated family.

deleteFamily

Deletes a family.
func deleteFamily(id: FamilyID) async throws

Parameters

  • id: The family’s unique identifier

Family Membership Operations

addMemberToFamily

Adds a member to a family with a specific role.
func addMemberToFamily(
    memberId: MemberID,
    familyId: FamilyID,
    role: FamilyRole
) async throws -> FamilyMembership

Parameters

  • memberId: The member’s ID
  • familyId: The family’s ID
  • role: The member’s role in the family

Returns

The created FamilyMembership record.

Example

let membership = try await congregation.families.addMemberToFamily(
    memberId: MemberID(rawValue: "TKT5678")!,
    familyId: FamilyID(rawValue: "FAM001")!,
    role: .child
)

print("Added member with role: \(membership.role.displayName)")

removeMemberFromFamily

Removes a member from a family.
func removeMemberFromFamily(
    memberId: MemberID,
    familyId: FamilyID
) async throws

updateMemberRole

Updates a member’s role in a family.
func updateMemberRole(
    memberId: MemberID,
    familyId: FamilyID,
    newRole: FamilyRole
) async throws -> FamilyMembership

Relationship Operations

fetchRelationships

Fetches all relationships for a member.
func fetchRelationships(memberId: MemberID) async throws -> [MemberRelationship]

Parameters

  • memberId: The member’s ID

Returns

Array of MemberRelationship objects involving this member.

Example

let relationships = try await congregation.families.fetchRelationships(
    memberId: MemberID(rawValue: "TKT1234")!
)

for rel in relationships {
    let targetId = rel.targetMemberId
    let type = rel.relationshipType.displayName
    print("Relationship: \(type) to \(targetId)")
}

createRelationship

Creates a new relationship between members.
func createRelationship(
    _ relationship: MemberRelationship
) async throws -> MemberRelationship

Parameters

  • relationship: The relationship to create

Returns

The created relationship.

createBidirectionalRelationship

Creates bidirectional relationships (primary and inverse).
func createBidirectionalRelationship(
    _ relationship: MemberRelationship
) async throws -> (primary: MemberRelationship, inverse: MemberRelationship)

Parameters

  • relationship: The primary relationship

Returns

Tuple of primary and inverse relationships.

Example

let parentChild = MemberRelationship(
    id: RelationshipID(rawValue: "REL001")!,
    sourceMemberId: MemberID(rawValue: "TKT1234")!,
    targetMemberId: MemberID(rawValue: "TKT5678")!,
    relationshipType: .parent,
    isPrimary: true
)

let (primary, inverse) = try await congregation.families.createBidirectionalRelationship(
    parentChild
)

print("Primary: \(primary.relationshipType.displayName)") // "Parent"
print("Inverse: \(inverse.relationshipType.displayName)") // "Child"

deleteRelationship

Deletes a relationship.
func deleteRelationship(id: RelationshipID) async throws

updateRelationship

Updates an existing relationship.
func updateRelationship(
    _ relationship: MemberRelationship
) async throws -> MemberRelationship

Relationship Discovery

suggestRelationships

Suggests potential relationships for a member based on heuristics.
func suggestRelationships(
    for member: Member
) async throws -> [SuggestedRelationship]

Parameters

  • member: The member to analyze

Returns

Array of SuggestedRelationship objects with confidence scores.

Example

let member = try await congregation.members.fetch(id: memberId)
let suggestions = try await congregation.families.suggestRelationships(
    for: member
)

for suggestion in suggestions where suggestion.isHighConfidence {
    print("Suggested: \(suggestion.suggestedType.displayName)")
    print("Confidence: \(suggestion.confidence)")
    print("Reason: \(suggestion.reason.description)")
}

suggestRelationships (with options)

Suggests potential relationships with custom options.
func suggestRelationships(
    for member: Member,
    options: RelationshipSuggestionOptions
) async throws -> [SuggestedRelationship]

Parameters

  • member: The member to analyze
  • options: Configuration options for suggestions

Example

let options = RelationshipSuggestionOptions(
    minimumConfidence: 0.8,
    includeAddressMatching: true,
    includeNameMatching: true,
    includeAgeAnalysis: true,
    maxSuggestions: 5
)

let suggestions = try await congregation.families.suggestRelationships(
    for: member,
    options: options
)

Family Tree Operations

buildFamilyTree (from member)

Builds a family tree starting from a specific member.
func buildFamilyTree(
    startingFrom memberId: MemberID
) async throws -> FamilyTree

Parameters

  • memberId: The root member’s ID

Returns

A FamilyTree structure.

Example

let tree = try await congregation.families.buildFamilyTree(
    startingFrom: MemberID(rawValue: "TKT1234")!
)

print("Generations: \(tree.generationCount)")
print("Total members: \(tree.memberCount)")
print("Total relationships: \(tree.relationshipCount)")

// Get members by generation
let rootGeneration = tree.nodes(inGeneration: 0)
let children = tree.nodes(inGeneration: 1)

buildFamilyTree (for family)

Builds a family tree for an entire family.
func buildFamilyTree(
    forFamily familyId: FamilyID
) async throws -> FamilyTree

Parameters

  • familyId: The family’s ID

Returns

A FamilyTree structure.

Supporting Types

RelationshipSuggestionOptions

Options for relationship suggestion algorithms.
public struct RelationshipSuggestionOptions: Codable, Equatable, Sendable
minimumConfidence
Double
Minimum confidence threshold (0.0 to 1.0).
includeAddressMatching
Bool
Whether to include address-based suggestions.
includeNameMatching
Bool
Whether to include name-based suggestions.
includeAgeAnalysis
Bool
Whether to include age-based suggestions.
maxSuggestions
Int
Maximum number of suggestions to return.

Default Options

let defaultOptions = RelationshipSuggestionOptions.default
// minimumConfidence: 0.5
// includeAddressMatching: true
// includeNameMatching: true
// includeAgeAnalysis: true
// maxSuggestions: 10

FamilyInfo

Comprehensive family information with computed statistics.
public struct FamilyInfo: Codable, Sendable
family
Family
required
The family unit.
members
[Member]
required
All members belonging to this family.
memberships
[FamilyMembership]
required
Family membership records for each member.
relationships
[MemberRelationship]
required
Relationships between family members.

Computed Properties

  • familySize: Int - Total number of members
  • adultCount: Int - Number of adults (18+)
  • childCount: Int - Number of children (under 18)
  • hasMinors: Bool - Whether family has minors
  • headOfHousehold: Member? - The head of the family
  • spouseOfHead: Member? - Spouse of the head
  • children: [Member] - All children in the family
  • adults: [Member] - All adults in the family
  • averageAge: Double? - Average age of family members
  • ageRange: ClosedRange<Int>? - Age range (youngest to oldest)
  • relationshipTypes: Set<RelationshipType> - Unique relationship types
  • membersByRole: [FamilyRole: [Member]] - Members grouped by role
  • activeRelationshipCount: Int - Number of active relationships
  • isSingleParentFamily: Bool - Whether single-parent family
  • isMultiGenerational: Bool - Whether multi-generational

See Also

Build docs developers (and LLMs) love