Commit Graph

183 Commits

Author SHA1 Message Date
Xiaoxia AI 78d5ac1ef6 feat(repository): add PostgreSQL repositories for Workspace and Member
- Implement PostgresWorkspaceRepository with full CRUD
- Implement PostgresWorkspaceMemberRepository with query methods
- Support find_by_user, find_by_workspace, count_by_workspace
- Use upsert pattern (INSERT ... ON CONFLICT DO UPDATE)
- Proper connection management and cleanup
- Add __init__.py to export all PostgreSQL repositories

Phase 4 Task 35/68 completed
2026-06-17 08:22:45 +08:00
Xiaoxia AI a2bbc7345b feat(database): add PostgreSQL repository and migration scripts
- Implement PostgresUserRepository with full CRUD operations
- Support all query methods (by_id/email/username/token)
- Use psycopg2 with RealDictCursor for clean mapping
- Create initial schema migration (users/workspaces/members/invitations)
- Add database indexes for performance
- Setup foreign key constraints for data integrity
- Include migration guide and rollback instructions
- Add psycopg2 dependency

Phase 4 Task 28/68 completed
2026-06-17 07:35:02 +08:00
Xiaoxia AI 4e33158d8d feat(quota): add quota checking and management system
- Implement QuotaChecker for project and storage limits
- Check project count before creation (respect max_projects)
- Check storage availability before upload
- Get quota status with usage percentages
- Update storage usage (increase/decrease)
- Define warning levels (normal/warning/critical/exceeded)
- Add ProjectRepository interface for project counting
- Add 14 comprehensive unit tests (all passed)

Phase 4 Task 22/68 completed
2026-06-17 07:24:14 +08:00
Xiaoxia AI dba2fe94ac feat(subscription): add upgrade and cancel subscription use cases
- Implement UpgradeSubscriptionUseCase (Free→Pro→Enterprise)
- Prevent downgrades (must use cancel to return to Free)
- Auto-set quotas and expiration date on upgrade
- Implement CancelSubscriptionUseCase to downgrade to Free
- Only workspace owner can manage subscription
- Add 8 comprehensive unit tests (all passed)

Phase 4 Task 21/68 completed
2026-06-17 07:20:34 +08:00
Xiaoxia AI 80c29ba940 feat(permissions): add permission system and checker
- Implement PermissionChecker for workspace access control
- Define Permission constants for all operations
- Define ROLE_PERMISSIONS mapping (Owner/Admin/Member/Viewer)
- Support workspace/member/project/asset permission checks
- Helper functions: check_is_owner, check_can_manage_members, etc.
- Add 15 comprehensive unit tests (all passed)

Phase 4 Task 20/68 completed
2026-06-17 07:16:02 +08:00
Xiaoxia AI f08f1e6842 feat(repository): add workspace repositories (interfaces and in-memory)
- Add WorkspaceRepository interface and InMemoryWorkspaceRepository
- Add WorkspaceMemberRepository with find_by_user/workspace/count methods
- Add WorkspaceInvitationRepository with token and pending lookup
- Implement InMemory adapters with proper indexing for fast lookups
- Support all query patterns needed by use cases

Phase 4 Task 19/68 completed
2026-06-17 07:14:50 +08:00
Xiaoxia AI 0a2137c2aa feat(workspace): add list members use case
- Implement ListMembersUseCase to get all workspace members
- Return member info with user details (username, email, display_name)
- Show role, inviter, and join time for each member
- Only workspace members can view member list
- Add 6 comprehensive unit tests (all passed)

Phase 4 Task 18/68 completed
2026-06-17 07:06:33 +08:00
Xiaoxia AI ee3935abdc feat(workspace): add list workspaces and get detail use cases
- Implement ListWorkspacesUseCase to get user's all workspaces
- Return workspace info with user's role and member count
- Implement GetWorkspaceDetailUseCase with permission check
- Show detailed subscription and storage info
- Verify user is member before showing details
- Add 8 comprehensive unit tests (all passed)

Phase 4 Task 17/68 completed
2026-06-17 07:04:55 +08:00
Xiaoxia AI a222c7f278 feat(workspace): add update member role use case
- Implement UpdateMemberRoleUseCase with role-based permission
- Owner/Admin can change roles, but Admin cannot change other Admins
- Cannot change owner's role or change your own role
- Cannot change to owner role (owner is unique)
- Validate role not already assigned
- Add 8 comprehensive unit tests (all passed)

Phase 4 Task 16/68 completed
2026-06-17 05:12:34 +08:00
Xiaoxia AI 8ff42a1bf9 feat(workspace): add remove member and leave workspace use cases
- Implement RemoveMemberUseCase with role-based permission
- Owner/Admin can remove members, but Admin cannot remove other Admins
- Cannot remove workspace owner or remove yourself
- Implement LeaveWorkspaceUseCase for self-removal
- Owner cannot leave (must transfer ownership or delete workspace first)
- Add 9 comprehensive unit tests (all passed)

Phase 4 Task 15/68 completed
2026-06-17 05:10:06 +08:00
Xiaoxia AI 82240d7953 feat(workspace): add accept and decline invitation use cases
- Implement AcceptInvitationUseCase with validation
- Check invitation status, expiration, and email match
- Auto-create WorkspaceMember on accept
- Handle case when user is already a member
- Implement DeclineInvitationUseCase to reject invitations
- Update invitation status (accepted/declined/expired)
- Add 9 comprehensive unit tests (all passed)

Phase 4 Task 14/68 completed
2026-06-17 05:08:31 +08:00
Xiaoxia AI 5d77d334ee feat(workspace): add invite member use case
- Implement InviteMemberUseCase with role-based permission check
- Only owner/admin can invite members (not regular members)
- Cannot invite as owner (owner is unique per workspace)
- Check for duplicate invitations and existing members
- Generate invitation token with 7-day expiration
- Send invitation email with accept link
- Add 7 comprehensive unit tests (all passed)

Phase 4 Task 13/68 completed
2026-06-17 05:06:57 +08:00
Xiaoxia AI 7a03f9636a feat(workspace): add create workspace use case
- Implement CreateWorkspaceUseCase with subscription plan support
- Auto-configure quotas based on plan (free/pro/enterprise)
- Auto-create owner membership record on workspace creation
- Validate workspace name (required, max 100 chars)
- Validate owner user exists before creation
- Add 7 comprehensive unit tests (all passed)

Phase 4 Task 12/68 completed
2026-06-17 01:28:09 +08:00
Xiaoxia AI 00b1710250 feat(workspace): add WorkspaceInvitation entity
- Add InvitationStatus enum (pending/accepted/declined/expired)
- Add WorkspaceInvitation entity to track invitation lifecycle
- Store inviter, invitee email, role, and invitation token
- Track status, expiration, and acceptance time
- Foundation for workspace invitation system

Phase 4 Task 11/68 completed
2026-06-17 01:27:15 +08:00
Xiaoxia AI 3913c3d2d1 feat(workspace): add WorkspaceMember entity with role-based access
- Add WorkspaceMemberRole enum (owner/admin/member/viewer)
- Add WorkspaceMember entity to track user membership in workspace
- Track invited_by for audit trail
- Track joined_at for membership timeline
- Foundation for multi-tenant permission system

Phase 4 Task 10/68 completed
2026-06-17 01:26:43 +08:00
Xiaoxia AI 687f4b7f7a feat(workspace): extend Workspace entity with subscription fields
- Add subscription_plan (free/pro/enterprise) with free as default
- Add subscription_status (active/cancelled/expired)
- Add subscription_expires_at for expiration tracking
- Add max_projects quota (free: 3, pro/enterprise: unlimited)
- Add max_storage_gb and used_storage_gb for storage tracking
- Backward compatible with existing code (all new fields have defaults)

Phase 4 Task 9/68 completed
2026-06-17 01:26:18 +08:00
Xiaoxia AI e46cda2416 feat(auth): add password reset functionality
- Implement RequestPasswordResetUseCase to generate reset token
- Send password reset email with 1-hour expiration
- Implement ResetPasswordUseCase to verify token and update password
- Security: return success even if user not exists (avoid enumeration)
- Validate new password strength before reset
- Clear reset token after successful password change
- Add 9 comprehensive unit tests (all passed)

Phase 4 Task 8/68 completed
2026-06-17 01:25:53 +08:00
Xiaoxia AI f0d0edf449 feat(auth): add login, logout and refresh token use cases
- Implement LoginUseCase with password verification and JWT token generation
- Generate user_auth token (without workspace) for initial login
- Create session with refresh_token in Redis
- Track last_login_at and last_login_ip
- Implement LogoutUseCase for single device or all devices
- Add RefreshTokenUseCase placeholder (to be implemented)
- Add 9 comprehensive unit tests (all passed)

Phase 4 Task 7/68 completed
2026-06-17 01:24:45 +08:00
Xiaoxia AI e9e874404c feat(auth): add user registration with email verification
- Implement RegisterUserUseCase with password validation and email verification
- Implement VerifyEmailUseCase for email confirmation
- Add UserRepository interface and InMemoryUserRepository implementation
- Support duplicate email/username checking
- Generate verification tokens and send verification emails
- Add 9 comprehensive unit tests (all passed)

Phase 4 Task 6/68 completed
2026-06-17 01:20:40 +08:00
Xiaoxia AI 5d35a19084 feat(auth): extend User entity with authentication fields
- Add username field
- Add password_hash for bcrypt hash storage
- Add email_verified and email_verification_token for email verification
- Add password_reset_token and password_reset_expires_at for password reset
- Add last_login_at and last_login_ip for login tracking
- Backward compatible with existing code (all new fields have defaults)

Phase 4 Task 5/68 completed
2026-06-17 01:18:35 +08:00
Xiaoxia AI 298ab93358 feat(auth): add email service with SMTP support
- Implement EmailService class with configurable SMTP
- Support verification/password-reset/invitation email templates
- Support HTML and plain text fallback
- Support CC/BCC recipients
- Add 8 comprehensive unit tests with Mock SMTP (all passed)

Phase 4 Task 4/68 completed
2026-06-17 01:17:19 +08:00
Xiaoxia AI 86ea3c7eef feat(auth): add Redis session store for refresh tokens
- Implement SessionStore class with Redis backend
- Support save/get/delete session and refresh_token
- Support user multi-device sessions management
- Add last_active tracking and force logout all devices
- Add 10 comprehensive unit tests with Mock Redis (all passed)
- Install redis dependency

Phase 4 Task 3/68 completed
2026-06-17 01:15:08 +08:00
Xiaoxia AI 1d8d7bddb9 feat(auth): add bcrypt password hasher with strength validator
- Implement PasswordHasher class with bcrypt (cost=12)
- Add PasswordValidator for password strength checking
- Support min length, uppercase, lowercase, digit, special chars
- Add 18 comprehensive unit tests (all passed)
- Install bcrypt dependency

Phase 4 Task 2/68 completed
2026-06-17 01:08:10 +08:00
Xiaoxia AI 2380bd9b92 feat(auth): add JWT service with sign/verify/refresh functionality
- Implement JWTService class with access_token and refresh_token support
- Add token type validation (access vs refresh)
- Add comprehensive unit tests (9 tests all passed)
- Install PyJWT dependency

Phase 4 Task 1/68 completed
2026-06-17 01:01:22 +08:00
Xiaoxia AI 3cdb2a0230 feat: complete all backend endpoints and frontend features
Backend:
- UpdateTaskUseCase for editing task basic info
- PATCH /tasks/{id} endpoint for task updates
- UpdateTaskRequest model with optional fields
- Full CRUD operations for tasks

Frontend:
- EditTaskForm now uses real API (PATCH /tasks/{id})
- Task detail page shows edit form when edit button clicked
- Status/progress update with real-time API calls
- Issue resolution with real-time refresh
- All forms integrated with backend

Tests:
- Added test_update_task for partial and full updates
- 9 integration tests passing (was 8)
- Full coverage of task CRUD operations

All features complete and tested!
2026-06-16 13:12:00 +08:00
Xiaoxia AI 7803be3f11 feat: add GET task detail endpoint and use case
- GetTaskDetailUseCase for single task retrieval
- GET /api/v1/project-management/tasks/{task_id} endpoint
- Updated task detail page to use real API
- Added integration test for task detail retrieval
- Test passed: 1 new test green
2026-06-16 12:55:33 +08:00
Xiaoxia AI c92cf78ea1 feat: add project management module (tasks, milestones, issues)
- Domain: Task, Milestone, TaskIssue entities with business logic
- Ports: TaskRepository, MilestoneRepository, TaskIssueRepository interfaces
- Adapters: In-Memory and SQLAlchemy implementations
- Application: Use cases for task/milestone/issue operations
- API: FastAPI routes for project management
- Database: Alembic migration 002 for new tables
- Tests: 7 integration tests all passing
2026-06-16 11:02:06 +08:00
Xiaoxia AI acfa82b995 fix: serialize schema init for postgres 2026-06-15 19:41:57 +08:00
Xiaoxia AI f0ee5c6184 feat: persist ingest flow in postgres 2026-06-15 19:34:47 +08:00
Xiaoxia AI 5f0a280669 feat: add tag functionality to Asset
- domain: Asset.tags field with add_tag/remove_tag methods
- validation: no empty tags, auto deduplication
- tests: 5 integration tests (add/remove/duplicate/empty/idempotent)
- all 13 tests passing
2026-06-15 16:47:45 +08:00
Xiaoxia AI a8177c1268 feat: add asset classification pipeline
- domain: ClassificationJob entity with AssetClassification enum (scenic, product, person, animal, food, tech, sport, music, other)
- ports: ClassificationJobRepository interface
- application: SubmitClassificationJobUseCase
- adapters: InMemoryClassificationJobRepository
- worker: classify_asset task with mock classification logic
- tests: full classification pipeline test
- all 8 integration tests passing
2026-06-15 15:39:28 +08:00
Xiaoxia AI e4e2595e70 feat: add PostgreSQL persistence layer
- adapters: SQLAlchemy implementations for all 4 repositories (Project, AssetLibrary, Asset, IngestJob)
- models: SQLAlchemy ORM models with proper schema
- database: connection config and session management
- tests: SQLAlchemy repository integration test (in-memory SQLite)
- all 7 integration tests passing
2026-06-15 15:29:13 +08:00
Xiaoxia AI b5a62ee9a3 feat: initial SaaS scaffold
- domain: User, Workspace, Project, AssetLibrary, Asset, IngestJob
- ports: repository interfaces
- application: use cases
- adapters: in-memory
- API: FastAPI 5 routes
- worker: Celery ingest_asset
- tests: 4 passing
2026-06-15 15:17:40 +08:00