name: Weekly Menu Scrape & Publish on: schedule: # Monday 8am EST = 13:00 UTC - cron: '0 13 * * 1' # Monday 8am EDT = 12:00 UTC - cron: '0 12 * * 1' workflow_dispatch: permissions: id-token: write contents: read jobs: scrape-and-publish: runs-on: ubuntu-latest env: AWS_REGION: us-east-1 steps: - uses: actions/checkout@v6 - uses: actions/setup-python@v5 with: python-version: '3.12' - name: Install dependencies run: | pip install playwright boto3 playwright install chromium --with-deps - name: Configure AWS credentials uses: aws-actions/configure-aws-credentials@v4 with: role-to-assume: ${{ secrets.AWS_DEPLOY_ROLE_ARN }} aws-region: us-east-1 - name: Scrape menu run: python3 src/scraper/scrape_menu.py - name: Get stack outputs id: stack run: | API_URL=$(aws cloudformation describe-stacks \ --stack-name meal-order-manager \ --query 'Stacks[0].Outputs[?OutputKey==`ApiUrl`].OutputValue' \ --output text) FORM_BUCKET=$(aws cloudformation describe-stacks \ --stack-name meal-order-manager \ --query 'Stacks[0].Outputs[?OutputKey==`FormBucketName`].OutputValue' \ --output text) DIST_ID=$(aws cloudformation describe-stacks \ --stack-name meal-order-manager \ --query 'Stacks[0].Outputs[?OutputKey==`DistributionId`].OutputValue' \ --output text) FORM_URL=$(aws cloudformation describe-stacks \ --stack-name meal-order-manager \ --query 'Stacks[0].Outputs[?OutputKey==`FormUrl`].OutputValue' \ --output text) echo "api_url=$API_URL" >> $GITHUB_OUTPUT echo "form_bucket=$FORM_BUCKET" >> $GITHUB_OUTPUT echo "dist_id=$DIST_ID" >> $GITHUB_OUTPUT echo "form_url=$FORM_URL" >> $GITHUB_OUTPUT - name: Get API key id: apikey run: | API_KEY=$(aws secretsmanager get-secret-value \ --secret-id meal-order-manager/form-api-key \ --query 'SecretString' --output text) echo "::add-mask::$API_KEY" echo "api_key=$API_KEY" >> $GITHUB_OUTPUT - name: Get discount settings id: discount run: | RESULT=$(aws dynamodb get-item \ --table-name meal-order-manager-orders \ --key '{"PK":{"S":"CONFIG"},"SK":{"S":"SETTINGS"}}' \ --output json 2>/dev/null || echo '{}') BULK=$(echo "$RESULT" | python3 -c " import sys, json d = json.load(sys.stdin) print(d.get('Item',{}).get('bulk_discount_percent',{}).get('N','0')) " 2>/dev/null || echo "0") SUBSIDY=$(echo "$RESULT" | python3 -c " import sys, json d = json.load(sys.stdin) print(d.get('Item',{}).get('company_subsidy_percent',{}).get('N','0')) " 2>/dev/null || echo "0") echo "bulk_discount=$BULK" >> $GITHUB_OUTPUT echo "company_subsidy=$SUBSIDY" >> $GITHUB_OUTPUT - name: Get Google Client ID id: google run: | GOOGLE_CLIENT_ID=$(aws ssm get-parameter \ --name /meal-order-manager/google-client-id \ --query 'Parameter.Value' \ --output text 2>/dev/null || echo "") if [ "$GOOGLE_CLIENT_ID" = "None" ] || [ -z "$GOOGLE_CLIENT_ID" ]; then GOOGLE_CLIENT_ID="" fi echo "client_id=$GOOGLE_CLIENT_ID" >> $GITHUB_OUTPUT - name: Generate order form run: | python3 src/server/generate_form.py \ --api-url "${{ steps.stack.outputs.api_url }}" \ --api-key "${{ steps.apikey.outputs.api_key }}" \ --bulk-discount "${{ steps.discount.outputs.bulk_discount }}" \ --company-subsidy "${{ steps.discount.outputs.company_subsidy }}" \ ${{ steps.google.outputs.client_id && format('--google-client-id "{0}"', steps.google.outputs.client_id) || '' }} - name: Upload menu to DynamoDB run: python3 scripts/upload_menu.py - name: Upload form to S3 run: | WEEK=$(date +%Y-W%U) aws s3 cp "output/order-form-$WEEK.html" \ "s3://${{ steps.stack.outputs.form_bucket }}/index.html" \ --content-type "text/html" \ --cache-control "no-cache" aws s3 cp "output/order-form-$WEEK.html" \ "s3://${{ steps.stack.outputs.form_bucket }}/archive/$WEEK.html" \ --content-type "text/html" - name: Invalidate CloudFront cache run: | aws cloudfront create-invalidation \ --distribution-id "${{ steps.stack.outputs.dist_id }}" \ --paths "/index.html" - name: Notify Slack run: python3 scripts/notify_slack.py "${{ steps.stack.outputs.form_url }}"