CHANGELOG.md

# Changelog

All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [Unreleased]

### Added
- Quick Integration Checklist in usage-rules.md for rapid setup guidance

### Changed
- **BREAKING DOCUMENTATION**: Removed global hook pattern from getting-started guide
- Updated all integration examples to use router-level `live_session` only
- Removed general Phoenix/LiveView teaching from documentation (focused on consent integration)
- Comprehensive extending guide improvements with real-world database sync patterns

### Fixed
- Documentation now clearly warns against global hook anti-pattern
- Added guidance for when to skip LiveView hook on admin/authenticated routes
- Added session interference prevention with `skip_session_cache` option
- Extending guide now includes user ID extraction, "newer wins" logic, and proper user relationships

## [0.1.0] - 2025-11-04

Initial release of AshCookieConsent - GDPR-compliant cookie consent management for Ash Framework applications.

### Added

#### Core Features
- **ConsentSettings Ash Resource** with GDPR-compliant attributes:
  - `terms` - Policy version identifier
  - `groups` - Array of consented cookie categories
  - `consented_at` - Consent timestamp
  - `expires_at` - Consent expiration (365 days default)
- **Custom Ash Actions**:
  - `grant_consent` - Record user consent with automatic timestamps
  - `revoke_consent` - Revoke all consent
  - `active_consents` - Query non-expired consents
- **Validations**: Terms and groups validation with clear error messages

#### Phoenix Components
- **ConsentModal** component with:
  - AlpineJS-powered interactive modal
  - Tailwind CSS styling (customizable)
  - Granular cookie group selection
  - Accept All / Reject All shortcuts
  - Keyboard navigation (Escape to close)
  - Click-outside dismissal
  - Accessibility support (ARIA labels, focus management)
- **ConsentScript** component for conditional script loading:
  - Only load scripts when user has consented to category
  - Support for async/defer attributes
  - Custom attributes pass-through
  - Examples for Google Analytics, Tag Manager, Facebook Pixel

#### Integration Layer
- **AshCookieConsent.Plug** for traditional Phoenix apps:
  - Loads consent from three-tier storage
  - Sets assigns (`:consent`, `:show_consent_modal`, `:cookie_groups`)
  - Configurable cookie and session keys
  - Optional database sync for authenticated users
- **AshCookieConsent.LiveView.Hook** for LiveView apps:
  - `on_mount` callback with `:load_consent` and `:require_consent` phases
  - Socket assign management
  - Event handlers for consent updates
  - Helper functions (`show_modal/1`, `hide_modal/1`)
- **Three-Tier Storage System** (`AshCookieConsent.Storage`):
  - **Read Priority**: assigns → session → cookie → database
  - **Write Strategy**: All tiers updated simultaneously
  - Automatic sync on login for authenticated users
  - Conflict resolution (newest consent wins)
- **Cookie Management** (`AshCookieConsent.Cookie`):
  - Signed cookies using Phoenix.Token
  - JSON encoding with automatic timestamp handling
  - Configurable cookie options (max_age, domain, path, etc.)
  - HttpOnly, Secure, SameSite defaults

#### Helper Functions
- `consent_given?/2` - Check if user consented to cookie group
- `get_consent/1` - Retrieve current consent data
- `has_consent?/1` - Check if any consent exists
- Cookie group configuration via Application config

#### Documentation
- **README.md** with:
  - Badges (Hex.pm, documentation, license)
  - "Why AshCookieConsent?" comparison section
  - Quick 4-line integration example
  - Feature comparison table vs alternatives
- **6 Comprehensive Guides** (1,820+ lines total):
  - `getting-started.md` - Installation and basic setup
  - `migration-guide.md` - Migration from other libraries and adding to existing apps
  - `examples.md` - Real-world integration patterns
  - `troubleshooting.md` - Common issues and solutions
  - `extending.md` - Custom storage, UI customization
  - `usage-rules.md` - AI assistant integration guidance
- **Code Documentation**: All modules and public functions documented with examples
- **Moduledoc and @doc** coverage for all public APIs

#### Testing
- **163 Comprehensive Tests** including:
  - Unit tests for Ash resource (ConsentSettings)
  - Component rendering tests
  - Cookie encoding/decoding tests
  - Plug integration tests
  - LiveView Hook tests
  - Three-tier storage tests
  - Helper function tests
  - Edge case coverage (expiration, malformed data, etc.)
- All tests passing with 0 failures

#### Code Quality
- **Credo**: Passing strict mode (intentional TODOs documented)
- **Dialyzer**: Zero type warnings (0 errors)
- **Formatted**: Using `mix format`
- **Zero compile warnings**
- Documented extension points for database sync

### Design Decisions

#### Database Sync - Intentionally Optional
The library provides **extension points** for database synchronization but doesn't enforce a specific user relationship pattern. This allows:
- Cookie/session storage works for all users (authenticated or not)
- Apps can add user relationships as needed
- Flexibility in user model architecture
- Simple integration without database requirements

**Extension Points**:
- `lib/ash_cookie_consent/storage.ex`: Stubbed `load_user_consent/2` and `save_user_consent/3`
- `lib/ash_cookie_consent/plug.ex`: Stubbed database sync functions
- `lib/ash_cookie_consent/live_view/hook.ex`: Stubbed `save_consent_to_db/3`

See `guides/migration-guide.md` section "Adding User Relationships" for complete implementation guide.

#### Three-Tier Storage Benefits
- **Assigns**: Fastest access, request-scoped
- **Session**: Server-side cache, no database roundtrip
- **Cookie**: Client-side persistence, works offline
- **Database**: Audit trail, cross-device sync (when implemented)

### Dependencies

#### Required
- `ash ~> 3.0` - Core Ash Framework
- `phoenix ~> 1.7` - Phoenix Framework
- `phoenix_live_view ~> 1.0` - LiveView support
- `jason ~> 1.4` - JSON encoding

#### Optional
- `ash_postgres ~> 2.0` - PostgreSQL data layer (or use `ash_sqlite`)

#### Development
- `ex_doc ~> 0.34` - Documentation generation
- `credo ~> 1.7` - Static analysis
- `dialyxir ~> 1.4` - Type checking

### Configuration

Default cookie groups:
```elixir
config :ash_cookie_consent, :cookie_groups, [
  %{
    key: "essential",
    label: "Essential Cookies",
    description: "Required for the website to function",
    required: true
  },
  %{
    key: "analytics",
    label: "Analytics Cookies",
    description: "Help us understand how visitors use our website",
    required: false
  },
  %{
    key: "marketing",
    label: "Marketing Cookies",
    description: "Used to deliver personalized advertisements",
    required: false
  }
]
```

### Migration Path

For existing applications:
1. Add dependency to `mix.exs`
2. Create `ConsentSettings` resource with data layer
3. Add Plug to router (after `:fetch_session`)
4. Add LiveView Hook (optional, for LiveView apps)
5. Add modal component to layout
6. Configure cookie groups

See `guides/migration-guide.md` for detailed instructions.

### Breaking Changes

None (initial release)

### Known Limitations

- **Database sync requires user relationship**: Apps must implement user relationship and database queries (documented extension points provided)
- **AlpineJS required**: Modal interactivity requires AlpineJS v3.x
- **Tailwind recommended**: Components styled with Tailwind (customizable via Alpine x-bind)
- **Phoenix 1.7+**: Requires Phoenix 1.7 for Phoenix.Component

### Roadmap

See GitHub Issues for planned enhancements:
- Built-in database sync helpers (v0.2.0)
- Multi-language support
- Consent banner variants (banner, modal, corner popup)
- Export/import consent data
- Enhanced analytics integration

### Credits

Built with [Ash Framework](https://ash-hq.org/) by Zach Daniel and the Ash core team.

Inspired by [phx_cookie_consent](https://github.com/pzingg/phx_cookie_consent) (Ecto-based) but rewritten for Ash Framework.

### License

MIT License - See LICENSE file for details

---

[Unreleased]: https://github.com/shotleybuilder/ash_cookie_consent/compare/v0.1.0...HEAD
[0.1.0]: https://github.com/shotleybuilder/ash_cookie_consent/releases/tag/v0.1.0