diff --git a/.github/workflows/open-slack-channel.yaml b/.github/workflows/open-slack-channel.yaml new file mode 100644 index 000000000000..d5a2c438c3fb --- /dev/null +++ b/.github/workflows/open-slack-channel.yaml @@ -0,0 +1,110 @@ +name: Open Slack Channel +on: + workflow_dispatch: + inputs: + channel_name: + description: Name of the public or private channel to create. + required: true + type: string + is_private: + description: Create a private channel instead of a public one. + required: false + type: boolean + members: + description: Add members manually to the channel. + type: array + required: false + port_context: + description: Details of the action and general port_context (blueprint, run ID, entity identifier from Port, etc...). + required: true + +jobs: + open-slack-channel: + runs-on: ubuntu-latest + steps: + - name: Log Executing Request to Open Channel + uses: port-labs/port-github-action@v1 + with: + clientId: ${{ secrets.PORT_CLIENT_ID }} + clientSecret: ${{ secrets.PORT_CLIENT_SECRET }} + baseUrl: https://api.getport.io + operation: PATCH_RUN + runId: ${{ fromJson(github.event.inputs.port_context).runId }} + logMessage: "About to create a conversation channel in slack..." + + - name: Create Slack Channel + id: create_channel + env: + SLACK_TOKEN: ${{ secrets.BOT_USER_OAUTH_TOKEN }} + run: | + response=$(curl -s -X POST "https://slack.com/api/conversations.create" \ + -H "Authorization: Bearer $SLACK_TOKEN" \ + -H "Content-Type: application/json" \ + --data "{\"name\": \"${{ github.event.inputs.channel_name }}\",\"is_private\": ${{ github.event.inputs.is_private }} }") + + echo "API Response: $response" + + if [[ "$(echo $response | jq -r '.ok')" == "true" ]]; then + channel_id=$(echo $response | jq -r '.channel.id') + echo "Channel ID: $channel_id" + echo "CHANNEL_ID=$channel_id" >> $GITHUB_ENV + + else + echo "Failed to create Slack channel. Channel ID is null." + error=$(echo $response | jq -r '.error') + error_message="${error//_/ }" + echo "Error: $error_message" + echo "CREATE_CHANNEL_ERROR=$error_message" >> $GITHUB_ENV + exit 1 + fi + + - name: Log If Create Channel Request Fails + if: failure() + uses: port-labs/port-github-action@v1 + with: + clientId: ${{ secrets.PORT_CLIENT_ID }} + clientSecret: ${{ secrets.PORT_CLIENT_SECRET }} + baseUrl: https://api.getport.io + operation: PATCH_RUN + runId: ${{ fromJson(github.event.inputs.port_context).runId }} + logMessage: "Failed to create slack channel: ${{env.CREATE_CHANNEL_ERROR}} ❌" + + - name: Log If Create Channel Request is Successful + uses: port-labs/port-github-action@v1 + with: + clientId: ${{ secrets.PORT_CLIENT_ID }} + clientSecret: ${{ secrets.PORT_CLIENT_SECRET }} + baseUrl: https://api.getport.io + operation: PATCH_RUN + runId: ${{ fromJson(github.event.inputs.port_context).runId }} + logMessage: "Channel created successfully, channel Id: ${{env.CHANNEL_ID}} ✅" + + - name: Checkout code + uses: actions/checkout@v4 + + - name: Add Members to Slack Channel + id: add_members + if: success() + env: + SLACK_TOKEN: ${{ secrets.BOT_USER_OAUTH_TOKEN }} + CHANNEL_ID: ${{env.CHANNEL_ID}} + CLIENT_ID: ${{ secrets.PORT_CLIENT_ID }} + CLIENT_SECRET: ${{ secrets.PORT_CLIENT_SECRET }} + RUN_ID: ${{ fromJson(github.event.inputs.port_context).runId }} + MEMBER_EMAILS: ${{ toJSON(github.event.inputs.members) }} + run: | + cd slack + chmod +x add-members-to-channel.sh + bash add-members-to-channel.sh "$SLACK_TOKEN" "$CHANNEL_ID" "$CLIENT_ID" "$CLIENT_SECRET" "$RUN_ID" "$MEMBER_EMAILS" + + - name: Log Successful Action + if: steps.add_members.outcome == 'failure' + uses: port-labs/port-github-action@v1 + with: + clientId: ${{ secrets.PORT_CLIENT_ID }} + clientSecret: ${{ secrets.PORT_CLIENT_SECRET }} + baseUrl: https://api.getport.io + operation: PATCH_RUN + status: "FAILURE" + runId: ${{ fromJson(github.event.inputs.port_context).runId }} + logMessage: "Failed to add members to channel ❌" diff --git a/DIRECTORY.md b/DIRECTORY.md index 00f4bb4ef2b2..dfecc9cfe584 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -443,6 +443,7 @@ * [Present Value](financial/present_value.py) * [Price Plus Tax](financial/price_plus_tax.py) * [Simple Moving Average](financial/simple_moving_average.py) + * [Straight Line Depreciation](financial/straight_line_depreciation.py) * [Time And Half Pay](financial/time_and_half_pay.py) ## Fractals diff --git a/aviv b/aviv new file mode 100644 index 000000000000..8c25511eb368 --- /dev/null +++ b/aviv @@ -0,0 +1 @@ +Hello you diff --git a/slack/README.md b/slack/README.md new file mode 100644 index 000000000000..5e57c8cd4988 --- /dev/null +++ b/slack/README.md @@ -0,0 +1 @@ +BLABLA diff --git a/slack/add-members-to-channel.sh b/slack/add-members-to-channel.sh new file mode 100644 index 000000000000..9c039697c5a0 --- /dev/null +++ b/slack/add-members-to-channel.sh @@ -0,0 +1,76 @@ +#!/bin/bash + +# Assign arguments to variables +SLACK_TOKEN=$1 +CHANNEL_ID=$2 +clientId=$3 +clientSecret=$4 +run_id=$5 +MEMBER_EMAILS_JSON=$6 + +# Get the Port access token +PORT_TOKEN_RESPONSE=$(curl -s -X 'POST' \ + 'https://api.getport.io/v1/auth/access_token' \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + -d "{ + \"clientId\": \"$clientId\", + \"clientSecret\": \"$clientSecret\" + }" + ) + +echo $PORT_TOKEN_RESPONSE +PORT_ACCESS_TOKEN=$(echo $PORT_TOKEN_RESPONSE | jq -r '.accessToken') + +# Ensure the access token was obtained successfully +if [ -z "$PORT_ACCESS_TOKEN" ] || [ "$PORT_ACCESS_TOKEN" == "null" ]; then + error_message="Failed to obtain Port access token ❌" + echo $error_message + report_error "$error_message" + exit 1 +fi + +# Function to report error +report_error() { + local message=$1 + echo $message + echo "ADD_MEMBER_TO_CHANNEL_ERROR=$message" >> $GITHUB_ENV + curl -s -X POST "https://api.getport.io/v1/actions/runs/$run_id/logs" \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer $PORT_ACCESS_TOKEN" \ + -d "{\"message\": \"$message\"}" +} + +user_ids="" + +# Convert MEMBER_EMAILS_JSON to an array +readarray -t MEMBER_EMAILS < <(echo $MEMBER_EMAILS_JSON | jq -r 'fromjson | .[]') + +for email in "${MEMBER_EMAILS[@]}"; do + user_response=$(curl -s -X GET "https://slack.com/api/users.lookupByEmail?email=$email" \ + -H "Authorization: Bearer $SLACK_TOKEN") + + if [[ "$(echo $user_response | jq -r '.ok')" == "true" ]]; then + user_id=$(echo $user_response | jq -r '.user.id') + user_ids+="${user_id}," + else + error_message="Failed to retrieve user id for $email: $(echo $user_response | jq -r '.error' | tr '_' ' ') ⚠️" + report_error "$error_message" + fi +done + +user_ids=${user_ids%,} + +if [[ -n "$user_ids" ]]; then + invite_response=$(curl -s -X POST "https://slack.com/api/conversations.invite" \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer $SLACK_TOKEN" \ + --data "{\"channel\":\"$CHANNEL_ID\",\"users\":\"$user_ids\"}") + + if [[ "$(echo $invite_response | jq -r '.ok')" == "false" ]]; then + error_message="Failed to invite users to channel: $(echo $invite_response | jq -r '.error' | tr '_' ' ') ⚠️" + report_error "$error_message" + fi +else + report_error "No user IDs found to invite." +fi