#!/bin/sh set -eu ROOT=$(CDPATH='' cd -- "$(dirname -- "$0")/.." && pwd) EXPECTED_ROOT=/srv/who_need_help-production EXPECTED_PROJECT=who_need_help_production EXPECTED_ORIGIN=https://whoneedhelp.com if [ "$#" -ne 5 ] || { [ "$3" != "--check-only" ] && [ "$3" != "--confirm" ]; } || [ "$4" != "whoneedhelp.com" ]; then echo "Usage: $0 REVIEWER_EMAIL COUNTERPART_EMAIL --check-only whoneedhelp.com ENV_FILE" >&2 echo " $0 REVIEWER_EMAIL COUNTERPART_EMAIL --confirm whoneedhelp.com ENV_FILE" >&2 echo "Both existing accounts must be active, confirmed, password-enabled, and non-staff." >&2 exit 1 fi REVIEWER_EMAIL=$1 COUNTERPART_EMAIL=$2 ACTION=$3 ENV_FILE=$5 if [ "$(realpath --canonicalize-existing "$ROOT")" != "$EXPECTED_ROOT" ]; then echo "Play review fixtures must run from $EXPECTED_ROOT." >&2 exit 1 fi if [ ! -f "$ENV_FILE" ]; then echo "Environment file does not exist: $ENV_FILE" >&2 exit 1 fi read_env() { key=$1 awk -F= -v key="$key" ' $1 == key { value = substr($0, index($0, "=") + 1) sub(/\r$/, "", value) if ((value ~ /^".*"$/) || (value ~ /^\047.*\047$/)) { value = substr(value, 2, length(value) - 2) } count++ } END { if (count == 1) print value else exit 1 } ' "$ENV_FILE" } if [ "$(read_env DEPLOYMENT_ENV)" != production ]; then echo "Play review fixtures may only target DEPLOYMENT_ENV=production." >&2 exit 1 fi project=$(read_env COMPOSE_PROJECT_NAME) if [ "$project" != "$EXPECTED_PROJECT" ]; then echo "Unexpected production Compose project: $project" >&2 exit 1 fi if [ "$(read_env WNH_BASE_URL)" != "$EXPECTED_ORIGIN" ]; then echo "Production origin must be $EXPECTED_ORIGIN." >&2 exit 1 fi container=$("$ROOT/scripts/compose.sh" "$ENV_FILE" ps -q app | head -n 1) if [ -z "$container" ]; then container=$("$ROOT/scripts/compose.sh" "$ENV_FILE" ps -q web | head -n 1) fi if [ -z "$container" ]; then echo "No running production app or web container was found for project $project." >&2 exit 1 fi expected_image=$(read_env APP_IMAGE) observed_image=$(docker inspect --format '{{.Config.Image}}' "$container") container_state=$(docker inspect --format '{{.State.Status}}' "$container") container_health=$(docker inspect --format '{{if .State.Health}}{{.State.Health.Status}}{{else}}none{{end}}' "$container") if [ "$observed_image" != "$expected_image" ]; then echo "Running container image does not match APP_IMAGE." >&2 exit 1 fi if [ "$container_state" != running ] || [ "$container_health" != healthy ]; then echo "Production application container is not running and healthy." >&2 exit 1 fi encode() { printf %s "$1" | base64 | tr -d '\n' } reviewer=$(encode "$REVIEWER_EMAIL") counterpart=$(encode "$COUNTERPART_EMAIL") if [ "$ACTION" = "--check-only" ]; then expression="case WhoNeedHelp.Release.play_review_readiness(Base.decode64!(\"$reviewer\"), Base.decode64!(\"$counterpart\")) do {:ok, result} -> IO.inspect(%{reviewer_id: result.reviewer.id, counterpart_id: result.counterpart.id, medicine_category_id: result.medicine_category.id, cinema_category_id: result.cinema_category.id}, label: :play_review_ready); {:error, reason} -> raise \"Play review readiness failed: #{inspect(reason)}\" end" else expression="case WhoNeedHelp.Release.prepare_play_review(Base.decode64!(\"$reviewer\"), Base.decode64!(\"$counterpart\")) do {:ok, result} -> IO.inspect(result); {:error, reason} -> raise \"Play review preparation failed: #{inspect(reason)}\" end" fi docker exec "$container" /app/bin/who_need_help rpc "$expression"