-
Notifications
You must be signed in to change notification settings - Fork 1
Description
Description
Design and implement a comprehensive policy data domain model and persistence layer for the Laravel-based Policy Service. This includes database schema design, Eloquent model implementation, and TimescaleDB integration for storing insurance policies, coverages, endorsements, and policy lifecycle events. The implementation will ensure idempotent TimescaleDB setup for historical policy event storage while maintaining compatibility with existing risk analytics infrastructure.
Technical Scope
Core Database Modules:
-
Policy Domain Model Design:
- Design PostgreSQL schema for policies, coverages, and endorsements
- Implement Eloquent models with relationships and accessors
- Create policy lifecycle state management (draft, active, expired, lapsed, claimed)
- Develop value objects for insurance-specific domain logic
-
TimescaleDB Integration:
- Implement idempotent TimescaleDB extension activation
- Create hypertables for policy events and historical data
- Develop migration system for TimescaleDB-specific schema changes
- Build retention policies for historical data management
-
Event Sourcing Architecture:
- Implement policy event storage for audit trails
- Create event replay capabilities for state reconstruction
- Develop real-time event publishing via Laravel events
- Build event subscribers for downstream services
-
Data Persistence Layer:
- Implement repository pattern for policy data access
- Create database seeders for initial policy templates
- Develop query scopes for common policy searches
- Build data validation and integrity constraints
Key Requirements:
- Full compatibility with existing TimescaleDB setup from risk-analytics-service
- Idempotent database migrations that can run multiple times safely
- Support for both relational data and time-series event data
- Integration with Laravel's Eloquent ORM and query builder
- Real-time event streaming capabilities
- Comprehensive data validation and integrity checks
Acceptance Criteria
-
Full domain model implementation including:
- Complete database schema with proper relationships
- Eloquent models with all necessary relationships and methods
- Successful TimescaleDB integration with hypertables
- Idempotent migration execution
-
Database Requirements:
- Proper indexing for performance optimization
- Foreign key constraints for data integrity
- Efficient storage utilization with appropriate data types
- Support for complex policy queries and aggregations
-
Integration Requirements:
- Seamless integration with existing Laravel application
- Compatibility with risk-analytics-service TimescaleDB setup
- Real-time event publishing via Laravel events and listeners
- Support for both API and console command data access
-
Performance Requirements:
- Efficient query performance for policy retrieval
- Scalable event storage for high-volume policy operations
- Optimal database indexing strategy
- Support for large-scale policy portfolio management
Technical Specifications
Database Schema:
// Example Migration Structure
Schema::create('policies', function (Blueprint $table) {
$table->id();
$table->string('policy_number')->unique();
$table->foreignId('user_id')->constrained();
$table->string('status')->default('draft');
$table->decimal('premium_amount', 20, 2);
$table->decimal('coverage_amount', 20, 2);
$table->timestamp('effective_date');
$table->timestamp('expiration_date');
$table->json('coverage_details');
$table->timestamps();
});
// TimescaleDB Hypertable for events
DB::statement("SELECT create_hypertable('policy_events', 'created_at')");
class Policy extends Model
{
protected $casts = [
'coverage_details' => 'array',
'effective_date' => 'datetime',
'expiration_date' => 'datetime',
];
public function coverages()
{
return $this->hasMany(Coverage::class);
}
public function events()
{
return $this->hasMany(PolicyEvent::class);
}
}
class Policy extends Model
{
protected $casts = [
'coverage_details' => 'array',
'effective_date' => 'datetime',
'expiration_date' => 'datetime',
];
public function coverages()
{
return $this->hasMany(Coverage::class);
}
public function events()
{
return $this->hasMany(PolicyEvent::class);
}
}
// Idempotent migration for TimescaleDB
if (!Schema::hasTable('policy_events')) {
Schema::create('policy_events', function (Blueprint $table) {
$table->id();
$table->foreignId('policy_id')->constrained();
$table->string('event_type');
$table->json('event_data');
$table->timestamp('created_at');
});
DB::statement("SELECT create_hypertable('policy_events', 'created_at', if_not_exists => TRUE)");
}Security Considerations
- Proper data encryption for sensitive policy information
- SQL injection prevention through Laravel's query builder
- Access control at the database level where appropriate
- Audit logging for all policy data modifications
- Compliance with data protection regulations
- Regular security reviews of database access patterns
Performance Considerations
- Database indexing strategy for common query patterns
- Efficient use of TimescaleDB hypertables for time-series data
- Query optimization for large policy portfolios
- Connection pooling for high-concurrency environments
- Caching strategy for frequently accessed policy data
Branch & Commit
- Branch:
feat/policy-domain-model - Commit:
feat: implement policy data domain model with TimescaleDB persistence
⏳ Estimated Time: 2 Days