mirror of
https://github.com/Freika/dawarich.git
synced 2026-01-09 08:47:11 -05:00
9.2 KiB
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
- Navigate to the Families section
- Click "Create Family"
- Enter a family name
- You become the family owner automatically
Inviting Members
- Go to your family page
- Click "Invite Member"
- Enter the email address
- The invitation is sent automatically
- Member receives email with acceptance link
Accepting Invitations
- Member receives invitation email
- Clicks the invitation link
- Must be logged in to Dawarich
- Accepts or declines the invitation
- 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:
- Check existing issues for family-related bugs
- Follow the existing code patterns and conventions
- Include comprehensive tests for new features
- Update documentation for any API changes
- Follow the contribution guidelines in CONTRIBUTING.md