- Added GitHub spec-kit for development workflow - Standardized file signatures to Descomplicar® format - Updated development configuration 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
6.4 KiB
6.4 KiB
Data Model: WordPress Plugin para Controlo Seguro de Agendamentos KiviCare
Feature: WordPress Plugin para Controlo Seguro de Agendamentos KiviCare
Date: 2025-09-10
Phase: Data Model Design
Core Entities
1. Restriction Entity
Table: wp_care_booking_restrictions
| Field | Type | Constraints | Description |
|---|---|---|---|
id |
BIGINT(20) UNSIGNED | AUTO_INCREMENT, PRIMARY KEY | Unique restriction identifier |
restriction_type |
ENUM('doctor', 'service') | NOT NULL | Type of restriction being applied |
target_id |
BIGINT(20) UNSIGNED | NOT NULL | ID of the doctor or service being restricted |
doctor_id |
BIGINT(20) UNSIGNED | NULL | For service restrictions, which doctor it applies to |
is_blocked |
BOOLEAN | DEFAULT FALSE | Whether the item is blocked from public view |
created_at |
TIMESTAMP | DEFAULT CURRENT_TIMESTAMP | When restriction was created |
updated_at |
TIMESTAMP | DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP | When restriction was last modified |
Indexes:
PRIMARY KEY (id)INDEX idx_type_target (restriction_type, target_id)INDEX idx_doctor_service (doctor_id, target_id)- For service restrictions by doctorINDEX idx_blocked (is_blocked)- For filtering active restrictions
2. WordPress Integration Entities
Cache Keys (WordPress Transients):
care_booking_doctors_blocked- List of blocked doctor IDscare_booking_services_blocked_{doctor_id}- Blocked services for specific doctorcare_booking_restrictions_hash- Hash of current restrictions for cache validation
WordPress Options:
care_booking_plugin_version- Plugin version for migration handlingcare_booking_cache_timeout- Cache timeout in seconds (default: 3600)
Entity Relationships
Doctor Restrictions
Restriction (restriction_type = 'doctor')
├── target_id → KiviCare Doctor ID
├── doctor_id → NULL (not applicable)
└── is_blocked → TRUE/FALSE
Service Restrictions
Restriction (restriction_type = 'service')
├── target_id → KiviCare Service ID
├── doctor_id → KiviCare Doctor ID (which doctor this applies to)
└── is_blocked → TRUE/FALSE
Data Validation Rules
Restriction Entity Validation
- restriction_type: Must be either 'doctor' or 'service'
- target_id: Must be positive integer, must exist in KiviCare
- doctor_id:
- Must be NULL for doctor restrictions
- Must be positive integer for service restrictions
- Must exist in KiviCare doctors table
- is_blocked: Boolean only (0 or 1)
Business Logic Validation
- Doctor Restriction:
- target_id must exist in KiviCare doctors
- Only one restriction per doctor (unique constraint on target_id for doctor type)
- Service Restriction:
- target_id must exist in KiviCare services
- doctor_id must exist in KiviCare doctors
- Service must be assignable to the specified doctor
- Only one restriction per service-doctor combination
Data Integrity Rules
- Orphan Prevention: Before creating restriction, verify target exists in KiviCare
- Cascade Cleanup: When KiviCare entity is deleted, cleanup related restrictions
- Cache Invalidation: When any restriction changes, invalidate related cache keys
State Transitions
Restriction Lifecycle
[Non-existent] → [Created (is_blocked=false)] → [Blocked (is_blocked=true)] → [Unblocked (is_blocked=false)] → [Deleted]
↗ ↙
[Blocked (is_blocked=true)] ←→ [Unblocked (is_blocked=false)]
Admin Interface States
- New Restriction: Create with is_blocked=true (default blocked)
- Toggle Restriction: Update is_blocked value
- Remove Restriction: DELETE from database (not soft delete)
Query Patterns
Common Queries
-- Get all blocked doctors
SELECT target_id FROM wp_care_booking_restrictions
WHERE restriction_type = 'doctor' AND is_blocked = 1;
-- Get blocked services for specific doctor
SELECT target_id FROM wp_care_booking_restrictions
WHERE restriction_type = 'service' AND doctor_id = ? AND is_blocked = 1;
-- Check if specific doctor is blocked
SELECT 1 FROM wp_care_booking_restrictions
WHERE restriction_type = 'doctor' AND target_id = ? AND is_blocked = 1 LIMIT 1;
-- Get all restrictions for admin interface
SELECT * FROM wp_care_booking_restrictions
ORDER BY restriction_type, target_id;
Performance Considerations
- Use prepared statements for all queries
- Leverage indexes for common query patterns
- Cache frequently accessed data using WordPress transients
- Batch operations for bulk updates
Database Schema Migration
Version 1.0.0 Initial Schema
CREATE TABLE IF NOT EXISTS {$wpdb->prefix}care_booking_restrictions (
id BIGINT(20) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
restriction_type ENUM('doctor', 'service') NOT NULL,
target_id BIGINT(20) UNSIGNED NOT NULL,
doctor_id BIGINT(20) UNSIGNED NULL,
is_blocked BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_type_target (restriction_type, target_id),
INDEX idx_doctor_service (doctor_id, target_id),
INDEX idx_blocked (is_blocked)
);
Migration Strategy
- Plugin Activation: Check if table exists, create if needed
- Version Updates: Compare plugin version, run migrations if needed
- Plugin Deactivation: Keep data (user might reactivate)
- Plugin Uninstall: Drop table and clean up options (permanent removal)
WordPress Integration Data Flow
Admin Interface Data Flow
WordPress Admin Panel
↓ (User Action)
AJAX Request with Nonce
↓ (Validation)
Database Update (wp_care_booking_restrictions)
↓ (Cache Invalidation)
WordPress Transients Cleared
↓ (Response)
JSON Response to Admin Interface
Frontend Filtering Data Flow
KiviCare Hook Triggered
↓ (Check Cache)
WordPress Transients (if exists)
↓ (If cache miss)
Database Query (wp_care_booking_restrictions)
↓ (Filter Data)
Modified Doctor/Service List
↓ (CSS Injection)
Hidden Elements via CSS
This data model provides a robust foundation for the WordPress plugin while maintaining simplicity and performance through appropriate indexing and caching strategies.