193 lines
4.5 KiB
Markdown
193 lines
4.5 KiB
Markdown
# Story 3.1: URL Generation and Site Assignment - COMPLETE
|
|
|
|
## Status: ✅ IMPLEMENTATION COMPLETE
|
|
|
|
All acceptance criteria met. 44 tests passing. Ready for use.
|
|
|
|
---
|
|
|
|
## What I Built
|
|
|
|
### Core Functionality
|
|
1. **Site Assignment System** with full priority logic
|
|
2. **URL Generation** with intelligent slug creation
|
|
3. **Auto-Site Creation** via bunny.net API
|
|
4. **Keyword-Based Provisioning** for targeted site creation
|
|
5. **Flexible Hostname Support** (custom domains OR bcdn-only)
|
|
|
|
### Priority Assignment Rules Implemented
|
|
- **Tier1**: Preferred → Keyword → Random
|
|
- **Tier2+**: Keyword → Random
|
|
- **Auto-create** when pool insufficient (optional)
|
|
|
|
---
|
|
|
|
## Quick Start
|
|
|
|
### 1. Migrate Your Database
|
|
```bash
|
|
mysql -u user -p database < scripts/migrate_story_3.1.sql
|
|
```
|
|
|
|
### 2. Import Your 400+ Bunny.net Sites
|
|
```bash
|
|
uv run python main.py sync-sites --admin-user your_admin
|
|
```
|
|
|
|
### 3. Use New Features
|
|
```python
|
|
from src.generation.site_assignment import assign_sites_to_batch
|
|
from src.generation.url_generator import generate_urls_for_batch
|
|
|
|
# Assign sites to articles
|
|
assign_sites_to_batch(articles, job, site_repo, bunny_client, "project-keyword")
|
|
|
|
# Generate URLs
|
|
urls = generate_urls_for_batch(articles, site_repo)
|
|
```
|
|
|
|
---
|
|
|
|
## Test Results
|
|
|
|
```
|
|
44 tests passing:
|
|
✅ 14 URL generator tests
|
|
✅ 8 Site provisioning tests
|
|
✅ 9 Site assignment tests
|
|
✅ 8 Job config tests
|
|
✅ 5 Integration tests
|
|
```
|
|
|
|
Run tests:
|
|
```bash
|
|
uv run pytest tests/unit/test_url_generator.py \
|
|
tests/unit/test_site_provisioning.py \
|
|
tests/unit/test_site_assignment.py \
|
|
tests/unit/test_job_config_extensions.py \
|
|
tests/integration/test_story_3_1_integration.py -v
|
|
```
|
|
|
|
---
|
|
|
|
## Files Created/Modified
|
|
|
|
### New Modules (3):
|
|
- `src/generation/site_provisioning.py` - Bunny.net site creation
|
|
- `src/generation/url_generator.py` - URL and slug generation
|
|
- `src/generation/site_assignment.py` - Site assignment with priority system
|
|
|
|
### Modified Core Files (6):
|
|
- `src/database/models.py` - Nullable custom_hostname
|
|
- `src/database/interfaces.py` - Updated interface
|
|
- `src/database/repositories.py` - New methods
|
|
- `src/templating/service.py` - Hostname flexibility
|
|
- `src/cli/commands.py` - Import all sites
|
|
- `src/generation/job_config.py` - New config fields
|
|
|
|
### Tests (5 new files):
|
|
- `tests/unit/test_url_generator.py`
|
|
- `tests/unit/test_site_provisioning.py`
|
|
- `tests/unit/test_site_assignment.py`
|
|
- `tests/unit/test_job_config_extensions.py`
|
|
- `tests/integration/test_story_3_1_integration.py`
|
|
|
|
### Documentation (3):
|
|
- `STORY_3.1_IMPLEMENTATION_SUMMARY.md` - Detailed documentation
|
|
- `STORY_3.1_QUICKSTART.md` - Quick start guide
|
|
- `jobs/example_story_3.1_full_features.json` - Example config
|
|
|
|
### Migration (1):
|
|
- `scripts/migrate_story_3.1.sql` - Database migration
|
|
|
|
---
|
|
|
|
## Job Config Examples
|
|
|
|
### Minimal (use existing sites):
|
|
```json
|
|
{
|
|
"jobs": [{
|
|
"project_id": 1,
|
|
"tiers": {"tier1": {"count": 10}}
|
|
}]
|
|
}
|
|
```
|
|
|
|
### Full Features:
|
|
```json
|
|
{
|
|
"jobs": [{
|
|
"project_id": 1,
|
|
"tiers": {"tier1": {"count": 10}},
|
|
"tier1_preferred_sites": ["www.premium.com"],
|
|
"auto_create_sites": true,
|
|
"create_sites_for_keywords": [
|
|
{"keyword": "engine repair", "count": 3}
|
|
]
|
|
}]
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## URL Examples
|
|
|
|
### Custom Domain:
|
|
```
|
|
https://www.example.com/how-to-fix-your-engine.html
|
|
```
|
|
|
|
### Bunny CDN Only:
|
|
```
|
|
https://mysite123.b-cdn.net/how-to-fix-your-engine.html
|
|
```
|
|
|
|
---
|
|
|
|
## Design Decisions (Simple Over Complex)
|
|
|
|
✅ **Simple slug generation** - No complex character handling
|
|
✅ **Keyword matching by site name** - No fuzzy matching
|
|
✅ **Clear priority system** - Easy to understand and debug
|
|
✅ **Explicit auto-creation flag** - Safe by default
|
|
✅ **Comprehensive error messages** - Easy troubleshooting
|
|
|
|
❌ Deferred to technical debt:
|
|
- Fuzzy keyword/entity matching
|
|
- Complex ML-based site selection
|
|
- Advanced slug optimization
|
|
|
|
---
|
|
|
|
## Production Ready
|
|
|
|
✅ All acceptance criteria met
|
|
✅ Comprehensive test coverage
|
|
✅ No linter errors
|
|
✅ Error handling implemented
|
|
✅ Logging at INFO level
|
|
✅ Model-based schema (no manual migration needed in prod)
|
|
|
|
---
|
|
|
|
## Next Steps
|
|
|
|
1. Run migration on dev database
|
|
2. Test with `sync-sites` to import your 400+ sites
|
|
3. Create test job config
|
|
4. Integrate into your content generation workflow
|
|
5. Deploy to production (model changes auto-apply)
|
|
|
|
---
|
|
|
|
## Questions?
|
|
|
|
See detailed docs:
|
|
- `STORY_3.1_IMPLEMENTATION_SUMMARY.md` - Full details
|
|
- `STORY_3.1_QUICKSTART.md` - Quick reference
|
|
|
|
Test job config:
|
|
- `jobs/example_story_3.1_full_features.json`
|
|
|