Commit graph

16 commits

Author SHA1 Message Date
Snider
1cfb869a55 docs: add January 2026 completed items to changelog
Some checks are pending
CI / PHP 8.2 (push) Waiting to run
CI / PHP 8.3 (push) Waiting to run
CI / PHP 8.4 (push) Waiting to run
CI / Assets (push) Waiting to run
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-29 19:51:57 +00:00
Snider
7b5114dce6 test(api): add comprehensive integration tests for EntitlementApiController (P2-022)
Add HTTP-level integration tests covering all API endpoints:

Cross-App Entitlement API:
- GET /api/v1/entitlements/check - authentication, validation, entitlement checks
- POST /api/v1/entitlements/usage - usage recording with metadata
- GET /api/v1/entitlements/summary - workspace summary

Blesta Provisioning API:
- POST /api/provisioning/entitlements (store) - user/workspace creation
- GET /api/provisioning/entitlements/{id} (show) - entitlement details
- POST suspend/unsuspend/cancel/renew - lifecycle operations

Also tests error responses, validation failures, and rate limit attribute.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-29 18:50:47 +00:00
Snider
adad6a1f47 perf(entitlements): optimise cache invalidation with tags (P2-023)
Add O(1) cache invalidation using cache tags for Redis/Memcached,
replacing O(n) feature iteration. Key improvements:

- Cache tags for workspace/namespace scoping (entitlement:ws:{id})
- Granular invalidation: invalidateUsageCache(), invalidateLimitCache()
- Event-driven cache management via EntitlementCacheInvalidated event
- Fallback to O(n) for non-taggable stores (file, database)
- recordUsage() now invalidates only the affected feature's cache

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-29 18:44:50 +00:00
Snider
a067453a6a test(entitlements): add namespace-level entitlement tests (P2-021)
Add comprehensive Pest tests for namespace-level entitlements including:
- canForNamespace() with user-owned and workspace-owned namespaces
- Entitlement cascade (namespace -> workspace -> user tier)
- provisionNamespacePackage() with replacement, expiry, metadata
- provisionNamespaceBoost() with stacking and unlimited overrides
- recordNamespaceUsage() with metadata and workspace context
- getNamespaceUsageSummary() with percentages and near-limit detection
- invalidateNamespaceCache() for limits and usage
- Multiple namespaces with separate usage tracking
- Boost stacking behaviour

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-29 18:41:24 +00:00
Snider
67b5b14b8e perf: add database indexes for common queries (P2-024)
Add migration with performance indexes for frequently queried columns:
- users.tier for tier-based queries
- namespaces.slug for slug lookups
- workspaces.is_active, type, domain for common filters
- user_workspace.team_id foreign key
- entitlement_usage_records.user_id foreign key
- entitlement_logs.user_id foreign key

Resolves PERF-002 from TODO.md.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-29 16:17:06 +00:00
Snider
5197094bd6 docs: add comprehensive PHPDoc to EntitlementService (P2-020)
- Document provisionNamespacePackage with examples
- Document provisionNamespaceBoost with boost/duration types
- Document invalidateNamespaceCache with auto-invalidation triggers
- Add cross-references to workspace-level equivalents

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-29 15:39:21 +00:00
Snider
501ea1897e chore: add strict types to core files (P2-019)
- Add declare(strict_types=1) to Workspace.php
- Add declare(strict_types=1) to User.php
- Add declare(strict_types=1) to EntitlementService.php

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-29 15:16:10 +00:00
Snider
8a521d4f3e security: fix P1 items for rate limiting, auth, SSRF and workspace validation
P1-010: Rate limiting (60 req/min) on EntitlementApiController
P1-011: API authentication documentation and middleware
P1-014: SSRF protection for webhook endpoints (PreventsSSRF trait)
P1-015: Workspace access validation in middleware (breaking change)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-29 13:19:27 +00:00
Snider
a35cbc9306 security: encrypt 2FA secrets and hash invitation tokens
- Add encrypted cast to UserTwoFactorAuth secret and recovery_codes
- Hash invitation tokens on creation using Hash::make()
- Update token verification to use Hash::check()
- Add migration commands for existing data:
  - security:encrypt-2fa-secrets
  - security:hash-invitation-tokens
- Add tests for encryption and hashing

Fixes SEC-003, SEC-004 from security audit.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-29 12:20:53 +00:00
Snider
8be7516d3a docs: update CLAUDE.md with correct namespace and architecture details
Fix namespace from Core\Mod\Tenant to Core\Tenant, add workspace
isolation patterns, coding standards, and entitlement system overview.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-28 14:16:40 +00:00
Snider
d0ad2737cb refactor: rename namespace from Core\Mod\Tenant to Core\Tenant
Simplifies the namespace hierarchy by removing the intermediate Mod
segment. Updates all 118 files including models, services, controllers,
middleware, tests, and composer.json autoload configuration.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-27 16:30:46 +00:00
Snider
68525ca247 feat(tenant): add team and member manager admin components
- Add TeamManager Livewire component for managing workspace teams
- Add MemberManager Livewire component for managing workspace members
- Add admin routes for team and member management
- Add blade templates for team and member management UI
- Support team permissions, bulk operations, and custom member permissions

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-27 10:21:25 +00:00
Snider
86dbf4e763 fix: namespace to Core\Mod\Tenant, restructure package
- Changed namespace from Core\Core\Tenant to Core\Mod\Tenant
- Moved src/ contents to root
- Removed Host UK extension files (admin.php, MemberManager, TeamManager)
- Fixed composer.json autoload paths
2026-01-27 00:58:42 +00:00
Snider
acceff6d36 monorepo sepration 2026-01-27 00:31:43 +00:00
Snider
bc9ffd74d3 monorepo sepration 2026-01-26 21:08:59 +00:00
Snider
496551ee53
Initial commit 2026-01-26 21:03:15 +00:00