mirror of
https://github.com/mblanke/holiday-travel-app.git
synced 2026-03-01 05:20:22 -05:00
Initial commit: Holiday Travel App with resort comparison, trip management, and multi-provider search
This commit is contained in:
348
TERMINAL_USAGE_GUIDE.md
Normal file
348
TERMINAL_USAGE_GUIDE.md
Normal file
@@ -0,0 +1,348 @@
|
||||
# Holiday Travel App - Terminal Usage Guide
|
||||
|
||||
This guide shows you how to use the Holiday Travel App **entirely from the terminal** using PowerShell commands (no web browser needed).
|
||||
|
||||
## Prerequisites
|
||||
|
||||
Make sure the development server is running:
|
||||
```powershell
|
||||
cd "d:\Projects\Dev\Holiday Travel App"
|
||||
npm run dev
|
||||
```
|
||||
|
||||
The server will be available at `http://localhost:4000`
|
||||
|
||||
---
|
||||
|
||||
## Example 1: Basic Caribbean Search
|
||||
|
||||
Search for flights from Ottawa to Caribbean destinations for a holiday trip:
|
||||
|
||||
```powershell
|
||||
# Create the search criteria
|
||||
$searchData = @{
|
||||
origin = "YOW"
|
||||
destinations = @("CUN", "PUJ", "MBJ") # Cancun, Punta Cana, Montego Bay
|
||||
startDate = "2025-12-15"
|
||||
endDate = "2026-01-15"
|
||||
tripLengthMin = 5
|
||||
tripLengthMax = 9
|
||||
budget = 1000
|
||||
currency = "CAD"
|
||||
nonStopOnly = $false
|
||||
sources = @("Deals", "Skyscanner", "GoogleFlights", "AirCanada")
|
||||
} | ConvertTo-Json -Depth 3
|
||||
|
||||
# Send the request
|
||||
$response = Invoke-RestMethod -Uri "http://localhost:4000/api/search" -Method POST -Body $searchData -ContentType "application/json"
|
||||
|
||||
# View all results
|
||||
$response.results
|
||||
|
||||
# View just the first 5 results
|
||||
$response.results | Select-Object -First 5 | Format-Table title, source, price, nights
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Example 2: Budget-Friendly European Search
|
||||
|
||||
Looking for cheap flights to Europe with non-stop preference:
|
||||
|
||||
```powershell
|
||||
$euroSearch = @{
|
||||
origin = "YYZ" # Toronto
|
||||
destinations = @("LHR", "CDG", "FCO", "BCN") # London, Paris, Rome, Barcelona
|
||||
startDate = "2026-06-01"
|
||||
endDate = "2026-07-15"
|
||||
tripLengthMin = 7
|
||||
tripLengthMax = 14
|
||||
budget = 800
|
||||
currency = "CAD"
|
||||
nonStopOnly = $true
|
||||
sources = @("Deals", "Skyscanner", "GoogleFlights", "AirCanada")
|
||||
} | ConvertTo-Json -Depth 3
|
||||
|
||||
$euroResults = Invoke-RestMethod -Uri "http://localhost:4000/api/search" -Method POST -Body $euroSearch -ContentType "application/json"
|
||||
|
||||
# Show only deals under $750
|
||||
$euroResults.results | Where-Object { $_.price -lt 750 } | Format-Table
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Example 3: Quick Weekend Getaway
|
||||
|
||||
Short trips, flexible on destinations:
|
||||
|
||||
```powershell
|
||||
$weekendSearch = @{
|
||||
origin = "YUL" # Montreal
|
||||
destinations = @("NYC", "BOS", "YYZ", "YOW") # New York, Boston, Toronto, Ottawa
|
||||
startDate = "2025-11-15"
|
||||
endDate = "2025-12-15"
|
||||
tripLengthMin = 2
|
||||
tripLengthMax = 4
|
||||
currency = "CAD"
|
||||
nonStopOnly = $false
|
||||
sources = @("Skyscanner", "GoogleFlights", "AirCanada")
|
||||
} | ConvertTo-Json -Depth 3
|
||||
|
||||
$weekendResults = Invoke-RestMethod -Uri "http://localhost:4000/api/search" -Method POST -Body $weekendSearch -ContentType "application/json"
|
||||
|
||||
# Display results grouped by destination
|
||||
$weekendResults.results | Group-Object destination | Format-Table Count, Name
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Example 4: Deal Sites Only (No Link Generation)
|
||||
|
||||
Only fetch from curated deal sites like YOWDeals, YYZDeals, etc.:
|
||||
|
||||
```powershell
|
||||
$dealsOnly = @{
|
||||
origin = "YVR" # Vancouver
|
||||
destinations = @("HNL", "LAX", "SEA") # Hawaii, LA, Seattle
|
||||
startDate = "2026-02-01"
|
||||
endDate = "2026-03-31"
|
||||
tripLengthMin = 5
|
||||
tripLengthMax = 10
|
||||
sources = @("Deals") # Only deal sites
|
||||
} | ConvertTo-Json -Depth 3
|
||||
|
||||
$dealsResults = Invoke-RestMethod -Uri "http://localhost:4000/api/search" -Method POST -Body $dealsOnly -ContentType "application/json"
|
||||
|
||||
$dealsResults.results | Format-List
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Example 5: Export Results to CSV
|
||||
|
||||
Save search results to a CSV file for further analysis:
|
||||
|
||||
```powershell
|
||||
$searchData = @{
|
||||
origin = "YYC" # Calgary
|
||||
destinations = @("LAX", "LAS", "PHX")
|
||||
startDate = "2026-01-15"
|
||||
endDate = "2026-02-28"
|
||||
tripLengthMin = 5
|
||||
tripLengthMax = 7
|
||||
budget = 600
|
||||
currency = "CAD"
|
||||
sources = @("Skyscanner", "GoogleFlights")
|
||||
} | ConvertTo-Json -Depth 3
|
||||
|
||||
$results = Invoke-RestMethod -Uri "http://localhost:4000/api/search" -Method POST -Body $searchData -ContentType "application/json"
|
||||
|
||||
# Export to CSV
|
||||
$results.results | Export-Csv -Path "travel_deals_$(Get-Date -Format 'yyyy-MM-dd').csv" -NoTypeInformation
|
||||
|
||||
Write-Host "Results exported to travel_deals_$(Get-Date -Format 'yyyy-MM-dd').csv"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Example 6: Filter and Sort Results
|
||||
|
||||
Advanced filtering and sorting:
|
||||
|
||||
```powershell
|
||||
$searchData = @{
|
||||
origin = "YOW"
|
||||
destinations = @("MCO", "FLL", "TPA") # Orlando, Fort Lauderdale, Tampa
|
||||
startDate = "2026-03-01"
|
||||
endDate = "2026-04-15"
|
||||
tripLengthMin = 6
|
||||
tripLengthMax = 9
|
||||
currency = "CAD"
|
||||
sources = @("Deals", "Skyscanner", "GoogleFlights", "AirCanada")
|
||||
} | ConvertTo-Json -Depth 3
|
||||
|
||||
$results = Invoke-RestMethod -Uri "http://localhost:4000/api/search" -Method POST -Body $searchData -ContentType "application/json"
|
||||
|
||||
# Filter: Only show results with prices
|
||||
$withPrices = $results.results | Where-Object { $null -ne $_.price }
|
||||
|
||||
# Sort by price (cheapest first)
|
||||
$sortedByPrice = $withPrices | Sort-Object price
|
||||
|
||||
# Display top 10 cheapest
|
||||
$sortedByPrice | Select-Object -First 10 | Format-Table title, price, currency, nights, source
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Example 7: Compare Multiple Sources
|
||||
|
||||
Get results and compare which source provides the most deals:
|
||||
|
||||
```powershell
|
||||
$compareSearch = @{
|
||||
origin = "YEG" # Edmonton
|
||||
destinations = @("YVR", "YYC", "YWG")
|
||||
startDate = "2025-12-01"
|
||||
endDate = "2026-01-31"
|
||||
tripLengthMin = 3
|
||||
tripLengthMax = 5
|
||||
sources = @("Skyscanner", "GoogleFlights", "AirCanada")
|
||||
} | ConvertTo-Json -Depth 3
|
||||
|
||||
$compareResults = Invoke-RestMethod -Uri "http://localhost:4000/api/search" -Method POST -Body $compareSearch -ContentType "application/json"
|
||||
|
||||
# Count results by source
|
||||
$compareResults.results | Group-Object source | Select-Object Name, Count | Sort-Object Count -Descending
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Example 8: Use with cURL (Alternative to PowerShell)
|
||||
|
||||
If you prefer using `curl` in PowerShell:
|
||||
|
||||
```powershell
|
||||
curl.exe -X POST "http://localhost:4000/api/search" `
|
||||
-H "Content-Type: application/json" `
|
||||
-d '{
|
||||
"origin": "YOW",
|
||||
"destinations": ["CUN", "PUJ"],
|
||||
"startDate": "2025-12-20",
|
||||
"endDate": "2026-01-10",
|
||||
"tripLengthMin": 7,
|
||||
"tripLengthMax": 10,
|
||||
"budget": 900,
|
||||
"currency": "CAD",
|
||||
"sources": ["Deals", "Skyscanner"]
|
||||
}'
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Understanding the Response
|
||||
|
||||
The API returns JSON with this structure:
|
||||
|
||||
```json
|
||||
{
|
||||
"results": [
|
||||
{
|
||||
"id": "unique-id",
|
||||
"title": "Ottawa → Cancun (7 nights)",
|
||||
"source": "Skyscanner Link",
|
||||
"link": "https://www.skyscanner.ca/...",
|
||||
"price": 685,
|
||||
"currency": "CAD",
|
||||
"startDate": "2025-12-20",
|
||||
"endDate": "2025-12-27",
|
||||
"nights": 7,
|
||||
"origin": "YOW",
|
||||
"destination": "CUN",
|
||||
"stops": null,
|
||||
"score": 9815
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Available Airport Codes (Examples)
|
||||
|
||||
- **Canada**: YOW (Ottawa), YYZ (Toronto), YUL (Montreal), YVR (Vancouver), YYC (Calgary), YEG (Edmonton)
|
||||
- **USA**: NYC (New York), LAX (Los Angeles), MIA (Miami), ORD (Chicago), SEA (Seattle)
|
||||
- **Caribbean**: CUN (Cancun), PUJ (Punta Cana), MBJ (Montego Bay), NAS (Nassau)
|
||||
- **Europe**: LHR (London), CDG (Paris), FCO (Rome), BCN (Barcelona), AMS (Amsterdam)
|
||||
|
||||
---
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
**Server not responding?**
|
||||
```powershell
|
||||
# Check if server is running
|
||||
Get-Process -Name node -ErrorAction SilentlyContinue
|
||||
|
||||
# Restart the server if needed
|
||||
cd "d:\Projects\Dev\Holiday Travel App"
|
||||
npm run dev
|
||||
```
|
||||
|
||||
**Invalid date format?**
|
||||
- Dates must be in `YYYY-MM-DD` format (e.g., "2025-12-31")
|
||||
|
||||
**No results returned?**
|
||||
- Try removing budget constraints
|
||||
- Set `nonStopOnly` to `$false`
|
||||
- Expand the date range
|
||||
- Add more destination options
|
||||
|
||||
---
|
||||
|
||||
## Tips for Best Results
|
||||
|
||||
1. **Multiple Destinations**: Add 3-5 destination codes for more options
|
||||
2. **Flexible Dates**: Wider date ranges (30-60 days) yield more results
|
||||
3. **Trip Length Range**: Use a range (e.g., 5-9 nights) instead of exact days
|
||||
4. **Mix Sources**: Enable all sources for comprehensive results
|
||||
5. **Budget Buffer**: Set budget 10-15% higher than your actual limit
|
||||
6. **Off-Peak Travel**: Search for shoulder seasons for better deals
|
||||
|
||||
---
|
||||
|
||||
## Automation Example
|
||||
|
||||
Create a scheduled task to search daily and email results:
|
||||
|
||||
```powershell
|
||||
# search_and_notify.ps1
|
||||
$searchData = @{
|
||||
origin = "YOW"
|
||||
destinations = @("CUN", "PUJ", "MBJ")
|
||||
startDate = "2026-01-15"
|
||||
endDate = "2026-02-28"
|
||||
tripLengthMin = 7
|
||||
tripLengthMax = 10
|
||||
budget = 800
|
||||
currency = "CAD"
|
||||
sources = @("Deals")
|
||||
} | ConvertTo-Json -Depth 3
|
||||
|
||||
$results = Invoke-RestMethod -Uri "http://localhost:4000/api/search" -Method POST -Body $searchData -ContentType "application/json"
|
||||
|
||||
# Get deals under $750
|
||||
$goodDeals = $results.results | Where-Object { $_.price -lt 750 }
|
||||
|
||||
if ($goodDeals.Count -gt 0) {
|
||||
$goodDeals | Export-Csv -Path "good_deals.csv" -NoTypeInformation
|
||||
Write-Host "Found $($goodDeals.Count) deals under $750!"
|
||||
# Add email notification here if needed
|
||||
}
|
||||
```
|
||||
|
||||
Run with Task Scheduler:
|
||||
```powershell
|
||||
$trigger = New-ScheduledTaskTrigger -Daily -At 9am
|
||||
$action = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-File C:\path\to\search_and_notify.ps1"
|
||||
Register-ScheduledTask -TaskName "DailyTravelDeals" -Trigger $trigger -Action $action
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Docker Usage
|
||||
|
||||
If using Docker instead of local dev server:
|
||||
|
||||
```powershell
|
||||
# Build and run
|
||||
docker compose up -d
|
||||
|
||||
# Then use the same API calls as above
|
||||
$searchData = @{ ... } | ConvertTo-Json -Depth 3
|
||||
$response = Invoke-RestMethod -Uri "http://localhost:4000/api/search" -Method POST -Body $searchData -ContentType "application/json"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
Enjoy finding your next holiday deal from the command line! 🏖️✈️
|
||||
Reference in New Issue
Block a user