upskill-event-manager/wordpress-dev/bin/manage-db.sh
bengizmo d1509b3d60 feat(dev-env): implement backup-based development workflow
This commit introduces a more reliable and consistent approach to setting up
the development environment using backups:

- Add setup-from-backup.sh script for environment setup from existing backups
- Standardize script naming and organization
- Move obsolete scripts to bin/obsolete directory
- Update documentation with new workflow instructions
- Create migration guide for transitioning to new workflow
- Update Memory Bank with workflow improvements

The new workflow provides:
- More reliable environment setup
- Faster setup process
- Offline development capability
- Consistent development environments across team members

Breaking changes:
- setup-dev.sh is replaced by setup-from-backup.sh
- sync-and-setup.sh is replaced by separate scripts
- verify-with-wpcli.sh is no longer used

Migration path is documented in MIGRATION_GUIDE.md
2025-03-26 11:26:18 -03:00

303 lines
No EOL
11 KiB
Bash
Executable file

#!/bin/bash
# Load environment variables from current directory
if [ ! -f .env ]; then
echo "Error: .env file not found in current directory!"
exit 1
fi
source .env
# Colors for output
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
NC='\033[0m'
# Default values
SKIP_CONFIRM=false
# Function to check if a command was successful
check_status() {
if [ $? -eq 0 ]; then
echo -e "${GREEN}$1${NC}"
return 0
else
echo -e "${RED}$1${NC}"
return 1
fi
}
# Function to show usage
show_usage() {
echo "Usage: $0 {backup|restore <backup_file>|reset|generate-test-data [type]|cleanup-test-data}"
echo ""
echo "Commands:"
echo " backup Create a backup of the development database"
echo " restore FILE Restore database from a backup file"
echo " reset Reset the development database"
echo " generate-test-data Generate test data (default: basic)"
echo " cleanup-test-data Remove all test data"
echo ""
echo "Test Data Types:"
echo " basic Basic test data (1 trainer, 1 event)"
echo " extended Extended test data (multiple trainers, events)"
echo " stress Large dataset for stress testing"
echo ""
echo "Options:"
echo " -y, --yes Skip confirmation prompts"
echo " -h, --help Show this help message"
}
# Function to backup development database
backup_dev_db() {
local backup_file="backups/dev_db_$(date +%Y%m%d_%H%M%S).sql"
mkdir -p backups
echo "Backing up development database..."
docker-compose exec -T db mysqldump -u"$DEV_DB_USER" -p"$DEV_DB_PASSWORD" "$DEV_DB_NAME" > "$backup_file"
check_status "Database backup" || exit 1
echo "Backup saved to: $backup_file"
}
# Function to restore development database
restore_dev_db() {
local backup_file=$1
if [ ! -f "$backup_file" ]; then
echo -e "${RED}Error: Backup file not found: $backup_file${NC}"
exit 1
fi
echo "Restoring development database..."
cat "$backup_file" | docker-compose exec -T db mysql -u"$DEV_DB_USER" -p"$DEV_DB_PASSWORD" "$DEV_DB_NAME"
check_status "Database restore" || exit 1
}
# Function to reset development database
reset_dev_db() {
echo "Resetting development database..."
docker-compose exec db mysql -u"$DEV_DB_USER" -p"$DEV_DB_PASSWORD" -e "DROP DATABASE IF EXISTS $DEV_DB_NAME; CREATE DATABASE $DEV_DB_NAME;"
check_status "Database reset" || exit 1
}
# Function to generate test data
generate_test_data() {
local data_type=${1:-"basic"}
echo "Generating ${data_type} test data..."
# Create test users based on data type
case "$data_type" in
basic)
echo "Creating basic test data..."
# Create test trainer
docker-compose exec wordpress wp user create test_trainer test.trainer@example.com \
--role=author --user_pass=SecurePass123! --allow-root
check_status "Test trainer creation"
# Create test event
EVENT_ID=$(docker-compose exec wordpress wp post create \
--post_type=tribe_events \
--post_title="Test HVAC Training Event" \
--post_content="This is a test training event for HVAC professionals." \
--post_status=publish \
--post_author=test_trainer \
--porcelain \
--allow-root)
check_status "Test event creation"
# Set event metadata
docker-compose exec wordpress wp post meta update $EVENT_ID _EventStartDate "$(date -v+1d '+%Y-%m-%d 10:00:00')" --allow-root
docker-compose exec wordpress wp post meta update $EVENT_ID _EventEndDate "$(date -v+1d '+%Y-%m-%d 16:00:00')" --allow-root
docker-compose exec wordpress wp post meta update $EVENT_ID _EventVenueID "1" --allow-root
check_status "Event metadata setup"
# Create test ticket
docker-compose exec wordpress wp post create \
--post_type=tribe_rsvp \
--post_title="Standard Ticket" \
--post_parent=$EVENT_ID \
--post_status=publish \
--meta_input='{"_price": "99.99", "_stock": "50"}' \
--allow-root
check_status "Test ticket creation"
;;
extended)
echo "Creating extended test data..."
# Create multiple trainers
for i in {1..3}; do
docker-compose exec wordpress wp user create "trainer_${i}" "trainer${i}@example.com" \
--role=author --user_pass=SecurePass123! --allow-root
check_status "Trainer ${i} creation"
# Create multiple events for each trainer
for j in {1..3}; do
EVENT_ID=$(docker-compose exec wordpress wp post create \
--post_type=tribe_events \
--post_title="HVAC Training ${i}-${j}" \
--post_content="Extended test training event ${j} by trainer ${i}." \
--post_status=publish \
--post_author="trainer_${i}" \
--porcelain \
--allow-root)
# Set event metadata with different dates
START_DATE=$(date -v+${j}d '+%Y-%m-%d 10:00:00')
END_DATE=$(date -v+${j}d '+%Y-%m-%d 16:00:00')
docker-compose exec wordpress wp post meta update $EVENT_ID _EventStartDate "$START_DATE" --allow-root
docker-compose exec wordpress wp post meta update $EVENT_ID _EventEndDate "$END_DATE" --allow-root
docker-compose exec wordpress wp post meta update $EVENT_ID _EventVenueID "$j" --allow-root
# Create tickets with different prices
docker-compose exec wordpress wp post create \
--post_type=tribe_rsvp \
--post_title="Early Bird Ticket" \
--post_parent=$EVENT_ID \
--post_status=publish \
--meta_input="{\"_price\": \"79.99\", \"_stock\": \"20\"}" \
--allow-root
docker-compose exec wordpress wp post create \
--post_type=tribe_rsvp \
--post_title="Regular Ticket" \
--post_parent=$EVENT_ID \
--post_status=publish \
--meta_input="{\"_price\": \"99.99\", \"_stock\": \"30\"}" \
--allow-root
done
done
;;
stress)
echo "Creating stress test data..."
# Create many trainers and events for load testing
for i in {1..10}; do
docker-compose exec wordpress wp user create "stress_trainer_${i}" "stress${i}@example.com" \
--role=author --user_pass=SecurePass123! --allow-root
# Create many events per trainer
for j in {1..10}; do
EVENT_ID=$(docker-compose exec wordpress wp post create \
--post_type=tribe_events \
--post_title="Stress Test Event ${i}-${j}" \
--post_content="Stress test training event ${j} by trainer ${i}." \
--post_status=publish \
--post_author="stress_trainer_${i}" \
--porcelain \
--allow-root)
START_DATE=$(date -v+${j}d '+%Y-%m-%d 10:00:00')
END_DATE=$(date -v+${j}d '+%Y-%m-%d 16:00:00')
docker-compose exec wordpress wp post meta update $EVENT_ID _EventStartDate "$START_DATE" --allow-root
docker-compose exec wordpress wp post meta update $EVENT_ID _EventEndDate "$END_DATE" --allow-root
docker-compose exec wordpress wp post meta update $EVENT_ID _EventVenueID "1" --allow-root
# Create multiple ticket types
for k in {1..3}; do
docker-compose exec wordpress wp post create \
--post_type=tribe_rsvp \
--post_title="Ticket Type ${k}" \
--post_parent=$EVENT_ID \
--post_status=publish \
--meta_input="{\"_price\": \"${k}9.99\", \"_stock\": \"${k}0\"}" \
--allow-root
done
done
done
;;
*)
echo -e "${RED}Error: Invalid test data type. Use 'basic', 'extended', or 'stress'${NC}"
exit 1
;;
esac
echo -e "${GREEN}Test data generation completed!${NC}"
}
# Function to cleanup test data
cleanup_test_data() {
echo "Cleaning up test data..."
# Remove test events
docker-compose exec wordpress wp post delete $(docker-compose exec wordpress wp post list --post_type=tribe_events --format=ids --allow-root) --force --allow-root
check_status "Event cleanup"
# Remove test tickets
docker-compose exec wordpress wp post delete $(docker-compose exec wordpress wp post list --post_type=tribe_rsvp --format=ids --allow-root) --force --allow-root
check_status "Ticket cleanup"
# Remove test users
docker-compose exec wordpress wp user delete $(docker-compose exec wordpress wp user list --role=author --format=ids --allow-root) --yes --allow-root
check_status "User cleanup"
echo -e "${GREEN}Test data cleanup completed!${NC}"
}
# Function to confirm action
confirm_action() {
if [ "$SKIP_CONFIRM" = true ]; then
return 0
fi
read -p "$1 [y/N] " -n 1 -r
echo
[[ $REPLY =~ ^[Yy]$ ]]
}
# Parse command line options
while [[ $# -gt 0 ]]; do
case "$1" in
backup)
backup_dev_db
exit 0
;;
restore)
if [ -z "$2" ]; then
echo "Error: Please specify backup file to restore"
show_usage
exit 1
fi
restore_dev_db "$2"
exit 0
;;
reset)
if confirm_action "${YELLOW}Warning: This will delete all data in the development database. Continue?${NC}"; then
reset_dev_db
fi
exit 0
;;
generate-test-data)
shift
data_type=${1:-"basic"}
if confirm_action "Generate ${data_type} test data?"; then
generate_test_data "$data_type"
fi
exit 0
;;
cleanup-test-data)
if confirm_action "${YELLOW}Warning: This will remove all test data. Continue?${NC}"; then
cleanup_test_data
fi
exit 0
;;
-y|--yes)
SKIP_CONFIRM=true
shift
;;
-h|--help)
show_usage
exit 0
;;
*)
echo "Error: Unknown command '$1'"
show_usage
exit 1
;;
esac
done
# Show usage if no command provided
show_usage
exit 1