name: Deploy Dashboard to staging
on:
  push:
    tags:
      # Matches stable and pre-releases
      - "[0-9]+.[0-9]+.[0-9]+*"
  workflow_dispatch:
    inputs:
      git_ref:
        description: Git ref (tag, branch or commit hash) with helm chart to deploy
        required: true

jobs:
  build:
    runs-on: ubuntu-20.04
    env:
      API_URI: /graphql/
      APP_MOUNT_URI: /dashboard/
      STATIC_URL: /dashboard/static/
      SENTRY_ORG: saleor
      SENTRY_PROJECT: dashboard
      SENTRY_URL_PREFIX: "~/dashboard/static"
      SENTRY_DSN: ${{ secrets.SENTRY_DSN }}
      SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
      APPS_MARKETPLACE_API_URI: "https://apps.staging.saleor.io/api/v2/saleor-apps"
      VERSION: ${{ github.event.inputs.git_ref || github.ref_name }}
      IS_CLOUD_INSTANCE: true
    steps:
      - uses: actions/checkout@v2
        with:
          ref: ${{ env.VERSION }}

      - name: Set environment
        # Convert version into staging deployment name (e.g 3.3.0 -> saleor-staging-v33)
        run: |
          set -x
          environment=$(echo $VERSION | sed -n 's#\([0-9]\+\).\([0-9]\+\).*#saleor-staging-v\1\2#p')
          echo "ENVIRONMENT=${environment}" >> $GITHUB_ENV

      - name: Setup Node
        uses: actions/setup-node@v3
        with:
          node-version-file: ".nvmrc"

      - name: Package
        timeout-minutes: 15
        run: |
          npm ci

      - name: Build
        run: |
          npm run build

      - name: Configure AWS Credentials
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_DASHBOARD_STAGING_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_DASHBOARD_STAGING_SECRET_ACCESS_KEY }}
          aws-region: us-east-1

      - name: Deploy
        run: |
          aws s3 sync build/dashboard s3://${{ secrets.AWS_STAGING_DEPLOYMENT_BUCKET }}/${ENVIRONMENT}/static/
          aws s3 cp build/dashboard/index.html s3://${{ secrets.AWS_STAGING_DEPLOYMENT_BUCKET }}/${ENVIRONMENT}/
          for i in {1..3}; do aws cloudfront create-invalidation --distribution-id ${{ secrets.AWS_STAGING_CF_DIST_ID }} --paths "/dashboard*" && break || sleep 5; done

      - name: Prepare Sandbox release pull request
        run: |
          export GITHUB_TOKEN=$( \
            curl --request GET --url ${{ secrets.VAULT_URL}} --header "Authorization: JWT ${{ secrets.VAULT_JWT }}" | jq -r .token \
          )
          gh api /repos/saleor/saleor-cloud-deployments/dispatches \
            --input - <<< '{
              "event_type": "open-release-pull-request",
              "client_payload": {
                "project": "DASHBOARD",
                "environment": "SANDBOX",
                "version": "${{ env.VERSION }}"
              }
            }'

      - name: Notify Slack
        if: ${{ always() }}
        env:
          JOB_DEPLOYMENT_KIND: staging
          JOB_STATUS: ${{ job.status }}
          SLACK_WEBHOOK_URL: ${{ secrets.SLACK_CLOUD_DEPLOYMENTS_WEBHOOK_URL }}
          JOB_TITLE: "Dashboard deployment to ${{ env.ENVIRONMENT }}"
        run: |
          python3 ./.github/workflows/notify/notify-slack.py
