dawarich/docs/FAMILY_README.md
2025-09-28 13:10:07 +02:00

9.2 KiB

Family Features

Dawarich includes comprehensive family management features that allow users to create family groups, invite members, and collaborate on location tracking.

Quick Start

For Self-Hosted Deployments

Family features are enabled by default for self-hosted installations:

# Family features are automatically available
# No additional configuration required

For Cloud Deployments

Family features require subscription validation:

# Contact support to enable family features
# Subscription-based access control

Features Overview

Family Management

  • Create and name family groups
  • Invite members via email
  • Role-based permissions (owner/member)
  • Member management and removal

Invitation System

  • Secure email-based invitations
  • Automatic expiration (7 days)
  • Token-based acceptance flow
  • Cancellation and resending options

Security & Privacy

  • Authorization via Pundit policies
  • Encrypted invitation tokens
  • Email validation and verification
  • Automatic cleanup of expired data

Performance & Scalability

  • Optimized database indexes
  • Background job processing
  • Intelligent caching strategies
  • Concurrent database operations

Getting Started

Creating a Family

  1. Navigate to the Families section
  2. Click "Create Family"
  3. Enter a family name
  4. You become the family owner automatically

Inviting Members

  1. Go to your family page
  2. Click "Invite Member"
  3. Enter the email address
  4. The invitation is sent automatically
  5. Member receives email with acceptance link

Accepting Invitations

  1. Member receives invitation email
  2. Clicks the invitation link
  3. Must be logged in to Dawarich
  4. Accepts or declines the invitation
  5. Automatically joins the family if accepted

API Documentation

REST Endpoints

# List families or redirect to user's family
GET /families

# Show family details (requires authorization)
GET /families/:id

# Create new family
POST /families
Content-Type: application/json
{
  "family": {
    "name": "Smith Family"
  }
}

# Update family name
PATCH /families/:id
Content-Type: application/json
{
  "family": {
    "name": "Updated Name"
  }
}

# Delete family (owner only, requires empty family)
DELETE /families/:id

# Leave family (members only)
DELETE /families/:id/leave

# Send invitation
POST /families/:family_id/invitations
Content-Type: application/json
{
  "invitation": {
    "email": "member@example.com"
  }
}

# Cancel invitation
DELETE /families/:family_id/invitations/:id

# Accept invitation (public endpoint)
POST /family_invitations/:token/accept

# Decline invitation (public endpoint)
POST /family_invitations/:token/decline

API Responses

All endpoints return JSON responses:

{
  "success": true,
  "data": {
    "family": {
      "id": 1,
      "name": "Smith Family",
      "member_count": 3,
      "creator": {
        "id": 1,
        "email": "owner@example.com"
      },
      "members": [...],
      "pending_invitations": [...]
    }
  },
  "errors": []
}

Configuration

Environment Variables

# Enable/disable family features
FAMILY_FEATURE_ENABLED=true

# For cloud deployments - require subscription
FAMILY_SUBSCRIPTION_REQUIRED=true

# Email configuration for invitations
SMTP_HOST=smtp.example.com
SMTP_USERNAME=noreply@example.com
SMTP_PASSWORD=secret_password

# Background jobs
REDIS_URL=redis://localhost:6379/0

Feature Gating

Family features can be controlled programmatically:

# Check if features are enabled
DawarichSettings.family_feature_enabled?
# => true/false

# Check if available for specific user (cloud)
DawarichSettings.family_feature_available_for?(user)
# => true/false based on subscription

Database Schema

Core Tables

-- Main family entity
CREATE TABLE families (
  id bigserial PRIMARY KEY,
  name varchar(255) NOT NULL,
  creator_id bigint NOT NULL REFERENCES users(id),
  created_at timestamp NOT NULL,
  updated_at timestamp NOT NULL
);

-- User-family relationships with roles
CREATE TABLE family_memberships (
  id bigserial PRIMARY KEY,
  family_id bigint NOT NULL REFERENCES families(id),
  user_id bigint NOT NULL REFERENCES users(id),
  role integer NOT NULL DEFAULT 0, -- 0: member, 1: owner
  created_at timestamp NOT NULL,
  updated_at timestamp NOT NULL,
  UNIQUE(family_id, user_id)
);

-- Invitation management
CREATE TABLE family_invitations (
  id bigserial PRIMARY KEY,
  family_id bigint NOT NULL REFERENCES families(id),
  email varchar(255) NOT NULL,
  invited_by_id bigint NOT NULL REFERENCES users(id),
  token varchar(255) NOT NULL UNIQUE,
  status integer NOT NULL DEFAULT 0, -- 0: pending, 1: accepted, 2: declined, 3: expired, 4: cancelled
  expires_at timestamp NOT NULL,
  created_at timestamp NOT NULL,
  updated_at timestamp NOT NULL
);

Performance Indexes

-- Optimized for common queries
CREATE INDEX CONCURRENTLY idx_family_invitations_family_status_expires
  ON family_invitations (family_id, status, expires_at);

CREATE INDEX CONCURRENTLY idx_family_memberships_family_role
  ON family_memberships (family_id, role);

CREATE INDEX CONCURRENTLY idx_family_invitations_email
  ON family_invitations (email);

CREATE INDEX CONCURRENTLY idx_family_invitations_status_expires
  ON family_invitations (status, expires_at);

Testing

Running Tests

# Run all family-related tests
bundle exec rspec spec/models/family_spec.rb
bundle exec rspec spec/services/families/
bundle exec rspec spec/controllers/families_controller_spec.rb
bundle exec rspec spec/requests/families_spec.rb

# Run specific test categories
bundle exec rspec --tag family
bundle exec rspec --tag invitation

Test Coverage

The family features include comprehensive test coverage:

  • Unit Tests: Models, services, helpers
  • Integration Tests: Controllers, API endpoints
  • System Tests: End-to-end user workflows
  • Job Tests: Background email processing

Deployment

Production Deployment

# 1. Run database migrations
RAILS_ENV=production bundle exec rails db:migrate

# 2. Precompile assets (includes family JS/CSS)
RAILS_ENV=production bundle exec rails assets:precompile

# 3. Start background job workers
bundle exec sidekiq -e production -d

# 4. Verify deployment
curl -H "Authorization: Bearer $API_TOKEN" \
     https://your-app.com/families

Zero-Downtime Deployment

The family feature supports zero-downtime deployment:

  • Database indexes created with CONCURRENTLY
  • Backward-compatible migrations
  • Feature flags for gradual rollout
  • Background job graceful shutdown

Monitoring

Key metrics to monitor:

# Family creation rate
family_creation_rate: rate(families_created_total[5m])

# Invitation success rate
invitation_success_rate:
  rate(invitations_accepted_total[5m]) /
  rate(invitations_sent_total[5m])

# Email delivery rate
email_delivery_success_rate:
  rate(family_emails_delivered_total[5m]) /
  rate(family_emails_sent_total[5m])

# API response times
family_api_p95_response_time:
  histogram_quantile(0.95, family_api_duration_seconds)

Security

Authorization Model

Family features use Pundit policies for authorization:

# Family access control
class FamilyPolicy < ApplicationPolicy
  def show?
    user_is_member?
  end

  def update?
    user_is_owner?
  end

  def destroy?
    user_is_owner? && family.members.count <= 1
  end
end

Data Protection

  • All invitation tokens are cryptographically secure
  • Email addresses are validated before storage
  • Automatic cleanup of expired invitations
  • User data protected through proper authorization

Security Best Practices

  • Never log invitation tokens
  • Validate all email addresses
  • Use HTTPS for all invitation links
  • Implement rate limiting on invitation sending
  • Monitor for suspicious activity patterns

Troubleshooting

Common Issues

1. Email Delivery Failures

# Check SMTP configuration
RAILS_ENV=production bundle exec rails console
> ActionMailer::Base.smtp_settings

# Monitor Sidekiq queue
bundle exec sidekiq -e production
> Sidekiq::Queue.new('mailer').size

2. Authorization Errors

# Verify user permissions
RAILS_ENV=production bundle exec rails console
> user = User.find(1)
> family = Family.find(1)
> FamilyPolicy.new(user, family).show?

3. Performance Issues

-- Check index usage
SELECT schemaname, tablename, indexname, idx_scan
FROM pg_stat_user_indexes
WHERE tablename LIKE 'family%'
ORDER BY idx_scan DESC;

-- Monitor slow queries
SELECT query, mean_time, calls
FROM pg_stat_statements
WHERE query LIKE '%family%'
ORDER BY mean_time DESC;

Support

Documentation

Community

Contributing

Contributions to family features are welcome:

  1. Check existing issues for family-related bugs
  2. Follow the existing code patterns and conventions
  3. Include comprehensive tests for new features
  4. Update documentation for any API changes
  5. Follow the contribution guidelines in CONTRIBUTING.md