{"id":51045290,"url":"https://github.com/whilesmartphp/eloquent-activities","last_synced_at":"2026-06-22T13:02:13.443Z","repository":{"id":365811013,"uuid":"1176119826","full_name":"whilesmartphp/eloquent-activities","owner":"whilesmartphp","description":"Track activities across eloquent models","archived":false,"fork":false,"pushed_at":"2026-05-12T19:52:19.000Z","size":53,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-19T03:05:33.193Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/whilesmartphp.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-08T16:39:37.000Z","updated_at":"2026-03-08T19:36:51.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/whilesmartphp/eloquent-activities","commit_stats":null,"previous_names":["whilesmartphp/eloquent-activities"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/whilesmartphp/eloquent-activities","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/whilesmartphp%2Feloquent-activities","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/whilesmartphp%2Feloquent-activities/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/whilesmartphp%2Feloquent-activities/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/whilesmartphp%2Feloquent-activities/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/whilesmartphp","download_url":"https://codeload.github.com/whilesmartphp/eloquent-activities/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/whilesmartphp%2Feloquent-activities/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34649822,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-22T02:00:06.391Z","response_time":106,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-06-22T13:02:12.844Z","updated_at":"2026-06-22T13:02:13.430Z","avatar_url":"https://github.com/whilesmartphp.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Eloquent Activities\n\nFlexible activity tracking package for Laravel applications using the **Actor-Action-Subject** pattern.\n\n## Features\n\n- **Actor-Action-Subject Pattern**: Track who did what to what\n- **Polymorphic Relationships**: Works with any Eloquent model\n- **Flexible Context**: Scope activities to workspaces, projects, organizations, etc.\n- **Multiple Sources**: Track activities from manual entry, webhooks, API, system events, and integrations\n- **Rich Metadata**: Store flexible properties and metadata with each activity\n- **Powerful Query Scopes**: Filter activities by actor, subject, context, action, source, and date range\n- **Easy Integration**: Simple trait to add activity tracking to any model\n- **Configurable**: Customize routes, middleware, and features via configuration\n- **Laravel 11+ \u0026 12+ Support**: Compatible with modern Laravel versions\n\n## Installation\n\nInstall via Composer:\n\n```bash\ncomposer require whilesmart/eloquent-activities\n```\n\n### Publish Configuration (Optional)\n\n```bash\nphp artisan vendor:publish --tag=activities-config\n```\n\n### Run Migrations\n\n```bash\nphp artisan migrate\n```\n\n## Quick Start\n\n### 1. Add the Trait to Your Models\n\n```php\nuse Whilesmart\\Activities\\Traits\\HasActivities;\n\nclass Task extends Model\n{\n    use HasActivities;\n\n    // ...\n}\n```\n\n### 2. Create Activities\n\n```php\nuse Whilesmart\\Activities\\Models\\Activity;\n\n// Simple activity\nActivity::create([\n    'actor_type' =\u003e User::class,\n    'actor_id' =\u003e $user-\u003eid,\n    'action' =\u003e 'created',\n    'subject_type' =\u003e Task::class,\n    'subject_id' =\u003e $task-\u003eid,\n    'source' =\u003e Activity::SOURCE_MANUAL,\n    'summary' =\u003e 'Task created',\n    'description' =\u003e 'User created a new task',\n    'occurred_at' =\u003e now(),\n]);\n\n// Activity with context (workspace-scoped)\nActivity::create([\n    'actor_type' =\u003e User::class,\n    'actor_id' =\u003e $user-\u003eid,\n    'action' =\u003e 'updated',\n    'subject_type' =\u003e Task::class,\n    'subject_id' =\u003e $task-\u003eid,\n    'context_type' =\u003e Workspace::class,\n    'context_id' =\u003e $workspace-\u003eid,\n    'source' =\u003e Activity::SOURCE_SYSTEM,\n    'summary' =\u003e 'Task updated',\n    'occurred_at' =\u003e now(),\n]);\n\n// Activity with properties and metadata\nActivity::create([\n    'action' =\u003e 'login',\n    'actor_type' =\u003e User::class,\n    'actor_id' =\u003e $user-\u003eid,\n    'source' =\u003e Activity::SOURCE_SYSTEM,\n    'properties' =\u003e [\n        'ip_address' =\u003e request()-\u003eip(),\n        'duration' =\u003e 3600,\n    ],\n    'metadata' =\u003e [\n        'browser' =\u003e 'Chrome',\n        'version' =\u003e '120.0',\n    ],\n    'occurred_at' =\u003e now(),\n]);\n```\n\n### 3. Query Activities\n\n```php\n// Get activities for a specific user\n$activities = Activity::forActor(User::class, $user-\u003eid)-\u003eget();\n\n// Get activities for a specific task\n$activities = Activity::forSubject(Task::class, $task-\u003eid)-\u003eget();\n\n// Get activities within a workspace context\n$activities = Activity::inContext(Workspace::class, $workspace-\u003eid)-\u003eget();\n\n// Filter by action\n$activities = Activity::byAction('created')-\u003eget();\n\n// Filter by source\n$activities = Activity::bySource(Activity::SOURCE_WEBHOOK)-\u003eget();\n\n// Filter by date range\n$activities = Activity::inDateRange('2024-01-01', '2024-01-31')-\u003eget();\n\n// Chain scopes for complex queries\n$activities = Activity::forActor(User::class, $user-\u003eid)\n    -\u003eforSubject(Task::class, $task-\u003eid)\n    -\u003einContext(Workspace::class, $workspace-\u003eid)\n    -\u003ebyAction('created')\n    -\u003elatest('occurred_at')\n    -\u003eget();\n```\n\n### 4. Access Model Activities\n\n```php\n// Get all activities for a task\n$task-\u003eactivities;\n\n// Get the latest activity timestamp\n$task-\u003elast_activity;\n```\n\n## Configuration\n\nThe package provides several configuration options in `config/activities.php`:\n\n```php\nreturn [\n    // Model Configuration\n    'user_model' =\u003e env('ACTIVITIES_USER_MODEL', 'App\\\\Models\\\\User'),\n    'workspace_model' =\u003e env('ACTIVITIES_WORKSPACE_MODEL', 'App\\\\Models\\\\Workspace'),\n    'project_model' =\u003e env('ACTIVITIES_PROJECT_MODEL', 'App\\\\Models\\\\Project'),\n\n    // Route Configuration\n    'register_routes' =\u003e env('ACTIVITIES_REGISTER_ROUTES', true),\n    'route_prefix' =\u003e env('ACTIVITIES_ROUTE_PREFIX', ''),\n    'route_middleware' =\u003e ['auth:sanctum'],\n\n    // Feature Flags\n    'workspace_scoped' =\u003e env('ACTIVITIES_WORKSPACE_SCOPED', true),\n    'project_scoped' =\u003e env('ACTIVITIES_PROJECT_SCOPED', true),\n    'allow_manual_creation' =\u003e env('ACTIVITIES_ALLOW_MANUAL', true),\n    'allow_webhook_creation' =\u003e env('ACTIVITIES_ALLOW_WEBHOOK', true),\n];\n```\n\n## API Routes\n\nIf routes are enabled, the following endpoints are automatically registered:\n\n### List Activities\n\n```\nGET /api/activities\nGET /api/workspaces/{workspaceId}/activities\n```\n\n**Query Parameters:**\n- `projectId` - Filter by project\n- `memberId` - Filter by user/member\n- `from` - Filter by start date\n- `to` - Filter by end date\n\n### Create Activity\n\n```\nPOST /api/activities\nPOST /api/workspaces/{workspaceId}/activities\n```\n\n**Request Body:**\n```json\n{\n  \"projectId\": 1,\n  \"startTime\": \"2024-01-01 10:00:00\",\n  \"summary\": \"Activity summary\",\n  \"description\": \"Activity description\"\n}\n```\n\n## Activity Sources\n\nThe package supports multiple activity sources:\n\n```php\nActivity::SOURCE_MANUAL      // User-created activities\nActivity::SOURCE_WEBHOOK     // Activities from webhooks\nActivity::SOURCE_API         // Activities from API calls\nActivity::SOURCE_SYSTEM      // System-generated activities\nActivity::SOURCE_INTEGRATION // Activities from integrations\n```\n\nCheck activity source:\n\n```php\n$activity-\u003eisManual();\n$activity-\u003eisFromWebhook();\n$activity-\u003eisSystem();\n```\n\n## Properties and Metadata\n\nStore flexible data with activities:\n\n```php\n// Set properties\n$activity-\u003esetProperty('duration', 3600);\n$activity-\u003esetProperty('priority', 'high');\n$activity-\u003esave();\n\n// Get properties\n$activity-\u003egetProperty('duration');\n$activity-\u003egetProperty('priority', 'default_value');\n\n// Set metadata\n$activity-\u003esetMetadata(['browser' =\u003e 'Chrome', 'version' =\u003e '120.0']);\n$activity-\u003esetMetadata('browser', 'Chrome');\n$activity-\u003esave();\n\n// Get metadata\n$activity-\u003egetMetadata();\n$activity-\u003egetMetadata('browser');\n```\n\n## Testing\n\nRun the test suite:\n\n```bash\ncomposer test\n```\n\nRun code style checks:\n\n```bash\ncomposer pint:test\n```\n\nFix code style issues:\n\n```bash\ncomposer pint\n```\n\n## Use Cases\n\n- **Audit Logs**: Track all changes to important models\n- **User Activity Feeds**: Show what users have been doing\n- **Workspace Activity**: Track activities within workspace contexts\n- **Project Timelines**: Display project-related activities\n- **System Events**: Log important system events and actions\n- **Integration Tracking**: Track activities from external integrations\n- **Time Tracking**: Store time-related data in activity properties\n\n## Database Schema\n\nThe activities table includes:\n\n- **actor_type/actor_id**: Who performed the activity (polymorphic)\n- **action**: What action was performed\n- **subject_type/subject_id**: What entity was acted upon (polymorphic, optional)\n- **context_type/context_id**: The scope/context (workspace, project, etc., optional)\n- **source**: Where the activity originated from\n- **source_id**: External source identifier (optional)\n- **summary**: Short description\n- **description**: Detailed description\n- **properties**: Flexible JSON data\n- **metadata**: Additional JSON metadata\n- **occurred_at**: When the activity occurred\n- **created_at/updated_at**: Record timestamps\n\n## Requirements\n\n- PHP 8.2 or higher\n- Laravel 11.0 or 12.0\n\n## License\n\nMIT License\n\n## Credits\n\nDeveloped by the Whilesmart Team\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwhilesmartphp%2Feloquent-activities","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwhilesmartphp%2Feloquent-activities","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwhilesmartphp%2Feloquent-activities/lists"}