Major documentation overhaul: Transform to Python/FastAPI web application
This comprehensive update transforms Job Forge from a generic MVP concept to a production-ready Python/FastAPI web application prototype with complete documentation, testing infrastructure, and deployment procedures. ## 🏗️ Architecture Changes - Updated all documentation to reflect Python/FastAPI + Dash + PostgreSQL stack - Transformed from MVP concept to deployable web application prototype - Added comprehensive multi-tenant architecture with Row Level Security (RLS) - Integrated Claude API and OpenAI API for AI-powered document generation ## 📚 Documentation Overhaul - **CLAUDE.md**: Complete rewrite as project orchestrator for 4 specialized agents - **README.md**: New centralized documentation hub with organized navigation - **API Specification**: Updated with comprehensive FastAPI endpoint documentation - **Database Design**: Enhanced schema with RLS policies and performance optimization - **Architecture Guide**: Transformed to web application focus with deployment strategy ## 🏗️ New Documentation Structure - **docs/development/**: Python/FastAPI coding standards and development guidelines - **docs/infrastructure/**: Docker setup and server deployment procedures - **docs/testing/**: Comprehensive QA procedures with pytest integration - **docs/ai/**: AI prompt templates and examples (preserved from original) ## 🎯 Team Structure Updates - **.claude/agents/**: 4 new Python/FastAPI specialized agents - simplified_technical_lead.md: Architecture and technical guidance - fullstack_developer.md: FastAPI backend + Dash frontend implementation - simplified_qa.md: pytest testing and quality assurance - simplified_devops.md: Docker deployment and server infrastructure ## 🧪 Testing Infrastructure - **pytest.ini**: Complete pytest configuration with coverage requirements - **tests/conftest.py**: Comprehensive test fixtures and database setup - **tests/unit/**: Example unit tests for auth and application services - **tests/integration/**: API integration test examples - Support for async testing, AI service mocking, and database testing ## 🧹 Cleanup - Removed 9 duplicate/outdated documentation files - Eliminated conflicting technology references (Node.js/TypeScript) - Consolidated overlapping content into comprehensive guides - Cleaned up project structure for professional development workflow ## 🚀 Production Ready Features - Docker containerization for development and production - Server deployment procedures for prototype hosting - Security best practices with JWT authentication and RLS - Performance optimization with database indexing and caching - Comprehensive testing strategy with quality gates This update establishes Job Forge as a professional Python/FastAPI web application prototype ready for development and deployment. 🤖 Generated with Claude Code (https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -1,9 +1,9 @@
|
||||
# JobForge MVP - Database Design & Schema
|
||||
# Job Forge - Database Design & Schema
|
||||
|
||||
**Version:** 1.0.0 MVP
|
||||
**Version:** 1.0.0 Prototype
|
||||
**Database:** PostgreSQL 16 with pgvector
|
||||
**Target Audience:** Backend Developers
|
||||
**Last Updated:** July 2025
|
||||
**Target Audience:** Full-Stack Developers
|
||||
**Last Updated:** August 2025
|
||||
|
||||
---
|
||||
|
||||
@@ -11,17 +11,18 @@
|
||||
|
||||
### Technology Stack
|
||||
- **Database:** PostgreSQL 16
|
||||
- **Extensions:** pgvector (for AI embeddings)
|
||||
- **Security:** Row Level Security (RLS) for multi-tenancy
|
||||
- **Connection:** AsyncPG with SQLAlchemy 2.0
|
||||
- **Migrations:** Direct SQL for MVP (Alembic in Phase 2)
|
||||
- **Extensions:** pgvector (for AI embeddings), uuid-ossp (for UUID generation)
|
||||
- **Security:** Row Level Security (RLS) for multi-tenant architecture
|
||||
- **Connection:** AsyncPG with SQLAlchemy 2.0 async ORM
|
||||
- **Migrations:** Alembic for database schema versioning
|
||||
|
||||
### Design Principles
|
||||
- **User Isolation:** Complete data separation between users
|
||||
- **Data Integrity:** Foreign key constraints and validation
|
||||
- **Performance:** Optimized indexes for common queries
|
||||
- **Security:** RLS policies prevent cross-user data access
|
||||
- **Scalability:** Schema designed for future SaaS features
|
||||
- **Multi-Tenancy:** Complete data isolation between users via RLS
|
||||
- **Data Integrity:** Foreign key constraints and comprehensive validation
|
||||
- **Performance:** Strategic indexes for query optimization
|
||||
- **Security:** Defense-in-depth with RLS policies and input validation
|
||||
- **Scalability:** Schema designed for horizontal scaling and future features
|
||||
- **Maintainability:** Clear naming conventions and well-documented structure
|
||||
|
||||
---
|
||||
|
||||
@@ -38,27 +39,24 @@ erDiagram
|
||||
uuid id PK
|
||||
varchar email UK
|
||||
varchar password_hash
|
||||
varchar full_name
|
||||
timestamp created_at
|
||||
timestamp updated_at
|
||||
varchar first_name
|
||||
varchar last_name
|
||||
boolean is_active
|
||||
timestamptz created_at
|
||||
timestamptz updated_at
|
||||
}
|
||||
|
||||
APPLICATIONS {
|
||||
uuid id PK
|
||||
uuid user_id FK
|
||||
varchar name
|
||||
varchar company_name
|
||||
varchar role_title
|
||||
text job_url
|
||||
text job_description
|
||||
text job_url
|
||||
varchar location
|
||||
varchar priority_level
|
||||
varchar status
|
||||
boolean research_completed
|
||||
boolean resume_optimized
|
||||
boolean cover_letter_generated
|
||||
timestamp created_at
|
||||
timestamp updated_at
|
||||
timestamptz created_at
|
||||
timestamptz updated_at
|
||||
}
|
||||
|
||||
DOCUMENTS {
|
||||
@@ -66,8 +64,8 @@ erDiagram
|
||||
uuid application_id FK
|
||||
varchar document_type
|
||||
text content
|
||||
timestamp created_at
|
||||
timestamp updated_at
|
||||
timestamptz created_at
|
||||
timestamptz updated_at
|
||||
}
|
||||
|
||||
USER_RESUMES {
|
||||
@@ -77,15 +75,15 @@ erDiagram
|
||||
text content
|
||||
varchar focus_area
|
||||
boolean is_primary
|
||||
timestamp created_at
|
||||
timestamp updated_at
|
||||
timestamptz created_at
|
||||
timestamptz updated_at
|
||||
}
|
||||
|
||||
DOCUMENT_EMBEDDINGS {
|
||||
uuid id PK
|
||||
uuid document_id FK
|
||||
vector embedding
|
||||
timestamp created_at
|
||||
vector_1536 embedding
|
||||
timestamptz created_at
|
||||
}
|
||||
```
|
||||
|
||||
@@ -100,12 +98,12 @@ CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
|
||||
CREATE EXTENSION IF NOT EXISTS vector;
|
||||
|
||||
-- Create custom types
|
||||
CREATE TYPE priority_level_type AS ENUM ('low', 'medium', 'high');
|
||||
CREATE TYPE application_status_type AS ENUM (
|
||||
'draft',
|
||||
'research_complete',
|
||||
'resume_ready',
|
||||
'cover_letter_ready'
|
||||
'draft',
|
||||
'applied',
|
||||
'interview',
|
||||
'rejected',
|
||||
'offer'
|
||||
);
|
||||
CREATE TYPE document_type_enum AS ENUM (
|
||||
'research_report',
|
||||
@@ -129,17 +127,21 @@ CREATE TABLE users (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
email VARCHAR(255) UNIQUE NOT NULL,
|
||||
password_hash VARCHAR(255) NOT NULL,
|
||||
full_name VARCHAR(255) NOT NULL,
|
||||
first_name VARCHAR(100) NOT NULL,
|
||||
last_name VARCHAR(100) NOT NULL,
|
||||
is_active BOOLEAN DEFAULT TRUE,
|
||||
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
||||
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
||||
|
||||
-- Constraints
|
||||
CONSTRAINT email_format CHECK (email ~* '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$'),
|
||||
CONSTRAINT name_not_empty CHECK (LENGTH(TRIM(full_name)) > 0)
|
||||
CONSTRAINT first_name_not_empty CHECK (LENGTH(TRIM(first_name)) > 0),
|
||||
CONSTRAINT last_name_not_empty CHECK (LENGTH(TRIM(last_name)) > 0)
|
||||
);
|
||||
|
||||
-- Indexes
|
||||
CREATE INDEX idx_users_email ON users(email);
|
||||
CREATE INDEX idx_users_active ON users(is_active);
|
||||
CREATE INDEX idx_users_created_at ON users(created_at);
|
||||
|
||||
-- Row Level Security
|
||||
@@ -156,20 +158,13 @@ CREATE POLICY users_own_data ON users
|
||||
CREATE TABLE applications (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
||||
name VARCHAR(255) NOT NULL,
|
||||
company_name VARCHAR(255) NOT NULL,
|
||||
role_title VARCHAR(255) NOT NULL,
|
||||
job_url TEXT,
|
||||
job_description TEXT NOT NULL,
|
||||
job_url TEXT,
|
||||
location VARCHAR(255),
|
||||
priority_level priority_level_type DEFAULT 'medium',
|
||||
status application_status_type DEFAULT 'draft',
|
||||
|
||||
-- Phase tracking
|
||||
research_completed BOOLEAN DEFAULT FALSE,
|
||||
resume_optimized BOOLEAN DEFAULT FALSE,
|
||||
cover_letter_generated BOOLEAN DEFAULT FALSE,
|
||||
|
||||
-- Timestamps
|
||||
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
||||
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
||||
@@ -181,21 +176,12 @@ CREATE TABLE applications (
|
||||
CONSTRAINT valid_job_url CHECK (
|
||||
job_url IS NULL OR
|
||||
job_url ~* '^https?://[^\s/$.?#].[^\s]*$'
|
||||
),
|
||||
|
||||
-- Business logic constraints
|
||||
CONSTRAINT resume_requires_research CHECK (
|
||||
NOT resume_optimized OR research_completed
|
||||
),
|
||||
CONSTRAINT cover_letter_requires_resume CHECK (
|
||||
NOT cover_letter_generated OR resume_optimized
|
||||
)
|
||||
);
|
||||
|
||||
-- Indexes
|
||||
CREATE INDEX idx_applications_user_id ON applications(user_id);
|
||||
CREATE INDEX idx_applications_status ON applications(status);
|
||||
CREATE INDEX idx_applications_priority ON applications(priority_level);
|
||||
CREATE INDEX idx_applications_created_at ON applications(created_at);
|
||||
CREATE INDEX idx_applications_company_name ON applications(company_name);
|
||||
|
||||
@@ -420,48 +406,26 @@ BEGIN
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
-- Update application phases trigger
|
||||
CREATE OR REPLACE FUNCTION update_application_phases()
|
||||
-- Application status validation function
|
||||
CREATE OR REPLACE FUNCTION validate_application_status()
|
||||
RETURNS TRIGGER AS $$
|
||||
BEGIN
|
||||
-- Auto-update phase completion based on document existence
|
||||
IF TG_OP = 'INSERT' OR TG_OP = 'UPDATE' THEN
|
||||
UPDATE applications SET
|
||||
research_completed = EXISTS (
|
||||
SELECT 1 FROM documents
|
||||
WHERE application_id = NEW.application_id
|
||||
AND document_type = 'research_report'
|
||||
),
|
||||
resume_optimized = EXISTS (
|
||||
SELECT 1 FROM documents
|
||||
WHERE application_id = NEW.application_id
|
||||
AND document_type = 'optimized_resume'
|
||||
),
|
||||
cover_letter_generated = EXISTS (
|
||||
SELECT 1 FROM documents
|
||||
WHERE application_id = NEW.application_id
|
||||
AND document_type = 'cover_letter'
|
||||
)
|
||||
WHERE id = NEW.application_id;
|
||||
|
||||
-- Update status based on completion
|
||||
UPDATE applications SET
|
||||
status = CASE
|
||||
WHEN cover_letter_generated THEN 'cover_letter_ready'
|
||||
WHEN resume_optimized THEN 'resume_ready'
|
||||
WHEN research_completed THEN 'research_complete'
|
||||
ELSE 'draft'
|
||||
END
|
||||
WHERE id = NEW.application_id;
|
||||
-- Ensure status transitions are logical
|
||||
IF NEW.status = OLD.status THEN
|
||||
RETURN NEW;
|
||||
END IF;
|
||||
|
||||
RETURN COALESCE(NEW, OLD);
|
||||
-- Log status changes for audit purposes
|
||||
RAISE NOTICE 'Application % status changed from % to %',
|
||||
NEW.id, OLD.status, NEW.status;
|
||||
|
||||
RETURN NEW;
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
CREATE TRIGGER documents_update_phases
|
||||
AFTER INSERT OR UPDATE OR DELETE ON documents
|
||||
FOR EACH ROW EXECUTE FUNCTION update_application_phases();
|
||||
CREATE TRIGGER validate_application_status_trigger
|
||||
BEFORE UPDATE ON applications
|
||||
FOR EACH ROW EXECUTE FUNCTION validate_application_status();
|
||||
```
|
||||
|
||||
---
|
||||
@@ -518,11 +482,13 @@ engine = create_async_engine(
|
||||
### Development Seed Data
|
||||
```sql
|
||||
-- Insert test user (password: "testpass123")
|
||||
INSERT INTO users (id, email, password_hash, full_name) VALUES (
|
||||
INSERT INTO users (id, email, password_hash, first_name, last_name, is_active) VALUES (
|
||||
'123e4567-e89b-12d3-a456-426614174000',
|
||||
'test@example.com',
|
||||
'$2b$12$LQv3c1yqBWVHxkd0LHAkCOYz6TtxMQJqhN8/LewgdyN8yF5V4M2kq',
|
||||
'Test User'
|
||||
'Test',
|
||||
'User',
|
||||
true
|
||||
);
|
||||
|
||||
-- Insert test resume
|
||||
@@ -536,16 +502,15 @@ INSERT INTO user_resumes (user_id, name, content, focus_area, is_primary) VALUES
|
||||
|
||||
-- Insert test application
|
||||
INSERT INTO applications (
|
||||
user_id, name, company_name, role_title,
|
||||
job_description, status, research_completed
|
||||
user_id, company_name, role_title,
|
||||
job_description, job_url, status
|
||||
) VALUES (
|
||||
'123e4567-e89b-12d3-a456-426614174000',
|
||||
'google_senior_developer_2025_07_01',
|
||||
'Google',
|
||||
'Senior Developer',
|
||||
'We are seeking an experienced software developer to join our team...',
|
||||
'research_complete',
|
||||
true
|
||||
'We are seeking an experienced software developer to join our team building cutting-edge applications. You will work with Python, FastAPI, and modern web technologies.',
|
||||
'https://careers.google.com/jobs/results/123456789/',
|
||||
'draft'
|
||||
);
|
||||
```
|
||||
|
||||
@@ -648,4 +613,4 @@ GROUP BY state;
|
||||
|
||||
---
|
||||
|
||||
*This database design provides a solid foundation for the MVP while being prepared for future SaaS features. The RLS policies ensure complete user data isolation, and the schema is optimized for the expected query patterns.*
|
||||
*This database design provides a robust foundation for the Job Forge web application with strong security, performance optimization, and scalability. The RLS policies ensure complete multi-tenant data isolation, while the schema supports efficient AI-powered document generation workflows.*
|
||||
Reference in New Issue
Block a user