diff --git a/.claude/CLAUDE.md b/.claude/CLAUDE.md new file mode 100644 index 00000000..97d64ecd --- /dev/null +++ b/.claude/CLAUDE.md @@ -0,0 +1,60 @@ +# CLAUDE.md + +This file provides guidance to AI coding agents when working with code in this repository. + +## Code Generation + +This SDK is **auto-generated** by `oagen` (an internal OpenAPI code generator). Generated files begin with `# This file is auto-generated by oagen. Do not edit.` and are tracked in `.oagen-manifest.json`. + +**Do not hand-edit generated files.** Fix the Elixir emitter in the `oagen-emitters` repo instead, then regenerate from the `openapi-spec` repo: + +```bash +cd ../../openapi-spec +npm run sdk:generate -- --lang elixir --output ../backend/workos-elixir +``` + +Hand-maintained files (safe to edit): project files (`mix.exs`, `.formatter.exs`, `README.md`, `.gitignore`), `script/`, `.claude/`, `LICENSE`, `CHANGELOG.md`, `mix.lock`, and anything else not listed in `.oagen-manifest.json`. Project files are static one-time scaffolding — the emitter only generates OpenAPI-spec-driven code. + +## Development Commands + +```bash +mix deps.get # Install dependencies +script/ci # Run everything CI runs (see below) + +mix compile --warnings-as-errors +mix format --check-formatted # Formatting check (mix format to fix) +mix credo --all # Lint +mix dialyzer # Type check (first run builds the PLT; slow) +mix test # Run the test suite +mix test test/workos/organizations_test.exs # Run one file +``` + +## Architecture Overview + +### Client + +- `WorkOS.Client.new(api_key: "sk_...")` builds an instance-scoped `%WorkOS.Client{}` struct — there is no global configuration. Falls back to the `WORKOS_API_KEY` env var. +- HTTP transport is [Req](https://hexdocs.pm/req). JSON uses Elixir's built-in `JSON` module (Elixir >= 1.18), not Jason. +- Retries: exponential backoff with jitter on 429/5xx and transport errors; default 3 retries, 60s timeout. +- Per-request options on every resource function: `:headers`, `:timeout`, `:idempotency_key`, `:query`. + +### Resources and Models + +- One module per API service (`WorkOS.Organizations`, `WorkOS.UserManagement`, ...) in `lib/workos/`. Functions take the client as the first argument and return `{:ok, result} | {:error, error}`. +- One module per model with a `defstruct`, `@type t`, `from_map/1` (wire -> struct), and `to_map/1` (struct -> wire). + +### Pagination + +- List endpoints return `{:ok, %WorkOS.Page{}}` with a `fetch_next` closure wired in. +- `WorkOS.Page.stream/1` lazily auto-paginates across all pages; `after_cursor/1` and `has_more?/1` support manual paging. + +### Error Handling + +- `WorkOS.Error.error()` is the union of `WorkOS.ApiError` (non-2xx, with a `:kind` atom like `:not_found` classifying the status) and `WorkOS.TransportError` (network failures). +- `WorkOS.ConfigurationError` raises at client construction for missing config. + +### Testing + +- ExUnit with `async: true` everywhere; HTTP stubbed via `Req.Test` plugs — no real network. +- JSON fixtures in `test/support/fixtures/`, loaded via `WorkOS.TestFixtures.fixture/1`. +- `test/workos/client_runtime_test.exs` covers the runtime contract: instance-scoped config, per-request options on the wire, typed transport errors, multi-page auto-pagination. diff --git a/.formatter.exs b/.formatter.exs old mode 100755 new mode 100644 index d2cda26e..682fc6c6 --- a/.formatter.exs +++ b/.formatter.exs @@ -1,4 +1,3 @@ -# Used by "mix format" [ - inputs: ["{mix,.formatter}.exs", "{config,lib,test}/**/*.{ex,exs}"] + inputs: ["{mix,.formatter}.exs", "{lib,test}/**/*.{ex,exs}"] ] diff --git a/.github/workflows/block-generated-edits.yml b/.github/workflows/block-generated-edits.yml new file mode 100644 index 00000000..4b9998ce --- /dev/null +++ b/.github/workflows/block-generated-edits.yml @@ -0,0 +1,13 @@ +name: Block Generated File Edits + +on: + pull_request_target: + # No "reopened": a maintainer reopening to override the bot should not be + # immediately re-closed. A follow-up push (synchronize) re-checks. + types: [opened, synchronize] + +jobs: + block-generated-edits: + uses: workos/actions/.github/workflows/block-generated-edits.yml@main + secrets: + SDK_BOT_PRIVATE_KEY: ${{ secrets.SDK_BOT_PRIVATE_KEY }} diff --git a/.github/workflows/main.yml b/.github/workflows/ci.yml similarity index 95% rename from .github/workflows/main.yml rename to .github/workflows/ci.yml index 98aae7b9..3739dd0c 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/ci.yml @@ -32,8 +32,6 @@ jobs: # # Elixir | Supported OTP # -------+--------------- - # 1.16 | 24 - 26 - # 1.17 | 25 - 27 # 1.18 | 25 - 27 # 1.19 | 26 - 28 # 1.20 | 27 - 29 @@ -47,16 +45,10 @@ jobs: - elixir: '1.19' otp: '28' + # Minimum supported Elixir (matches the `elixir:` requirement in mix.exs). - elixir: '1.18' otp: '27' - - elixir: '1.17' - otp: '27' - - # Minimum supported Elixir (matches the `elixir:` requirement in mix.exs). - - elixir: '1.16' - otp: '26' - steps: - name: Check out this repository uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 00000000..d670c9fb --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,54 @@ +name: Publish API Docs +on: + push: + branches: [main] + workflow_dispatch: +permissions: + contents: read +concurrency: + group: pages + cancel-in-progress: false +jobs: + build: + runs-on: ubuntu-latest + permissions: + contents: read + steps: + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + - uses: erlef/setup-beam@54075bcc5e249e4758d363f27d099f55d843f124 # v1.24.1 + with: + # Docs only need to build on a single pair — use the newest one + # (matches lint.yml). + elixir-version: '1.20' + otp-version: '28' + - run: mix deps.get + # ExDoc writes the HTML site to doc/ by default. + - run: mix docs + - uses: actions/configure-pages@45bfe0192ca1faeb007ade9deae92b16b8254a0d # v6.0.0 + - name: Archive site + run: | + tar \ + --dereference --hard-dereference \ + --directory doc \ + -cvf "$RUNNER_TEMP/artifact.tar" \ + --exclude=.git \ + --exclude=.github \ + . + - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: github-pages + path: ${{ runner.temp }}/artifact.tar + retention-days: 1 + if-no-files-found: error + deploy: + needs: build + permissions: + pages: write + id-token: write + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + steps: + - uses: actions/deploy-pages@cd2ce8fcbc39b97be8ca5fce6e763baed58fa128 # v5.0.0 + id: deployment diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml index b3e8fb17..eb216db5 100644 --- a/.github/workflows/release-please.yml +++ b/.github/workflows/release-please.yml @@ -5,14 +5,27 @@ on: branches: - main +concurrency: + group: release-please + cancel-in-progress: false + permissions: contents: write pull-requests: write jobs: + # release-please owns tag + GitHub Release creation (no + # skip-github-release). Because it tags every release inside its own run + # — before it computes the next release PR — it always knows the previous + # release boundary, so it never regenerates the changelog from the start + # of history or proposes a spurious major bump. Creating the release with + # the app token also fires the `release: published` event that release.yml + # uses to publish to Hex. This job is kept minimal so nothing downstream + # (changelog enrichment, release notes) can fail it. release-please: runs-on: ubuntu-latest outputs: + pr: ${{ steps.release.outputs.pr }} release_created: ${{ steps.release.outputs.release_created }} tag_name: ${{ steps.release.outputs.tag_name }} steps: @@ -30,27 +43,153 @@ jobs: with: token: ${{ steps.generate-token.outputs.token }} - publish: - name: Publish to Hex + # While the release PR is open, enrich it before it merges. Runs as its + # own job (gated on the PR existing) so a failure here can never block the + # release or any publish that depends on release-please. + enrich-release-pr: needs: release-please - if: needs.release-please.outputs.release_created == 'true' + if: needs.release-please.outputs.pr runs-on: ubuntu-latest - permissions: - contents: read steps: - - name: Checkout + - name: Generate token + id: generate-token + uses: actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1 # v3.2.0 + with: + app-id: ${{ vars.SDK_BOT_APP_ID }} + private-key: ${{ secrets.SDK_BOT_PRIVATE_KEY }} + permission-contents: write + permission-pull-requests: write + + - name: Checkout release PR branch uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + with: + ref: ${{ fromJSON(needs.release-please.outputs.pr).headBranchName }} + token: ${{ steps.generate-token.outputs.token }} + + # Inline pending changelog fragments under the version heading + # release-please just wrote in CHANGELOG.md. For PRs that have a + # fragment (the autogen flow always writes one), drop the line + # release-please rendered and use the fragment instead. For PRs + # without a fragment (typical for human-authored PRs), keep what + # release-please wrote. Fragments are deleted in the same commit. + # Idempotent: if no fragments exist, skip silently. + - name: Inline rich changelog fragments + env: + PR_JSON: ${{ needs.release-please.outputs.pr }} + run: | + set -euo pipefail + shopt -s nullglob + fragments=(.changelog-pending/*.md) + if [ ${#fragments[@]} -eq 0 ]; then + echo "No .changelog-pending fragments; leaving release-please CHANGELOG.md as-is." + exit 0 + fi + + VERSION=$(echo "$PR_JSON" | jq -r '.title' | grep -oE '[0-9]+\.[0-9]+\.[0-9]+') + export VERSION + + python3 - <<'PY' + import os, re, pathlib, glob + + version = os.environ["VERSION"] + + # Load fragments + extract the PR number each one covers from + # its top-line "* [#NN](url) ...". + fragments = [] + covered = set() + for path in sorted(glob.glob(".changelog-pending/*.md")): + body = pathlib.Path(path).read_text().rstrip() + m = re.search(r'\[#(\d+)\]', body) + if m: + covered.add(m.group(1)) + fragments.append(body) - - name: Setup Elixir and Erlang - uses: erlef/setup-beam@54075bcc5e249e4758d363f27d099f55d843f124 # v1.24.1 + changelog = pathlib.Path("CHANGELOG.md") + text = changelog.read_text() + section_re = re.compile( + r'(^## \[' + re.escape(version) + r'\][^\n]*\n)(.*?)(?=^## |\Z)', + re.MULTILINE | re.DOTALL, + ) + match = section_re.search(text) + if not match: + raise SystemExit(f"Could not find '## [{version}]' heading in CHANGELOG.md") + heading, body = match.group(1), match.group(2) + + # Drop any release-please line that references a PR we have a + # fragment for. + kept = [] + for line in body.split("\n"): + if any(pr in covered for pr in re.findall(r'\[#(\d+)\]', line)): + continue + kept.append(line) + filtered = "\n".join(kept) + + # Collapse "### Heading\n(blank lines)\n" with nothing under + # it. Run repeatedly until stable in case of stacked empties. + empty_section = re.compile( + r'^### [^\n]*\n(?:\s*\n)*(?=^### |\Z)', + re.MULTILINE, + ) + while True: + new = empty_section.sub('', filtered) + if new == filtered: + break + filtered = new + filtered = filtered.strip() + + parts = [] + if filtered: + parts.append(filtered) + parts.extend(fragments) + new_body = "\n\n".join(parts) + + new_text = text[:match.start()] + heading + "\n" + new_body + "\n\n" + text[match.end():] + changelog.write_text(new_text) + PY + + git config user.name "workos-sdk-automation[bot]" + git config user.email "255426317+workos-sdk-automation[bot]@users.noreply.github.com" + git rm .changelog-pending/*.md + git add CHANGELOG.md + git commit -m "chore: inline release notes from .changelog-pending" + git push + + # After release-please tags the release and creates the GitHub Release, + # replace its body with the rich section from CHANGELOG.md (release-please + # writes only its terse default rendering). Cosmetic-only: never fails the + # release if the section can't be found. + update-release-notes: + needs: release-please + if: needs.release-please.outputs.release_created == 'true' + runs-on: ubuntu-latest + steps: + - name: Generate token + id: generate-token + uses: actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1 # v3.2.0 with: - elixir-version: '1.18' - otp-version: '27' + app-id: ${{ vars.SDK_BOT_APP_ID }} + private-key: ${{ secrets.SDK_BOT_PRIVATE_KEY }} + permission-contents: write + permission-pull-requests: write - - name: Install dependencies - run: mix deps.get + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + with: + token: ${{ steps.generate-token.outputs.token }} - - name: Publish to Hex - run: mix hex.publish --yes + - name: Set rich release notes from CHANGELOG.md env: - HEX_API_KEY: ${{ secrets.HEX_API_KEY }} + GH_TOKEN: ${{ steps.generate-token.outputs.token }} + TAG: ${{ needs.release-please.outputs.tag_name }} + run: | + set -euo pipefail + VERSION="${TAG#v}" + awk -v v="$VERSION" ' + $0 ~ ("^## \\[" v "\\]") { found=1; next } + found && /^## \[/ { exit } + found + ' CHANGELOG.md > /tmp/release-notes.md + if [ -s /tmp/release-notes.md ]; then + gh release edit "$TAG" --notes-file /tmp/release-notes.md + else + echo "No CHANGELOG.md body for $TAG; keeping release-please default notes." + fi diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000..c36ca2cf --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,48 @@ +name: Release + +on: + release: + types: [published] + +defaults: + run: + shell: bash + +jobs: + publish: + name: Publish to Hex + runs-on: ubuntu-latest + permissions: + contents: read + steps: + - name: Checkout + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + + - name: Set up Elixir and Erlang/OTP + uses: erlef/setup-beam@54075bcc5e249e4758d363f27d099f55d843f124 # v1.24.1 + with: + # Publish from the minimum supported pair (matches the `elixir:` + # requirement in mix.exs) so the release build proves the floor + # still compiles. + elixir-version: '1.18' + otp-version: '27' + + - name: Install dependencies + run: mix deps.get + + # release-please bumps @version in mix.exs before tagging, and + # `mix hex.publish` publishes whatever mix.exs says — so if the tag + # and mix.exs ever disagree, we'd silently ship the wrong version. + - name: Verify tag matches mix.exs version + run: | + TAG_VERSION="${GITHUB_REF_NAME#v}" + MIX_VERSION="$(grep -oE '@version "[^"]+"' mix.exs | cut -d'"' -f2)" + if [ "$TAG_VERSION" != "$MIX_VERSION" ]; then + echo "Tag $GITHUB_REF_NAME does not match mix.exs version $MIX_VERSION" >&2 + exit 1 + fi + + - name: Publish to Hex + run: mix hex.publish --yes + env: + HEX_API_KEY: ${{ secrets.HEX_API_KEY }} diff --git a/.gitignore b/.gitignore old mode 100755 new mode 100644 diff --git a/.oagen-manifest.json b/.oagen-manifest.json new file mode 100644 index 00000000..06c9d280 --- /dev/null +++ b/.oagen-manifest.json @@ -0,0 +1,1812 @@ +{ + "version": 2, + "language": "elixir", + "files": [ + "lib/workos/access_token_agent_registration_credential_issued_data_detail.ex", + "lib/workos/action_authentication_denied.ex", + "lib/workos/action_authentication_denied_data.ex", + "lib/workos/action_user_registration_denied.ex", + "lib/workos/action_user_registration_denied_data.ex", + "lib/workos/actor.ex", + "lib/workos/add_role_permission.ex", + "lib/workos/admin_portal.ex", + "lib/workos/agent_admin_link_claim_attempt_to_external_user_request.ex", + "lib/workos/agent_admin_link_claim_attempt_to_external_user_request_user.ex", + "lib/workos/agent_admin_validate_credential_request.ex", + "lib/workos/agent_admin_validate_credential_request_type.ex", + "lib/workos/agent_credential_validation.ex", + "lib/workos/agent_registration.ex", + "lib/workos/agent_registration_agent_identity.ex", + "lib/workos/agent_registration_claim.ex", + "lib/workos/agent_registration_claim_attempt_created.ex", + "lib/workos/agent_registration_claim_attempt_created_data.ex", + "lib/workos/agent_registration_claim_claim_completion.ex", + "lib/workos/agent_registration_claim_completed.ex", + "lib/workos/agent_registration_claim_completed_data.ex", + "lib/workos/agent_registration_claim_completed_data_claimed_by.ex", + "lib/workos/agent_registration_created.ex", + "lib/workos/agent_registration_created_data.ex", + "lib/workos/agent_registration_created_data_agent_identity.ex", + "lib/workos/agent_registration_created_data_kind.ex", + "lib/workos/agent_registration_created_data_method.ex", + "lib/workos/agent_registration_created_data_status.ex", + "lib/workos/agent_registration_credential_issued.ex", + "lib/workos/agent_registration_credential_issued_data.ex", + "lib/workos/agent_registration_credential_issued_data_detail.ex", + "lib/workos/agent_registration_deleted.ex", + "lib/workos/agent_registration_deleted_data.ex", + "lib/workos/agent_registration_expired.ex", + "lib/workos/agent_registration_expired_data.ex", + "lib/workos/agent_registration_kind.ex", + "lib/workos/agent_registration_organization_switched.ex", + "lib/workos/agent_registration_organization_switched_data.ex", + "lib/workos/agent_registration_revoked.ex", + "lib/workos/agent_registration_revoked_data.ex", + "lib/workos/agent_registration_status.ex", + "lib/workos/agents.ex", + "lib/workos/api_key.ex", + "lib/workos/api_key_created.ex", + "lib/workos/api_key_created_data.ex", + "lib/workos/api_key_created_data_owner.ex", + "lib/workos/api_key_installation.ex", + "lib/workos/api_key_owner.ex", + "lib/workos/api_key_revoked.ex", + "lib/workos/api_key_revoked_data.ex", + "lib/workos/api_key_revoked_data_owner.ex", + "lib/workos/api_key_updated.ex", + "lib/workos/api_key_updated_data.ex", + "lib/workos/api_key_updated_data_owner.ex", + "lib/workos/api_key_updated_data_previous_attribute.ex", + "lib/workos/api_key_validation_response.ex", + "lib/workos/api_keys.ex", + "lib/workos/application_credentials_list_item.ex", + "lib/workos/applications_registration_types.ex", + "lib/workos/assign_role.ex", + "lib/workos/audit_log_action.ex", + "lib/workos/audit_log_configuration.ex", + "lib/workos/audit_log_configuration_log_stream.ex", + "lib/workos/audit_log_configuration_log_stream_state.ex", + "lib/workos/audit_log_configuration_log_stream_type.ex", + "lib/workos/audit_log_configuration_state.ex", + "lib/workos/audit_log_event.ex", + "lib/workos/audit_log_event_actor.ex", + "lib/workos/audit_log_event_context.ex", + "lib/workos/audit_log_event_create_response.ex", + "lib/workos/audit_log_event_ingestion.ex", + "lib/workos/audit_log_event_target.ex", + "lib/workos/audit_log_export.ex", + "lib/workos/audit_log_export_creation.ex", + "lib/workos/audit_log_export_state.ex", + "lib/workos/audit_log_schema.ex", + "lib/workos/audit_log_schema_actor.ex", + "lib/workos/audit_log_schema_actor_input.ex", + "lib/workos/audit_log_schema_input.ex", + "lib/workos/audit_log_schema_target.ex", + "lib/workos/audit_log_schema_target_input.ex", + "lib/workos/audit_logs.ex", + "lib/workos/audit_logs_retention.ex", + "lib/workos/auth_method_mismatch_error.ex", + "lib/workos/authenticate_response.ex", + "lib/workos/authenticate_response_authentication_method.ex", + "lib/workos/authenticate_response_impersonator.ex", + "lib/workos/authenticate_response_oauth_token.ex", + "lib/workos/authentication_challenge.ex", + "lib/workos/authentication_challenge_verify_response.ex", + "lib/workos/authentication_challenges_verify_request.ex", + "lib/workos/authentication_email_verification_failed.ex", + "lib/workos/authentication_email_verification_failed_data.ex", + "lib/workos/authentication_email_verification_failed_data_error.ex", + "lib/workos/authentication_email_verification_succeeded.ex", + "lib/workos/authentication_email_verification_succeeded_data.ex", + "lib/workos/authentication_factor.ex", + "lib/workos/authentication_factor_enrolled.ex", + "lib/workos/authentication_factor_enrolled_sms.ex", + "lib/workos/authentication_factor_enrolled_totp.ex", + "lib/workos/authentication_factor_enrolled_type.ex", + "lib/workos/authentication_factor_sms.ex", + "lib/workos/authentication_factor_totp.ex", + "lib/workos/authentication_factor_type.ex", + "lib/workos/authentication_factors_create_request.ex", + "lib/workos/authentication_factors_create_request_type.ex", + "lib/workos/authentication_magic_auth_failed.ex", + "lib/workos/authentication_magic_auth_failed_data.ex", + "lib/workos/authentication_magic_auth_failed_data_error.ex", + "lib/workos/authentication_magic_auth_succeeded.ex", + "lib/workos/authentication_magic_auth_succeeded_data.ex", + "lib/workos/authentication_mfa_failed.ex", + "lib/workos/authentication_mfa_failed_data.ex", + "lib/workos/authentication_mfa_failed_data_error.ex", + "lib/workos/authentication_mfa_succeeded.ex", + "lib/workos/authentication_mfa_succeeded_data.ex", + "lib/workos/authentication_oauth_failed.ex", + "lib/workos/authentication_oauth_failed_data.ex", + "lib/workos/authentication_oauth_failed_data_error.ex", + "lib/workos/authentication_oauth_succeeded.ex", + "lib/workos/authentication_oauth_succeeded_data.ex", + "lib/workos/authentication_passkey_failed.ex", + "lib/workos/authentication_passkey_failed_data.ex", + "lib/workos/authentication_passkey_failed_data_error.ex", + "lib/workos/authentication_passkey_succeeded.ex", + "lib/workos/authentication_passkey_succeeded_data.ex", + "lib/workos/authentication_password_failed.ex", + "lib/workos/authentication_password_failed_data.ex", + "lib/workos/authentication_password_failed_data_error.ex", + "lib/workos/authentication_password_succeeded.ex", + "lib/workos/authentication_password_succeeded_data.ex", + "lib/workos/authentication_radar_risk_detected.ex", + "lib/workos/authentication_radar_risk_detected_data.ex", + "lib/workos/authentication_radar_risk_detected_data_action.ex", + "lib/workos/authentication_reauthentication_succeeded.ex", + "lib/workos/authentication_reauthentication_succeeded_data.ex", + "lib/workos/authentication_sso_failed.ex", + "lib/workos/authentication_sso_failed_data.ex", + "lib/workos/authentication_sso_failed_data_error.ex", + "lib/workos/authentication_sso_failed_data_sso.ex", + "lib/workos/authentication_sso_started.ex", + "lib/workos/authentication_sso_started_data.ex", + "lib/workos/authentication_sso_started_data_sso.ex", + "lib/workos/authentication_sso_succeeded.ex", + "lib/workos/authentication_sso_succeeded_data.ex", + "lib/workos/authentication_sso_succeeded_data_sso.ex", + "lib/workos/authentication_sso_timed_out.ex", + "lib/workos/authentication_sso_timed_out_data.ex", + "lib/workos/authentication_sso_timed_out_data_error.ex", + "lib/workos/authentication_sso_timed_out_data_sso.ex", + "lib/workos/authorization.ex", + "lib/workos/authorization_assignment.ex", + "lib/workos/authorization_check.ex", + "lib/workos/authorization_code_session_authenticate_request.ex", + "lib/workos/authorization_permission.ex", + "lib/workos/authorization_permission_list.ex", + "lib/workos/authorization_permission_list_list_metadata.ex", + "lib/workos/authorization_resource.ex", + "lib/workos/authorization_resource_list.ex", + "lib/workos/authorization_resource_list_list_metadata.ex", + "lib/workos/authorized_connect_application_list.ex", + "lib/workos/authorized_connect_application_list_data.ex", + "lib/workos/authorized_connect_application_list_list_metadata.ex", + "lib/workos/challenge_authentication_factor.ex", + "lib/workos/check_authorization.ex", + "lib/workos/claim_view_response.ex", + "lib/workos/claim_view_response_organization.ex", + "lib/workos/claim_view_response_status.ex", + "lib/workos/client_api.ex", + "lib/workos/client_api_token.ex", + "lib/workos/client_api_token_response.ex", + "lib/workos/configure_data_integration_body.ex", + "lib/workos/confirm_email_change.ex", + "lib/workos/connect.ex", + "lib/workos/connect_application.ex", + "lib/workos/connect_application_list.ex", + "lib/workos/connect_application_list_list_metadata.ex", + "lib/workos/connect_application_m2m.ex", + "lib/workos/connect_application_oauth.ex", + "lib/workos/connect_application_oauth_redirect_uris.ex", + "lib/workos/connect_application_redirect_uri.ex", + "lib/workos/connected_account.ex", + "lib/workos/connected_account_auth_method.ex", + "lib/workos/connected_account_input.ex", + "lib/workos/connected_account_input_state.ex", + "lib/workos/connected_account_state.ex", + "lib/workos/connection.ex", + "lib/workos/connection_activated.ex", + "lib/workos/connection_activated_data.ex", + "lib/workos/connection_activated_data_connection_type.ex", + "lib/workos/connection_activated_data_domain.ex", + "lib/workos/connection_activated_data_state.ex", + "lib/workos/connection_activated_data_status.ex", + "lib/workos/connection_deactivated.ex", + "lib/workos/connection_deactivated_data.ex", + "lib/workos/connection_deactivated_data_connection_type.ex", + "lib/workos/connection_deactivated_data_domain.ex", + "lib/workos/connection_deactivated_data_state.ex", + "lib/workos/connection_deactivated_data_status.ex", + "lib/workos/connection_deleted.ex", + "lib/workos/connection_deleted_data.ex", + "lib/workos/connection_deleted_data_connection_type.ex", + "lib/workos/connection_deleted_data_state.ex", + "lib/workos/connection_domain.ex", + "lib/workos/connection_list.ex", + "lib/workos/connection_list_list_metadata.ex", + "lib/workos/connection_saml_certificate_renewal_required.ex", + "lib/workos/connection_saml_certificate_renewal_required_data.ex", + "lib/workos/connection_saml_certificate_renewal_required_data_certificate.ex", + "lib/workos/connection_saml_certificate_renewal_required_data_certificate_certificate_type.ex", + "lib/workos/connection_saml_certificate_renewal_required_data_connection.ex", + "lib/workos/connection_saml_certificate_renewed.ex", + "lib/workos/connection_saml_certificate_renewed_data.ex", + "lib/workos/connection_saml_certificate_renewed_data_certificate.ex", + "lib/workos/connection_saml_certificate_renewed_data_certificate_certificate_type.ex", + "lib/workos/connection_saml_certificate_renewed_data_connection.ex", + "lib/workos/connection_state.ex", + "lib/workos/connection_status.ex", + "lib/workos/connection_type.ex", + "lib/workos/connections_connection_type.ex", + "lib/workos/cors_origin_response.ex", + "lib/workos/create_application_secret.ex", + "lib/workos/create_authorization_permission.ex", + "lib/workos/create_authorization_resource.ex", + "lib/workos/create_cors_origin.ex", + "lib/workos/create_data_integration.ex", + "lib/workos/create_data_integration_auth_methods.ex", + "lib/workos/create_data_key_request.ex", + "lib/workos/create_data_key_response.ex", + "lib/workos/create_group.ex", + "lib/workos/create_group_membership.ex", + "lib/workos/create_group_role_assignment.ex", + "lib/workos/create_m2m_application.ex", + "lib/workos/create_magic_code_and_return.ex", + "lib/workos/create_oauth_application.ex", + "lib/workos/create_object_request.ex", + "lib/workos/create_organization_api_key.ex", + "lib/workos/create_organization_domain.ex", + "lib/workos/create_organization_role.ex", + "lib/workos/create_password_reset.ex", + "lib/workos/create_password_reset_token.ex", + "lib/workos/create_redirect_uri.ex", + "lib/workos/create_role.ex", + "lib/workos/create_user.ex", + "lib/workos/create_user_api_key.ex", + "lib/workos/create_user_invite_options.ex", + "lib/workos/create_user_invite_options_locale.ex", + "lib/workos/create_user_organization_membership.ex", + "lib/workos/create_user_password_hash_type.ex", + "lib/workos/create_webhook_endpoint.ex", + "lib/workos/create_webhook_endpoint_events.ex", + "lib/workos/custom_provider_definition.ex", + "lib/workos/custom_provider_definition_authenticate_via.ex", + "lib/workos/data_integration.ex", + "lib/workos/data_integration_access_token_response.ex", + "lib/workos/data_integration_access_token_response_access_token.ex", + "lib/workos/data_integration_access_token_response_error.ex", + "lib/workos/data_integration_auth_methods.ex", + "lib/workos/data_integration_authorize_url_response.ex", + "lib/workos/data_integration_configuration_list_response.ex", + "lib/workos/data_integration_configuration_response.ex", + "lib/workos/data_integration_credential.ex", + "lib/workos/data_integration_credential_type.ex", + "lib/workos/data_integration_credentials.ex", + "lib/workos/data_integration_credentials_credentials_type.ex", + "lib/workos/data_integration_credentials_input.ex", + "lib/workos/data_integration_credentials_input_type.ex", + "lib/workos/data_integration_credentials_response.ex", + "lib/workos/data_integration_credentials_response_credential.ex", + "lib/workos/data_integration_credentials_response_error.ex", + "lib/workos/data_integration_custom_provider.ex", + "lib/workos/data_integration_custom_provider_authenticate_via.ex", + "lib/workos/data_integration_installation.ex", + "lib/workos/data_integration_list.ex", + "lib/workos/data_integration_list_list_metadata.ex", + "lib/workos/data_integration_state.ex", + "lib/workos/data_integrations_get_data_integration_authorize_url_request.ex", + "lib/workos/data_integrations_get_user_token_request.ex", + "lib/workos/data_integrations_list_response.ex", + "lib/workos/data_integrations_list_response_data.ex", + "lib/workos/data_integrations_list_response_data_auth_methods.ex", + "lib/workos/data_integrations_list_response_data_connected_account.ex", + "lib/workos/data_integrations_list_response_data_connected_account_auth_method.ex", + "lib/workos/data_integrations_list_response_data_connected_account_state.ex", + "lib/workos/data_integrations_list_response_data_ownership.ex", + "lib/workos/data_integrations_upsert_api_key_request.ex", + "lib/workos/data_integrations_vend_credentials_request.ex", + "lib/workos/decrypt_request.ex", + "lib/workos/decrypt_response.ex", + "lib/workos/delete_group_role_assignments_by_criteria.ex", + "lib/workos/delete_object_response.ex", + "lib/workos/device_authorization_response.ex", + "lib/workos/device_code_session_authenticate_request.ex", + "lib/workos/directory.ex", + "lib/workos/directory_group.ex", + "lib/workos/directory_group_list.ex", + "lib/workos/directory_group_list_list_metadata.ex", + "lib/workos/directory_list.ex", + "lib/workos/directory_list_list_metadata.ex", + "lib/workos/directory_metadata.ex", + "lib/workos/directory_metadata_user.ex", + "lib/workos/directory_state.ex", + "lib/workos/directory_sync.ex", + "lib/workos/directory_type.ex", + "lib/workos/directory_user.ex", + "lib/workos/directory_user_email.ex", + "lib/workos/directory_user_list.ex", + "lib/workos/directory_user_list_list_metadata.ex", + "lib/workos/directory_user_state.ex", + "lib/workos/directory_user_with_groups.ex", + "lib/workos/directory_user_with_groups_email.ex", + "lib/workos/directory_user_with_groups_state.ex", + "lib/workos/dsync_activated.ex", + "lib/workos/dsync_activated_data.ex", + "lib/workos/dsync_activated_data_domain.ex", + "lib/workos/dsync_activated_data_state.ex", + "lib/workos/dsync_activated_data_type.ex", + "lib/workos/dsync_deleted.ex", + "lib/workos/dsync_deleted_data.ex", + "lib/workos/dsync_deleted_data_state.ex", + "lib/workos/dsync_deleted_data_type.ex", + "lib/workos/dsync_group_created.ex", + "lib/workos/dsync_group_deleted.ex", + "lib/workos/dsync_group_updated.ex", + "lib/workos/dsync_group_updated_data.ex", + "lib/workos/dsync_group_user_added.ex", + "lib/workos/dsync_group_user_added_data.ex", + "lib/workos/dsync_group_user_removed.ex", + "lib/workos/dsync_group_user_removed_data.ex", + "lib/workos/dsync_token_created.ex", + "lib/workos/dsync_token_created_data.ex", + "lib/workos/dsync_token_revoked.ex", + "lib/workos/dsync_token_revoked_data.ex", + "lib/workos/dsync_user_created.ex", + "lib/workos/dsync_user_deleted.ex", + "lib/workos/dsync_user_updated.ex", + "lib/workos/dsync_user_updated_data.ex", + "lib/workos/dsync_user_updated_data_email.ex", + "lib/workos/dsync_user_updated_data_state.ex", + "lib/workos/email_change.ex", + "lib/workos/email_change_confirmation.ex", + "lib/workos/email_change_confirmation_user.ex", + "lib/workos/email_verification.ex", + "lib/workos/email_verification_code_session_authenticate_request.ex", + "lib/workos/email_verification_created.ex", + "lib/workos/email_verification_created_data.ex", + "lib/workos/enroll_user_authentication_factor.ex", + "lib/workos/error_response.ex", + "lib/workos/event_context.ex", + "lib/workos/event_context_actor.ex", + "lib/workos/event_context_actor_source.ex", + "lib/workos/event_context_google_analytics_session.ex", + "lib/workos/event_list.ex", + "lib/workos/event_list_list_metadata.ex", + "lib/workos/event_schema.ex", + "lib/workos/events.ex", + "lib/workos/expire_api_key.ex", + "lib/workos/external_auth_complete_response.ex", + "lib/workos/feature_flag.ex", + "lib/workos/feature_flag_owner.ex", + "lib/workos/feature_flags.ex", + "lib/workos/flag.ex", + "lib/workos/flag_created.ex", + "lib/workos/flag_created_context.ex", + "lib/workos/flag_created_context_actor.ex", + "lib/workos/flag_created_context_actor_source.ex", + "lib/workos/flag_created_data.ex", + "lib/workos/flag_created_data_owner.ex", + "lib/workos/flag_deleted.ex", + "lib/workos/flag_deleted_context.ex", + "lib/workos/flag_deleted_context_actor.ex", + "lib/workos/flag_deleted_context_actor_source.ex", + "lib/workos/flag_deleted_data.ex", + "lib/workos/flag_deleted_data_owner.ex", + "lib/workos/flag_list.ex", + "lib/workos/flag_list_list_metadata.ex", + "lib/workos/flag_owner.ex", + "lib/workos/flag_rule_updated.ex", + "lib/workos/flag_rule_updated_context.ex", + "lib/workos/flag_rule_updated_context_access_type.ex", + "lib/workos/flag_rule_updated_context_actor.ex", + "lib/workos/flag_rule_updated_context_actor_source.ex", + "lib/workos/flag_rule_updated_context_configured_target.ex", + "lib/workos/flag_rule_updated_context_configured_target_organization.ex", + "lib/workos/flag_rule_updated_context_configured_target_user.ex", + "lib/workos/flag_rule_updated_context_previous_attribute.ex", + "lib/workos/flag_rule_updated_context_previous_attribute_context.ex", + "lib/workos/flag_rule_updated_context_previous_attribute_context_access_type.ex", + "lib/workos/flag_rule_updated_context_previous_attribute_context_configured_target.ex", + "lib/workos/flag_rule_updated_context_previous_attribute_context_configured_target_organization.ex", + "lib/workos/flag_rule_updated_context_previous_attribute_context_configured_target_user.ex", + "lib/workos/flag_rule_updated_context_previous_attribute_data.ex", + "lib/workos/flag_rule_updated_data.ex", + "lib/workos/flag_rule_updated_data_owner.ex", + "lib/workos/flag_updated.ex", + "lib/workos/flag_updated_context.ex", + "lib/workos/flag_updated_context_actor.ex", + "lib/workos/flag_updated_context_actor_source.ex", + "lib/workos/flag_updated_context_previous_attribute.ex", + "lib/workos/flag_updated_context_previous_attribute_data.ex", + "lib/workos/flag_updated_data.ex", + "lib/workos/flag_updated_data_owner.ex", + "lib/workos/generate_link.ex", + "lib/workos/generate_link_intent.ex", + "lib/workos/group.ex", + "lib/workos/group_created.ex", + "lib/workos/group_deleted.ex", + "lib/workos/group_list.ex", + "lib/workos/group_list_list_metadata.ex", + "lib/workos/group_member_added.ex", + "lib/workos/group_member_added_data.ex", + "lib/workos/group_member_removed.ex", + "lib/workos/group_member_removed_data.ex", + "lib/workos/group_role_assignment.ex", + "lib/workos/group_role_assignment_list.ex", + "lib/workos/group_role_assignment_resource.ex", + "lib/workos/group_updated.ex", + "lib/workos/groups.ex", + "lib/workos/invitation.ex", + "lib/workos/invitation_accepted.ex", + "lib/workos/invitation_accepted_data.ex", + "lib/workos/invitation_accepted_data_state.ex", + "lib/workos/invitation_created.ex", + "lib/workos/invitation_created_data.ex", + "lib/workos/invitation_created_data_state.ex", + "lib/workos/invitation_resent.ex", + "lib/workos/invitation_resent_data.ex", + "lib/workos/invitation_resent_data_state.ex", + "lib/workos/invitation_revoked.ex", + "lib/workos/invitation_revoked_data.ex", + "lib/workos/invitation_revoked_data_state.ex", + "lib/workos/invitation_state.ex", + "lib/workos/jwks_response.ex", + "lib/workos/jwks_response_keys.ex", + "lib/workos/jwt_template_response.ex", + "lib/workos/list_metadata.ex", + "lib/workos/magic_auth.ex", + "lib/workos/magic_auth_code_session_authenticate_request.ex", + "lib/workos/magic_auth_created.ex", + "lib/workos/magic_auth_created_data.ex", + "lib/workos/magic_auth_send_magic_auth_code_and_return_response.ex", + "lib/workos/mfa_totp_session_authenticate_request.ex", + "lib/workos/multi_factor_auth.ex", + "lib/workos/new_connect_application_secret.ex", + "lib/workos/object_list_response.ex", + "lib/workos/object_metadata.ex", + "lib/workos/object_summary.ex", + "lib/workos/object_version.ex", + "lib/workos/object_without_value.ex", + "lib/workos/organization.ex", + "lib/workos/organization_api_key.ex", + "lib/workos/organization_api_key_list.ex", + "lib/workos/organization_api_key_list_list_metadata.ex", + "lib/workos/organization_api_key_owner.ex", + "lib/workos/organization_api_key_with_value.ex", + "lib/workos/organization_api_key_with_value_owner.ex", + "lib/workos/organization_authorized_connect_application_list.ex", + "lib/workos/organization_authorized_connect_application_list_data.ex", + "lib/workos/organization_authorized_connect_application_list_list_metadata.ex", + "lib/workos/organization_created.ex", + "lib/workos/organization_created_data.ex", + "lib/workos/organization_created_data_domain.ex", + "lib/workos/organization_created_data_domain_state.ex", + "lib/workos/organization_created_data_domain_verification_strategy.ex", + "lib/workos/organization_deleted.ex", + "lib/workos/organization_deleted_data.ex", + "lib/workos/organization_deleted_data_domain.ex", + "lib/workos/organization_deleted_data_domain_state.ex", + "lib/workos/organization_deleted_data_domain_verification_strategy.ex", + "lib/workos/organization_domain.ex", + "lib/workos/organization_domain_created.ex", + "lib/workos/organization_domain_created_data.ex", + "lib/workos/organization_domain_created_data_state.ex", + "lib/workos/organization_domain_created_data_verification_strategy.ex", + "lib/workos/organization_domain_data.ex", + "lib/workos/organization_domain_data_state.ex", + "lib/workos/organization_domain_deleted.ex", + "lib/workos/organization_domain_deleted_data.ex", + "lib/workos/organization_domain_deleted_data_state.ex", + "lib/workos/organization_domain_deleted_data_verification_strategy.ex", + "lib/workos/organization_domain_state.ex", + "lib/workos/organization_domain_updated.ex", + "lib/workos/organization_domain_updated_data.ex", + "lib/workos/organization_domain_updated_data_state.ex", + "lib/workos/organization_domain_updated_data_verification_strategy.ex", + "lib/workos/organization_domain_verification_failed.ex", + "lib/workos/organization_domain_verification_failed_data.ex", + "lib/workos/organization_domain_verification_failed_data_organization_domain.ex", + "lib/workos/organization_domain_verification_failed_data_organization_domain_state.ex", + "lib/workos/organization_domain_verification_failed_data_organization_domain_verification_strategy.ex", + "lib/workos/organization_domain_verification_failed_data_reason.ex", + "lib/workos/organization_domain_verification_strategy.ex", + "lib/workos/organization_domain_verified.ex", + "lib/workos/organization_domain_verified_data.ex", + "lib/workos/organization_domain_verified_data_state.ex", + "lib/workos/organization_domain_verified_data_verification_strategy.ex", + "lib/workos/organization_domains.ex", + "lib/workos/organization_input.ex", + "lib/workos/organization_list.ex", + "lib/workos/organization_list_list_metadata.ex", + "lib/workos/organization_membership.ex", + "lib/workos/organization_membership_created.ex", + "lib/workos/organization_membership_created_data.ex", + "lib/workos/organization_membership_created_data_status.ex", + "lib/workos/organization_membership_deleted.ex", + "lib/workos/organization_membership_deleted_data.ex", + "lib/workos/organization_membership_deleted_data_status.ex", + "lib/workos/organization_membership_service.ex", + "lib/workos/organization_membership_status.ex", + "lib/workos/organization_membership_updated.ex", + "lib/workos/organization_membership_updated_data.ex", + "lib/workos/organization_membership_updated_data_status.ex", + "lib/workos/organization_role_created.ex", + "lib/workos/organization_role_created_data.ex", + "lib/workos/organization_role_deleted.ex", + "lib/workos/organization_role_deleted_data.ex", + "lib/workos/organization_role_updated.ex", + "lib/workos/organization_role_updated_data.ex", + "lib/workos/organization_selection_session_authenticate_request.ex", + "lib/workos/organization_updated.ex", + "lib/workos/organization_updated_data.ex", + "lib/workos/organization_updated_data_domain.ex", + "lib/workos/organization_updated_data_domain_state.ex", + "lib/workos/organization_updated_data_domain_verification_strategy.ex", + "lib/workos/organizations.ex", + "lib/workos/pagination_order.ex", + "lib/workos/password_reset.ex", + "lib/workos/password_reset_created.ex", + "lib/workos/password_reset_created_data.ex", + "lib/workos/password_reset_succeeded.ex", + "lib/workos/password_reset_succeeded_data.ex", + "lib/workos/password_session_authenticate_request.ex", + "lib/workos/permission.ex", + "lib/workos/permission_created.ex", + "lib/workos/permission_created_data.ex", + "lib/workos/permission_deleted.ex", + "lib/workos/permission_deleted_data.ex", + "lib/workos/permission_updated.ex", + "lib/workos/permission_updated_data.ex", + "lib/workos/pipe_connected_account.ex", + "lib/workos/pipe_connected_account_state.ex", + "lib/workos/pipes.ex", + "lib/workos/pipes_connected_account_connected.ex", + "lib/workos/pipes_connected_account_connection_failed.ex", + "lib/workos/pipes_connected_account_connection_failed_data.ex", + "lib/workos/pipes_connected_account_disconnected.ex", + "lib/workos/pipes_connected_account_reauthorization_needed.ex", + "lib/workos/pipes_provider.ex", + "lib/workos/portal_link_response.ex", + "lib/workos/profile.ex", + "lib/workos/profile_connection_type.ex", + "lib/workos/radar.ex", + "lib/workos/radar_challenge.ex", + "lib/workos/radar_challenge_created.ex", + "lib/workos/radar_challenge_created_data.ex", + "lib/workos/radar_email_challenge_code_session_authenticate_request.ex", + "lib/workos/radar_list_action.ex", + "lib/workos/radar_list_entry_already_present_response.ex", + "lib/workos/radar_list_type.ex", + "lib/workos/radar_sms_challenge_code_session_authenticate_request.ex", + "lib/workos/radar_standalone_assess_request.ex", + "lib/workos/radar_standalone_assess_request_action.ex", + "lib/workos/radar_standalone_assess_request_auth_method.ex", + "lib/workos/radar_standalone_delete_radar_list_entry_request.ex", + "lib/workos/radar_standalone_response.ex", + "lib/workos/radar_standalone_response_blocklist_type.ex", + "lib/workos/radar_standalone_response_control.ex", + "lib/workos/radar_standalone_response_verdict.ex", + "lib/workos/radar_standalone_update_radar_attempt_request.ex", + "lib/workos/radar_standalone_update_radar_list_request.ex", + "lib/workos/redirect_uri.ex", + "lib/workos/redirect_uri_input.ex", + "lib/workos/refresh_token_session_authenticate_request.ex", + "lib/workos/rekey_request.ex", + "lib/workos/remove_role.ex", + "lib/workos/replace_group_role_assignment_entry.ex", + "lib/workos/replace_group_role_assignments.ex", + "lib/workos/resend_user_invite_options.ex", + "lib/workos/resend_user_invite_options_locale.ex", + "lib/workos/reset_password_response.ex", + "lib/workos/revoke_session.ex", + "lib/workos/role.ex", + "lib/workos/role_created.ex", + "lib/workos/role_created_data.ex", + "lib/workos/role_deleted.ex", + "lib/workos/role_deleted_data.ex", + "lib/workos/role_list.ex", + "lib/workos/role_type.ex", + "lib/workos/role_updated.ex", + "lib/workos/role_updated_data.ex", + "lib/workos/send_email_change.ex", + "lib/workos/send_radar_sms_challenge.ex", + "lib/workos/send_radar_sms_challenge_response.ex", + "lib/workos/send_verification_email_response.ex", + "lib/workos/session_created.ex", + "lib/workos/session_created_data.ex", + "lib/workos/session_created_data_auth_method.ex", + "lib/workos/session_created_data_impersonator.ex", + "lib/workos/session_created_data_status.ex", + "lib/workos/session_revoked.ex", + "lib/workos/session_revoked_data.ex", + "lib/workos/session_revoked_data_auth_method.ex", + "lib/workos/session_revoked_data_impersonator.ex", + "lib/workos/session_revoked_data_status.ex", + "lib/workos/set_role_permissions.ex", + "lib/workos/slim_role.ex", + "lib/workos/sso.ex", + "lib/workos/sso_authorize_url_response.ex", + "lib/workos/sso_device_authorization_request.ex", + "lib/workos/sso_logout_authorize_request.ex", + "lib/workos/sso_logout_authorize_response.ex", + "lib/workos/sso_provider.ex", + "lib/workos/sso_token_response.ex", + "lib/workos/sso_token_response_oauth_token.ex", + "lib/workos/token_query.ex", + "lib/workos/update_audit_logs_retention.ex", + "lib/workos/update_authorization_permission.ex", + "lib/workos/update_authorization_resource.ex", + "lib/workos/update_custom_provider_definition.ex", + "lib/workos/update_custom_provider_definition_authenticate_via.ex", + "lib/workos/update_data_integration.ex", + "lib/workos/update_group.ex", + "lib/workos/update_jwt_template.ex", + "lib/workos/update_oauth_application.ex", + "lib/workos/update_object_request.ex", + "lib/workos/update_organization.ex", + "lib/workos/update_organization_role.ex", + "lib/workos/update_role.ex", + "lib/workos/update_user.ex", + "lib/workos/update_user_organization_membership.ex", + "lib/workos/update_user_password_hash_type.ex", + "lib/workos/update_webhook_endpoint.ex", + "lib/workos/update_webhook_endpoint_events.ex", + "lib/workos/update_webhook_endpoint_status.ex", + "lib/workos/user.ex", + "lib/workos/user_api_key.ex", + "lib/workos/user_api_key_created_data_owner.ex", + "lib/workos/user_api_key_list.ex", + "lib/workos/user_api_key_list_list_metadata.ex", + "lib/workos/user_api_key_owner.ex", + "lib/workos/user_api_key_revoked_data_owner.ex", + "lib/workos/user_api_key_updated_data_owner.ex", + "lib/workos/user_api_key_with_value.ex", + "lib/workos/user_api_key_with_value_owner.ex", + "lib/workos/user_authentication_factor_enroll_response.ex", + "lib/workos/user_authentication_factor_list.ex", + "lib/workos/user_authentication_factor_list_list_metadata.ex", + "lib/workos/user_consent_option.ex", + "lib/workos/user_consent_option_choice.ex", + "lib/workos/user_create_response.ex", + "lib/workos/user_created.ex", + "lib/workos/user_deleted.ex", + "lib/workos/user_identities_get_item.ex", + "lib/workos/user_identities_get_item_provider.ex", + "lib/workos/user_invite.ex", + "lib/workos/user_invite_list.ex", + "lib/workos/user_invite_list_list_metadata.ex", + "lib/workos/user_invite_state.ex", + "lib/workos/user_list.ex", + "lib/workos/user_list_list_metadata.ex", + "lib/workos/user_management.ex", + "lib/workos/user_management_authentication_provider.ex", + "lib/workos/user_management_authentication_screen_hint.ex", + "lib/workos/user_management_login_request.ex", + "lib/workos/user_management_organization_membership_statuses.ex", + "lib/workos/user_object.ex", + "lib/workos/user_organization_membership.ex", + "lib/workos/user_organization_membership_base_list.ex", + "lib/workos/user_organization_membership_base_list_data.ex", + "lib/workos/user_organization_membership_base_list_data_status.ex", + "lib/workos/user_organization_membership_base_list_list_metadata.ex", + "lib/workos/user_organization_membership_list.ex", + "lib/workos/user_organization_membership_list_list_metadata.ex", + "lib/workos/user_organization_membership_status.ex", + "lib/workos/user_role_assignment.ex", + "lib/workos/user_role_assignment_list.ex", + "lib/workos/user_role_assignment_list_list_metadata.ex", + "lib/workos/user_role_assignment_resource.ex", + "lib/workos/user_role_assignment_source.ex", + "lib/workos/user_role_assignment_source_type.ex", + "lib/workos/user_sessions_auth_method.ex", + "lib/workos/user_sessions_impersonator.ex", + "lib/workos/user_sessions_list_item.ex", + "lib/workos/user_sessions_status.ex", + "lib/workos/user_updated.ex", + "lib/workos/validate_api_key.ex", + "lib/workos/vault.ex", + "lib/workos/vault_byok_key_deleted.ex", + "lib/workos/vault_byok_key_deleted_data.ex", + "lib/workos/vault_byok_key_provider.ex", + "lib/workos/vault_byok_key_verification_completed.ex", + "lib/workos/vault_byok_key_verification_completed_data.ex", + "lib/workos/vault_data_created.ex", + "lib/workos/vault_data_created_data.ex", + "lib/workos/vault_data_created_data_actor_source.ex", + "lib/workos/vault_data_deleted.ex", + "lib/workos/vault_data_deleted_data.ex", + "lib/workos/vault_data_deleted_data_actor_source.ex", + "lib/workos/vault_data_read.ex", + "lib/workos/vault_data_read_data.ex", + "lib/workos/vault_data_read_data_actor_source.ex", + "lib/workos/vault_data_updated.ex", + "lib/workos/vault_data_updated_data.ex", + "lib/workos/vault_data_updated_data_actor_source.ex", + "lib/workos/vault_dek_decrypted.ex", + "lib/workos/vault_dek_decrypted_data.ex", + "lib/workos/vault_dek_decrypted_data_actor_source.ex", + "lib/workos/vault_dek_read.ex", + "lib/workos/vault_dek_read_data.ex", + "lib/workos/vault_dek_read_data_actor_source.ex", + "lib/workos/vault_kek_created.ex", + "lib/workos/vault_kek_created_data.ex", + "lib/workos/vault_kek_created_data_actor_source.ex", + "lib/workos/vault_kek_deleted.ex", + "lib/workos/vault_kek_deleted_data.ex", + "lib/workos/vault_kek_deleted_data_actor_source.ex", + "lib/workos/vault_metadata_read.ex", + "lib/workos/vault_metadata_read_data.ex", + "lib/workos/vault_metadata_read_data_actor_source.ex", + "lib/workos/vault_names_listed.ex", + "lib/workos/vault_names_listed_data.ex", + "lib/workos/vault_names_listed_data_actor_source.ex", + "lib/workos/vault_object.ex", + "lib/workos/vault_order.ex", + "lib/workos/verify_email_address.ex", + "lib/workos/verify_email_response.ex", + "lib/workos/version_list_response.ex", + "lib/workos/waitlist_user.ex", + "lib/workos/waitlist_user_approved.ex", + "lib/workos/waitlist_user_created.ex", + "lib/workos/waitlist_user_denied.ex", + "lib/workos/waitlist_user_state.ex", + "lib/workos/webhook_endpoint.ex", + "lib/workos/webhook_endpoint_list.ex", + "lib/workos/webhook_endpoint_list_list_metadata.ex", + "lib/workos/webhook_endpoint_status.ex", + "lib/workos/webhooks.ex", + "lib/workos/widget_session_token.ex", + "lib/workos/widget_session_token_response.ex", + "lib/workos/widget_session_token_scopes.ex", + "lib/workos/widgets.ex", + "test/support/fixtures/admin_portal/generate_link.json", + "test/support/fixtures/agents/create_validate.json", + "test/support/fixtures/agents/get_registration.json", + "test/support/fixtures/agents/update_attempts.json", + "test/support/fixtures/api_keys/create_api_key_expire.json", + "test/support/fixtures/api_keys/create_organization_api_key.json", + "test/support/fixtures/api_keys/create_validation.json", + "test/support/fixtures/api_keys/list_organization_api_keys.json", + "test/support/fixtures/audit_logs/create_event.json", + "test/support/fixtures/audit_logs/create_export.json", + "test/support/fixtures/audit_logs/create_schema.json", + "test/support/fixtures/audit_logs/get_export.json", + "test/support/fixtures/audit_logs/get_organization_audit_logs_retention.json", + "test/support/fixtures/audit_logs/list_action_schemas.json", + "test/support/fixtures/audit_logs/list_actions.json", + "test/support/fixtures/audit_logs/update_organization_audit_logs_retention.json", + "test/support/fixtures/authorization/add_environment_role_permission.json", + "test/support/fixtures/authorization/add_organization_role_permission.json", + "test/support/fixtures/authorization/assign_role.json", + "test/support/fixtures/authorization/check.json", + "test/support/fixtures/authorization/create_environment_role.json", + "test/support/fixtures/authorization/create_group_role_assignment.json", + "test/support/fixtures/authorization/create_organization_role.json", + "test/support/fixtures/authorization/create_permission.json", + "test/support/fixtures/authorization/create_resource.json", + "test/support/fixtures/authorization/get_environment_role.json", + "test/support/fixtures/authorization/get_group_role_assignment.json", + "test/support/fixtures/authorization/get_organization_role.json", + "test/support/fixtures/authorization/get_permission.json", + "test/support/fixtures/authorization/get_resource.json", + "test/support/fixtures/authorization/get_resource_by_external_id.json", + "test/support/fixtures/authorization/list_effective_permissions.json", + "test/support/fixtures/authorization/list_effective_permissions_by_external_id.json", + "test/support/fixtures/authorization/list_environment_roles.json", + "test/support/fixtures/authorization/list_group_role_assignments.json", + "test/support/fixtures/authorization/list_memberships_for_resource.json", + "test/support/fixtures/authorization/list_memberships_for_resource_by_external_id.json", + "test/support/fixtures/authorization/list_organization_roles.json", + "test/support/fixtures/authorization/list_permissions.json", + "test/support/fixtures/authorization/list_resources.json", + "test/support/fixtures/authorization/list_resources_for_membership.json", + "test/support/fixtures/authorization/list_role_assignments.json", + "test/support/fixtures/authorization/list_role_assignments_for_resource.json", + "test/support/fixtures/authorization/list_role_assignments_for_resource_by_external_id.json", + "test/support/fixtures/authorization/remove_organization_role_permission.json", + "test/support/fixtures/authorization/set_environment_role_permissions.json", + "test/support/fixtures/authorization/set_organization_role_permissions.json", + "test/support/fixtures/authorization/update_environment_role.json", + "test/support/fixtures/authorization/update_group_role_assignments.json", + "test/support/fixtures/authorization/update_organization_role.json", + "test/support/fixtures/authorization/update_permission.json", + "test/support/fixtures/authorization/update_resource.json", + "test/support/fixtures/authorization/update_resource_by_external_id.json", + "test/support/fixtures/client_api/create_token.json", + "test/support/fixtures/connect/complete_oauth2.json", + "test/support/fixtures/connect/create_application.json", + "test/support/fixtures/connect/create_application_client_secret.json", + "test/support/fixtures/connect/create_m2m_application.json", + "test/support/fixtures/connect/create_oauth_application.json", + "test/support/fixtures/connect/get_application.json", + "test/support/fixtures/connect/list_application_client_secrets.json", + "test/support/fixtures/connect/list_applications.json", + "test/support/fixtures/connect/update_application.json", + "test/support/fixtures/directory_sync/get_directory.json", + "test/support/fixtures/directory_sync/get_group.json", + "test/support/fixtures/directory_sync/get_user.json", + "test/support/fixtures/directory_sync/list_directories.json", + "test/support/fixtures/directory_sync/list_groups.json", + "test/support/fixtures/directory_sync/list_users.json", + "test/support/fixtures/events/list_events.json", + "test/support/fixtures/feature_flags/disable_feature_flag.json", + "test/support/fixtures/feature_flags/enable_feature_flag.json", + "test/support/fixtures/feature_flags/get_feature_flag.json", + "test/support/fixtures/feature_flags/list_feature_flags.json", + "test/support/fixtures/feature_flags/list_organization_feature_flags.json", + "test/support/fixtures/feature_flags/list_user_feature_flags.json", + "test/support/fixtures/groups/create_group_organization_membership.json", + "test/support/fixtures/groups/create_organization_group.json", + "test/support/fixtures/groups/get_organization_group.json", + "test/support/fixtures/groups/list_group_organization_memberships.json", + "test/support/fixtures/groups/list_organization_groups.json", + "test/support/fixtures/groups/update_organization_group.json", + "test/support/fixtures/multi_factor_auth/challenge_factor.json", + "test/support/fixtures/multi_factor_auth/create_user_auth_factor.json", + "test/support/fixtures/multi_factor_auth/enroll_factor.json", + "test/support/fixtures/multi_factor_auth/get_factor.json", + "test/support/fixtures/multi_factor_auth/list_user_auth_factors.json", + "test/support/fixtures/multi_factor_auth/verify_challenge.json", + "test/support/fixtures/organization_domains/create_organization_domain.json", + "test/support/fixtures/organization_domains/get_organization_domain.json", + "test/support/fixtures/organization_domains/verify_organization_domain.json", + "test/support/fixtures/organization_membership/create_organization_membership.json", + "test/support/fixtures/organization_membership/deactivate_organization_membership.json", + "test/support/fixtures/organization_membership/get_organization_membership.json", + "test/support/fixtures/organization_membership/list_organization_membership_groups.json", + "test/support/fixtures/organization_membership/list_organization_memberships.json", + "test/support/fixtures/organization_membership/reactivate_organization_membership.json", + "test/support/fixtures/organization_membership/update_organization_membership.json", + "test/support/fixtures/organizations/create_organization.json", + "test/support/fixtures/organizations/get_audit_log_configuration.json", + "test/support/fixtures/organizations/get_organization.json", + "test/support/fixtures/organizations/get_organization_by_external_id.json", + "test/support/fixtures/organizations/list_authorized_applications.json", + "test/support/fixtures/organizations/list_organizations.json", + "test/support/fixtures/organizations/update_organization.json", + "test/support/fixtures/pipes/authorize_data_integration.json", + "test/support/fixtures/pipes/create_data_integration.json", + "test/support/fixtures/pipes/create_data_integration_credential.json", + "test/support/fixtures/pipes/create_user_connected_account.json", + "test/support/fixtures/pipes/get_access_token.json", + "test/support/fixtures/pipes/get_data_integration.json", + "test/support/fixtures/pipes/get_user_connected_account.json", + "test/support/fixtures/pipes/list_data_integrations.json", + "test/support/fixtures/pipes/list_user_data_providers.json", + "test/support/fixtures/pipes/update_data_integration.json", + "test/support/fixtures/pipes/update_data_integration_api_key.json", + "test/support/fixtures/pipes/update_user_connected_account.json", + "test/support/fixtures/pipes_provider/list_organization_data_integration_configurations.json", + "test/support/fixtures/pipes_provider/update_organization_data_integration_configuration.json", + "test/support/fixtures/radar/add_list_entry.json", + "test/support/fixtures/radar/create_attempt.json", + "test/support/fixtures/sso/authorize_logout.json", + "test/support/fixtures/sso/get_connection.json", + "test/support/fixtures/sso/get_profile.json", + "test/support/fixtures/sso/get_profile_and_token.json", + "test/support/fixtures/sso/list_connections.json", + "test/support/fixtures/user_management/accept_invitation.json", + "test/support/fixtures/user_management/authenticate_with_code.json", + "test/support/fixtures/user_management/authenticate_with_device_code.json", + "test/support/fixtures/user_management/authenticate_with_email_verification.json", + "test/support/fixtures/user_management/authenticate_with_magic_auth.json", + "test/support/fixtures/user_management/authenticate_with_organization_selection.json", + "test/support/fixtures/user_management/authenticate_with_password.json", + "test/support/fixtures/user_management/authenticate_with_radar_email_challenge.json", + "test/support/fixtures/user_management/authenticate_with_radar_sms_challenge.json", + "test/support/fixtures/user_management/authenticate_with_refresh_token.json", + "test/support/fixtures/user_management/authenticate_with_totp.json", + "test/support/fixtures/user_management/confirm_email_change.json", + "test/support/fixtures/user_management/confirm_password_reset.json", + "test/support/fixtures/user_management/create_authenticate.json", + "test/support/fixtures/user_management/create_cors_origin.json", + "test/support/fixtures/user_management/create_device.json", + "test/support/fixtures/user_management/create_magic_auth.json", + "test/support/fixtures/user_management/create_radar_challenge.json", + "test/support/fixtures/user_management/create_redirect_uri.json", + "test/support/fixtures/user_management/create_user.json", + "test/support/fixtures/user_management/create_user_api_key.json", + "test/support/fixtures/user_management/find_invitation_by_token.json", + "test/support/fixtures/user_management/get_email_verification.json", + "test/support/fixtures/user_management/get_invitation.json", + "test/support/fixtures/user_management/get_jwks.json", + "test/support/fixtures/user_management/get_magic_auth.json", + "test/support/fixtures/user_management/get_password_reset.json", + "test/support/fixtures/user_management/get_radar_challenge.json", + "test/support/fixtures/user_management/get_user.json", + "test/support/fixtures/user_management/get_user_by_external_id.json", + "test/support/fixtures/user_management/get_user_identities.json", + "test/support/fixtures/user_management/list_cors_origins.json", + "test/support/fixtures/user_management/list_invitations.json", + "test/support/fixtures/user_management/list_jwt_template.json", + "test/support/fixtures/user_management/list_redirect_uris.json", + "test/support/fixtures/user_management/list_sessions.json", + "test/support/fixtures/user_management/list_user_api_keys.json", + "test/support/fixtures/user_management/list_user_authorized_applications.json", + "test/support/fixtures/user_management/list_users.json", + "test/support/fixtures/user_management/resend_invitation.json", + "test/support/fixtures/user_management/reset_password.json", + "test/support/fixtures/user_management/revoke_invitation.json", + "test/support/fixtures/user_management/send_email_change.json", + "test/support/fixtures/user_management/send_invitation.json", + "test/support/fixtures/user_management/send_verification_email.json", + "test/support/fixtures/user_management/update_jwt_template.json", + "test/support/fixtures/user_management/update_user.json", + "test/support/fixtures/user_management/verify_email.json", + "test/support/fixtures/vault/create_data_key.json", + "test/support/fixtures/vault/create_decrypt.json", + "test/support/fixtures/vault/create_kv.json", + "test/support/fixtures/vault/create_rekey.json", + "test/support/fixtures/vault/delete_kv.json", + "test/support/fixtures/vault/get_kv.json", + "test/support/fixtures/vault/get_name.json", + "test/support/fixtures/vault/list_kv.json", + "test/support/fixtures/vault/list_kv_metadata.json", + "test/support/fixtures/vault/list_kv_versions.json", + "test/support/fixtures/vault/update_kv.json", + "test/support/fixtures/webhooks/create_webhook_endpoint.json", + "test/support/fixtures/webhooks/list_webhook_endpoints.json", + "test/support/fixtures/webhooks/update_webhook_endpoint.json", + "test/support/fixtures/widgets/create_token.json", + "test/workos/admin_portal_round_trip_test.exs", + "test/workos/admin_portal_test.exs", + "test/workos/agents_round_trip_test.exs", + "test/workos/agents_test.exs", + "test/workos/api_keys_round_trip_test.exs", + "test/workos/api_keys_test.exs", + "test/workos/audit_logs_round_trip_test.exs", + "test/workos/audit_logs_test.exs", + "test/workos/authorization_round_trip_test.exs", + "test/workos/authorization_test.exs", + "test/workos/client_api_round_trip_test.exs", + "test/workos/client_api_test.exs", + "test/workos/connect_round_trip_test.exs", + "test/workos/connect_test.exs", + "test/workos/directory_sync_round_trip_test.exs", + "test/workos/directory_sync_test.exs", + "test/workos/events_round_trip_test.exs", + "test/workos/events_test.exs", + "test/workos/feature_flags_round_trip_test.exs", + "test/workos/feature_flags_test.exs", + "test/workos/groups_round_trip_test.exs", + "test/workos/groups_test.exs", + "test/workos/multi_factor_auth_round_trip_test.exs", + "test/workos/multi_factor_auth_test.exs", + "test/workos/organization_domains_round_trip_test.exs", + "test/workos/organization_domains_test.exs", + "test/workos/organization_membership_service_round_trip_test.exs", + "test/workos/organization_membership_service_test.exs", + "test/workos/organizations_round_trip_test.exs", + "test/workos/organizations_test.exs", + "test/workos/pipes_provider_round_trip_test.exs", + "test/workos/pipes_provider_test.exs", + "test/workos/pipes_round_trip_test.exs", + "test/workos/pipes_test.exs", + "test/workos/radar_round_trip_test.exs", + "test/workos/radar_test.exs", + "test/workos/sso_round_trip_test.exs", + "test/workos/sso_test.exs", + "test/workos/user_management_round_trip_test.exs", + "test/workos/user_management_test.exs", + "test/workos/vault_round_trip_test.exs", + "test/workos/vault_test.exs", + "test/workos/webhooks_round_trip_test.exs", + "test/workos/webhooks_test.exs", + "test/workos/widgets_round_trip_test.exs", + "test/workos/widgets_test.exs" + ], + "operations": { + "PATCH /agents/claims/attempts": { + "sdkMethod": "update_attempts", + "service": "agents" + }, + "POST /agents/credentials/validate": { + "sdkMethod": "create_validate", + "service": "agents" + }, + "GET /agents/registrations/{id}": { + "sdkMethod": "get_registration", + "service": "agents" + }, + "POST /auth/challenges/{id}/verify": { + "sdkMethod": "verify_challenge", + "service": "multi_factor_auth" + }, + "POST /auth/factors/enroll": { + "sdkMethod": "enroll_factor", + "service": "multi_factor_auth" + }, + "GET /auth/factors/{id}": { + "sdkMethod": "get_factor", + "service": "multi_factor_auth" + }, + "DELETE /auth/factors/{id}": { + "sdkMethod": "delete_factor", + "service": "multi_factor_auth" + }, + "POST /auth/factors/{id}/challenge": { + "sdkMethod": "challenge_factor", + "service": "multi_factor_auth" + }, + "POST /authkit/oauth2/complete": { + "sdkMethod": "complete_oauth2", + "service": "connect" + }, + "GET /authorization/groups/{group_id}/role_assignments": { + "sdkMethod": "list_group_role_assignments", + "service": "authorization" + }, + "POST /authorization/groups/{group_id}/role_assignments": { + "sdkMethod": "create_group_role_assignment", + "service": "authorization" + }, + "PUT /authorization/groups/{group_id}/role_assignments": { + "sdkMethod": "update_group_role_assignments", + "service": "authorization" + }, + "DELETE /authorization/groups/{group_id}/role_assignments": { + "sdkMethod": "delete_group_role_assignments", + "service": "authorization" + }, + "GET /authorization/groups/{group_id}/role_assignments/{role_assignment_id}": { + "sdkMethod": "get_group_role_assignment", + "service": "authorization" + }, + "DELETE /authorization/groups/{group_id}/role_assignments/{role_assignment_id}": { + "sdkMethod": "delete_group_role_assignment", + "service": "authorization" + }, + "POST /authorization/organization_memberships/{organization_membership_id}/check": { + "sdkMethod": "check", + "service": "authorization" + }, + "GET /authorization/organization_memberships/{organization_membership_id}/resources": { + "sdkMethod": "list_resources_for_membership", + "service": "authorization" + }, + "GET /authorization/organization_memberships/{organization_membership_id}/resources/{resource_id}/permissions": { + "sdkMethod": "list_effective_permissions", + "service": "authorization" + }, + "GET /authorization/organization_memberships/{organization_membership_id}/resources/{resource_type_slug}/{external_id}/permissions": { + "sdkMethod": "list_effective_permissions_by_external_id", + "service": "authorization" + }, + "GET /authorization/organization_memberships/{organization_membership_id}/role_assignments": { + "sdkMethod": "list_role_assignments", + "service": "authorization" + }, + "POST /authorization/organization_memberships/{organization_membership_id}/role_assignments": { + "sdkMethod": "assign_role", + "service": "authorization" + }, + "DELETE /authorization/organization_memberships/{organization_membership_id}/role_assignments": { + "sdkMethod": "remove_role", + "service": "authorization" + }, + "DELETE /authorization/organization_memberships/{organization_membership_id}/role_assignments/{role_assignment_id}": { + "sdkMethod": "remove_role_assignment", + "service": "authorization" + }, + "GET /authorization/organizations/{organizationId}/roles": { + "sdkMethod": "list_organization_roles", + "service": "authorization" + }, + "POST /authorization/organizations/{organizationId}/roles": { + "sdkMethod": "create_organization_role", + "service": "authorization" + }, + "GET /authorization/organizations/{organizationId}/roles/{slug}": { + "sdkMethod": "get_organization_role", + "service": "authorization" + }, + "PATCH /authorization/organizations/{organizationId}/roles/{slug}": { + "sdkMethod": "update_organization_role", + "service": "authorization" + }, + "DELETE /authorization/organizations/{organizationId}/roles/{slug}": { + "sdkMethod": "delete_organization_role", + "service": "authorization" + }, + "POST /authorization/organizations/{organizationId}/roles/{slug}/permissions": { + "sdkMethod": "add_organization_role_permission", + "service": "authorization" + }, + "PUT /authorization/organizations/{organizationId}/roles/{slug}/permissions": { + "sdkMethod": "set_organization_role_permissions", + "service": "authorization" + }, + "DELETE /authorization/organizations/{organizationId}/roles/{slug}/permissions/{permissionSlug}": { + "sdkMethod": "remove_organization_role_permission", + "service": "authorization" + }, + "GET /authorization/organizations/{organization_id}/resources/{resource_type_slug}/{external_id}": { + "sdkMethod": "get_resource_by_external_id", + "service": "authorization" + }, + "PATCH /authorization/organizations/{organization_id}/resources/{resource_type_slug}/{external_id}": { + "sdkMethod": "update_resource_by_external_id", + "service": "authorization" + }, + "DELETE /authorization/organizations/{organization_id}/resources/{resource_type_slug}/{external_id}": { + "sdkMethod": "delete_resource_by_external_id", + "service": "authorization" + }, + "GET /authorization/organizations/{organization_id}/resources/{resource_type_slug}/{external_id}/organization_memberships": { + "sdkMethod": "list_memberships_for_resource_by_external_id", + "service": "authorization" + }, + "GET /authorization/organizations/{organization_id}/resources/{resource_type_slug}/{external_id}/role_assignments": { + "sdkMethod": "list_role_assignments_for_resource_by_external_id", + "service": "authorization" + }, + "GET /authorization/resources": { + "sdkMethod": "list_resources", + "service": "authorization" + }, + "POST /authorization/resources": { + "sdkMethod": "create_resource", + "service": "authorization" + }, + "GET /authorization/resources/{resource_id}": { + "sdkMethod": "get_resource", + "service": "authorization" + }, + "PATCH /authorization/resources/{resource_id}": { + "sdkMethod": "update_resource", + "service": "authorization" + }, + "DELETE /authorization/resources/{resource_id}": { + "sdkMethod": "delete_resource", + "service": "authorization" + }, + "GET /authorization/resources/{resource_id}/organization_memberships": { + "sdkMethod": "list_memberships_for_resource", + "service": "authorization" + }, + "GET /authorization/resources/{resource_id}/role_assignments": { + "sdkMethod": "list_role_assignments_for_resource", + "service": "authorization" + }, + "GET /authorization/roles": { + "sdkMethod": "list_environment_roles", + "service": "authorization" + }, + "POST /authorization/roles": { + "sdkMethod": "create_environment_role", + "service": "authorization" + }, + "GET /authorization/roles/{slug}": { + "sdkMethod": "get_environment_role", + "service": "authorization" + }, + "PATCH /authorization/roles/{slug}": { + "sdkMethod": "update_environment_role", + "service": "authorization" + }, + "POST /authorization/roles/{slug}/permissions": { + "sdkMethod": "add_environment_role_permission", + "service": "authorization" + }, + "PUT /authorization/roles/{slug}/permissions": { + "sdkMethod": "set_environment_role_permissions", + "service": "authorization" + }, + "GET /authorization/permissions": { + "sdkMethod": "list_permissions", + "service": "authorization" + }, + "POST /authorization/permissions": { + "sdkMethod": "create_permission", + "service": "authorization" + }, + "GET /authorization/permissions/{slug}": { + "sdkMethod": "get_permission", + "service": "authorization" + }, + "PATCH /authorization/permissions/{slug}": { + "sdkMethod": "update_permission", + "service": "authorization" + }, + "DELETE /authorization/permissions/{slug}": { + "sdkMethod": "delete_permission", + "service": "authorization" + }, + "POST /client/token": { + "sdkMethod": "create_token", + "service": "client_api" + }, + "GET /connect/applications": { + "sdkMethod": "list_applications", + "service": "connect" + }, + "POST /connect/applications": { + "sdkMethod": "create_application", + "service": "connect" + }, + "GET /connect/applications/{id}": { + "sdkMethod": "get_application", + "service": "connect" + }, + "PUT /connect/applications/{id}": { + "sdkMethod": "update_application", + "service": "connect" + }, + "DELETE /connect/applications/{id}": { + "sdkMethod": "delete_application", + "service": "connect" + }, + "GET /connect/applications/{id}/client_secrets": { + "sdkMethod": "list_application_client_secrets", + "service": "connect" + }, + "POST /connect/applications/{id}/client_secrets": { + "sdkMethod": "create_application_client_secret", + "service": "connect" + }, + "DELETE /connect/client_secrets/{id}": { + "sdkMethod": "delete_client_secret", + "service": "connect" + }, + "GET /connections": { + "sdkMethod": "list_connections", + "service": "sso" + }, + "GET /connections/{id}": { + "sdkMethod": "get_connection", + "service": "sso" + }, + "DELETE /connections/{id}": { + "sdkMethod": "delete_connection", + "service": "sso" + }, + "GET /data-integrations": { + "sdkMethod": "list_data_integrations", + "service": "pipes" + }, + "POST /data-integrations": { + "sdkMethod": "create_data_integration", + "service": "pipes" + }, + "GET /data-integrations/{slug}": { + "sdkMethod": "get_data_integration", + "service": "pipes" + }, + "PUT /data-integrations/{slug}": { + "sdkMethod": "update_data_integration", + "service": "pipes" + }, + "DELETE /data-integrations/{slug}": { + "sdkMethod": "delete_data_integration", + "service": "pipes" + }, + "PUT /data-integrations/{slug}/api-key": { + "sdkMethod": "update_data_integration_api_key", + "service": "pipes" + }, + "POST /data-integrations/{slug}/authorize": { + "sdkMethod": "authorize_data_integration", + "service": "pipes" + }, + "POST /data-integrations/{slug}/credentials": { + "sdkMethod": "create_data_integration_credential", + "service": "pipes" + }, + "POST /data-integrations/{provider}/token": { + "sdkMethod": "get_access_token", + "service": "pipes" + }, + "GET /directories": { + "sdkMethod": "list_directories", + "service": "directory_sync" + }, + "GET /directories/{id}": { + "sdkMethod": "get_directory", + "service": "directory_sync" + }, + "DELETE /directories/{id}": { + "sdkMethod": "delete_directory", + "service": "directory_sync" + }, + "GET /directory_groups": { + "sdkMethod": "list_groups", + "service": "directory_sync" + }, + "GET /directory_groups/{id}": { + "sdkMethod": "get_group", + "service": "directory_sync" + }, + "GET /directory_users": { + "sdkMethod": "list_users", + "service": "directory_sync" + }, + "GET /directory_users/{id}": { + "sdkMethod": "get_user", + "service": "directory_sync" + }, + "GET /events": { + "sdkMethod": "list_events", + "service": "events" + }, + "GET /feature-flags": { + "sdkMethod": "list_feature_flags", + "service": "feature_flags" + }, + "GET /feature-flags/{slug}": { + "sdkMethod": "get_feature_flag", + "service": "feature_flags" + }, + "PUT /feature-flags/{slug}/disable": { + "sdkMethod": "disable_feature_flag", + "service": "feature_flags" + }, + "PUT /feature-flags/{slug}/enable": { + "sdkMethod": "enable_feature_flag", + "service": "feature_flags" + }, + "POST /feature-flags/{slug}/targets/{resourceId}": { + "sdkMethod": "add_flag_target", + "service": "feature_flags" + }, + "DELETE /feature-flags/{slug}/targets/{resourceId}": { + "sdkMethod": "remove_flag_target", + "service": "feature_flags" + }, + "POST /organization_domains": { + "sdkMethod": "create_organization_domain", + "service": "organization_domains" + }, + "GET /organization_domains/{id}": { + "sdkMethod": "get_organization_domain", + "service": "organization_domains" + }, + "DELETE /organization_domains/{id}": { + "sdkMethod": "delete_organization_domain", + "service": "organization_domains" + }, + "POST /organization_domains/{id}/verify": { + "sdkMethod": "verify_organization_domain", + "service": "organization_domains" + }, + "GET /organizations": { + "sdkMethod": "list_organizations", + "service": "organizations" + }, + "POST /organizations": { + "sdkMethod": "create_organization", + "service": "organizations" + }, + "GET /organizations/external_id/{external_id}": { + "sdkMethod": "get_organization_by_external_id", + "service": "organizations" + }, + "GET /organizations/{id}": { + "sdkMethod": "get_organization", + "service": "organizations" + }, + "PUT /organizations/{id}": { + "sdkMethod": "update_organization", + "service": "organizations" + }, + "DELETE /organizations/{id}": { + "sdkMethod": "delete_organization", + "service": "organizations" + }, + "GET /organizations/{id}/audit_log_configuration": { + "sdkMethod": "get_audit_log_configuration", + "service": "organizations" + }, + "GET /organizations/{id}/audit_logs_retention": { + "sdkMethod": "get_organization_audit_logs_retention", + "service": "audit_logs" + }, + "PUT /organizations/{id}/audit_logs_retention": { + "sdkMethod": "update_organization_audit_logs_retention", + "service": "audit_logs" + }, + "GET /organizations/{organizationId}/api_keys": { + "sdkMethod": "list_organization_api_keys", + "service": "api_keys" + }, + "POST /organizations/{organizationId}/api_keys": { + "sdkMethod": "create_organization_api_key", + "service": "api_keys" + }, + "GET /organizations/{organizationId}/data_integration_configurations": { + "sdkMethod": "list_organization_data_integration_configurations", + "service": "pipes_provider" + }, + "PUT /organizations/{organizationId}/data_integration_configurations/{slug}": { + "sdkMethod": "update_organization_data_integration_configuration", + "service": "pipes_provider" + }, + "GET /organizations/{organizationId}/feature-flags": { + "sdkMethod": "list_organization_feature_flags", + "service": "feature_flags" + }, + "GET /organizations/{organizationId}/groups": { + "sdkMethod": "list_organization_groups", + "service": "groups" + }, + "POST /organizations/{organizationId}/groups": { + "sdkMethod": "create_organization_group", + "service": "groups" + }, + "GET /organizations/{organizationId}/groups/{groupId}": { + "sdkMethod": "get_organization_group", + "service": "groups" + }, + "PATCH /organizations/{organizationId}/groups/{groupId}": { + "sdkMethod": "update_organization_group", + "service": "groups" + }, + "DELETE /organizations/{organizationId}/groups/{groupId}": { + "sdkMethod": "delete_organization_group", + "service": "groups" + }, + "GET /organizations/{organizationId}/groups/{groupId}/organization-memberships": { + "sdkMethod": "list_group_organization_memberships", + "service": "groups" + }, + "POST /organizations/{organizationId}/groups/{groupId}/organization-memberships": { + "sdkMethod": "create_group_organization_membership", + "service": "groups" + }, + "DELETE /organizations/{organizationId}/groups/{groupId}/organization-memberships/{omId}": { + "sdkMethod": "delete_group_organization_membership", + "service": "groups" + }, + "GET /organizations/{organization_id}/authorized_applications": { + "sdkMethod": "list_authorized_applications", + "service": "organizations" + }, + "POST /portal/generate_link": { + "sdkMethod": "generate_link", + "service": "admin_portal" + }, + "POST /radar/attempts": { + "sdkMethod": "create_attempt", + "service": "radar" + }, + "PUT /radar/attempts/{id}": { + "sdkMethod": "update_attempt", + "service": "radar" + }, + "POST /radar/lists/{type}/{action}": { + "sdkMethod": "add_list_entry", + "service": "radar" + }, + "DELETE /radar/lists/{type}/{action}": { + "sdkMethod": "remove_list_entry", + "service": "radar" + }, + "POST /sso/logout/authorize": { + "sdkMethod": "authorize_logout", + "service": "sso" + }, + "GET /sso/profile": { + "sdkMethod": "get_profile", + "service": "sso" + }, + "POST /sso/token": { + "sdkMethod": "get_profile_and_token", + "service": "sso" + }, + "GET /sso/jwks/{clientId}": { + "sdkMethod": "get_jwks", + "service": "user_management" + }, + "POST /user_management/authenticate": { + "sdkMethod": "create_authenticate", + "service": "user_management" + }, + "POST /user_management/authorize/device": { + "sdkMethod": "create_device", + "service": "user_management" + }, + "POST /user_management/radar_challenges": { + "sdkMethod": "create_radar_challenge", + "service": "user_management" + }, + "GET /user_management/radar_challenges/{id}": { + "sdkMethod": "get_radar_challenge", + "service": "user_management" + }, + "POST /user_management/sessions/revoke": { + "sdkMethod": "revoke_session", + "service": "user_management" + }, + "GET /user_management/cors_origins": { + "sdkMethod": "list_cors_origins", + "service": "user_management" + }, + "POST /user_management/cors_origins": { + "sdkMethod": "create_cors_origin", + "service": "user_management" + }, + "GET /user_management/email_verification/{id}": { + "sdkMethod": "get_email_verification", + "service": "user_management" + }, + "POST /user_management/password_reset": { + "sdkMethod": "reset_password", + "service": "user_management" + }, + "POST /user_management/password_reset/confirm": { + "sdkMethod": "confirm_password_reset", + "service": "user_management" + }, + "GET /user_management/password_reset/{id}": { + "sdkMethod": "get_password_reset", + "service": "user_management" + }, + "GET /user_management/users": { + "sdkMethod": "list_users", + "service": "user_management" + }, + "POST /user_management/users": { + "sdkMethod": "create_user", + "service": "user_management" + }, + "GET /user_management/users/external_id/{external_id}": { + "sdkMethod": "get_user_by_external_id", + "service": "user_management" + }, + "GET /user_management/users/{id}": { + "sdkMethod": "get_user", + "service": "user_management" + }, + "PUT /user_management/users/{id}": { + "sdkMethod": "update_user", + "service": "user_management" + }, + "DELETE /user_management/users/{id}": { + "sdkMethod": "delete_user", + "service": "user_management" + }, + "POST /user_management/users/{id}/email_change/confirm": { + "sdkMethod": "confirm_email_change", + "service": "user_management" + }, + "POST /user_management/users/{id}/email_change/send": { + "sdkMethod": "send_email_change", + "service": "user_management" + }, + "POST /user_management/users/{id}/email_verification/confirm": { + "sdkMethod": "verify_email", + "service": "user_management" + }, + "POST /user_management/users/{id}/email_verification/send": { + "sdkMethod": "send_verification_email", + "service": "user_management" + }, + "GET /user_management/users/{id}/identities": { + "sdkMethod": "get_user_identities", + "service": "user_management" + }, + "GET /user_management/users/{id}/sessions": { + "sdkMethod": "list_sessions", + "service": "user_management" + }, + "GET /user_management/invitations": { + "sdkMethod": "list_invitations", + "service": "user_management" + }, + "POST /user_management/invitations": { + "sdkMethod": "send_invitation", + "service": "user_management" + }, + "GET /user_management/invitations/by_token/{token}": { + "sdkMethod": "find_invitation_by_token", + "service": "user_management" + }, + "GET /user_management/invitations/{id}": { + "sdkMethod": "get_invitation", + "service": "user_management" + }, + "POST /user_management/invitations/{id}/accept": { + "sdkMethod": "accept_invitation", + "service": "user_management" + }, + "POST /user_management/invitations/{id}/resend": { + "sdkMethod": "resend_invitation", + "service": "user_management" + }, + "POST /user_management/invitations/{id}/revoke": { + "sdkMethod": "revoke_invitation", + "service": "user_management" + }, + "GET /user_management/jwt_template": { + "sdkMethod": "list_jwt_template", + "service": "user_management" + }, + "PUT /user_management/jwt_template": { + "sdkMethod": "update_jwt_template", + "service": "user_management" + }, + "POST /user_management/magic_auth": { + "sdkMethod": "create_magic_auth", + "service": "user_management" + }, + "GET /user_management/magic_auth/{id}": { + "sdkMethod": "get_magic_auth", + "service": "user_management" + }, + "GET /user_management/organization_memberships": { + "sdkMethod": "list_organization_memberships", + "service": "organization_membership_service" + }, + "POST /user_management/organization_memberships": { + "sdkMethod": "create_organization_membership", + "service": "organization_membership_service" + }, + "GET /user_management/organization_memberships/{id}": { + "sdkMethod": "get_organization_membership", + "service": "organization_membership_service" + }, + "PUT /user_management/organization_memberships/{id}": { + "sdkMethod": "update_organization_membership", + "service": "organization_membership_service" + }, + "DELETE /user_management/organization_memberships/{id}": { + "sdkMethod": "delete_organization_membership", + "service": "organization_membership_service" + }, + "PUT /user_management/organization_memberships/{id}/deactivate": { + "sdkMethod": "deactivate_organization_membership", + "service": "organization_membership_service" + }, + "PUT /user_management/organization_memberships/{id}/reactivate": { + "sdkMethod": "reactivate_organization_membership", + "service": "organization_membership_service" + }, + "GET /user_management/organization_memberships/{omId}/groups": { + "sdkMethod": "list_organization_membership_groups", + "service": "organization_membership_service" + }, + "GET /user_management/redirect_uris": { + "sdkMethod": "list_redirect_uris", + "service": "user_management" + }, + "POST /user_management/redirect_uris": { + "sdkMethod": "create_redirect_uri", + "service": "user_management" + }, + "DELETE /user_management/redirect_uris/{id}": { + "sdkMethod": "delete_redirect_uris", + "service": "user_management" + }, + "GET /user_management/users/{userId}/feature-flags": { + "sdkMethod": "list_user_feature_flags", + "service": "feature_flags" + }, + "GET /user_management/users/{user_id}/authorized_applications": { + "sdkMethod": "list_user_authorized_applications", + "service": "user_management" + }, + "DELETE /user_management/users/{user_id}/authorized_applications/{application_id}": { + "sdkMethod": "delete_user_authorized_application", + "service": "user_management" + }, + "GET /user_management/users/{user_id}/connected_accounts/{slug}": { + "sdkMethod": "get_user_connected_account", + "service": "pipes" + }, + "POST /user_management/users/{user_id}/connected_accounts/{slug}": { + "sdkMethod": "create_user_connected_account", + "service": "pipes" + }, + "PUT /user_management/users/{user_id}/connected_accounts/{slug}": { + "sdkMethod": "update_user_connected_account", + "service": "pipes" + }, + "DELETE /user_management/users/{user_id}/connected_accounts/{slug}": { + "sdkMethod": "delete_user_connected_account", + "service": "pipes" + }, + "GET /user_management/users/{user_id}/data_providers": { + "sdkMethod": "list_user_data_providers", + "service": "pipes" + }, + "GET /user_management/users/{userlandUserId}/auth_factors": { + "sdkMethod": "list_user_auth_factors", + "service": "multi_factor_auth" + }, + "POST /user_management/users/{userlandUserId}/auth_factors": { + "sdkMethod": "create_user_auth_factor", + "service": "multi_factor_auth" + }, + "POST /vault/v1/keys/data-key": { + "sdkMethod": "create_data_key", + "service": "vault" + }, + "POST /vault/v1/keys/decrypt": { + "sdkMethod": "create_decrypt", + "service": "vault" + }, + "POST /vault/v1/keys/rekey": { + "sdkMethod": "create_rekey", + "service": "vault" + }, + "GET /vault/v1/kv": { + "sdkMethod": "list_kv", + "service": "vault" + }, + "POST /vault/v1/kv": { + "sdkMethod": "create_kv", + "service": "vault" + }, + "GET /vault/v1/kv/name/{name}": { + "sdkMethod": "get_name", + "service": "vault" + }, + "GET /vault/v1/kv/{id}": { + "sdkMethod": "get_kv", + "service": "vault" + }, + "PUT /vault/v1/kv/{id}": { + "sdkMethod": "update_kv", + "service": "vault" + }, + "DELETE /vault/v1/kv/{id}": { + "sdkMethod": "delete_kv", + "service": "vault" + }, + "GET /vault/v1/kv/{id}/metadata": { + "sdkMethod": "list_kv_metadata", + "service": "vault" + }, + "GET /vault/v1/kv/{id}/versions": { + "sdkMethod": "list_kv_versions", + "service": "vault" + }, + "GET /webhook_endpoints": { + "sdkMethod": "list_webhook_endpoints", + "service": "webhooks" + }, + "POST /webhook_endpoints": { + "sdkMethod": "create_webhook_endpoint", + "service": "webhooks" + }, + "PATCH /webhook_endpoints/{id}": { + "sdkMethod": "update_webhook_endpoint", + "service": "webhooks" + }, + "DELETE /webhook_endpoints/{id}": { + "sdkMethod": "delete_webhook_endpoint", + "service": "webhooks" + }, + "POST /widgets/token": { + "sdkMethod": "create_token", + "service": "widgets" + }, + "POST /api_keys/validations": { + "sdkMethod": "create_validation", + "service": "api_keys" + }, + "DELETE /api_keys/{id}": { + "sdkMethod": "delete_api_key", + "service": "api_keys" + }, + "POST /api_keys/{id}/expire": { + "sdkMethod": "create_api_key_expire", + "service": "api_keys" + }, + "GET /user_management/users/{userId}/api_keys": { + "sdkMethod": "list_user_api_keys", + "service": "user_management" + }, + "POST /user_management/users/{userId}/api_keys": { + "sdkMethod": "create_user_api_key", + "service": "user_management" + }, + "GET /audit_logs/actions": { + "sdkMethod": "list_actions", + "service": "audit_logs" + }, + "GET /audit_logs/actions/{actionName}/schemas": { + "sdkMethod": "list_action_schemas", + "service": "audit_logs" + }, + "POST /audit_logs/actions/{actionName}/schemas": { + "sdkMethod": "create_schema", + "service": "audit_logs" + }, + "POST /audit_logs/events": { + "sdkMethod": "create_event", + "service": "audit_logs" + }, + "POST /audit_logs/exports": { + "sdkMethod": "create_export", + "service": "audit_logs" + }, + "GET /audit_logs/exports/{auditLogExportId}": { + "sdkMethod": "get_export", + "service": "audit_logs" + } + } +} diff --git a/.vscode/settings.json b/.vscode/settings.json index 6a171bfd..a76488fd 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,8 @@ { "[github-actions-workflow]": { "editor.defaultFormatter": "redhat.vscode-yaml" + }, + "[markdown]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" } } diff --git a/AGENTS.md b/AGENTS.md new file mode 120000 index 00000000..ac55cbdc --- /dev/null +++ b/AGENTS.md @@ -0,0 +1 @@ +.claude/CLAUDE.md \ No newline at end of file diff --git a/README.md b/README.md old mode 100755 new mode 100644 index e7abc5eb..beb6bbc0 --- a/README.md +++ b/README.md @@ -1,7 +1,5 @@ # WorkOS Elixir Library -> **Note:** this an experimental SDK and breaking changes may occur. We don't recommend using this in production since we can't guarantee its stability. - The WorkOS library for Elixir provides convenient access to the WorkOS API from applications written in Elixir. ## Documentation @@ -12,27 +10,40 @@ See the [API Reference](https://workos.com/docs/reference/client-libraries) for Add this package to the list of dependencies in your `mix.exs` file: -```ex +```elixir def deps do - [{:workos, "~> 1.1"}] + [{:workos, "~> 1.0"}] end ``` -## Configuration +Requires Elixir 1.18 or later. + +## Usage -### Configure WorkOS API key & client ID on your app config +Build a client with your API key, then pass it to any API function: -```ex -config :workos, WorkOS.Client, - api_key: "sk_example_123456789", - client_id: "client_123456789" +```elixir +client = WorkOS.client(api_key: "sk_example_123456789") +# or set the WORKOS_API_KEY environment variable and call WorkOS.client() + +{:ok, organization} = WorkOS.Organizations.get_organization(client, "org_01EHZNVPK3SFK441A1RGBFSHRT") ``` -The only required config option is `:api_key` and `:client_id`. +All API functions take the client as their first argument and return `{:ok, result}` or `{:error, error}` tuples. Errors are typed: `WorkOS.ApiError` for non-2xx API responses (with a `:kind` atom such as `:not_found`) and `WorkOS.TransportError` for network failures. + +Client configuration is per-instance — there is no global state. Options: `:api_key`, `:base_url`, `:timeout`, `:max_retries`, `:req_options`. Per-request options (`:headers`, `:timeout`, `:idempotency_key`, `:query`) can be passed as the final argument to any API function. -By default, this library uses [Tesla](https://github.com/elixir-tesla/tesla) but it can be replaced via the `:client` option, according to the `WorkOS.Client` module behavior. +### Pagination -### +List endpoints return a `WorkOS.Page`. Use `WorkOS.Page.stream/1` to lazily iterate across every page: + +```elixir +{:ok, page} = WorkOS.Organizations.list_organizations(client) + +page +|> WorkOS.Page.stream() +|> Enum.each(&IO.inspect/1) +``` ## SDK Versioning diff --git a/config/config.exs b/config/config.exs deleted file mode 100644 index 871a3d1e..00000000 --- a/config/config.exs +++ /dev/null @@ -1,3 +0,0 @@ -import Config - -import_config "#{Mix.env()}.exs" diff --git a/config/dev.exs b/config/dev.exs deleted file mode 100644 index 32741e70..00000000 --- a/config/dev.exs +++ /dev/null @@ -1,5 +0,0 @@ -import Config - -config :workos, WorkOS.Client, - client_id: System.get_env("WORKOS_CLIENT_ID"), - api_key: System.get_env("WORKOS_API_KEY") diff --git a/config/prod.exs b/config/prod.exs deleted file mode 100644 index d932aaf7..00000000 --- a/config/prod.exs +++ /dev/null @@ -1 +0,0 @@ -# This empty module is for configuration purposes diff --git a/config/test.exs b/config/test.exs deleted file mode 100644 index fb9ed471..00000000 --- a/config/test.exs +++ /dev/null @@ -1,16 +0,0 @@ -import Config - -workos_api_key = System.get_env("WORKOS_API_KEY") -workos_client_id = System.get_env("WORKOS_CLIENT_ID") - -case {workos_api_key, workos_client_id} do - {nil, nil} -> - config :tesla, adapter: Tesla.Mock - - config :workos, WorkOS.Client, - api_key: "sk_example_123456789", - client_id: "client_123456789" - - {api_key, client_id} -> - config :workos, WorkOS.Client, api_key: api_key, client_id: client_id -end diff --git a/docs/V3_MIGRATION_GUIDE.md b/docs/V3_MIGRATION_GUIDE.md new file mode 100644 index 00000000..f90f2047 --- /dev/null +++ b/docs/V3_MIGRATION_GUIDE.md @@ -0,0 +1,514 @@ +# WorkOS Elixir SDK v3 Migration Guide + +Version 3 of the WorkOS Elixir SDK is a ground-up rewrite, generated from the +WorkOS OpenAPI specification. It replaces the previous experimental SDK with a +production-grade client: instance-scoped configuration, a modern HTTP stack +built on [Req](https://hexdocs.pm/req), typed errors, lazy auto-pagination, +built-in retries, and coverage of the full WorkOS API surface — including +AuthKit sessions, RBAC, Vault, Feature Flags, Radar, Widgets, and more. + +Because v3 is a rewrite rather than an incremental change, every call site +needs attention. This guide walks through each breaking change with +before/after examples, followed by a complete function mapping and a tour of +what's new. + +## Upgrade at a glance + +1. Update to Elixir 1.18 or later +2. Bump the dependency in `mix.exs`: + + ```elixir + def deps do + [{:workos, "~> 3.0"}] + end + ``` + +3. Delete the application config block (`config :workos, WorkOS.Client, ...`) + and build a client instead: + + ```elixir + client = WorkOS.client(api_key: System.fetch_env!("WORKOS_API_KEY")) + ``` + +4. Pass the client as the first argument to every SDK call, and update the + call sites listed in [Function mapping](#function-mapping). +5. Update error handling to match on `WorkOS.ApiError` / `WorkOS.TransportError`. +6. Run your test suite. If you stubbed the old SDK with `Tesla.Mock`, see + [Testing](#testing). + +## Requirements and dependencies + +| | v2 (old) | v3 (new) | +| ------------------ | ----------------------------------- | ------------------------------------------- | +| Elixir | `~> 1.16` | `~> 1.18` | +| HTTP client | Tesla (over `:httpc` by default) | Req | +| JSON | Jason | Elixir's built-in `JSON` module | +| Other runtime deps | `hackney` (optional), `plug_crypto` | none — `req` is the only runtime dependency | + +If your application depended on Tesla, Jason, hackney, or `plug_crypto` only +transitively through `:workos`, add them to your own `mix.exs`. + +## The biggest conceptual changes + +### 1. An instance-scoped client replaces application config + +v2 read `Application.get_env(:workos, WorkOS.Client)` on every call and +required both `:api_key` and `:client_id` globally. v3 has **no global state**: +you build a `%WorkOS.Client{}` struct and pass it to every function. This makes +it trivial to talk to multiple WorkOS environments from one application, and +makes configuration errors surface at construction time instead of at the +first API call. + +```elixir +# Before (v2) — config.exs +config :workos, WorkOS.Client, + api_key: System.get_env("WORKOS_API_KEY"), + client_id: System.get_env("WORKOS_CLIENT_ID") + +# Before (v2) — call site (client optional, rebuilt from config each call) +{:ok, organization} = WorkOS.Organizations.get_organization("org_01EHZ...") +``` + +```elixir +# After (v3) — no config.exs entry; build a client once and reuse it +client = + WorkOS.client( + api_key: System.fetch_env!("WORKOS_API_KEY"), + client_id: System.get_env("WORKOS_CLIENT_ID") + ) + +{:ok, organization} = WorkOS.Organizations.get_organization(client, "org_01EHZ...") +``` + +`WorkOS.client/1` (an alias for `WorkOS.Client.new/1`) accepts: + +| Option | Description | +| -------------- | ------------------------------------------------------------------------------------------------------------------------------------- | +| `:api_key` | Required unless the `WORKOS_API_KEY` env var is set. Missing key raises `WorkOS.ConfigurationError` at construction. | +| `:client_id` | Optional; only needed for authentication flows and URL builders. Falls back to `WORKOS_CLIENT_ID`. | +| `:base_url` | Override the API base URL (default `https://api.workos.com`). | +| `:timeout` | Receive timeout in milliseconds (default `60_000`). v2 had no timeout configuration. | +| `:max_retries` | Maximum retry attempts (default `3`). | +| `:req_options` | Extra `Req` options merged into every request, overriding SDK defaults — see [Bring your own HTTP stack](#bring-your-own-http-stack). | + +Unlike v2, the env-var fallback works in library code — in v2 the +`System.get_env` calls lived in the SDK's own `config/dev.exs` and never +applied to consuming applications. Also unlike v2, `:client_id` is no longer +required just to make an Organizations call. + +#### Bring your own HTTP stack + +The v2 `:client` option is gone, along with the `WorkOS.Client` behavior that +let you route requests through your own Tesla stack. The replacement is +`:req_options`: the SDK builds each request with `Req.new/1` and merges your +options **last**, so they can override anything the SDK sets — the connection +pool, proxy and TLS settings, or the entire adapter: + +```elixir +# Reuse your application's Finch pool +WorkOS.client(api_key: key, req_options: [finch: MyApp.Finch]) + +# Route through a proxy / customize TLS +WorkOS.client( + api_key: key, + req_options: [connect_options: [proxy: {:http, "proxy.internal", 8080, []}]] +) + +# Replace the HTTP execution step entirely — the bridge for anything Req +# doesn't cover. The adapter receives the built %Req.Request{} and returns +# {request, %Req.Response{}} or {request, exception}. +WorkOS.client(api_key: key, req_options: [adapter: &MyApp.WorkOSAdapter.run/1]) +``` + +Because your options merge last, they can also clobber the SDK's `:auth`, +`:retry`, and `:headers` settings — override those only deliberately. + +`WorkOS.ApiKeyMissingError` and `WorkOS.ClientIdMissingError` no longer exist; +the single `WorkOS.ConfigurationError` raises when a client cannot be built. + +### 2. Built-in retries and timeouts + +v2 had no retry or timeout support. v3 automatically retries requests that +fail with 429, 500, 502, 503, or 504, or with a transport error — using +exponential backoff (capped at 30 seconds) with jitter. Retried POST requests +automatically carry an idempotency key, so replays are safe. + +Every function also accepts per-request options as its final argument: + +```elixir +WorkOS.Organizations.create_organization( + client, + %{name: "Acme"}, + idempotency_key: "org-create-42", + timeout: 5_000, + headers: [{"x-request-source", "billing-worker"}] +) +``` + +Available per-request options: `:headers`, `:idempotency_key`, `:timeout`, +`:max_retries`, `:base_url`, and `:query`. + +### 3. Every result is typed + +All API functions return `{:ok, result}` or `{:error, error}` where `error` is +always a struct — `WorkOS.ApiError` for non-2xx responses or +`WorkOS.TransportError` for network failures. The v2 mixed bag of +`{:error, %WorkOS.Error{}}`, `{:error, "some string"}`, and +`{:error, :client_error}` is gone, as is v2's unconditional `Logger.error` on +every failed request (v3 leaves logging to you). + +### 4. Much wider API coverage + +v2 exposed 11 product areas. v3 exposes the full API — see +[New in v3](#new-in-v3). + +## Breaking changes + +### The client argument is required — and always first + +In v2 most functions defaulted their client argument (`client \\ WorkOS.client()`), +so you could omit it. In v3 the client is always explicit and always first, +followed by any path parameters, then a `params` map, then per-request `opts`: + +```elixir +# Before (v2) +{:ok, list} = WorkOS.Organizations.list_organizations(%{limit: 10}) +{:ok, org} = WorkOS.Organizations.update_organization("org_123", %{name: "Acme"}) + +# After (v3) +{:ok, page} = WorkOS.Organizations.list_organizations(client, %{limit: 10}) +{:ok, org} = WorkOS.Organizations.update_organization(client, "org_123", %{name: "Acme"}) +``` + +`params` accepts atom-keyed maps, string-keyed maps, or keyword lists — but +not structs. + +### Missing required parameters no longer raise + +v2 enforced required parameters with function guards, so a missing key crashed +with `FunctionClauseError` (or, in `WorkOS.Portal.generate_link/2`, an +`ArgumentError`). v3 sends the request and returns the API's validation error +as data: + +```elixir +# Before (v2): raises FunctionClauseError before any request is made +WorkOS.Organizations.create_organization(%{}) + +# After (v3): the server validates +{:error, %WorkOS.ApiError{kind: :unprocessable_entity}} = + WorkOS.Organizations.create_organization(client, %{}) +``` + +### Module renames and moves + +| v2 (old) | v3 (new) | +| --------------------------------------------------------------- | ---------------------------------------------------- | +| `WorkOS.Portal` | `WorkOS.AdminPortal` | +| `WorkOS.MFA` | `WorkOS.MultiFactorAuth` | +| `WorkOS.UserManagement` (organization memberships) | `WorkOS.OrganizationMembershipService` | +| `WorkOS.Webhooks.construct_event/3,4` | `WorkOS.Webhooks.Signature.construct_event/4` | +| `WorkOS.List` | `WorkOS.Page` | +| `WorkOS.Error` (struct) | `WorkOS.ApiError` / `WorkOS.TransportError` | +| `WorkOS.Empty` | removed — empty responses return `{:ok, nil}` | +| Nested model modules (e.g. `WorkOS.Organizations.Organization`) | Top-level model modules (e.g. `WorkOS.Organization`) | + +There are no deprecation shims; the old names are gone. + +### Return values + +**Lists** return a `WorkOS.Page` instead of a `WorkOS.List` — see +[Pagination](#pagination). + +**Deletes** return `{:ok, nil}` instead of `{:ok, %WorkOS.Empty{}}`: + +```elixir +# Before (v2) +{:ok, %WorkOS.Empty{}} = WorkOS.Organizations.delete_organization("org_123") + +# After (v3) +{:ok, nil} = WorkOS.Organizations.delete_organization(client, "org_123") +``` + +**Bare `:ok` returns are gone.** v2's `send_magic_auth_code/2` and +`send_password_reset_email/2` returned `:ok` on success; their v3 equivalents +return `{:ok, struct}` like everything else. + +**URL builders return plain strings.** v2's `get_authorization_url/1` returned +`{:ok, url}` or `{:error, "Incomplete arguments. ..."}` and read the client ID +from global config (raising if absent). In v3 it takes the client and returns +the URL directly: + +```elixir +# Before (v2) +{:ok, url} = + WorkOS.SSO.get_authorization_url(%{ + organization: "org_123", + redirect_uri: "https://example.com/callback" + }) + +# After (v3) — client_id comes from the client struct +url = + WorkOS.SSO.get_authorization_url(client, %{ + organization: "org_123", + redirect_uri: "https://example.com/callback" + }) +``` + +The same applies to `WorkOS.UserManagement.get_authorization_url/2`. + +### Models + +Every API object has a top-level model module with a `defstruct`, a `@type t`, +and wire conversion helpers — for example `WorkOS.Organization` instead of +v2's `WorkOS.Organizations.Organization`. Two behavioral notes: + +- Timestamps remain ISO 8601 strings (as in v2); the SDK does not parse them + into `DateTime`. +- Enum-like fields are now atoms (e.g. an invitation state of `:pending`) + instead of strings. Unknown values received from the API pass through + unchanged rather than crashing, so match with a catch-all clause if you + exhaustively case on enum fields. + +### Error handling + +```elixir +# Before (v2) — three shapes to handle, plus automatic Logger.error noise +case WorkOS.Organizations.get_organization("org_123") do + {:ok, org} -> org + {:error, %WorkOS.Error{message: message}} -> handle_api_error(message) + {:error, binary} when is_binary(binary) -> handle_api_error(binary) + {:error, :client_error} -> handle_network_error() +end + +# After (v3) — two structs, with status and classification +case WorkOS.Organizations.get_organization(client, "org_123") do + {:ok, org} -> + org + + {:error, %WorkOS.ApiError{kind: :not_found}} -> + handle_missing_org() + + {:error, %WorkOS.ApiError{status: status, message: message, request_id: request_id}} -> + handle_api_error(status, message, request_id) + + {:error, %WorkOS.TransportError{reason: reason}} -> + handle_network_error(reason) +end +``` + +`WorkOS.ApiError` carries `:message`, `:status`, `:kind`, `:request_id` +(from the `x-request-id` header — include it in support requests), `:code`, +`:param`, and the raw decoded `:body`. The `:kind` atom classifies the HTTP +status: + +| Status | `:kind` | +| ------------- | ----------------------- | +| 400 | `:bad_request` | +| 401 | `:authentication` | +| 403 | `:authorization` | +| 404 | `:not_found` | +| 409 | `:conflict` | +| 422 | `:unprocessable_entity` | +| 429 | `:rate_limit_exceeded` | +| 5xx | `:server` | +| anything else | `:api` | + +Both error modules are exceptions, so `raise`-based flows work too: +`{:error, e} -> raise e`. + +### Pagination + +v2 returned `%WorkOS.List{data: [...], list_metadata: %{"after" => ...}}` and +left paging entirely to you. v3 returns a `%WorkOS.Page{}` that knows how to +fetch its successor: + +```elixir +# Before (v2) — manual cursor threading over a raw string-keyed map +defp all_organizations(cursor \\ nil, acc \\ []) do + {:ok, list} = WorkOS.Organizations.list_organizations(%{limit: 100, after: cursor}) + + case list.list_metadata["after"] do + nil -> acc ++ list.data + cursor -> all_organizations(cursor, acc ++ list.data) + end +end + +# After (v3) — lazy auto-pagination across every page +{:ok, page} = WorkOS.Organizations.list_organizations(client, %{limit: 100}) + +organizations = + page + |> WorkOS.Page.stream() + |> Enum.to_list() +``` + +For manual paging, `WorkOS.Page.has_more?/1` and `WorkOS.Page.after_cursor/1` +replace reading `list_metadata` yourself; pass the cursor back as `after:`. + +Note: `WorkOS.Page.stream/1` stops if a page fetch fails mid-stream. Use +explicit pagination when you need to distinguish errors from the end of the +collection. + +### Webhooks + +Signature verification moved from `WorkOS.Webhooks` to +`WorkOS.Webhooks.Signature`, and **the first two arguments swapped places**: + +```elixir +# Before (v2): (payload, signature_header, secret, tolerance \\ 180) +{:ok, event} = WorkOS.Webhooks.construct_event(body, sig_header, secret) + +# After (v3): (signature_header, payload, secret, opts \\ []) +{:ok, event} = WorkOS.Webhooks.Signature.construct_event(sig_header, body, secret) + +# Tolerance is now an option (default remains 180 seconds): +{:ok, event} = WorkOS.Webhooks.Signature.construct_event(sig_header, body, secret, tolerance: 300) +``` + +Three more differences: + +- The result is a `%WorkOS.EventSchema{}` whose `data` is a **string-keyed** + map. v2 recursively converted payload keys with `String.to_atom/1`, which + let untrusted payloads grow the atom table — v3 does not create atoms from + webhook input. Change `event.data.user.email`-style access to + `event.data["user"]["email"]`. +- Verification failures return atoms (`:not_signed`, `:invalid_header`, + `:invalid_timestamp`, `:outside_tolerance`, `:no_valid_signature`, + `:invalid_json`) instead of English strings. +- `WorkOS.Webhooks` itself now manages webhook endpoints + (`list_webhook_endpoints/3`, `create_webhook_endpoint/3`, ...). + +### Password reset functions were renamed + +Take care with `reset_password`: **it exists in both versions but does +different things.** In v2 it completed a reset with a token; in v3 it +_initiates_ one. + +| What you want | v2 (old) | v3 (new) | +| --------------------------------------- | ------------------------------------------------------------------- | --------------------------------------------------------------------------------- | +| Send the reset email / create the reset | `send_password_reset_email(%{email: ..., password_reset_url: ...})` | `UserManagement.reset_password(client, %{email: ...})` | +| Complete the reset with a token | `reset_password(%{token: ..., new_password: ...})` | `UserManagement.confirm_password_reset(client, %{token: ..., new_password: ...})` | + +If you migrate a v2 `reset_password/2` call by name alone, you will send your +user a second reset email instead of setting their password. + +### Testing + +v2 stubbing was built around `Tesla.Mock`. In v3, inject a +[`Req.Test`](https://hexdocs.pm/req/Req.Test.html) plug through `:req_options`: + +```elixir +client = + WorkOS.client( + api_key: "sk_test_123", + req_options: [plug: {Req.Test, MyApp.WorkOSStub}] + ) + +Req.Test.stub(MyApp.WorkOSStub, fn conn -> + Req.Test.json(conn, %{"id" => "org_01EHZ...", "name" => "Acme"}) +end) +``` + +Because clients are plain structs, you can also build one per test with +`async: true` — no shared application config to race on. + +## Function mapping + +Functions not listed keep their v2 name (with the client now required as the +first argument, and `params`/`opts` following any path parameters). + +### `WorkOS.Portal` → `WorkOS.AdminPortal` + +| v2 | v3 | +| --------------------------------------------------------- | ---------------------------------------------------------------------- | +| `Portal.generate_link(%{intent: ..., organization: ...})` | `AdminPortal.generate_link(client, %{intent: ..., organization: ...})` | + +The v2 client-side whitelist of intents (and its `ArgumentError`) is gone; the +server validates the intent. + +### `WorkOS.MFA` → `WorkOS.MultiFactorAuth` + +| v2 | v3 | +| ------------------------------------------ | ---------------------------------------------------------------- | +| `MFA.enroll_factor(opts)` | `MultiFactorAuth.enroll_factor(client, params)` | +| `MFA.challenge_factor(opts)` | `MultiFactorAuth.challenge_factor(client, factor_id, params)` | +| `MFA.verify_challenge(challenge_id, opts)` | `MultiFactorAuth.verify_challenge(client, challenge_id, params)` | +| `MFA.get_factor(id)` | `MultiFactorAuth.get_factor(client, id)` | +| `MFA.delete_factor(id)` | `MultiFactorAuth.delete_factor(client, id)` | + +### `WorkOS.UserManagement` + +| v2 | v3 | +| ------------------------------------------------- | ------------------------------------------------------------------------------ | +| `get_authorization_url(params)` → `{:ok, url}` | `get_authorization_url(client, params)` → `url` | +| `send_magic_auth_code(email)` → `:ok` | `create_magic_auth(client, %{email: ...})` → `{:ok, magic_auth}` | +| `send_password_reset_email(params)` → `:ok` | `reset_password(client, params)` → `{:ok, password_reset}` | +| `reset_password(params)` | `confirm_password_reset(client, params)` | +| `enroll_auth_factor(user_id, opts)` | `MultiFactorAuth.create_user_auth_factor(client, user_id, params)` | +| `list_auth_factors(user_id)` | `MultiFactorAuth.list_user_auth_factors(client, user_id)` | +| `get_organization_membership(id)` | `OrganizationMembershipService.get_organization_membership(client, id)` | +| `list_organization_memberships(params)` | `OrganizationMembershipService.list_organization_memberships(client, params)` | +| `create_organization_membership(params)` | `OrganizationMembershipService.create_organization_membership(client, params)` | +| `delete_organization_membership(id)` | `OrganizationMembershipService.delete_organization_membership(client, id)` | +| `authenticate_with_selected_organization(params)` | `authenticate_with_organization_selection(client, params)` | + +`authenticate_with_*` functions keep their names, take the client first, and +now infer `client_id` and `client_secret` from the client struct — you no +longer pass them in `params`. User CRUD (`get_user`, `list_users`, +`create_user`, `update_user`, `delete_user`, `get_user_by_external_id`), +invitations (`get_invitation`, `list_invitations`, `send_invitation`, +`revoke_invitation`), and email verification (`send_verification_email`, +`verify_email`) keep their v2 names. + +### `WorkOS.SSO` + +| v2 | v3 | +| --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- | +| `get_authorization_url(params)` → `{:ok, url}` | `get_authorization_url(client, params)` → `url` | +| `get_profile_and_token(code)` | `get_profile_and_token(client, %{code: code})` — `client_id`/`client_secret` inferred | +| `get_profile(access_token)` | `get_profile(client)` — rarely needed; the profile is already included in the `get_profile_and_token/3` response | +| `list_connections`, `get_connection`, `delete_connection` | unchanged names | + +### `WorkOS.Webhooks` + +| v2 | v3 | +| ------------------------------------------------------------------ | --------------------------------------------------------------------------------- | +| `Webhooks.construct_event(payload, sig_header, secret, tolerance)` | `Webhooks.Signature.construct_event(sig_header, payload, secret, tolerance: ...)` | + +### Unchanged names (client argument now required) + +`WorkOS.Organizations`, `WorkOS.DirectorySync`, `WorkOS.Events`, +`WorkOS.AuditLogs`, `WorkOS.Passwordless`, and `WorkOS.OrganizationDomains` +keep their v2 function names. `WorkOS.OrganizationDomains` additionally gains +`delete_organization_domain/3`. + +## New in v3 + +Beyond the v2 surface, v3 adds: + +- **AuthKit sessions** — `WorkOS.Session` for sealed (AES-256-GCM encrypted) + session cookies: `authenticate/2`, `refresh/2`, `get_logout_url/2`, + `seal_session_from_auth_response/2`. `WorkOS.UserManagement` gains + `authenticate_with_refresh_token/3`, `get_logout_url/2`, `revoke_session/3`, + `list_sessions/4`, and `get_jwks/2`; `WorkOS.JWKS` fetches signing keys. +- **PKCE and public clients** — `WorkOS.PublicClient` (no API key required), + `WorkOS.PKCE.generate_pair/0`, `WorkOS.SSO.PKCE`, and + `WorkOS.AuthKit.get_pkce_authorization_url/2` for browser/mobile flows. +- **Device authorization** — `WorkOS.AuthKit.start_device_authorization/3`, + `poll_device_code/3`, and `WorkOS.UserManagement.authenticate_with_device_code/3`. +- **Authorization (RBAC/FGA)** — `WorkOS.Authorization`: roles, permissions, + resources, role assignments, and `check/4`. +- **Vault** — `WorkOS.Vault` key/value and key management, plus + `WorkOS.Vault.Crypto` for local encrypt/decrypt. +- **More product areas** — `WorkOS.ApiKeys`, `WorkOS.FeatureFlags`, + `WorkOS.Radar`, `WorkOS.Widgets`, `WorkOS.Groups`, `WorkOS.Connect`, + `WorkOS.Pipes`, `WorkOS.Agents`, and `WorkOS.Actions` (AuthKit Actions + verification and response signing). +- **Organization membership lifecycle** — + `update_organization_membership/4`, `deactivate_organization_membership/3`, + and `reactivate_organization_membership/3`. + +## Getting help + +If you hit a migration issue this guide doesn't cover, please +[open an issue](https://github.com/workos/workos-elixir/issues). diff --git a/lib/workos.ex b/lib/workos.ex index e620e236..1915abc1 100755 --- a/lib/workos.ex +++ b/lib/workos.ex @@ -1,123 +1,24 @@ +# @oagen-ignore-file + defmodule WorkOS do @moduledoc """ - Documentation for `WorkOS`. - """ - - @config_module WorkOS.Client - - @type config() :: - list( - {:api_key, String.t()} - | {:client_id, String.t()} - | {:base_url, String.t()} - | {:client, atom()} - ) - - @doc """ - Returns a WorkOS client. - - Accepts a keyword list of config opts, though if omitted then it will attempt to load - them from the application environment. - """ - @spec client() :: WorkOS.Client.t() - @spec client(config()) :: WorkOS.Client.t() - def client(config \\ config()) do - WorkOS.Client.new(config) - end - - @doc """ - Loads config values from the application environment. + WorkOS SDK for Elixir. - Config options are as follows: + ## Usage - ```ex - config :workos, WorkOS.Client - api_key: "sk_123", - client_id: "project_123", - base_url: "https://api.workos.com", - client: WorkOs.Client.TeslaClient - ``` + client = WorkOS.client(api_key: "sk_...") - The only required config option is `:api_key` and `:client_id`. If you would like to replace the - HTTP client used by WorkOS, configure the `:client` option. By default, this library - uses [Tesla](https://github.com/elixir-tesla/tesla), but changing it is as easy as - defining your own client module. See the `WorkOS.Client` module docs for more info. + All API functions take the client as their first argument and return + `{:ok, result}` or `{:error, error}` tuples. """ - @spec config() :: config() - def config do - config = - Application.get_env(:workos, @config_module) || - raise """ - Missing client configuration for WorkOS. - - Configure your WorkOS API key in one of your config files, for example: - - config :workos, #{inspect(@config_module)}, api_key: "sk_123", client_id: "project_123" - """ - - validate_config!(config) - end - - @spec validate_config!(WorkOS.config()) :: WorkOS.config() | no_return() - defp validate_config!(config) do - Keyword.get(config, :api_key) || - raise WorkOS.ApiKeyMissingError - Keyword.get(config, :client_id) || - raise WorkOS.ClientIdMissingError + @version Mix.Project.config()[:version] - config - end - - @doc """ - Defines the WorkOS base API URL - """ - def default_base_url, do: "https://api.workos.com" - - @doc """ - Retrieves the WorkOS base URL from application config. - """ - @spec base_url() :: String.t() - def base_url do - case Application.get_env(:workos, @config_module) do - config when is_list(config) -> - Keyword.get(config, :base_url, default_base_url()) - - _ -> - default_base_url() - end - end - - @doc """ - Retrieves the WorkOS client ID from application config. - """ - @spec client_id() :: String.t() - def client_id do - case Application.get_env(:workos, @config_module) do - config when is_list(config) -> - Keyword.get(config, :client_id, nil) - - _ -> - nil - end - end - - @spec client_id(WorkOS.Client.t()) :: String.t() - def client_id(client) do - Map.get(client, :client_id) - end - - @doc """ - Retrieves the WorkOS API key from application config. - """ - @spec api_key() :: String.t() - def api_key do - WorkOS.config() - |> Keyword.get(:api_key) - end + @doc "The SDK version." + @spec version() :: String.t() + def version, do: @version - @spec api_key(WorkOS.Client.t()) :: String.t() - def api_key(client) do - Map.get(client, :api_key) - end + @doc "Builds a new API client. See `WorkOS.Client.new/1` for options." + @spec client(keyword()) :: WorkOS.Client.t() + def client(opts \\ []), do: WorkOS.Client.new(opts) end diff --git a/lib/workos/access_token_agent_registration_credential_issued_data_detail.ex b/lib/workos/access_token_agent_registration_credential_issued_data_detail.ex new file mode 100644 index 00000000..60d05858 --- /dev/null +++ b/lib/workos/access_token_agent_registration_credential_issued_data_detail.ex @@ -0,0 +1,39 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AccessTokenAgentRegistrationCredentialIssuedDataDetail do + @moduledoc """ + AccessTokenAgentRegistrationCredentialIssuedDataDetail model. + """ + + defstruct [ + :kind, + :jti, + :expires_at + ] + + @type t :: %__MODULE__{ + kind: String.t(), + jti: String.t(), + expires_at: String.t() | String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + kind: map["kind"], + jti: map["jti"], + expires_at: map["expires_at"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "kind" => struct.kind, + "jti" => struct.jti, + "expires_at" => struct.expires_at + }) + end +end diff --git a/lib/workos/action_authentication_denied.ex b/lib/workos/action_authentication_denied.ex new file mode 100644 index 00000000..16b2a523 --- /dev/null +++ b/lib/workos/action_authentication_denied.ex @@ -0,0 +1,52 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ActionAuthenticationDenied do + @moduledoc """ + ActionAuthenticationDenied model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.ActionAuthenticationDeniedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.ActionAuthenticationDeniedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => + WorkOS.Cast.dump_struct(struct.data, &WorkOS.ActionAuthenticationDeniedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/action_authentication_denied_data.ex b/lib/workos/action_authentication_denied_data.ex new file mode 100644 index 00000000..4a6f3fab --- /dev/null +++ b/lib/workos/action_authentication_denied_data.ex @@ -0,0 +1,63 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ActionAuthenticationDeniedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :action_endpoint_id, + :action_execution_id, + :type, + :verdict, + :user_id, + :organization_id, + :email, + :ip_address, + :user_agent + ] + + @type t :: %__MODULE__{ + action_endpoint_id: String.t(), + action_execution_id: String.t(), + type: String.t(), + verdict: String.t(), + user_id: String.t(), + organization_id: String.t() | nil, + email: String.t(), + ip_address: String.t() | nil, + user_agent: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + action_endpoint_id: map["action_endpoint_id"], + action_execution_id: map["action_execution_id"], + type: map["type"], + verdict: map["verdict"], + user_id: map["user_id"], + organization_id: map["organization_id"], + email: map["email"], + ip_address: map["ip_address"], + user_agent: map["user_agent"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "action_endpoint_id" => struct.action_endpoint_id, + "action_execution_id" => struct.action_execution_id, + "type" => struct.type, + "verdict" => struct.verdict, + "user_id" => struct.user_id, + "organization_id" => struct.organization_id, + "email" => struct.email, + "ip_address" => struct.ip_address, + "user_agent" => struct.user_agent + }) + end +end diff --git a/lib/workos/action_user_registration_denied.ex b/lib/workos/action_user_registration_denied.ex new file mode 100644 index 00000000..057335c4 --- /dev/null +++ b/lib/workos/action_user_registration_denied.ex @@ -0,0 +1,52 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ActionUserRegistrationDenied do + @moduledoc """ + ActionUserRegistrationDenied model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.ActionUserRegistrationDeniedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.ActionUserRegistrationDeniedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => + WorkOS.Cast.dump_struct(struct.data, &WorkOS.ActionUserRegistrationDeniedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/action_user_registration_denied_data.ex b/lib/workos/action_user_registration_denied_data.ex new file mode 100644 index 00000000..10b5b785 --- /dev/null +++ b/lib/workos/action_user_registration_denied_data.ex @@ -0,0 +1,59 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ActionUserRegistrationDeniedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :action_endpoint_id, + :action_execution_id, + :type, + :verdict, + :organization_id, + :email, + :ip_address, + :user_agent + ] + + @type t :: %__MODULE__{ + action_endpoint_id: String.t(), + action_execution_id: String.t(), + type: String.t(), + verdict: String.t(), + organization_id: String.t() | nil, + email: String.t(), + ip_address: String.t() | nil, + user_agent: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + action_endpoint_id: map["action_endpoint_id"], + action_execution_id: map["action_execution_id"], + type: map["type"], + verdict: map["verdict"], + organization_id: map["organization_id"], + email: map["email"], + ip_address: map["ip_address"], + user_agent: map["user_agent"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "action_endpoint_id" => struct.action_endpoint_id, + "action_execution_id" => struct.action_execution_id, + "type" => struct.type, + "verdict" => struct.verdict, + "organization_id" => struct.organization_id, + "email" => struct.email, + "ip_address" => struct.ip_address, + "user_agent" => struct.user_agent + }) + end +end diff --git a/lib/workos/actions.ex b/lib/workos/actions.ex new file mode 100644 index 00000000..7139d85a --- /dev/null +++ b/lib/workos/actions.ex @@ -0,0 +1,94 @@ +# @oagen-ignore-file — hand-maintained; client-side request verification and response signing. + +defmodule WorkOS.Actions do + @moduledoc """ + AuthKit Actions request verification and response signing. + + Verify an incoming action request, then sign your verdict: + + {:ok, action} = WorkOS.Actions.construct_action(payload, sig_header, secret) + + {:ok, response} = + WorkOS.Actions.sign_response( + %{type: "authentication", verdict: "Allow"}, + secret + ) + + `response.payload` and `response.sig` form the action webhook response body. + """ + + alias WorkOS.Webhooks.Signature + + @default_tolerance_seconds 30 + + @typedoc """ + Options for verification and signing. + + * `:tolerance` — maximum age of the signature timestamp, in seconds + (default #{@default_tolerance_seconds}) + * `:now_ms` — current Unix time in milliseconds (defaults to the system + clock; injectable for tests) + """ + @type option :: {:tolerance, non_neg_integer()} | {:now_ms, integer()} + + @doc """ + Verifies the signature of an Actions request. + """ + @spec verify_header(String.t(), String.t(), String.t(), [option()]) :: + :ok | {:error, WorkOS.Webhooks.Signature.verification_error()} + def verify_header(payload, sig_header, secret, opts \\ []) do + opts = Keyword.put_new(opts, :tolerance, @default_tolerance_seconds) + + with {:ok, _body} <- + Signature.verify_payload(sig_header, payload, secret, opts) do + :ok + end + end + + @doc """ + Verifies and deserializes an Actions request into a `WorkOS.EventSchema`. + """ + @spec construct_action(String.t(), String.t(), String.t(), [option()]) :: + {:ok, WorkOS.EventSchema.t()} + | {:error, WorkOS.Webhooks.Signature.verification_error()} + def construct_action(payload, sig_header, secret, opts \\ []) do + with :ok <- verify_header(payload, sig_header, secret, opts) do + case JSON.decode(payload) do + {:ok, decoded} when is_map(decoded) -> {:ok, WorkOS.EventSchema.from_map(decoded)} + _ -> {:error, :invalid_json} + end + end + end + + @doc """ + Signs an action response. + + `response` is a map with: + + * `:type` — `"authentication"` or `"user_registration"` + * `:verdict` — `"Allow"` or `"Deny"` + * `:error_message` — optional message shown on deny + + Returns `{:ok, %{payload: base64_payload, sig: "t=,v1="}}`. + """ + @spec sign_response(map(), String.t(), [option()]) :: + {:ok, %{payload: String.t(), sig: String.t()}} + def sign_response(response, secret, opts \\ []) do + now_ms = Keyword.get_lazy(opts, :now_ms, fn -> System.system_time(:millisecond) end) + + payload = + %{ + "type" => to_string(Map.get(response, :type) || Map.get(response, "type")), + "verdict" => to_string(Map.get(response, :verdict) || Map.get(response, "verdict")), + "error_message" => + to_string(Map.get(response, :error_message) || Map.get(response, "error_message") || "") + } + |> JSON.encode!() + |> Base.encode64() + + timestamp = Integer.to_string(now_ms) + signature = Signature.compute_signature(secret, timestamp, payload) + + {:ok, %{payload: payload, sig: "t=#{timestamp},v1=#{signature}"}} + end +end diff --git a/lib/workos/actor.ex b/lib/workos/actor.ex new file mode 100644 index 00000000..0d5330cc --- /dev/null +++ b/lib/workos/actor.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.Actor do + @moduledoc """ + The user or API key that performed an action. + """ + + defstruct [ + :id, + :name + ] + + @type t :: %__MODULE__{ + id: String.t(), + name: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + id: map["id"], + name: map["name"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "id" => struct.id, + "name" => struct.name + }) + end +end diff --git a/lib/workos/add_role_permission.ex b/lib/workos/add_role_permission.ex new file mode 100644 index 00000000..3bdc31e1 --- /dev/null +++ b/lib/workos/add_role_permission.ex @@ -0,0 +1,31 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AddRolePermission do + @moduledoc """ + AddRolePermission model. + """ + + defstruct [ + :slug + ] + + @type t :: %__MODULE__{ + slug: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + slug: map["slug"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "slug" => struct.slug + }) + end +end diff --git a/lib/workos/admin_portal.ex b/lib/workos/admin_portal.ex new file mode 100644 index 00000000..86535b42 --- /dev/null +++ b/lib/workos/admin_portal.ex @@ -0,0 +1,26 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AdminPortal do + @moduledoc """ + Operations for the AdminPortal API. + """ + + @doc """ + Generate a Portal Link + + Generate a Portal Link scoped to an Organization. + + ## Parameters + + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec generate_link(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.PortalLinkResponse.t()} | {:error, WorkOS.Error.error()} + def generate_link(client, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request(client, :post, "/portal/generate_link", params, opts) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.PortalLinkResponse.from_map/1)} + end + end +end diff --git a/lib/workos/agent_admin_link_claim_attempt_to_external_user_request.ex b/lib/workos/agent_admin_link_claim_attempt_to_external_user_request.ex new file mode 100644 index 00000000..cbcb39de --- /dev/null +++ b/lib/workos/agent_admin_link_claim_attempt_to_external_user_request.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AgentAdminLinkClaimAttemptToExternalUserRequest do + @moduledoc """ + AgentAdminLinkClaimAttemptToExternalUserRequest model. + """ + + defstruct [ + :type, + :claim_attempt_token, + :user, + :organization_id + ] + + @type t :: %__MODULE__{ + type: String.t(), + claim_attempt_token: String.t(), + user: WorkOS.AgentAdminLinkClaimAttemptToExternalUserRequestUser.t(), + organization_id: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + type: map["type"], + claim_attempt_token: map["claim_attempt_token"], + user: + WorkOS.Cast.nested( + map["user"], + &WorkOS.AgentAdminLinkClaimAttemptToExternalUserRequestUser.from_map/1 + ), + organization_id: map["organization_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "type" => struct.type, + "claim_attempt_token" => struct.claim_attempt_token, + "user" => + WorkOS.Cast.dump_struct( + struct.user, + &WorkOS.AgentAdminLinkClaimAttemptToExternalUserRequestUser.to_map/1 + ), + "organization_id" => struct.organization_id + }) + end +end diff --git a/lib/workos/agent_admin_link_claim_attempt_to_external_user_request_user.ex b/lib/workos/agent_admin_link_claim_attempt_to_external_user_request_user.ex new file mode 100644 index 00000000..8dcfd7fc --- /dev/null +++ b/lib/workos/agent_admin_link_claim_attempt_to_external_user_request_user.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AgentAdminLinkClaimAttemptToExternalUserRequestUser do + @moduledoc """ + The user to attach to the claim attempt, identified by email and external ID. + """ + + defstruct [ + :email, + :external_id + ] + + @type t :: %__MODULE__{ + email: String.t(), + external_id: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + email: map["email"], + external_id: map["external_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "email" => struct.email, + "external_id" => struct.external_id + }) + end +end diff --git a/lib/workos/agent_admin_validate_credential_request.ex b/lib/workos/agent_admin_validate_credential_request.ex new file mode 100644 index 00000000..44ab01c2 --- /dev/null +++ b/lib/workos/agent_admin_validate_credential_request.ex @@ -0,0 +1,40 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AgentAdminValidateCredentialRequest do + @moduledoc """ + AgentAdminValidateCredentialRequest model. + """ + + defstruct [ + :type, + :credential, + :audience + ] + + @type t :: %__MODULE__{ + type: WorkOS.AgentAdminValidateCredentialRequestType.t(), + credential: String.t(), + audience: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + type: WorkOS.Cast.enum(map["type"], &WorkOS.AgentAdminValidateCredentialRequestType.cast/1), + credential: map["credential"], + audience: map["audience"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "type" => + WorkOS.Cast.enum(struct.type, &WorkOS.AgentAdminValidateCredentialRequestType.dump/1), + "credential" => struct.credential, + "audience" => struct.audience + }) + end +end diff --git a/lib/workos/agent_admin_validate_credential_request_type.ex b/lib/workos/agent_admin_validate_credential_request_type.ex new file mode 100644 index 00000000..4154bcc3 --- /dev/null +++ b/lib/workos/agent_admin_validate_credential_request_type.ex @@ -0,0 +1,25 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AgentAdminValidateCredentialRequestType do + @moduledoc """ + AgentAdminValidateCredentialRequestType enum. + """ + + @type t :: :api_key | :access_token + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:api_key, :access_token] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("api_key"), do: :api_key + def cast("access_token"), do: :access_token + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:api_key), do: "api_key" + def dump(:access_token), do: "access_token" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/agent_credential_validation.ex b/lib/workos/agent_credential_validation.ex new file mode 100644 index 00000000..a1e87ab9 --- /dev/null +++ b/lib/workos/agent_credential_validation.ex @@ -0,0 +1,39 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AgentCredentialValidation do + @moduledoc """ + AgentCredentialValidation model. + """ + + defstruct [ + :valid, + :registration_id, + :expires_at + ] + + @type t :: %__MODULE__{ + valid: boolean(), + registration_id: String.t() | nil, + expires_at: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + valid: map["valid"], + registration_id: map["registration_id"], + expires_at: map["expires_at"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "valid" => struct.valid, + "registration_id" => struct.registration_id, + "expires_at" => struct.expires_at + }) + end +end diff --git a/lib/workos/agent_registration.ex b/lib/workos/agent_registration.ex new file mode 100644 index 00000000..85738e28 --- /dev/null +++ b/lib/workos/agent_registration.ex @@ -0,0 +1,67 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AgentRegistration do + @moduledoc """ + AgentRegistration model. + """ + + defstruct [ + :id, + :agent_identity, + :organization_id, + :status, + :kind, + :claim, + :created_at, + :updated_at + ] + + @type t :: %__MODULE__{ + id: String.t(), + agent_identity: WorkOS.AgentRegistrationAgentIdentity.t(), + organization_id: String.t(), + status: WorkOS.AgentRegistrationStatus.t(), + kind: WorkOS.AgentRegistrationKind.t(), + claim: WorkOS.AgentRegistrationClaim.t() | nil, + created_at: String.t(), + updated_at: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + id: map["id"], + agent_identity: + WorkOS.Cast.nested( + map["agent_identity"], + &WorkOS.AgentRegistrationAgentIdentity.from_map/1 + ), + organization_id: map["organization_id"], + status: WorkOS.Cast.enum(map["status"], &WorkOS.AgentRegistrationStatus.cast/1), + kind: WorkOS.Cast.enum(map["kind"], &WorkOS.AgentRegistrationKind.cast/1), + claim: WorkOS.Cast.nested(map["claim"], &WorkOS.AgentRegistrationClaim.from_map/1), + created_at: map["created_at"], + updated_at: map["updated_at"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "id" => struct.id, + "agent_identity" => + WorkOS.Cast.dump_struct( + struct.agent_identity, + &WorkOS.AgentRegistrationAgentIdentity.to_map/1 + ), + "organization_id" => struct.organization_id, + "status" => WorkOS.Cast.enum(struct.status, &WorkOS.AgentRegistrationStatus.dump/1), + "kind" => WorkOS.Cast.enum(struct.kind, &WorkOS.AgentRegistrationKind.dump/1), + "claim" => WorkOS.Cast.dump_struct(struct.claim, &WorkOS.AgentRegistrationClaim.to_map/1), + "created_at" => struct.created_at, + "updated_at" => struct.updated_at + }) + end +end diff --git a/lib/workos/agent_registration_agent_identity.ex b/lib/workos/agent_registration_agent_identity.ex new file mode 100644 index 00000000..9aebdfd1 --- /dev/null +++ b/lib/workos/agent_registration_agent_identity.ex @@ -0,0 +1,43 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AgentRegistrationAgentIdentity do + @moduledoc """ + The agent identity associated with this registration. + """ + + defstruct [ + :id, + :userland_user_id, + :created_at, + :updated_at + ] + + @type t :: %__MODULE__{ + id: String.t(), + userland_user_id: String.t() | nil, + created_at: String.t(), + updated_at: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + id: map["id"], + userland_user_id: map["userland_user_id"], + created_at: map["created_at"], + updated_at: map["updated_at"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "id" => struct.id, + "userland_user_id" => struct.userland_user_id, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at + }) + end +end diff --git a/lib/workos/agent_registration_claim.ex b/lib/workos/agent_registration_claim.ex new file mode 100644 index 00000000..cd305e60 --- /dev/null +++ b/lib/workos/agent_registration_claim.ex @@ -0,0 +1,55 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AgentRegistrationClaim do + @moduledoc """ + AgentRegistrationClaim model. + """ + + defstruct [ + :id, + :claim_completion, + :created_at, + :updated_at, + :expires_at + ] + + @type t :: %__MODULE__{ + id: String.t(), + claim_completion: WorkOS.AgentRegistrationClaimClaimCompletion.t() | nil, + created_at: String.t(), + updated_at: String.t(), + expires_at: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + id: map["id"], + claim_completion: + WorkOS.Cast.nested( + map["claim_completion"], + &WorkOS.AgentRegistrationClaimClaimCompletion.from_map/1 + ), + created_at: map["created_at"], + updated_at: map["updated_at"], + expires_at: map["expires_at"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "id" => struct.id, + "claim_completion" => + WorkOS.Cast.dump_struct( + struct.claim_completion, + &WorkOS.AgentRegistrationClaimClaimCompletion.to_map/1 + ), + "created_at" => struct.created_at, + "updated_at" => struct.updated_at, + "expires_at" => struct.expires_at + }) + end +end diff --git a/lib/workos/agent_registration_claim_attempt_created.ex b/lib/workos/agent_registration_claim_attempt_created.ex new file mode 100644 index 00000000..a615d8f0 --- /dev/null +++ b/lib/workos/agent_registration_claim_attempt_created.ex @@ -0,0 +1,59 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AgentRegistrationClaimAttemptCreated do + @moduledoc """ + AgentRegistrationClaimAttemptCreated model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.AgentRegistrationClaimAttemptCreatedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: + WorkOS.Cast.nested( + map["data"], + &WorkOS.AgentRegistrationClaimAttemptCreatedData.from_map/1 + ), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => + WorkOS.Cast.dump_struct( + struct.data, + &WorkOS.AgentRegistrationClaimAttemptCreatedData.to_map/1 + ), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/agent_registration_claim_attempt_created_data.ex b/lib/workos/agent_registration_claim_attempt_created_data.ex new file mode 100644 index 00000000..e3637ffa --- /dev/null +++ b/lib/workos/agent_registration_claim_attempt_created_data.ex @@ -0,0 +1,59 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AgentRegistrationClaimAttemptCreatedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :object, + :id, + :agent_registration_id, + :agent_registration_claim_id, + :login_hint, + :expires_at, + :created_at, + :updated_at + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + agent_registration_id: String.t(), + agent_registration_claim_id: String.t(), + login_hint: String.t(), + expires_at: String.t(), + created_at: String.t(), + updated_at: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + agent_registration_id: map["agent_registration_id"], + agent_registration_claim_id: map["agent_registration_claim_id"], + login_hint: map["login_hint"], + expires_at: map["expires_at"], + created_at: map["created_at"], + updated_at: map["updated_at"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "agent_registration_id" => struct.agent_registration_id, + "agent_registration_claim_id" => struct.agent_registration_claim_id, + "login_hint" => struct.login_hint, + "expires_at" => struct.expires_at, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at + }) + end +end diff --git a/lib/workos/agent_registration_claim_claim_completion.ex b/lib/workos/agent_registration_claim_claim_completion.ex new file mode 100644 index 00000000..7c93b222 --- /dev/null +++ b/lib/workos/agent_registration_claim_claim_completion.ex @@ -0,0 +1,47 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AgentRegistrationClaimClaimCompletion do + @moduledoc """ + AgentRegistrationClaimClaimCompletion model. + """ + + defstruct [ + :id, + :created_at, + :updated_at, + :expires_at, + :claimed_at + ] + + @type t :: %__MODULE__{ + id: String.t(), + created_at: String.t(), + updated_at: String.t(), + expires_at: String.t(), + claimed_at: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + id: map["id"], + created_at: map["created_at"], + updated_at: map["updated_at"], + expires_at: map["expires_at"], + claimed_at: map["claimed_at"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "id" => struct.id, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at, + "expires_at" => struct.expires_at, + "claimed_at" => struct.claimed_at + }) + end +end diff --git a/lib/workos/agent_registration_claim_completed.ex b/lib/workos/agent_registration_claim_completed.ex new file mode 100644 index 00000000..8e462aac --- /dev/null +++ b/lib/workos/agent_registration_claim_completed.ex @@ -0,0 +1,53 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AgentRegistrationClaimCompleted do + @moduledoc """ + AgentRegistrationClaimCompleted model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.AgentRegistrationClaimCompletedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: + WorkOS.Cast.nested(map["data"], &WorkOS.AgentRegistrationClaimCompletedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => + WorkOS.Cast.dump_struct(struct.data, &WorkOS.AgentRegistrationClaimCompletedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/agent_registration_claim_completed_data.ex b/lib/workos/agent_registration_claim_completed_data.ex new file mode 100644 index 00000000..d53743e0 --- /dev/null +++ b/lib/workos/agent_registration_claim_completed_data.ex @@ -0,0 +1,67 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AgentRegistrationClaimCompletedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :object, + :id, + :agent_registration_id, + :completed_by_attempt_id, + :claimed_by, + :completed_at, + :created_at, + :updated_at + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + agent_registration_id: String.t(), + completed_by_attempt_id: String.t(), + claimed_by: WorkOS.AgentRegistrationClaimCompletedDataClaimedBy.t(), + completed_at: String.t(), + created_at: String.t(), + updated_at: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + agent_registration_id: map["agent_registration_id"], + completed_by_attempt_id: map["completed_by_attempt_id"], + claimed_by: + WorkOS.Cast.nested( + map["claimed_by"], + &WorkOS.AgentRegistrationClaimCompletedDataClaimedBy.from_map/1 + ), + completed_at: map["completed_at"], + created_at: map["created_at"], + updated_at: map["updated_at"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "agent_registration_id" => struct.agent_registration_id, + "completed_by_attempt_id" => struct.completed_by_attempt_id, + "claimed_by" => + WorkOS.Cast.dump_struct( + struct.claimed_by, + &WorkOS.AgentRegistrationClaimCompletedDataClaimedBy.to_map/1 + ), + "completed_at" => struct.completed_at, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at + }) + end +end diff --git a/lib/workos/agent_registration_claim_completed_data_claimed_by.ex b/lib/workos/agent_registration_claim_completed_data_claimed_by.ex new file mode 100644 index 00000000..c75cfc69 --- /dev/null +++ b/lib/workos/agent_registration_claim_completed_data_claimed_by.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AgentRegistrationClaimCompletedDataClaimedBy do + @moduledoc """ + The user who completed the claim. + """ + + defstruct [ + :user_id, + :organization_id + ] + + @type t :: %__MODULE__{ + user_id: String.t(), + organization_id: String.t() | String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + user_id: map["user_id"], + organization_id: map["organization_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "user_id" => struct.user_id, + "organization_id" => struct.organization_id + }) + end +end diff --git a/lib/workos/agent_registration_created.ex b/lib/workos/agent_registration_created.ex new file mode 100644 index 00000000..8f82b916 --- /dev/null +++ b/lib/workos/agent_registration_created.ex @@ -0,0 +1,52 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AgentRegistrationCreated do + @moduledoc """ + AgentRegistrationCreated model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.AgentRegistrationCreatedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.AgentRegistrationCreatedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => + WorkOS.Cast.dump_struct(struct.data, &WorkOS.AgentRegistrationCreatedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/agent_registration_created_data.ex b/lib/workos/agent_registration_created_data.ex new file mode 100644 index 00000000..21f01af4 --- /dev/null +++ b/lib/workos/agent_registration_created_data.ex @@ -0,0 +1,73 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AgentRegistrationCreatedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :object, + :id, + :agent_identity, + :organization_id, + :status, + :kind, + :method, + :created_at, + :updated_at + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + agent_identity: WorkOS.AgentRegistrationCreatedDataAgentIdentity.t(), + organization_id: String.t(), + status: WorkOS.AgentRegistrationCreatedDataStatus.t(), + kind: WorkOS.AgentRegistrationCreatedDataKind.t(), + method: WorkOS.AgentRegistrationCreatedDataMethod.t(), + created_at: String.t(), + updated_at: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + agent_identity: + WorkOS.Cast.nested( + map["agent_identity"], + &WorkOS.AgentRegistrationCreatedDataAgentIdentity.from_map/1 + ), + organization_id: map["organization_id"], + status: WorkOS.Cast.enum(map["status"], &WorkOS.AgentRegistrationCreatedDataStatus.cast/1), + kind: WorkOS.Cast.enum(map["kind"], &WorkOS.AgentRegistrationCreatedDataKind.cast/1), + method: WorkOS.Cast.enum(map["method"], &WorkOS.AgentRegistrationCreatedDataMethod.cast/1), + created_at: map["created_at"], + updated_at: map["updated_at"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "agent_identity" => + WorkOS.Cast.dump_struct( + struct.agent_identity, + &WorkOS.AgentRegistrationCreatedDataAgentIdentity.to_map/1 + ), + "organization_id" => struct.organization_id, + "status" => + WorkOS.Cast.enum(struct.status, &WorkOS.AgentRegistrationCreatedDataStatus.dump/1), + "kind" => WorkOS.Cast.enum(struct.kind, &WorkOS.AgentRegistrationCreatedDataKind.dump/1), + "method" => + WorkOS.Cast.enum(struct.method, &WorkOS.AgentRegistrationCreatedDataMethod.dump/1), + "created_at" => struct.created_at, + "updated_at" => struct.updated_at + }) + end +end diff --git a/lib/workos/agent_registration_created_data_agent_identity.ex b/lib/workos/agent_registration_created_data_agent_identity.ex new file mode 100644 index 00000000..4c33b1b5 --- /dev/null +++ b/lib/workos/agent_registration_created_data_agent_identity.ex @@ -0,0 +1,39 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AgentRegistrationCreatedDataAgentIdentity do + @moduledoc """ + The agent identity for this registration. + """ + + defstruct [ + :object, + :id, + :userland_user_id + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + userland_user_id: String.t() | String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + userland_user_id: map["userland_user_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "userland_user_id" => struct.userland_user_id + }) + end +end diff --git a/lib/workos/agent_registration_created_data_kind.ex b/lib/workos/agent_registration_created_data_kind.ex new file mode 100644 index 00000000..7ecdb6b7 --- /dev/null +++ b/lib/workos/agent_registration_created_data_kind.ex @@ -0,0 +1,27 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AgentRegistrationCreatedDataKind do + @moduledoc """ + AgentRegistrationCreatedDataKind enum. + """ + + @type t :: :anonymous | :service_auth | :identity_assertion + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:anonymous, :service_auth, :identity_assertion] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("anonymous"), do: :anonymous + def cast("service_auth"), do: :service_auth + def cast("identity_assertion"), do: :identity_assertion + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:anonymous), do: "anonymous" + def dump(:service_auth), do: "service_auth" + def dump(:identity_assertion), do: "identity_assertion" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/agent_registration_created_data_method.ex b/lib/workos/agent_registration_created_data_method.ex new file mode 100644 index 00000000..0ef2c772 --- /dev/null +++ b/lib/workos/agent_registration_created_data_method.ex @@ -0,0 +1,27 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AgentRegistrationCreatedDataMethod do + @moduledoc """ + AgentRegistrationCreatedDataMethod enum. + """ + + @type t :: :anonymous | :service_auth | :id_jag + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:anonymous, :service_auth, :id_jag] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("anonymous"), do: :anonymous + def cast("service_auth"), do: :service_auth + def cast("id_jag"), do: :id_jag + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:anonymous), do: "anonymous" + def dump(:service_auth), do: "service_auth" + def dump(:id_jag), do: "id_jag" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/agent_registration_created_data_status.ex b/lib/workos/agent_registration_created_data_status.ex new file mode 100644 index 00000000..1ef8f8c3 --- /dev/null +++ b/lib/workos/agent_registration_created_data_status.ex @@ -0,0 +1,29 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AgentRegistrationCreatedDataStatus do + @moduledoc """ + AgentRegistrationCreatedDataStatus enum. + """ + + @type t :: :unverified | :verified | :expired | :revoked + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:unverified, :verified, :expired, :revoked] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("unverified"), do: :unverified + def cast("verified"), do: :verified + def cast("expired"), do: :expired + def cast("revoked"), do: :revoked + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:unverified), do: "unverified" + def dump(:verified), do: "verified" + def dump(:expired), do: "expired" + def dump(:revoked), do: "revoked" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/agent_registration_credential_issued.ex b/lib/workos/agent_registration_credential_issued.ex new file mode 100644 index 00000000..3c7799f4 --- /dev/null +++ b/lib/workos/agent_registration_credential_issued.ex @@ -0,0 +1,56 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AgentRegistrationCredentialIssued do + @moduledoc """ + AgentRegistrationCredentialIssued model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.AgentRegistrationCredentialIssuedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: + WorkOS.Cast.nested(map["data"], &WorkOS.AgentRegistrationCredentialIssuedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => + WorkOS.Cast.dump_struct( + struct.data, + &WorkOS.AgentRegistrationCredentialIssuedData.to_map/1 + ), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/agent_registration_credential_issued_data.ex b/lib/workos/agent_registration_credential_issued_data.ex new file mode 100644 index 00000000..602f8e60 --- /dev/null +++ b/lib/workos/agent_registration_credential_issued_data.ex @@ -0,0 +1,58 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AgentRegistrationCredentialIssuedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :object, + :id, + :agent_registration_id, + :detail, + :created_at, + :updated_at + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + agent_registration_id: String.t(), + detail: + WorkOS.AgentRegistrationCredentialIssuedDataDetail.t() + | WorkOS.AccessTokenAgentRegistrationCredentialIssuedDataDetail.t(), + created_at: String.t(), + updated_at: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + agent_registration_id: map["agent_registration_id"], + detail: + WorkOS.Cast.discriminated(map["detail"], "kind", %{ + "api_key" => &WorkOS.AgentRegistrationCredentialIssuedDataDetail.from_map/1, + "access_token" => + &WorkOS.AccessTokenAgentRegistrationCredentialIssuedDataDetail.from_map/1 + }), + created_at: map["created_at"], + updated_at: map["updated_at"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "agent_registration_id" => struct.agent_registration_id, + "detail" => struct.detail, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at + }) + end +end diff --git a/lib/workos/agent_registration_credential_issued_data_detail.ex b/lib/workos/agent_registration_credential_issued_data_detail.ex new file mode 100644 index 00000000..e3503167 --- /dev/null +++ b/lib/workos/agent_registration_credential_issued_data_detail.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AgentRegistrationCredentialIssuedDataDetail do + @moduledoc """ + AgentRegistrationCredentialIssuedDataDetail model. + """ + + defstruct [ + :kind, + :api_key_id + ] + + @type t :: %__MODULE__{ + kind: String.t(), + api_key_id: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + kind: map["kind"], + api_key_id: map["api_key_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "kind" => struct.kind, + "api_key_id" => struct.api_key_id + }) + end +end diff --git a/lib/workos/agent_registration_deleted.ex b/lib/workos/agent_registration_deleted.ex new file mode 100644 index 00000000..3752854b --- /dev/null +++ b/lib/workos/agent_registration_deleted.ex @@ -0,0 +1,52 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AgentRegistrationDeleted do + @moduledoc """ + AgentRegistrationDeleted model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.AgentRegistrationDeletedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.AgentRegistrationDeletedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => + WorkOS.Cast.dump_struct(struct.data, &WorkOS.AgentRegistrationDeletedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/agent_registration_deleted_data.ex b/lib/workos/agent_registration_deleted_data.ex new file mode 100644 index 00000000..550db302 --- /dev/null +++ b/lib/workos/agent_registration_deleted_data.ex @@ -0,0 +1,31 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AgentRegistrationDeletedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :agent_registration_id + ] + + @type t :: %__MODULE__{ + agent_registration_id: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + agent_registration_id: map["agent_registration_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "agent_registration_id" => struct.agent_registration_id + }) + end +end diff --git a/lib/workos/agent_registration_expired.ex b/lib/workos/agent_registration_expired.ex new file mode 100644 index 00000000..c2dfc620 --- /dev/null +++ b/lib/workos/agent_registration_expired.ex @@ -0,0 +1,52 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AgentRegistrationExpired do + @moduledoc """ + AgentRegistrationExpired model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.AgentRegistrationExpiredData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.AgentRegistrationExpiredData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => + WorkOS.Cast.dump_struct(struct.data, &WorkOS.AgentRegistrationExpiredData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/agent_registration_expired_data.ex b/lib/workos/agent_registration_expired_data.ex new file mode 100644 index 00000000..6a53eac6 --- /dev/null +++ b/lib/workos/agent_registration_expired_data.ex @@ -0,0 +1,31 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AgentRegistrationExpiredData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :agent_registration_id + ] + + @type t :: %__MODULE__{ + agent_registration_id: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + agent_registration_id: map["agent_registration_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "agent_registration_id" => struct.agent_registration_id + }) + end +end diff --git a/lib/workos/agent_registration_kind.ex b/lib/workos/agent_registration_kind.ex new file mode 100644 index 00000000..135cf849 --- /dev/null +++ b/lib/workos/agent_registration_kind.ex @@ -0,0 +1,27 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AgentRegistrationKind do + @moduledoc """ + AgentRegistrationKind enum. + """ + + @type t :: :anonymous | :service_auth | :identity_assertion + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:anonymous, :service_auth, :identity_assertion] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("anonymous"), do: :anonymous + def cast("service_auth"), do: :service_auth + def cast("identity_assertion"), do: :identity_assertion + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:anonymous), do: "anonymous" + def dump(:service_auth), do: "service_auth" + def dump(:identity_assertion), do: "identity_assertion" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/agent_registration_organization_switched.ex b/lib/workos/agent_registration_organization_switched.ex new file mode 100644 index 00000000..53a8638e --- /dev/null +++ b/lib/workos/agent_registration_organization_switched.ex @@ -0,0 +1,59 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AgentRegistrationOrganizationSwitched do + @moduledoc """ + AgentRegistrationOrganizationSwitched model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.AgentRegistrationOrganizationSwitchedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: + WorkOS.Cast.nested( + map["data"], + &WorkOS.AgentRegistrationOrganizationSwitchedData.from_map/1 + ), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => + WorkOS.Cast.dump_struct( + struct.data, + &WorkOS.AgentRegistrationOrganizationSwitchedData.to_map/1 + ), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/agent_registration_organization_switched_data.ex b/lib/workos/agent_registration_organization_switched_data.ex new file mode 100644 index 00000000..056d1b6e --- /dev/null +++ b/lib/workos/agent_registration_organization_switched_data.ex @@ -0,0 +1,39 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AgentRegistrationOrganizationSwitchedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :agent_registration_id, + :from_organization_id, + :to_organization_id + ] + + @type t :: %__MODULE__{ + agent_registration_id: String.t(), + from_organization_id: String.t(), + to_organization_id: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + agent_registration_id: map["agent_registration_id"], + from_organization_id: map["from_organization_id"], + to_organization_id: map["to_organization_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "agent_registration_id" => struct.agent_registration_id, + "from_organization_id" => struct.from_organization_id, + "to_organization_id" => struct.to_organization_id + }) + end +end diff --git a/lib/workos/agent_registration_revoked.ex b/lib/workos/agent_registration_revoked.ex new file mode 100644 index 00000000..88a2a8ef --- /dev/null +++ b/lib/workos/agent_registration_revoked.ex @@ -0,0 +1,52 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AgentRegistrationRevoked do + @moduledoc """ + AgentRegistrationRevoked model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.AgentRegistrationRevokedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.AgentRegistrationRevokedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => + WorkOS.Cast.dump_struct(struct.data, &WorkOS.AgentRegistrationRevokedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/agent_registration_revoked_data.ex b/lib/workos/agent_registration_revoked_data.ex new file mode 100644 index 00000000..b6a16c1e --- /dev/null +++ b/lib/workos/agent_registration_revoked_data.ex @@ -0,0 +1,31 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AgentRegistrationRevokedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :agent_registration_id + ] + + @type t :: %__MODULE__{ + agent_registration_id: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + agent_registration_id: map["agent_registration_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "agent_registration_id" => struct.agent_registration_id + }) + end +end diff --git a/lib/workos/agent_registration_status.ex b/lib/workos/agent_registration_status.ex new file mode 100644 index 00000000..8664c666 --- /dev/null +++ b/lib/workos/agent_registration_status.ex @@ -0,0 +1,29 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AgentRegistrationStatus do + @moduledoc """ + AgentRegistrationStatus enum. + """ + + @type t :: :unverified | :verified | :expired | :revoked + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:unverified, :verified, :expired, :revoked] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("unverified"), do: :unverified + def cast("verified"), do: :verified + def cast("expired"), do: :expired + def cast("revoked"), do: :revoked + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:unverified), do: "unverified" + def dump(:verified), do: "verified" + def dump(:expired), do: "expired" + def dump(:revoked), do: "revoked" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/agents.ex b/lib/workos/agents.ex new file mode 100644 index 00000000..87b675b1 --- /dev/null +++ b/lib/workos/agents.ex @@ -0,0 +1,70 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.Agents do + @moduledoc """ + Operations for the Agents API. + """ + + @doc """ + Link a claim attempt to an external user + + Link an external user to a claim attempt and retrieve the code needed for the agent to complete the claim. The user is looked up by external ID; if no user exists, one is created. When the user belongs to multiple organizations, an explicit organization must be provided. + + ## Parameters + + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec update_attempts(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.ClaimViewResponse.t()} | {:error, WorkOS.Error.error()} + def update_attempts(client, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request(client, :patch, "/agents/claims/attempts", params, opts) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.ClaimViewResponse.from_map/1)} + end + end + + @doc """ + Validate an agent credential + + Validate an agent credential — an API key or access token — against the environment of the API key used to authenticate the request. This is a read-only check: it never consumes or mutates the credential. + + ## Parameters + + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec create_validate(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.AgentCredentialValidation.t()} | {:error, WorkOS.Error.error()} + def create_validate(client, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request(client, :post, "/agents/credentials/validate", params, opts) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.AgentCredentialValidation.from_map/1)} + end + end + + @doc """ + Get an agent registration + + Retrieve the details of an agent registration by ID. The registration is scoped to the environment of the API key used to authenticate the request. + + ## Parameters + + * `id` — The unique ID of the agent registration. + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec get_registration(WorkOS.Client.t(), String.t(), keyword()) :: + {:ok, WorkOS.AgentRegistration.t()} | {:error, WorkOS.Error.error()} + def get_registration(client, id, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :get, + "/agents/registrations/#{URI.encode(id, &URI.char_unreserved?/1)}", + %{}, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.AgentRegistration.from_map/1)} + end + end +end diff --git a/lib/workos/api_key.ex b/lib/workos/api_key.ex new file mode 100644 index 00000000..72e39fda --- /dev/null +++ b/lib/workos/api_key.ex @@ -0,0 +1,71 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ApiKey do + @moduledoc """ + ApiKey model. + """ + + defstruct [ + :object, + :id, + :owner, + :name, + :obfuscated_value, + :last_used_at, + :expires_at, + :permissions, + :created_at, + :updated_at + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + owner: WorkOS.ApiKeyOwner.t() | WorkOS.UserApiKeyOwner.t(), + name: String.t(), + obfuscated_value: String.t(), + last_used_at: String.t() | nil, + expires_at: String.t() | nil, + permissions: [String.t()], + created_at: String.t(), + updated_at: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + owner: + WorkOS.Cast.discriminated(map["owner"], "type", %{ + "organization" => &WorkOS.ApiKeyOwner.from_map/1, + "user" => &WorkOS.UserApiKeyOwner.from_map/1 + }), + name: map["name"], + obfuscated_value: map["obfuscated_value"], + last_used_at: map["last_used_at"], + expires_at: map["expires_at"], + permissions: map["permissions"], + created_at: map["created_at"], + updated_at: map["updated_at"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "owner" => struct.owner, + "name" => struct.name, + "obfuscated_value" => struct.obfuscated_value, + "last_used_at" => struct.last_used_at, + "expires_at" => struct.expires_at, + "permissions" => struct.permissions, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at + }) + end +end diff --git a/lib/workos/api_key_created.ex b/lib/workos/api_key_created.ex new file mode 100644 index 00000000..fa422bb2 --- /dev/null +++ b/lib/workos/api_key_created.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ApiKeyCreated do + @moduledoc """ + ApiKeyCreated model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.ApiKeyCreatedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.ApiKeyCreatedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => WorkOS.Cast.dump_struct(struct.data, &WorkOS.ApiKeyCreatedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/api_key_created_data.ex b/lib/workos/api_key_created_data.ex new file mode 100644 index 00000000..8a60fddb --- /dev/null +++ b/lib/workos/api_key_created_data.ex @@ -0,0 +1,71 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ApiKeyCreatedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :object, + :id, + :owner, + :name, + :obfuscated_value, + :last_used_at, + :expires_at, + :permissions, + :created_at, + :updated_at + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + owner: WorkOS.ApiKeyCreatedDataOwner.t() | WorkOS.UserApiKeyCreatedDataOwner.t(), + name: String.t(), + obfuscated_value: String.t(), + last_used_at: String.t() | nil, + expires_at: String.t() | nil, + permissions: [String.t()], + created_at: String.t(), + updated_at: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + owner: + WorkOS.Cast.discriminated(map["owner"], "type", %{ + "organization" => &WorkOS.ApiKeyCreatedDataOwner.from_map/1, + "user" => &WorkOS.UserApiKeyCreatedDataOwner.from_map/1 + }), + name: map["name"], + obfuscated_value: map["obfuscated_value"], + last_used_at: map["last_used_at"], + expires_at: map["expires_at"], + permissions: map["permissions"], + created_at: map["created_at"], + updated_at: map["updated_at"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "owner" => struct.owner, + "name" => struct.name, + "obfuscated_value" => struct.obfuscated_value, + "last_used_at" => struct.last_used_at, + "expires_at" => struct.expires_at, + "permissions" => struct.permissions, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at + }) + end +end diff --git a/lib/workos/api_key_created_data_owner.ex b/lib/workos/api_key_created_data_owner.ex new file mode 100644 index 00000000..ed19d76f --- /dev/null +++ b/lib/workos/api_key_created_data_owner.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ApiKeyCreatedDataOwner do + @moduledoc """ + ApiKeyCreatedDataOwner model. + """ + + defstruct [ + :type, + :id + ] + + @type t :: %__MODULE__{ + type: String.t(), + id: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + type: map["type"], + id: map["id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "type" => struct.type, + "id" => struct.id + }) + end +end diff --git a/lib/workos/api_key_installation.ex b/lib/workos/api_key_installation.ex new file mode 100644 index 00000000..03e8385e --- /dev/null +++ b/lib/workos/api_key_installation.ex @@ -0,0 +1,39 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ApiKeyInstallation do + @moduledoc """ + ApiKeyInstallation model. + """ + + defstruct [ + :secret, + :user_id, + :organization_id + ] + + @type t :: %__MODULE__{ + secret: String.t(), + user_id: String.t(), + organization_id: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + secret: map["secret"], + user_id: map["user_id"], + organization_id: map["organization_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "secret" => struct.secret, + "user_id" => struct.user_id, + "organization_id" => struct.organization_id + }) + end +end diff --git a/lib/workos/api_key_owner.ex b/lib/workos/api_key_owner.ex new file mode 100644 index 00000000..8837d921 --- /dev/null +++ b/lib/workos/api_key_owner.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ApiKeyOwner do + @moduledoc """ + ApiKeyOwner model. + """ + + defstruct [ + :type, + :id + ] + + @type t :: %__MODULE__{ + type: String.t(), + id: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + type: map["type"], + id: map["id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "type" => struct.type, + "id" => struct.id + }) + end +end diff --git a/lib/workos/api_key_revoked.ex b/lib/workos/api_key_revoked.ex new file mode 100644 index 00000000..8eab93d5 --- /dev/null +++ b/lib/workos/api_key_revoked.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ApiKeyRevoked do + @moduledoc """ + ApiKeyRevoked model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.ApiKeyRevokedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.ApiKeyRevokedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => WorkOS.Cast.dump_struct(struct.data, &WorkOS.ApiKeyRevokedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/api_key_revoked_data.ex b/lib/workos/api_key_revoked_data.ex new file mode 100644 index 00000000..1bfffc74 --- /dev/null +++ b/lib/workos/api_key_revoked_data.ex @@ -0,0 +1,71 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ApiKeyRevokedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :object, + :id, + :owner, + :name, + :obfuscated_value, + :last_used_at, + :expires_at, + :permissions, + :created_at, + :updated_at + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + owner: WorkOS.ApiKeyRevokedDataOwner.t() | WorkOS.UserApiKeyRevokedDataOwner.t(), + name: String.t(), + obfuscated_value: String.t(), + last_used_at: String.t() | nil, + expires_at: String.t() | nil, + permissions: [String.t()], + created_at: String.t(), + updated_at: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + owner: + WorkOS.Cast.discriminated(map["owner"], "type", %{ + "organization" => &WorkOS.ApiKeyRevokedDataOwner.from_map/1, + "user" => &WorkOS.UserApiKeyRevokedDataOwner.from_map/1 + }), + name: map["name"], + obfuscated_value: map["obfuscated_value"], + last_used_at: map["last_used_at"], + expires_at: map["expires_at"], + permissions: map["permissions"], + created_at: map["created_at"], + updated_at: map["updated_at"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "owner" => struct.owner, + "name" => struct.name, + "obfuscated_value" => struct.obfuscated_value, + "last_used_at" => struct.last_used_at, + "expires_at" => struct.expires_at, + "permissions" => struct.permissions, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at + }) + end +end diff --git a/lib/workos/api_key_revoked_data_owner.ex b/lib/workos/api_key_revoked_data_owner.ex new file mode 100644 index 00000000..7ccf2ae7 --- /dev/null +++ b/lib/workos/api_key_revoked_data_owner.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ApiKeyRevokedDataOwner do + @moduledoc """ + ApiKeyRevokedDataOwner model. + """ + + defstruct [ + :type, + :id + ] + + @type t :: %__MODULE__{ + type: String.t(), + id: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + type: map["type"], + id: map["id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "type" => struct.type, + "id" => struct.id + }) + end +end diff --git a/lib/workos/api_key_updated.ex b/lib/workos/api_key_updated.ex new file mode 100644 index 00000000..672079e3 --- /dev/null +++ b/lib/workos/api_key_updated.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ApiKeyUpdated do + @moduledoc """ + ApiKeyUpdated model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.ApiKeyUpdatedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.ApiKeyUpdatedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => WorkOS.Cast.dump_struct(struct.data, &WorkOS.ApiKeyUpdatedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/api_key_updated_data.ex b/lib/workos/api_key_updated_data.ex new file mode 100644 index 00000000..371911b7 --- /dev/null +++ b/lib/workos/api_key_updated_data.ex @@ -0,0 +1,83 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ApiKeyUpdatedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :object, + :id, + :owner, + :name, + :obfuscated_value, + :last_used_at, + :expires_at, + :permissions, + :created_at, + :updated_at, + :previous_attributes + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + owner: WorkOS.ApiKeyUpdatedDataOwner.t() | WorkOS.UserApiKeyUpdatedDataOwner.t(), + name: String.t(), + obfuscated_value: String.t(), + last_used_at: String.t() | nil, + expires_at: String.t() | nil, + permissions: [String.t()], + created_at: String.t(), + updated_at: String.t(), + previous_attributes: WorkOS.ApiKeyUpdatedDataPreviousAttribute.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + owner: + WorkOS.Cast.discriminated(map["owner"], "type", %{ + "organization" => &WorkOS.ApiKeyUpdatedDataOwner.from_map/1, + "user" => &WorkOS.UserApiKeyUpdatedDataOwner.from_map/1 + }), + name: map["name"], + obfuscated_value: map["obfuscated_value"], + last_used_at: map["last_used_at"], + expires_at: map["expires_at"], + permissions: map["permissions"], + created_at: map["created_at"], + updated_at: map["updated_at"], + previous_attributes: + WorkOS.Cast.nested( + map["previous_attributes"], + &WorkOS.ApiKeyUpdatedDataPreviousAttribute.from_map/1 + ) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "owner" => struct.owner, + "name" => struct.name, + "obfuscated_value" => struct.obfuscated_value, + "last_used_at" => struct.last_used_at, + "expires_at" => struct.expires_at, + "permissions" => struct.permissions, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at, + "previous_attributes" => + WorkOS.Cast.dump_struct( + struct.previous_attributes, + &WorkOS.ApiKeyUpdatedDataPreviousAttribute.to_map/1 + ) + }) + end +end diff --git a/lib/workos/api_key_updated_data_owner.ex b/lib/workos/api_key_updated_data_owner.ex new file mode 100644 index 00000000..872858b5 --- /dev/null +++ b/lib/workos/api_key_updated_data_owner.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ApiKeyUpdatedDataOwner do + @moduledoc """ + ApiKeyUpdatedDataOwner model. + """ + + defstruct [ + :type, + :id + ] + + @type t :: %__MODULE__{ + type: String.t(), + id: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + type: map["type"], + id: map["id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "type" => struct.type, + "id" => struct.id + }) + end +end diff --git a/lib/workos/api_key_updated_data_previous_attribute.ex b/lib/workos/api_key_updated_data_previous_attribute.ex new file mode 100644 index 00000000..c3beb7b8 --- /dev/null +++ b/lib/workos/api_key_updated_data_previous_attribute.ex @@ -0,0 +1,31 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ApiKeyUpdatedDataPreviousAttribute do + @moduledoc """ + Previous API key attributes before the update. + """ + + defstruct [ + :expires_at + ] + + @type t :: %__MODULE__{ + expires_at: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + expires_at: map["expires_at"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "expires_at" => struct.expires_at + }) + end +end diff --git a/lib/workos/api_key_validation_response.ex b/lib/workos/api_key_validation_response.ex new file mode 100644 index 00000000..3c3bb9f2 --- /dev/null +++ b/lib/workos/api_key_validation_response.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ApiKeyValidationResponse do + @moduledoc """ + ApiKeyValidationResponse model. + """ + + defstruct [ + :api_key, + :agent_registration_id + ] + + @type t :: %__MODULE__{ + api_key: WorkOS.ApiKey.t() | nil, + agent_registration_id: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + api_key: WorkOS.Cast.nested(map["api_key"], &WorkOS.ApiKey.from_map/1), + agent_registration_id: map["agent_registration_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "api_key" => WorkOS.Cast.dump_struct(struct.api_key, &WorkOS.ApiKey.to_map/1), + "agent_registration_id" => struct.agent_registration_id + }) + end +end diff --git a/lib/workos/api_keys.ex b/lib/workos/api_keys.ex new file mode 100644 index 00000000..1bd400b2 --- /dev/null +++ b/lib/workos/api_keys.ex @@ -0,0 +1,136 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ApiKeys do + @moduledoc """ + Operations for the ApiKeys API. + """ + + @doc """ + List API keys for an organization + + Get a list of all API keys for an organization. + + ## Parameters + + * `organization_id` — Unique identifier of the Organization. + * `params` — query parameters: `:before`, `:after_`, `:limit`, `:order` + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec list_organization_api_keys(WorkOS.Client.t(), String.t(), map(), keyword()) :: + {:ok, WorkOS.Page.t(WorkOS.OrganizationApiKeyList.t())} | {:error, WorkOS.Error.error()} + def list_organization_api_keys(client, organization_id, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :get, + "/organizations/#{URI.encode(organization_id, &URI.char_unreserved?/1)}/api_keys", + params, + opts + ) do + fetch_next = fn cursor -> + list_organization_api_keys( + client, + organization_id, + WorkOS.Page.next_params(params, "after", cursor), + opts + ) + end + + {:ok, + WorkOS.Page.from_map(body, "data", &WorkOS.OrganizationApiKeyList.from_map/1, fetch_next)} + end + end + + @doc """ + Create an API key for an organization + + Create a new API key for an organization. + + ## Parameters + + * `organization_id` — Unique identifier of the Organization. + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec create_organization_api_key(WorkOS.Client.t(), String.t(), map(), keyword()) :: + {:ok, WorkOS.OrganizationApiKeyWithValue.t()} | {:error, WorkOS.Error.error()} + def create_organization_api_key(client, organization_id, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :post, + "/organizations/#{URI.encode(organization_id, &URI.char_unreserved?/1)}/api_keys", + params, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.OrganizationApiKeyWithValue.from_map/1)} + end + end + + @doc """ + Validate API key + + Validate an API key value and return the API key object if valid. + + ## Parameters + + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec create_validation(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.ApiKeyValidationResponse.t()} | {:error, WorkOS.Error.error()} + def create_validation(client, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request(client, :post, "/api_keys/validations", params, opts) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.ApiKeyValidationResponse.from_map/1)} + end + end + + @doc """ + Delete an API key + + Permanently deletes an API key. This action cannot be undone. Once deleted, any requests using this API key will fail authentication. + + ## Parameters + + * `id` — The unique ID of the API key. + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec delete_api_key(WorkOS.Client.t(), String.t(), keyword()) :: + {:ok, term()} | {:error, WorkOS.Error.error()} + def delete_api_key(client, id, opts \\ []) do + WorkOS.Client.request( + client, + :delete, + "/api_keys/#{URI.encode(id, &URI.char_unreserved?/1)}", + %{}, + opts + ) + end + + @doc """ + Expire an API key + + Expire an API key immediately, schedule a future expiration, or clear a scheduled future expiration. + + ## Parameters + + * `id` — The unique ID of the API key. + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec create_api_key_expire(WorkOS.Client.t(), String.t(), map(), keyword()) :: + {:ok, WorkOS.ApiKey.t()} | {:error, WorkOS.Error.error()} + def create_api_key_expire(client, id, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :post, + "/api_keys/#{URI.encode(id, &URI.char_unreserved?/1)}/expire", + params, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.ApiKey.from_map/1)} + end + end +end diff --git a/lib/workos/application_credentials_list_item.ex b/lib/workos/application_credentials_list_item.ex new file mode 100644 index 00000000..30ae6337 --- /dev/null +++ b/lib/workos/application_credentials_list_item.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ApplicationCredentialsListItem do + @moduledoc """ + ApplicationCredentialsListItem model. + """ + + defstruct [ + :object, + :id, + :secret_hint, + :last_used_at, + :created_at, + :updated_at + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + secret_hint: String.t(), + last_used_at: String.t() | nil, + created_at: String.t(), + updated_at: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + secret_hint: map["secret_hint"], + last_used_at: map["last_used_at"], + created_at: map["created_at"], + updated_at: map["updated_at"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "secret_hint" => struct.secret_hint, + "last_used_at" => struct.last_used_at, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at + }) + end +end diff --git a/lib/workos/applications_registration_types.ex b/lib/workos/applications_registration_types.ex new file mode 100644 index 00000000..90f977e7 --- /dev/null +++ b/lib/workos/applications_registration_types.ex @@ -0,0 +1,25 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ApplicationsRegistrationTypes do + @moduledoc """ + ApplicationsRegistrationTypes enum. + """ + + @type t :: :dynamic | :authenticated + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:dynamic, :authenticated] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("dynamic"), do: :dynamic + def cast("authenticated"), do: :authenticated + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:dynamic), do: "dynamic" + def dump(:authenticated), do: "authenticated" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/assign_role.ex b/lib/workos/assign_role.ex new file mode 100644 index 00000000..2ca4e8e6 --- /dev/null +++ b/lib/workos/assign_role.ex @@ -0,0 +1,43 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AssignRole do + @moduledoc """ + AssignRole model. + """ + + defstruct [ + :role_slug, + :resource_id, + :resource_external_id, + :resource_type_slug + ] + + @type t :: %__MODULE__{ + role_slug: String.t(), + resource_id: String.t() | nil, + resource_external_id: String.t() | nil, + resource_type_slug: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + role_slug: map["role_slug"], + resource_id: map["resource_id"], + resource_external_id: map["resource_external_id"], + resource_type_slug: map["resource_type_slug"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "role_slug" => struct.role_slug, + "resource_id" => struct.resource_id, + "resource_external_id" => struct.resource_external_id, + "resource_type_slug" => struct.resource_type_slug + }) + end +end diff --git a/lib/workos/audit_log_action.ex b/lib/workos/audit_log_action.ex new file mode 100644 index 00000000..0d8f4a5d --- /dev/null +++ b/lib/workos/audit_log_action.ex @@ -0,0 +1,47 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuditLogAction do + @moduledoc """ + AuditLogAction model. + """ + + defstruct [ + :object, + :name, + :schema, + :created_at, + :updated_at + ] + + @type t :: %__MODULE__{ + object: String.t(), + name: String.t(), + schema: WorkOS.AuditLogSchema.t(), + created_at: String.t(), + updated_at: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + name: map["name"], + schema: WorkOS.Cast.nested(map["schema"], &WorkOS.AuditLogSchema.from_map/1), + created_at: map["created_at"], + updated_at: map["updated_at"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "name" => struct.name, + "schema" => WorkOS.Cast.dump_struct(struct.schema, &WorkOS.AuditLogSchema.to_map/1), + "created_at" => struct.created_at, + "updated_at" => struct.updated_at + }) + end +end diff --git a/lib/workos/audit_log_configuration.ex b/lib/workos/audit_log_configuration.ex new file mode 100644 index 00000000..2df46814 --- /dev/null +++ b/lib/workos/audit_log_configuration.ex @@ -0,0 +1,48 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuditLogConfiguration do + @moduledoc """ + AuditLogConfiguration model. + """ + + defstruct [ + :organization_id, + :retention_period_in_days, + :state, + :log_stream + ] + + @type t :: %__MODULE__{ + organization_id: String.t(), + retention_period_in_days: integer(), + state: WorkOS.AuditLogConfigurationState.t(), + log_stream: WorkOS.AuditLogConfigurationLogStream.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + organization_id: map["organization_id"], + retention_period_in_days: map["retention_period_in_days"], + state: WorkOS.Cast.enum(map["state"], &WorkOS.AuditLogConfigurationState.cast/1), + log_stream: + WorkOS.Cast.nested(map["log_stream"], &WorkOS.AuditLogConfigurationLogStream.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "organization_id" => struct.organization_id, + "retention_period_in_days" => struct.retention_period_in_days, + "state" => WorkOS.Cast.enum(struct.state, &WorkOS.AuditLogConfigurationState.dump/1), + "log_stream" => + WorkOS.Cast.dump_struct( + struct.log_stream, + &WorkOS.AuditLogConfigurationLogStream.to_map/1 + ) + }) + end +end diff --git a/lib/workos/audit_log_configuration_log_stream.ex b/lib/workos/audit_log_configuration_log_stream.ex new file mode 100644 index 00000000..d8e1afbc --- /dev/null +++ b/lib/workos/audit_log_configuration_log_stream.ex @@ -0,0 +1,48 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuditLogConfigurationLogStream do + @moduledoc """ + The Audit Log Stream currently configured for the organization, if any. + """ + + defstruct [ + :id, + :type, + :state, + :last_synced_at, + :created_at + ] + + @type t :: %__MODULE__{ + id: String.t(), + type: WorkOS.AuditLogConfigurationLogStreamType.t(), + state: WorkOS.AuditLogConfigurationLogStreamState.t(), + last_synced_at: String.t() | nil, + created_at: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + id: map["id"], + type: WorkOS.Cast.enum(map["type"], &WorkOS.AuditLogConfigurationLogStreamType.cast/1), + state: WorkOS.Cast.enum(map["state"], &WorkOS.AuditLogConfigurationLogStreamState.cast/1), + last_synced_at: map["last_synced_at"], + created_at: map["created_at"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "id" => struct.id, + "type" => WorkOS.Cast.enum(struct.type, &WorkOS.AuditLogConfigurationLogStreamType.dump/1), + "state" => + WorkOS.Cast.enum(struct.state, &WorkOS.AuditLogConfigurationLogStreamState.dump/1), + "last_synced_at" => struct.last_synced_at, + "created_at" => struct.created_at + }) + end +end diff --git a/lib/workos/audit_log_configuration_log_stream_state.ex b/lib/workos/audit_log_configuration_log_stream_state.ex new file mode 100644 index 00000000..a04845ed --- /dev/null +++ b/lib/workos/audit_log_configuration_log_stream_state.ex @@ -0,0 +1,29 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuditLogConfigurationLogStreamState do + @moduledoc """ + AuditLogConfigurationLogStreamState enum. + """ + + @type t :: :active | :inactive | :error | :invalid + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:active, :inactive, :error, :invalid] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("active"), do: :active + def cast("inactive"), do: :inactive + def cast("error"), do: :error + def cast("invalid"), do: :invalid + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:active), do: "active" + def dump(:inactive), do: "inactive" + def dump(:error), do: "error" + def dump(:invalid), do: "invalid" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/audit_log_configuration_log_stream_type.ex b/lib/workos/audit_log_configuration_log_stream_type.ex new file mode 100644 index 00000000..4021dff8 --- /dev/null +++ b/lib/workos/audit_log_configuration_log_stream_type.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuditLogConfigurationLogStreamType do + @moduledoc """ + AuditLogConfigurationLogStreamType enum. + """ + + @type t :: + :azure_sentinel + | :datadog + | :generic_https + | :google_cloud_storage + | :s_3 + | :snowflake + | :splunk + + @doc "All known values." + @spec values() :: [t()] + def values, + do: [ + :azure_sentinel, + :datadog, + :generic_https, + :google_cloud_storage, + :s_3, + :snowflake, + :splunk + ] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("AzureSentinel"), do: :azure_sentinel + def cast("Datadog"), do: :datadog + def cast("GenericHttps"), do: :generic_https + def cast("GoogleCloudStorage"), do: :google_cloud_storage + def cast("S3"), do: :s_3 + def cast("Snowflake"), do: :snowflake + def cast("Splunk"), do: :splunk + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:azure_sentinel), do: "AzureSentinel" + def dump(:datadog), do: "Datadog" + def dump(:generic_https), do: "GenericHttps" + def dump(:google_cloud_storage), do: "GoogleCloudStorage" + def dump(:s_3), do: "S3" + def dump(:snowflake), do: "Snowflake" + def dump(:splunk), do: "Splunk" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/audit_log_configuration_state.ex b/lib/workos/audit_log_configuration_state.ex new file mode 100644 index 00000000..c8f104e1 --- /dev/null +++ b/lib/workos/audit_log_configuration_state.ex @@ -0,0 +1,27 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuditLogConfigurationState do + @moduledoc """ + AuditLogConfigurationState enum. + """ + + @type t :: :active | :inactive | :disabled + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:active, :inactive, :disabled] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("active"), do: :active + def cast("inactive"), do: :inactive + def cast("disabled"), do: :disabled + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:active), do: "active" + def dump(:inactive), do: "inactive" + def dump(:disabled), do: "disabled" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/audit_log_event.ex b/lib/workos/audit_log_event.ex new file mode 100644 index 00000000..b291d20f --- /dev/null +++ b/lib/workos/audit_log_event.ex @@ -0,0 +1,58 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuditLogEvent do + @moduledoc """ + AuditLogEvent model. + """ + + defstruct [ + :action, + :occurred_at, + :actor, + :targets, + :context, + :metadata, + :version + ] + + @type t :: %__MODULE__{ + action: String.t(), + occurred_at: String.t(), + actor: WorkOS.AuditLogEventActor.t(), + targets: [WorkOS.AuditLogEventTarget.t()], + context: WorkOS.AuditLogEventContext.t(), + metadata: %{optional(String.t()) => String.t() | number() | boolean()} | nil, + version: integer() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + action: map["action"], + occurred_at: map["occurred_at"], + actor: WorkOS.Cast.nested(map["actor"], &WorkOS.AuditLogEventActor.from_map/1), + targets: WorkOS.Cast.list(map["targets"], &WorkOS.AuditLogEventTarget.from_map/1), + context: WorkOS.Cast.nested(map["context"], &WorkOS.AuditLogEventContext.from_map/1), + metadata: map["metadata"], + version: map["version"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "action" => struct.action, + "occurred_at" => struct.occurred_at, + "actor" => WorkOS.Cast.dump_struct(struct.actor, &WorkOS.AuditLogEventActor.to_map/1), + "targets" => + WorkOS.Cast.list(struct.targets, fn item -> + WorkOS.Cast.dump_struct(item, &WorkOS.AuditLogEventTarget.to_map/1) + end), + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.AuditLogEventContext.to_map/1), + "metadata" => struct.metadata, + "version" => struct.version + }) + end +end diff --git a/lib/workos/audit_log_event_actor.ex b/lib/workos/audit_log_event_actor.ex new file mode 100644 index 00000000..04f77d7d --- /dev/null +++ b/lib/workos/audit_log_event_actor.ex @@ -0,0 +1,43 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuditLogEventActor do + @moduledoc """ + AuditLogEventActor model. + """ + + defstruct [ + :id, + :type, + :name, + :metadata + ] + + @type t :: %__MODULE__{ + id: String.t(), + type: String.t(), + name: String.t() | nil, + metadata: %{optional(String.t()) => String.t() | number() | boolean()} | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + id: map["id"], + type: map["type"], + name: map["name"], + metadata: map["metadata"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "id" => struct.id, + "type" => struct.type, + "name" => struct.name, + "metadata" => struct.metadata + }) + end +end diff --git a/lib/workos/audit_log_event_context.ex b/lib/workos/audit_log_event_context.ex new file mode 100644 index 00000000..dabf0804 --- /dev/null +++ b/lib/workos/audit_log_event_context.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuditLogEventContext do + @moduledoc """ + AuditLogEventContext model. + """ + + defstruct [ + :location, + :user_agent + ] + + @type t :: %__MODULE__{ + location: String.t(), + user_agent: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + location: map["location"], + user_agent: map["user_agent"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "location" => struct.location, + "user_agent" => struct.user_agent + }) + end +end diff --git a/lib/workos/audit_log_event_create_response.ex b/lib/workos/audit_log_event_create_response.ex new file mode 100644 index 00000000..ab2ae1cc --- /dev/null +++ b/lib/workos/audit_log_event_create_response.ex @@ -0,0 +1,31 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuditLogEventCreateResponse do + @moduledoc """ + AuditLogEventCreateResponse model. + """ + + defstruct [ + :success + ] + + @type t :: %__MODULE__{ + success: boolean() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + success: map["success"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "success" => struct.success + }) + end +end diff --git a/lib/workos/audit_log_event_ingestion.ex b/lib/workos/audit_log_event_ingestion.ex new file mode 100644 index 00000000..92cfea06 --- /dev/null +++ b/lib/workos/audit_log_event_ingestion.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuditLogEventIngestion do + @moduledoc """ + AuditLogEventIngestion model. + """ + + defstruct [ + :organization_id, + :event + ] + + @type t :: %__MODULE__{ + organization_id: String.t(), + event: WorkOS.AuditLogEvent.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + organization_id: map["organization_id"], + event: WorkOS.Cast.nested(map["event"], &WorkOS.AuditLogEvent.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "organization_id" => struct.organization_id, + "event" => WorkOS.Cast.dump_struct(struct.event, &WorkOS.AuditLogEvent.to_map/1) + }) + end +end diff --git a/lib/workos/audit_log_event_target.ex b/lib/workos/audit_log_event_target.ex new file mode 100644 index 00000000..d74c716f --- /dev/null +++ b/lib/workos/audit_log_event_target.ex @@ -0,0 +1,43 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuditLogEventTarget do + @moduledoc """ + AuditLogEventTarget model. + """ + + defstruct [ + :id, + :type, + :name, + :metadata + ] + + @type t :: %__MODULE__{ + id: String.t(), + type: String.t(), + name: String.t() | nil, + metadata: %{optional(String.t()) => String.t() | number() | boolean()} | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + id: map["id"], + type: map["type"], + name: map["name"], + metadata: map["metadata"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "id" => struct.id, + "type" => struct.type, + "name" => struct.name, + "metadata" => struct.metadata + }) + end +end diff --git a/lib/workos/audit_log_export.ex b/lib/workos/audit_log_export.ex new file mode 100644 index 00000000..a9f83e48 --- /dev/null +++ b/lib/workos/audit_log_export.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuditLogExport do + @moduledoc """ + AuditLogExport model. + """ + + defstruct [ + :object, + :id, + :state, + :created_at, + :updated_at, + :url + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + state: WorkOS.AuditLogExportState.t(), + created_at: String.t(), + updated_at: String.t(), + url: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + state: WorkOS.Cast.enum(map["state"], &WorkOS.AuditLogExportState.cast/1), + created_at: map["created_at"], + updated_at: map["updated_at"], + url: map["url"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "state" => WorkOS.Cast.enum(struct.state, &WorkOS.AuditLogExportState.dump/1), + "created_at" => struct.created_at, + "updated_at" => struct.updated_at, + "url" => struct.url + }) + end +end diff --git a/lib/workos/audit_log_export_creation.ex b/lib/workos/audit_log_export_creation.ex new file mode 100644 index 00000000..d52b0abd --- /dev/null +++ b/lib/workos/audit_log_export_creation.ex @@ -0,0 +1,63 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuditLogExportCreation do + @moduledoc """ + AuditLogExportCreation model. + + ## Deprecated fields + + * `:actors` — Deprecated. Use `actor_names` instead. + """ + + defstruct [ + :organization_id, + :range_start, + :range_end, + :actions, + :actors, + :actor_names, + :actor_ids, + :targets + ] + + @type t :: %__MODULE__{ + organization_id: String.t(), + range_start: String.t(), + range_end: String.t(), + actions: [String.t()] | nil, + actors: [String.t()] | nil, + actor_names: [String.t()] | nil, + actor_ids: [String.t()] | nil, + targets: [String.t()] | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + organization_id: map["organization_id"], + range_start: map["range_start"], + range_end: map["range_end"], + actions: map["actions"], + actors: map["actors"], + actor_names: map["actor_names"], + actor_ids: map["actor_ids"], + targets: map["targets"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "organization_id" => struct.organization_id, + "range_start" => struct.range_start, + "range_end" => struct.range_end, + "actions" => struct.actions, + "actors" => struct.actors, + "actor_names" => struct.actor_names, + "actor_ids" => struct.actor_ids, + "targets" => struct.targets + }) + end +end diff --git a/lib/workos/audit_log_export_state.ex b/lib/workos/audit_log_export_state.ex new file mode 100644 index 00000000..b5f5f1be --- /dev/null +++ b/lib/workos/audit_log_export_state.ex @@ -0,0 +1,29 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuditLogExportState do + @moduledoc """ + AuditLogExportState enum. + """ + + @type t :: :pending | :ready | :error | :expired + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:pending, :ready, :error, :expired] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("pending"), do: :pending + def cast("ready"), do: :ready + def cast("error"), do: :error + def cast("expired"), do: :expired + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:pending), do: "pending" + def dump(:ready), do: "ready" + def dump(:error), do: "error" + def dump(:expired), do: "expired" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/audit_log_schema.ex b/lib/workos/audit_log_schema.ex new file mode 100644 index 00000000..f2958845 --- /dev/null +++ b/lib/workos/audit_log_schema.ex @@ -0,0 +1,54 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuditLogSchema do + @moduledoc """ + AuditLogSchema model. + """ + + defstruct [ + :object, + :version, + :targets, + :created_at, + :actor, + :metadata + ] + + @type t :: %__MODULE__{ + object: String.t(), + version: integer(), + targets: [WorkOS.AuditLogSchemaTarget.t()], + created_at: String.t(), + actor: WorkOS.AuditLogSchemaActor.t() | nil, + metadata: %{optional(String.t()) => term()} | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + version: map["version"], + targets: WorkOS.Cast.list(map["targets"], &WorkOS.AuditLogSchemaTarget.from_map/1), + created_at: map["created_at"], + actor: WorkOS.Cast.nested(map["actor"], &WorkOS.AuditLogSchemaActor.from_map/1), + metadata: map["metadata"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "version" => struct.version, + "targets" => + WorkOS.Cast.list(struct.targets, fn item -> + WorkOS.Cast.dump_struct(item, &WorkOS.AuditLogSchemaTarget.to_map/1) + end), + "created_at" => struct.created_at, + "actor" => WorkOS.Cast.dump_struct(struct.actor, &WorkOS.AuditLogSchemaActor.to_map/1), + "metadata" => struct.metadata + }) + end +end diff --git a/lib/workos/audit_log_schema_actor.ex b/lib/workos/audit_log_schema_actor.ex new file mode 100644 index 00000000..801a9439 --- /dev/null +++ b/lib/workos/audit_log_schema_actor.ex @@ -0,0 +1,31 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuditLogSchemaActor do + @moduledoc """ + The metadata schema for the actor. + """ + + defstruct [ + :metadata + ] + + @type t :: %__MODULE__{ + metadata: %{optional(String.t()) => term()} + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + metadata: map["metadata"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "metadata" => struct.metadata + }) + end +end diff --git a/lib/workos/audit_log_schema_actor_input.ex b/lib/workos/audit_log_schema_actor_input.ex new file mode 100644 index 00000000..b7764744 --- /dev/null +++ b/lib/workos/audit_log_schema_actor_input.ex @@ -0,0 +1,31 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuditLogSchemaActorInput do + @moduledoc """ + AuditLogSchemaActorInput model. + """ + + defstruct [ + :metadata + ] + + @type t :: %__MODULE__{ + metadata: %{optional(String.t()) => term()} + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + metadata: map["metadata"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "metadata" => struct.metadata + }) + end +end diff --git a/lib/workos/audit_log_schema_input.ex b/lib/workos/audit_log_schema_input.ex new file mode 100644 index 00000000..d81817bd --- /dev/null +++ b/lib/workos/audit_log_schema_input.ex @@ -0,0 +1,42 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuditLogSchemaInput do + @moduledoc """ + AuditLogSchemaInput model. + """ + + defstruct [ + :targets, + :actor, + :metadata + ] + + @type t :: %__MODULE__{ + targets: [WorkOS.AuditLogSchemaTargetInput.t()], + actor: WorkOS.AuditLogSchemaActorInput.t() | nil, + metadata: %{optional(String.t()) => term()} | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + targets: WorkOS.Cast.list(map["targets"], &WorkOS.AuditLogSchemaTargetInput.from_map/1), + actor: WorkOS.Cast.nested(map["actor"], &WorkOS.AuditLogSchemaActorInput.from_map/1), + metadata: map["metadata"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "targets" => + WorkOS.Cast.list(struct.targets, fn item -> + WorkOS.Cast.dump_struct(item, &WorkOS.AuditLogSchemaTargetInput.to_map/1) + end), + "actor" => WorkOS.Cast.dump_struct(struct.actor, &WorkOS.AuditLogSchemaActorInput.to_map/1), + "metadata" => struct.metadata + }) + end +end diff --git a/lib/workos/audit_log_schema_target.ex b/lib/workos/audit_log_schema_target.ex new file mode 100644 index 00000000..91bbe212 --- /dev/null +++ b/lib/workos/audit_log_schema_target.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuditLogSchemaTarget do + @moduledoc """ + AuditLogSchemaTarget model. + """ + + defstruct [ + :type, + :metadata + ] + + @type t :: %__MODULE__{ + type: String.t(), + metadata: %{optional(String.t()) => term()} | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + type: map["type"], + metadata: map["metadata"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "type" => struct.type, + "metadata" => struct.metadata + }) + end +end diff --git a/lib/workos/audit_log_schema_target_input.ex b/lib/workos/audit_log_schema_target_input.ex new file mode 100644 index 00000000..0af68b86 --- /dev/null +++ b/lib/workos/audit_log_schema_target_input.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuditLogSchemaTargetInput do + @moduledoc """ + AuditLogSchemaTargetInput model. + """ + + defstruct [ + :type, + :metadata + ] + + @type t :: %__MODULE__{ + type: String.t(), + metadata: %{optional(String.t()) => term()} | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + type: map["type"], + metadata: map["metadata"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "type" => struct.type, + "metadata" => struct.metadata + }) + end +end diff --git a/lib/workos/audit_logs.ex b/lib/workos/audit_logs.ex index 8e4f0d37..f28ad582 100644 --- a/lib/workos/audit_logs.ex +++ b/lib/workos/audit_logs.ex @@ -1,81 +1,219 @@ +# This file is auto-generated by oagen. Do not edit. + defmodule WorkOS.AuditLogs do @moduledoc """ - Manage Audit Logs in WorkOS. + Operations for the AuditLogs API. + """ + + @doc """ + Get Retention + + Get the configured event retention period for the given Organization. + + ## Parameters + + * `id` — Unique identifier of the Organization. + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec get_organization_audit_logs_retention(WorkOS.Client.t(), String.t(), keyword()) :: + {:ok, WorkOS.AuditLogsRetention.t()} | {:error, WorkOS.Error.error()} + def get_organization_audit_logs_retention(client, id, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :get, + "/organizations/#{URI.encode(id, &URI.char_unreserved?/1)}/audit_logs_retention", + %{}, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.AuditLogsRetention.from_map/1)} + end + end + + @doc """ + Set Retention + + Set the event retention period for the given Organization. + + ## Parameters + + * `id` — Unique identifier of the Organization. + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec update_organization_audit_logs_retention(WorkOS.Client.t(), String.t(), map(), keyword()) :: + {:ok, WorkOS.AuditLogsRetention.t()} | {:error, WorkOS.Error.error()} + def update_organization_audit_logs_retention(client, id, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :put, + "/organizations/#{URI.encode(id, &URI.char_unreserved?/1)}/audit_logs_retention", + params, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.AuditLogsRetention.from_map/1)} + end + end + + @doc """ + List Actions + + Get a list of all Audit Log actions in the current environment. + + ## Parameters + + * `params` — query parameters: `:before`, `:after_`, `:limit`, `:order` + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec list_actions(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.Page.t(WorkOS.AuditLogAction.t())} | {:error, WorkOS.Error.error()} + def list_actions(client, params \\ %{}, opts \\ []) do + with {:ok, body} <- WorkOS.Client.request(client, :get, "/audit_logs/actions", params, opts) do + fetch_next = fn cursor -> + list_actions( + client, + WorkOS.Page.next_params(params, "after", cursor), + opts + ) + end + + {:ok, WorkOS.Page.from_map(body, "data", &WorkOS.AuditLogAction.from_map/1, fetch_next)} + end + end + + @doc """ + List Schemas + + Get a list of all schemas for the Audit Logs action identified by `:name`. - @see https://workos.com/docs/reference/audit-logs + ## Parameters + + * `action_name` — The name of the Audit Log action. + * `params` — query parameters: `:before`, `:after_`, `:limit`, `:order` + * `opts` — per-request options (see `WorkOS.Client.request/5`) """ + @spec list_action_schemas(WorkOS.Client.t(), String.t(), map(), keyword()) :: + {:ok, WorkOS.Page.t(WorkOS.AuditLogSchema.t())} | {:error, WorkOS.Error.error()} + def list_action_schemas(client, action_name, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :get, + "/audit_logs/actions/#{URI.encode(action_name, &URI.char_unreserved?/1)}/schemas", + params, + opts + ) do + fetch_next = fn cursor -> + list_action_schemas( + client, + action_name, + WorkOS.Page.next_params(params, "after", cursor), + opts + ) + end - alias WorkOS.AuditLogs.Export - alias WorkOS.Empty + {:ok, WorkOS.Page.from_map(body, "data", &WorkOS.AuditLogSchema.from_map/1, fetch_next)} + end + end @doc """ - Creates an Audit Log Event. + Create Schema - Parameter options: + Creates a new Audit Log schema used to validate the payload of incoming Audit Log Events. If the `action` does not exist, it will also be created. - * `:organization_id` - The unique ID of the Organization. (required) - * `:event` - The Audit Log Event to be created. (required) - * `:idempotency_key` - A unique string as the value. Each subsequent request matching this unique string will return the same response. + ## Parameters + * `action_name` — The name of the Audit Log action. + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) """ - @spec create_event(map()) :: WorkOS.Client.response(Empty.t()) - @spec create_event(WorkOS.Client.t(), map()) :: - WorkOS.Client.response(Empty.t()) - def create_event(client \\ WorkOS.client(), opts) - when is_map_key(opts, :organization_id) and is_map_key(opts, :event) do - WorkOS.Client.post( - client, - Empty, - "/audit_logs/events", - %{ - organization_id: opts[:organization_id], - event: opts[:event] - }, - headers: [ - {"Idempotency-Key", opts[:idempotency_key]} - ] - ) + @spec create_schema(WorkOS.Client.t(), String.t(), map(), keyword()) :: + {:ok, WorkOS.AuditLogSchema.t()} | {:error, WorkOS.Error.error()} + def create_schema(client, action_name, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :post, + "/audit_logs/actions/#{URI.encode(action_name, &URI.char_unreserved?/1)}/schemas", + params, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.AuditLogSchema.from_map/1)} + end end @doc """ - Creates an Audit Log Export. + Create Event + + Create an Audit Log Event. + + This API supports idempotency which guarantees that performing the same operation multiple times will have the same result as if the operation were performed only once. This is handy in situations where you may need to retry a request due to a failure or prevent accidental duplicate requests from creating more than one resource. + + To achieve idempotency, you can add `Idempotency-Key` request header to a Create Event request with a unique string as the value. Each subsequent request matching this unique string will return the same response. We suggest using [v4 UUIDs](https://en.wikipedia.org/wiki/Universally_unique_identifier) for idempotency keys to avoid collisions. - Parameter options: + Idempotency keys expire after 24 hours. The API will generate a new response if you submit a request with an expired key. - * `:organization_id` - The unique ID of the Organization. (required) - * `:range_start` - ISO-8601 value for start of the export range. (required) - * `:range_end` - ISO-8601 value for end of the export range. (required) - * `:actions` - List of actions to filter against. - * `:actors` - List of actor names to filter against. - * `:targets` - List of target types to filter against. + ## Parameters + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) """ - @spec create_export(map()) :: WorkOS.Client.response(Export.t()) - @spec create_export(WorkOS.Client.t(), map()) :: - WorkOS.Client.response(Export.t()) - def create_export(client \\ WorkOS.client(), opts) - when is_map_key(opts, :organization_id) and is_map_key(opts, :range_start) and - is_map_key(opts, :range_end) do - WorkOS.Client.post(client, Export, "/audit_logs/exports", %{ - organization_id: opts[:organization_id], - range_start: opts[:range_start], - range_end: opts[:range_end], - actions: opts[:actions], - actors: opts[:actors], - targets: opts[:targets] - }) + @spec create_event(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.AuditLogEventCreateResponse.t()} | {:error, WorkOS.Error.error()} + def create_event(client, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :post, + "/audit_logs/events", + params, + Keyword.put_new(opts, :idempotency, true) + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.AuditLogEventCreateResponse.from_map/1)} + end end @doc """ - Gets an Audit Log Export given an ID. + Create Export + + Create an Audit Log Export. Exports are scoped to a single organization within a specified date range. + + ## Parameters + + * `params` — request body map. Deprecated: `:actors` (see `WorkOS.AuditLogExportCreation`). + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec create_export(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.AuditLogExport.t()} | {:error, WorkOS.Error.error()} + def create_export(client, params \\ %{}, opts \\ []) do + with {:ok, body} <- WorkOS.Client.request(client, :post, "/audit_logs/exports", params, opts) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.AuditLogExport.from_map/1)} + end + end + + @doc """ + Get Export + + Get an Audit Log Export. The URL will expire after 10 minutes. If the export is needed again at a later time, refetching the export will regenerate the URL. + + ## Parameters + + * `audit_log_export_id` — The unique ID of the Audit Log Export. + * `opts` — per-request options (see `WorkOS.Client.request/5`) """ - @spec get_export(String.t()) :: WorkOS.Client.response(Export.t()) - @spec get_export(WorkOS.Client.t(), String.t()) :: WorkOS.Client.response(Export.t()) - def get_export(client \\ WorkOS.client(), audit_log_export_id) do - WorkOS.Client.get(client, Export, "/audit_logs/exports/:id", - opts: [ - path_params: [id: audit_log_export_id] - ] - ) + @spec get_export(WorkOS.Client.t(), String.t(), keyword()) :: + {:ok, WorkOS.AuditLogExport.t()} | {:error, WorkOS.Error.error()} + def get_export(client, audit_log_export_id, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :get, + "/audit_logs/exports/#{URI.encode(audit_log_export_id, &URI.char_unreserved?/1)}", + %{}, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.AuditLogExport.from_map/1)} + end end end diff --git a/lib/workos/audit_logs/export.ex b/lib/workos/audit_logs/export.ex deleted file mode 100644 index 48b4ff44..00000000 --- a/lib/workos/audit_logs/export.ex +++ /dev/null @@ -1,38 +0,0 @@ -defmodule WorkOS.AuditLogs.Export do - @moduledoc """ - WorkOS Audit Logs Export struct. - """ - - @behaviour WorkOS.Castable - - @type t() :: %__MODULE__{ - id: String.t(), - object: String.t(), - state: String.t(), - url: String.t() | nil, - updated_at: String.t(), - created_at: String.t() - } - - @enforce_keys [:id, :object, :state, :updated_at, :created_at] - defstruct [ - :id, - :object, - :state, - :url, - :updated_at, - :created_at - ] - - @impl true - def cast(map) do - %__MODULE__{ - id: map["id"], - object: map["object"], - state: map["state"], - url: map["url"], - updated_at: map["updated_at"], - created_at: map["created_at"] - } - end -end diff --git a/lib/workos/audit_logs_retention.ex b/lib/workos/audit_logs_retention.ex new file mode 100644 index 00000000..cdf0c0a5 --- /dev/null +++ b/lib/workos/audit_logs_retention.ex @@ -0,0 +1,31 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuditLogsRetention do + @moduledoc """ + AuditLogsRetention model. + """ + + defstruct [ + :retention_period_in_days + ] + + @type t :: %__MODULE__{ + retention_period_in_days: integer() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + retention_period_in_days: map["retention_period_in_days"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "retention_period_in_days" => struct.retention_period_in_days + }) + end +end diff --git a/lib/workos/auth_method_mismatch_error.ex b/lib/workos/auth_method_mismatch_error.ex new file mode 100644 index 00000000..0ae9e82d --- /dev/null +++ b/lib/workos/auth_method_mismatch_error.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthMethodMismatchError do + @moduledoc """ + AuthMethodMismatchError model. + """ + + defstruct [ + :code, + :message + ] + + @type t :: %__MODULE__{ + code: String.t(), + message: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + code: map["code"], + message: map["message"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "code" => struct.code, + "message" => struct.message + }) + end +end diff --git a/lib/workos/authenticate_response.ex b/lib/workos/authenticate_response.ex new file mode 100644 index 00000000..0d6e81de --- /dev/null +++ b/lib/workos/authenticate_response.ex @@ -0,0 +1,80 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthenticateResponse do + @moduledoc """ + AuthenticateResponse model. + """ + + defstruct [ + :user, + :access_token, + :refresh_token, + :organization_id, + :authkit_authorization_code, + :authentication_method, + :impersonator, + :oauth_tokens + ] + + @type t :: %__MODULE__{ + user: WorkOS.User.t(), + access_token: String.t(), + refresh_token: String.t(), + organization_id: String.t() | nil, + authkit_authorization_code: String.t() | nil, + authentication_method: WorkOS.AuthenticateResponseAuthenticationMethod.t() | nil, + impersonator: WorkOS.AuthenticateResponseImpersonator.t() | nil, + oauth_tokens: WorkOS.AuthenticateResponseOAuthToken.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + user: WorkOS.Cast.nested(map["user"], &WorkOS.User.from_map/1), + access_token: map["access_token"], + refresh_token: map["refresh_token"], + organization_id: map["organization_id"], + authkit_authorization_code: map["authkit_authorization_code"], + authentication_method: + WorkOS.Cast.enum( + map["authentication_method"], + &WorkOS.AuthenticateResponseAuthenticationMethod.cast/1 + ), + impersonator: + WorkOS.Cast.nested( + map["impersonator"], + &WorkOS.AuthenticateResponseImpersonator.from_map/1 + ), + oauth_tokens: + WorkOS.Cast.nested(map["oauth_tokens"], &WorkOS.AuthenticateResponseOAuthToken.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "user" => WorkOS.Cast.dump_struct(struct.user, &WorkOS.User.to_map/1), + "access_token" => struct.access_token, + "refresh_token" => struct.refresh_token, + "organization_id" => struct.organization_id, + "authkit_authorization_code" => struct.authkit_authorization_code, + "authentication_method" => + WorkOS.Cast.enum( + struct.authentication_method, + &WorkOS.AuthenticateResponseAuthenticationMethod.dump/1 + ), + "impersonator" => + WorkOS.Cast.dump_struct( + struct.impersonator, + &WorkOS.AuthenticateResponseImpersonator.to_map/1 + ), + "oauth_tokens" => + WorkOS.Cast.dump_struct( + struct.oauth_tokens, + &WorkOS.AuthenticateResponseOAuthToken.to_map/1 + ) + }) + end +end diff --git a/lib/workos/authenticate_response_authentication_method.ex b/lib/workos/authenticate_response_authentication_method.ex new file mode 100644 index 00000000..3d6de48f --- /dev/null +++ b/lib/workos/authenticate_response_authentication_method.ex @@ -0,0 +1,111 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthenticateResponseAuthenticationMethod do + @moduledoc """ + AuthenticateResponseAuthenticationMethod enum. + """ + + @type t :: + :sso + | :password + | :passkey + | :apple_oauth + | :bitbucket_oauth + | :cross_app_auth + | :discord_oauth + | :external_auth + | :git_hub_oauth + | :git_lab_oauth + | :google_oauth + | :intuit_oauth + | :linked_in_oauth + | :microsoft_oauth + | :salesforce_oauth + | :slack_oauth + | :vercel_marketplace_oauth + | :vercel_oauth + | :xero_oauth + | :magic_auth + | :impersonation + | :migrated_session + + @doc "All known values." + @spec values() :: [t()] + def values, + do: [ + :sso, + :password, + :passkey, + :apple_oauth, + :bitbucket_oauth, + :cross_app_auth, + :discord_oauth, + :external_auth, + :git_hub_oauth, + :git_lab_oauth, + :google_oauth, + :intuit_oauth, + :linked_in_oauth, + :microsoft_oauth, + :salesforce_oauth, + :slack_oauth, + :vercel_marketplace_oauth, + :vercel_oauth, + :xero_oauth, + :magic_auth, + :impersonation, + :migrated_session + ] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("SSO"), do: :sso + def cast("Password"), do: :password + def cast("Passkey"), do: :passkey + def cast("AppleOAuth"), do: :apple_oauth + def cast("BitbucketOAuth"), do: :bitbucket_oauth + def cast("CrossAppAuth"), do: :cross_app_auth + def cast("DiscordOAuth"), do: :discord_oauth + def cast("ExternalAuth"), do: :external_auth + def cast("GitHubOAuth"), do: :git_hub_oauth + def cast("GitLabOAuth"), do: :git_lab_oauth + def cast("GoogleOAuth"), do: :google_oauth + def cast("IntuitOAuth"), do: :intuit_oauth + def cast("LinkedInOAuth"), do: :linked_in_oauth + def cast("MicrosoftOAuth"), do: :microsoft_oauth + def cast("SalesforceOAuth"), do: :salesforce_oauth + def cast("SlackOAuth"), do: :slack_oauth + def cast("VercelMarketplaceOAuth"), do: :vercel_marketplace_oauth + def cast("VercelOAuth"), do: :vercel_oauth + def cast("XeroOAuth"), do: :xero_oauth + def cast("MagicAuth"), do: :magic_auth + def cast("Impersonation"), do: :impersonation + def cast("MigratedSession"), do: :migrated_session + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:sso), do: "SSO" + def dump(:password), do: "Password" + def dump(:passkey), do: "Passkey" + def dump(:apple_oauth), do: "AppleOAuth" + def dump(:bitbucket_oauth), do: "BitbucketOAuth" + def dump(:cross_app_auth), do: "CrossAppAuth" + def dump(:discord_oauth), do: "DiscordOAuth" + def dump(:external_auth), do: "ExternalAuth" + def dump(:git_hub_oauth), do: "GitHubOAuth" + def dump(:git_lab_oauth), do: "GitLabOAuth" + def dump(:google_oauth), do: "GoogleOAuth" + def dump(:intuit_oauth), do: "IntuitOAuth" + def dump(:linked_in_oauth), do: "LinkedInOAuth" + def dump(:microsoft_oauth), do: "MicrosoftOAuth" + def dump(:salesforce_oauth), do: "SalesforceOAuth" + def dump(:slack_oauth), do: "SlackOAuth" + def dump(:vercel_marketplace_oauth), do: "VercelMarketplaceOAuth" + def dump(:vercel_oauth), do: "VercelOAuth" + def dump(:xero_oauth), do: "XeroOAuth" + def dump(:magic_auth), do: "MagicAuth" + def dump(:impersonation), do: "Impersonation" + def dump(:migrated_session), do: "MigratedSession" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/authenticate_response_impersonator.ex b/lib/workos/authenticate_response_impersonator.ex new file mode 100644 index 00000000..268d3180 --- /dev/null +++ b/lib/workos/authenticate_response_impersonator.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthenticateResponseImpersonator do + @moduledoc """ + Information about the impersonator if this session was created via impersonation. + """ + + defstruct [ + :email, + :reason + ] + + @type t :: %__MODULE__{ + email: String.t(), + reason: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + email: map["email"], + reason: map["reason"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "email" => struct.email, + "reason" => struct.reason + }) + end +end diff --git a/lib/workos/authenticate_response_oauth_token.ex b/lib/workos/authenticate_response_oauth_token.ex new file mode 100644 index 00000000..1d870fd8 --- /dev/null +++ b/lib/workos/authenticate_response_oauth_token.ex @@ -0,0 +1,47 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthenticateResponseOAuthToken do + @moduledoc """ + The OAuth tokens from the identity provider, if applicable. + """ + + defstruct [ + :provider, + :refresh_token, + :access_token, + :expires_at, + :scopes + ] + + @type t :: %__MODULE__{ + provider: String.t(), + refresh_token: String.t(), + access_token: String.t(), + expires_at: integer(), + scopes: [String.t()] + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + provider: map["provider"], + refresh_token: map["refresh_token"], + access_token: map["access_token"], + expires_at: map["expires_at"], + scopes: map["scopes"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "provider" => struct.provider, + "refresh_token" => struct.refresh_token, + "access_token" => struct.access_token, + "expires_at" => struct.expires_at, + "scopes" => struct.scopes + }) + end +end diff --git a/lib/workos/authentication_challenge.ex b/lib/workos/authentication_challenge.ex new file mode 100644 index 00000000..7392dc87 --- /dev/null +++ b/lib/workos/authentication_challenge.ex @@ -0,0 +1,55 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthenticationChallenge do + @moduledoc """ + AuthenticationChallenge model. + """ + + defstruct [ + :object, + :id, + :authentication_factor_id, + :created_at, + :updated_at, + :expires_at, + :code + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + authentication_factor_id: String.t(), + created_at: String.t(), + updated_at: String.t(), + expires_at: String.t() | nil, + code: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + authentication_factor_id: map["authentication_factor_id"], + created_at: map["created_at"], + updated_at: map["updated_at"], + expires_at: map["expires_at"], + code: map["code"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "authentication_factor_id" => struct.authentication_factor_id, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at, + "expires_at" => struct.expires_at, + "code" => struct.code + }) + end +end diff --git a/lib/workos/authentication_challenge_verify_response.ex b/lib/workos/authentication_challenge_verify_response.ex new file mode 100644 index 00000000..a1f57946 --- /dev/null +++ b/lib/workos/authentication_challenge_verify_response.ex @@ -0,0 +1,36 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthenticationChallengeVerifyResponse do + @moduledoc """ + AuthenticationChallengeVerifyResponse model. + """ + + defstruct [ + :challenge, + :valid + ] + + @type t :: %__MODULE__{ + challenge: WorkOS.AuthenticationChallenge.t(), + valid: boolean() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + challenge: WorkOS.Cast.nested(map["challenge"], &WorkOS.AuthenticationChallenge.from_map/1), + valid: map["valid"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "challenge" => + WorkOS.Cast.dump_struct(struct.challenge, &WorkOS.AuthenticationChallenge.to_map/1), + "valid" => struct.valid + }) + end +end diff --git a/lib/workos/authentication_challenges_verify_request.ex b/lib/workos/authentication_challenges_verify_request.ex new file mode 100644 index 00000000..22951384 --- /dev/null +++ b/lib/workos/authentication_challenges_verify_request.ex @@ -0,0 +1,31 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthenticationChallengesVerifyRequest do + @moduledoc """ + AuthenticationChallengesVerifyRequest model. + """ + + defstruct [ + :code + ] + + @type t :: %__MODULE__{ + code: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + code: map["code"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "code" => struct.code + }) + end +end diff --git a/lib/workos/authentication_email_verification_failed.ex b/lib/workos/authentication_email_verification_failed.ex new file mode 100644 index 00000000..84040337 --- /dev/null +++ b/lib/workos/authentication_email_verification_failed.ex @@ -0,0 +1,59 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthenticationEmailVerificationFailed do + @moduledoc """ + AuthenticationEmailVerificationFailed model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.AuthenticationEmailVerificationFailedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: + WorkOS.Cast.nested( + map["data"], + &WorkOS.AuthenticationEmailVerificationFailedData.from_map/1 + ), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => + WorkOS.Cast.dump_struct( + struct.data, + &WorkOS.AuthenticationEmailVerificationFailedData.to_map/1 + ), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/authentication_email_verification_failed_data.ex b/lib/workos/authentication_email_verification_failed_data.ex new file mode 100644 index 00000000..86b0a2af --- /dev/null +++ b/lib/workos/authentication_email_verification_failed_data.ex @@ -0,0 +1,63 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthenticationEmailVerificationFailedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :type, + :status, + :ip_address, + :user_agent, + :user_id, + :email, + :error + ] + + @type t :: %__MODULE__{ + type: String.t(), + status: String.t(), + ip_address: String.t() | nil, + user_agent: String.t() | nil, + user_id: String.t() | nil, + email: String.t() | nil, + error: WorkOS.AuthenticationEmailVerificationFailedDataError.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + type: map["type"], + status: map["status"], + ip_address: map["ip_address"], + user_agent: map["user_agent"], + user_id: map["user_id"], + email: map["email"], + error: + WorkOS.Cast.nested( + map["error"], + &WorkOS.AuthenticationEmailVerificationFailedDataError.from_map/1 + ) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "type" => struct.type, + "status" => struct.status, + "ip_address" => struct.ip_address, + "user_agent" => struct.user_agent, + "user_id" => struct.user_id, + "email" => struct.email, + "error" => + WorkOS.Cast.dump_struct( + struct.error, + &WorkOS.AuthenticationEmailVerificationFailedDataError.to_map/1 + ) + }) + end +end diff --git a/lib/workos/authentication_email_verification_failed_data_error.ex b/lib/workos/authentication_email_verification_failed_data_error.ex new file mode 100644 index 00000000..4ff446e1 --- /dev/null +++ b/lib/workos/authentication_email_verification_failed_data_error.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthenticationEmailVerificationFailedDataError do + @moduledoc """ + Details about the authentication error. + """ + + defstruct [ + :code, + :message + ] + + @type t :: %__MODULE__{ + code: String.t(), + message: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + code: map["code"], + message: map["message"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "code" => struct.code, + "message" => struct.message + }) + end +end diff --git a/lib/workos/authentication_email_verification_succeeded.ex b/lib/workos/authentication_email_verification_succeeded.ex new file mode 100644 index 00000000..5ec797fc --- /dev/null +++ b/lib/workos/authentication_email_verification_succeeded.ex @@ -0,0 +1,59 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthenticationEmailVerificationSucceeded do + @moduledoc """ + AuthenticationEmailVerificationSucceeded model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.AuthenticationEmailVerificationSucceededData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: + WorkOS.Cast.nested( + map["data"], + &WorkOS.AuthenticationEmailVerificationSucceededData.from_map/1 + ), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => + WorkOS.Cast.dump_struct( + struct.data, + &WorkOS.AuthenticationEmailVerificationSucceededData.to_map/1 + ), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/authentication_email_verification_succeeded_data.ex b/lib/workos/authentication_email_verification_succeeded_data.ex new file mode 100644 index 00000000..526cb637 --- /dev/null +++ b/lib/workos/authentication_email_verification_succeeded_data.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthenticationEmailVerificationSucceededData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :type, + :status, + :ip_address, + :user_agent, + :user_id, + :email + ] + + @type t :: %__MODULE__{ + type: String.t(), + status: String.t(), + ip_address: String.t() | nil, + user_agent: String.t() | nil, + user_id: String.t(), + email: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + type: map["type"], + status: map["status"], + ip_address: map["ip_address"], + user_agent: map["user_agent"], + user_id: map["user_id"], + email: map["email"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "type" => struct.type, + "status" => struct.status, + "ip_address" => struct.ip_address, + "user_agent" => struct.user_agent, + "user_id" => struct.user_id, + "email" => struct.email + }) + end +end diff --git a/lib/workos/authentication_factor.ex b/lib/workos/authentication_factor.ex new file mode 100644 index 00000000..fc31f2d6 --- /dev/null +++ b/lib/workos/authentication_factor.ex @@ -0,0 +1,59 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthenticationFactor do + @moduledoc """ + AuthenticationFactor model. + """ + + defstruct [ + :object, + :id, + :type, + :created_at, + :updated_at, + :user_id, + :sms, + :totp + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + type: WorkOS.AuthenticationFactorType.t(), + created_at: String.t(), + updated_at: String.t(), + user_id: String.t() | nil, + sms: WorkOS.AuthenticationFactorSms.t() | nil, + totp: WorkOS.AuthenticationFactorTotp.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + type: WorkOS.Cast.enum(map["type"], &WorkOS.AuthenticationFactorType.cast/1), + created_at: map["created_at"], + updated_at: map["updated_at"], + user_id: map["user_id"], + sms: WorkOS.Cast.nested(map["sms"], &WorkOS.AuthenticationFactorSms.from_map/1), + totp: WorkOS.Cast.nested(map["totp"], &WorkOS.AuthenticationFactorTotp.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "type" => WorkOS.Cast.enum(struct.type, &WorkOS.AuthenticationFactorType.dump/1), + "created_at" => struct.created_at, + "updated_at" => struct.updated_at, + "user_id" => struct.user_id, + "sms" => WorkOS.Cast.dump_struct(struct.sms, &WorkOS.AuthenticationFactorSms.to_map/1), + "totp" => WorkOS.Cast.dump_struct(struct.totp, &WorkOS.AuthenticationFactorTotp.to_map/1) + }) + end +end diff --git a/lib/workos/authentication_factor_enrolled.ex b/lib/workos/authentication_factor_enrolled.ex new file mode 100644 index 00000000..5aacad18 --- /dev/null +++ b/lib/workos/authentication_factor_enrolled.ex @@ -0,0 +1,61 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthenticationFactorEnrolled do + @moduledoc """ + AuthenticationFactorEnrolled model. + """ + + defstruct [ + :object, + :id, + :type, + :created_at, + :updated_at, + :user_id, + :sms, + :totp + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + type: WorkOS.AuthenticationFactorEnrolledType.t(), + created_at: String.t(), + updated_at: String.t(), + user_id: String.t() | nil, + sms: WorkOS.AuthenticationFactorEnrolledSms.t() | nil, + totp: WorkOS.AuthenticationFactorEnrolledTotp.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + type: WorkOS.Cast.enum(map["type"], &WorkOS.AuthenticationFactorEnrolledType.cast/1), + created_at: map["created_at"], + updated_at: map["updated_at"], + user_id: map["user_id"], + sms: WorkOS.Cast.nested(map["sms"], &WorkOS.AuthenticationFactorEnrolledSms.from_map/1), + totp: WorkOS.Cast.nested(map["totp"], &WorkOS.AuthenticationFactorEnrolledTotp.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "type" => WorkOS.Cast.enum(struct.type, &WorkOS.AuthenticationFactorEnrolledType.dump/1), + "created_at" => struct.created_at, + "updated_at" => struct.updated_at, + "user_id" => struct.user_id, + "sms" => + WorkOS.Cast.dump_struct(struct.sms, &WorkOS.AuthenticationFactorEnrolledSms.to_map/1), + "totp" => + WorkOS.Cast.dump_struct(struct.totp, &WorkOS.AuthenticationFactorEnrolledTotp.to_map/1) + }) + end +end diff --git a/lib/workos/authentication_factor_enrolled_sms.ex b/lib/workos/authentication_factor_enrolled_sms.ex new file mode 100644 index 00000000..a61747b0 --- /dev/null +++ b/lib/workos/authentication_factor_enrolled_sms.ex @@ -0,0 +1,31 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthenticationFactorEnrolledSms do + @moduledoc """ + SMS-based authentication factor details. + """ + + defstruct [ + :phone_number + ] + + @type t :: %__MODULE__{ + phone_number: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + phone_number: map["phone_number"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "phone_number" => struct.phone_number + }) + end +end diff --git a/lib/workos/authentication_factor_enrolled_totp.ex b/lib/workos/authentication_factor_enrolled_totp.ex new file mode 100644 index 00000000..af58495e --- /dev/null +++ b/lib/workos/authentication_factor_enrolled_totp.ex @@ -0,0 +1,47 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthenticationFactorEnrolledTotp do + @moduledoc """ + TOTP-based authentication factor details. Includes enrollment secrets only available at creation time. + """ + + defstruct [ + :issuer, + :user, + :secret, + :qr_code, + :uri + ] + + @type t :: %__MODULE__{ + issuer: String.t(), + user: String.t(), + secret: String.t(), + qr_code: String.t(), + uri: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + issuer: map["issuer"], + user: map["user"], + secret: map["secret"], + qr_code: map["qr_code"], + uri: map["uri"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "issuer" => struct.issuer, + "user" => struct.user, + "secret" => struct.secret, + "qr_code" => struct.qr_code, + "uri" => struct.uri + }) + end +end diff --git a/lib/workos/authentication_factor_enrolled_type.ex b/lib/workos/authentication_factor_enrolled_type.ex new file mode 100644 index 00000000..c36f76d5 --- /dev/null +++ b/lib/workos/authentication_factor_enrolled_type.ex @@ -0,0 +1,29 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthenticationFactorEnrolledType do + @moduledoc """ + AuthenticationFactorEnrolledType enum. + """ + + @type t :: :generic_otp | :sms | :totp | :webauthn + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:generic_otp, :sms, :totp, :webauthn] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("generic_otp"), do: :generic_otp + def cast("sms"), do: :sms + def cast("totp"), do: :totp + def cast("webauthn"), do: :webauthn + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:generic_otp), do: "generic_otp" + def dump(:sms), do: "sms" + def dump(:totp), do: "totp" + def dump(:webauthn), do: "webauthn" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/authentication_factor_sms.ex b/lib/workos/authentication_factor_sms.ex new file mode 100644 index 00000000..d5d37fbe --- /dev/null +++ b/lib/workos/authentication_factor_sms.ex @@ -0,0 +1,31 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthenticationFactorSms do + @moduledoc """ + SMS-based authentication factor details. + """ + + defstruct [ + :phone_number + ] + + @type t :: %__MODULE__{ + phone_number: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + phone_number: map["phone_number"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "phone_number" => struct.phone_number + }) + end +end diff --git a/lib/workos/authentication_factor_totp.ex b/lib/workos/authentication_factor_totp.ex new file mode 100644 index 00000000..d57c7651 --- /dev/null +++ b/lib/workos/authentication_factor_totp.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthenticationFactorTotp do + @moduledoc """ + TOTP-based authentication factor details. + """ + + defstruct [ + :issuer, + :user + ] + + @type t :: %__MODULE__{ + issuer: String.t(), + user: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + issuer: map["issuer"], + user: map["user"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "issuer" => struct.issuer, + "user" => struct.user + }) + end +end diff --git a/lib/workos/authentication_factor_type.ex b/lib/workos/authentication_factor_type.ex new file mode 100644 index 00000000..36f2d9ec --- /dev/null +++ b/lib/workos/authentication_factor_type.ex @@ -0,0 +1,29 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthenticationFactorType do + @moduledoc """ + AuthenticationFactorType enum. + """ + + @type t :: :generic_otp | :sms | :totp | :webauthn + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:generic_otp, :sms, :totp, :webauthn] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("generic_otp"), do: :generic_otp + def cast("sms"), do: :sms + def cast("totp"), do: :totp + def cast("webauthn"), do: :webauthn + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:generic_otp), do: "generic_otp" + def dump(:sms), do: "sms" + def dump(:totp), do: "totp" + def dump(:webauthn), do: "webauthn" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/authentication_factors_create_request.ex b/lib/workos/authentication_factors_create_request.ex new file mode 100644 index 00000000..fa288d4e --- /dev/null +++ b/lib/workos/authentication_factors_create_request.ex @@ -0,0 +1,48 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthenticationFactorsCreateRequest do + @moduledoc """ + AuthenticationFactorsCreateRequest model. + """ + + defstruct [ + :type, + :phone_number, + :totp_issuer, + :totp_user, + :user_id + ] + + @type t :: %__MODULE__{ + type: WorkOS.AuthenticationFactorsCreateRequestType.t(), + phone_number: String.t() | nil, + totp_issuer: String.t() | nil, + totp_user: String.t() | nil, + user_id: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + type: WorkOS.Cast.enum(map["type"], &WorkOS.AuthenticationFactorsCreateRequestType.cast/1), + phone_number: map["phone_number"], + totp_issuer: map["totp_issuer"], + totp_user: map["totp_user"], + user_id: map["user_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "type" => + WorkOS.Cast.enum(struct.type, &WorkOS.AuthenticationFactorsCreateRequestType.dump/1), + "phone_number" => struct.phone_number, + "totp_issuer" => struct.totp_issuer, + "totp_user" => struct.totp_user, + "user_id" => struct.user_id + }) + end +end diff --git a/lib/workos/authentication_factors_create_request_type.ex b/lib/workos/authentication_factors_create_request_type.ex new file mode 100644 index 00000000..858fedaa --- /dev/null +++ b/lib/workos/authentication_factors_create_request_type.ex @@ -0,0 +1,27 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthenticationFactorsCreateRequestType do + @moduledoc """ + AuthenticationFactorsCreateRequestType enum. + """ + + @type t :: :generic_otp | :sms | :totp + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:generic_otp, :sms, :totp] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("generic_otp"), do: :generic_otp + def cast("sms"), do: :sms + def cast("totp"), do: :totp + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:generic_otp), do: "generic_otp" + def dump(:sms), do: "sms" + def dump(:totp), do: "totp" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/authentication_magic_auth_failed.ex b/lib/workos/authentication_magic_auth_failed.ex new file mode 100644 index 00000000..218be203 --- /dev/null +++ b/lib/workos/authentication_magic_auth_failed.ex @@ -0,0 +1,52 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthenticationMagicAuthFailed do + @moduledoc """ + AuthenticationMagicAuthFailed model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.AuthenticationMagicAuthFailedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.AuthenticationMagicAuthFailedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => + WorkOS.Cast.dump_struct(struct.data, &WorkOS.AuthenticationMagicAuthFailedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/authentication_magic_auth_failed_data.ex b/lib/workos/authentication_magic_auth_failed_data.ex new file mode 100644 index 00000000..14ccb76c --- /dev/null +++ b/lib/workos/authentication_magic_auth_failed_data.ex @@ -0,0 +1,63 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthenticationMagicAuthFailedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :type, + :status, + :ip_address, + :user_agent, + :user_id, + :email, + :error + ] + + @type t :: %__MODULE__{ + type: String.t(), + status: String.t(), + ip_address: String.t() | nil, + user_agent: String.t() | nil, + user_id: String.t() | nil, + email: String.t() | nil, + error: WorkOS.AuthenticationMagicAuthFailedDataError.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + type: map["type"], + status: map["status"], + ip_address: map["ip_address"], + user_agent: map["user_agent"], + user_id: map["user_id"], + email: map["email"], + error: + WorkOS.Cast.nested( + map["error"], + &WorkOS.AuthenticationMagicAuthFailedDataError.from_map/1 + ) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "type" => struct.type, + "status" => struct.status, + "ip_address" => struct.ip_address, + "user_agent" => struct.user_agent, + "user_id" => struct.user_id, + "email" => struct.email, + "error" => + WorkOS.Cast.dump_struct( + struct.error, + &WorkOS.AuthenticationMagicAuthFailedDataError.to_map/1 + ) + }) + end +end diff --git a/lib/workos/authentication_magic_auth_failed_data_error.ex b/lib/workos/authentication_magic_auth_failed_data_error.ex new file mode 100644 index 00000000..0272dfcb --- /dev/null +++ b/lib/workos/authentication_magic_auth_failed_data_error.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthenticationMagicAuthFailedDataError do + @moduledoc """ + Details about the authentication error. + """ + + defstruct [ + :code, + :message + ] + + @type t :: %__MODULE__{ + code: String.t(), + message: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + code: map["code"], + message: map["message"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "code" => struct.code, + "message" => struct.message + }) + end +end diff --git a/lib/workos/authentication_magic_auth_succeeded.ex b/lib/workos/authentication_magic_auth_succeeded.ex new file mode 100644 index 00000000..53af6ebb --- /dev/null +++ b/lib/workos/authentication_magic_auth_succeeded.ex @@ -0,0 +1,56 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthenticationMagicAuthSucceeded do + @moduledoc """ + AuthenticationMagicAuthSucceeded model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.AuthenticationMagicAuthSucceededData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: + WorkOS.Cast.nested(map["data"], &WorkOS.AuthenticationMagicAuthSucceededData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => + WorkOS.Cast.dump_struct( + struct.data, + &WorkOS.AuthenticationMagicAuthSucceededData.to_map/1 + ), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/authentication_magic_auth_succeeded_data.ex b/lib/workos/authentication_magic_auth_succeeded_data.ex new file mode 100644 index 00000000..03dc654e --- /dev/null +++ b/lib/workos/authentication_magic_auth_succeeded_data.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthenticationMagicAuthSucceededData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :type, + :status, + :ip_address, + :user_agent, + :user_id, + :email + ] + + @type t :: %__MODULE__{ + type: String.t(), + status: String.t(), + ip_address: String.t() | nil, + user_agent: String.t() | nil, + user_id: String.t(), + email: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + type: map["type"], + status: map["status"], + ip_address: map["ip_address"], + user_agent: map["user_agent"], + user_id: map["user_id"], + email: map["email"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "type" => struct.type, + "status" => struct.status, + "ip_address" => struct.ip_address, + "user_agent" => struct.user_agent, + "user_id" => struct.user_id, + "email" => struct.email + }) + end +end diff --git a/lib/workos/authentication_mfa_failed.ex b/lib/workos/authentication_mfa_failed.ex new file mode 100644 index 00000000..3259493f --- /dev/null +++ b/lib/workos/authentication_mfa_failed.ex @@ -0,0 +1,52 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthenticationMFAFailed do + @moduledoc """ + AuthenticationMFAFailed model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.AuthenticationMFAFailedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.AuthenticationMFAFailedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => + WorkOS.Cast.dump_struct(struct.data, &WorkOS.AuthenticationMFAFailedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/authentication_mfa_failed_data.ex b/lib/workos/authentication_mfa_failed_data.ex new file mode 100644 index 00000000..f4ae5506 --- /dev/null +++ b/lib/workos/authentication_mfa_failed_data.ex @@ -0,0 +1,56 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthenticationMFAFailedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :type, + :status, + :ip_address, + :user_agent, + :user_id, + :email, + :error + ] + + @type t :: %__MODULE__{ + type: String.t(), + status: String.t(), + ip_address: String.t() | nil, + user_agent: String.t() | nil, + user_id: String.t() | nil, + email: String.t() | nil, + error: WorkOS.AuthenticationMFAFailedDataError.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + type: map["type"], + status: map["status"], + ip_address: map["ip_address"], + user_agent: map["user_agent"], + user_id: map["user_id"], + email: map["email"], + error: WorkOS.Cast.nested(map["error"], &WorkOS.AuthenticationMFAFailedDataError.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "type" => struct.type, + "status" => struct.status, + "ip_address" => struct.ip_address, + "user_agent" => struct.user_agent, + "user_id" => struct.user_id, + "email" => struct.email, + "error" => + WorkOS.Cast.dump_struct(struct.error, &WorkOS.AuthenticationMFAFailedDataError.to_map/1) + }) + end +end diff --git a/lib/workos/authentication_mfa_failed_data_error.ex b/lib/workos/authentication_mfa_failed_data_error.ex new file mode 100644 index 00000000..315b78eb --- /dev/null +++ b/lib/workos/authentication_mfa_failed_data_error.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthenticationMFAFailedDataError do + @moduledoc """ + Details about the authentication error. + """ + + defstruct [ + :code, + :message + ] + + @type t :: %__MODULE__{ + code: String.t(), + message: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + code: map["code"], + message: map["message"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "code" => struct.code, + "message" => struct.message + }) + end +end diff --git a/lib/workos/authentication_mfa_succeeded.ex b/lib/workos/authentication_mfa_succeeded.ex new file mode 100644 index 00000000..a625b506 --- /dev/null +++ b/lib/workos/authentication_mfa_succeeded.ex @@ -0,0 +1,52 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthenticationMFASucceeded do + @moduledoc """ + AuthenticationMFASucceeded model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.AuthenticationMFASucceededData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.AuthenticationMFASucceededData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => + WorkOS.Cast.dump_struct(struct.data, &WorkOS.AuthenticationMFASucceededData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/authentication_mfa_succeeded_data.ex b/lib/workos/authentication_mfa_succeeded_data.ex new file mode 100644 index 00000000..d316265a --- /dev/null +++ b/lib/workos/authentication_mfa_succeeded_data.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthenticationMFASucceededData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :type, + :status, + :ip_address, + :user_agent, + :user_id, + :email + ] + + @type t :: %__MODULE__{ + type: String.t(), + status: String.t(), + ip_address: String.t() | nil, + user_agent: String.t() | nil, + user_id: String.t(), + email: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + type: map["type"], + status: map["status"], + ip_address: map["ip_address"], + user_agent: map["user_agent"], + user_id: map["user_id"], + email: map["email"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "type" => struct.type, + "status" => struct.status, + "ip_address" => struct.ip_address, + "user_agent" => struct.user_agent, + "user_id" => struct.user_id, + "email" => struct.email + }) + end +end diff --git a/lib/workos/authentication_oauth_failed.ex b/lib/workos/authentication_oauth_failed.ex new file mode 100644 index 00000000..a0ec3e93 --- /dev/null +++ b/lib/workos/authentication_oauth_failed.ex @@ -0,0 +1,52 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthenticationOAuthFailed do + @moduledoc """ + AuthenticationOAuthFailed model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.AuthenticationOAuthFailedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.AuthenticationOAuthFailedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => + WorkOS.Cast.dump_struct(struct.data, &WorkOS.AuthenticationOAuthFailedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/authentication_oauth_failed_data.ex b/lib/workos/authentication_oauth_failed_data.ex new file mode 100644 index 00000000..24ac50d6 --- /dev/null +++ b/lib/workos/authentication_oauth_failed_data.ex @@ -0,0 +1,57 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthenticationOAuthFailedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :type, + :status, + :ip_address, + :user_agent, + :user_id, + :email, + :error + ] + + @type t :: %__MODULE__{ + type: String.t(), + status: String.t(), + ip_address: String.t() | nil, + user_agent: String.t() | nil, + user_id: String.t() | nil, + email: String.t() | nil, + error: WorkOS.AuthenticationOAuthFailedDataError.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + type: map["type"], + status: map["status"], + ip_address: map["ip_address"], + user_agent: map["user_agent"], + user_id: map["user_id"], + email: map["email"], + error: + WorkOS.Cast.nested(map["error"], &WorkOS.AuthenticationOAuthFailedDataError.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "type" => struct.type, + "status" => struct.status, + "ip_address" => struct.ip_address, + "user_agent" => struct.user_agent, + "user_id" => struct.user_id, + "email" => struct.email, + "error" => + WorkOS.Cast.dump_struct(struct.error, &WorkOS.AuthenticationOAuthFailedDataError.to_map/1) + }) + end +end diff --git a/lib/workos/authentication_oauth_failed_data_error.ex b/lib/workos/authentication_oauth_failed_data_error.ex new file mode 100644 index 00000000..4ed30f8d --- /dev/null +++ b/lib/workos/authentication_oauth_failed_data_error.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthenticationOAuthFailedDataError do + @moduledoc """ + Details about the authentication error. + """ + + defstruct [ + :code, + :message + ] + + @type t :: %__MODULE__{ + code: String.t(), + message: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + code: map["code"], + message: map["message"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "code" => struct.code, + "message" => struct.message + }) + end +end diff --git a/lib/workos/authentication_oauth_succeeded.ex b/lib/workos/authentication_oauth_succeeded.ex new file mode 100644 index 00000000..cee1bcb2 --- /dev/null +++ b/lib/workos/authentication_oauth_succeeded.ex @@ -0,0 +1,52 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthenticationOAuthSucceeded do + @moduledoc """ + AuthenticationOAuthSucceeded model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.AuthenticationOAuthSucceededData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.AuthenticationOAuthSucceededData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => + WorkOS.Cast.dump_struct(struct.data, &WorkOS.AuthenticationOAuthSucceededData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/authentication_oauth_succeeded_data.ex b/lib/workos/authentication_oauth_succeeded_data.ex new file mode 100644 index 00000000..80b60d97 --- /dev/null +++ b/lib/workos/authentication_oauth_succeeded_data.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthenticationOAuthSucceededData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :type, + :status, + :ip_address, + :user_agent, + :user_id, + :email + ] + + @type t :: %__MODULE__{ + type: String.t(), + status: String.t(), + ip_address: String.t() | nil, + user_agent: String.t() | nil, + user_id: String.t() | nil, + email: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + type: map["type"], + status: map["status"], + ip_address: map["ip_address"], + user_agent: map["user_agent"], + user_id: map["user_id"], + email: map["email"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "type" => struct.type, + "status" => struct.status, + "ip_address" => struct.ip_address, + "user_agent" => struct.user_agent, + "user_id" => struct.user_id, + "email" => struct.email + }) + end +end diff --git a/lib/workos/authentication_passkey_failed.ex b/lib/workos/authentication_passkey_failed.ex new file mode 100644 index 00000000..4b98dfab --- /dev/null +++ b/lib/workos/authentication_passkey_failed.ex @@ -0,0 +1,52 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthenticationPasskeyFailed do + @moduledoc """ + AuthenticationPasskeyFailed model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.AuthenticationPasskeyFailedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.AuthenticationPasskeyFailedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => + WorkOS.Cast.dump_struct(struct.data, &WorkOS.AuthenticationPasskeyFailedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/authentication_passkey_failed_data.ex b/lib/workos/authentication_passkey_failed_data.ex new file mode 100644 index 00000000..4415beb7 --- /dev/null +++ b/lib/workos/authentication_passkey_failed_data.ex @@ -0,0 +1,60 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthenticationPasskeyFailedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :type, + :status, + :ip_address, + :user_agent, + :user_id, + :email, + :error + ] + + @type t :: %__MODULE__{ + type: String.t(), + status: String.t(), + ip_address: String.t() | nil, + user_agent: String.t() | nil, + user_id: String.t() | nil, + email: String.t() | nil, + error: WorkOS.AuthenticationPasskeyFailedDataError.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + type: map["type"], + status: map["status"], + ip_address: map["ip_address"], + user_agent: map["user_agent"], + user_id: map["user_id"], + email: map["email"], + error: + WorkOS.Cast.nested(map["error"], &WorkOS.AuthenticationPasskeyFailedDataError.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "type" => struct.type, + "status" => struct.status, + "ip_address" => struct.ip_address, + "user_agent" => struct.user_agent, + "user_id" => struct.user_id, + "email" => struct.email, + "error" => + WorkOS.Cast.dump_struct( + struct.error, + &WorkOS.AuthenticationPasskeyFailedDataError.to_map/1 + ) + }) + end +end diff --git a/lib/workos/authentication_passkey_failed_data_error.ex b/lib/workos/authentication_passkey_failed_data_error.ex new file mode 100644 index 00000000..0937b7a2 --- /dev/null +++ b/lib/workos/authentication_passkey_failed_data_error.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthenticationPasskeyFailedDataError do + @moduledoc """ + Details about the authentication error. + """ + + defstruct [ + :code, + :message + ] + + @type t :: %__MODULE__{ + code: String.t(), + message: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + code: map["code"], + message: map["message"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "code" => struct.code, + "message" => struct.message + }) + end +end diff --git a/lib/workos/authentication_passkey_succeeded.ex b/lib/workos/authentication_passkey_succeeded.ex new file mode 100644 index 00000000..660dc8ef --- /dev/null +++ b/lib/workos/authentication_passkey_succeeded.ex @@ -0,0 +1,53 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthenticationPasskeySucceeded do + @moduledoc """ + AuthenticationPasskeySucceeded model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.AuthenticationPasskeySucceededData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: + WorkOS.Cast.nested(map["data"], &WorkOS.AuthenticationPasskeySucceededData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => + WorkOS.Cast.dump_struct(struct.data, &WorkOS.AuthenticationPasskeySucceededData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/authentication_passkey_succeeded_data.ex b/lib/workos/authentication_passkey_succeeded_data.ex new file mode 100644 index 00000000..89192ab4 --- /dev/null +++ b/lib/workos/authentication_passkey_succeeded_data.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthenticationPasskeySucceededData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :type, + :status, + :ip_address, + :user_agent, + :user_id, + :email + ] + + @type t :: %__MODULE__{ + type: String.t(), + status: String.t(), + ip_address: String.t() | nil, + user_agent: String.t() | nil, + user_id: String.t(), + email: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + type: map["type"], + status: map["status"], + ip_address: map["ip_address"], + user_agent: map["user_agent"], + user_id: map["user_id"], + email: map["email"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "type" => struct.type, + "status" => struct.status, + "ip_address" => struct.ip_address, + "user_agent" => struct.user_agent, + "user_id" => struct.user_id, + "email" => struct.email + }) + end +end diff --git a/lib/workos/authentication_password_failed.ex b/lib/workos/authentication_password_failed.ex new file mode 100644 index 00000000..9e58baba --- /dev/null +++ b/lib/workos/authentication_password_failed.ex @@ -0,0 +1,52 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthenticationPasswordFailed do + @moduledoc """ + AuthenticationPasswordFailed model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.AuthenticationPasswordFailedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.AuthenticationPasswordFailedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => + WorkOS.Cast.dump_struct(struct.data, &WorkOS.AuthenticationPasswordFailedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/authentication_password_failed_data.ex b/lib/workos/authentication_password_failed_data.ex new file mode 100644 index 00000000..4739c1a7 --- /dev/null +++ b/lib/workos/authentication_password_failed_data.ex @@ -0,0 +1,60 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthenticationPasswordFailedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :type, + :status, + :ip_address, + :user_agent, + :user_id, + :email, + :error + ] + + @type t :: %__MODULE__{ + type: String.t(), + status: String.t(), + ip_address: String.t() | nil, + user_agent: String.t() | nil, + user_id: String.t() | nil, + email: String.t() | nil, + error: WorkOS.AuthenticationPasswordFailedDataError.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + type: map["type"], + status: map["status"], + ip_address: map["ip_address"], + user_agent: map["user_agent"], + user_id: map["user_id"], + email: map["email"], + error: + WorkOS.Cast.nested(map["error"], &WorkOS.AuthenticationPasswordFailedDataError.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "type" => struct.type, + "status" => struct.status, + "ip_address" => struct.ip_address, + "user_agent" => struct.user_agent, + "user_id" => struct.user_id, + "email" => struct.email, + "error" => + WorkOS.Cast.dump_struct( + struct.error, + &WorkOS.AuthenticationPasswordFailedDataError.to_map/1 + ) + }) + end +end diff --git a/lib/workos/authentication_password_failed_data_error.ex b/lib/workos/authentication_password_failed_data_error.ex new file mode 100644 index 00000000..15dbb6c1 --- /dev/null +++ b/lib/workos/authentication_password_failed_data_error.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthenticationPasswordFailedDataError do + @moduledoc """ + Details about the authentication error. + """ + + defstruct [ + :code, + :message + ] + + @type t :: %__MODULE__{ + code: String.t(), + message: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + code: map["code"], + message: map["message"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "code" => struct.code, + "message" => struct.message + }) + end +end diff --git a/lib/workos/authentication_password_succeeded.ex b/lib/workos/authentication_password_succeeded.ex new file mode 100644 index 00000000..241dce3b --- /dev/null +++ b/lib/workos/authentication_password_succeeded.ex @@ -0,0 +1,53 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthenticationPasswordSucceeded do + @moduledoc """ + AuthenticationPasswordSucceeded model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.AuthenticationPasswordSucceededData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: + WorkOS.Cast.nested(map["data"], &WorkOS.AuthenticationPasswordSucceededData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => + WorkOS.Cast.dump_struct(struct.data, &WorkOS.AuthenticationPasswordSucceededData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/authentication_password_succeeded_data.ex b/lib/workos/authentication_password_succeeded_data.ex new file mode 100644 index 00000000..5e02d262 --- /dev/null +++ b/lib/workos/authentication_password_succeeded_data.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthenticationPasswordSucceededData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :type, + :status, + :ip_address, + :user_agent, + :user_id, + :email + ] + + @type t :: %__MODULE__{ + type: String.t(), + status: String.t(), + ip_address: String.t() | nil, + user_agent: String.t() | nil, + user_id: String.t(), + email: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + type: map["type"], + status: map["status"], + ip_address: map["ip_address"], + user_agent: map["user_agent"], + user_id: map["user_id"], + email: map["email"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "type" => struct.type, + "status" => struct.status, + "ip_address" => struct.ip_address, + "user_agent" => struct.user_agent, + "user_id" => struct.user_id, + "email" => struct.email + }) + end +end diff --git a/lib/workos/authentication_radar_risk_detected.ex b/lib/workos/authentication_radar_risk_detected.ex new file mode 100644 index 00000000..a9edf061 --- /dev/null +++ b/lib/workos/authentication_radar_risk_detected.ex @@ -0,0 +1,53 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthenticationRadarRiskDetected do + @moduledoc """ + AuthenticationRadarRiskDetected model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.AuthenticationRadarRiskDetectedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: + WorkOS.Cast.nested(map["data"], &WorkOS.AuthenticationRadarRiskDetectedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => + WorkOS.Cast.dump_struct(struct.data, &WorkOS.AuthenticationRadarRiskDetectedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/authentication_radar_risk_detected_data.ex b/lib/workos/authentication_radar_risk_detected_data.ex new file mode 100644 index 00000000..e9fde5dd --- /dev/null +++ b/lib/workos/authentication_radar_risk_detected_data.ex @@ -0,0 +1,61 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthenticationRadarRiskDetectedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :auth_method, + :action, + :control, + :blocklist_type, + :ip_address, + :user_agent, + :user_id, + :email + ] + + @type t :: %__MODULE__{ + auth_method: String.t(), + action: WorkOS.AuthenticationRadarRiskDetectedDataAction.t(), + control: String.t() | nil, + blocklist_type: String.t() | nil, + ip_address: String.t() | nil, + user_agent: String.t() | nil, + user_id: String.t(), + email: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + auth_method: map["auth_method"], + action: + WorkOS.Cast.enum(map["action"], &WorkOS.AuthenticationRadarRiskDetectedDataAction.cast/1), + control: map["control"], + blocklist_type: map["blocklist_type"], + ip_address: map["ip_address"], + user_agent: map["user_agent"], + user_id: map["user_id"], + email: map["email"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "auth_method" => struct.auth_method, + "action" => + WorkOS.Cast.enum(struct.action, &WorkOS.AuthenticationRadarRiskDetectedDataAction.dump/1), + "control" => struct.control, + "blocklist_type" => struct.blocklist_type, + "ip_address" => struct.ip_address, + "user_agent" => struct.user_agent, + "user_id" => struct.user_id, + "email" => struct.email + }) + end +end diff --git a/lib/workos/authentication_radar_risk_detected_data_action.ex b/lib/workos/authentication_radar_risk_detected_data_action.ex new file mode 100644 index 00000000..beaa589a --- /dev/null +++ b/lib/workos/authentication_radar_risk_detected_data_action.ex @@ -0,0 +1,25 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthenticationRadarRiskDetectedDataAction do + @moduledoc """ + AuthenticationRadarRiskDetectedDataAction enum. + """ + + @type t :: :signup | :login + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:signup, :login] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("signup"), do: :signup + def cast("login"), do: :login + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:signup), do: "signup" + def dump(:login), do: "login" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/authentication_reauthentication_succeeded.ex b/lib/workos/authentication_reauthentication_succeeded.ex new file mode 100644 index 00000000..89b208f2 --- /dev/null +++ b/lib/workos/authentication_reauthentication_succeeded.ex @@ -0,0 +1,59 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthenticationReauthenticationSucceeded do + @moduledoc """ + AuthenticationReauthenticationSucceeded model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.AuthenticationReauthenticationSucceededData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: + WorkOS.Cast.nested( + map["data"], + &WorkOS.AuthenticationReauthenticationSucceededData.from_map/1 + ), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => + WorkOS.Cast.dump_struct( + struct.data, + &WorkOS.AuthenticationReauthenticationSucceededData.to_map/1 + ), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/authentication_reauthentication_succeeded_data.ex b/lib/workos/authentication_reauthentication_succeeded_data.ex new file mode 100644 index 00000000..808e6d5f --- /dev/null +++ b/lib/workos/authentication_reauthentication_succeeded_data.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthenticationReauthenticationSucceededData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :type, + :status, + :ip_address, + :user_agent, + :user_id, + :email + ] + + @type t :: %__MODULE__{ + type: String.t(), + status: String.t(), + ip_address: String.t() | nil, + user_agent: String.t() | nil, + user_id: String.t(), + email: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + type: map["type"], + status: map["status"], + ip_address: map["ip_address"], + user_agent: map["user_agent"], + user_id: map["user_id"], + email: map["email"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "type" => struct.type, + "status" => struct.status, + "ip_address" => struct.ip_address, + "user_agent" => struct.user_agent, + "user_id" => struct.user_id, + "email" => struct.email + }) + end +end diff --git a/lib/workos/authentication_sso_failed.ex b/lib/workos/authentication_sso_failed.ex new file mode 100644 index 00000000..ee315021 --- /dev/null +++ b/lib/workos/authentication_sso_failed.ex @@ -0,0 +1,52 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthenticationSSOFailed do + @moduledoc """ + AuthenticationSSOFailed model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.AuthenticationSSOFailedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.AuthenticationSSOFailedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => + WorkOS.Cast.dump_struct(struct.data, &WorkOS.AuthenticationSSOFailedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/authentication_sso_failed_data.ex b/lib/workos/authentication_sso_failed_data.ex new file mode 100644 index 00000000..d444777a --- /dev/null +++ b/lib/workos/authentication_sso_failed_data.ex @@ -0,0 +1,61 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthenticationSSOFailedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :type, + :status, + :ip_address, + :user_agent, + :user_id, + :email, + :sso, + :error + ] + + @type t :: %__MODULE__{ + type: String.t(), + status: String.t(), + ip_address: String.t() | nil, + user_agent: String.t() | nil, + user_id: String.t() | nil, + email: String.t() | nil, + sso: WorkOS.AuthenticationSSOFailedDataSSO.t(), + error: WorkOS.AuthenticationSSOFailedDataError.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + type: map["type"], + status: map["status"], + ip_address: map["ip_address"], + user_agent: map["user_agent"], + user_id: map["user_id"], + email: map["email"], + sso: WorkOS.Cast.nested(map["sso"], &WorkOS.AuthenticationSSOFailedDataSSO.from_map/1), + error: WorkOS.Cast.nested(map["error"], &WorkOS.AuthenticationSSOFailedDataError.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "type" => struct.type, + "status" => struct.status, + "ip_address" => struct.ip_address, + "user_agent" => struct.user_agent, + "user_id" => struct.user_id, + "email" => struct.email, + "sso" => + WorkOS.Cast.dump_struct(struct.sso, &WorkOS.AuthenticationSSOFailedDataSSO.to_map/1), + "error" => + WorkOS.Cast.dump_struct(struct.error, &WorkOS.AuthenticationSSOFailedDataError.to_map/1) + }) + end +end diff --git a/lib/workos/authentication_sso_failed_data_error.ex b/lib/workos/authentication_sso_failed_data_error.ex new file mode 100644 index 00000000..376103bd --- /dev/null +++ b/lib/workos/authentication_sso_failed_data_error.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthenticationSSOFailedDataError do + @moduledoc """ + Details about the authentication error. + """ + + defstruct [ + :code, + :message + ] + + @type t :: %__MODULE__{ + code: String.t(), + message: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + code: map["code"], + message: map["message"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "code" => struct.code, + "message" => struct.message + }) + end +end diff --git a/lib/workos/authentication_sso_failed_data_sso.ex b/lib/workos/authentication_sso_failed_data_sso.ex new file mode 100644 index 00000000..d142fe49 --- /dev/null +++ b/lib/workos/authentication_sso_failed_data_sso.ex @@ -0,0 +1,39 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthenticationSSOFailedDataSSO do + @moduledoc """ + SSO connection details. + """ + + defstruct [ + :organization_id, + :connection_id, + :session_id + ] + + @type t :: %__MODULE__{ + organization_id: String.t() | nil, + connection_id: String.t() | nil, + session_id: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + organization_id: map["organization_id"], + connection_id: map["connection_id"], + session_id: map["session_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "organization_id" => struct.organization_id, + "connection_id" => struct.connection_id, + "session_id" => struct.session_id + }) + end +end diff --git a/lib/workos/authentication_sso_started.ex b/lib/workos/authentication_sso_started.ex new file mode 100644 index 00000000..38634d1e --- /dev/null +++ b/lib/workos/authentication_sso_started.ex @@ -0,0 +1,52 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthenticationSSOStarted do + @moduledoc """ + AuthenticationSSOStarted model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.AuthenticationSSOStartedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.AuthenticationSSOStartedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => + WorkOS.Cast.dump_struct(struct.data, &WorkOS.AuthenticationSSOStartedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/authentication_sso_started_data.ex b/lib/workos/authentication_sso_started_data.ex new file mode 100644 index 00000000..4391af85 --- /dev/null +++ b/lib/workos/authentication_sso_started_data.ex @@ -0,0 +1,56 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthenticationSSOStartedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :type, + :status, + :ip_address, + :user_agent, + :user_id, + :email, + :sso + ] + + @type t :: %__MODULE__{ + type: String.t(), + status: String.t(), + ip_address: String.t() | nil, + user_agent: String.t() | nil, + user_id: String.t() | nil, + email: String.t() | nil, + sso: WorkOS.AuthenticationSSOStartedDataSSO.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + type: map["type"], + status: map["status"], + ip_address: map["ip_address"], + user_agent: map["user_agent"], + user_id: map["user_id"], + email: map["email"], + sso: WorkOS.Cast.nested(map["sso"], &WorkOS.AuthenticationSSOStartedDataSSO.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "type" => struct.type, + "status" => struct.status, + "ip_address" => struct.ip_address, + "user_agent" => struct.user_agent, + "user_id" => struct.user_id, + "email" => struct.email, + "sso" => + WorkOS.Cast.dump_struct(struct.sso, &WorkOS.AuthenticationSSOStartedDataSSO.to_map/1) + }) + end +end diff --git a/lib/workos/authentication_sso_started_data_sso.ex b/lib/workos/authentication_sso_started_data_sso.ex new file mode 100644 index 00000000..5a91e987 --- /dev/null +++ b/lib/workos/authentication_sso_started_data_sso.ex @@ -0,0 +1,39 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthenticationSSOStartedDataSSO do + @moduledoc """ + SSO connection details. + """ + + defstruct [ + :organization_id, + :connection_id, + :session_id + ] + + @type t :: %__MODULE__{ + organization_id: String.t() | nil, + connection_id: String.t() | nil, + session_id: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + organization_id: map["organization_id"], + connection_id: map["connection_id"], + session_id: map["session_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "organization_id" => struct.organization_id, + "connection_id" => struct.connection_id, + "session_id" => struct.session_id + }) + end +end diff --git a/lib/workos/authentication_sso_succeeded.ex b/lib/workos/authentication_sso_succeeded.ex new file mode 100644 index 00000000..6a9f3b3a --- /dev/null +++ b/lib/workos/authentication_sso_succeeded.ex @@ -0,0 +1,52 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthenticationSSOSucceeded do + @moduledoc """ + AuthenticationSSOSucceeded model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.AuthenticationSSOSucceededData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.AuthenticationSSOSucceededData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => + WorkOS.Cast.dump_struct(struct.data, &WorkOS.AuthenticationSSOSucceededData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/authentication_sso_succeeded_data.ex b/lib/workos/authentication_sso_succeeded_data.ex new file mode 100644 index 00000000..995cd44f --- /dev/null +++ b/lib/workos/authentication_sso_succeeded_data.ex @@ -0,0 +1,56 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthenticationSSOSucceededData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :type, + :status, + :ip_address, + :user_agent, + :user_id, + :email, + :sso + ] + + @type t :: %__MODULE__{ + type: String.t(), + status: String.t(), + ip_address: String.t() | nil, + user_agent: String.t() | nil, + user_id: String.t() | nil, + email: String.t(), + sso: WorkOS.AuthenticationSSOSucceededDataSSO.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + type: map["type"], + status: map["status"], + ip_address: map["ip_address"], + user_agent: map["user_agent"], + user_id: map["user_id"], + email: map["email"], + sso: WorkOS.Cast.nested(map["sso"], &WorkOS.AuthenticationSSOSucceededDataSSO.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "type" => struct.type, + "status" => struct.status, + "ip_address" => struct.ip_address, + "user_agent" => struct.user_agent, + "user_id" => struct.user_id, + "email" => struct.email, + "sso" => + WorkOS.Cast.dump_struct(struct.sso, &WorkOS.AuthenticationSSOSucceededDataSSO.to_map/1) + }) + end +end diff --git a/lib/workos/authentication_sso_succeeded_data_sso.ex b/lib/workos/authentication_sso_succeeded_data_sso.ex new file mode 100644 index 00000000..6543f226 --- /dev/null +++ b/lib/workos/authentication_sso_succeeded_data_sso.ex @@ -0,0 +1,39 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthenticationSSOSucceededDataSSO do + @moduledoc """ + SSO connection details. + """ + + defstruct [ + :organization_id, + :connection_id, + :session_id + ] + + @type t :: %__MODULE__{ + organization_id: String.t() | nil, + connection_id: String.t() | nil, + session_id: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + organization_id: map["organization_id"], + connection_id: map["connection_id"], + session_id: map["session_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "organization_id" => struct.organization_id, + "connection_id" => struct.connection_id, + "session_id" => struct.session_id + }) + end +end diff --git a/lib/workos/authentication_sso_timed_out.ex b/lib/workos/authentication_sso_timed_out.ex new file mode 100644 index 00000000..17d38bb7 --- /dev/null +++ b/lib/workos/authentication_sso_timed_out.ex @@ -0,0 +1,52 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthenticationSSOTimedOut do + @moduledoc """ + AuthenticationSSOTimedOut model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.AuthenticationSSOTimedOutData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.AuthenticationSSOTimedOutData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => + WorkOS.Cast.dump_struct(struct.data, &WorkOS.AuthenticationSSOTimedOutData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/authentication_sso_timed_out_data.ex b/lib/workos/authentication_sso_timed_out_data.ex new file mode 100644 index 00000000..f8394c73 --- /dev/null +++ b/lib/workos/authentication_sso_timed_out_data.ex @@ -0,0 +1,62 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthenticationSSOTimedOutData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :type, + :status, + :ip_address, + :user_agent, + :user_id, + :email, + :sso, + :error + ] + + @type t :: %__MODULE__{ + type: String.t(), + status: String.t(), + ip_address: String.t() | nil, + user_agent: String.t() | nil, + user_id: String.t() | nil, + email: String.t() | nil, + sso: WorkOS.AuthenticationSSOTimedOutDataSSO.t(), + error: WorkOS.AuthenticationSSOTimedOutDataError.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + type: map["type"], + status: map["status"], + ip_address: map["ip_address"], + user_agent: map["user_agent"], + user_id: map["user_id"], + email: map["email"], + sso: WorkOS.Cast.nested(map["sso"], &WorkOS.AuthenticationSSOTimedOutDataSSO.from_map/1), + error: + WorkOS.Cast.nested(map["error"], &WorkOS.AuthenticationSSOTimedOutDataError.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "type" => struct.type, + "status" => struct.status, + "ip_address" => struct.ip_address, + "user_agent" => struct.user_agent, + "user_id" => struct.user_id, + "email" => struct.email, + "sso" => + WorkOS.Cast.dump_struct(struct.sso, &WorkOS.AuthenticationSSOTimedOutDataSSO.to_map/1), + "error" => + WorkOS.Cast.dump_struct(struct.error, &WorkOS.AuthenticationSSOTimedOutDataError.to_map/1) + }) + end +end diff --git a/lib/workos/authentication_sso_timed_out_data_error.ex b/lib/workos/authentication_sso_timed_out_data_error.ex new file mode 100644 index 00000000..b76899a6 --- /dev/null +++ b/lib/workos/authentication_sso_timed_out_data_error.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthenticationSSOTimedOutDataError do + @moduledoc """ + Details about the authentication error. + """ + + defstruct [ + :code, + :message + ] + + @type t :: %__MODULE__{ + code: String.t(), + message: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + code: map["code"], + message: map["message"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "code" => struct.code, + "message" => struct.message + }) + end +end diff --git a/lib/workos/authentication_sso_timed_out_data_sso.ex b/lib/workos/authentication_sso_timed_out_data_sso.ex new file mode 100644 index 00000000..15e871e0 --- /dev/null +++ b/lib/workos/authentication_sso_timed_out_data_sso.ex @@ -0,0 +1,39 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthenticationSSOTimedOutDataSSO do + @moduledoc """ + SSO connection details. + """ + + defstruct [ + :organization_id, + :connection_id, + :session_id + ] + + @type t :: %__MODULE__{ + organization_id: String.t() | nil, + connection_id: String.t() | nil, + session_id: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + organization_id: map["organization_id"], + connection_id: map["connection_id"], + session_id: map["session_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "organization_id" => struct.organization_id, + "connection_id" => struct.connection_id, + "session_id" => struct.session_id + }) + end +end diff --git a/lib/workos/authkit.ex b/lib/workos/authkit.ex new file mode 100644 index 00000000..fd0cd3d1 --- /dev/null +++ b/lib/workos/authkit.ex @@ -0,0 +1,133 @@ +# @oagen-ignore-file — hand-maintained; higher-level AuthKit flow helpers. + +defmodule WorkOS.AuthKit do + @moduledoc """ + Higher-level AuthKit authentication flow helpers. + + Layered on top of `WorkOS.UserManagement`: + + * `get_authorization_url/2` — build an AuthKit authorization URL + * `get_pkce_authorization_url/2` — same, with PKCE and state generated + automatically + * `pkce_code_exchange/3` — exchange an authorization code with a PKCE + code verifier + * `start_device_authorization/3` and `poll_device_code/3` — the OAuth 2.0 + device authorization flow (RFC 8628) + """ + + @default_poll_interval_seconds 5 + + @typedoc "Result of `get_pkce_authorization_url/2`." + @type pkce_authorization_url :: %{ + url: String.t(), + code_verifier: String.t(), + state: String.t() + } + + @doc """ + Builds an AuthKit authorization URL. See + `WorkOS.UserManagement.get_authorization_url/2` for the supported params. + """ + @spec get_authorization_url(WorkOS.Client.t(), map()) :: String.t() + def get_authorization_url(client, params \\ %{}) do + WorkOS.UserManagement.get_authorization_url(client, params) + end + + @doc """ + Builds an AuthKit authorization URL with automatically generated PKCE + parameters, plus a random `state` unless one is passed in `params`. + + Store `code_verifier` securely — it is required for the token exchange. + """ + @spec get_pkce_authorization_url(WorkOS.Client.t(), map()) :: pkce_authorization_url() + def get_pkce_authorization_url(client, params \\ %{}) do + {params, pair, state} = put_pkce_and_state(params) + %{url: get_authorization_url(client, params), code_verifier: pair.code_verifier, state: state} + end + + @doc """ + Exchanges an authorization code using a PKCE code verifier + (public-client flow). + + ## Parameters + + * `params` — map with `:code` and `:code_verifier` + """ + @spec pkce_code_exchange(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.AuthenticateResponse.t()} | {:error, WorkOS.Error.error()} + def pkce_code_exchange(client, params, opts \\ []) do + WorkOS.UserManagement.authenticate_with_code(client, params, opts) + end + + @doc """ + Initiates a device authorization flow, returning the device/user codes and + verification URIs. + """ + @spec start_device_authorization(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.DeviceAuthorizationResponse.t()} | {:error, WorkOS.Error.error()} + def start_device_authorization(client, params \\ %{}, opts \\ []) do + params = WorkOS.Client.put_inferred(Map.new(params), "client_id", client.client_id) + WorkOS.UserManagement.create_device(client, params, opts) + end + + @doc """ + Polls the authenticate endpoint until the user completes device + authorization. + + Waits `:interval` seconds (default #{@default_poll_interval_seconds}, as + recommended by the device authorization response) between attempts while the + API reports `authorization_pending`. Options: + + * `:interval` — seconds between polls + * `:max_attempts` — give up after this many polls (default `:infinity`), + returning the last `authorization_pending` error + """ + @spec poll_device_code(WorkOS.Client.t(), String.t(), keyword()) :: + {:ok, WorkOS.AuthenticateResponse.t()} | {:error, WorkOS.Error.error()} + def poll_device_code(client, device_code, opts \\ []) do + interval = Keyword.get(opts, :interval, @default_poll_interval_seconds) + max_attempts = Keyword.get(opts, :max_attempts, :infinity) + request_opts = Keyword.drop(opts, [:interval, :max_attempts]) + + do_poll(client, device_code, interval, max_attempts, request_opts) + end + + defp do_poll(client, device_code, interval, attempts_left, request_opts) do + Process.sleep(interval * 1000) + + case WorkOS.UserManagement.authenticate_with_device_code( + client, + %{"device_code" => device_code}, + request_opts + ) do + {:error, %WorkOS.ApiError{code: "authorization_pending"} = error} -> + case attempts_left do + :infinity -> do_poll(client, device_code, interval, :infinity, request_opts) + n when n > 1 -> do_poll(client, device_code, interval, n - 1, request_opts) + _exhausted -> {:error, error} + end + + result -> + result + end + end + + @doc false + @spec put_pkce_and_state(map()) :: {map(), WorkOS.PKCE.pair(), String.t()} + def put_pkce_and_state(params) do + params = Map.new(params, fn {k, v} -> {to_string(k), v} end) + pair = WorkOS.PKCE.generate_pair() + + state = + params["state"] || Base.url_encode64(:crypto.strong_rand_bytes(32), padding: false) + + params = + Map.merge(params, %{ + "state" => state, + "code_challenge" => pair.code_challenge, + "code_challenge_method" => pair.code_challenge_method + }) + + {params, pair, state} + end +end diff --git a/lib/workos/authorization.ex b/lib/workos/authorization.ex new file mode 100644 index 00000000..f57f4a67 --- /dev/null +++ b/lib/workos/authorization.ex @@ -0,0 +1,1391 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.Authorization do + @moduledoc """ + Operations for the Authorization API. + """ + + @doc """ + List role assignments for a group + + List all role assignments granted to a group. Each assignment represents a role granted to the group on a resource. + + ## Parameters + + * `group_id` — The ID of the group. + * `params` — query parameters: `:before`, `:after_`, `:limit`, `:order` + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec list_group_role_assignments(WorkOS.Client.t(), String.t(), map(), keyword()) :: + {:ok, WorkOS.Page.t(WorkOS.GroupRoleAssignmentList.t())} + | {:error, WorkOS.Error.error()} + def list_group_role_assignments(client, group_id, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :get, + "/authorization/groups/#{URI.encode(group_id, &URI.char_unreserved?/1)}/role_assignments", + params, + opts + ) do + fetch_next = fn cursor -> + list_group_role_assignments( + client, + group_id, + WorkOS.Page.next_params(params, "after", cursor), + opts + ) + end + + {:ok, + WorkOS.Page.from_map(body, "data", &WorkOS.GroupRoleAssignmentList.from_map/1, fetch_next)} + end + end + + @doc """ + Assign a role to a group + + Assign a role to a group on a specific resource. + + ## Parameters + + * `group_id` — The ID of the group. + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec create_group_role_assignment(WorkOS.Client.t(), String.t(), map(), keyword()) :: + {:ok, WorkOS.GroupRoleAssignment.t()} | {:error, WorkOS.Error.error()} + def create_group_role_assignment(client, group_id, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :post, + "/authorization/groups/#{URI.encode(group_id, &URI.char_unreserved?/1)}/role_assignments", + params, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.GroupRoleAssignment.from_map/1)} + end + end + + @doc """ + Replace all role assignments for a group + + Replace all role assignments for a group with the provided list. Existing assignments not in the list will be removed. + + ## Parameters + + * `group_id` — The ID of the group. + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec update_group_role_assignments(WorkOS.Client.t(), String.t(), map(), keyword()) :: + {:ok, WorkOS.GroupRoleAssignmentList.t()} | {:error, WorkOS.Error.error()} + def update_group_role_assignments(client, group_id, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :put, + "/authorization/groups/#{URI.encode(group_id, &URI.char_unreserved?/1)}/role_assignments", + params, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.GroupRoleAssignmentList.from_map/1)} + end + end + + @doc """ + Remove group role assignments by criteria + + Remove role assignments from a group that match the provided criteria. Returns 404 when no matching active assignment is found. + + ## Parameters + + * `group_id` — The ID of the group. + * `params` — query parameters + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec delete_group_role_assignments(WorkOS.Client.t(), String.t(), map(), keyword()) :: + {:ok, term()} | {:error, WorkOS.Error.error()} + def delete_group_role_assignments(client, group_id, params \\ %{}, opts \\ []) do + WorkOS.Client.request( + client, + :delete, + "/authorization/groups/#{URI.encode(group_id, &URI.char_unreserved?/1)}/role_assignments", + params, + opts + ) + end + + @doc """ + Get a group role assignment + + Get a specific role assignment for a group by its ID. + + ## Parameters + + * `group_id` — The ID of the group. + * `role_assignment_id` — The ID of the group role assignment. + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec get_group_role_assignment(WorkOS.Client.t(), String.t(), String.t(), keyword()) :: + {:ok, WorkOS.GroupRoleAssignment.t()} | {:error, WorkOS.Error.error()} + def get_group_role_assignment(client, group_id, role_assignment_id, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :get, + "/authorization/groups/#{URI.encode(group_id, &URI.char_unreserved?/1)}/role_assignments/#{URI.encode(role_assignment_id, &URI.char_unreserved?/1)}", + %{}, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.GroupRoleAssignment.from_map/1)} + end + end + + @doc """ + Remove a group role assignment + + Remove a specific role assignment from a group by its ID. + + ## Parameters + + * `group_id` — The ID of the group. + * `role_assignment_id` — The ID of the group role assignment to remove. + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec delete_group_role_assignment(WorkOS.Client.t(), String.t(), String.t(), keyword()) :: + {:ok, term()} | {:error, WorkOS.Error.error()} + def delete_group_role_assignment(client, group_id, role_assignment_id, opts \\ []) do + WorkOS.Client.request( + client, + :delete, + "/authorization/groups/#{URI.encode(group_id, &URI.char_unreserved?/1)}/role_assignments/#{URI.encode(role_assignment_id, &URI.char_unreserved?/1)}", + %{}, + opts + ) + end + + @doc """ + Check authorization + + Check if an organization membership has a specific permission on a resource. Supports identification by resource_id OR by resource_external_id + resource_type_slug. + + ## Parameters + + * `organization_membership_id` — The ID of the organization membership to check. + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec check(WorkOS.Client.t(), String.t(), map(), keyword()) :: + {:ok, WorkOS.AuthorizationCheck.t()} | {:error, WorkOS.Error.error()} + def check(client, organization_membership_id, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :post, + "/authorization/organization_memberships/#{URI.encode(organization_membership_id, &URI.char_unreserved?/1)}/check", + params, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.AuthorizationCheck.from_map/1)} + end + end + + @doc """ + List resources for organization membership + + Returns all child resources of a parent resource where the organization membership has a specific permission. This is useful for resource discovery—answering "What projects can this user access in this workspace?" + + You must provide either `parent_resource_id` or both `parent_resource_external_id` and `parent_resource_type_slug` to identify the parent resource. + + ## Parameters + + * `organization_membership_id` — The ID of the organization membership. + * `params` — query parameters: `:before`, `:after_`, `:limit`, `:order`, `:permission_slug`, `:parent_resource_id`, `:parent_resource_type_slug`, `:parent_resource_external_id` + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec list_resources_for_membership(WorkOS.Client.t(), String.t(), map(), keyword()) :: + {:ok, WorkOS.Page.t(WorkOS.AuthorizationResourceList.t())} + | {:error, WorkOS.Error.error()} + def list_resources_for_membership(client, organization_membership_id, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :get, + "/authorization/organization_memberships/#{URI.encode(organization_membership_id, &URI.char_unreserved?/1)}/resources", + params, + opts + ) do + fetch_next = fn cursor -> + list_resources_for_membership( + client, + organization_membership_id, + WorkOS.Page.next_params(params, "after", cursor), + opts + ) + end + + {:ok, + WorkOS.Page.from_map( + body, + "data", + &WorkOS.AuthorizationResourceList.from_map/1, + fetch_next + )} + end + end + + @doc """ + List effective permissions for an organization membership on a resource + + Returns all permissions the organization membership effectively has on a resource, including permissions inherited through roles assigned to ancestor resources. + + ## Parameters + + * `organization_membership_id` — The ID of the organization membership. + * `resource_id` — The ID of the authorization resource. + * `params` — query parameters: `:before`, `:after_`, `:limit`, `:order` + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec list_effective_permissions(WorkOS.Client.t(), String.t(), String.t(), map(), keyword()) :: + {:ok, WorkOS.Page.t(WorkOS.AuthorizationPermissionList.t())} + | {:error, WorkOS.Error.error()} + def list_effective_permissions( + client, + organization_membership_id, + resource_id, + params \\ %{}, + opts \\ [] + ) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :get, + "/authorization/organization_memberships/#{URI.encode(organization_membership_id, &URI.char_unreserved?/1)}/resources/#{URI.encode(resource_id, &URI.char_unreserved?/1)}/permissions", + params, + opts + ) do + fetch_next = fn cursor -> + list_effective_permissions( + client, + organization_membership_id, + resource_id, + WorkOS.Page.next_params(params, "after", cursor), + opts + ) + end + + {:ok, + WorkOS.Page.from_map( + body, + "data", + &WorkOS.AuthorizationPermissionList.from_map/1, + fetch_next + )} + end + end + + @doc """ + List effective permissions for an organization membership on a resource by external ID + + Returns all permissions the organization membership effectively has on a resource identified by its external ID, including permissions inherited through roles assigned to ancestor resources. + + ## Parameters + + * `organization_membership_id` — The ID of the organization membership. + * `resource_type_slug` — The slug of the resource type. + * `external_id` — An identifier you provide to reference the resource in your system. + * `params` — query parameters: `:before`, `:after_`, `:limit`, `:order` + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec list_effective_permissions_by_external_id( + WorkOS.Client.t(), + String.t(), + String.t(), + String.t(), + map(), + keyword() + ) :: + {:ok, WorkOS.Page.t(WorkOS.AuthorizationPermissionList.t())} + | {:error, WorkOS.Error.error()} + def list_effective_permissions_by_external_id( + client, + organization_membership_id, + resource_type_slug, + external_id, + params \\ %{}, + opts \\ [] + ) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :get, + "/authorization/organization_memberships/#{URI.encode(organization_membership_id, &URI.char_unreserved?/1)}/resources/#{URI.encode(resource_type_slug, &URI.char_unreserved?/1)}/#{URI.encode(external_id, &URI.char_unreserved?/1)}/permissions", + params, + opts + ) do + fetch_next = fn cursor -> + list_effective_permissions_by_external_id( + client, + organization_membership_id, + resource_type_slug, + external_id, + WorkOS.Page.next_params(params, "after", cursor), + opts + ) + end + + {:ok, + WorkOS.Page.from_map( + body, + "data", + &WorkOS.AuthorizationPermissionList.from_map/1, + fetch_next + )} + end + end + + @doc """ + List role assignments + + List all role assignments for an organization membership. This returns all roles that have been assigned to the user on resources, including organization-level and sub-resource roles. + + ## Parameters + + * `organization_membership_id` — The ID of the organization membership. + * `params` — query parameters: `:before`, `:after_`, `:limit`, `:order`, `:resource_id`, `:resource_external_id`, `:resource_type_slug` + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec list_role_assignments(WorkOS.Client.t(), String.t(), map(), keyword()) :: + {:ok, WorkOS.Page.t(WorkOS.UserRoleAssignmentList.t())} | {:error, WorkOS.Error.error()} + def list_role_assignments(client, organization_membership_id, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :get, + "/authorization/organization_memberships/#{URI.encode(organization_membership_id, &URI.char_unreserved?/1)}/role_assignments", + params, + opts + ) do + fetch_next = fn cursor -> + list_role_assignments( + client, + organization_membership_id, + WorkOS.Page.next_params(params, "after", cursor), + opts + ) + end + + {:ok, + WorkOS.Page.from_map(body, "data", &WorkOS.UserRoleAssignmentList.from_map/1, fetch_next)} + end + end + + @doc """ + Assign a role + + Assign a role to an organization membership on a specific resource. + + ## Parameters + + * `organization_membership_id` — The ID of the organization membership. + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec assign_role(WorkOS.Client.t(), String.t(), map(), keyword()) :: + {:ok, WorkOS.UserRoleAssignment.t()} | {:error, WorkOS.Error.error()} + def assign_role(client, organization_membership_id, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :post, + "/authorization/organization_memberships/#{URI.encode(organization_membership_id, &URI.char_unreserved?/1)}/role_assignments", + params, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.UserRoleAssignment.from_map/1)} + end + end + + @doc """ + Remove a role assignment + + Remove a role assignment by role slug and resource. + + ## Parameters + + * `organization_membership_id` — The ID of the organization membership. + * `params` — query parameters + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec remove_role(WorkOS.Client.t(), String.t(), map(), keyword()) :: + {:ok, term()} | {:error, WorkOS.Error.error()} + def remove_role(client, organization_membership_id, params \\ %{}, opts \\ []) do + WorkOS.Client.request( + client, + :delete, + "/authorization/organization_memberships/#{URI.encode(organization_membership_id, &URI.char_unreserved?/1)}/role_assignments", + params, + opts + ) + end + + @doc """ + Remove a role assignment by ID + + Remove a role assignment using its ID. + + ## Parameters + + * `organization_membership_id` — The ID of the organization membership. + * `role_assignment_id` — The ID of the role assignment to remove. + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec remove_role_assignment(WorkOS.Client.t(), String.t(), String.t(), keyword()) :: + {:ok, term()} | {:error, WorkOS.Error.error()} + def remove_role_assignment(client, organization_membership_id, role_assignment_id, opts \\ []) do + WorkOS.Client.request( + client, + :delete, + "/authorization/organization_memberships/#{URI.encode(organization_membership_id, &URI.char_unreserved?/1)}/role_assignments/#{URI.encode(role_assignment_id, &URI.char_unreserved?/1)}", + %{}, + opts + ) + end + + @doc """ + List custom roles + + Get a list of all roles that apply to an organization. This includes both environment roles and custom roles, returned in priority order. + + ## Parameters + + * `organization_id` — The ID of the organization. + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec list_organization_roles(WorkOS.Client.t(), String.t(), keyword()) :: + {:ok, WorkOS.RoleList.t()} | {:error, WorkOS.Error.error()} + def list_organization_roles(client, organization_id, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :get, + "/authorization/organizations/#{URI.encode(organization_id, &URI.char_unreserved?/1)}/roles", + %{}, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.RoleList.from_map/1)} + end + end + + @doc """ + Create a custom role + + Create a new custom role for this organization. + + ## Parameters + + * `organization_id` — The ID of the organization. + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec create_organization_role(WorkOS.Client.t(), String.t(), map(), keyword()) :: + {:ok, WorkOS.Role.t()} | {:error, WorkOS.Error.error()} + def create_organization_role(client, organization_id, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :post, + "/authorization/organizations/#{URI.encode(organization_id, &URI.char_unreserved?/1)}/roles", + params, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.Role.from_map/1)} + end + end + + @doc """ + Get a custom role + + Retrieve a role that applies to an organization by its slug. This can return either an environment role or a custom role. + + ## Parameters + + * `organization_id` — The ID of the organization. + * `slug` — The slug of the role. + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec get_organization_role(WorkOS.Client.t(), String.t(), String.t(), keyword()) :: + {:ok, WorkOS.Role.t()} | {:error, WorkOS.Error.error()} + def get_organization_role(client, organization_id, slug, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :get, + "/authorization/organizations/#{URI.encode(organization_id, &URI.char_unreserved?/1)}/roles/#{URI.encode(slug, &URI.char_unreserved?/1)}", + %{}, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.Role.from_map/1)} + end + end + + @doc """ + Update a custom role + + Update an existing custom role. Only the fields provided in the request body will be updated. + + ## Parameters + + * `organization_id` — The ID of the organization. + * `slug` — The slug of the role. + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec update_organization_role(WorkOS.Client.t(), String.t(), String.t(), map(), keyword()) :: + {:ok, WorkOS.Role.t()} | {:error, WorkOS.Error.error()} + def update_organization_role(client, organization_id, slug, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :patch, + "/authorization/organizations/#{URI.encode(organization_id, &URI.char_unreserved?/1)}/roles/#{URI.encode(slug, &URI.char_unreserved?/1)}", + params, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.Role.from_map/1)} + end + end + + @doc """ + Delete a custom role + + Delete an existing custom role. + + ## Parameters + + * `organization_id` — The ID of the organization. + * `slug` — The slug of the role. + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec delete_organization_role(WorkOS.Client.t(), String.t(), String.t(), keyword()) :: + {:ok, term()} | {:error, WorkOS.Error.error()} + def delete_organization_role(client, organization_id, slug, opts \\ []) do + WorkOS.Client.request( + client, + :delete, + "/authorization/organizations/#{URI.encode(organization_id, &URI.char_unreserved?/1)}/roles/#{URI.encode(slug, &URI.char_unreserved?/1)}", + %{}, + opts + ) + end + + @doc """ + Add a permission to a custom role + + Add a single permission to a custom role. If the permission is already assigned to the role, this operation has no effect. + + ## Parameters + + * `organization_id` — The ID of the organization. + * `slug` — The slug of the role. + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec add_organization_role_permission( + WorkOS.Client.t(), + String.t(), + String.t(), + map(), + keyword() + ) :: + {:ok, WorkOS.Role.t()} | {:error, WorkOS.Error.error()} + def add_organization_role_permission(client, organization_id, slug, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :post, + "/authorization/organizations/#{URI.encode(organization_id, &URI.char_unreserved?/1)}/roles/#{URI.encode(slug, &URI.char_unreserved?/1)}/permissions", + params, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.Role.from_map/1)} + end + end + + @doc """ + Set permissions for a custom role + + Replace all permissions on a custom role with the provided list. + + ## Parameters + + * `organization_id` — The ID of the organization. + * `slug` — The slug of the role. + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec set_organization_role_permissions( + WorkOS.Client.t(), + String.t(), + String.t(), + map(), + keyword() + ) :: + {:ok, WorkOS.Role.t()} | {:error, WorkOS.Error.error()} + def set_organization_role_permissions(client, organization_id, slug, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :put, + "/authorization/organizations/#{URI.encode(organization_id, &URI.char_unreserved?/1)}/roles/#{URI.encode(slug, &URI.char_unreserved?/1)}/permissions", + params, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.Role.from_map/1)} + end + end + + @doc """ + Remove a permission from a custom role + + Remove a single permission from a custom role by its slug. + + ## Parameters + + * `organization_id` — The ID of the organization. + * `slug` — The slug of the role. + * `permission_slug` — The slug of the permission to remove. + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec remove_organization_role_permission( + WorkOS.Client.t(), + String.t(), + String.t(), + String.t(), + keyword() + ) :: + {:ok, WorkOS.Role.t()} | {:error, WorkOS.Error.error()} + def remove_organization_role_permission( + client, + organization_id, + slug, + permission_slug, + opts \\ [] + ) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :delete, + "/authorization/organizations/#{URI.encode(organization_id, &URI.char_unreserved?/1)}/roles/#{URI.encode(slug, &URI.char_unreserved?/1)}/permissions/#{URI.encode(permission_slug, &URI.char_unreserved?/1)}", + %{}, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.Role.from_map/1)} + end + end + + @doc """ + Get a resource by external ID + + Retrieve the details of an authorization resource by its external ID, organization, and resource type. This is useful when you only have the external ID from your system and need to fetch the full resource details. + + ## Parameters + + * `organization_id` — The ID of the organization that owns the resource. + * `resource_type_slug` — The slug of the resource type. + * `external_id` — An identifier you provide to reference the resource in your system. + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec get_resource_by_external_id( + WorkOS.Client.t(), + String.t(), + String.t(), + String.t(), + keyword() + ) :: + {:ok, WorkOS.AuthorizationResource.t()} | {:error, WorkOS.Error.error()} + def get_resource_by_external_id( + client, + organization_id, + resource_type_slug, + external_id, + opts \\ [] + ) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :get, + "/authorization/organizations/#{URI.encode(organization_id, &URI.char_unreserved?/1)}/resources/#{URI.encode(resource_type_slug, &URI.char_unreserved?/1)}/#{URI.encode(external_id, &URI.char_unreserved?/1)}", + %{}, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.AuthorizationResource.from_map/1)} + end + end + + @doc """ + Update a resource by external ID + + Update an existing authorization resource using its external ID. + + ## Parameters + + * `organization_id` — The ID of the organization that owns the resource. + * `resource_type_slug` — The slug of the resource type. + * `external_id` — An identifier you provide to reference the resource in your system. + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec update_resource_by_external_id( + WorkOS.Client.t(), + String.t(), + String.t(), + String.t(), + map(), + keyword() + ) :: + {:ok, WorkOS.AuthorizationResource.t()} | {:error, WorkOS.Error.error()} + def update_resource_by_external_id( + client, + organization_id, + resource_type_slug, + external_id, + params \\ %{}, + opts \\ [] + ) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :patch, + "/authorization/organizations/#{URI.encode(organization_id, &URI.char_unreserved?/1)}/resources/#{URI.encode(resource_type_slug, &URI.char_unreserved?/1)}/#{URI.encode(external_id, &URI.char_unreserved?/1)}", + params, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.AuthorizationResource.from_map/1)} + end + end + + @doc """ + Delete an authorization resource by external ID + + Delete an authorization resource by organization, resource type, and external ID. This also deletes all descendant resources. + + ## Parameters + + * `organization_id` — The ID of the organization that owns the resource. + * `resource_type_slug` — The slug of the resource type. + * `external_id` — An identifier you provide to reference the resource in your system. + * `params` — query parameters: `:cascade_delete` + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec delete_resource_by_external_id( + WorkOS.Client.t(), + String.t(), + String.t(), + String.t(), + map(), + keyword() + ) :: + {:ok, term()} | {:error, WorkOS.Error.error()} + def delete_resource_by_external_id( + client, + organization_id, + resource_type_slug, + external_id, + params \\ %{}, + opts \\ [] + ) do + WorkOS.Client.request( + client, + :delete, + "/authorization/organizations/#{URI.encode(organization_id, &URI.char_unreserved?/1)}/resources/#{URI.encode(resource_type_slug, &URI.char_unreserved?/1)}/#{URI.encode(external_id, &URI.char_unreserved?/1)}", + params, + opts + ) + end + + @doc """ + List memberships for a resource by external ID + + Returns all organization memberships that have a specific permission on a resource, using the resource's external ID. This is useful for answering "Who can access this resource?" when you only have the external ID. + + ## Parameters + + * `organization_id` — The ID of the organization that owns the resource. + * `resource_type_slug` — The slug of the resource type this resource belongs to. + * `external_id` — An identifier you provide to reference the resource in your system. + * `params` — query parameters: `:before`, `:after_`, `:limit`, `:order`, `:permission_slug`, `:assignment` + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec list_memberships_for_resource_by_external_id( + WorkOS.Client.t(), + String.t(), + String.t(), + String.t(), + map(), + keyword() + ) :: + {:ok, WorkOS.Page.t(WorkOS.UserOrganizationMembershipBaseList.t())} + | {:error, WorkOS.Error.error()} + def list_memberships_for_resource_by_external_id( + client, + organization_id, + resource_type_slug, + external_id, + params \\ %{}, + opts \\ [] + ) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :get, + "/authorization/organizations/#{URI.encode(organization_id, &URI.char_unreserved?/1)}/resources/#{URI.encode(resource_type_slug, &URI.char_unreserved?/1)}/#{URI.encode(external_id, &URI.char_unreserved?/1)}/organization_memberships", + params, + opts + ) do + fetch_next = fn cursor -> + list_memberships_for_resource_by_external_id( + client, + organization_id, + resource_type_slug, + external_id, + WorkOS.Page.next_params(params, "after", cursor), + opts + ) + end + + {:ok, + WorkOS.Page.from_map( + body, + "data", + &WorkOS.UserOrganizationMembershipBaseList.from_map/1, + fetch_next + )} + end + end + + @doc """ + List role assignments for a resource by external ID + + List all role assignments granted on a resource, identified by its external ID. Each assignment includes the organization membership it was granted to. + + ## Parameters + + * `organization_id` — The ID of the organization that owns the resource. + * `resource_type_slug` — The slug of the resource type. + * `external_id` — An identifier you provide to reference the resource in your system. + * `params` — query parameters: `:before`, `:after_`, `:limit`, `:order`, `:role_slug` + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec list_role_assignments_for_resource_by_external_id( + WorkOS.Client.t(), + String.t(), + String.t(), + String.t(), + map(), + keyword() + ) :: + {:ok, WorkOS.Page.t(WorkOS.UserRoleAssignmentList.t())} | {:error, WorkOS.Error.error()} + def list_role_assignments_for_resource_by_external_id( + client, + organization_id, + resource_type_slug, + external_id, + params \\ %{}, + opts \\ [] + ) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :get, + "/authorization/organizations/#{URI.encode(organization_id, &URI.char_unreserved?/1)}/resources/#{URI.encode(resource_type_slug, &URI.char_unreserved?/1)}/#{URI.encode(external_id, &URI.char_unreserved?/1)}/role_assignments", + params, + opts + ) do + fetch_next = fn cursor -> + list_role_assignments_for_resource_by_external_id( + client, + organization_id, + resource_type_slug, + external_id, + WorkOS.Page.next_params(params, "after", cursor), + opts + ) + end + + {:ok, + WorkOS.Page.from_map(body, "data", &WorkOS.UserRoleAssignmentList.from_map/1, fetch_next)} + end + end + + @doc """ + List resources + + Get a paginated list of authorization resources. + + ## Parameters + + * `params` — query parameters: `:before`, `:after_`, `:limit`, `:order`, `:organization_id`, `:resource_type_slug`, `:resource_external_id`, `:parent_resource_id`, `:parent_resource_type_slug`, `:parent_external_id` + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec list_resources(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.Page.t(WorkOS.AuthorizationResourceList.t())} + | {:error, WorkOS.Error.error()} + def list_resources(client, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request(client, :get, "/authorization/resources", params, opts) do + fetch_next = fn cursor -> + list_resources( + client, + WorkOS.Page.next_params(params, "after", cursor), + opts + ) + end + + {:ok, + WorkOS.Page.from_map( + body, + "data", + &WorkOS.AuthorizationResourceList.from_map/1, + fetch_next + )} + end + end + + @doc """ + Create an authorization resource + + Create a new authorization resource. + + ## Parameters + + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec create_resource(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.AuthorizationResource.t()} | {:error, WorkOS.Error.error()} + def create_resource(client, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request(client, :post, "/authorization/resources", params, opts) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.AuthorizationResource.from_map/1)} + end + end + + @doc """ + Get a resource + + Retrieve the details of an authorization resource by its ID. + + ## Parameters + + * `resource_id` — The ID of the authorization resource. + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec get_resource(WorkOS.Client.t(), String.t(), keyword()) :: + {:ok, WorkOS.AuthorizationResource.t()} | {:error, WorkOS.Error.error()} + def get_resource(client, resource_id, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :get, + "/authorization/resources/#{URI.encode(resource_id, &URI.char_unreserved?/1)}", + %{}, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.AuthorizationResource.from_map/1)} + end + end + + @doc """ + Update a resource + + Update an existing authorization resource. + + ## Parameters + + * `resource_id` — The ID of the authorization resource. + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec update_resource(WorkOS.Client.t(), String.t(), map(), keyword()) :: + {:ok, WorkOS.AuthorizationResource.t()} | {:error, WorkOS.Error.error()} + def update_resource(client, resource_id, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :patch, + "/authorization/resources/#{URI.encode(resource_id, &URI.char_unreserved?/1)}", + params, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.AuthorizationResource.from_map/1)} + end + end + + @doc """ + Delete an authorization resource + + Delete an authorization resource and all its descendants. + + ## Parameters + + * `resource_id` — The ID of the authorization resource. + * `params` — query parameters: `:cascade_delete` + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec delete_resource(WorkOS.Client.t(), String.t(), map(), keyword()) :: + {:ok, term()} | {:error, WorkOS.Error.error()} + def delete_resource(client, resource_id, params \\ %{}, opts \\ []) do + WorkOS.Client.request( + client, + :delete, + "/authorization/resources/#{URI.encode(resource_id, &URI.char_unreserved?/1)}", + params, + opts + ) + end + + @doc """ + List organization memberships for resource + + Returns all organization memberships that have a specific permission on a resource instance. This is useful for answering "Who can access this resource?". + + ## Parameters + + * `resource_id` — The ID of the authorization resource. + * `params` — query parameters: `:before`, `:after_`, `:limit`, `:order`, `:permission_slug`, `:assignment` + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec list_memberships_for_resource(WorkOS.Client.t(), String.t(), map(), keyword()) :: + {:ok, WorkOS.Page.t(WorkOS.UserOrganizationMembershipBaseList.t())} + | {:error, WorkOS.Error.error()} + def list_memberships_for_resource(client, resource_id, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :get, + "/authorization/resources/#{URI.encode(resource_id, &URI.char_unreserved?/1)}/organization_memberships", + params, + opts + ) do + fetch_next = fn cursor -> + list_memberships_for_resource( + client, + resource_id, + WorkOS.Page.next_params(params, "after", cursor), + opts + ) + end + + {:ok, + WorkOS.Page.from_map( + body, + "data", + &WorkOS.UserOrganizationMembershipBaseList.from_map/1, + fetch_next + )} + end + end + + @doc """ + List role assignments for a resource + + List all role assignments granted on a specific resource instance. Each assignment includes the organization membership it was granted to. + + ## Parameters + + * `resource_id` — The ID of the authorization resource. + * `params` — query parameters: `:before`, `:after_`, `:limit`, `:order`, `:role_slug` + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec list_role_assignments_for_resource(WorkOS.Client.t(), String.t(), map(), keyword()) :: + {:ok, WorkOS.Page.t(WorkOS.UserRoleAssignmentList.t())} | {:error, WorkOS.Error.error()} + def list_role_assignments_for_resource(client, resource_id, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :get, + "/authorization/resources/#{URI.encode(resource_id, &URI.char_unreserved?/1)}/role_assignments", + params, + opts + ) do + fetch_next = fn cursor -> + list_role_assignments_for_resource( + client, + resource_id, + WorkOS.Page.next_params(params, "after", cursor), + opts + ) + end + + {:ok, + WorkOS.Page.from_map(body, "data", &WorkOS.UserRoleAssignmentList.from_map/1, fetch_next)} + end + end + + @doc """ + List environment roles + + List all environment roles in priority order. + + ## Parameters + + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec list_environment_roles(WorkOS.Client.t(), keyword()) :: + {:ok, WorkOS.RoleList.t()} | {:error, WorkOS.Error.error()} + def list_environment_roles(client, opts \\ []) do + with {:ok, body} <- WorkOS.Client.request(client, :get, "/authorization/roles", %{}, opts) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.RoleList.from_map/1)} + end + end + + @doc """ + Create an environment role + + Create a new environment role. + + ## Parameters + + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec create_environment_role(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.Role.t()} | {:error, WorkOS.Error.error()} + def create_environment_role(client, params \\ %{}, opts \\ []) do + with {:ok, body} <- WorkOS.Client.request(client, :post, "/authorization/roles", params, opts) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.Role.from_map/1)} + end + end + + @doc """ + Get an environment role + + Get an environment role by its slug. + + ## Parameters + + * `slug` — The slug of the environment role. + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec get_environment_role(WorkOS.Client.t(), String.t(), keyword()) :: + {:ok, WorkOS.Role.t()} | {:error, WorkOS.Error.error()} + def get_environment_role(client, slug, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :get, + "/authorization/roles/#{URI.encode(slug, &URI.char_unreserved?/1)}", + %{}, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.Role.from_map/1)} + end + end + + @doc """ + Update an environment role + + Update an existing environment role. + + ## Parameters + + * `slug` — The slug of the environment role. + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec update_environment_role(WorkOS.Client.t(), String.t(), map(), keyword()) :: + {:ok, WorkOS.Role.t()} | {:error, WorkOS.Error.error()} + def update_environment_role(client, slug, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :patch, + "/authorization/roles/#{URI.encode(slug, &URI.char_unreserved?/1)}", + params, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.Role.from_map/1)} + end + end + + @doc """ + Add a permission to an environment role + + Add a single permission to an environment role. If the permission is already assigned to the role, this operation has no effect. + + ## Parameters + + * `slug` — The slug of the environment role. + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec add_environment_role_permission(WorkOS.Client.t(), String.t(), map(), keyword()) :: + {:ok, WorkOS.Role.t()} | {:error, WorkOS.Error.error()} + def add_environment_role_permission(client, slug, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :post, + "/authorization/roles/#{URI.encode(slug, &URI.char_unreserved?/1)}/permissions", + params, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.Role.from_map/1)} + end + end + + @doc """ + Set permissions for an environment role + + Replace all permissions on an environment role with the provided list. + + ## Parameters + + * `slug` — The slug of the environment role. + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec set_environment_role_permissions(WorkOS.Client.t(), String.t(), map(), keyword()) :: + {:ok, WorkOS.Role.t()} | {:error, WorkOS.Error.error()} + def set_environment_role_permissions(client, slug, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :put, + "/authorization/roles/#{URI.encode(slug, &URI.char_unreserved?/1)}/permissions", + params, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.Role.from_map/1)} + end + end + + @doc """ + List permissions + + Get a list of all permissions in your WorkOS environment. + + ## Parameters + + * `params` — query parameters: `:before`, `:after_`, `:limit`, `:order` + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec list_permissions(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.Page.t(WorkOS.AuthorizationPermissionList.t())} + | {:error, WorkOS.Error.error()} + def list_permissions(client, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request(client, :get, "/authorization/permissions", params, opts) do + fetch_next = fn cursor -> + list_permissions( + client, + WorkOS.Page.next_params(params, "after", cursor), + opts + ) + end + + {:ok, + WorkOS.Page.from_map( + body, + "data", + &WorkOS.AuthorizationPermissionList.from_map/1, + fetch_next + )} + end + end + + @doc """ + Create a permission + + Create a new permission in your WorkOS environment. The permission can then be assigned to environment roles and custom roles. + + ## Parameters + + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec create_permission(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.Permission.t()} | {:error, WorkOS.Error.error()} + def create_permission(client, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request(client, :post, "/authorization/permissions", params, opts) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.Permission.from_map/1)} + end + end + + @doc """ + Get a permission + + Retrieve a permission by its unique slug. + + ## Parameters + + * `slug` — A unique key to reference the permission. Must be lowercase and contain only letters, numbers, hyphens, underscores, colons, periods, and asterisks. + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec get_permission(WorkOS.Client.t(), String.t(), keyword()) :: + {:ok, WorkOS.AuthorizationPermission.t()} | {:error, WorkOS.Error.error()} + def get_permission(client, slug, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :get, + "/authorization/permissions/#{URI.encode(slug, &URI.char_unreserved?/1)}", + %{}, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.AuthorizationPermission.from_map/1)} + end + end + + @doc """ + Update a permission + + Update an existing permission. Only the fields provided in the request body will be updated. + + ## Parameters + + * `slug` — A unique key to reference the permission. Must be lowercase and contain only letters, numbers, hyphens, underscores, colons, periods, and asterisks. + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec update_permission(WorkOS.Client.t(), String.t(), map(), keyword()) :: + {:ok, WorkOS.AuthorizationPermission.t()} | {:error, WorkOS.Error.error()} + def update_permission(client, slug, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :patch, + "/authorization/permissions/#{URI.encode(slug, &URI.char_unreserved?/1)}", + params, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.AuthorizationPermission.from_map/1)} + end + end + + @doc """ + Delete a permission + + Delete an existing permission. System permissions cannot be deleted. + + ## Parameters + + * `slug` — A unique key to reference the permission. Must be lowercase and contain only letters, numbers, hyphens, underscores, colons, periods, and asterisks. + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec delete_permission(WorkOS.Client.t(), String.t(), keyword()) :: + {:ok, term()} | {:error, WorkOS.Error.error()} + def delete_permission(client, slug, opts \\ []) do + WorkOS.Client.request( + client, + :delete, + "/authorization/permissions/#{URI.encode(slug, &URI.char_unreserved?/1)}", + %{}, + opts + ) + end +end diff --git a/lib/workos/authorization_assignment.ex b/lib/workos/authorization_assignment.ex new file mode 100644 index 00000000..35d39307 --- /dev/null +++ b/lib/workos/authorization_assignment.ex @@ -0,0 +1,25 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthorizationAssignment do + @moduledoc """ + AuthorizationAssignment enum. + """ + + @type t :: :direct | :indirect + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:direct, :indirect] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("direct"), do: :direct + def cast("indirect"), do: :indirect + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:direct), do: "direct" + def dump(:indirect), do: "indirect" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/authorization_check.ex b/lib/workos/authorization_check.ex new file mode 100644 index 00000000..75c43484 --- /dev/null +++ b/lib/workos/authorization_check.ex @@ -0,0 +1,31 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthorizationCheck do + @moduledoc """ + AuthorizationCheck model. + """ + + defstruct [ + :authorized + ] + + @type t :: %__MODULE__{ + authorized: boolean() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + authorized: map["authorized"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "authorized" => struct.authorized + }) + end +end diff --git a/lib/workos/authorization_code_session_authenticate_request.ex b/lib/workos/authorization_code_session_authenticate_request.ex new file mode 100644 index 00000000..c3b75984 --- /dev/null +++ b/lib/workos/authorization_code_session_authenticate_request.ex @@ -0,0 +1,67 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthorizationCodeSessionAuthenticateRequest do + @moduledoc """ + AuthorizationCodeSessionAuthenticateRequest model. + """ + + defstruct [ + :client_id, + :grant_type, + :code, + :client_secret, + :code_verifier, + :invitation_token, + :ip_address, + :device_id, + :user_agent, + :signals_id + ] + + @type t :: %__MODULE__{ + client_id: String.t(), + grant_type: String.t(), + code: String.t(), + client_secret: String.t() | nil, + code_verifier: String.t() | nil, + invitation_token: String.t() | nil, + ip_address: String.t() | nil, + device_id: String.t() | nil, + user_agent: String.t() | nil, + signals_id: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + client_id: map["client_id"], + grant_type: map["grant_type"], + code: map["code"], + client_secret: map["client_secret"], + code_verifier: map["code_verifier"], + invitation_token: map["invitation_token"], + ip_address: map["ip_address"], + device_id: map["device_id"], + user_agent: map["user_agent"], + signals_id: map["signals_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "client_id" => struct.client_id, + "grant_type" => struct.grant_type, + "code" => struct.code, + "client_secret" => struct.client_secret, + "code_verifier" => struct.code_verifier, + "invitation_token" => struct.invitation_token, + "ip_address" => struct.ip_address, + "device_id" => struct.device_id, + "user_agent" => struct.user_agent, + "signals_id" => struct.signals_id + }) + end +end diff --git a/lib/workos/authorization_permission.ex b/lib/workos/authorization_permission.ex new file mode 100644 index 00000000..9c0227c9 --- /dev/null +++ b/lib/workos/authorization_permission.ex @@ -0,0 +1,63 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthorizationPermission do + @moduledoc """ + AuthorizationPermission model. + """ + + defstruct [ + :object, + :id, + :slug, + :name, + :description, + :system, + :resource_type_slug, + :created_at, + :updated_at + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + slug: String.t(), + name: String.t(), + description: String.t() | nil, + system: boolean(), + resource_type_slug: String.t(), + created_at: String.t(), + updated_at: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + slug: map["slug"], + name: map["name"], + description: map["description"], + system: map["system"], + resource_type_slug: map["resource_type_slug"], + created_at: map["created_at"], + updated_at: map["updated_at"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "slug" => struct.slug, + "name" => struct.name, + "description" => struct.description, + "system" => struct.system, + "resource_type_slug" => struct.resource_type_slug, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at + }) + end +end diff --git a/lib/workos/authorization_permission_list.ex b/lib/workos/authorization_permission_list.ex new file mode 100644 index 00000000..44cf122e --- /dev/null +++ b/lib/workos/authorization_permission_list.ex @@ -0,0 +1,50 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthorizationPermissionList do + @moduledoc """ + AuthorizationPermissionList model. + """ + + defstruct [ + :object, + :data, + :list_metadata + ] + + @type t :: %__MODULE__{ + object: String.t(), + data: [WorkOS.AuthorizationPermission.t()], + list_metadata: WorkOS.AuthorizationPermissionListListMetadata.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + data: WorkOS.Cast.list(map["data"], &WorkOS.AuthorizationPermission.from_map/1), + list_metadata: + WorkOS.Cast.nested( + map["list_metadata"], + &WorkOS.AuthorizationPermissionListListMetadata.from_map/1 + ) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "data" => + WorkOS.Cast.list(struct.data, fn item -> + WorkOS.Cast.dump_struct(item, &WorkOS.AuthorizationPermission.to_map/1) + end), + "list_metadata" => + WorkOS.Cast.dump_struct( + struct.list_metadata, + &WorkOS.AuthorizationPermissionListListMetadata.to_map/1 + ) + }) + end +end diff --git a/lib/workos/authorization_permission_list_list_metadata.ex b/lib/workos/authorization_permission_list_list_metadata.ex new file mode 100644 index 00000000..4a749389 --- /dev/null +++ b/lib/workos/authorization_permission_list_list_metadata.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthorizationPermissionListListMetadata do + @moduledoc """ + Pagination cursors for navigating between pages of results. + """ + + defstruct [ + :before, + :after_ + ] + + @type t :: %__MODULE__{ + before: String.t() | nil, + after_: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + before: map["before"], + after_: map["after"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "before" => struct.before, + "after" => struct.after_ + }) + end +end diff --git a/lib/workos/authorization_resource.ex b/lib/workos/authorization_resource.ex new file mode 100644 index 00000000..375c1b1a --- /dev/null +++ b/lib/workos/authorization_resource.ex @@ -0,0 +1,67 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthorizationResource do + @moduledoc """ + AuthorizationResource model. + """ + + defstruct [ + :object, + :name, + :description, + :organization_id, + :parent_resource_id, + :id, + :external_id, + :resource_type_slug, + :created_at, + :updated_at + ] + + @type t :: %__MODULE__{ + object: String.t(), + name: String.t(), + description: String.t() | nil, + organization_id: String.t(), + parent_resource_id: String.t() | nil, + id: String.t(), + external_id: String.t(), + resource_type_slug: String.t(), + created_at: String.t(), + updated_at: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + name: map["name"], + description: map["description"], + organization_id: map["organization_id"], + parent_resource_id: map["parent_resource_id"], + id: map["id"], + external_id: map["external_id"], + resource_type_slug: map["resource_type_slug"], + created_at: map["created_at"], + updated_at: map["updated_at"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "name" => struct.name, + "description" => struct.description, + "organization_id" => struct.organization_id, + "parent_resource_id" => struct.parent_resource_id, + "id" => struct.id, + "external_id" => struct.external_id, + "resource_type_slug" => struct.resource_type_slug, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at + }) + end +end diff --git a/lib/workos/authorization_resource_list.ex b/lib/workos/authorization_resource_list.ex new file mode 100644 index 00000000..fcd47f5a --- /dev/null +++ b/lib/workos/authorization_resource_list.ex @@ -0,0 +1,50 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthorizationResourceList do + @moduledoc """ + AuthorizationResourceList model. + """ + + defstruct [ + :object, + :data, + :list_metadata + ] + + @type t :: %__MODULE__{ + object: String.t(), + data: [WorkOS.AuthorizationResource.t()], + list_metadata: WorkOS.AuthorizationResourceListListMetadata.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + data: WorkOS.Cast.list(map["data"], &WorkOS.AuthorizationResource.from_map/1), + list_metadata: + WorkOS.Cast.nested( + map["list_metadata"], + &WorkOS.AuthorizationResourceListListMetadata.from_map/1 + ) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "data" => + WorkOS.Cast.list(struct.data, fn item -> + WorkOS.Cast.dump_struct(item, &WorkOS.AuthorizationResource.to_map/1) + end), + "list_metadata" => + WorkOS.Cast.dump_struct( + struct.list_metadata, + &WorkOS.AuthorizationResourceListListMetadata.to_map/1 + ) + }) + end +end diff --git a/lib/workos/authorization_resource_list_list_metadata.ex b/lib/workos/authorization_resource_list_list_metadata.ex new file mode 100644 index 00000000..f731e276 --- /dev/null +++ b/lib/workos/authorization_resource_list_list_metadata.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthorizationResourceListListMetadata do + @moduledoc """ + Pagination cursors for navigating between pages of results. + """ + + defstruct [ + :before, + :after_ + ] + + @type t :: %__MODULE__{ + before: String.t() | nil, + after_: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + before: map["before"], + after_: map["after"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "before" => struct.before, + "after" => struct.after_ + }) + end +end diff --git a/lib/workos/authorized_connect_application_list.ex b/lib/workos/authorized_connect_application_list.ex new file mode 100644 index 00000000..52699563 --- /dev/null +++ b/lib/workos/authorized_connect_application_list.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthorizedConnectApplicationList do + @moduledoc """ + AuthorizedConnectApplicationList model. + """ + + defstruct [ + :object, + :data, + :list_metadata + ] + + @type t :: %__MODULE__{ + object: String.t(), + data: [WorkOS.AuthorizedConnectApplicationListData.t()], + list_metadata: WorkOS.AuthorizedConnectApplicationListListMetadata.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + data: + WorkOS.Cast.list(map["data"], &WorkOS.AuthorizedConnectApplicationListData.from_map/1), + list_metadata: + WorkOS.Cast.nested( + map["list_metadata"], + &WorkOS.AuthorizedConnectApplicationListListMetadata.from_map/1 + ) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "data" => + WorkOS.Cast.list(struct.data, fn item -> + WorkOS.Cast.dump_struct(item, &WorkOS.AuthorizedConnectApplicationListData.to_map/1) + end), + "list_metadata" => + WorkOS.Cast.dump_struct( + struct.list_metadata, + &WorkOS.AuthorizedConnectApplicationListListMetadata.to_map/1 + ) + }) + end +end diff --git a/lib/workos/authorized_connect_application_list_data.ex b/lib/workos/authorized_connect_application_list_data.ex new file mode 100644 index 00000000..7c75f97f --- /dev/null +++ b/lib/workos/authorized_connect_application_list_data.ex @@ -0,0 +1,48 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthorizedConnectApplicationListData do + @moduledoc """ + AuthorizedConnectApplicationListData model. + """ + + defstruct [ + :object, + :id, + :granted_scopes, + :application, + :oauth_resource + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + granted_scopes: [String.t()], + application: WorkOS.ConnectApplication.t(), + oauth_resource: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + granted_scopes: map["granted_scopes"], + application: WorkOS.Cast.nested(map["application"], &WorkOS.ConnectApplication.from_map/1), + oauth_resource: map["oauth_resource"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "granted_scopes" => struct.granted_scopes, + "application" => + WorkOS.Cast.dump_struct(struct.application, &WorkOS.ConnectApplication.to_map/1), + "oauth_resource" => struct.oauth_resource + }) + end +end diff --git a/lib/workos/authorized_connect_application_list_list_metadata.ex b/lib/workos/authorized_connect_application_list_list_metadata.ex new file mode 100644 index 00000000..ebf11fe2 --- /dev/null +++ b/lib/workos/authorized_connect_application_list_list_metadata.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthorizedConnectApplicationListListMetadata do + @moduledoc """ + Pagination cursors for navigating between pages of results. + """ + + defstruct [ + :before, + :after_ + ] + + @type t :: %__MODULE__{ + before: String.t() | nil, + after_: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + before: map["before"], + after_: map["after"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "before" => struct.before, + "after" => struct.after_ + }) + end +end diff --git a/lib/workos/cast.ex b/lib/workos/cast.ex new file mode 100644 index 00000000..5a551d8e --- /dev/null +++ b/lib/workos/cast.ex @@ -0,0 +1,54 @@ +# @oagen-ignore-file + +defmodule WorkOS.Cast do + @moduledoc """ + Nil-safe casting helpers used by generated `from_map/1` and `to_map/1` + functions. Unexpected shapes pass through unchanged (lenient casting), so + new or malformed API payloads never crash the SDK. + """ + + @doc "Casts each element of a list with `fun`; non-lists pass through." + @spec list(term(), (term() -> term())) :: term() + def list(values, fun) when is_list(values), do: Enum.map(values, fun) + def list(other, _fun), do: other + + @doc "Casts a nested map with `fun`; non-maps pass through." + @spec nested(term(), (map() -> term())) :: term() + def nested(value, fun) when is_map(value), do: fun.(value) + def nested(other, _fun), do: other + + @doc "Applies an enum cast/dump function; nil passes through." + @spec enum(term(), (term() -> term())) :: term() + def enum(nil, _fun), do: nil + def enum(value, fun), do: fun.(value) + + @doc "Casts each value of a map with `fun`; non-maps pass through." + @spec map_values(term(), (term() -> term())) :: term() + def map_values(map, fun) when is_map(map), do: Map.new(map, fn {k, v} -> {k, fun.(v)} end) + def map_values(other, _fun), do: other + + @doc """ + Dispatches a discriminated-union map to the caster for its discriminator + value. Unknown discriminator values (and non-maps) pass through unchanged. + """ + @spec discriminated(term(), String.t(), %{optional(String.t()) => (map() -> term())}) :: term() + def discriminated(map, property, mapping) when is_map(map) do + case Map.fetch(mapping, Map.get(map, property)) do + {:ok, fun} -> fun.(map) + :error -> map + end + end + + def discriminated(other, _property, _mapping), do: other + + @doc "Dumps a struct with `fun`; nil and already-plain values pass through." + @spec dump_struct(term(), (struct() -> map())) :: term() + def dump_struct(%_{} = value, fun), do: fun.(value) + def dump_struct(other, _fun), do: other + + @doc "Drops nil-valued entries from a map." + @spec drop_nils(map()) :: map() + def drop_nils(map) when is_map(map) do + map |> Enum.reject(fn {_k, v} -> is_nil(v) end) |> Map.new() + end +end diff --git a/lib/workos/castable.ex b/lib/workos/castable.ex deleted file mode 100644 index 05c2c7dd..00000000 --- a/lib/workos/castable.ex +++ /dev/null @@ -1,36 +0,0 @@ -defmodule WorkOS.Castable do - @moduledoc false - - @type impl :: module() | {module(), module()} | :raw - @type generic_map :: %{String.t() => any()} - - @callback cast(generic_map() | {module(), generic_map()} | nil) :: struct() | nil - - @spec cast(impl(), generic_map() | nil) :: struct() | generic_map() | nil - def cast(_implementation, nil) do - nil - end - - def cast(:raw, generic_map) do - generic_map - end - - def cast({implementation, inner}, generic_map) when is_map(generic_map) do - implementation.cast({inner, generic_map}) - end - - def cast(implementation, generic_map) when is_map(generic_map) do - implementation.cast(generic_map) - end - - def cast(WorkOS.Empty, "Accepted"), do: %WorkOS.Empty{status: "Accepted"} - - @spec cast_list(module(), [generic_map()] | nil) :: [struct()] | nil - def cast_list(_implementation, nil) do - nil - end - - def cast_list(implementation, list_of_generic_maps) when is_list(list_of_generic_maps) do - Enum.map(list_of_generic_maps, &cast(implementation, &1)) - end -end diff --git a/lib/workos/challenge_authentication_factor.ex b/lib/workos/challenge_authentication_factor.ex new file mode 100644 index 00000000..d8b0a39c --- /dev/null +++ b/lib/workos/challenge_authentication_factor.ex @@ -0,0 +1,31 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ChallengeAuthenticationFactor do + @moduledoc """ + ChallengeAuthenticationFactor model. + """ + + defstruct [ + :sms_template + ] + + @type t :: %__MODULE__{ + sms_template: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + sms_template: map["sms_template"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "sms_template" => struct.sms_template + }) + end +end diff --git a/lib/workos/check_authorization.ex b/lib/workos/check_authorization.ex new file mode 100644 index 00000000..e44e5908 --- /dev/null +++ b/lib/workos/check_authorization.ex @@ -0,0 +1,43 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.CheckAuthorization do + @moduledoc """ + CheckAuthorization model. + """ + + defstruct [ + :permission_slug, + :resource_id, + :resource_external_id, + :resource_type_slug + ] + + @type t :: %__MODULE__{ + permission_slug: String.t(), + resource_id: String.t() | nil, + resource_external_id: String.t() | nil, + resource_type_slug: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + permission_slug: map["permission_slug"], + resource_id: map["resource_id"], + resource_external_id: map["resource_external_id"], + resource_type_slug: map["resource_type_slug"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "permission_slug" => struct.permission_slug, + "resource_id" => struct.resource_id, + "resource_external_id" => struct.resource_external_id, + "resource_type_slug" => struct.resource_type_slug + }) + end +end diff --git a/lib/workos/claim_view_response.ex b/lib/workos/claim_view_response.ex new file mode 100644 index 00000000..5dfac5cf --- /dev/null +++ b/lib/workos/claim_view_response.ex @@ -0,0 +1,47 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ClaimViewResponse do + @moduledoc """ + ClaimViewResponse model. + """ + + defstruct [ + :id, + :status, + :user_code, + :organizations + ] + + @type t :: %__MODULE__{ + id: String.t(), + status: WorkOS.ClaimViewResponseStatus.t(), + user_code: String.t(), + organizations: [WorkOS.ClaimViewResponseOrganization.t()] + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + id: map["id"], + status: WorkOS.Cast.enum(map["status"], &WorkOS.ClaimViewResponseStatus.cast/1), + user_code: map["user_code"], + organizations: + WorkOS.Cast.list(map["organizations"], &WorkOS.ClaimViewResponseOrganization.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "id" => struct.id, + "status" => WorkOS.Cast.enum(struct.status, &WorkOS.ClaimViewResponseStatus.dump/1), + "user_code" => struct.user_code, + "organizations" => + WorkOS.Cast.list(struct.organizations, fn item -> + WorkOS.Cast.dump_struct(item, &WorkOS.ClaimViewResponseOrganization.to_map/1) + end) + }) + end +end diff --git a/lib/workos/claim_view_response_organization.ex b/lib/workos/claim_view_response_organization.ex new file mode 100644 index 00000000..41dc1505 --- /dev/null +++ b/lib/workos/claim_view_response_organization.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ClaimViewResponseOrganization do + @moduledoc """ + ClaimViewResponseOrganization model. + """ + + defstruct [ + :id, + :name + ] + + @type t :: %__MODULE__{ + id: String.t(), + name: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + id: map["id"], + name: map["name"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "id" => struct.id, + "name" => struct.name + }) + end +end diff --git a/lib/workos/claim_view_response_status.ex b/lib/workos/claim_view_response_status.ex new file mode 100644 index 00000000..7b21a4f2 --- /dev/null +++ b/lib/workos/claim_view_response_status.ex @@ -0,0 +1,29 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ClaimViewResponseStatus do + @moduledoc """ + ClaimViewResponseStatus enum. + """ + + @type t :: :unverified | :verified | :expired | :revoked + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:unverified, :verified, :expired, :revoked] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("unverified"), do: :unverified + def cast("verified"), do: :verified + def cast("expired"), do: :expired + def cast("revoked"), do: :revoked + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:unverified), do: "unverified" + def dump(:verified), do: "verified" + def dump(:expired), do: "expired" + def dump(:revoked), do: "revoked" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/client.ex b/lib/workos/client.ex index a81511ba..08bc9080 100644 --- a/lib/workos/client.ex +++ b/lib/workos/client.ex @@ -1,126 +1,298 @@ +# @oagen-ignore-file + defmodule WorkOS.Client do @moduledoc """ - WorkOS API client. - """ + HTTP client for the WorkOS API. - require Logger + ## Usage - alias WorkOS.Castable + client = WorkOS.Client.new(api_key: "sk_...") - @callback request(t(), Keyword.t()) :: - {:ok, %{body: map(), status: pos_integer()}} | {:error, any()} + The API key falls back to the `WORKOS_API_KEY` environment variable. - @type response(type) :: {:ok, type} | {:error, WorkOS.Error.t() | :client_error} + ## Options for `new/1` + + * `:api_key` — API key (required unless the env var is set) + * `:client_id` — client ID used by authentication flows and URL builders + (falls back to the `WORKOS_CLIENT_ID` environment variable) + * `:base_url` — override the API base URL + * `:timeout` — receive timeout in milliseconds + * `:max_retries` — maximum retry attempts for retryable failures + * `:req_options` — extra `Req` options merged into every request + (advanced; used by tests to inject `plug: {Req.Test, ...}`) + """ - @type t() :: %__MODULE__{ + import Bitwise + + defstruct [:api_key, :client_id, :base_url, :timeout, :max_retries, :req_options] + + @type t :: %__MODULE__{ api_key: String.t(), - client_id: String.t(), - base_url: String.t() | nil, - client: module() | nil + client_id: String.t() | nil, + base_url: String.t(), + timeout: pos_integer(), + max_retries: non_neg_integer(), + req_options: keyword() } - @enforce_keys [:api_key, :client_id, :base_url, :client] - defstruct [:api_key, :client_id, :base_url, :client] + @api_key_env "WORKOS_API_KEY" + @client_id_env "WORKOS_CLIENT_ID" + @default_base_url "https://api.workos.com" + @default_timeout_ms 60_000 + @default_max_retries 3 + @retryable_status_codes [429, 500, 502, 503, 504] + @initial_retry_delay_ms 1000 + @retry_multiplier 2 + @max_retry_delay_ms 30_000 + @retry_jitter 0.5 + @idempotency_header "idempotency-key" + @request_id_header "x-request-id" - @default_opts [ - base_url: WorkOS.default_base_url(), - client: __MODULE__.TeslaClient - ] + @doc """ + Builds a new client. See the module documentation for options. + """ + @spec new(keyword()) :: t() + def new(opts \\ []) do + api_key = opts[:api_key] || System.get_env(@api_key_env) + + if !(is_binary(api_key) and api_key != "") do + raise WorkOS.ConfigurationError, + message: "Missing API key. Pass `api_key:` to WorkOS.Client.new/1 or set WORKOS_API_KEY." + end + + %__MODULE__{ + api_key: api_key, + client_id: opts[:client_id] || System.get_env(@client_id_env), + base_url: String.trim_trailing(opts[:base_url] || @default_base_url, "/"), + timeout: opts[:timeout] || @default_timeout_ms, + max_retries: opts[:max_retries] || @default_max_retries, + req_options: opts[:req_options] || [] + } + end @doc """ - Creates a new WorkOS client struct given a keyword list of config opts. + Performs an HTTP request against the API. + + `params` is sent as query parameters for GET/DELETE/HEAD requests and as a + JSON body otherwise. Per-request options: + + * `:headers` — extra headers, as a list of `{name, value}` tuples + * `:idempotency_key` — explicit idempotency key header value + * `:timeout` — per-request receive timeout in milliseconds + * `:max_retries` — per-request retry ceiling, overriding the client's + * `:base_url` — per-request base URL, overriding the client's + * `:query` — extra query parameters for requests whose `params` is a body """ - @spec new(WorkOS.config()) :: t() - def new(config) do - config = Keyword.take(config, [:api_key, :client_id, :base_url, :client]) - struct!(__MODULE__, Keyword.merge(@default_opts, config)) + @spec request(t(), atom(), String.t(), map(), keyword()) :: + {:ok, term()} | {:error, WorkOS.Error.error()} + def request(%__MODULE__{} = client, method, path, params \\ %{}, opts \\ []) do + params = Map.new(params || %{}, fn {k, v} -> {to_string(k), v} end) + query_method? = method in [:get, :delete, :head] + + query = + if query_method?, + do: params, + else: Map.new(opts[:query] || %{}, fn {k, v} -> {to_string(k), v} end) + + query = encode_query_values(query) + + body = if query_method?, do: nil, else: params + + max_retries = opts[:max_retries] || client.max_retries + + req_options = + [ + method: method, + url: path, + base_url: normalize_base_url(opts[:base_url]) || client.base_url, + auth: {:bearer, client.api_key}, + headers: build_headers(client, method, opts, max_retries), + receive_timeout: opts[:timeout] || client.timeout, + retry: &retryable?/2, + retry_delay: &retry_delay/1, + max_retries: max_retries, + decode_body: false + ] + |> put_query(query) + |> put_body(body) + + req = Req.new(req_options) |> Req.merge(client.req_options) + + req |> Req.request() |> handle_response() end - @spec get(t(), Castable.impl(), String.t()) :: response(any()) - @spec get(t(), Castable.impl(), String.t(), Keyword.t()) :: response(any()) - def get(client, castable_module, path, opts \\ []) do - client_module = client.client || WorkOS.Client.TeslaClient + defp handle_response({:ok, %Req.Response{status: status} = response}) + when status in 200..299, + do: {:ok, decode_body(response)} + + defp handle_response({:ok, %Req.Response{} = response}), do: {:error, api_error(response)} - query = Keyword.get(opts, :query, %{}) - filtered_query = Enum.reject(query, fn {_, value} -> value == nil end) + defp handle_response({:error, %{__exception__: true} = exception}), + do: {:error, %WorkOS.TransportError{message: Exception.message(exception), reason: exception}} + + @doc """ + Builds a fully-qualified URL for browser-redirect flows. No HTTP request + is made. `params` become the query string; nil values are dropped. + """ + @spec build_url(t(), String.t(), map()) :: String.t() + def build_url(%__MODULE__{} = client, path, params \\ %{}) do + query = + params + |> Map.new(fn {k, v} -> {to_string(k), v} end) + |> Enum.reject(fn {_k, v} -> is_nil(v) end) + |> Enum.map(fn {k, v} -> {k, query_value(v)} end) + |> URI.encode_query() - opts = - opts - |> Keyword.put(:method, :get) - |> Keyword.put(:url, path) - |> Keyword.put(:query, filtered_query) + case query do + "" -> client.base_url <> path + query -> client.base_url <> path <> "?" <> query + end + end - client_module.request(client, opts) - |> handle_response(path, castable_module) + # Req hands `:params` to URI.encode_query, which rejects list values outright + # and mangles maps, so structured query values must be flattened to strings + # before they get there — the same normalization `build_url/3` applies. + # nil is left alone: `put_query` drops it rather than sending "". + defp encode_query_values(query) do + Map.new(query, fn + {k, nil} -> {k, nil} + {k, v} when is_list(v) or is_map(v) -> {k, query_value(v)} + {k, v} -> {k, v} + end) end - @spec post(t(), Castable.impl(), String.t()) :: response(any()) - @spec post(t(), Castable.impl(), String.t(), map()) :: response(any()) - @spec post(t(), Castable.impl(), String.t(), map(), Keyword.t()) :: response(any()) - def post(client, castable_module, path, body \\ %{}, opts \\ []) do - client_module = client.client || WorkOS.Client.TeslaClient + defp query_value(value) when is_list(value), do: Enum.map_join(value, ",", &to_string/1) + defp query_value(value) when is_map(value), do: JSON.encode!(value) + defp query_value(value), do: to_string(value) + + @doc false + @spec merge_defaults(map(), map()) :: map() + def merge_defaults(params, defaults) do + params + |> Map.new(fn {k, v} -> {to_string(k), v} end) + |> Map.merge(defaults) + end - opts = - opts - |> Keyword.put(:method, :post) - |> Keyword.put(:url, path) - |> Keyword.put(:body, body) + @doc false + @spec put_inferred(map(), String.t(), term()) :: map() + def put_inferred(params, _key, nil), do: params + def put_inferred(params, key, value), do: Map.put_new(params, key, value) - client_module.request(client, opts) - |> handle_response(path, castable_module) + # nil query values are omitted rather than sent as `key=`, matching build_url/3. + defp put_query(req_options, query) do + case Enum.reject(query, fn {_k, v} -> is_nil(v) end) do + [] -> req_options + pairs -> Keyword.put(req_options, :params, pairs) + end end - @spec put(t(), Castable.impl(), String.t()) :: response(any()) - @spec put(t(), Castable.impl(), String.t(), map()) :: response(any()) - @spec put(t(), Castable.impl(), String.t(), map(), Keyword.t()) :: response(any()) - def put(client, castable_module, path, body \\ %{}, opts \\ []) do - client_module = client.client || WorkOS.Client.TeslaClient + defp put_body(req_options, nil), do: req_options + + defp put_body(req_options, body) do + req_options + |> Keyword.put(:body, JSON.encode_to_iodata!(body)) + |> Keyword.update!(:headers, &[{"content-type", "application/json"} | &1]) + end - opts = - opts - |> Keyword.put(:method, :put) - |> Keyword.put(:url, path) - |> Keyword.put(:body, body) + defp normalize_base_url(nil), do: nil + defp normalize_base_url(url) when is_binary(url), do: String.trim_trailing(url, "/") - client_module.request(client, opts) - |> handle_response(path, castable_module) + defp build_headers(_client, method, opts, max_retries) do + [{"user-agent", user_agent()}] ++ + idempotency_headers(method, opts, max_retries) ++ (opts[:headers] || []) end - @spec delete(t(), Castable.impl(), String.t()) :: response(any()) - @spec delete(t(), Castable.impl(), String.t(), map()) :: response(any()) - @spec delete(t(), Castable.impl(), String.t(), map(), Keyword.t()) :: response(any()) - def delete(client, castable_module, path, body \\ %{}, opts \\ []) do - client_module = client.client || WorkOS.Client.TeslaClient + # A retried POST must be safe to replay, so when retries are enabled and the + # caller supplied no key we mint one. `:idempotency` remains supported for + # spec-driven opt-in (`injectIdempotencyKey`) even with retries disabled. + defp idempotency_headers(method, opts, max_retries) do + cond do + is_binary(opts[:idempotency_key]) -> + [{@idempotency_header, opts[:idempotency_key]}] - opts = - opts - |> Keyword.put(:method, :delete) - |> Keyword.put(:url, path) - |> Keyword.put(:body, body) + method == :post and (opts[:idempotency] == true or max_retries > 0) -> + [{@idempotency_header, generate_idempotency_key()}] - client_module.request(client, opts) - |> handle_response(path, castable_module) + true -> + [] + end end - defp handle_response(response, path, castable_module) do - case response do - {:ok, %{body: "", status: status}} when status in 200..299 -> - {:ok, Castable.cast(castable_module, %{})} + defp user_agent, do: "workos-elixir/#{Application.spec(:workos, :vsn)}" + + defp retryable?(_request, %Req.Response{status: status}), + do: status in @retryable_status_codes + + defp retryable?(_request, %Req.TransportError{}), do: true + defp retryable?(_request, _other), do: false - {:ok, %{body: body, status: status}} when status in 200..299 -> - {:ok, Castable.cast(castable_module, body)} + defp retry_delay(attempt) do + base = + min(@initial_retry_delay_ms * :math.pow(@retry_multiplier, attempt), @max_retry_delay_ms) - {:ok, %{body: body}} when is_map(body) -> - Logger.error("#{inspect(__MODULE__)} error when calling #{path}: #{inspect(body)}") - {:error, Castable.cast(WorkOS.Error, body)} + trunc(base + base * @retry_jitter * :rand.uniform()) + end - {:ok, %{body: body}} when is_binary(body) -> - Logger.error("#{inspect(__MODULE__)} error when calling #{path}: #{body}") - {:error, body} + defp decode_body(%Req.Response{body: body}) when body in [nil, ""], do: nil - {:error, reason} -> - Logger.error("#{inspect(__MODULE__)} error when calling #{path}: #{inspect(reason)}") - {:error, :client_error} + defp decode_body(%Req.Response{body: body}) when is_binary(body) do + case JSON.decode(body) do + {:ok, decoded} -> decoded + {:error, _} -> body end end + + defp decode_body(%Req.Response{body: body}), do: body + + defp api_error(%Req.Response{status: status} = response) do + body = decode_body(response) + + %WorkOS.ApiError{ + message: error_message(body, status), + status: status, + kind: error_kind(status), + request_id: response |> Req.Response.get_header(@request_id_header) |> List.first(), + code: if(is_map(body), do: body["code"]), + param: error_param(body), + body: body + } + end + + # The offending field, when the API names one. WorkOS reports it either at the + # top level (`field`/`param`) or per-entry under `errors`. + defp error_param(%{"field" => field}) when is_binary(field), do: field + defp error_param(%{"param" => param}) when is_binary(param), do: param + + defp error_param(%{"errors" => [first | _]}) when is_map(first), + do: error_param(first) + + defp error_param(_body), do: nil + + defp error_message(%{"message" => message}, _status) when is_binary(message), do: message + + defp error_message(%{"error_description" => message}, _status) when is_binary(message), + do: message + + defp error_message(%{"error" => message}, _status) when is_binary(message), do: message + defp error_message(_body, status), do: "HTTP " <> Integer.to_string(status) + + defp error_kind(400), do: :bad_request + defp error_kind(401), do: :authentication + defp error_kind(403), do: :authorization + defp error_kind(404), do: :not_found + defp error_kind(409), do: :conflict + defp error_kind(422), do: :unprocessable_entity + defp error_kind(429), do: :rate_limit_exceeded + defp error_kind(status) when status >= 500, do: :server + defp error_kind(_status), do: :api + + defp generate_idempotency_key do + <> = :crypto.strong_rand_bytes(16) + c = bor(band(c, 0x0FFF), 0x4000) + d = bor(band(d, 0x3FFF), 0x8000) + + ~c"~8.16.0b-~4.16.0b-~4.16.0b-~4.16.0b-~12.16.0b" + |> :io_lib.format([a, b, c, d, e]) + |> to_string() + end end diff --git a/lib/workos/client/tesla_client.ex b/lib/workos/client/tesla_client.ex deleted file mode 100644 index b051ed84..00000000 --- a/lib/workos/client/tesla_client.ex +++ /dev/null @@ -1,39 +0,0 @@ -defmodule WorkOS.Client.TeslaClient do - @moduledoc """ - Tesla client for WorkOS. This is the default HTTP client used. - """ - - @behaviour WorkOS.Client - - @doc """ - Sends a request to a WorkOS API endpoint, given list of request opts. - """ - def request(client, opts) do - opts = Keyword.take(opts, [:method, :url, :query, :headers, :body, :opts]) - access_token = opts |> Keyword.get(:opts, []) |> Keyword.get(:access_token, client.api_key) - - Tesla.request(new(client, access_token), opts) - end - - @doc """ - Returns a new `Tesla.Client`, configured for calling the WorkOS API. - """ - @spec new(WorkOS.Client.t(), String.t()) :: Tesla.Client.t() - def new(client, access_token) do - Tesla.client([ - Tesla.Middleware.Logger, - {Tesla.Middleware.BaseUrl, client.base_url}, - Tesla.Middleware.PathParams, - Tesla.Middleware.JSON, - {Tesla.Middleware.Headers, - [ - {"Authorization", "Bearer #{access_token}"}, - {"User-Agent", user_agent()} - ]} - ]) - end - - defp user_agent do - "workos-elixir/#{Application.spec(:workos, :vsn)}" - end -end diff --git a/lib/workos/client_api.ex b/lib/workos/client_api.ex new file mode 100644 index 00000000..9cef225a --- /dev/null +++ b/lib/workos/client_api.ex @@ -0,0 +1,25 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ClientApi do + @moduledoc """ + Operations for the ClientApi API. + """ + + @doc """ + Generate a Client API token + + Generate a short-lived, session-bound token for the Client GraphQL API, scoped to an organization and user. + + ## Parameters + + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec create_token(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.ClientApiTokenResponse.t()} | {:error, WorkOS.Error.error()} + def create_token(client, params \\ %{}, opts \\ []) do + with {:ok, body} <- WorkOS.Client.request(client, :post, "/client/token", params, opts) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.ClientApiTokenResponse.from_map/1)} + end + end +end diff --git a/lib/workos/client_api_token.ex b/lib/workos/client_api_token.ex new file mode 100644 index 00000000..acd0931a --- /dev/null +++ b/lib/workos/client_api_token.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ClientApiToken do + @moduledoc """ + ClientApiToken model. + """ + + defstruct [ + :organization_id, + :user_id + ] + + @type t :: %__MODULE__{ + organization_id: String.t(), + user_id: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + organization_id: map["organization_id"], + user_id: map["user_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "organization_id" => struct.organization_id, + "user_id" => struct.user_id + }) + end +end diff --git a/lib/workos/client_api_token_response.ex b/lib/workos/client_api_token_response.ex new file mode 100644 index 00000000..b141c47e --- /dev/null +++ b/lib/workos/client_api_token_response.ex @@ -0,0 +1,31 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ClientApiTokenResponse do + @moduledoc """ + ClientApiTokenResponse model. + """ + + defstruct [ + :token + ] + + @type t :: %__MODULE__{ + token: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + token: map["token"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "token" => struct.token + }) + end +end diff --git a/lib/workos/configure_data_integration_body.ex b/lib/workos/configure_data_integration_body.ex new file mode 100644 index 00000000..71bc83c9 --- /dev/null +++ b/lib/workos/configure_data_integration_body.ex @@ -0,0 +1,47 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ConfigureDataIntegrationBody do + @moduledoc """ + ConfigureDataIntegrationBody model. + """ + + defstruct [ + :enabled, + :scopes, + :client_id, + :client_secret, + :config + ] + + @type t :: %__MODULE__{ + enabled: boolean() | nil, + scopes: [String.t()] | nil, + client_id: String.t() | nil, + client_secret: String.t() | nil, + config: %{optional(String.t()) => String.t()} | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + enabled: map["enabled"], + scopes: map["scopes"], + client_id: map["client_id"], + client_secret: map["client_secret"], + config: map["config"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "enabled" => struct.enabled, + "scopes" => struct.scopes, + "client_id" => struct.client_id, + "client_secret" => struct.client_secret, + "config" => struct.config + }) + end +end diff --git a/lib/workos/confirm_email_change.ex b/lib/workos/confirm_email_change.ex new file mode 100644 index 00000000..7d7ae259 --- /dev/null +++ b/lib/workos/confirm_email_change.ex @@ -0,0 +1,31 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ConfirmEmailChange do + @moduledoc """ + ConfirmEmailChange model. + """ + + defstruct [ + :code + ] + + @type t :: %__MODULE__{ + code: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + code: map["code"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "code" => struct.code + }) + end +end diff --git a/lib/workos/connect.ex b/lib/workos/connect.ex new file mode 100644 index 00000000..20b7ddc4 --- /dev/null +++ b/lib/workos/connect.ex @@ -0,0 +1,262 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.Connect do + @moduledoc """ + Operations for the Connect API. + """ + + @doc """ + Complete external authentication + + Completes an external authentication flow and returns control to AuthKit. This endpoint is used with [Standalone Connect](https://workos.com/docs/authkit/connect/standalone) to bridge your existing authentication system with the Connect OAuth API infrastructure. + + After successfully authenticating a user in your application, calling this endpoint will: + + - Create or update the user in AuthKit, using the given `id` as its `external_id`. + - Return a `redirect_uri` your application should redirect to in order for AuthKit to complete the flow + + Users are automatically created or updated based on the `id` and `email` provided. If a user with the same `id` exists, their information is updated. Otherwise, a new user is created. + + If you provide a new `id` with an `email` that already belongs to an existing user, the request will fail with an error as email addresses are unique to a user. + + ## Parameters + + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec complete_oauth2(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.ExternalAuthCompleteResponse.t()} | {:error, WorkOS.Error.error()} + def complete_oauth2(client, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request(client, :post, "/authkit/oauth2/complete", params, opts) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.ExternalAuthCompleteResponse.from_map/1)} + end + end + + @doc """ + List Connect Applications + + List all Connect Applications in the current environment with optional filtering. + + ## Parameters + + * `params` — query parameters: `:before`, `:after_`, `:limit`, `:order`, `:registration_types`, `:organization_id` + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec list_applications(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.Page.t(WorkOS.ConnectApplicationList.t())} | {:error, WorkOS.Error.error()} + def list_applications(client, params \\ %{}, opts \\ []) do + with {:ok, body} <- WorkOS.Client.request(client, :get, "/connect/applications", params, opts) do + fetch_next = fn cursor -> + list_applications( + client, + WorkOS.Page.next_params(params, "after", cursor), + opts + ) + end + + {:ok, + WorkOS.Page.from_map(body, "data", &WorkOS.ConnectApplicationList.from_map/1, fetch_next)} + end + end + + @doc """ + Create oauth application + + Create a Connect Application + + Create a new Connect Application. Supports both OAuth and Machine-to-Machine (M2M) application types. + + Sets `application_type` (`"oauth"`) automatically. + + ## Parameters + + * `params` — request body map. Required: `:name`, `:is_first_party`. Optional: `:description`, `:scopes`, `:redirect_uris`, `:uses_pkce`, `:organization_id`. + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec create_oauth_application(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.ConnectApplication.t()} | {:error, WorkOS.Error.error()} + def create_oauth_application(client, params \\ %{}, opts \\ []) do + params = + params + |> WorkOS.Client.merge_defaults(%{"application_type" => "oauth"}) + + with {:ok, body} <- + WorkOS.Client.request(client, :post, "/connect/applications", params, opts) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.ConnectApplication.from_map/1)} + end + end + + @doc """ + Create m2m application + + Create a Connect Application + + Create a new Connect Application. Supports both OAuth and Machine-to-Machine (M2M) application types. + + Sets `application_type` (`"m2m"`) automatically. + + ## Parameters + + * `params` — request body map. Required: `:name`, `:organization_id`. Optional: `:description`, `:scopes`. + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec create_m2m_application(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.ConnectApplication.t()} | {:error, WorkOS.Error.error()} + def create_m2m_application(client, params \\ %{}, opts \\ []) do + params = + params + |> WorkOS.Client.merge_defaults(%{"application_type" => "m2m"}) + + with {:ok, body} <- + WorkOS.Client.request(client, :post, "/connect/applications", params, opts) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.ConnectApplication.from_map/1)} + end + end + + @doc """ + Get a Connect Application + + Retrieve details for a specific Connect Application by ID or client ID. + + ## Parameters + + * `id` — The application ID or client ID of the Connect Application. + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec get_application(WorkOS.Client.t(), String.t(), keyword()) :: + {:ok, WorkOS.ConnectApplication.t()} | {:error, WorkOS.Error.error()} + def get_application(client, id, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :get, + "/connect/applications/#{URI.encode(id, &URI.char_unreserved?/1)}", + %{}, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.ConnectApplication.from_map/1)} + end + end + + @doc """ + Update a Connect Application + + Update an existing Connect Application. For OAuth applications, you can update redirect URIs. For all applications, you can update the name, description, and scopes. + + ## Parameters + + * `id` — The application ID or client ID of the Connect Application. + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec update_application(WorkOS.Client.t(), String.t(), map(), keyword()) :: + {:ok, WorkOS.ConnectApplication.t()} | {:error, WorkOS.Error.error()} + def update_application(client, id, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :put, + "/connect/applications/#{URI.encode(id, &URI.char_unreserved?/1)}", + params, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.ConnectApplication.from_map/1)} + end + end + + @doc """ + Delete a Connect Application + + Delete an existing Connect Application. + + ## Parameters + + * `id` — The application ID or client ID of the Connect Application. + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec delete_application(WorkOS.Client.t(), String.t(), keyword()) :: + {:ok, term()} | {:error, WorkOS.Error.error()} + def delete_application(client, id, opts \\ []) do + WorkOS.Client.request( + client, + :delete, + "/connect/applications/#{URI.encode(id, &URI.char_unreserved?/1)}", + %{}, + opts + ) + end + + @doc """ + List Client Secrets for a Connect Application + + List all client secrets associated with a Connect Application. + + ## Parameters + + * `id` — The application ID or client ID of the Connect Application. + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec list_application_client_secrets(WorkOS.Client.t(), String.t(), keyword()) :: + {:ok, [WorkOS.ApplicationCredentialsListItem.t()]} | {:error, WorkOS.Error.error()} + def list_application_client_secrets(client, id, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :get, + "/connect/applications/#{URI.encode(id, &URI.char_unreserved?/1)}/client_secrets", + %{}, + opts + ) do + {:ok, WorkOS.Cast.list(body, &WorkOS.ApplicationCredentialsListItem.from_map/1)} + end + end + + @doc """ + Create a new client secret for a Connect Application + + Create new secrets for a Connect Application. + + ## Parameters + + * `id` — The application ID or client ID of the Connect Application. + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec create_application_client_secret(WorkOS.Client.t(), String.t(), map(), keyword()) :: + {:ok, WorkOS.NewConnectApplicationSecret.t()} | {:error, WorkOS.Error.error()} + def create_application_client_secret(client, id, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :post, + "/connect/applications/#{URI.encode(id, &URI.char_unreserved?/1)}/client_secrets", + params, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.NewConnectApplicationSecret.from_map/1)} + end + end + + @doc """ + Delete a Client Secret + + Delete (revoke) an existing client secret. + + ## Parameters + + * `id` — The unique ID of the client secret. + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec delete_client_secret(WorkOS.Client.t(), String.t(), keyword()) :: + {:ok, term()} | {:error, WorkOS.Error.error()} + def delete_client_secret(client, id, opts \\ []) do + WorkOS.Client.request( + client, + :delete, + "/connect/client_secrets/#{URI.encode(id, &URI.char_unreserved?/1)}", + %{}, + opts + ) + end +end diff --git a/lib/workos/connect_application.ex b/lib/workos/connect_application.ex new file mode 100644 index 00000000..c6021a35 --- /dev/null +++ b/lib/workos/connect_application.ex @@ -0,0 +1,87 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ConnectApplication do + @moduledoc """ + ConnectApplication model. + """ + + defstruct [ + :object, + :id, + :client_id, + :description, + :name, + :scopes, + :created_at, + :updated_at, + :application_type, + :redirect_uris, + :uses_pkce, + :is_first_party, + :was_dynamically_registered, + :organization_id + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + client_id: String.t(), + description: String.t() | nil, + name: String.t(), + scopes: [String.t()], + created_at: String.t(), + updated_at: String.t(), + application_type: String.t() | nil, + redirect_uris: [WorkOS.ConnectApplicationRedirectUri.t()] | nil, + uses_pkce: boolean() | nil, + is_first_party: true | nil, + was_dynamically_registered: false | nil, + organization_id: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + client_id: map["client_id"], + description: map["description"], + name: map["name"], + scopes: map["scopes"], + created_at: map["created_at"], + updated_at: map["updated_at"], + application_type: map["application_type"], + redirect_uris: + WorkOS.Cast.list(map["redirect_uris"], &WorkOS.ConnectApplicationRedirectUri.from_map/1), + uses_pkce: map["uses_pkce"], + is_first_party: map["is_first_party"], + was_dynamically_registered: map["was_dynamically_registered"], + organization_id: map["organization_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "client_id" => struct.client_id, + "description" => struct.description, + "name" => struct.name, + "scopes" => struct.scopes, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at, + "application_type" => struct.application_type, + "redirect_uris" => + WorkOS.Cast.list(struct.redirect_uris, fn item -> + WorkOS.Cast.dump_struct(item, &WorkOS.ConnectApplicationRedirectUri.to_map/1) + end), + "uses_pkce" => struct.uses_pkce, + "is_first_party" => struct.is_first_party, + "was_dynamically_registered" => struct.was_dynamically_registered, + "organization_id" => struct.organization_id + }) + end +end diff --git a/lib/workos/connect_application_list.ex b/lib/workos/connect_application_list.ex new file mode 100644 index 00000000..d2931bf0 --- /dev/null +++ b/lib/workos/connect_application_list.ex @@ -0,0 +1,50 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ConnectApplicationList do + @moduledoc """ + ConnectApplicationList model. + """ + + defstruct [ + :object, + :data, + :list_metadata + ] + + @type t :: %__MODULE__{ + object: String.t(), + data: [WorkOS.ConnectApplication.t()], + list_metadata: WorkOS.ConnectApplicationListListMetadata.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + data: WorkOS.Cast.list(map["data"], &WorkOS.ConnectApplication.from_map/1), + list_metadata: + WorkOS.Cast.nested( + map["list_metadata"], + &WorkOS.ConnectApplicationListListMetadata.from_map/1 + ) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "data" => + WorkOS.Cast.list(struct.data, fn item -> + WorkOS.Cast.dump_struct(item, &WorkOS.ConnectApplication.to_map/1) + end), + "list_metadata" => + WorkOS.Cast.dump_struct( + struct.list_metadata, + &WorkOS.ConnectApplicationListListMetadata.to_map/1 + ) + }) + end +end diff --git a/lib/workos/connect_application_list_list_metadata.ex b/lib/workos/connect_application_list_list_metadata.ex new file mode 100644 index 00000000..0360cd3b --- /dev/null +++ b/lib/workos/connect_application_list_list_metadata.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ConnectApplicationListListMetadata do + @moduledoc """ + Pagination cursors for navigating between pages of results. + """ + + defstruct [ + :before, + :after_ + ] + + @type t :: %__MODULE__{ + before: String.t() | nil, + after_: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + before: map["before"], + after_: map["after"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "before" => struct.before, + "after" => struct.after_ + }) + end +end diff --git a/lib/workos/connect_application_m2m.ex b/lib/workos/connect_application_m2m.ex new file mode 100644 index 00000000..ddb03cd0 --- /dev/null +++ b/lib/workos/connect_application_m2m.ex @@ -0,0 +1,67 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ConnectApplicationM2M do + @moduledoc """ + ConnectApplicationM2M model. + """ + + defstruct [ + :object, + :id, + :client_id, + :description, + :name, + :scopes, + :created_at, + :updated_at, + :application_type, + :organization_id + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + client_id: String.t(), + description: String.t() | nil, + name: String.t(), + scopes: [String.t()], + created_at: String.t(), + updated_at: String.t(), + application_type: String.t(), + organization_id: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + client_id: map["client_id"], + description: map["description"], + name: map["name"], + scopes: map["scopes"], + created_at: map["created_at"], + updated_at: map["updated_at"], + application_type: map["application_type"], + organization_id: map["organization_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "client_id" => struct.client_id, + "description" => struct.description, + "name" => struct.name, + "scopes" => struct.scopes, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at, + "application_type" => struct.application_type, + "organization_id" => struct.organization_id + }) + end +end diff --git a/lib/workos/connect_application_oauth.ex b/lib/workos/connect_application_oauth.ex new file mode 100644 index 00000000..5dd8fedd --- /dev/null +++ b/lib/workos/connect_application_oauth.ex @@ -0,0 +1,90 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ConnectApplicationOAuth do + @moduledoc """ + ConnectApplicationOAuth model. + """ + + defstruct [ + :object, + :id, + :client_id, + :description, + :name, + :scopes, + :created_at, + :updated_at, + :application_type, + :redirect_uris, + :uses_pkce, + :is_first_party, + :was_dynamically_registered, + :organization_id + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + client_id: String.t(), + description: String.t() | nil, + name: String.t(), + scopes: [String.t()], + created_at: String.t(), + updated_at: String.t(), + application_type: String.t(), + redirect_uris: [WorkOS.ConnectApplicationOAuthRedirectUris.t()], + uses_pkce: boolean(), + is_first_party: boolean(), + was_dynamically_registered: boolean() | nil, + organization_id: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + client_id: map["client_id"], + description: map["description"], + name: map["name"], + scopes: map["scopes"], + created_at: map["created_at"], + updated_at: map["updated_at"], + application_type: map["application_type"], + redirect_uris: + WorkOS.Cast.list( + map["redirect_uris"], + &WorkOS.ConnectApplicationOAuthRedirectUris.from_map/1 + ), + uses_pkce: map["uses_pkce"], + is_first_party: map["is_first_party"], + was_dynamically_registered: map["was_dynamically_registered"], + organization_id: map["organization_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "client_id" => struct.client_id, + "description" => struct.description, + "name" => struct.name, + "scopes" => struct.scopes, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at, + "application_type" => struct.application_type, + "redirect_uris" => + WorkOS.Cast.list(struct.redirect_uris, fn item -> + WorkOS.Cast.dump_struct(item, &WorkOS.ConnectApplicationOAuthRedirectUris.to_map/1) + end), + "uses_pkce" => struct.uses_pkce, + "is_first_party" => struct.is_first_party, + "was_dynamically_registered" => struct.was_dynamically_registered, + "organization_id" => struct.organization_id + }) + end +end diff --git a/lib/workos/connect_application_oauth_redirect_uris.ex b/lib/workos/connect_application_oauth_redirect_uris.ex new file mode 100644 index 00000000..54dbd2ff --- /dev/null +++ b/lib/workos/connect_application_oauth_redirect_uris.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ConnectApplicationOAuthRedirectUris do + @moduledoc """ + ConnectApplicationOAuthRedirectUris model. + """ + + defstruct [ + :uri, + :default + ] + + @type t :: %__MODULE__{ + uri: String.t(), + default: boolean() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + uri: map["uri"], + default: map["default"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "uri" => struct.uri, + "default" => struct.default + }) + end +end diff --git a/lib/workos/connect_application_redirect_uri.ex b/lib/workos/connect_application_redirect_uri.ex new file mode 100644 index 00000000..ddd17ebe --- /dev/null +++ b/lib/workos/connect_application_redirect_uri.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ConnectApplicationRedirectUri do + @moduledoc """ + ConnectApplicationRedirectUri model. + """ + + defstruct [ + :uri, + :default + ] + + @type t :: %__MODULE__{ + uri: String.t(), + default: boolean() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + uri: map["uri"], + default: map["default"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "uri" => struct.uri, + "default" => struct.default + }) + end +end diff --git a/lib/workos/connected_account.ex b/lib/workos/connected_account.ex new file mode 100644 index 00000000..b2f562a9 --- /dev/null +++ b/lib/workos/connected_account.ex @@ -0,0 +1,69 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ConnectedAccount do + @moduledoc """ + ConnectedAccount model. + """ + + defstruct [ + :object, + :id, + :user_id, + :organization_id, + :scopes, + :state, + :created_at, + :updated_at, + :auth_method, + :api_key_last_4 + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + user_id: String.t() | nil, + organization_id: String.t() | nil, + scopes: [String.t()], + state: WorkOS.ConnectedAccountState.t(), + created_at: String.t(), + updated_at: String.t(), + auth_method: WorkOS.ConnectedAccountAuthMethod.t() | nil, + api_key_last_4: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + user_id: map["user_id"], + organization_id: map["organization_id"], + scopes: map["scopes"], + state: WorkOS.Cast.enum(map["state"], &WorkOS.ConnectedAccountState.cast/1), + created_at: map["created_at"], + updated_at: map["updated_at"], + auth_method: + WorkOS.Cast.enum(map["auth_method"], &WorkOS.ConnectedAccountAuthMethod.cast/1), + api_key_last_4: map["api_key_last_4"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "user_id" => struct.user_id, + "organization_id" => struct.organization_id, + "scopes" => struct.scopes, + "state" => WorkOS.Cast.enum(struct.state, &WorkOS.ConnectedAccountState.dump/1), + "created_at" => struct.created_at, + "updated_at" => struct.updated_at, + "auth_method" => + WorkOS.Cast.enum(struct.auth_method, &WorkOS.ConnectedAccountAuthMethod.dump/1), + "api_key_last_4" => struct.api_key_last_4 + }) + end +end diff --git a/lib/workos/connected_account_auth_method.ex b/lib/workos/connected_account_auth_method.ex new file mode 100644 index 00000000..b53aa9a1 --- /dev/null +++ b/lib/workos/connected_account_auth_method.ex @@ -0,0 +1,27 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ConnectedAccountAuthMethod do + @moduledoc """ + ConnectedAccountAuthMethod enum. + """ + + @type t :: :oauth | :api_key | :client_credentials + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:oauth, :api_key, :client_credentials] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("oauth"), do: :oauth + def cast("api_key"), do: :api_key + def cast("client_credentials"), do: :client_credentials + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:oauth), do: "oauth" + def dump(:api_key), do: "api_key" + def dump(:client_credentials), do: "client_credentials" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/connected_account_input.ex b/lib/workos/connected_account_input.ex new file mode 100644 index 00000000..4570be00 --- /dev/null +++ b/lib/workos/connected_account_input.ex @@ -0,0 +1,47 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ConnectedAccountInput do + @moduledoc """ + ConnectedAccountInput model. + """ + + defstruct [ + :access_token, + :refresh_token, + :expires_at, + :scopes, + :state + ] + + @type t :: %__MODULE__{ + access_token: String.t() | nil, + refresh_token: String.t() | nil, + expires_at: String.t() | nil, + scopes: [String.t()] | nil, + state: WorkOS.ConnectedAccountInputState.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + access_token: map["access_token"], + refresh_token: map["refresh_token"], + expires_at: map["expires_at"], + scopes: map["scopes"], + state: WorkOS.Cast.enum(map["state"], &WorkOS.ConnectedAccountInputState.cast/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "access_token" => struct.access_token, + "refresh_token" => struct.refresh_token, + "expires_at" => struct.expires_at, + "scopes" => struct.scopes, + "state" => WorkOS.Cast.enum(struct.state, &WorkOS.ConnectedAccountInputState.dump/1) + }) + end +end diff --git a/lib/workos/connected_account_input_state.ex b/lib/workos/connected_account_input_state.ex new file mode 100644 index 00000000..e8679e57 --- /dev/null +++ b/lib/workos/connected_account_input_state.ex @@ -0,0 +1,25 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ConnectedAccountInputState do + @moduledoc """ + ConnectedAccountInputState enum. + """ + + @type t :: :connected | :needs_reauthorization + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:connected, :needs_reauthorization] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("connected"), do: :connected + def cast("needs_reauthorization"), do: :needs_reauthorization + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:connected), do: "connected" + def dump(:needs_reauthorization), do: "needs_reauthorization" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/connected_account_state.ex b/lib/workos/connected_account_state.ex new file mode 100644 index 00000000..eb53455c --- /dev/null +++ b/lib/workos/connected_account_state.ex @@ -0,0 +1,27 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ConnectedAccountState do + @moduledoc """ + ConnectedAccountState enum. + """ + + @type t :: :connected | :needs_reauthorization | :disconnected + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:connected, :needs_reauthorization, :disconnected] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("connected"), do: :connected + def cast("needs_reauthorization"), do: :needs_reauthorization + def cast("disconnected"), do: :disconnected + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:connected), do: "connected" + def dump(:needs_reauthorization), do: "needs_reauthorization" + def dump(:disconnected), do: "disconnected" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/connection.ex b/lib/workos/connection.ex new file mode 100644 index 00000000..34eb17f2 --- /dev/null +++ b/lib/workos/connection.ex @@ -0,0 +1,75 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.Connection do + @moduledoc """ + Connection model. + + ## Deprecated fields + + * `:status` — Deprecated. Use `state` instead. + """ + + defstruct [ + :object, + :id, + :connection_type, + :name, + :state, + :status, + :domains, + :created_at, + :updated_at, + :organization_id + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + connection_type: WorkOS.ConnectionType.t(), + name: String.t(), + state: WorkOS.ConnectionState.t(), + status: WorkOS.ConnectionStatus.t(), + domains: [WorkOS.ConnectionDomain.t()], + created_at: String.t(), + updated_at: String.t(), + organization_id: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + connection_type: WorkOS.Cast.enum(map["connection_type"], &WorkOS.ConnectionType.cast/1), + name: map["name"], + state: WorkOS.Cast.enum(map["state"], &WorkOS.ConnectionState.cast/1), + status: WorkOS.Cast.enum(map["status"], &WorkOS.ConnectionStatus.cast/1), + domains: WorkOS.Cast.list(map["domains"], &WorkOS.ConnectionDomain.from_map/1), + created_at: map["created_at"], + updated_at: map["updated_at"], + organization_id: map["organization_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "connection_type" => + WorkOS.Cast.enum(struct.connection_type, &WorkOS.ConnectionType.dump/1), + "name" => struct.name, + "state" => WorkOS.Cast.enum(struct.state, &WorkOS.ConnectionState.dump/1), + "status" => WorkOS.Cast.enum(struct.status, &WorkOS.ConnectionStatus.dump/1), + "domains" => + WorkOS.Cast.list(struct.domains, fn item -> + WorkOS.Cast.dump_struct(item, &WorkOS.ConnectionDomain.to_map/1) + end), + "created_at" => struct.created_at, + "updated_at" => struct.updated_at, + "organization_id" => struct.organization_id + }) + end +end diff --git a/lib/workos/connection_activated.ex b/lib/workos/connection_activated.ex new file mode 100644 index 00000000..911c613d --- /dev/null +++ b/lib/workos/connection_activated.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ConnectionActivated do + @moduledoc """ + ConnectionActivated model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.ConnectionActivatedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.ConnectionActivatedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => WorkOS.Cast.dump_struct(struct.data, &WorkOS.ConnectionActivatedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/connection_activated_data.ex b/lib/workos/connection_activated_data.ex new file mode 100644 index 00000000..12d65026 --- /dev/null +++ b/lib/workos/connection_activated_data.ex @@ -0,0 +1,82 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ConnectionActivatedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :object, + :id, + :state, + :name, + :connection_type, + :created_at, + :updated_at, + :external_key, + :status, + :domains, + :organization_id + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + state: WorkOS.ConnectionActivatedDataState.t(), + name: String.t(), + connection_type: WorkOS.ConnectionActivatedDataConnectionType.t(), + created_at: String.t(), + updated_at: String.t(), + external_key: String.t(), + status: WorkOS.ConnectionActivatedDataStatus.t(), + domains: [WorkOS.ConnectionActivatedDataDomain.t()], + organization_id: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + state: WorkOS.Cast.enum(map["state"], &WorkOS.ConnectionActivatedDataState.cast/1), + name: map["name"], + connection_type: + WorkOS.Cast.enum( + map["connection_type"], + &WorkOS.ConnectionActivatedDataConnectionType.cast/1 + ), + created_at: map["created_at"], + updated_at: map["updated_at"], + external_key: map["external_key"], + status: WorkOS.Cast.enum(map["status"], &WorkOS.ConnectionActivatedDataStatus.cast/1), + domains: WorkOS.Cast.list(map["domains"], &WorkOS.ConnectionActivatedDataDomain.from_map/1), + organization_id: map["organization_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "state" => WorkOS.Cast.enum(struct.state, &WorkOS.ConnectionActivatedDataState.dump/1), + "name" => struct.name, + "connection_type" => + WorkOS.Cast.enum( + struct.connection_type, + &WorkOS.ConnectionActivatedDataConnectionType.dump/1 + ), + "created_at" => struct.created_at, + "updated_at" => struct.updated_at, + "external_key" => struct.external_key, + "status" => WorkOS.Cast.enum(struct.status, &WorkOS.ConnectionActivatedDataStatus.dump/1), + "domains" => + WorkOS.Cast.list(struct.domains, fn item -> + WorkOS.Cast.dump_struct(item, &WorkOS.ConnectionActivatedDataDomain.to_map/1) + end), + "organization_id" => struct.organization_id + }) + end +end diff --git a/lib/workos/connection_activated_data_connection_type.ex b/lib/workos/connection_activated_data_connection_type.ex new file mode 100644 index 00000000..cc869e91 --- /dev/null +++ b/lib/workos/connection_activated_data_connection_type.ex @@ -0,0 +1,223 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ConnectionActivatedDataConnectionType do + @moduledoc """ + ConnectionActivatedDataConnectionType enum. + """ + + @type t :: + :adfssaml + | :adp_oidc + | :apple_oauth + | :auth_0_migration + | :auth_0_saml + | :azure_saml + | :bitbucket_oauth + | :cas_saml + | :class_link_saml + | :clever_oidc + | :cloudflare_saml + | :cyber_ark_saml + | :discord_oauth + | :duo_saml + | :entra_id_oidc + | :generic_oidc + | :generic_saml + | :git_hub_oauth + | :git_lab_oauth + | :google_oauth + | :google_oidc + | :google_saml + | :intuit_oauth + | :jump_cloud_saml + | :keycloak_saml + | :last_pass_saml + | :linked_in_oauth + | :login_gov_oidc + | :magic_link + | :microsoft_oauth + | :mini_orange_saml + | :net_iq_saml + | :okta_oidc + | :okta_saml + | :one_login_saml + | :oracle_saml + | :ping_federate_saml + | :ping_one_saml + | :rippling_saml + | :salesforce_saml + | :shibboleth_generic_saml + | :shibboleth_saml + | :simple_saml_php_saml + | :salesforce_oauth + | :slack_oauth + | :test_idp + | :vercel_marketplace_oauth + | :vercel_oauth + | :v_mware_saml + | :xero_oauth + + @doc "All known values." + @spec values() :: [t()] + def values, + do: [ + :adfssaml, + :adp_oidc, + :apple_oauth, + :auth_0_migration, + :auth_0_saml, + :azure_saml, + :bitbucket_oauth, + :cas_saml, + :class_link_saml, + :clever_oidc, + :cloudflare_saml, + :cyber_ark_saml, + :discord_oauth, + :duo_saml, + :entra_id_oidc, + :generic_oidc, + :generic_saml, + :git_hub_oauth, + :git_lab_oauth, + :google_oauth, + :google_oidc, + :google_saml, + :intuit_oauth, + :jump_cloud_saml, + :keycloak_saml, + :last_pass_saml, + :linked_in_oauth, + :login_gov_oidc, + :magic_link, + :microsoft_oauth, + :mini_orange_saml, + :net_iq_saml, + :okta_oidc, + :okta_saml, + :one_login_saml, + :oracle_saml, + :ping_federate_saml, + :ping_one_saml, + :rippling_saml, + :salesforce_saml, + :shibboleth_generic_saml, + :shibboleth_saml, + :simple_saml_php_saml, + :salesforce_oauth, + :slack_oauth, + :test_idp, + :vercel_marketplace_oauth, + :vercel_oauth, + :v_mware_saml, + :xero_oauth + ] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("ADFSSAML"), do: :adfssaml + def cast("AdpOidc"), do: :adp_oidc + def cast("AppleOAuth"), do: :apple_oauth + def cast("Auth0Migration"), do: :auth_0_migration + def cast("Auth0SAML"), do: :auth_0_saml + def cast("AzureSAML"), do: :azure_saml + def cast("BitbucketOAuth"), do: :bitbucket_oauth + def cast("CasSAML"), do: :cas_saml + def cast("ClassLinkSAML"), do: :class_link_saml + def cast("CleverOIDC"), do: :clever_oidc + def cast("CloudflareSAML"), do: :cloudflare_saml + def cast("CyberArkSAML"), do: :cyber_ark_saml + def cast("DiscordOAuth"), do: :discord_oauth + def cast("DuoSAML"), do: :duo_saml + def cast("EntraIdOIDC"), do: :entra_id_oidc + def cast("GenericOIDC"), do: :generic_oidc + def cast("GenericSAML"), do: :generic_saml + def cast("GitHubOAuth"), do: :git_hub_oauth + def cast("GitLabOAuth"), do: :git_lab_oauth + def cast("GoogleOAuth"), do: :google_oauth + def cast("GoogleOIDC"), do: :google_oidc + def cast("GoogleSAML"), do: :google_saml + def cast("IntuitOAuth"), do: :intuit_oauth + def cast("JumpCloudSAML"), do: :jump_cloud_saml + def cast("KeycloakSAML"), do: :keycloak_saml + def cast("LastPassSAML"), do: :last_pass_saml + def cast("LinkedInOAuth"), do: :linked_in_oauth + def cast("LoginGovOidc"), do: :login_gov_oidc + def cast("MagicLink"), do: :magic_link + def cast("MicrosoftOAuth"), do: :microsoft_oauth + def cast("MiniOrangeSAML"), do: :mini_orange_saml + def cast("NetIqSAML"), do: :net_iq_saml + def cast("OktaOIDC"), do: :okta_oidc + def cast("OktaSAML"), do: :okta_saml + def cast("OneLoginSAML"), do: :one_login_saml + def cast("OracleSAML"), do: :oracle_saml + def cast("PingFederateSAML"), do: :ping_federate_saml + def cast("PingOneSAML"), do: :ping_one_saml + def cast("RipplingSAML"), do: :rippling_saml + def cast("SalesforceSAML"), do: :salesforce_saml + def cast("ShibbolethGenericSAML"), do: :shibboleth_generic_saml + def cast("ShibbolethSAML"), do: :shibboleth_saml + def cast("SimpleSamlPhpSAML"), do: :simple_saml_php_saml + def cast("SalesforceOAuth"), do: :salesforce_oauth + def cast("SlackOAuth"), do: :slack_oauth + def cast("TestIdp"), do: :test_idp + def cast("VercelMarketplaceOAuth"), do: :vercel_marketplace_oauth + def cast("VercelOAuth"), do: :vercel_oauth + def cast("VMwareSAML"), do: :v_mware_saml + def cast("XeroOAuth"), do: :xero_oauth + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:adfssaml), do: "ADFSSAML" + def dump(:adp_oidc), do: "AdpOidc" + def dump(:apple_oauth), do: "AppleOAuth" + def dump(:auth_0_migration), do: "Auth0Migration" + def dump(:auth_0_saml), do: "Auth0SAML" + def dump(:azure_saml), do: "AzureSAML" + def dump(:bitbucket_oauth), do: "BitbucketOAuth" + def dump(:cas_saml), do: "CasSAML" + def dump(:class_link_saml), do: "ClassLinkSAML" + def dump(:clever_oidc), do: "CleverOIDC" + def dump(:cloudflare_saml), do: "CloudflareSAML" + def dump(:cyber_ark_saml), do: "CyberArkSAML" + def dump(:discord_oauth), do: "DiscordOAuth" + def dump(:duo_saml), do: "DuoSAML" + def dump(:entra_id_oidc), do: "EntraIdOIDC" + def dump(:generic_oidc), do: "GenericOIDC" + def dump(:generic_saml), do: "GenericSAML" + def dump(:git_hub_oauth), do: "GitHubOAuth" + def dump(:git_lab_oauth), do: "GitLabOAuth" + def dump(:google_oauth), do: "GoogleOAuth" + def dump(:google_oidc), do: "GoogleOIDC" + def dump(:google_saml), do: "GoogleSAML" + def dump(:intuit_oauth), do: "IntuitOAuth" + def dump(:jump_cloud_saml), do: "JumpCloudSAML" + def dump(:keycloak_saml), do: "KeycloakSAML" + def dump(:last_pass_saml), do: "LastPassSAML" + def dump(:linked_in_oauth), do: "LinkedInOAuth" + def dump(:login_gov_oidc), do: "LoginGovOidc" + def dump(:magic_link), do: "MagicLink" + def dump(:microsoft_oauth), do: "MicrosoftOAuth" + def dump(:mini_orange_saml), do: "MiniOrangeSAML" + def dump(:net_iq_saml), do: "NetIqSAML" + def dump(:okta_oidc), do: "OktaOIDC" + def dump(:okta_saml), do: "OktaSAML" + def dump(:one_login_saml), do: "OneLoginSAML" + def dump(:oracle_saml), do: "OracleSAML" + def dump(:ping_federate_saml), do: "PingFederateSAML" + def dump(:ping_one_saml), do: "PingOneSAML" + def dump(:rippling_saml), do: "RipplingSAML" + def dump(:salesforce_saml), do: "SalesforceSAML" + def dump(:shibboleth_generic_saml), do: "ShibbolethGenericSAML" + def dump(:shibboleth_saml), do: "ShibbolethSAML" + def dump(:simple_saml_php_saml), do: "SimpleSamlPhpSAML" + def dump(:salesforce_oauth), do: "SalesforceOAuth" + def dump(:slack_oauth), do: "SlackOAuth" + def dump(:test_idp), do: "TestIdp" + def dump(:vercel_marketplace_oauth), do: "VercelMarketplaceOAuth" + def dump(:vercel_oauth), do: "VercelOAuth" + def dump(:v_mware_saml), do: "VMwareSAML" + def dump(:xero_oauth), do: "XeroOAuth" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/connection_activated_data_domain.ex b/lib/workos/connection_activated_data_domain.ex new file mode 100644 index 00000000..89590d84 --- /dev/null +++ b/lib/workos/connection_activated_data_domain.ex @@ -0,0 +1,39 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ConnectionActivatedDataDomain do + @moduledoc """ + ConnectionActivatedDataDomain model. + """ + + defstruct [ + :object, + :id, + :domain + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + domain: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + domain: map["domain"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "domain" => struct.domain + }) + end +end diff --git a/lib/workos/connection_activated_data_state.ex b/lib/workos/connection_activated_data_state.ex new file mode 100644 index 00000000..f703b8cd --- /dev/null +++ b/lib/workos/connection_activated_data_state.ex @@ -0,0 +1,31 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ConnectionActivatedDataState do + @moduledoc """ + ConnectionActivatedDataState enum. + """ + + @type t :: :draft | :active | :validating | :inactive | :deleting + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:draft, :active, :validating, :inactive, :deleting] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("draft"), do: :draft + def cast("active"), do: :active + def cast("validating"), do: :validating + def cast("inactive"), do: :inactive + def cast("deleting"), do: :deleting + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:draft), do: "draft" + def dump(:active), do: "active" + def dump(:validating), do: "validating" + def dump(:inactive), do: "inactive" + def dump(:deleting), do: "deleting" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/connection_activated_data_status.ex b/lib/workos/connection_activated_data_status.ex new file mode 100644 index 00000000..c3213ee6 --- /dev/null +++ b/lib/workos/connection_activated_data_status.ex @@ -0,0 +1,25 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ConnectionActivatedDataStatus do + @moduledoc """ + ConnectionActivatedDataStatus enum. + """ + + @type t :: :linked | :unlinked + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:linked, :unlinked] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("linked"), do: :linked + def cast("unlinked"), do: :unlinked + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:linked), do: "linked" + def dump(:unlinked), do: "unlinked" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/connection_deactivated.ex b/lib/workos/connection_deactivated.ex new file mode 100644 index 00000000..8091f6d7 --- /dev/null +++ b/lib/workos/connection_deactivated.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ConnectionDeactivated do + @moduledoc """ + ConnectionDeactivated model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.ConnectionDeactivatedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.ConnectionDeactivatedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => WorkOS.Cast.dump_struct(struct.data, &WorkOS.ConnectionDeactivatedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/connection_deactivated_data.ex b/lib/workos/connection_deactivated_data.ex new file mode 100644 index 00000000..f2a8e2d4 --- /dev/null +++ b/lib/workos/connection_deactivated_data.ex @@ -0,0 +1,83 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ConnectionDeactivatedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :object, + :id, + :state, + :name, + :connection_type, + :created_at, + :updated_at, + :external_key, + :status, + :domains, + :organization_id + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + state: WorkOS.ConnectionDeactivatedDataState.t(), + name: String.t(), + connection_type: WorkOS.ConnectionDeactivatedDataConnectionType.t(), + created_at: String.t(), + updated_at: String.t(), + external_key: String.t(), + status: WorkOS.ConnectionDeactivatedDataStatus.t(), + domains: [WorkOS.ConnectionDeactivatedDataDomain.t()], + organization_id: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + state: WorkOS.Cast.enum(map["state"], &WorkOS.ConnectionDeactivatedDataState.cast/1), + name: map["name"], + connection_type: + WorkOS.Cast.enum( + map["connection_type"], + &WorkOS.ConnectionDeactivatedDataConnectionType.cast/1 + ), + created_at: map["created_at"], + updated_at: map["updated_at"], + external_key: map["external_key"], + status: WorkOS.Cast.enum(map["status"], &WorkOS.ConnectionDeactivatedDataStatus.cast/1), + domains: + WorkOS.Cast.list(map["domains"], &WorkOS.ConnectionDeactivatedDataDomain.from_map/1), + organization_id: map["organization_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "state" => WorkOS.Cast.enum(struct.state, &WorkOS.ConnectionDeactivatedDataState.dump/1), + "name" => struct.name, + "connection_type" => + WorkOS.Cast.enum( + struct.connection_type, + &WorkOS.ConnectionDeactivatedDataConnectionType.dump/1 + ), + "created_at" => struct.created_at, + "updated_at" => struct.updated_at, + "external_key" => struct.external_key, + "status" => WorkOS.Cast.enum(struct.status, &WorkOS.ConnectionDeactivatedDataStatus.dump/1), + "domains" => + WorkOS.Cast.list(struct.domains, fn item -> + WorkOS.Cast.dump_struct(item, &WorkOS.ConnectionDeactivatedDataDomain.to_map/1) + end), + "organization_id" => struct.organization_id + }) + end +end diff --git a/lib/workos/connection_deactivated_data_connection_type.ex b/lib/workos/connection_deactivated_data_connection_type.ex new file mode 100644 index 00000000..70455bc9 --- /dev/null +++ b/lib/workos/connection_deactivated_data_connection_type.ex @@ -0,0 +1,223 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ConnectionDeactivatedDataConnectionType do + @moduledoc """ + ConnectionDeactivatedDataConnectionType enum. + """ + + @type t :: + :adfssaml + | :adp_oidc + | :apple_oauth + | :auth_0_migration + | :auth_0_saml + | :azure_saml + | :bitbucket_oauth + | :cas_saml + | :class_link_saml + | :clever_oidc + | :cloudflare_saml + | :cyber_ark_saml + | :discord_oauth + | :duo_saml + | :entra_id_oidc + | :generic_oidc + | :generic_saml + | :git_hub_oauth + | :git_lab_oauth + | :google_oauth + | :google_oidc + | :google_saml + | :intuit_oauth + | :jump_cloud_saml + | :keycloak_saml + | :last_pass_saml + | :linked_in_oauth + | :login_gov_oidc + | :magic_link + | :microsoft_oauth + | :mini_orange_saml + | :net_iq_saml + | :okta_oidc + | :okta_saml + | :one_login_saml + | :oracle_saml + | :ping_federate_saml + | :ping_one_saml + | :rippling_saml + | :salesforce_saml + | :shibboleth_generic_saml + | :shibboleth_saml + | :simple_saml_php_saml + | :salesforce_oauth + | :slack_oauth + | :test_idp + | :vercel_marketplace_oauth + | :vercel_oauth + | :v_mware_saml + | :xero_oauth + + @doc "All known values." + @spec values() :: [t()] + def values, + do: [ + :adfssaml, + :adp_oidc, + :apple_oauth, + :auth_0_migration, + :auth_0_saml, + :azure_saml, + :bitbucket_oauth, + :cas_saml, + :class_link_saml, + :clever_oidc, + :cloudflare_saml, + :cyber_ark_saml, + :discord_oauth, + :duo_saml, + :entra_id_oidc, + :generic_oidc, + :generic_saml, + :git_hub_oauth, + :git_lab_oauth, + :google_oauth, + :google_oidc, + :google_saml, + :intuit_oauth, + :jump_cloud_saml, + :keycloak_saml, + :last_pass_saml, + :linked_in_oauth, + :login_gov_oidc, + :magic_link, + :microsoft_oauth, + :mini_orange_saml, + :net_iq_saml, + :okta_oidc, + :okta_saml, + :one_login_saml, + :oracle_saml, + :ping_federate_saml, + :ping_one_saml, + :rippling_saml, + :salesforce_saml, + :shibboleth_generic_saml, + :shibboleth_saml, + :simple_saml_php_saml, + :salesforce_oauth, + :slack_oauth, + :test_idp, + :vercel_marketplace_oauth, + :vercel_oauth, + :v_mware_saml, + :xero_oauth + ] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("ADFSSAML"), do: :adfssaml + def cast("AdpOidc"), do: :adp_oidc + def cast("AppleOAuth"), do: :apple_oauth + def cast("Auth0Migration"), do: :auth_0_migration + def cast("Auth0SAML"), do: :auth_0_saml + def cast("AzureSAML"), do: :azure_saml + def cast("BitbucketOAuth"), do: :bitbucket_oauth + def cast("CasSAML"), do: :cas_saml + def cast("ClassLinkSAML"), do: :class_link_saml + def cast("CleverOIDC"), do: :clever_oidc + def cast("CloudflareSAML"), do: :cloudflare_saml + def cast("CyberArkSAML"), do: :cyber_ark_saml + def cast("DiscordOAuth"), do: :discord_oauth + def cast("DuoSAML"), do: :duo_saml + def cast("EntraIdOIDC"), do: :entra_id_oidc + def cast("GenericOIDC"), do: :generic_oidc + def cast("GenericSAML"), do: :generic_saml + def cast("GitHubOAuth"), do: :git_hub_oauth + def cast("GitLabOAuth"), do: :git_lab_oauth + def cast("GoogleOAuth"), do: :google_oauth + def cast("GoogleOIDC"), do: :google_oidc + def cast("GoogleSAML"), do: :google_saml + def cast("IntuitOAuth"), do: :intuit_oauth + def cast("JumpCloudSAML"), do: :jump_cloud_saml + def cast("KeycloakSAML"), do: :keycloak_saml + def cast("LastPassSAML"), do: :last_pass_saml + def cast("LinkedInOAuth"), do: :linked_in_oauth + def cast("LoginGovOidc"), do: :login_gov_oidc + def cast("MagicLink"), do: :magic_link + def cast("MicrosoftOAuth"), do: :microsoft_oauth + def cast("MiniOrangeSAML"), do: :mini_orange_saml + def cast("NetIqSAML"), do: :net_iq_saml + def cast("OktaOIDC"), do: :okta_oidc + def cast("OktaSAML"), do: :okta_saml + def cast("OneLoginSAML"), do: :one_login_saml + def cast("OracleSAML"), do: :oracle_saml + def cast("PingFederateSAML"), do: :ping_federate_saml + def cast("PingOneSAML"), do: :ping_one_saml + def cast("RipplingSAML"), do: :rippling_saml + def cast("SalesforceSAML"), do: :salesforce_saml + def cast("ShibbolethGenericSAML"), do: :shibboleth_generic_saml + def cast("ShibbolethSAML"), do: :shibboleth_saml + def cast("SimpleSamlPhpSAML"), do: :simple_saml_php_saml + def cast("SalesforceOAuth"), do: :salesforce_oauth + def cast("SlackOAuth"), do: :slack_oauth + def cast("TestIdp"), do: :test_idp + def cast("VercelMarketplaceOAuth"), do: :vercel_marketplace_oauth + def cast("VercelOAuth"), do: :vercel_oauth + def cast("VMwareSAML"), do: :v_mware_saml + def cast("XeroOAuth"), do: :xero_oauth + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:adfssaml), do: "ADFSSAML" + def dump(:adp_oidc), do: "AdpOidc" + def dump(:apple_oauth), do: "AppleOAuth" + def dump(:auth_0_migration), do: "Auth0Migration" + def dump(:auth_0_saml), do: "Auth0SAML" + def dump(:azure_saml), do: "AzureSAML" + def dump(:bitbucket_oauth), do: "BitbucketOAuth" + def dump(:cas_saml), do: "CasSAML" + def dump(:class_link_saml), do: "ClassLinkSAML" + def dump(:clever_oidc), do: "CleverOIDC" + def dump(:cloudflare_saml), do: "CloudflareSAML" + def dump(:cyber_ark_saml), do: "CyberArkSAML" + def dump(:discord_oauth), do: "DiscordOAuth" + def dump(:duo_saml), do: "DuoSAML" + def dump(:entra_id_oidc), do: "EntraIdOIDC" + def dump(:generic_oidc), do: "GenericOIDC" + def dump(:generic_saml), do: "GenericSAML" + def dump(:git_hub_oauth), do: "GitHubOAuth" + def dump(:git_lab_oauth), do: "GitLabOAuth" + def dump(:google_oauth), do: "GoogleOAuth" + def dump(:google_oidc), do: "GoogleOIDC" + def dump(:google_saml), do: "GoogleSAML" + def dump(:intuit_oauth), do: "IntuitOAuth" + def dump(:jump_cloud_saml), do: "JumpCloudSAML" + def dump(:keycloak_saml), do: "KeycloakSAML" + def dump(:last_pass_saml), do: "LastPassSAML" + def dump(:linked_in_oauth), do: "LinkedInOAuth" + def dump(:login_gov_oidc), do: "LoginGovOidc" + def dump(:magic_link), do: "MagicLink" + def dump(:microsoft_oauth), do: "MicrosoftOAuth" + def dump(:mini_orange_saml), do: "MiniOrangeSAML" + def dump(:net_iq_saml), do: "NetIqSAML" + def dump(:okta_oidc), do: "OktaOIDC" + def dump(:okta_saml), do: "OktaSAML" + def dump(:one_login_saml), do: "OneLoginSAML" + def dump(:oracle_saml), do: "OracleSAML" + def dump(:ping_federate_saml), do: "PingFederateSAML" + def dump(:ping_one_saml), do: "PingOneSAML" + def dump(:rippling_saml), do: "RipplingSAML" + def dump(:salesforce_saml), do: "SalesforceSAML" + def dump(:shibboleth_generic_saml), do: "ShibbolethGenericSAML" + def dump(:shibboleth_saml), do: "ShibbolethSAML" + def dump(:simple_saml_php_saml), do: "SimpleSamlPhpSAML" + def dump(:salesforce_oauth), do: "SalesforceOAuth" + def dump(:slack_oauth), do: "SlackOAuth" + def dump(:test_idp), do: "TestIdp" + def dump(:vercel_marketplace_oauth), do: "VercelMarketplaceOAuth" + def dump(:vercel_oauth), do: "VercelOAuth" + def dump(:v_mware_saml), do: "VMwareSAML" + def dump(:xero_oauth), do: "XeroOAuth" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/connection_deactivated_data_domain.ex b/lib/workos/connection_deactivated_data_domain.ex new file mode 100644 index 00000000..9d886d4c --- /dev/null +++ b/lib/workos/connection_deactivated_data_domain.ex @@ -0,0 +1,39 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ConnectionDeactivatedDataDomain do + @moduledoc """ + ConnectionDeactivatedDataDomain model. + """ + + defstruct [ + :object, + :id, + :domain + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + domain: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + domain: map["domain"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "domain" => struct.domain + }) + end +end diff --git a/lib/workos/connection_deactivated_data_state.ex b/lib/workos/connection_deactivated_data_state.ex new file mode 100644 index 00000000..8eaacaad --- /dev/null +++ b/lib/workos/connection_deactivated_data_state.ex @@ -0,0 +1,31 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ConnectionDeactivatedDataState do + @moduledoc """ + ConnectionDeactivatedDataState enum. + """ + + @type t :: :draft | :active | :validating | :inactive | :deleting + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:draft, :active, :validating, :inactive, :deleting] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("draft"), do: :draft + def cast("active"), do: :active + def cast("validating"), do: :validating + def cast("inactive"), do: :inactive + def cast("deleting"), do: :deleting + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:draft), do: "draft" + def dump(:active), do: "active" + def dump(:validating), do: "validating" + def dump(:inactive), do: "inactive" + def dump(:deleting), do: "deleting" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/connection_deactivated_data_status.ex b/lib/workos/connection_deactivated_data_status.ex new file mode 100644 index 00000000..afbf6868 --- /dev/null +++ b/lib/workos/connection_deactivated_data_status.ex @@ -0,0 +1,25 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ConnectionDeactivatedDataStatus do + @moduledoc """ + ConnectionDeactivatedDataStatus enum. + """ + + @type t :: :linked | :unlinked + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:linked, :unlinked] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("linked"), do: :linked + def cast("unlinked"), do: :unlinked + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:linked), do: "linked" + def dump(:unlinked), do: "unlinked" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/connection_deleted.ex b/lib/workos/connection_deleted.ex new file mode 100644 index 00000000..7d6cebb7 --- /dev/null +++ b/lib/workos/connection_deleted.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ConnectionDeleted do + @moduledoc """ + ConnectionDeleted model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.ConnectionDeletedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.ConnectionDeletedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => WorkOS.Cast.dump_struct(struct.data, &WorkOS.ConnectionDeletedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/connection_deleted_data.ex b/lib/workos/connection_deleted_data.ex new file mode 100644 index 00000000..d62c9166 --- /dev/null +++ b/lib/workos/connection_deleted_data.ex @@ -0,0 +1,67 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ConnectionDeletedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :object, + :id, + :state, + :name, + :connection_type, + :created_at, + :updated_at, + :organization_id + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + state: WorkOS.ConnectionDeletedDataState.t(), + name: String.t(), + connection_type: WorkOS.ConnectionDeletedDataConnectionType.t(), + created_at: String.t(), + updated_at: String.t(), + organization_id: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + state: WorkOS.Cast.enum(map["state"], &WorkOS.ConnectionDeletedDataState.cast/1), + name: map["name"], + connection_type: + WorkOS.Cast.enum( + map["connection_type"], + &WorkOS.ConnectionDeletedDataConnectionType.cast/1 + ), + created_at: map["created_at"], + updated_at: map["updated_at"], + organization_id: map["organization_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "state" => WorkOS.Cast.enum(struct.state, &WorkOS.ConnectionDeletedDataState.dump/1), + "name" => struct.name, + "connection_type" => + WorkOS.Cast.enum( + struct.connection_type, + &WorkOS.ConnectionDeletedDataConnectionType.dump/1 + ), + "created_at" => struct.created_at, + "updated_at" => struct.updated_at, + "organization_id" => struct.organization_id + }) + end +end diff --git a/lib/workos/connection_deleted_data_connection_type.ex b/lib/workos/connection_deleted_data_connection_type.ex new file mode 100644 index 00000000..f89f6f20 --- /dev/null +++ b/lib/workos/connection_deleted_data_connection_type.ex @@ -0,0 +1,223 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ConnectionDeletedDataConnectionType do + @moduledoc """ + ConnectionDeletedDataConnectionType enum. + """ + + @type t :: + :adfssaml + | :adp_oidc + | :apple_oauth + | :auth_0_migration + | :auth_0_saml + | :azure_saml + | :bitbucket_oauth + | :cas_saml + | :class_link_saml + | :clever_oidc + | :cloudflare_saml + | :cyber_ark_saml + | :discord_oauth + | :duo_saml + | :entra_id_oidc + | :generic_oidc + | :generic_saml + | :git_hub_oauth + | :git_lab_oauth + | :google_oauth + | :google_oidc + | :google_saml + | :intuit_oauth + | :jump_cloud_saml + | :keycloak_saml + | :last_pass_saml + | :linked_in_oauth + | :login_gov_oidc + | :magic_link + | :microsoft_oauth + | :mini_orange_saml + | :net_iq_saml + | :okta_oidc + | :okta_saml + | :one_login_saml + | :oracle_saml + | :ping_federate_saml + | :ping_one_saml + | :rippling_saml + | :salesforce_saml + | :shibboleth_generic_saml + | :shibboleth_saml + | :simple_saml_php_saml + | :salesforce_oauth + | :slack_oauth + | :test_idp + | :vercel_marketplace_oauth + | :vercel_oauth + | :v_mware_saml + | :xero_oauth + + @doc "All known values." + @spec values() :: [t()] + def values, + do: [ + :adfssaml, + :adp_oidc, + :apple_oauth, + :auth_0_migration, + :auth_0_saml, + :azure_saml, + :bitbucket_oauth, + :cas_saml, + :class_link_saml, + :clever_oidc, + :cloudflare_saml, + :cyber_ark_saml, + :discord_oauth, + :duo_saml, + :entra_id_oidc, + :generic_oidc, + :generic_saml, + :git_hub_oauth, + :git_lab_oauth, + :google_oauth, + :google_oidc, + :google_saml, + :intuit_oauth, + :jump_cloud_saml, + :keycloak_saml, + :last_pass_saml, + :linked_in_oauth, + :login_gov_oidc, + :magic_link, + :microsoft_oauth, + :mini_orange_saml, + :net_iq_saml, + :okta_oidc, + :okta_saml, + :one_login_saml, + :oracle_saml, + :ping_federate_saml, + :ping_one_saml, + :rippling_saml, + :salesforce_saml, + :shibboleth_generic_saml, + :shibboleth_saml, + :simple_saml_php_saml, + :salesforce_oauth, + :slack_oauth, + :test_idp, + :vercel_marketplace_oauth, + :vercel_oauth, + :v_mware_saml, + :xero_oauth + ] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("ADFSSAML"), do: :adfssaml + def cast("AdpOidc"), do: :adp_oidc + def cast("AppleOAuth"), do: :apple_oauth + def cast("Auth0Migration"), do: :auth_0_migration + def cast("Auth0SAML"), do: :auth_0_saml + def cast("AzureSAML"), do: :azure_saml + def cast("BitbucketOAuth"), do: :bitbucket_oauth + def cast("CasSAML"), do: :cas_saml + def cast("ClassLinkSAML"), do: :class_link_saml + def cast("CleverOIDC"), do: :clever_oidc + def cast("CloudflareSAML"), do: :cloudflare_saml + def cast("CyberArkSAML"), do: :cyber_ark_saml + def cast("DiscordOAuth"), do: :discord_oauth + def cast("DuoSAML"), do: :duo_saml + def cast("EntraIdOIDC"), do: :entra_id_oidc + def cast("GenericOIDC"), do: :generic_oidc + def cast("GenericSAML"), do: :generic_saml + def cast("GitHubOAuth"), do: :git_hub_oauth + def cast("GitLabOAuth"), do: :git_lab_oauth + def cast("GoogleOAuth"), do: :google_oauth + def cast("GoogleOIDC"), do: :google_oidc + def cast("GoogleSAML"), do: :google_saml + def cast("IntuitOAuth"), do: :intuit_oauth + def cast("JumpCloudSAML"), do: :jump_cloud_saml + def cast("KeycloakSAML"), do: :keycloak_saml + def cast("LastPassSAML"), do: :last_pass_saml + def cast("LinkedInOAuth"), do: :linked_in_oauth + def cast("LoginGovOidc"), do: :login_gov_oidc + def cast("MagicLink"), do: :magic_link + def cast("MicrosoftOAuth"), do: :microsoft_oauth + def cast("MiniOrangeSAML"), do: :mini_orange_saml + def cast("NetIqSAML"), do: :net_iq_saml + def cast("OktaOIDC"), do: :okta_oidc + def cast("OktaSAML"), do: :okta_saml + def cast("OneLoginSAML"), do: :one_login_saml + def cast("OracleSAML"), do: :oracle_saml + def cast("PingFederateSAML"), do: :ping_federate_saml + def cast("PingOneSAML"), do: :ping_one_saml + def cast("RipplingSAML"), do: :rippling_saml + def cast("SalesforceSAML"), do: :salesforce_saml + def cast("ShibbolethGenericSAML"), do: :shibboleth_generic_saml + def cast("ShibbolethSAML"), do: :shibboleth_saml + def cast("SimpleSamlPhpSAML"), do: :simple_saml_php_saml + def cast("SalesforceOAuth"), do: :salesforce_oauth + def cast("SlackOAuth"), do: :slack_oauth + def cast("TestIdp"), do: :test_idp + def cast("VercelMarketplaceOAuth"), do: :vercel_marketplace_oauth + def cast("VercelOAuth"), do: :vercel_oauth + def cast("VMwareSAML"), do: :v_mware_saml + def cast("XeroOAuth"), do: :xero_oauth + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:adfssaml), do: "ADFSSAML" + def dump(:adp_oidc), do: "AdpOidc" + def dump(:apple_oauth), do: "AppleOAuth" + def dump(:auth_0_migration), do: "Auth0Migration" + def dump(:auth_0_saml), do: "Auth0SAML" + def dump(:azure_saml), do: "AzureSAML" + def dump(:bitbucket_oauth), do: "BitbucketOAuth" + def dump(:cas_saml), do: "CasSAML" + def dump(:class_link_saml), do: "ClassLinkSAML" + def dump(:clever_oidc), do: "CleverOIDC" + def dump(:cloudflare_saml), do: "CloudflareSAML" + def dump(:cyber_ark_saml), do: "CyberArkSAML" + def dump(:discord_oauth), do: "DiscordOAuth" + def dump(:duo_saml), do: "DuoSAML" + def dump(:entra_id_oidc), do: "EntraIdOIDC" + def dump(:generic_oidc), do: "GenericOIDC" + def dump(:generic_saml), do: "GenericSAML" + def dump(:git_hub_oauth), do: "GitHubOAuth" + def dump(:git_lab_oauth), do: "GitLabOAuth" + def dump(:google_oauth), do: "GoogleOAuth" + def dump(:google_oidc), do: "GoogleOIDC" + def dump(:google_saml), do: "GoogleSAML" + def dump(:intuit_oauth), do: "IntuitOAuth" + def dump(:jump_cloud_saml), do: "JumpCloudSAML" + def dump(:keycloak_saml), do: "KeycloakSAML" + def dump(:last_pass_saml), do: "LastPassSAML" + def dump(:linked_in_oauth), do: "LinkedInOAuth" + def dump(:login_gov_oidc), do: "LoginGovOidc" + def dump(:magic_link), do: "MagicLink" + def dump(:microsoft_oauth), do: "MicrosoftOAuth" + def dump(:mini_orange_saml), do: "MiniOrangeSAML" + def dump(:net_iq_saml), do: "NetIqSAML" + def dump(:okta_oidc), do: "OktaOIDC" + def dump(:okta_saml), do: "OktaSAML" + def dump(:one_login_saml), do: "OneLoginSAML" + def dump(:oracle_saml), do: "OracleSAML" + def dump(:ping_federate_saml), do: "PingFederateSAML" + def dump(:ping_one_saml), do: "PingOneSAML" + def dump(:rippling_saml), do: "RipplingSAML" + def dump(:salesforce_saml), do: "SalesforceSAML" + def dump(:shibboleth_generic_saml), do: "ShibbolethGenericSAML" + def dump(:shibboleth_saml), do: "ShibbolethSAML" + def dump(:simple_saml_php_saml), do: "SimpleSamlPhpSAML" + def dump(:salesforce_oauth), do: "SalesforceOAuth" + def dump(:slack_oauth), do: "SlackOAuth" + def dump(:test_idp), do: "TestIdp" + def dump(:vercel_marketplace_oauth), do: "VercelMarketplaceOAuth" + def dump(:vercel_oauth), do: "VercelOAuth" + def dump(:v_mware_saml), do: "VMwareSAML" + def dump(:xero_oauth), do: "XeroOAuth" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/connection_deleted_data_state.ex b/lib/workos/connection_deleted_data_state.ex new file mode 100644 index 00000000..65024718 --- /dev/null +++ b/lib/workos/connection_deleted_data_state.ex @@ -0,0 +1,31 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ConnectionDeletedDataState do + @moduledoc """ + ConnectionDeletedDataState enum. + """ + + @type t :: :draft | :active | :validating | :inactive | :deleting + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:draft, :active, :validating, :inactive, :deleting] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("draft"), do: :draft + def cast("active"), do: :active + def cast("validating"), do: :validating + def cast("inactive"), do: :inactive + def cast("deleting"), do: :deleting + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:draft), do: "draft" + def dump(:active), do: "active" + def dump(:validating), do: "validating" + def dump(:inactive), do: "inactive" + def dump(:deleting), do: "deleting" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/connection_domain.ex b/lib/workos/connection_domain.ex new file mode 100644 index 00000000..a641f619 --- /dev/null +++ b/lib/workos/connection_domain.ex @@ -0,0 +1,39 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ConnectionDomain do + @moduledoc """ + ConnectionDomain model. + """ + + defstruct [ + :id, + :object, + :domain + ] + + @type t :: %__MODULE__{ + id: String.t(), + object: String.t(), + domain: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + id: map["id"], + object: map["object"], + domain: map["domain"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "id" => struct.id, + "object" => struct.object, + "domain" => struct.domain + }) + end +end diff --git a/lib/workos/connection_list.ex b/lib/workos/connection_list.ex new file mode 100644 index 00000000..6a236510 --- /dev/null +++ b/lib/workos/connection_list.ex @@ -0,0 +1,44 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ConnectionList do + @moduledoc """ + ConnectionList model. + """ + + defstruct [ + :object, + :data, + :list_metadata + ] + + @type t :: %__MODULE__{ + object: String.t(), + data: [WorkOS.Connection.t()], + list_metadata: WorkOS.ConnectionListListMetadata.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + data: WorkOS.Cast.list(map["data"], &WorkOS.Connection.from_map/1), + list_metadata: + WorkOS.Cast.nested(map["list_metadata"], &WorkOS.ConnectionListListMetadata.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "data" => + WorkOS.Cast.list(struct.data, fn item -> + WorkOS.Cast.dump_struct(item, &WorkOS.Connection.to_map/1) + end), + "list_metadata" => + WorkOS.Cast.dump_struct(struct.list_metadata, &WorkOS.ConnectionListListMetadata.to_map/1) + }) + end +end diff --git a/lib/workos/connection_list_list_metadata.ex b/lib/workos/connection_list_list_metadata.ex new file mode 100644 index 00000000..b8cfc29d --- /dev/null +++ b/lib/workos/connection_list_list_metadata.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ConnectionListListMetadata do + @moduledoc """ + Pagination cursors for navigating between pages of results. + """ + + defstruct [ + :before, + :after_ + ] + + @type t :: %__MODULE__{ + before: String.t() | nil, + after_: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + before: map["before"], + after_: map["after"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "before" => struct.before, + "after" => struct.after_ + }) + end +end diff --git a/lib/workos/connection_saml_certificate_renewal_required.ex b/lib/workos/connection_saml_certificate_renewal_required.ex new file mode 100644 index 00000000..51e95cfb --- /dev/null +++ b/lib/workos/connection_saml_certificate_renewal_required.ex @@ -0,0 +1,59 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ConnectionSAMLCertificateRenewalRequired do + @moduledoc """ + ConnectionSAMLCertificateRenewalRequired model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.ConnectionSAMLCertificateRenewalRequiredData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: + WorkOS.Cast.nested( + map["data"], + &WorkOS.ConnectionSAMLCertificateRenewalRequiredData.from_map/1 + ), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => + WorkOS.Cast.dump_struct( + struct.data, + &WorkOS.ConnectionSAMLCertificateRenewalRequiredData.to_map/1 + ), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/connection_saml_certificate_renewal_required_data.ex b/lib/workos/connection_saml_certificate_renewal_required_data.ex new file mode 100644 index 00000000..192b629d --- /dev/null +++ b/lib/workos/connection_saml_certificate_renewal_required_data.ex @@ -0,0 +1,55 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ConnectionSAMLCertificateRenewalRequiredData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :connection, + :certificate, + :days_until_expiry + ] + + @type t :: %__MODULE__{ + connection: WorkOS.ConnectionSAMLCertificateRenewalRequiredDataConnection.t(), + certificate: WorkOS.ConnectionSAMLCertificateRenewalRequiredDataCertificate.t(), + days_until_expiry: integer() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + connection: + WorkOS.Cast.nested( + map["connection"], + &WorkOS.ConnectionSAMLCertificateRenewalRequiredDataConnection.from_map/1 + ), + certificate: + WorkOS.Cast.nested( + map["certificate"], + &WorkOS.ConnectionSAMLCertificateRenewalRequiredDataCertificate.from_map/1 + ), + days_until_expiry: map["days_until_expiry"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "connection" => + WorkOS.Cast.dump_struct( + struct.connection, + &WorkOS.ConnectionSAMLCertificateRenewalRequiredDataConnection.to_map/1 + ), + "certificate" => + WorkOS.Cast.dump_struct( + struct.certificate, + &WorkOS.ConnectionSAMLCertificateRenewalRequiredDataCertificate.to_map/1 + ), + "days_until_expiry" => struct.days_until_expiry + }) + end +end diff --git a/lib/workos/connection_saml_certificate_renewal_required_data_certificate.ex b/lib/workos/connection_saml_certificate_renewal_required_data_certificate.ex new file mode 100644 index 00000000..e48c0dfe --- /dev/null +++ b/lib/workos/connection_saml_certificate_renewal_required_data_certificate.ex @@ -0,0 +1,48 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ConnectionSAMLCertificateRenewalRequiredDataCertificate do + @moduledoc """ + The SAML certificate details. + """ + + defstruct [ + :certificate_type, + :expiry_date, + :is_expired + ] + + @type t :: %__MODULE__{ + certificate_type: + WorkOS.ConnectionSAMLCertificateRenewalRequiredDataCertificateCertificateType.t(), + expiry_date: String.t(), + is_expired: boolean() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + certificate_type: + WorkOS.Cast.enum( + map["certificate_type"], + &WorkOS.ConnectionSAMLCertificateRenewalRequiredDataCertificateCertificateType.cast/1 + ), + expiry_date: map["expiry_date"], + is_expired: map["is_expired"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "certificate_type" => + WorkOS.Cast.enum( + struct.certificate_type, + &WorkOS.ConnectionSAMLCertificateRenewalRequiredDataCertificateCertificateType.dump/1 + ), + "expiry_date" => struct.expiry_date, + "is_expired" => struct.is_expired + }) + end +end diff --git a/lib/workos/connection_saml_certificate_renewal_required_data_certificate_certificate_type.ex b/lib/workos/connection_saml_certificate_renewal_required_data_certificate_certificate_type.ex new file mode 100644 index 00000000..910e9427 --- /dev/null +++ b/lib/workos/connection_saml_certificate_renewal_required_data_certificate_certificate_type.ex @@ -0,0 +1,27 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ConnectionSAMLCertificateRenewalRequiredDataCertificateCertificateType do + @moduledoc """ + ConnectionSAMLCertificateRenewalRequiredDataCertificateCertificateType enum. + """ + + @type t :: :response_signing | :request_signing | :response_encryption + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:response_signing, :request_signing, :response_encryption] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("ResponseSigning"), do: :response_signing + def cast("RequestSigning"), do: :request_signing + def cast("ResponseEncryption"), do: :response_encryption + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:response_signing), do: "ResponseSigning" + def dump(:request_signing), do: "RequestSigning" + def dump(:response_encryption), do: "ResponseEncryption" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/connection_saml_certificate_renewal_required_data_connection.ex b/lib/workos/connection_saml_certificate_renewal_required_data_connection.ex new file mode 100644 index 00000000..16cd7132 --- /dev/null +++ b/lib/workos/connection_saml_certificate_renewal_required_data_connection.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ConnectionSAMLCertificateRenewalRequiredDataConnection do + @moduledoc """ + The connection with the expiring certificate. + """ + + defstruct [ + :id, + :organization_id + ] + + @type t :: %__MODULE__{ + id: String.t(), + organization_id: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + id: map["id"], + organization_id: map["organization_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "id" => struct.id, + "organization_id" => struct.organization_id + }) + end +end diff --git a/lib/workos/connection_saml_certificate_renewed.ex b/lib/workos/connection_saml_certificate_renewed.ex new file mode 100644 index 00000000..50191187 --- /dev/null +++ b/lib/workos/connection_saml_certificate_renewed.ex @@ -0,0 +1,56 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ConnectionSAMLCertificateRenewed do + @moduledoc """ + ConnectionSAMLCertificateRenewed model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.ConnectionSAMLCertificateRenewedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: + WorkOS.Cast.nested(map["data"], &WorkOS.ConnectionSAMLCertificateRenewedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => + WorkOS.Cast.dump_struct( + struct.data, + &WorkOS.ConnectionSAMLCertificateRenewedData.to_map/1 + ), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/connection_saml_certificate_renewed_data.ex b/lib/workos/connection_saml_certificate_renewed_data.ex new file mode 100644 index 00000000..60e6911e --- /dev/null +++ b/lib/workos/connection_saml_certificate_renewed_data.ex @@ -0,0 +1,55 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ConnectionSAMLCertificateRenewedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :connection, + :certificate, + :renewed_at + ] + + @type t :: %__MODULE__{ + connection: WorkOS.ConnectionSAMLCertificateRenewedDataConnection.t(), + certificate: WorkOS.ConnectionSAMLCertificateRenewedDataCertificate.t(), + renewed_at: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + connection: + WorkOS.Cast.nested( + map["connection"], + &WorkOS.ConnectionSAMLCertificateRenewedDataConnection.from_map/1 + ), + certificate: + WorkOS.Cast.nested( + map["certificate"], + &WorkOS.ConnectionSAMLCertificateRenewedDataCertificate.from_map/1 + ), + renewed_at: map["renewed_at"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "connection" => + WorkOS.Cast.dump_struct( + struct.connection, + &WorkOS.ConnectionSAMLCertificateRenewedDataConnection.to_map/1 + ), + "certificate" => + WorkOS.Cast.dump_struct( + struct.certificate, + &WorkOS.ConnectionSAMLCertificateRenewedDataCertificate.to_map/1 + ), + "renewed_at" => struct.renewed_at + }) + end +end diff --git a/lib/workos/connection_saml_certificate_renewed_data_certificate.ex b/lib/workos/connection_saml_certificate_renewed_data_certificate.ex new file mode 100644 index 00000000..4d161de0 --- /dev/null +++ b/lib/workos/connection_saml_certificate_renewed_data_certificate.ex @@ -0,0 +1,44 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ConnectionSAMLCertificateRenewedDataCertificate do + @moduledoc """ + The renewed SAML certificate details. + """ + + defstruct [ + :certificate_type, + :expiry_date + ] + + @type t :: %__MODULE__{ + certificate_type: + WorkOS.ConnectionSAMLCertificateRenewedDataCertificateCertificateType.t(), + expiry_date: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + certificate_type: + WorkOS.Cast.enum( + map["certificate_type"], + &WorkOS.ConnectionSAMLCertificateRenewedDataCertificateCertificateType.cast/1 + ), + expiry_date: map["expiry_date"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "certificate_type" => + WorkOS.Cast.enum( + struct.certificate_type, + &WorkOS.ConnectionSAMLCertificateRenewedDataCertificateCertificateType.dump/1 + ), + "expiry_date" => struct.expiry_date + }) + end +end diff --git a/lib/workos/connection_saml_certificate_renewed_data_certificate_certificate_type.ex b/lib/workos/connection_saml_certificate_renewed_data_certificate_certificate_type.ex new file mode 100644 index 00000000..23aa5404 --- /dev/null +++ b/lib/workos/connection_saml_certificate_renewed_data_certificate_certificate_type.ex @@ -0,0 +1,27 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ConnectionSAMLCertificateRenewedDataCertificateCertificateType do + @moduledoc """ + ConnectionSAMLCertificateRenewedDataCertificateCertificateType enum. + """ + + @type t :: :response_signing | :request_signing | :response_encryption + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:response_signing, :request_signing, :response_encryption] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("ResponseSigning"), do: :response_signing + def cast("RequestSigning"), do: :request_signing + def cast("ResponseEncryption"), do: :response_encryption + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:response_signing), do: "ResponseSigning" + def dump(:request_signing), do: "RequestSigning" + def dump(:response_encryption), do: "ResponseEncryption" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/connection_saml_certificate_renewed_data_connection.ex b/lib/workos/connection_saml_certificate_renewed_data_connection.ex new file mode 100644 index 00000000..5609942d --- /dev/null +++ b/lib/workos/connection_saml_certificate_renewed_data_connection.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ConnectionSAMLCertificateRenewedDataConnection do + @moduledoc """ + The connection with the renewed certificate. + """ + + defstruct [ + :id, + :organization_id + ] + + @type t :: %__MODULE__{ + id: String.t(), + organization_id: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + id: map["id"], + organization_id: map["organization_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "id" => struct.id, + "organization_id" => struct.organization_id + }) + end +end diff --git a/lib/workos/connection_state.ex b/lib/workos/connection_state.ex new file mode 100644 index 00000000..789e5170 --- /dev/null +++ b/lib/workos/connection_state.ex @@ -0,0 +1,33 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ConnectionState do + @moduledoc """ + ConnectionState enum. + """ + + @type t :: :requires_type | :draft | :active | :validating | :inactive | :deleting + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:requires_type, :draft, :active, :validating, :inactive, :deleting] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("requires_type"), do: :requires_type + def cast("draft"), do: :draft + def cast("active"), do: :active + def cast("validating"), do: :validating + def cast("inactive"), do: :inactive + def cast("deleting"), do: :deleting + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:requires_type), do: "requires_type" + def dump(:draft), do: "draft" + def dump(:active), do: "active" + def dump(:validating), do: "validating" + def dump(:inactive), do: "inactive" + def dump(:deleting), do: "deleting" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/connection_status.ex b/lib/workos/connection_status.ex new file mode 100644 index 00000000..63e3fe0b --- /dev/null +++ b/lib/workos/connection_status.ex @@ -0,0 +1,25 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ConnectionStatus do + @moduledoc """ + ConnectionStatus enum. + """ + + @type t :: :linked | :unlinked + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:linked, :unlinked] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("linked"), do: :linked + def cast("unlinked"), do: :unlinked + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:linked), do: "linked" + def dump(:unlinked), do: "unlinked" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/connection_type.ex b/lib/workos/connection_type.ex new file mode 100644 index 00000000..8b30aa31 --- /dev/null +++ b/lib/workos/connection_type.ex @@ -0,0 +1,227 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ConnectionType do + @moduledoc """ + ConnectionType enum. + """ + + @type t :: + :pending + | :adfssaml + | :adp_oidc + | :apple_oauth + | :auth_0_migration + | :auth_0_saml + | :azure_saml + | :bitbucket_oauth + | :cas_saml + | :class_link_saml + | :clever_oidc + | :cloudflare_saml + | :cyber_ark_saml + | :discord_oauth + | :duo_saml + | :entra_id_oidc + | :generic_oidc + | :generic_saml + | :git_hub_oauth + | :git_lab_oauth + | :google_oauth + | :google_oidc + | :google_saml + | :intuit_oauth + | :jump_cloud_saml + | :keycloak_saml + | :last_pass_saml + | :linked_in_oauth + | :login_gov_oidc + | :magic_link + | :microsoft_oauth + | :mini_orange_saml + | :net_iq_saml + | :okta_oidc + | :okta_saml + | :one_login_saml + | :oracle_saml + | :ping_federate_saml + | :ping_one_saml + | :rippling_saml + | :salesforce_saml + | :shibboleth_generic_saml + | :shibboleth_saml + | :simple_saml_php_saml + | :salesforce_oauth + | :slack_oauth + | :test_idp + | :vercel_marketplace_oauth + | :vercel_oauth + | :v_mware_saml + | :xero_oauth + + @doc "All known values." + @spec values() :: [t()] + def values, + do: [ + :pending, + :adfssaml, + :adp_oidc, + :apple_oauth, + :auth_0_migration, + :auth_0_saml, + :azure_saml, + :bitbucket_oauth, + :cas_saml, + :class_link_saml, + :clever_oidc, + :cloudflare_saml, + :cyber_ark_saml, + :discord_oauth, + :duo_saml, + :entra_id_oidc, + :generic_oidc, + :generic_saml, + :git_hub_oauth, + :git_lab_oauth, + :google_oauth, + :google_oidc, + :google_saml, + :intuit_oauth, + :jump_cloud_saml, + :keycloak_saml, + :last_pass_saml, + :linked_in_oauth, + :login_gov_oidc, + :magic_link, + :microsoft_oauth, + :mini_orange_saml, + :net_iq_saml, + :okta_oidc, + :okta_saml, + :one_login_saml, + :oracle_saml, + :ping_federate_saml, + :ping_one_saml, + :rippling_saml, + :salesforce_saml, + :shibboleth_generic_saml, + :shibboleth_saml, + :simple_saml_php_saml, + :salesforce_oauth, + :slack_oauth, + :test_idp, + :vercel_marketplace_oauth, + :vercel_oauth, + :v_mware_saml, + :xero_oauth + ] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("Pending"), do: :pending + def cast("ADFSSAML"), do: :adfssaml + def cast("AdpOidc"), do: :adp_oidc + def cast("AppleOAuth"), do: :apple_oauth + def cast("Auth0Migration"), do: :auth_0_migration + def cast("Auth0SAML"), do: :auth_0_saml + def cast("AzureSAML"), do: :azure_saml + def cast("BitbucketOAuth"), do: :bitbucket_oauth + def cast("CasSAML"), do: :cas_saml + def cast("ClassLinkSAML"), do: :class_link_saml + def cast("CleverOIDC"), do: :clever_oidc + def cast("CloudflareSAML"), do: :cloudflare_saml + def cast("CyberArkSAML"), do: :cyber_ark_saml + def cast("DiscordOAuth"), do: :discord_oauth + def cast("DuoSAML"), do: :duo_saml + def cast("EntraIdOIDC"), do: :entra_id_oidc + def cast("GenericOIDC"), do: :generic_oidc + def cast("GenericSAML"), do: :generic_saml + def cast("GitHubOAuth"), do: :git_hub_oauth + def cast("GitLabOAuth"), do: :git_lab_oauth + def cast("GoogleOAuth"), do: :google_oauth + def cast("GoogleOIDC"), do: :google_oidc + def cast("GoogleSAML"), do: :google_saml + def cast("IntuitOAuth"), do: :intuit_oauth + def cast("JumpCloudSAML"), do: :jump_cloud_saml + def cast("KeycloakSAML"), do: :keycloak_saml + def cast("LastPassSAML"), do: :last_pass_saml + def cast("LinkedInOAuth"), do: :linked_in_oauth + def cast("LoginGovOidc"), do: :login_gov_oidc + def cast("MagicLink"), do: :magic_link + def cast("MicrosoftOAuth"), do: :microsoft_oauth + def cast("MiniOrangeSAML"), do: :mini_orange_saml + def cast("NetIqSAML"), do: :net_iq_saml + def cast("OktaOIDC"), do: :okta_oidc + def cast("OktaSAML"), do: :okta_saml + def cast("OneLoginSAML"), do: :one_login_saml + def cast("OracleSAML"), do: :oracle_saml + def cast("PingFederateSAML"), do: :ping_federate_saml + def cast("PingOneSAML"), do: :ping_one_saml + def cast("RipplingSAML"), do: :rippling_saml + def cast("SalesforceSAML"), do: :salesforce_saml + def cast("ShibbolethGenericSAML"), do: :shibboleth_generic_saml + def cast("ShibbolethSAML"), do: :shibboleth_saml + def cast("SimpleSamlPhpSAML"), do: :simple_saml_php_saml + def cast("SalesforceOAuth"), do: :salesforce_oauth + def cast("SlackOAuth"), do: :slack_oauth + def cast("TestIdp"), do: :test_idp + def cast("VercelMarketplaceOAuth"), do: :vercel_marketplace_oauth + def cast("VercelOAuth"), do: :vercel_oauth + def cast("VMwareSAML"), do: :v_mware_saml + def cast("XeroOAuth"), do: :xero_oauth + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:pending), do: "Pending" + def dump(:adfssaml), do: "ADFSSAML" + def dump(:adp_oidc), do: "AdpOidc" + def dump(:apple_oauth), do: "AppleOAuth" + def dump(:auth_0_migration), do: "Auth0Migration" + def dump(:auth_0_saml), do: "Auth0SAML" + def dump(:azure_saml), do: "AzureSAML" + def dump(:bitbucket_oauth), do: "BitbucketOAuth" + def dump(:cas_saml), do: "CasSAML" + def dump(:class_link_saml), do: "ClassLinkSAML" + def dump(:clever_oidc), do: "CleverOIDC" + def dump(:cloudflare_saml), do: "CloudflareSAML" + def dump(:cyber_ark_saml), do: "CyberArkSAML" + def dump(:discord_oauth), do: "DiscordOAuth" + def dump(:duo_saml), do: "DuoSAML" + def dump(:entra_id_oidc), do: "EntraIdOIDC" + def dump(:generic_oidc), do: "GenericOIDC" + def dump(:generic_saml), do: "GenericSAML" + def dump(:git_hub_oauth), do: "GitHubOAuth" + def dump(:git_lab_oauth), do: "GitLabOAuth" + def dump(:google_oauth), do: "GoogleOAuth" + def dump(:google_oidc), do: "GoogleOIDC" + def dump(:google_saml), do: "GoogleSAML" + def dump(:intuit_oauth), do: "IntuitOAuth" + def dump(:jump_cloud_saml), do: "JumpCloudSAML" + def dump(:keycloak_saml), do: "KeycloakSAML" + def dump(:last_pass_saml), do: "LastPassSAML" + def dump(:linked_in_oauth), do: "LinkedInOAuth" + def dump(:login_gov_oidc), do: "LoginGovOidc" + def dump(:magic_link), do: "MagicLink" + def dump(:microsoft_oauth), do: "MicrosoftOAuth" + def dump(:mini_orange_saml), do: "MiniOrangeSAML" + def dump(:net_iq_saml), do: "NetIqSAML" + def dump(:okta_oidc), do: "OktaOIDC" + def dump(:okta_saml), do: "OktaSAML" + def dump(:one_login_saml), do: "OneLoginSAML" + def dump(:oracle_saml), do: "OracleSAML" + def dump(:ping_federate_saml), do: "PingFederateSAML" + def dump(:ping_one_saml), do: "PingOneSAML" + def dump(:rippling_saml), do: "RipplingSAML" + def dump(:salesforce_saml), do: "SalesforceSAML" + def dump(:shibboleth_generic_saml), do: "ShibbolethGenericSAML" + def dump(:shibboleth_saml), do: "ShibbolethSAML" + def dump(:simple_saml_php_saml), do: "SimpleSamlPhpSAML" + def dump(:salesforce_oauth), do: "SalesforceOAuth" + def dump(:slack_oauth), do: "SlackOAuth" + def dump(:test_idp), do: "TestIdp" + def dump(:vercel_marketplace_oauth), do: "VercelMarketplaceOAuth" + def dump(:vercel_oauth), do: "VercelOAuth" + def dump(:v_mware_saml), do: "VMwareSAML" + def dump(:xero_oauth), do: "XeroOAuth" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/connections_connection_type.ex b/lib/workos/connections_connection_type.ex new file mode 100644 index 00000000..1bd403fa --- /dev/null +++ b/lib/workos/connections_connection_type.ex @@ -0,0 +1,215 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ConnectionsConnectionType do + @moduledoc """ + ConnectionsConnectionType enum. + """ + + @type t :: + :adfssaml + | :adp_oidc + | :apple_oauth + | :auth_0_saml + | :azure_saml + | :bitbucket_oauth + | :cas_saml + | :cloudflare_saml + | :class_link_saml + | :clever_oidc + | :cyber_ark_saml + | :discord_oauth + | :duo_saml + | :entra_id_oidc + | :generic_oidc + | :generic_saml + | :github_oauth + | :git_lab_oauth + | :google_oauth + | :google_oidc + | :google_saml + | :intuit_oauth + | :jump_cloud_saml + | :keycloak_saml + | :last_pass_saml + | :linked_in_oauth + | :login_gov_oidc + | :magic_link + | :microsoft_oauth + | :mini_orange_saml + | :net_iq_saml + | :okta_oidc + | :okta_saml + | :one_login_saml + | :oracle_saml + | :ping_federate_saml + | :ping_one_saml + | :rippling_saml + | :salesforce_saml + | :shibboleth_generic_saml + | :shibboleth_saml + | :simple_saml_php_saml + | :salesforce_oauth + | :slack_oauth + | :vercel_marketplace_oauth + | :vercel_oauth + | :v_mware_saml + | :xero_oauth + + @doc "All known values." + @spec values() :: [t()] + def values, + do: [ + :adfssaml, + :adp_oidc, + :apple_oauth, + :auth_0_saml, + :azure_saml, + :bitbucket_oauth, + :cas_saml, + :cloudflare_saml, + :class_link_saml, + :clever_oidc, + :cyber_ark_saml, + :discord_oauth, + :duo_saml, + :entra_id_oidc, + :generic_oidc, + :generic_saml, + :github_oauth, + :git_lab_oauth, + :google_oauth, + :google_oidc, + :google_saml, + :intuit_oauth, + :jump_cloud_saml, + :keycloak_saml, + :last_pass_saml, + :linked_in_oauth, + :login_gov_oidc, + :magic_link, + :microsoft_oauth, + :mini_orange_saml, + :net_iq_saml, + :okta_oidc, + :okta_saml, + :one_login_saml, + :oracle_saml, + :ping_federate_saml, + :ping_one_saml, + :rippling_saml, + :salesforce_saml, + :shibboleth_generic_saml, + :shibboleth_saml, + :simple_saml_php_saml, + :salesforce_oauth, + :slack_oauth, + :vercel_marketplace_oauth, + :vercel_oauth, + :v_mware_saml, + :xero_oauth + ] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("ADFSSAML"), do: :adfssaml + def cast("AdpOidc"), do: :adp_oidc + def cast("AppleOAuth"), do: :apple_oauth + def cast("Auth0SAML"), do: :auth_0_saml + def cast("AzureSAML"), do: :azure_saml + def cast("BitbucketOAuth"), do: :bitbucket_oauth + def cast("CasSAML"), do: :cas_saml + def cast("CloudflareSAML"), do: :cloudflare_saml + def cast("ClassLinkSAML"), do: :class_link_saml + def cast("CleverOIDC"), do: :clever_oidc + def cast("CyberArkSAML"), do: :cyber_ark_saml + def cast("DiscordOAuth"), do: :discord_oauth + def cast("DuoSAML"), do: :duo_saml + def cast("EntraIdOIDC"), do: :entra_id_oidc + def cast("GenericOIDC"), do: :generic_oidc + def cast("GenericSAML"), do: :generic_saml + def cast("GithubOAuth"), do: :github_oauth + def cast("GitLabOAuth"), do: :git_lab_oauth + def cast("GoogleOAuth"), do: :google_oauth + def cast("GoogleOIDC"), do: :google_oidc + def cast("GoogleSAML"), do: :google_saml + def cast("IntuitOAuth"), do: :intuit_oauth + def cast("JumpCloudSAML"), do: :jump_cloud_saml + def cast("KeycloakSAML"), do: :keycloak_saml + def cast("LastPassSAML"), do: :last_pass_saml + def cast("LinkedInOAuth"), do: :linked_in_oauth + def cast("LoginGovOidc"), do: :login_gov_oidc + def cast("MagicLink"), do: :magic_link + def cast("MicrosoftOAuth"), do: :microsoft_oauth + def cast("MiniOrangeSAML"), do: :mini_orange_saml + def cast("NetIqSAML"), do: :net_iq_saml + def cast("OktaOIDC"), do: :okta_oidc + def cast("OktaSAML"), do: :okta_saml + def cast("OneLoginSAML"), do: :one_login_saml + def cast("OracleSAML"), do: :oracle_saml + def cast("PingFederateSAML"), do: :ping_federate_saml + def cast("PingOneSAML"), do: :ping_one_saml + def cast("RipplingSAML"), do: :rippling_saml + def cast("SalesforceSAML"), do: :salesforce_saml + def cast("ShibbolethGenericSAML"), do: :shibboleth_generic_saml + def cast("ShibbolethSAML"), do: :shibboleth_saml + def cast("SimpleSamlPhpSAML"), do: :simple_saml_php_saml + def cast("SalesforceOAuth"), do: :salesforce_oauth + def cast("SlackOAuth"), do: :slack_oauth + def cast("VercelMarketplaceOAuth"), do: :vercel_marketplace_oauth + def cast("VercelOAuth"), do: :vercel_oauth + def cast("VMwareSAML"), do: :v_mware_saml + def cast("XeroOAuth"), do: :xero_oauth + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:adfssaml), do: "ADFSSAML" + def dump(:adp_oidc), do: "AdpOidc" + def dump(:apple_oauth), do: "AppleOAuth" + def dump(:auth_0_saml), do: "Auth0SAML" + def dump(:azure_saml), do: "AzureSAML" + def dump(:bitbucket_oauth), do: "BitbucketOAuth" + def dump(:cas_saml), do: "CasSAML" + def dump(:cloudflare_saml), do: "CloudflareSAML" + def dump(:class_link_saml), do: "ClassLinkSAML" + def dump(:clever_oidc), do: "CleverOIDC" + def dump(:cyber_ark_saml), do: "CyberArkSAML" + def dump(:discord_oauth), do: "DiscordOAuth" + def dump(:duo_saml), do: "DuoSAML" + def dump(:entra_id_oidc), do: "EntraIdOIDC" + def dump(:generic_oidc), do: "GenericOIDC" + def dump(:generic_saml), do: "GenericSAML" + def dump(:github_oauth), do: "GithubOAuth" + def dump(:git_lab_oauth), do: "GitLabOAuth" + def dump(:google_oauth), do: "GoogleOAuth" + def dump(:google_oidc), do: "GoogleOIDC" + def dump(:google_saml), do: "GoogleSAML" + def dump(:intuit_oauth), do: "IntuitOAuth" + def dump(:jump_cloud_saml), do: "JumpCloudSAML" + def dump(:keycloak_saml), do: "KeycloakSAML" + def dump(:last_pass_saml), do: "LastPassSAML" + def dump(:linked_in_oauth), do: "LinkedInOAuth" + def dump(:login_gov_oidc), do: "LoginGovOidc" + def dump(:magic_link), do: "MagicLink" + def dump(:microsoft_oauth), do: "MicrosoftOAuth" + def dump(:mini_orange_saml), do: "MiniOrangeSAML" + def dump(:net_iq_saml), do: "NetIqSAML" + def dump(:okta_oidc), do: "OktaOIDC" + def dump(:okta_saml), do: "OktaSAML" + def dump(:one_login_saml), do: "OneLoginSAML" + def dump(:oracle_saml), do: "OracleSAML" + def dump(:ping_federate_saml), do: "PingFederateSAML" + def dump(:ping_one_saml), do: "PingOneSAML" + def dump(:rippling_saml), do: "RipplingSAML" + def dump(:salesforce_saml), do: "SalesforceSAML" + def dump(:shibboleth_generic_saml), do: "ShibbolethGenericSAML" + def dump(:shibboleth_saml), do: "ShibbolethSAML" + def dump(:simple_saml_php_saml), do: "SimpleSamlPhpSAML" + def dump(:salesforce_oauth), do: "SalesforceOAuth" + def dump(:slack_oauth), do: "SlackOAuth" + def dump(:vercel_marketplace_oauth), do: "VercelMarketplaceOAuth" + def dump(:vercel_oauth), do: "VercelOAuth" + def dump(:v_mware_saml), do: "VMwareSAML" + def dump(:xero_oauth), do: "XeroOAuth" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/cors_origin_response.ex b/lib/workos/cors_origin_response.ex new file mode 100644 index 00000000..80ef6898 --- /dev/null +++ b/lib/workos/cors_origin_response.ex @@ -0,0 +1,47 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.CORSOriginResponse do + @moduledoc """ + CORSOriginResponse model. + """ + + defstruct [ + :object, + :id, + :origin, + :created_at, + :updated_at + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + origin: String.t(), + created_at: String.t(), + updated_at: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + origin: map["origin"], + created_at: map["created_at"], + updated_at: map["updated_at"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "origin" => struct.origin, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at + }) + end +end diff --git a/lib/workos/create_application_secret.ex b/lib/workos/create_application_secret.ex new file mode 100644 index 00000000..cfb4d398 --- /dev/null +++ b/lib/workos/create_application_secret.ex @@ -0,0 +1,19 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.CreateApplicationSecret do + @moduledoc """ + CreateApplicationSecret model. + """ + + defstruct [] + + @type t :: %__MODULE__{} + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map), do: %__MODULE__{} + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{}), do: %{} +end diff --git a/lib/workos/create_authorization_permission.ex b/lib/workos/create_authorization_permission.ex new file mode 100644 index 00000000..8ea056e6 --- /dev/null +++ b/lib/workos/create_authorization_permission.ex @@ -0,0 +1,43 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.CreateAuthorizationPermission do + @moduledoc """ + CreateAuthorizationPermission model. + """ + + defstruct [ + :slug, + :name, + :description, + :resource_type_slug + ] + + @type t :: %__MODULE__{ + slug: String.t(), + name: String.t(), + description: String.t() | nil, + resource_type_slug: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + slug: map["slug"], + name: map["name"], + description: map["description"], + resource_type_slug: map["resource_type_slug"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "slug" => struct.slug, + "name" => struct.name, + "description" => struct.description, + "resource_type_slug" => struct.resource_type_slug + }) + end +end diff --git a/lib/workos/create_authorization_resource.ex b/lib/workos/create_authorization_resource.ex new file mode 100644 index 00000000..5b27c712 --- /dev/null +++ b/lib/workos/create_authorization_resource.ex @@ -0,0 +1,59 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.CreateAuthorizationResource do + @moduledoc """ + CreateAuthorizationResource model. + """ + + defstruct [ + :external_id, + :name, + :resource_type_slug, + :organization_id, + :description, + :parent_resource_id, + :parent_resource_external_id, + :parent_resource_type_slug + ] + + @type t :: %__MODULE__{ + external_id: String.t(), + name: String.t(), + resource_type_slug: String.t(), + organization_id: String.t(), + description: String.t() | nil, + parent_resource_id: String.t() | nil, + parent_resource_external_id: String.t() | nil, + parent_resource_type_slug: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + external_id: map["external_id"], + name: map["name"], + resource_type_slug: map["resource_type_slug"], + organization_id: map["organization_id"], + description: map["description"], + parent_resource_id: map["parent_resource_id"], + parent_resource_external_id: map["parent_resource_external_id"], + parent_resource_type_slug: map["parent_resource_type_slug"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "external_id" => struct.external_id, + "name" => struct.name, + "resource_type_slug" => struct.resource_type_slug, + "organization_id" => struct.organization_id, + "description" => struct.description, + "parent_resource_id" => struct.parent_resource_id, + "parent_resource_external_id" => struct.parent_resource_external_id, + "parent_resource_type_slug" => struct.parent_resource_type_slug + }) + end +end diff --git a/lib/workos/create_cors_origin.ex b/lib/workos/create_cors_origin.ex new file mode 100644 index 00000000..d93f1d43 --- /dev/null +++ b/lib/workos/create_cors_origin.ex @@ -0,0 +1,31 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.CreateCORSOrigin do + @moduledoc """ + CreateCORSOrigin model. + """ + + defstruct [ + :origin + ] + + @type t :: %__MODULE__{ + origin: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + origin: map["origin"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "origin" => struct.origin + }) + end +end diff --git a/lib/workos/create_data_integration.ex b/lib/workos/create_data_integration.ex new file mode 100644 index 00000000..00ee68bf --- /dev/null +++ b/lib/workos/create_data_integration.ex @@ -0,0 +1,72 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.CreateDataIntegration do + @moduledoc """ + CreateDataIntegration model. + """ + + defstruct [ + :provider, + :description, + :enabled, + :scopes, + :auth_methods, + :config, + :credentials, + :api_key, + :custom_provider + ] + + @type t :: %__MODULE__{ + provider: String.t(), + description: String.t() | nil, + enabled: boolean() | nil, + scopes: [String.t()] | nil, + auth_methods: [WorkOS.CreateDataIntegrationAuthMethods.t()] | nil, + config: %{optional(String.t()) => String.t()} | nil, + credentials: WorkOS.DataIntegrationCredentialsInput.t() | nil, + api_key: WorkOS.ApiKeyInstallation.t() | nil, + custom_provider: WorkOS.CustomProviderDefinition.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + provider: map["provider"], + description: map["description"], + enabled: map["enabled"], + scopes: map["scopes"], + auth_methods: + WorkOS.Cast.list(map["auth_methods"], &WorkOS.CreateDataIntegrationAuthMethods.cast/1), + config: map["config"], + credentials: + WorkOS.Cast.nested(map["credentials"], &WorkOS.DataIntegrationCredentialsInput.from_map/1), + api_key: WorkOS.Cast.nested(map["api_key"], &WorkOS.ApiKeyInstallation.from_map/1), + custom_provider: + WorkOS.Cast.nested(map["custom_provider"], &WorkOS.CustomProviderDefinition.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "provider" => struct.provider, + "description" => struct.description, + "enabled" => struct.enabled, + "scopes" => struct.scopes, + "auth_methods" => + WorkOS.Cast.list(struct.auth_methods, &WorkOS.CreateDataIntegrationAuthMethods.dump/1), + "config" => struct.config, + "credentials" => + WorkOS.Cast.dump_struct( + struct.credentials, + &WorkOS.DataIntegrationCredentialsInput.to_map/1 + ), + "api_key" => WorkOS.Cast.dump_struct(struct.api_key, &WorkOS.ApiKeyInstallation.to_map/1), + "custom_provider" => + WorkOS.Cast.dump_struct(struct.custom_provider, &WorkOS.CustomProviderDefinition.to_map/1) + }) + end +end diff --git a/lib/workos/create_data_integration_auth_methods.ex b/lib/workos/create_data_integration_auth_methods.ex new file mode 100644 index 00000000..48fe58ed --- /dev/null +++ b/lib/workos/create_data_integration_auth_methods.ex @@ -0,0 +1,25 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.CreateDataIntegrationAuthMethods do + @moduledoc """ + CreateDataIntegrationAuthMethods enum. + """ + + @type t :: :oauth | :api_key + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:oauth, :api_key] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("oauth"), do: :oauth + def cast("api_key"), do: :api_key + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:oauth), do: "oauth" + def dump(:api_key), do: "api_key" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/create_data_key_request.ex b/lib/workos/create_data_key_request.ex new file mode 100644 index 00000000..6f9d4b14 --- /dev/null +++ b/lib/workos/create_data_key_request.ex @@ -0,0 +1,31 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.CreateDataKeyRequest do + @moduledoc """ + CreateDataKeyRequest model. + """ + + defstruct [ + :context + ] + + @type t :: %__MODULE__{ + context: %{optional(String.t()) => String.t()} + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + context: map["context"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "context" => struct.context + }) + end +end diff --git a/lib/workos/create_data_key_response.ex b/lib/workos/create_data_key_response.ex new file mode 100644 index 00000000..288181f6 --- /dev/null +++ b/lib/workos/create_data_key_response.ex @@ -0,0 +1,43 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.CreateDataKeyResponse do + @moduledoc """ + CreateDataKeyResponse model. + """ + + defstruct [ + :context, + :data_key, + :encrypted_keys, + :id + ] + + @type t :: %__MODULE__{ + context: %{optional(String.t()) => String.t()}, + data_key: String.t(), + encrypted_keys: String.t(), + id: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + context: map["context"], + data_key: map["data_key"], + encrypted_keys: map["encrypted_keys"], + id: map["id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "context" => struct.context, + "data_key" => struct.data_key, + "encrypted_keys" => struct.encrypted_keys, + "id" => struct.id + }) + end +end diff --git a/lib/workos/create_group.ex b/lib/workos/create_group.ex new file mode 100644 index 00000000..093cef47 --- /dev/null +++ b/lib/workos/create_group.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.CreateGroup do + @moduledoc """ + CreateGroup model. + """ + + defstruct [ + :name, + :description + ] + + @type t :: %__MODULE__{ + name: String.t(), + description: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + name: map["name"], + description: map["description"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "name" => struct.name, + "description" => struct.description + }) + end +end diff --git a/lib/workos/create_group_membership.ex b/lib/workos/create_group_membership.ex new file mode 100644 index 00000000..3613b772 --- /dev/null +++ b/lib/workos/create_group_membership.ex @@ -0,0 +1,31 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.CreateGroupMembership do + @moduledoc """ + CreateGroupMembership model. + """ + + defstruct [ + :organization_membership_id + ] + + @type t :: %__MODULE__{ + organization_membership_id: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + organization_membership_id: map["organization_membership_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "organization_membership_id" => struct.organization_membership_id + }) + end +end diff --git a/lib/workos/create_group_role_assignment.ex b/lib/workos/create_group_role_assignment.ex new file mode 100644 index 00000000..511f8e5b --- /dev/null +++ b/lib/workos/create_group_role_assignment.ex @@ -0,0 +1,43 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.CreateGroupRoleAssignment do + @moduledoc """ + CreateGroupRoleAssignment model. + """ + + defstruct [ + :role_slug, + :resource_id, + :resource_external_id, + :resource_type_slug + ] + + @type t :: %__MODULE__{ + role_slug: String.t(), + resource_id: String.t() | nil, + resource_external_id: String.t() | nil, + resource_type_slug: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + role_slug: map["role_slug"], + resource_id: map["resource_id"], + resource_external_id: map["resource_external_id"], + resource_type_slug: map["resource_type_slug"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "role_slug" => struct.role_slug, + "resource_id" => struct.resource_id, + "resource_external_id" => struct.resource_external_id, + "resource_type_slug" => struct.resource_type_slug + }) + end +end diff --git a/lib/workos/create_m2m_application.ex b/lib/workos/create_m2m_application.ex new file mode 100644 index 00000000..82a0d2fd --- /dev/null +++ b/lib/workos/create_m2m_application.ex @@ -0,0 +1,47 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.CreateM2MApplication do + @moduledoc """ + CreateM2MApplication model. + """ + + defstruct [ + :name, + :application_type, + :organization_id, + :description, + :scopes + ] + + @type t :: %__MODULE__{ + name: String.t(), + application_type: String.t(), + organization_id: String.t(), + description: String.t() | nil, + scopes: [String.t()] | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + name: map["name"], + application_type: map["application_type"], + organization_id: map["organization_id"], + description: map["description"], + scopes: map["scopes"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "name" => struct.name, + "application_type" => struct.application_type, + "organization_id" => struct.organization_id, + "description" => struct.description, + "scopes" => struct.scopes + }) + end +end diff --git a/lib/workos/create_magic_code_and_return.ex b/lib/workos/create_magic_code_and_return.ex new file mode 100644 index 00000000..0af9b474 --- /dev/null +++ b/lib/workos/create_magic_code_and_return.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.CreateMagicCodeAndReturn do + @moduledoc """ + CreateMagicCodeAndReturn model. + """ + + defstruct [ + :email, + :invitation_token, + :ip_address, + :user_agent, + :radar_auth_attempt_id, + :signals_id + ] + + @type t :: %__MODULE__{ + email: String.t(), + invitation_token: String.t() | nil, + ip_address: String.t() | nil, + user_agent: String.t() | nil, + radar_auth_attempt_id: String.t() | nil, + signals_id: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + email: map["email"], + invitation_token: map["invitation_token"], + ip_address: map["ip_address"], + user_agent: map["user_agent"], + radar_auth_attempt_id: map["radar_auth_attempt_id"], + signals_id: map["signals_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "email" => struct.email, + "invitation_token" => struct.invitation_token, + "ip_address" => struct.ip_address, + "user_agent" => struct.user_agent, + "radar_auth_attempt_id" => struct.radar_auth_attempt_id, + "signals_id" => struct.signals_id + }) + end +end diff --git a/lib/workos/create_oauth_application.ex b/lib/workos/create_oauth_application.ex new file mode 100644 index 00000000..2134c675 --- /dev/null +++ b/lib/workos/create_oauth_application.ex @@ -0,0 +1,62 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.CreateOAuthApplication do + @moduledoc """ + CreateOAuthApplication model. + """ + + defstruct [ + :name, + :application_type, + :is_first_party, + :description, + :scopes, + :redirect_uris, + :uses_pkce, + :organization_id + ] + + @type t :: %__MODULE__{ + name: String.t(), + application_type: String.t(), + is_first_party: boolean(), + description: String.t() | nil, + scopes: [String.t()] | nil, + redirect_uris: [WorkOS.RedirectUriInput.t()] | nil, + uses_pkce: boolean() | nil, + organization_id: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + name: map["name"], + application_type: map["application_type"], + is_first_party: map["is_first_party"], + description: map["description"], + scopes: map["scopes"], + redirect_uris: WorkOS.Cast.list(map["redirect_uris"], &WorkOS.RedirectUriInput.from_map/1), + uses_pkce: map["uses_pkce"], + organization_id: map["organization_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "name" => struct.name, + "application_type" => struct.application_type, + "is_first_party" => struct.is_first_party, + "description" => struct.description, + "scopes" => struct.scopes, + "redirect_uris" => + WorkOS.Cast.list(struct.redirect_uris, fn item -> + WorkOS.Cast.dump_struct(item, &WorkOS.RedirectUriInput.to_map/1) + end), + "uses_pkce" => struct.uses_pkce, + "organization_id" => struct.organization_id + }) + end +end diff --git a/lib/workos/create_object_request.ex b/lib/workos/create_object_request.ex new file mode 100644 index 00000000..90a45a93 --- /dev/null +++ b/lib/workos/create_object_request.ex @@ -0,0 +1,39 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.CreateObjectRequest do + @moduledoc """ + CreateObjectRequest model. + """ + + defstruct [ + :key_context, + :name, + :value + ] + + @type t :: %__MODULE__{ + key_context: %{optional(String.t()) => String.t()}, + name: String.t(), + value: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + key_context: map["key_context"], + name: map["name"], + value: map["value"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "key_context" => struct.key_context, + "name" => struct.name, + "value" => struct.value + }) + end +end diff --git a/lib/workos/create_organization_api_key.ex b/lib/workos/create_organization_api_key.ex new file mode 100644 index 00000000..60836b17 --- /dev/null +++ b/lib/workos/create_organization_api_key.ex @@ -0,0 +1,39 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.CreateOrganizationApiKey do + @moduledoc """ + CreateOrganizationApiKey model. + """ + + defstruct [ + :name, + :permissions, + :expires_at + ] + + @type t :: %__MODULE__{ + name: String.t(), + permissions: [String.t()] | nil, + expires_at: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + name: map["name"], + permissions: map["permissions"], + expires_at: map["expires_at"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "name" => struct.name, + "permissions" => struct.permissions, + "expires_at" => struct.expires_at + }) + end +end diff --git a/lib/workos/create_organization_domain.ex b/lib/workos/create_organization_domain.ex new file mode 100644 index 00000000..1357360a --- /dev/null +++ b/lib/workos/create_organization_domain.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.CreateOrganizationDomain do + @moduledoc """ + CreateOrganizationDomain model. + """ + + defstruct [ + :domain, + :organization_id + ] + + @type t :: %__MODULE__{ + domain: String.t(), + organization_id: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + domain: map["domain"], + organization_id: map["organization_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "domain" => struct.domain, + "organization_id" => struct.organization_id + }) + end +end diff --git a/lib/workos/create_organization_role.ex b/lib/workos/create_organization_role.ex new file mode 100644 index 00000000..ad5311e3 --- /dev/null +++ b/lib/workos/create_organization_role.ex @@ -0,0 +1,43 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.CreateOrganizationRole do + @moduledoc """ + CreateOrganizationRole model. + """ + + defstruct [ + :name, + :slug, + :description, + :resource_type_slug + ] + + @type t :: %__MODULE__{ + name: String.t(), + slug: String.t() | nil, + description: String.t() | nil, + resource_type_slug: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + name: map["name"], + slug: map["slug"], + description: map["description"], + resource_type_slug: map["resource_type_slug"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "name" => struct.name, + "slug" => struct.slug, + "description" => struct.description, + "resource_type_slug" => struct.resource_type_slug + }) + end +end diff --git a/lib/workos/create_password_reset.ex b/lib/workos/create_password_reset.ex new file mode 100644 index 00000000..7db4b234 --- /dev/null +++ b/lib/workos/create_password_reset.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.CreatePasswordReset do + @moduledoc """ + CreatePasswordReset model. + """ + + defstruct [ + :token, + :new_password + ] + + @type t :: %__MODULE__{ + token: String.t(), + new_password: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + token: map["token"], + new_password: map["new_password"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "token" => struct.token, + "new_password" => struct.new_password + }) + end +end diff --git a/lib/workos/create_password_reset_token.ex b/lib/workos/create_password_reset_token.ex new file mode 100644 index 00000000..aae3b11f --- /dev/null +++ b/lib/workos/create_password_reset_token.ex @@ -0,0 +1,31 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.CreatePasswordResetToken do + @moduledoc """ + CreatePasswordResetToken model. + """ + + defstruct [ + :email + ] + + @type t :: %__MODULE__{ + email: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + email: map["email"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "email" => struct.email + }) + end +end diff --git a/lib/workos/create_redirect_uri.ex b/lib/workos/create_redirect_uri.ex new file mode 100644 index 00000000..263e2a87 --- /dev/null +++ b/lib/workos/create_redirect_uri.ex @@ -0,0 +1,31 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.CreateRedirectUri do + @moduledoc """ + CreateRedirectUri model. + """ + + defstruct [ + :uri + ] + + @type t :: %__MODULE__{ + uri: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + uri: map["uri"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "uri" => struct.uri + }) + end +end diff --git a/lib/workos/create_role.ex b/lib/workos/create_role.ex new file mode 100644 index 00000000..32c7cf7c --- /dev/null +++ b/lib/workos/create_role.ex @@ -0,0 +1,43 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.CreateRole do + @moduledoc """ + CreateRole model. + """ + + defstruct [ + :slug, + :name, + :description, + :resource_type_slug + ] + + @type t :: %__MODULE__{ + slug: String.t(), + name: String.t(), + description: String.t() | nil, + resource_type_slug: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + slug: map["slug"], + name: map["name"], + description: map["description"], + resource_type_slug: map["resource_type_slug"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "slug" => struct.slug, + "name" => struct.name, + "description" => struct.description, + "resource_type_slug" => struct.resource_type_slug + }) + end +end diff --git a/lib/workos/create_user.ex b/lib/workos/create_user.ex new file mode 100644 index 00000000..603cfd8e --- /dev/null +++ b/lib/workos/create_user.ex @@ -0,0 +1,81 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.CreateUser do + @moduledoc """ + CreateUser model. + """ + + defstruct [ + :email, + :first_name, + :last_name, + :name, + :email_verified, + :metadata, + :external_id, + :ip_address, + :user_agent, + :signals_id, + :password, + :password_hash, + :password_hash_type + ] + + @type t :: %__MODULE__{ + email: String.t(), + first_name: String.t() | nil, + last_name: String.t() | nil, + name: String.t() | nil, + email_verified: boolean() | nil, + metadata: %{optional(String.t()) => String.t()} | nil, + external_id: String.t() | nil, + ip_address: String.t() | nil, + user_agent: String.t() | nil, + signals_id: String.t() | nil, + password: String.t() | nil, + password_hash: String.t() | nil, + password_hash_type: WorkOS.CreateUserPasswordHashType.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + email: map["email"], + first_name: map["first_name"], + last_name: map["last_name"], + name: map["name"], + email_verified: map["email_verified"], + metadata: map["metadata"], + external_id: map["external_id"], + ip_address: map["ip_address"], + user_agent: map["user_agent"], + signals_id: map["signals_id"], + password: map["password"], + password_hash: map["password_hash"], + password_hash_type: + WorkOS.Cast.enum(map["password_hash_type"], &WorkOS.CreateUserPasswordHashType.cast/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "email" => struct.email, + "first_name" => struct.first_name, + "last_name" => struct.last_name, + "name" => struct.name, + "email_verified" => struct.email_verified, + "metadata" => struct.metadata, + "external_id" => struct.external_id, + "ip_address" => struct.ip_address, + "user_agent" => struct.user_agent, + "signals_id" => struct.signals_id, + "password" => struct.password, + "password_hash" => struct.password_hash, + "password_hash_type" => + WorkOS.Cast.enum(struct.password_hash_type, &WorkOS.CreateUserPasswordHashType.dump/1) + }) + end +end diff --git a/lib/workos/create_user_api_key.ex b/lib/workos/create_user_api_key.ex new file mode 100644 index 00000000..e0505371 --- /dev/null +++ b/lib/workos/create_user_api_key.ex @@ -0,0 +1,43 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.CreateUserApiKey do + @moduledoc """ + CreateUserApiKey model. + """ + + defstruct [ + :name, + :organization_id, + :permissions, + :expires_at + ] + + @type t :: %__MODULE__{ + name: String.t(), + organization_id: String.t(), + permissions: [String.t()] | nil, + expires_at: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + name: map["name"], + organization_id: map["organization_id"], + permissions: map["permissions"], + expires_at: map["expires_at"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "name" => struct.name, + "organization_id" => struct.organization_id, + "permissions" => struct.permissions, + "expires_at" => struct.expires_at + }) + end +end diff --git a/lib/workos/create_user_invite_options.ex b/lib/workos/create_user_invite_options.ex new file mode 100644 index 00000000..2fa61b49 --- /dev/null +++ b/lib/workos/create_user_invite_options.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.CreateUserInviteOptions do + @moduledoc """ + CreateUserInviteOptions model. + """ + + defstruct [ + :email, + :organization_id, + :role_slug, + :expires_in_days, + :inviter_user_id, + :locale + ] + + @type t :: %__MODULE__{ + email: String.t(), + organization_id: String.t() | nil, + role_slug: String.t() | nil, + expires_in_days: integer() | nil, + inviter_user_id: String.t() | nil, + locale: WorkOS.CreateUserInviteOptionsLocale.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + email: map["email"], + organization_id: map["organization_id"], + role_slug: map["role_slug"], + expires_in_days: map["expires_in_days"], + inviter_user_id: map["inviter_user_id"], + locale: WorkOS.Cast.enum(map["locale"], &WorkOS.CreateUserInviteOptionsLocale.cast/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "email" => struct.email, + "organization_id" => struct.organization_id, + "role_slug" => struct.role_slug, + "expires_in_days" => struct.expires_in_days, + "inviter_user_id" => struct.inviter_user_id, + "locale" => WorkOS.Cast.enum(struct.locale, &WorkOS.CreateUserInviteOptionsLocale.dump/1) + }) + end +end diff --git a/lib/workos/create_user_invite_options_locale.ex b/lib/workos/create_user_invite_options_locale.ex new file mode 100644 index 00000000..3c97bfe5 --- /dev/null +++ b/lib/workos/create_user_invite_options_locale.ex @@ -0,0 +1,383 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.CreateUserInviteOptionsLocale do + @moduledoc """ + CreateUserInviteOptionsLocale enum. + """ + + @type t :: + :af + | :am + | :ar + | :bg + | :bn + | :bs + | :ca + | :cs + | :da + | :de + | :de_de + | :el + | :en + | :en_au + | :en_ca + | :en_gb + | :en_us + | :es + | :es_419 + | :es_es + | :es_us + | :et + | :fa + | :fi + | :fil + | :fr + | :fr_be + | :fr_ca + | :fr_fr + | :fy + | :gl + | :gu + | :ha + | :he + | :hi + | :hr + | :hu + | :hy + | :id + | :is + | :it + | :it_it + | :ja + | :jv + | :ka + | :kk + | :km + | :kn + | :ko + | :lt + | :lv + | :mk + | :ml + | :mn + | :mr + | :ms + | :my + | :nb + | :ne + | :nl + | :nl_be + | :nl_nl + | :nn + | :no + | :pa + | :pl + | :pt + | :pt_br + | :pt_pt + | :ro + | :ru + | :sk + | :sl + | :sq + | :sr + | :sv + | :sw + | :ta + | :te + | :th + | :tr + | :uk + | :ur + | :uz + | :vi + | :zh + | :zh_cn + | :zh_hk + | :zh_tw + | :zu + + @doc "All known values." + @spec values() :: [t()] + def values, + do: [ + :af, + :am, + :ar, + :bg, + :bn, + :bs, + :ca, + :cs, + :da, + :de, + :de_de, + :el, + :en, + :en_au, + :en_ca, + :en_gb, + :en_us, + :es, + :es_419, + :es_es, + :es_us, + :et, + :fa, + :fi, + :fil, + :fr, + :fr_be, + :fr_ca, + :fr_fr, + :fy, + :gl, + :gu, + :ha, + :he, + :hi, + :hr, + :hu, + :hy, + :id, + :is, + :it, + :it_it, + :ja, + :jv, + :ka, + :kk, + :km, + :kn, + :ko, + :lt, + :lv, + :mk, + :ml, + :mn, + :mr, + :ms, + :my, + :nb, + :ne, + :nl, + :nl_be, + :nl_nl, + :nn, + :no, + :pa, + :pl, + :pt, + :pt_br, + :pt_pt, + :ro, + :ru, + :sk, + :sl, + :sq, + :sr, + :sv, + :sw, + :ta, + :te, + :th, + :tr, + :uk, + :ur, + :uz, + :vi, + :zh, + :zh_cn, + :zh_hk, + :zh_tw, + :zu + ] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("af"), do: :af + def cast("am"), do: :am + def cast("ar"), do: :ar + def cast("bg"), do: :bg + def cast("bn"), do: :bn + def cast("bs"), do: :bs + def cast("ca"), do: :ca + def cast("cs"), do: :cs + def cast("da"), do: :da + def cast("de"), do: :de + def cast("de-DE"), do: :de_de + def cast("el"), do: :el + def cast("en"), do: :en + def cast("en-AU"), do: :en_au + def cast("en-CA"), do: :en_ca + def cast("en-GB"), do: :en_gb + def cast("en-US"), do: :en_us + def cast("es"), do: :es + def cast("es-419"), do: :es_419 + def cast("es-ES"), do: :es_es + def cast("es-US"), do: :es_us + def cast("et"), do: :et + def cast("fa"), do: :fa + def cast("fi"), do: :fi + def cast("fil"), do: :fil + def cast("fr"), do: :fr + def cast("fr-BE"), do: :fr_be + def cast("fr-CA"), do: :fr_ca + def cast("fr-FR"), do: :fr_fr + def cast("fy"), do: :fy + def cast("gl"), do: :gl + def cast("gu"), do: :gu + def cast("ha"), do: :ha + def cast("he"), do: :he + def cast("hi"), do: :hi + def cast("hr"), do: :hr + def cast("hu"), do: :hu + def cast("hy"), do: :hy + def cast("id"), do: :id + def cast("is"), do: :is + def cast("it"), do: :it + def cast("it-IT"), do: :it_it + def cast("ja"), do: :ja + def cast("jv"), do: :jv + def cast("ka"), do: :ka + def cast("kk"), do: :kk + def cast("km"), do: :km + def cast("kn"), do: :kn + def cast("ko"), do: :ko + def cast("lt"), do: :lt + def cast("lv"), do: :lv + def cast("mk"), do: :mk + def cast("ml"), do: :ml + def cast("mn"), do: :mn + def cast("mr"), do: :mr + def cast("ms"), do: :ms + def cast("my"), do: :my + def cast("nb"), do: :nb + def cast("ne"), do: :ne + def cast("nl"), do: :nl + def cast("nl-BE"), do: :nl_be + def cast("nl-NL"), do: :nl_nl + def cast("nn"), do: :nn + def cast("no"), do: :no + def cast("pa"), do: :pa + def cast("pl"), do: :pl + def cast("pt"), do: :pt + def cast("pt-BR"), do: :pt_br + def cast("pt-PT"), do: :pt_pt + def cast("ro"), do: :ro + def cast("ru"), do: :ru + def cast("sk"), do: :sk + def cast("sl"), do: :sl + def cast("sq"), do: :sq + def cast("sr"), do: :sr + def cast("sv"), do: :sv + def cast("sw"), do: :sw + def cast("ta"), do: :ta + def cast("te"), do: :te + def cast("th"), do: :th + def cast("tr"), do: :tr + def cast("uk"), do: :uk + def cast("ur"), do: :ur + def cast("uz"), do: :uz + def cast("vi"), do: :vi + def cast("zh"), do: :zh + def cast("zh-CN"), do: :zh_cn + def cast("zh-HK"), do: :zh_hk + def cast("zh-TW"), do: :zh_tw + def cast("zu"), do: :zu + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:af), do: "af" + def dump(:am), do: "am" + def dump(:ar), do: "ar" + def dump(:bg), do: "bg" + def dump(:bn), do: "bn" + def dump(:bs), do: "bs" + def dump(:ca), do: "ca" + def dump(:cs), do: "cs" + def dump(:da), do: "da" + def dump(:de), do: "de" + def dump(:de_de), do: "de-DE" + def dump(:el), do: "el" + def dump(:en), do: "en" + def dump(:en_au), do: "en-AU" + def dump(:en_ca), do: "en-CA" + def dump(:en_gb), do: "en-GB" + def dump(:en_us), do: "en-US" + def dump(:es), do: "es" + def dump(:es_419), do: "es-419" + def dump(:es_es), do: "es-ES" + def dump(:es_us), do: "es-US" + def dump(:et), do: "et" + def dump(:fa), do: "fa" + def dump(:fi), do: "fi" + def dump(:fil), do: "fil" + def dump(:fr), do: "fr" + def dump(:fr_be), do: "fr-BE" + def dump(:fr_ca), do: "fr-CA" + def dump(:fr_fr), do: "fr-FR" + def dump(:fy), do: "fy" + def dump(:gl), do: "gl" + def dump(:gu), do: "gu" + def dump(:ha), do: "ha" + def dump(:he), do: "he" + def dump(:hi), do: "hi" + def dump(:hr), do: "hr" + def dump(:hu), do: "hu" + def dump(:hy), do: "hy" + def dump(:id), do: "id" + def dump(:is), do: "is" + def dump(:it), do: "it" + def dump(:it_it), do: "it-IT" + def dump(:ja), do: "ja" + def dump(:jv), do: "jv" + def dump(:ka), do: "ka" + def dump(:kk), do: "kk" + def dump(:km), do: "km" + def dump(:kn), do: "kn" + def dump(:ko), do: "ko" + def dump(:lt), do: "lt" + def dump(:lv), do: "lv" + def dump(:mk), do: "mk" + def dump(:ml), do: "ml" + def dump(:mn), do: "mn" + def dump(:mr), do: "mr" + def dump(:ms), do: "ms" + def dump(:my), do: "my" + def dump(:nb), do: "nb" + def dump(:ne), do: "ne" + def dump(:nl), do: "nl" + def dump(:nl_be), do: "nl-BE" + def dump(:nl_nl), do: "nl-NL" + def dump(:nn), do: "nn" + def dump(:no), do: "no" + def dump(:pa), do: "pa" + def dump(:pl), do: "pl" + def dump(:pt), do: "pt" + def dump(:pt_br), do: "pt-BR" + def dump(:pt_pt), do: "pt-PT" + def dump(:ro), do: "ro" + def dump(:ru), do: "ru" + def dump(:sk), do: "sk" + def dump(:sl), do: "sl" + def dump(:sq), do: "sq" + def dump(:sr), do: "sr" + def dump(:sv), do: "sv" + def dump(:sw), do: "sw" + def dump(:ta), do: "ta" + def dump(:te), do: "te" + def dump(:th), do: "th" + def dump(:tr), do: "tr" + def dump(:uk), do: "uk" + def dump(:ur), do: "ur" + def dump(:uz), do: "uz" + def dump(:vi), do: "vi" + def dump(:zh), do: "zh" + def dump(:zh_cn), do: "zh-CN" + def dump(:zh_hk), do: "zh-HK" + def dump(:zh_tw), do: "zh-TW" + def dump(:zu), do: "zu" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/create_user_organization_membership.ex b/lib/workos/create_user_organization_membership.ex new file mode 100644 index 00000000..e6233763 --- /dev/null +++ b/lib/workos/create_user_organization_membership.ex @@ -0,0 +1,43 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.CreateUserOrganizationMembership do + @moduledoc """ + CreateUserOrganizationMembership model. + """ + + defstruct [ + :user_id, + :organization_id, + :role_slug, + :role_slugs + ] + + @type t :: %__MODULE__{ + user_id: String.t(), + organization_id: String.t(), + role_slug: String.t() | nil, + role_slugs: [String.t()] | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + user_id: map["user_id"], + organization_id: map["organization_id"], + role_slug: map["role_slug"], + role_slugs: map["role_slugs"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "user_id" => struct.user_id, + "organization_id" => struct.organization_id, + "role_slug" => struct.role_slug, + "role_slugs" => struct.role_slugs + }) + end +end diff --git a/lib/workos/create_user_password_hash_type.ex b/lib/workos/create_user_password_hash_type.ex new file mode 100644 index 00000000..11d4c01d --- /dev/null +++ b/lib/workos/create_user_password_hash_type.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.CreateUserPasswordHashType do + @moduledoc """ + CreateUserPasswordHashType enum. + """ + + @type t :: :bcrypt | :firebase_scrypt | :ssha | :ssha_256 | :scrypt | :pbkdf_2 | :argon_2 + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:bcrypt, :firebase_scrypt, :ssha, :ssha_256, :scrypt, :pbkdf_2, :argon_2] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("bcrypt"), do: :bcrypt + def cast("firebase-scrypt"), do: :firebase_scrypt + def cast("ssha"), do: :ssha + def cast("ssha256"), do: :ssha_256 + def cast("scrypt"), do: :scrypt + def cast("pbkdf2"), do: :pbkdf_2 + def cast("argon2"), do: :argon_2 + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:bcrypt), do: "bcrypt" + def dump(:firebase_scrypt), do: "firebase-scrypt" + def dump(:ssha), do: "ssha" + def dump(:ssha_256), do: "ssha256" + def dump(:scrypt), do: "scrypt" + def dump(:pbkdf_2), do: "pbkdf2" + def dump(:argon_2), do: "argon2" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/create_webhook_endpoint.ex b/lib/workos/create_webhook_endpoint.ex new file mode 100644 index 00000000..299a813d --- /dev/null +++ b/lib/workos/create_webhook_endpoint.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.CreateWebhookEndpoint do + @moduledoc """ + CreateWebhookEndpoint model. + """ + + defstruct [ + :endpoint_url, + :events + ] + + @type t :: %__MODULE__{ + endpoint_url: String.t(), + events: [WorkOS.CreateWebhookEndpointEvents.t()] + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + endpoint_url: map["endpoint_url"], + events: WorkOS.Cast.list(map["events"], &WorkOS.CreateWebhookEndpointEvents.cast/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "endpoint_url" => struct.endpoint_url, + "events" => WorkOS.Cast.list(struct.events, &WorkOS.CreateWebhookEndpointEvents.dump/1) + }) + end +end diff --git a/lib/workos/create_webhook_endpoint_events.ex b/lib/workos/create_webhook_endpoint_events.ex new file mode 100644 index 00000000..36176b69 --- /dev/null +++ b/lib/workos/create_webhook_endpoint_events.ex @@ -0,0 +1,439 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.CreateWebhookEndpointEvents do + @moduledoc """ + CreateWebhookEndpointEvents enum. + """ + + @type t :: + :agent_registration_created + | :agent_registration_claim_attempt_created + | :agent_registration_claim_completed + | :agent_registration_credential_issued + | :agent_registration_deleted + | :agent_registration_expired + | :agent_registration_organization_switched + | :agent_registration_revoked + | :authentication_email_verification_succeeded + | :authentication_magic_auth_failed + | :authentication_magic_auth_succeeded + | :authentication_mfa_succeeded + | :authentication_oauth_failed + | :authentication_oauth_succeeded + | :authentication_password_failed + | :authentication_password_succeeded + | :authentication_passkey_failed + | :authentication_passkey_succeeded + | :authentication_sso_failed + | :authentication_sso_started + | :authentication_sso_succeeded + | :authentication_sso_timed_out + | :radar_challenge_created + | :authentication_radar_risk_detected + | :authentication_reauthentication_succeeded + | :api_key_created + | :api_key_revoked + | :api_key_updated + | :connection_activated + | :connection_deactivated + | :connection_saml_certificate_renewal_required + | :connection_saml_certificate_renewed + | :connection_deleted + | :dsync_activated + | :dsync_deleted + | :dsync_group_created + | :dsync_group_deleted + | :dsync_group_updated + | :dsync_group_user_added + | :dsync_group_user_removed + | :dsync_user_created + | :dsync_user_deleted + | :dsync_user_updated + | :email_verification_created + | :group_created + | :group_deleted + | :group_member_added + | :group_member_removed + | :group_updated + | :flag_created + | :flag_deleted + | :flag_updated + | :flag_rule_updated + | :invitation_accepted + | :invitation_created + | :invitation_resent + | :invitation_revoked + | :magic_auth_created + | :organization_created + | :organization_deleted + | :organization_updated + | :organization_domain_created + | :organization_domain_deleted + | :organization_domain_updated + | :organization_domain_verified + | :organization_domain_verification_failed + | :password_reset_created + | :password_reset_succeeded + | :user_created + | :user_updated + | :user_deleted + | :organization_membership_created + | :organization_membership_deleted + | :organization_membership_updated + | :role_created + | :role_deleted + | :role_updated + | :organization_role_created + | :organization_role_deleted + | :organization_role_updated + | :permission_created + | :permission_deleted + | :permission_updated + | :pipes_connected_account_connected + | :pipes_connected_account_connection_failed + | :pipes_connected_account_disconnected + | :pipes_connected_account_reauthorization_needed + | :session_created + | :session_revoked + | :waitlist_user_approved + | :waitlist_user_created + | :waitlist_user_denied + + @doc "All known values." + @spec values() :: [t()] + def values, + do: [ + :agent_registration_created, + :agent_registration_claim_attempt_created, + :agent_registration_claim_completed, + :agent_registration_credential_issued, + :agent_registration_deleted, + :agent_registration_expired, + :agent_registration_organization_switched, + :agent_registration_revoked, + :authentication_email_verification_succeeded, + :authentication_magic_auth_failed, + :authentication_magic_auth_succeeded, + :authentication_mfa_succeeded, + :authentication_oauth_failed, + :authentication_oauth_succeeded, + :authentication_password_failed, + :authentication_password_succeeded, + :authentication_passkey_failed, + :authentication_passkey_succeeded, + :authentication_sso_failed, + :authentication_sso_started, + :authentication_sso_succeeded, + :authentication_sso_timed_out, + :radar_challenge_created, + :authentication_radar_risk_detected, + :authentication_reauthentication_succeeded, + :api_key_created, + :api_key_revoked, + :api_key_updated, + :connection_activated, + :connection_deactivated, + :connection_saml_certificate_renewal_required, + :connection_saml_certificate_renewed, + :connection_deleted, + :dsync_activated, + :dsync_deleted, + :dsync_group_created, + :dsync_group_deleted, + :dsync_group_updated, + :dsync_group_user_added, + :dsync_group_user_removed, + :dsync_user_created, + :dsync_user_deleted, + :dsync_user_updated, + :email_verification_created, + :group_created, + :group_deleted, + :group_member_added, + :group_member_removed, + :group_updated, + :flag_created, + :flag_deleted, + :flag_updated, + :flag_rule_updated, + :invitation_accepted, + :invitation_created, + :invitation_resent, + :invitation_revoked, + :magic_auth_created, + :organization_created, + :organization_deleted, + :organization_updated, + :organization_domain_created, + :organization_domain_deleted, + :organization_domain_updated, + :organization_domain_verified, + :organization_domain_verification_failed, + :password_reset_created, + :password_reset_succeeded, + :user_created, + :user_updated, + :user_deleted, + :organization_membership_created, + :organization_membership_deleted, + :organization_membership_updated, + :role_created, + :role_deleted, + :role_updated, + :organization_role_created, + :organization_role_deleted, + :organization_role_updated, + :permission_created, + :permission_deleted, + :permission_updated, + :pipes_connected_account_connected, + :pipes_connected_account_connection_failed, + :pipes_connected_account_disconnected, + :pipes_connected_account_reauthorization_needed, + :session_created, + :session_revoked, + :waitlist_user_approved, + :waitlist_user_created, + :waitlist_user_denied + ] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("agent.registration.created"), do: :agent_registration_created + + def cast("agent.registration.claim.attempt.created"), + do: :agent_registration_claim_attempt_created + + def cast("agent.registration.claim.completed"), do: :agent_registration_claim_completed + def cast("agent.registration.credential.issued"), do: :agent_registration_credential_issued + def cast("agent.registration.deleted"), do: :agent_registration_deleted + def cast("agent.registration.expired"), do: :agent_registration_expired + + def cast("agent.registration.organization.switched"), + do: :agent_registration_organization_switched + + def cast("agent.registration.revoked"), do: :agent_registration_revoked + + def cast("authentication.email_verification_succeeded"), + do: :authentication_email_verification_succeeded + + def cast("authentication.magic_auth_failed"), do: :authentication_magic_auth_failed + def cast("authentication.magic_auth_succeeded"), do: :authentication_magic_auth_succeeded + def cast("authentication.mfa_succeeded"), do: :authentication_mfa_succeeded + def cast("authentication.oauth_failed"), do: :authentication_oauth_failed + def cast("authentication.oauth_succeeded"), do: :authentication_oauth_succeeded + def cast("authentication.password_failed"), do: :authentication_password_failed + def cast("authentication.password_succeeded"), do: :authentication_password_succeeded + def cast("authentication.passkey_failed"), do: :authentication_passkey_failed + def cast("authentication.passkey_succeeded"), do: :authentication_passkey_succeeded + def cast("authentication.sso_failed"), do: :authentication_sso_failed + def cast("authentication.sso_started"), do: :authentication_sso_started + def cast("authentication.sso_succeeded"), do: :authentication_sso_succeeded + def cast("authentication.sso_timed_out"), do: :authentication_sso_timed_out + def cast("radar.challenge_created"), do: :radar_challenge_created + def cast("authentication.radar_risk_detected"), do: :authentication_radar_risk_detected + + def cast("authentication.reauthentication_succeeded"), + do: :authentication_reauthentication_succeeded + + def cast("api_key.created"), do: :api_key_created + def cast("api_key.revoked"), do: :api_key_revoked + def cast("api_key.updated"), do: :api_key_updated + def cast("connection.activated"), do: :connection_activated + def cast("connection.deactivated"), do: :connection_deactivated + + def cast("connection.saml_certificate_renewal_required"), + do: :connection_saml_certificate_renewal_required + + def cast("connection.saml_certificate_renewed"), do: :connection_saml_certificate_renewed + def cast("connection.deleted"), do: :connection_deleted + def cast("dsync.activated"), do: :dsync_activated + def cast("dsync.deleted"), do: :dsync_deleted + def cast("dsync.group.created"), do: :dsync_group_created + def cast("dsync.group.deleted"), do: :dsync_group_deleted + def cast("dsync.group.updated"), do: :dsync_group_updated + def cast("dsync.group.user_added"), do: :dsync_group_user_added + def cast("dsync.group.user_removed"), do: :dsync_group_user_removed + def cast("dsync.user.created"), do: :dsync_user_created + def cast("dsync.user.deleted"), do: :dsync_user_deleted + def cast("dsync.user.updated"), do: :dsync_user_updated + def cast("email_verification.created"), do: :email_verification_created + def cast("group.created"), do: :group_created + def cast("group.deleted"), do: :group_deleted + def cast("group.member_added"), do: :group_member_added + def cast("group.member_removed"), do: :group_member_removed + def cast("group.updated"), do: :group_updated + def cast("flag.created"), do: :flag_created + def cast("flag.deleted"), do: :flag_deleted + def cast("flag.updated"), do: :flag_updated + def cast("flag.rule_updated"), do: :flag_rule_updated + def cast("invitation.accepted"), do: :invitation_accepted + def cast("invitation.created"), do: :invitation_created + def cast("invitation.resent"), do: :invitation_resent + def cast("invitation.revoked"), do: :invitation_revoked + def cast("magic_auth.created"), do: :magic_auth_created + def cast("organization.created"), do: :organization_created + def cast("organization.deleted"), do: :organization_deleted + def cast("organization.updated"), do: :organization_updated + def cast("organization_domain.created"), do: :organization_domain_created + def cast("organization_domain.deleted"), do: :organization_domain_deleted + def cast("organization_domain.updated"), do: :organization_domain_updated + def cast("organization_domain.verified"), do: :organization_domain_verified + + def cast("organization_domain.verification_failed"), + do: :organization_domain_verification_failed + + def cast("password_reset.created"), do: :password_reset_created + def cast("password_reset.succeeded"), do: :password_reset_succeeded + def cast("user.created"), do: :user_created + def cast("user.updated"), do: :user_updated + def cast("user.deleted"), do: :user_deleted + def cast("organization_membership.created"), do: :organization_membership_created + def cast("organization_membership.deleted"), do: :organization_membership_deleted + def cast("organization_membership.updated"), do: :organization_membership_updated + def cast("role.created"), do: :role_created + def cast("role.deleted"), do: :role_deleted + def cast("role.updated"), do: :role_updated + def cast("organization_role.created"), do: :organization_role_created + def cast("organization_role.deleted"), do: :organization_role_deleted + def cast("organization_role.updated"), do: :organization_role_updated + def cast("permission.created"), do: :permission_created + def cast("permission.deleted"), do: :permission_deleted + def cast("permission.updated"), do: :permission_updated + def cast("pipes.connected_account.connected"), do: :pipes_connected_account_connected + + def cast("pipes.connected_account.connection_failed"), + do: :pipes_connected_account_connection_failed + + def cast("pipes.connected_account.disconnected"), do: :pipes_connected_account_disconnected + + def cast("pipes.connected_account.reauthorization_needed"), + do: :pipes_connected_account_reauthorization_needed + + def cast("session.created"), do: :session_created + def cast("session.revoked"), do: :session_revoked + def cast("waitlist_user.approved"), do: :waitlist_user_approved + def cast("waitlist_user.created"), do: :waitlist_user_created + def cast("waitlist_user.denied"), do: :waitlist_user_denied + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:agent_registration_created), do: "agent.registration.created" + + def dump(:agent_registration_claim_attempt_created), + do: "agent.registration.claim.attempt.created" + + def dump(:agent_registration_claim_completed), do: "agent.registration.claim.completed" + def dump(:agent_registration_credential_issued), do: "agent.registration.credential.issued" + def dump(:agent_registration_deleted), do: "agent.registration.deleted" + def dump(:agent_registration_expired), do: "agent.registration.expired" + + def dump(:agent_registration_organization_switched), + do: "agent.registration.organization.switched" + + def dump(:agent_registration_revoked), do: "agent.registration.revoked" + + def dump(:authentication_email_verification_succeeded), + do: "authentication.email_verification_succeeded" + + def dump(:authentication_magic_auth_failed), do: "authentication.magic_auth_failed" + def dump(:authentication_magic_auth_succeeded), do: "authentication.magic_auth_succeeded" + def dump(:authentication_mfa_succeeded), do: "authentication.mfa_succeeded" + def dump(:authentication_oauth_failed), do: "authentication.oauth_failed" + def dump(:authentication_oauth_succeeded), do: "authentication.oauth_succeeded" + def dump(:authentication_password_failed), do: "authentication.password_failed" + def dump(:authentication_password_succeeded), do: "authentication.password_succeeded" + def dump(:authentication_passkey_failed), do: "authentication.passkey_failed" + def dump(:authentication_passkey_succeeded), do: "authentication.passkey_succeeded" + def dump(:authentication_sso_failed), do: "authentication.sso_failed" + def dump(:authentication_sso_started), do: "authentication.sso_started" + def dump(:authentication_sso_succeeded), do: "authentication.sso_succeeded" + def dump(:authentication_sso_timed_out), do: "authentication.sso_timed_out" + def dump(:radar_challenge_created), do: "radar.challenge_created" + def dump(:authentication_radar_risk_detected), do: "authentication.radar_risk_detected" + + def dump(:authentication_reauthentication_succeeded), + do: "authentication.reauthentication_succeeded" + + def dump(:api_key_created), do: "api_key.created" + def dump(:api_key_revoked), do: "api_key.revoked" + def dump(:api_key_updated), do: "api_key.updated" + def dump(:connection_activated), do: "connection.activated" + def dump(:connection_deactivated), do: "connection.deactivated" + + def dump(:connection_saml_certificate_renewal_required), + do: "connection.saml_certificate_renewal_required" + + def dump(:connection_saml_certificate_renewed), do: "connection.saml_certificate_renewed" + def dump(:connection_deleted), do: "connection.deleted" + def dump(:dsync_activated), do: "dsync.activated" + def dump(:dsync_deleted), do: "dsync.deleted" + def dump(:dsync_group_created), do: "dsync.group.created" + def dump(:dsync_group_deleted), do: "dsync.group.deleted" + def dump(:dsync_group_updated), do: "dsync.group.updated" + def dump(:dsync_group_user_added), do: "dsync.group.user_added" + def dump(:dsync_group_user_removed), do: "dsync.group.user_removed" + def dump(:dsync_user_created), do: "dsync.user.created" + def dump(:dsync_user_deleted), do: "dsync.user.deleted" + def dump(:dsync_user_updated), do: "dsync.user.updated" + def dump(:email_verification_created), do: "email_verification.created" + def dump(:group_created), do: "group.created" + def dump(:group_deleted), do: "group.deleted" + def dump(:group_member_added), do: "group.member_added" + def dump(:group_member_removed), do: "group.member_removed" + def dump(:group_updated), do: "group.updated" + def dump(:flag_created), do: "flag.created" + def dump(:flag_deleted), do: "flag.deleted" + def dump(:flag_updated), do: "flag.updated" + def dump(:flag_rule_updated), do: "flag.rule_updated" + def dump(:invitation_accepted), do: "invitation.accepted" + def dump(:invitation_created), do: "invitation.created" + def dump(:invitation_resent), do: "invitation.resent" + def dump(:invitation_revoked), do: "invitation.revoked" + def dump(:magic_auth_created), do: "magic_auth.created" + def dump(:organization_created), do: "organization.created" + def dump(:organization_deleted), do: "organization.deleted" + def dump(:organization_updated), do: "organization.updated" + def dump(:organization_domain_created), do: "organization_domain.created" + def dump(:organization_domain_deleted), do: "organization_domain.deleted" + def dump(:organization_domain_updated), do: "organization_domain.updated" + def dump(:organization_domain_verified), do: "organization_domain.verified" + + def dump(:organization_domain_verification_failed), + do: "organization_domain.verification_failed" + + def dump(:password_reset_created), do: "password_reset.created" + def dump(:password_reset_succeeded), do: "password_reset.succeeded" + def dump(:user_created), do: "user.created" + def dump(:user_updated), do: "user.updated" + def dump(:user_deleted), do: "user.deleted" + def dump(:organization_membership_created), do: "organization_membership.created" + def dump(:organization_membership_deleted), do: "organization_membership.deleted" + def dump(:organization_membership_updated), do: "organization_membership.updated" + def dump(:role_created), do: "role.created" + def dump(:role_deleted), do: "role.deleted" + def dump(:role_updated), do: "role.updated" + def dump(:organization_role_created), do: "organization_role.created" + def dump(:organization_role_deleted), do: "organization_role.deleted" + def dump(:organization_role_updated), do: "organization_role.updated" + def dump(:permission_created), do: "permission.created" + def dump(:permission_deleted), do: "permission.deleted" + def dump(:permission_updated), do: "permission.updated" + def dump(:pipes_connected_account_connected), do: "pipes.connected_account.connected" + + def dump(:pipes_connected_account_connection_failed), + do: "pipes.connected_account.connection_failed" + + def dump(:pipes_connected_account_disconnected), do: "pipes.connected_account.disconnected" + + def dump(:pipes_connected_account_reauthorization_needed), + do: "pipes.connected_account.reauthorization_needed" + + def dump(:session_created), do: "session.created" + def dump(:session_revoked), do: "session.revoked" + def dump(:waitlist_user_approved), do: "waitlist_user.approved" + def dump(:waitlist_user_created), do: "waitlist_user.created" + def dump(:waitlist_user_denied), do: "waitlist_user.denied" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/custom_provider_definition.ex b/lib/workos/custom_provider_definition.ex new file mode 100644 index 00000000..560710ae --- /dev/null +++ b/lib/workos/custom_provider_definition.ex @@ -0,0 +1,79 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.CustomProviderDefinition do + @moduledoc """ + CustomProviderDefinition model. + """ + + defstruct [ + :name, + :authorization_url, + :token_url, + :refresh_token_url, + :pkce_enabled, + :request_scope_separator, + :scopes_required, + :client_secret_required, + :additional_authorization_parameters, + :token_body_content_type, + :authenticate_via + ] + + @type t :: %__MODULE__{ + name: String.t(), + authorization_url: String.t(), + token_url: String.t(), + refresh_token_url: String.t() | nil, + pkce_enabled: boolean() | nil, + request_scope_separator: String.t() | nil, + scopes_required: boolean() | nil, + client_secret_required: boolean() | nil, + additional_authorization_parameters: %{optional(String.t()) => String.t()} | nil, + token_body_content_type: String.t() | nil, + authenticate_via: WorkOS.CustomProviderDefinitionAuthenticateVia.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + name: map["name"], + authorization_url: map["authorization_url"], + token_url: map["token_url"], + refresh_token_url: map["refresh_token_url"], + pkce_enabled: map["pkce_enabled"], + request_scope_separator: map["request_scope_separator"], + scopes_required: map["scopes_required"], + client_secret_required: map["client_secret_required"], + additional_authorization_parameters: map["additional_authorization_parameters"], + token_body_content_type: map["token_body_content_type"], + authenticate_via: + WorkOS.Cast.enum( + map["authenticate_via"], + &WorkOS.CustomProviderDefinitionAuthenticateVia.cast/1 + ) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "name" => struct.name, + "authorization_url" => struct.authorization_url, + "token_url" => struct.token_url, + "refresh_token_url" => struct.refresh_token_url, + "pkce_enabled" => struct.pkce_enabled, + "request_scope_separator" => struct.request_scope_separator, + "scopes_required" => struct.scopes_required, + "client_secret_required" => struct.client_secret_required, + "additional_authorization_parameters" => struct.additional_authorization_parameters, + "token_body_content_type" => struct.token_body_content_type, + "authenticate_via" => + WorkOS.Cast.enum( + struct.authenticate_via, + &WorkOS.CustomProviderDefinitionAuthenticateVia.dump/1 + ) + }) + end +end diff --git a/lib/workos/custom_provider_definition_authenticate_via.ex b/lib/workos/custom_provider_definition_authenticate_via.ex new file mode 100644 index 00000000..37afeadd --- /dev/null +++ b/lib/workos/custom_provider_definition_authenticate_via.ex @@ -0,0 +1,25 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.CustomProviderDefinitionAuthenticateVia do + @moduledoc """ + CustomProviderDefinitionAuthenticateVia enum. + """ + + @type t :: :request_body | :basic_auth_header + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:request_body, :basic_auth_header] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("request_body"), do: :request_body + def cast("basic_auth_header"), do: :basic_auth_header + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:request_body), do: "request_body" + def dump(:basic_auth_header), do: "basic_auth_header" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/data_integration.ex b/lib/workos/data_integration.ex new file mode 100644 index 00000000..b8a734e6 --- /dev/null +++ b/lib/workos/data_integration.ex @@ -0,0 +1,105 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DataIntegration do + @moduledoc """ + DataIntegration model. + """ + + defstruct [ + :object, + :id, + :slug, + :integration_type, + :description, + :enabled, + :state, + :scopes, + :redirect_uri, + :auth_methods, + :credentials, + :installation, + :config, + :custom_provider, + :created_at, + :updated_at + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + slug: String.t(), + integration_type: String.t(), + description: String.t() | nil, + enabled: boolean(), + state: WorkOS.DataIntegrationState.t(), + scopes: [String.t()] | nil, + redirect_uri: String.t(), + auth_methods: [WorkOS.DataIntegrationAuthMethods.t()], + credentials: WorkOS.DataIntegrationCredential.t(), + installation: WorkOS.DataIntegrationInstallation.t() | nil, + config: %{optional(String.t()) => String.t()}, + custom_provider: WorkOS.DataIntegrationCustomProvider.t() | nil, + created_at: String.t(), + updated_at: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + slug: map["slug"], + integration_type: map["integration_type"], + description: map["description"], + enabled: map["enabled"], + state: WorkOS.Cast.enum(map["state"], &WorkOS.DataIntegrationState.cast/1), + scopes: map["scopes"], + redirect_uri: map["redirect_uri"], + auth_methods: + WorkOS.Cast.list(map["auth_methods"], &WorkOS.DataIntegrationAuthMethods.cast/1), + credentials: + WorkOS.Cast.nested(map["credentials"], &WorkOS.DataIntegrationCredential.from_map/1), + installation: + WorkOS.Cast.nested(map["installation"], &WorkOS.DataIntegrationInstallation.from_map/1), + config: map["config"], + custom_provider: + WorkOS.Cast.nested( + map["custom_provider"], + &WorkOS.DataIntegrationCustomProvider.from_map/1 + ), + created_at: map["created_at"], + updated_at: map["updated_at"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "slug" => struct.slug, + "integration_type" => struct.integration_type, + "description" => struct.description, + "enabled" => struct.enabled, + "state" => WorkOS.Cast.enum(struct.state, &WorkOS.DataIntegrationState.dump/1), + "scopes" => struct.scopes, + "redirect_uri" => struct.redirect_uri, + "auth_methods" => + WorkOS.Cast.list(struct.auth_methods, &WorkOS.DataIntegrationAuthMethods.dump/1), + "credentials" => + WorkOS.Cast.dump_struct(struct.credentials, &WorkOS.DataIntegrationCredential.to_map/1), + "installation" => + WorkOS.Cast.dump_struct(struct.installation, &WorkOS.DataIntegrationInstallation.to_map/1), + "config" => struct.config, + "custom_provider" => + WorkOS.Cast.dump_struct( + struct.custom_provider, + &WorkOS.DataIntegrationCustomProvider.to_map/1 + ), + "created_at" => struct.created_at, + "updated_at" => struct.updated_at + }) + end +end diff --git a/lib/workos/data_integration_access_token_response.ex b/lib/workos/data_integration_access_token_response.ex new file mode 100644 index 00000000..18424391 --- /dev/null +++ b/lib/workos/data_integration_access_token_response.ex @@ -0,0 +1,49 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DataIntegrationAccessTokenResponse do + @moduledoc """ + DataIntegrationAccessTokenResponse model. + """ + + defstruct [ + :active, + :access_token, + :error + ] + + @type t :: %__MODULE__{ + active: true | nil, + access_token: WorkOS.DataIntegrationAccessTokenResponseAccessToken.t() | nil, + error: WorkOS.DataIntegrationAccessTokenResponseError.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + active: map["active"], + access_token: + WorkOS.Cast.nested( + map["access_token"], + &WorkOS.DataIntegrationAccessTokenResponseAccessToken.from_map/1 + ), + error: + WorkOS.Cast.enum(map["error"], &WorkOS.DataIntegrationAccessTokenResponseError.cast/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "active" => struct.active, + "access_token" => + WorkOS.Cast.dump_struct( + struct.access_token, + &WorkOS.DataIntegrationAccessTokenResponseAccessToken.to_map/1 + ), + "error" => + WorkOS.Cast.enum(struct.error, &WorkOS.DataIntegrationAccessTokenResponseError.dump/1) + }) + end +end diff --git a/lib/workos/data_integration_access_token_response_access_token.ex b/lib/workos/data_integration_access_token_response_access_token.ex new file mode 100644 index 00000000..323cce43 --- /dev/null +++ b/lib/workos/data_integration_access_token_response_access_token.ex @@ -0,0 +1,47 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DataIntegrationAccessTokenResponseAccessToken do + @moduledoc """ + The [access token](https://workos.com/docs/reference/pipes/access-token) object, present when `active` is `true`. + """ + + defstruct [ + :object, + :access_token, + :expires_at, + :scopes, + :missing_scopes + ] + + @type t :: %__MODULE__{ + object: String.t(), + access_token: String.t(), + expires_at: String.t() | nil, + scopes: [String.t()], + missing_scopes: [String.t()] + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + access_token: map["access_token"], + expires_at: map["expires_at"], + scopes: map["scopes"], + missing_scopes: map["missing_scopes"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "access_token" => struct.access_token, + "expires_at" => struct.expires_at, + "scopes" => struct.scopes, + "missing_scopes" => struct.missing_scopes + }) + end +end diff --git a/lib/workos/data_integration_access_token_response_error.ex b/lib/workos/data_integration_access_token_response_error.ex new file mode 100644 index 00000000..955b1708 --- /dev/null +++ b/lib/workos/data_integration_access_token_response_error.ex @@ -0,0 +1,25 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DataIntegrationAccessTokenResponseError do + @moduledoc """ + DataIntegrationAccessTokenResponseError enum. + """ + + @type t :: :not_installed | :needs_reauthorization + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:not_installed, :needs_reauthorization] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("not_installed"), do: :not_installed + def cast("needs_reauthorization"), do: :needs_reauthorization + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:not_installed), do: "not_installed" + def dump(:needs_reauthorization), do: "needs_reauthorization" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/data_integration_auth_methods.ex b/lib/workos/data_integration_auth_methods.ex new file mode 100644 index 00000000..442b9fdc --- /dev/null +++ b/lib/workos/data_integration_auth_methods.ex @@ -0,0 +1,27 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DataIntegrationAuthMethods do + @moduledoc """ + DataIntegrationAuthMethods enum. + """ + + @type t :: :oauth | :api_key | :client_credentials + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:oauth, :api_key, :client_credentials] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("oauth"), do: :oauth + def cast("api_key"), do: :api_key + def cast("client_credentials"), do: :client_credentials + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:oauth), do: "oauth" + def dump(:api_key), do: "api_key" + def dump(:client_credentials), do: "client_credentials" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/data_integration_authorize_url_response.ex b/lib/workos/data_integration_authorize_url_response.ex new file mode 100644 index 00000000..bb61f6d9 --- /dev/null +++ b/lib/workos/data_integration_authorize_url_response.ex @@ -0,0 +1,31 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DataIntegrationAuthorizeUrlResponse do + @moduledoc """ + DataIntegrationAuthorizeUrlResponse model. + """ + + defstruct [ + :url + ] + + @type t :: %__MODULE__{ + url: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + url: map["url"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "url" => struct.url + }) + end +end diff --git a/lib/workos/data_integration_configuration_list_response.ex b/lib/workos/data_integration_configuration_list_response.ex new file mode 100644 index 00000000..2b41ff10 --- /dev/null +++ b/lib/workos/data_integration_configuration_list_response.ex @@ -0,0 +1,38 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DataIntegrationConfigurationListResponse do + @moduledoc """ + DataIntegrationConfigurationListResponse model. + """ + + defstruct [ + :object, + :data + ] + + @type t :: %__MODULE__{ + object: String.t(), + data: [WorkOS.DataIntegrationConfigurationResponse.t()] + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + data: WorkOS.Cast.list(map["data"], &WorkOS.DataIntegrationConfigurationResponse.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "data" => + WorkOS.Cast.list(struct.data, fn item -> + WorkOS.Cast.dump_struct(item, &WorkOS.DataIntegrationConfigurationResponse.to_map/1) + end) + }) + end +end diff --git a/lib/workos/data_integration_configuration_response.ex b/lib/workos/data_integration_configuration_response.ex new file mode 100644 index 00000000..7a4df43f --- /dev/null +++ b/lib/workos/data_integration_configuration_response.ex @@ -0,0 +1,73 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DataIntegrationConfigurationResponse do + @moduledoc """ + DataIntegrationConfigurationResponse model. + """ + + defstruct [ + :object, + :id, + :organization_id, + :slug, + :name, + :enabled, + :scopes, + :config, + :created_at, + :updated_at, + :credentials + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + organization_id: String.t(), + slug: String.t(), + name: String.t(), + enabled: boolean(), + scopes: [String.t()] | nil, + config: %{optional(String.t()) => String.t()}, + created_at: String.t(), + updated_at: String.t(), + credentials: WorkOS.DataIntegrationCredentials.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + organization_id: map["organization_id"], + slug: map["slug"], + name: map["name"], + enabled: map["enabled"], + scopes: map["scopes"], + config: map["config"], + created_at: map["created_at"], + updated_at: map["updated_at"], + credentials: + WorkOS.Cast.nested(map["credentials"], &WorkOS.DataIntegrationCredentials.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "organization_id" => struct.organization_id, + "slug" => struct.slug, + "name" => struct.name, + "enabled" => struct.enabled, + "scopes" => struct.scopes, + "config" => struct.config, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at, + "credentials" => + WorkOS.Cast.dump_struct(struct.credentials, &WorkOS.DataIntegrationCredentials.to_map/1) + }) + end +end diff --git a/lib/workos/data_integration_credential.ex b/lib/workos/data_integration_credential.ex new file mode 100644 index 00000000..250bcac1 --- /dev/null +++ b/lib/workos/data_integration_credential.ex @@ -0,0 +1,39 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DataIntegrationCredential do + @moduledoc """ + The credentials configured for the Data Integration. + """ + + defstruct [ + :type, + :client_id, + :redacted_client_secret + ] + + @type t :: %__MODULE__{ + type: WorkOS.DataIntegrationCredentialType.t(), + client_id: String.t() | nil, + redacted_client_secret: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + type: WorkOS.Cast.enum(map["type"], &WorkOS.DataIntegrationCredentialType.cast/1), + client_id: map["client_id"], + redacted_client_secret: map["redacted_client_secret"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "type" => WorkOS.Cast.enum(struct.type, &WorkOS.DataIntegrationCredentialType.dump/1), + "client_id" => struct.client_id, + "redacted_client_secret" => struct.redacted_client_secret + }) + end +end diff --git a/lib/workos/data_integration_credential_type.ex b/lib/workos/data_integration_credential_type.ex new file mode 100644 index 00000000..77ed46a0 --- /dev/null +++ b/lib/workos/data_integration_credential_type.ex @@ -0,0 +1,25 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DataIntegrationCredentialType do + @moduledoc """ + DataIntegrationCredentialType enum. + """ + + @type t :: :custom | :organization + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:custom, :organization] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("custom"), do: :custom + def cast("organization"), do: :organization + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:custom), do: "custom" + def dump(:organization), do: "organization" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/data_integration_credentials.ex b/lib/workos/data_integration_credentials.ex new file mode 100644 index 00000000..6e465f5e --- /dev/null +++ b/lib/workos/data_integration_credentials.ex @@ -0,0 +1,55 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DataIntegrationCredentials do + @moduledoc """ + Organization-managed OAuth credential configuration. Present only for integrations whose credentials are supplied by the organization; absent otherwise. + """ + + defstruct [ + :credentials_type, + :has_credentials, + :client_id, + :client_secret_last_four, + :redirect_uri + ] + + @type t :: %__MODULE__{ + credentials_type: WorkOS.DataIntegrationCredentialsCredentialsType.t(), + has_credentials: boolean(), + client_id: String.t() | nil, + client_secret_last_four: String.t() | nil, + redirect_uri: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + credentials_type: + WorkOS.Cast.enum( + map["credentials_type"], + &WorkOS.DataIntegrationCredentialsCredentialsType.cast/1 + ), + has_credentials: map["has_credentials"], + client_id: map["client_id"], + client_secret_last_four: map["client_secret_last_four"], + redirect_uri: map["redirect_uri"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "credentials_type" => + WorkOS.Cast.enum( + struct.credentials_type, + &WorkOS.DataIntegrationCredentialsCredentialsType.dump/1 + ), + "has_credentials" => struct.has_credentials, + "client_id" => struct.client_id, + "client_secret_last_four" => struct.client_secret_last_four, + "redirect_uri" => struct.redirect_uri + }) + end +end diff --git a/lib/workos/data_integration_credentials_credentials_type.ex b/lib/workos/data_integration_credentials_credentials_type.ex new file mode 100644 index 00000000..3e5207fa --- /dev/null +++ b/lib/workos/data_integration_credentials_credentials_type.ex @@ -0,0 +1,27 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DataIntegrationCredentialsCredentialsType do + @moduledoc """ + DataIntegrationCredentialsCredentialsType enum. + """ + + @type t :: :shared | :custom | :organization + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:shared, :custom, :organization] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("shared"), do: :shared + def cast("custom"), do: :custom + def cast("organization"), do: :organization + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:shared), do: "shared" + def dump(:custom), do: "custom" + def dump(:organization), do: "organization" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/data_integration_credentials_input.ex b/lib/workos/data_integration_credentials_input.ex new file mode 100644 index 00000000..e181384b --- /dev/null +++ b/lib/workos/data_integration_credentials_input.ex @@ -0,0 +1,39 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DataIntegrationCredentialsInput do + @moduledoc """ + DataIntegrationCredentialsInput model. + """ + + defstruct [ + :type, + :client_id, + :client_secret + ] + + @type t :: %__MODULE__{ + type: WorkOS.DataIntegrationCredentialsInputType.t(), + client_id: String.t() | nil, + client_secret: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + type: WorkOS.Cast.enum(map["type"], &WorkOS.DataIntegrationCredentialsInputType.cast/1), + client_id: map["client_id"], + client_secret: map["client_secret"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "type" => WorkOS.Cast.enum(struct.type, &WorkOS.DataIntegrationCredentialsInputType.dump/1), + "client_id" => struct.client_id, + "client_secret" => struct.client_secret + }) + end +end diff --git a/lib/workos/data_integration_credentials_input_type.ex b/lib/workos/data_integration_credentials_input_type.ex new file mode 100644 index 00000000..92d915e3 --- /dev/null +++ b/lib/workos/data_integration_credentials_input_type.ex @@ -0,0 +1,25 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DataIntegrationCredentialsInputType do + @moduledoc """ + DataIntegrationCredentialsInputType enum. + """ + + @type t :: :custom | :organization + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:custom, :organization] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("custom"), do: :custom + def cast("organization"), do: :organization + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:custom), do: "custom" + def dump(:organization), do: "organization" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/data_integration_credentials_response.ex b/lib/workos/data_integration_credentials_response.ex new file mode 100644 index 00000000..1d4f0ca4 --- /dev/null +++ b/lib/workos/data_integration_credentials_response.ex @@ -0,0 +1,49 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DataIntegrationCredentialsResponse do + @moduledoc """ + DataIntegrationCredentialsResponse model. + """ + + defstruct [ + :active, + :credential, + :error + ] + + @type t :: %__MODULE__{ + active: true | nil, + credential: WorkOS.DataIntegrationCredentialsResponseCredential.t() | nil, + error: WorkOS.DataIntegrationCredentialsResponseError.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + active: map["active"], + credential: + WorkOS.Cast.nested( + map["credential"], + &WorkOS.DataIntegrationCredentialsResponseCredential.from_map/1 + ), + error: + WorkOS.Cast.enum(map["error"], &WorkOS.DataIntegrationCredentialsResponseError.cast/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "active" => struct.active, + "credential" => + WorkOS.Cast.dump_struct( + struct.credential, + &WorkOS.DataIntegrationCredentialsResponseCredential.to_map/1 + ), + "error" => + WorkOS.Cast.enum(struct.error, &WorkOS.DataIntegrationCredentialsResponseError.dump/1) + }) + end +end diff --git a/lib/workos/data_integration_credentials_response_credential.ex b/lib/workos/data_integration_credentials_response_credential.ex new file mode 100644 index 00000000..240e7f5d --- /dev/null +++ b/lib/workos/data_integration_credentials_response_credential.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DataIntegrationCredentialsResponseCredential do + @moduledoc """ + The credential object containing the vended secret. + """ + + defstruct [ + :object, + :auth_method, + :value, + :expires_at, + :scopes, + :missing_scopes + ] + + @type t :: %__MODULE__{ + object: String.t(), + auth_method: String.t(), + value: String.t(), + expires_at: String.t() | nil, + scopes: [String.t()], + missing_scopes: [String.t()] + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + auth_method: map["auth_method"], + value: map["value"], + expires_at: map["expires_at"], + scopes: map["scopes"], + missing_scopes: map["missing_scopes"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "auth_method" => struct.auth_method, + "value" => struct.value, + "expires_at" => struct.expires_at, + "scopes" => struct.scopes, + "missing_scopes" => struct.missing_scopes + }) + end +end diff --git a/lib/workos/data_integration_credentials_response_error.ex b/lib/workos/data_integration_credentials_response_error.ex new file mode 100644 index 00000000..44577ce2 --- /dev/null +++ b/lib/workos/data_integration_credentials_response_error.ex @@ -0,0 +1,25 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DataIntegrationCredentialsResponseError do + @moduledoc """ + DataIntegrationCredentialsResponseError enum. + """ + + @type t :: :not_installed | :needs_reauthorization + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:not_installed, :needs_reauthorization] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("not_installed"), do: :not_installed + def cast("needs_reauthorization"), do: :needs_reauthorization + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:not_installed), do: "not_installed" + def dump(:needs_reauthorization), do: "needs_reauthorization" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/data_integration_custom_provider.ex b/lib/workos/data_integration_custom_provider.ex new file mode 100644 index 00000000..b2ad491a --- /dev/null +++ b/lib/workos/data_integration_custom_provider.ex @@ -0,0 +1,79 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DataIntegrationCustomProvider do + @moduledoc """ + DataIntegrationCustomProvider model. + """ + + defstruct [ + :name, + :authorization_url, + :token_url, + :refresh_token_url, + :pkce_enabled, + :request_scope_separator, + :scopes_required, + :client_secret_required, + :additional_authorization_parameters, + :token_body_content_type, + :authenticate_via + ] + + @type t :: %__MODULE__{ + name: String.t(), + authorization_url: String.t() | nil, + token_url: String.t() | nil, + refresh_token_url: String.t() | nil, + pkce_enabled: boolean(), + request_scope_separator: String.t(), + scopes_required: boolean(), + client_secret_required: boolean(), + additional_authorization_parameters: %{optional(String.t()) => String.t()}, + token_body_content_type: String.t(), + authenticate_via: WorkOS.DataIntegrationCustomProviderAuthenticateVia.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + name: map["name"], + authorization_url: map["authorization_url"], + token_url: map["token_url"], + refresh_token_url: map["refresh_token_url"], + pkce_enabled: map["pkce_enabled"], + request_scope_separator: map["request_scope_separator"], + scopes_required: map["scopes_required"], + client_secret_required: map["client_secret_required"], + additional_authorization_parameters: map["additional_authorization_parameters"], + token_body_content_type: map["token_body_content_type"], + authenticate_via: + WorkOS.Cast.enum( + map["authenticate_via"], + &WorkOS.DataIntegrationCustomProviderAuthenticateVia.cast/1 + ) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "name" => struct.name, + "authorization_url" => struct.authorization_url, + "token_url" => struct.token_url, + "refresh_token_url" => struct.refresh_token_url, + "pkce_enabled" => struct.pkce_enabled, + "request_scope_separator" => struct.request_scope_separator, + "scopes_required" => struct.scopes_required, + "client_secret_required" => struct.client_secret_required, + "additional_authorization_parameters" => struct.additional_authorization_parameters, + "token_body_content_type" => struct.token_body_content_type, + "authenticate_via" => + WorkOS.Cast.enum( + struct.authenticate_via, + &WorkOS.DataIntegrationCustomProviderAuthenticateVia.dump/1 + ) + }) + end +end diff --git a/lib/workos/data_integration_custom_provider_authenticate_via.ex b/lib/workos/data_integration_custom_provider_authenticate_via.ex new file mode 100644 index 00000000..b08fbafd --- /dev/null +++ b/lib/workos/data_integration_custom_provider_authenticate_via.ex @@ -0,0 +1,25 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DataIntegrationCustomProviderAuthenticateVia do + @moduledoc """ + DataIntegrationCustomProviderAuthenticateVia enum. + """ + + @type t :: :request_body | :basic_auth_header + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:request_body, :basic_auth_header] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("request_body"), do: :request_body + def cast("basic_auth_header"), do: :basic_auth_header + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:request_body), do: "request_body" + def dump(:basic_auth_header), do: "basic_auth_header" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/data_integration_installation.ex b/lib/workos/data_integration_installation.ex new file mode 100644 index 00000000..7b2f03db --- /dev/null +++ b/lib/workos/data_integration_installation.ex @@ -0,0 +1,43 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DataIntegrationInstallation do + @moduledoc """ + DataIntegrationInstallation model. + """ + + defstruct [ + :id, + :user_id, + :organization_id, + :api_key_last_4 + ] + + @type t :: %__MODULE__{ + id: String.t(), + user_id: String.t(), + organization_id: String.t() | nil, + api_key_last_4: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + id: map["id"], + user_id: map["user_id"], + organization_id: map["organization_id"], + api_key_last_4: map["api_key_last_4"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "id" => struct.id, + "user_id" => struct.user_id, + "organization_id" => struct.organization_id, + "api_key_last_4" => struct.api_key_last_4 + }) + end +end diff --git a/lib/workos/data_integration_list.ex b/lib/workos/data_integration_list.ex new file mode 100644 index 00000000..a2ea4227 --- /dev/null +++ b/lib/workos/data_integration_list.ex @@ -0,0 +1,50 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DataIntegrationList do + @moduledoc """ + DataIntegrationList model. + """ + + defstruct [ + :object, + :data, + :list_metadata + ] + + @type t :: %__MODULE__{ + object: String.t(), + data: [WorkOS.DataIntegration.t()], + list_metadata: WorkOS.DataIntegrationListListMetadata.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + data: WorkOS.Cast.list(map["data"], &WorkOS.DataIntegration.from_map/1), + list_metadata: + WorkOS.Cast.nested( + map["list_metadata"], + &WorkOS.DataIntegrationListListMetadata.from_map/1 + ) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "data" => + WorkOS.Cast.list(struct.data, fn item -> + WorkOS.Cast.dump_struct(item, &WorkOS.DataIntegration.to_map/1) + end), + "list_metadata" => + WorkOS.Cast.dump_struct( + struct.list_metadata, + &WorkOS.DataIntegrationListListMetadata.to_map/1 + ) + }) + end +end diff --git a/lib/workos/data_integration_list_list_metadata.ex b/lib/workos/data_integration_list_list_metadata.ex new file mode 100644 index 00000000..c0929d49 --- /dev/null +++ b/lib/workos/data_integration_list_list_metadata.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DataIntegrationListListMetadata do + @moduledoc """ + Pagination cursors for navigating between pages of results. + """ + + defstruct [ + :before, + :after_ + ] + + @type t :: %__MODULE__{ + before: String.t() | nil, + after_: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + before: map["before"], + after_: map["after"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "before" => struct.before, + "after" => struct.after_ + }) + end +end diff --git a/lib/workos/data_integration_state.ex b/lib/workos/data_integration_state.ex new file mode 100644 index 00000000..6b186142 --- /dev/null +++ b/lib/workos/data_integration_state.ex @@ -0,0 +1,27 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DataIntegrationState do + @moduledoc """ + DataIntegrationState enum. + """ + + @type t :: :valid | :invalid | :requested + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:valid, :invalid, :requested] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("valid"), do: :valid + def cast("invalid"), do: :invalid + def cast("requested"), do: :requested + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:valid), do: "valid" + def dump(:invalid), do: "invalid" + def dump(:requested), do: "requested" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/data_integrations_get_data_integration_authorize_url_request.ex b/lib/workos/data_integrations_get_data_integration_authorize_url_request.ex new file mode 100644 index 00000000..cfb50e3f --- /dev/null +++ b/lib/workos/data_integrations_get_data_integration_authorize_url_request.ex @@ -0,0 +1,43 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DataIntegrationsGetDataIntegrationAuthorizeUrlRequest do + @moduledoc """ + DataIntegrationsGetDataIntegrationAuthorizeUrlRequest model. + """ + + defstruct [ + :user_id, + :organization_id, + :return_to, + :config + ] + + @type t :: %__MODULE__{ + user_id: String.t(), + organization_id: String.t() | nil, + return_to: String.t() | nil, + config: %{optional(String.t()) => String.t()} | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + user_id: map["user_id"], + organization_id: map["organization_id"], + return_to: map["return_to"], + config: map["config"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "user_id" => struct.user_id, + "organization_id" => struct.organization_id, + "return_to" => struct.return_to, + "config" => struct.config + }) + end +end diff --git a/lib/workos/data_integrations_get_user_token_request.ex b/lib/workos/data_integrations_get_user_token_request.ex new file mode 100644 index 00000000..263da057 --- /dev/null +++ b/lib/workos/data_integrations_get_user_token_request.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DataIntegrationsGetUserTokenRequest do + @moduledoc """ + DataIntegrationsGetUserTokenRequest model. + """ + + defstruct [ + :user_id, + :organization_id + ] + + @type t :: %__MODULE__{ + user_id: String.t(), + organization_id: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + user_id: map["user_id"], + organization_id: map["organization_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "user_id" => struct.user_id, + "organization_id" => struct.organization_id + }) + end +end diff --git a/lib/workos/data_integrations_list_response.ex b/lib/workos/data_integrations_list_response.ex new file mode 100644 index 00000000..4e421020 --- /dev/null +++ b/lib/workos/data_integrations_list_response.ex @@ -0,0 +1,38 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DataIntegrationsListResponse do + @moduledoc """ + DataIntegrationsListResponse model. + """ + + defstruct [ + :object, + :data + ] + + @type t :: %__MODULE__{ + object: String.t(), + data: [WorkOS.DataIntegrationsListResponseData.t()] + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + data: WorkOS.Cast.list(map["data"], &WorkOS.DataIntegrationsListResponseData.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "data" => + WorkOS.Cast.list(struct.data, fn item -> + WorkOS.Cast.dump_struct(item, &WorkOS.DataIntegrationsListResponseData.to_map/1) + end) + }) + end +end diff --git a/lib/workos/data_integrations_list_response_data.ex b/lib/workos/data_integrations_list_response_data.ex new file mode 100644 index 00000000..30945ecc --- /dev/null +++ b/lib/workos/data_integrations_list_response_data.ex @@ -0,0 +1,103 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DataIntegrationsListResponseData do + @moduledoc """ + DataIntegrationsListResponseData model. + """ + + defstruct [ + :object, + :id, + :name, + :description, + :slug, + :integration_type, + :credentials_type, + :scopes, + :ownership, + :created_at, + :updated_at, + :connected_account, + :auth_methods + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + name: String.t(), + description: String.t() | nil, + slug: String.t(), + integration_type: String.t(), + credentials_type: String.t(), + scopes: [String.t()] | nil, + ownership: WorkOS.DataIntegrationsListResponseDataOwnership.t(), + created_at: String.t(), + updated_at: String.t(), + connected_account: WorkOS.DataIntegrationsListResponseDataConnectedAccount.t() | nil, + auth_methods: [WorkOS.DataIntegrationsListResponseDataAuthMethods.t()] | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + name: map["name"], + description: map["description"], + slug: map["slug"], + integration_type: map["integration_type"], + credentials_type: map["credentials_type"], + scopes: map["scopes"], + ownership: + WorkOS.Cast.enum( + map["ownership"], + &WorkOS.DataIntegrationsListResponseDataOwnership.cast/1 + ), + created_at: map["created_at"], + updated_at: map["updated_at"], + connected_account: + WorkOS.Cast.nested( + map["connected_account"], + &WorkOS.DataIntegrationsListResponseDataConnectedAccount.from_map/1 + ), + auth_methods: + WorkOS.Cast.list( + map["auth_methods"], + &WorkOS.DataIntegrationsListResponseDataAuthMethods.cast/1 + ) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "name" => struct.name, + "description" => struct.description, + "slug" => struct.slug, + "integration_type" => struct.integration_type, + "credentials_type" => struct.credentials_type, + "scopes" => struct.scopes, + "ownership" => + WorkOS.Cast.enum( + struct.ownership, + &WorkOS.DataIntegrationsListResponseDataOwnership.dump/1 + ), + "created_at" => struct.created_at, + "updated_at" => struct.updated_at, + "connected_account" => + WorkOS.Cast.dump_struct( + struct.connected_account, + &WorkOS.DataIntegrationsListResponseDataConnectedAccount.to_map/1 + ), + "auth_methods" => + WorkOS.Cast.list( + struct.auth_methods, + &WorkOS.DataIntegrationsListResponseDataAuthMethods.dump/1 + ) + }) + end +end diff --git a/lib/workos/data_integrations_list_response_data_auth_methods.ex b/lib/workos/data_integrations_list_response_data_auth_methods.ex new file mode 100644 index 00000000..72edce61 --- /dev/null +++ b/lib/workos/data_integrations_list_response_data_auth_methods.ex @@ -0,0 +1,27 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DataIntegrationsListResponseDataAuthMethods do + @moduledoc """ + DataIntegrationsListResponseDataAuthMethods enum. + """ + + @type t :: :oauth | :api_key | :client_credentials + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:oauth, :api_key, :client_credentials] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("oauth"), do: :oauth + def cast("api_key"), do: :api_key + def cast("client_credentials"), do: :client_credentials + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:oauth), do: "oauth" + def dump(:api_key), do: "api_key" + def dump(:client_credentials), do: "client_credentials" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/data_integrations_list_response_data_connected_account.ex b/lib/workos/data_integrations_list_response_data_connected_account.ex new file mode 100644 index 00000000..ced2ba2c --- /dev/null +++ b/lib/workos/data_integrations_list_response_data_connected_account.ex @@ -0,0 +1,92 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DataIntegrationsListResponseDataConnectedAccount do + @moduledoc """ + DataIntegrationsListResponseDataConnectedAccount model. + + ## Deprecated fields + + * `:userland_user_id` — Use `user_id` instead. + """ + + defstruct [ + :object, + :id, + :user_id, + :organization_id, + :scopes, + :state, + :created_at, + :updated_at, + :userland_user_id, + :auth_method, + :api_key_last_4 + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + user_id: String.t() | nil, + organization_id: String.t() | nil, + scopes: [String.t()], + state: WorkOS.DataIntegrationsListResponseDataConnectedAccountState.t(), + created_at: String.t(), + updated_at: String.t(), + userland_user_id: String.t() | nil, + auth_method: + WorkOS.DataIntegrationsListResponseDataConnectedAccountAuthMethod.t() | nil, + api_key_last_4: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + user_id: map["user_id"], + organization_id: map["organization_id"], + scopes: map["scopes"], + state: + WorkOS.Cast.enum( + map["state"], + &WorkOS.DataIntegrationsListResponseDataConnectedAccountState.cast/1 + ), + created_at: map["created_at"], + updated_at: map["updated_at"], + userland_user_id: map["userlandUserId"], + auth_method: + WorkOS.Cast.enum( + map["auth_method"], + &WorkOS.DataIntegrationsListResponseDataConnectedAccountAuthMethod.cast/1 + ), + api_key_last_4: map["api_key_last_4"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "user_id" => struct.user_id, + "organization_id" => struct.organization_id, + "scopes" => struct.scopes, + "state" => + WorkOS.Cast.enum( + struct.state, + &WorkOS.DataIntegrationsListResponseDataConnectedAccountState.dump/1 + ), + "created_at" => struct.created_at, + "updated_at" => struct.updated_at, + "userlandUserId" => struct.userland_user_id, + "auth_method" => + WorkOS.Cast.enum( + struct.auth_method, + &WorkOS.DataIntegrationsListResponseDataConnectedAccountAuthMethod.dump/1 + ), + "api_key_last_4" => struct.api_key_last_4 + }) + end +end diff --git a/lib/workos/data_integrations_list_response_data_connected_account_auth_method.ex b/lib/workos/data_integrations_list_response_data_connected_account_auth_method.ex new file mode 100644 index 00000000..611f34c8 --- /dev/null +++ b/lib/workos/data_integrations_list_response_data_connected_account_auth_method.ex @@ -0,0 +1,27 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DataIntegrationsListResponseDataConnectedAccountAuthMethod do + @moduledoc """ + DataIntegrationsListResponseDataConnectedAccountAuthMethod enum. + """ + + @type t :: :oauth | :api_key | :client_credentials + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:oauth, :api_key, :client_credentials] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("oauth"), do: :oauth + def cast("api_key"), do: :api_key + def cast("client_credentials"), do: :client_credentials + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:oauth), do: "oauth" + def dump(:api_key), do: "api_key" + def dump(:client_credentials), do: "client_credentials" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/data_integrations_list_response_data_connected_account_state.ex b/lib/workos/data_integrations_list_response_data_connected_account_state.ex new file mode 100644 index 00000000..b0233187 --- /dev/null +++ b/lib/workos/data_integrations_list_response_data_connected_account_state.ex @@ -0,0 +1,27 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DataIntegrationsListResponseDataConnectedAccountState do + @moduledoc """ + DataIntegrationsListResponseDataConnectedAccountState enum. + """ + + @type t :: :connected | :needs_reauthorization | :disconnected + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:connected, :needs_reauthorization, :disconnected] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("connected"), do: :connected + def cast("needs_reauthorization"), do: :needs_reauthorization + def cast("disconnected"), do: :disconnected + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:connected), do: "connected" + def dump(:needs_reauthorization), do: "needs_reauthorization" + def dump(:disconnected), do: "disconnected" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/data_integrations_list_response_data_ownership.ex b/lib/workos/data_integrations_list_response_data_ownership.ex new file mode 100644 index 00000000..db3605ba --- /dev/null +++ b/lib/workos/data_integrations_list_response_data_ownership.ex @@ -0,0 +1,25 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DataIntegrationsListResponseDataOwnership do + @moduledoc """ + DataIntegrationsListResponseDataOwnership enum. + """ + + @type t :: :userland_user | :organization + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:userland_user, :organization] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("userland_user"), do: :userland_user + def cast("organization"), do: :organization + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:userland_user), do: "userland_user" + def dump(:organization), do: "organization" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/data_integrations_upsert_api_key_request.ex b/lib/workos/data_integrations_upsert_api_key_request.ex new file mode 100644 index 00000000..8f0d8931 --- /dev/null +++ b/lib/workos/data_integrations_upsert_api_key_request.ex @@ -0,0 +1,39 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DataIntegrationsUpsertApiKeyRequest do + @moduledoc """ + DataIntegrationsUpsertApiKeyRequest model. + """ + + defstruct [ + :user_id, + :secret, + :organization_id + ] + + @type t :: %__MODULE__{ + user_id: String.t(), + secret: String.t(), + organization_id: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + user_id: map["user_id"], + secret: map["secret"], + organization_id: map["organization_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "user_id" => struct.user_id, + "secret" => struct.secret, + "organization_id" => struct.organization_id + }) + end +end diff --git a/lib/workos/data_integrations_vend_credentials_request.ex b/lib/workos/data_integrations_vend_credentials_request.ex new file mode 100644 index 00000000..6aaa95cb --- /dev/null +++ b/lib/workos/data_integrations_vend_credentials_request.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DataIntegrationsVendCredentialsRequest do + @moduledoc """ + DataIntegrationsVendCredentialsRequest model. + """ + + defstruct [ + :user_id, + :organization_id + ] + + @type t :: %__MODULE__{ + user_id: String.t(), + organization_id: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + user_id: map["user_id"], + organization_id: map["organization_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "user_id" => struct.user_id, + "organization_id" => struct.organization_id + }) + end +end diff --git a/lib/workos/decrypt_request.ex b/lib/workos/decrypt_request.ex new file mode 100644 index 00000000..98d0e085 --- /dev/null +++ b/lib/workos/decrypt_request.ex @@ -0,0 +1,31 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DecryptRequest do + @moduledoc """ + DecryptRequest model. + """ + + defstruct [ + :keys + ] + + @type t :: %__MODULE__{ + keys: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + keys: map["keys"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "keys" => struct.keys + }) + end +end diff --git a/lib/workos/decrypt_response.ex b/lib/workos/decrypt_response.ex new file mode 100644 index 00000000..17608df8 --- /dev/null +++ b/lib/workos/decrypt_response.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DecryptResponse do + @moduledoc """ + DecryptResponse model. + """ + + defstruct [ + :data_key, + :id + ] + + @type t :: %__MODULE__{ + data_key: String.t(), + id: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + data_key: map["data_key"], + id: map["id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "data_key" => struct.data_key, + "id" => struct.id + }) + end +end diff --git a/lib/workos/delete_group_role_assignments_by_criteria.ex b/lib/workos/delete_group_role_assignments_by_criteria.ex new file mode 100644 index 00000000..f5701802 --- /dev/null +++ b/lib/workos/delete_group_role_assignments_by_criteria.ex @@ -0,0 +1,43 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DeleteGroupRoleAssignmentsByCriteria do + @moduledoc """ + DeleteGroupRoleAssignmentsByCriteria model. + """ + + defstruct [ + :role_slug, + :resource_id, + :resource_external_id, + :resource_type_slug + ] + + @type t :: %__MODULE__{ + role_slug: String.t(), + resource_id: String.t() | nil, + resource_external_id: String.t() | nil, + resource_type_slug: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + role_slug: map["role_slug"], + resource_id: map["resource_id"], + resource_external_id: map["resource_external_id"], + resource_type_slug: map["resource_type_slug"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "role_slug" => struct.role_slug, + "resource_id" => struct.resource_id, + "resource_external_id" => struct.resource_external_id, + "resource_type_slug" => struct.resource_type_slug + }) + end +end diff --git a/lib/workos/delete_object_response.ex b/lib/workos/delete_object_response.ex new file mode 100644 index 00000000..8437ba0a --- /dev/null +++ b/lib/workos/delete_object_response.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DeleteObjectResponse do + @moduledoc """ + DeleteObjectResponse model. + """ + + defstruct [ + :name, + :success + ] + + @type t :: %__MODULE__{ + name: String.t(), + success: boolean() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + name: map["name"], + success: map["success"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "name" => struct.name, + "success" => struct.success + }) + end +end diff --git a/lib/workos/device_authorization_response.ex b/lib/workos/device_authorization_response.ex new file mode 100644 index 00000000..13df1249 --- /dev/null +++ b/lib/workos/device_authorization_response.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DeviceAuthorizationResponse do + @moduledoc """ + DeviceAuthorizationResponse model. + """ + + defstruct [ + :device_code, + :user_code, + :verification_uri, + :expires_in, + :verification_uri_complete, + :interval + ] + + @type t :: %__MODULE__{ + device_code: String.t(), + user_code: String.t(), + verification_uri: String.t(), + expires_in: number(), + verification_uri_complete: String.t() | nil, + interval: number() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + device_code: map["device_code"], + user_code: map["user_code"], + verification_uri: map["verification_uri"], + expires_in: map["expires_in"], + verification_uri_complete: map["verification_uri_complete"], + interval: map["interval"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "device_code" => struct.device_code, + "user_code" => struct.user_code, + "verification_uri" => struct.verification_uri, + "expires_in" => struct.expires_in, + "verification_uri_complete" => struct.verification_uri_complete, + "interval" => struct.interval + }) + end +end diff --git a/lib/workos/device_code_session_authenticate_request.ex b/lib/workos/device_code_session_authenticate_request.ex new file mode 100644 index 00000000..0776880f --- /dev/null +++ b/lib/workos/device_code_session_authenticate_request.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DeviceCodeSessionAuthenticateRequest do + @moduledoc """ + DeviceCodeSessionAuthenticateRequest model. + """ + + defstruct [ + :client_id, + :grant_type, + :device_code, + :ip_address, + :device_id, + :user_agent + ] + + @type t :: %__MODULE__{ + client_id: String.t(), + grant_type: String.t(), + device_code: String.t(), + ip_address: String.t() | nil, + device_id: String.t() | nil, + user_agent: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + client_id: map["client_id"], + grant_type: map["grant_type"], + device_code: map["device_code"], + ip_address: map["ip_address"], + device_id: map["device_id"], + user_agent: map["user_agent"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "client_id" => struct.client_id, + "grant_type" => struct.grant_type, + "device_code" => struct.device_code, + "ip_address" => struct.ip_address, + "device_id" => struct.device_id, + "user_agent" => struct.user_agent + }) + end +end diff --git a/lib/workos/directory.ex b/lib/workos/directory.ex new file mode 100644 index 00000000..8b49df30 --- /dev/null +++ b/lib/workos/directory.ex @@ -0,0 +1,71 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.Directory do + @moduledoc """ + Directory model. + """ + + defstruct [ + :object, + :id, + :organization_id, + :external_key, + :type, + :state, + :name, + :created_at, + :updated_at, + :domain, + :metadata + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + organization_id: String.t(), + external_key: String.t(), + type: WorkOS.DirectoryType.t(), + state: WorkOS.DirectoryState.t(), + name: String.t(), + created_at: String.t(), + updated_at: String.t(), + domain: String.t() | nil, + metadata: WorkOS.DirectoryMetadata.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + organization_id: map["organization_id"], + external_key: map["external_key"], + type: WorkOS.Cast.enum(map["type"], &WorkOS.DirectoryType.cast/1), + state: WorkOS.Cast.enum(map["state"], &WorkOS.DirectoryState.cast/1), + name: map["name"], + created_at: map["created_at"], + updated_at: map["updated_at"], + domain: map["domain"], + metadata: WorkOS.Cast.nested(map["metadata"], &WorkOS.DirectoryMetadata.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "organization_id" => struct.organization_id, + "external_key" => struct.external_key, + "type" => WorkOS.Cast.enum(struct.type, &WorkOS.DirectoryType.dump/1), + "state" => WorkOS.Cast.enum(struct.state, &WorkOS.DirectoryState.dump/1), + "name" => struct.name, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at, + "domain" => struct.domain, + "metadata" => WorkOS.Cast.dump_struct(struct.metadata, &WorkOS.DirectoryMetadata.to_map/1) + }) + end +end diff --git a/lib/workos/directory_group.ex b/lib/workos/directory_group.ex new file mode 100644 index 00000000..06055e43 --- /dev/null +++ b/lib/workos/directory_group.ex @@ -0,0 +1,63 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DirectoryGroup do + @moduledoc """ + DirectoryGroup model. + """ + + defstruct [ + :object, + :id, + :idp_id, + :directory_id, + :organization_id, + :name, + :created_at, + :updated_at, + :raw_attributes + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + idp_id: String.t(), + directory_id: String.t(), + organization_id: String.t(), + name: String.t(), + created_at: String.t(), + updated_at: String.t(), + raw_attributes: %{optional(String.t()) => term()} | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + idp_id: map["idp_id"], + directory_id: map["directory_id"], + organization_id: map["organization_id"], + name: map["name"], + created_at: map["created_at"], + updated_at: map["updated_at"], + raw_attributes: map["raw_attributes"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "idp_id" => struct.idp_id, + "directory_id" => struct.directory_id, + "organization_id" => struct.organization_id, + "name" => struct.name, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at, + "raw_attributes" => struct.raw_attributes + }) + end +end diff --git a/lib/workos/directory_group_list.ex b/lib/workos/directory_group_list.ex new file mode 100644 index 00000000..1c21b9ca --- /dev/null +++ b/lib/workos/directory_group_list.ex @@ -0,0 +1,50 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DirectoryGroupList do + @moduledoc """ + DirectoryGroupList model. + """ + + defstruct [ + :object, + :data, + :list_metadata + ] + + @type t :: %__MODULE__{ + object: String.t(), + data: [WorkOS.DirectoryGroup.t()], + list_metadata: WorkOS.DirectoryGroupListListMetadata.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + data: WorkOS.Cast.list(map["data"], &WorkOS.DirectoryGroup.from_map/1), + list_metadata: + WorkOS.Cast.nested( + map["list_metadata"], + &WorkOS.DirectoryGroupListListMetadata.from_map/1 + ) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "data" => + WorkOS.Cast.list(struct.data, fn item -> + WorkOS.Cast.dump_struct(item, &WorkOS.DirectoryGroup.to_map/1) + end), + "list_metadata" => + WorkOS.Cast.dump_struct( + struct.list_metadata, + &WorkOS.DirectoryGroupListListMetadata.to_map/1 + ) + }) + end +end diff --git a/lib/workos/directory_group_list_list_metadata.ex b/lib/workos/directory_group_list_list_metadata.ex new file mode 100644 index 00000000..5cf49968 --- /dev/null +++ b/lib/workos/directory_group_list_list_metadata.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DirectoryGroupListListMetadata do + @moduledoc """ + Pagination cursors for navigating between pages of results. + """ + + defstruct [ + :before, + :after_ + ] + + @type t :: %__MODULE__{ + before: String.t() | nil, + after_: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + before: map["before"], + after_: map["after"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "before" => struct.before, + "after" => struct.after_ + }) + end +end diff --git a/lib/workos/directory_list.ex b/lib/workos/directory_list.ex new file mode 100644 index 00000000..018180e8 --- /dev/null +++ b/lib/workos/directory_list.ex @@ -0,0 +1,44 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DirectoryList do + @moduledoc """ + DirectoryList model. + """ + + defstruct [ + :object, + :data, + :list_metadata + ] + + @type t :: %__MODULE__{ + object: String.t(), + data: [WorkOS.Directory.t()], + list_metadata: WorkOS.DirectoryListListMetadata.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + data: WorkOS.Cast.list(map["data"], &WorkOS.Directory.from_map/1), + list_metadata: + WorkOS.Cast.nested(map["list_metadata"], &WorkOS.DirectoryListListMetadata.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "data" => + WorkOS.Cast.list(struct.data, fn item -> + WorkOS.Cast.dump_struct(item, &WorkOS.Directory.to_map/1) + end), + "list_metadata" => + WorkOS.Cast.dump_struct(struct.list_metadata, &WorkOS.DirectoryListListMetadata.to_map/1) + }) + end +end diff --git a/lib/workos/directory_list_list_metadata.ex b/lib/workos/directory_list_list_metadata.ex new file mode 100644 index 00000000..0bb05b9c --- /dev/null +++ b/lib/workos/directory_list_list_metadata.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DirectoryListListMetadata do + @moduledoc """ + Pagination cursors for navigating between pages of results. + """ + + defstruct [ + :before, + :after_ + ] + + @type t :: %__MODULE__{ + before: String.t() | nil, + after_: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + before: map["before"], + after_: map["after"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "before" => struct.before, + "after" => struct.after_ + }) + end +end diff --git a/lib/workos/directory_metadata.ex b/lib/workos/directory_metadata.ex new file mode 100644 index 00000000..4ae82da8 --- /dev/null +++ b/lib/workos/directory_metadata.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DirectoryMetadata do + @moduledoc """ + Aggregate counts of directory users and groups synced from the provider. + """ + + defstruct [ + :users, + :groups + ] + + @type t :: %__MODULE__{ + users: WorkOS.DirectoryMetadataUser.t(), + groups: integer() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + users: WorkOS.Cast.nested(map["users"], &WorkOS.DirectoryMetadataUser.from_map/1), + groups: map["groups"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "users" => WorkOS.Cast.dump_struct(struct.users, &WorkOS.DirectoryMetadataUser.to_map/1), + "groups" => struct.groups + }) + end +end diff --git a/lib/workos/directory_metadata_user.ex b/lib/workos/directory_metadata_user.ex new file mode 100644 index 00000000..53341f9f --- /dev/null +++ b/lib/workos/directory_metadata_user.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DirectoryMetadataUser do + @moduledoc """ + Counts of active and inactive directory users. + """ + + defstruct [ + :active, + :inactive + ] + + @type t :: %__MODULE__{ + active: integer(), + inactive: integer() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + active: map["active"], + inactive: map["inactive"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "active" => struct.active, + "inactive" => struct.inactive + }) + end +end diff --git a/lib/workos/directory_state.ex b/lib/workos/directory_state.ex new file mode 100644 index 00000000..ed9b7a33 --- /dev/null +++ b/lib/workos/directory_state.ex @@ -0,0 +1,31 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DirectoryState do + @moduledoc """ + DirectoryState enum. + """ + + @type t :: :linked | :validating | :invalid_credentials | :unlinked | :deleting + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:linked, :validating, :invalid_credentials, :unlinked, :deleting] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("linked"), do: :linked + def cast("validating"), do: :validating + def cast("invalid_credentials"), do: :invalid_credentials + def cast("unlinked"), do: :unlinked + def cast("deleting"), do: :deleting + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:linked), do: "linked" + def dump(:validating), do: "validating" + def dump(:invalid_credentials), do: "invalid_credentials" + def dump(:unlinked), do: "unlinked" + def dump(:deleting), do: "deleting" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/directory_sync.ex b/lib/workos/directory_sync.ex index 691b49be..218c2723 100644 --- a/lib/workos/directory_sync.ex +++ b/lib/workos/directory_sync.ex @@ -1,193 +1,182 @@ +# This file is auto-generated by oagen. Do not edit. + defmodule WorkOS.DirectorySync do @moduledoc """ - Manage Directory Sync in WorkOS. - - @see https://workos.com/docs/reference/directory-sync + Operations for the DirectorySync API. """ - alias WorkOS.DirectorySync.Directory - alias WorkOS.DirectorySync.Directory.Group - alias WorkOS.DirectorySync.Directory.User - alias WorkOS.Empty - @doc """ - Gets a directory given an ID. + List Directories + + Get a list of all of your existing directories matching the criteria specified. + + ## Parameters + + * `params` — query parameters: `:before`, `:after_`, `:limit`, `:order`, `:organization_id`, `:search`, `:domain` (deprecated) + * `opts` — per-request options (see `WorkOS.Client.request/5`) """ - @spec get_directory(String.t()) :: WorkOS.Client.response(Directory.t()) - @spec get_directory(WorkOS.Client.t(), String.t()) :: - WorkOS.Client.response(Directory.t()) - def get_directory(client \\ WorkOS.client(), directory_id) do - WorkOS.Client.get(client, Directory, "/directories/:id", - opts: [ - path_params: [id: directory_id] - ] - ) + @spec list_directories(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.Page.t(WorkOS.DirectoryList.t())} | {:error, WorkOS.Error.error()} + def list_directories(client, params \\ %{}, opts \\ []) do + with {:ok, body} <- WorkOS.Client.request(client, :get, "/directories", params, opts) do + fetch_next = fn cursor -> + list_directories( + client, + WorkOS.Page.next_params(params, "after", cursor), + opts + ) + end + + {:ok, WorkOS.Page.from_map(body, "data", &WorkOS.DirectoryList.from_map/1, fetch_next)} + end end @doc """ - Lists all directories. + Get a Directory - Parameter options: + Get the details of an existing directory. - * `:domain` - The domain of a Directory. - * `:organization_id` - Filter Directories by their associated organization. - * `:search` - Searchable text to match against Directory names. - * `:limit` - Maximum number of records to return. Accepts values between 1 and 100. Default is 10. - * `:before` - An object ID that defines your place in the list. When the ID is not present, you are at the end of the list. - * `:after` - Pagination cursor to receive records after a provided event ID. - * `:order` - Order the results by the creation time. Supported values are "asc" and "desc" for showing older and newer records first respectively. + ## Parameters + * `id` — Unique identifier for the Directory. + * `opts` — per-request options (see `WorkOS.Client.request/5`) """ - @spec list_directories(WorkOS.Client.t(), map()) :: - WorkOS.Client.response(WorkOS.List.t(Directory.t())) - def list_directories(client, opts) do - WorkOS.Client.get(client, WorkOS.List.of(Directory), "/directories", - query: [ - domain: opts[:domain], - organization_id: opts[:organization_id], - search: opts[:search], - limit: opts[:limit], - before: opts[:before], - after: opts[:after], - order: opts[:order] - ] - ) - end - - @spec list_directories(map()) :: - WorkOS.Client.response(WorkOS.List.t(Directory.t())) - def list_directories(opts \\ %{}) do - WorkOS.Client.get(WorkOS.client(), WorkOS.List.of(Directory), "/directories", - query: [ - domain: opts[:domain], - organization_id: opts[:organization_id], - search: opts[:search], - limit: opts[:limit], - before: opts[:before], - after: opts[:after], - order: opts[:order] - ] - ) + @spec get_directory(WorkOS.Client.t(), String.t(), keyword()) :: + {:ok, WorkOS.Directory.t()} | {:error, WorkOS.Error.error()} + def get_directory(client, id, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :get, + "/directories/#{URI.encode(id, &URI.char_unreserved?/1)}", + %{}, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.Directory.from_map/1)} + end end @doc """ - Deletes a directory. + Delete a Directory + + Permanently deletes an existing directory. It cannot be undone. + + ## Parameters + + * `id` — Unique identifier for the Directory. + * `opts` — per-request options (see `WorkOS.Client.request/5`) """ - @spec delete_directory(String.t()) :: WorkOS.Client.response(nil) - @spec delete_directory(WorkOS.Client.t(), String.t()) :: WorkOS.Client.response(nil) - def delete_directory(client \\ WorkOS.client(), directory_id) do - WorkOS.Client.delete(client, Empty, "/directories/:id", %{}, - opts: [ - path_params: [id: directory_id] - ] + @spec delete_directory(WorkOS.Client.t(), String.t(), keyword()) :: + {:ok, term()} | {:error, WorkOS.Error.error()} + def delete_directory(client, id, opts \\ []) do + WorkOS.Client.request( + client, + :delete, + "/directories/#{URI.encode(id, &URI.char_unreserved?/1)}", + %{}, + opts ) end @doc """ - Gets a directory user given an ID. + List Directory Groups + + Get a list of all of existing directory groups matching the criteria specified. + + ## Parameters + + * `params` — query parameters: `:before`, `:after_`, `:limit`, `:order`, `:directory`, `:user` + * `opts` — per-request options (see `WorkOS.Client.request/5`) """ - def get_user(client \\ WorkOS.client(), directory_user_id) do - WorkOS.Client.get(client, User, "/directory_users/:id", - opts: [ - path_params: [id: directory_user_id] - ] - ) + @spec list_groups(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.Page.t(WorkOS.DirectoryGroupList.t())} | {:error, WorkOS.Error.error()} + def list_groups(client, params \\ %{}, opts \\ []) do + with {:ok, body} <- WorkOS.Client.request(client, :get, "/directory_groups", params, opts) do + fetch_next = fn cursor -> + list_groups( + client, + WorkOS.Page.next_params(params, "after", cursor), + opts + ) + end + + {:ok, WorkOS.Page.from_map(body, "data", &WorkOS.DirectoryGroupList.from_map/1, fetch_next)} + end end @doc """ - Lists all directory users. + Get a Directory Group - Parameter options: + Get the details of an existing Directory Group. - * `:directory` - Unique identifier of the WorkOS Directory. - * `:group` - Unique identifier of the WorkOS Directory Group. - * `:limit` - Maximum number of records to return. Accepts values between 1 and 100. Default is 10. - * `:before` - An object ID that defines your place in the list. When the ID is not present, you are at the end of the list. - * `:after` - Pagination cursor to receive records after a provided event ID. - * `:order` - Order the results by the creation time. Supported values are "asc" and "desc" for showing older and newer records first respectively. + ## Parameters + * `id` — Unique identifier for the Directory Group. + * `opts` — per-request options (see `WorkOS.Client.request/5`) """ - @spec list_users(WorkOS.Client.t(), map()) :: - WorkOS.Client.response(WorkOS.List.t(User.t())) - def list_users(client, opts) do - WorkOS.Client.get(client, WorkOS.List.of(User), "/directory_users", - query: [ - directory: opts[:directory], - group: opts[:group], - limit: opts[:limit], - before: opts[:before], - after: opts[:after], - order: opts[:order] - ] - ) - end - - @spec list_users(map()) :: - WorkOS.Client.response(WorkOS.List.t(User.t())) - def list_users(opts \\ %{}) do - WorkOS.Client.get(WorkOS.client(), WorkOS.List.of(User), "/directory_users", - query: [ - directory: opts[:directory], - group: opts[:group], - limit: opts[:limit], - before: opts[:before], - after: opts[:after], - order: opts[:order] - ] - ) + @spec get_group(WorkOS.Client.t(), String.t(), keyword()) :: + {:ok, WorkOS.DirectoryGroup.t()} | {:error, WorkOS.Error.error()} + def get_group(client, id, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :get, + "/directory_groups/#{URI.encode(id, &URI.char_unreserved?/1)}", + %{}, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.DirectoryGroup.from_map/1)} + end end @doc """ - Gets a directory group given an ID. + List Directory Users + + Get a list of all of existing Directory Users matching the criteria specified. + + ## Parameters + + * `params` — query parameters: `:before`, `:after_`, `:limit`, `:order`, `:directory`, `:group`, `:idp_id`, `:email` + * `opts` — per-request options (see `WorkOS.Client.request/5`) """ - def get_group(client \\ WorkOS.client(), directory_group_id) do - WorkOS.Client.get(client, Group, "/directory_groups/:id", - opts: [ - path_params: [id: directory_group_id] - ] - ) + @spec list_users(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.Page.t(WorkOS.DirectoryUserList.t())} | {:error, WorkOS.Error.error()} + def list_users(client, params \\ %{}, opts \\ []) do + with {:ok, body} <- WorkOS.Client.request(client, :get, "/directory_users", params, opts) do + fetch_next = fn cursor -> + list_users( + client, + WorkOS.Page.next_params(params, "after", cursor), + opts + ) + end + + {:ok, WorkOS.Page.from_map(body, "data", &WorkOS.DirectoryUserList.from_map/1, fetch_next)} + end end @doc """ - Lists all directory groups. + Get a Directory User - Parameter options: + Get the details of an existing Directory User. - * `:directory` - Unique identifier of the WorkOS Directory. - * `:user` - Unique identifier of the WorkOS Directory User. - * `:limit` - Maximum number of records to return. Accepts values between 1 and 100. Default is 10. - * `:before` - An object ID that defines your place in the list. When the ID is not present, you are at the end of the list. - * `:after` - Pagination cursor to receive records after a provided event ID. - * `:order` - Order the results by the creation time. Supported values are "asc" and "desc" for showing older and newer records first respectively. + ## Parameters + * `id` — Unique identifier for the Directory User. + * `opts` — per-request options (see `WorkOS.Client.request/5`) """ - @spec list_groups(WorkOS.Client.t(), map()) :: - WorkOS.Client.response(WorkOS.List.t(Group.t())) - def list_groups(client, opts) do - WorkOS.Client.get(client, WorkOS.List.of(Group), "/directory_groups", - query: [ - directory: opts[:directory], - user: opts[:user], - limit: opts[:limit], - before: opts[:before], - after: opts[:after], - order: opts[:order] - ] - ) - end - - @spec list_groups(map()) :: - WorkOS.Client.response(WorkOS.List.t(Group.t())) - def list_groups(opts \\ %{}) do - WorkOS.Client.get(WorkOS.client(), WorkOS.List.of(Group), "/directory_groups", - query: [ - directory: opts[:directory], - user: opts[:user], - limit: opts[:limit], - before: opts[:before], - after: opts[:after], - order: opts[:order] - ] - ) + @spec get_user(WorkOS.Client.t(), String.t(), keyword()) :: + {:ok, WorkOS.DirectoryUserWithGroups.t()} | {:error, WorkOS.Error.error()} + def get_user(client, id, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :get, + "/directory_users/#{URI.encode(id, &URI.char_unreserved?/1)}", + %{}, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.DirectoryUserWithGroups.from_map/1)} + end end end diff --git a/lib/workos/directory_sync/directory.ex b/lib/workos/directory_sync/directory.ex deleted file mode 100644 index 5ebed1e2..00000000 --- a/lib/workos/directory_sync/directory.ex +++ /dev/null @@ -1,60 +0,0 @@ -defmodule WorkOS.DirectorySync.Directory do - @moduledoc """ - WorkOS Directory struct. - """ - - @behaviour WorkOS.Castable - - @type t() :: %__MODULE__{ - id: String.t(), - object: String.t(), - external_key: String.t(), - state: String.t(), - updated_at: String.t(), - created_at: String.t(), - name: String.t(), - domain: String.t(), - organization_id: String.t() | nil, - type: String.t() - } - - @enforce_keys [ - :id, - :object, - :external_key, - :state, - :updated_at, - :created_at, - :name, - :domain, - :type - ] - defstruct [ - :id, - :object, - :external_key, - :state, - :updated_at, - :created_at, - :name, - :domain, - :organization_id, - :type - ] - - @impl true - def cast(map) do - %__MODULE__{ - id: map["id"], - object: map["object"], - type: map["type"], - external_key: map["external_key"], - state: map["state"], - name: map["name"], - organization_id: map["organization_id"], - domain: map["domain"], - updated_at: map["updated_at"], - created_at: map["created_at"] - } - end -end diff --git a/lib/workos/directory_sync/directory/group.ex b/lib/workos/directory_sync/directory/group.ex deleted file mode 100644 index 1cb2e905..00000000 --- a/lib/workos/directory_sync/directory/group.ex +++ /dev/null @@ -1,56 +0,0 @@ -defmodule WorkOS.DirectorySync.Directory.Group do - @moduledoc """ - WorkOS Directory Group struct. - """ - - @behaviour WorkOS.Castable - - @type t() :: %__MODULE__{ - id: String.t(), - name: String.t(), - object: String.t(), - idp_id: String.t(), - directory_id: String.t(), - organization_id: String.t() | nil, - raw_attributes: %{String.t() => any()}, - updated_at: String.t(), - created_at: String.t() - } - - @enforce_keys [ - :id, - :name, - :object, - :idp_id, - :directory_id, - :raw_attributes, - :updated_at, - :created_at - ] - defstruct [ - :id, - :name, - :object, - :idp_id, - :directory_id, - :updated_at, - :created_at, - :raw_attributes, - :organization_id - ] - - @impl true - def cast(map) do - %__MODULE__{ - id: map["id"], - name: map["name"], - object: map["object"], - idp_id: map["idp_id"], - directory_id: map["directory_id"], - organization_id: map["organization_id"], - raw_attributes: map["raw_attributes"], - updated_at: map["updated_at"], - created_at: map["created_at"] - } - end -end diff --git a/lib/workos/directory_sync/directory/user.ex b/lib/workos/directory_sync/directory/user.ex deleted file mode 100644 index 32427cd9..00000000 --- a/lib/workos/directory_sync/directory/user.ex +++ /dev/null @@ -1,83 +0,0 @@ -defmodule WorkOS.DirectorySync.Directory.User do - @moduledoc """ - WorkOS Directory User struct. - """ - - @behaviour WorkOS.Castable - - @type t() :: %__MODULE__{ - id: String.t(), - object: String.t(), - directory_id: String.t(), - organization_id: String.t() | nil, - raw_attributes: %{String.t() => any()}, - custom_attributes: %{String.t() => any()}, - idp_id: String.t(), - first_name: String.t(), - emails: [%{type: String.t(), value: String.t(), primary: boolean()}], - username: String.t(), - last_name: String.t(), - job_title: String.t() | nil, - state: String.t(), - groups: [%WorkOS.DirectorySync.Directory.Group{}], - updated_at: String.t(), - created_at: String.t() - } - - @enforce_keys [ - :id, - :object, - :directory_id, - :raw_attributes, - :custom_attributes, - :idp_id, - :emails, - :username, - :first_name, - :last_name, - :groups, - :state, - :updated_at, - :created_at - ] - defstruct [ - :id, - :object, - :directory_id, - :organization_id, - :raw_attributes, - :custom_attributes, - :idp_id, - :emails, - :username, - :first_name, - :last_name, - :job_title, - :groups, - :state, - :updated_at, - :created_at - ] - - @impl true - def cast(map) do - %__MODULE__{ - id: map["id"], - object: map["object"], - organization_id: map["organization_id"], - raw_attributes: map["raw_attributes"], - custom_attributes: map["custom_attributes"], - directory_id: map["directory_id"], - idp_id: map["idp_id"], - emails: map["emails"], - username: map["username"], - first_name: map["first_name"], - last_name: map["last_name"], - job_title: map["job_title"], - groups: WorkOS.Castable.cast_list(WorkOS.DirectorySync.Directory.Group, map["groups"]), - state: map["state"], - updated_at: map["updated_at"], - created_at: map["created_at"] - } - end -end diff --git a/lib/workos/directory_type.ex b/lib/workos/directory_type.ex new file mode 100644 index 00000000..ffd64cef --- /dev/null +++ b/lib/workos/directory_type.ex @@ -0,0 +1,107 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DirectoryType do + @moduledoc """ + DirectoryType enum. + """ + + @type t :: + :azure_scim_v_2_0 + | :bamboohr + | :breathe_hr + | :cezanne_hr + | :cyberark_scim_v_2_0 + | :fourth_hr + | :generic_scim_v_2_0 + | :gsuite_directory + | :hibob + | :sailpoint_scim_v_2_0 + | :jump_cloud_scim_v_2_0 + | :okta_scim_v_2_0 + | :onelogin_scim_v_2_0 + | :people_hr + | :personio + | :pingfederate_scim_v_2_0 + | :rippling_scim_v_2_0 + | :s_3 + | :sftp + | :sftp_workday + | :workday + + @doc "All known values." + @spec values() :: [t()] + def values, + do: [ + :azure_scim_v_2_0, + :bamboohr, + :breathe_hr, + :cezanne_hr, + :cyberark_scim_v_2_0, + :fourth_hr, + :generic_scim_v_2_0, + :gsuite_directory, + :hibob, + :sailpoint_scim_v_2_0, + :jump_cloud_scim_v_2_0, + :okta_scim_v_2_0, + :onelogin_scim_v_2_0, + :people_hr, + :personio, + :pingfederate_scim_v_2_0, + :rippling_scim_v_2_0, + :s_3, + :sftp, + :sftp_workday, + :workday + ] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("azure scim v2.0"), do: :azure_scim_v_2_0 + def cast("bamboohr"), do: :bamboohr + def cast("breathe hr"), do: :breathe_hr + def cast("cezanne hr"), do: :cezanne_hr + def cast("cyberark scim v2.0"), do: :cyberark_scim_v_2_0 + def cast("fourth hr"), do: :fourth_hr + def cast("generic scim v2.0"), do: :generic_scim_v_2_0 + def cast("gsuite directory"), do: :gsuite_directory + def cast("hibob"), do: :hibob + def cast("sailpoint scim v2.0"), do: :sailpoint_scim_v_2_0 + def cast("jump cloud scim v2.0"), do: :jump_cloud_scim_v_2_0 + def cast("okta scim v2.0"), do: :okta_scim_v_2_0 + def cast("onelogin scim v2.0"), do: :onelogin_scim_v_2_0 + def cast("people hr"), do: :people_hr + def cast("personio"), do: :personio + def cast("pingfederate scim v2.0"), do: :pingfederate_scim_v_2_0 + def cast("rippling scim v2.0"), do: :rippling_scim_v_2_0 + def cast("s3"), do: :s_3 + def cast("sftp"), do: :sftp + def cast("sftp workday"), do: :sftp_workday + def cast("workday"), do: :workday + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:azure_scim_v_2_0), do: "azure scim v2.0" + def dump(:bamboohr), do: "bamboohr" + def dump(:breathe_hr), do: "breathe hr" + def dump(:cezanne_hr), do: "cezanne hr" + def dump(:cyberark_scim_v_2_0), do: "cyberark scim v2.0" + def dump(:fourth_hr), do: "fourth hr" + def dump(:generic_scim_v_2_0), do: "generic scim v2.0" + def dump(:gsuite_directory), do: "gsuite directory" + def dump(:hibob), do: "hibob" + def dump(:sailpoint_scim_v_2_0), do: "sailpoint scim v2.0" + def dump(:jump_cloud_scim_v_2_0), do: "jump cloud scim v2.0" + def dump(:okta_scim_v_2_0), do: "okta scim v2.0" + def dump(:onelogin_scim_v_2_0), do: "onelogin scim v2.0" + def dump(:people_hr), do: "people hr" + def dump(:personio), do: "personio" + def dump(:pingfederate_scim_v_2_0), do: "pingfederate scim v2.0" + def dump(:rippling_scim_v_2_0), do: "rippling scim v2.0" + def dump(:s_3), do: "s3" + def dump(:sftp), do: "sftp" + def dump(:sftp_workday), do: "sftp workday" + def dump(:workday), do: "workday" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/directory_user.ex b/lib/workos/directory_user.ex new file mode 100644 index 00000000..b024d77e --- /dev/null +++ b/lib/workos/directory_user.ex @@ -0,0 +1,116 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DirectoryUser do + @moduledoc """ + DirectoryUser model. + + ## Deprecated fields + + * `:raw_attributes` — The raw attributes received from the directory provider. + * `:emails` — A list of email addresses for the user. + * `:job_title` — The job title of the user. + * `:username` — The username of the user. + """ + + defstruct [ + :object, + :id, + :directory_id, + :organization_id, + :idp_id, + :email, + :state, + :raw_attributes, + :custom_attributes, + :created_at, + :updated_at, + :first_name, + :last_name, + :name, + :emails, + :job_title, + :username, + :role, + :roles + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + directory_id: String.t(), + organization_id: String.t(), + idp_id: String.t(), + email: String.t() | nil, + state: WorkOS.DirectoryUserState.t(), + raw_attributes: %{optional(String.t()) => term()}, + custom_attributes: %{optional(String.t()) => term()}, + created_at: String.t(), + updated_at: String.t(), + first_name: String.t() | nil, + last_name: String.t() | nil, + name: String.t() | nil, + emails: [WorkOS.DirectoryUserEmail.t()] | nil, + job_title: String.t() | nil, + username: String.t() | nil, + role: WorkOS.SlimRole.t() | nil, + roles: [WorkOS.SlimRole.t()] | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + directory_id: map["directory_id"], + organization_id: map["organization_id"], + idp_id: map["idp_id"], + email: map["email"], + state: WorkOS.Cast.enum(map["state"], &WorkOS.DirectoryUserState.cast/1), + raw_attributes: map["raw_attributes"], + custom_attributes: map["custom_attributes"], + created_at: map["created_at"], + updated_at: map["updated_at"], + first_name: map["first_name"], + last_name: map["last_name"], + name: map["name"], + emails: WorkOS.Cast.list(map["emails"], &WorkOS.DirectoryUserEmail.from_map/1), + job_title: map["job_title"], + username: map["username"], + role: WorkOS.Cast.nested(map["role"], &WorkOS.SlimRole.from_map/1), + roles: WorkOS.Cast.list(map["roles"], &WorkOS.SlimRole.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "directory_id" => struct.directory_id, + "organization_id" => struct.organization_id, + "idp_id" => struct.idp_id, + "email" => struct.email, + "state" => WorkOS.Cast.enum(struct.state, &WorkOS.DirectoryUserState.dump/1), + "raw_attributes" => struct.raw_attributes, + "custom_attributes" => struct.custom_attributes, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at, + "first_name" => struct.first_name, + "last_name" => struct.last_name, + "name" => struct.name, + "emails" => + WorkOS.Cast.list(struct.emails, fn item -> + WorkOS.Cast.dump_struct(item, &WorkOS.DirectoryUserEmail.to_map/1) + end), + "job_title" => struct.job_title, + "username" => struct.username, + "role" => WorkOS.Cast.dump_struct(struct.role, &WorkOS.SlimRole.to_map/1), + "roles" => + WorkOS.Cast.list(struct.roles, fn item -> + WorkOS.Cast.dump_struct(item, &WorkOS.SlimRole.to_map/1) + end) + }) + end +end diff --git a/lib/workos/directory_user_email.ex b/lib/workos/directory_user_email.ex new file mode 100644 index 00000000..a1132a0c --- /dev/null +++ b/lib/workos/directory_user_email.ex @@ -0,0 +1,39 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DirectoryUserEmail do + @moduledoc """ + DirectoryUserEmail model. + """ + + defstruct [ + :primary, + :type, + :value + ] + + @type t :: %__MODULE__{ + primary: boolean() | nil, + type: String.t() | nil, + value: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + primary: map["primary"], + type: map["type"], + value: map["value"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "primary" => struct.primary, + "type" => struct.type, + "value" => struct.value + }) + end +end diff --git a/lib/workos/directory_user_list.ex b/lib/workos/directory_user_list.ex new file mode 100644 index 00000000..af7c3a37 --- /dev/null +++ b/lib/workos/directory_user_list.ex @@ -0,0 +1,47 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DirectoryUserList do + @moduledoc """ + DirectoryUserList model. + """ + + defstruct [ + :object, + :data, + :list_metadata + ] + + @type t :: %__MODULE__{ + object: String.t(), + data: [WorkOS.DirectoryUserWithGroups.t()], + list_metadata: WorkOS.DirectoryUserListListMetadata.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + data: WorkOS.Cast.list(map["data"], &WorkOS.DirectoryUserWithGroups.from_map/1), + list_metadata: + WorkOS.Cast.nested(map["list_metadata"], &WorkOS.DirectoryUserListListMetadata.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "data" => + WorkOS.Cast.list(struct.data, fn item -> + WorkOS.Cast.dump_struct(item, &WorkOS.DirectoryUserWithGroups.to_map/1) + end), + "list_metadata" => + WorkOS.Cast.dump_struct( + struct.list_metadata, + &WorkOS.DirectoryUserListListMetadata.to_map/1 + ) + }) + end +end diff --git a/lib/workos/directory_user_list_list_metadata.ex b/lib/workos/directory_user_list_list_metadata.ex new file mode 100644 index 00000000..3fa91fa7 --- /dev/null +++ b/lib/workos/directory_user_list_list_metadata.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DirectoryUserListListMetadata do + @moduledoc """ + Pagination cursors for navigating between pages of results. + """ + + defstruct [ + :before, + :after_ + ] + + @type t :: %__MODULE__{ + before: String.t() | nil, + after_: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + before: map["before"], + after_: map["after"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "before" => struct.before, + "after" => struct.after_ + }) + end +end diff --git a/lib/workos/directory_user_state.ex b/lib/workos/directory_user_state.ex new file mode 100644 index 00000000..cb885a93 --- /dev/null +++ b/lib/workos/directory_user_state.ex @@ -0,0 +1,27 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DirectoryUserState do + @moduledoc """ + DirectoryUserState enum. + """ + + @type t :: :active | :suspended | :inactive + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:active, :suspended, :inactive] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("active"), do: :active + def cast("suspended"), do: :suspended + def cast("inactive"), do: :inactive + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:active), do: "active" + def dump(:suspended), do: "suspended" + def dump(:inactive), do: "inactive" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/directory_user_with_groups.ex b/lib/workos/directory_user_with_groups.ex new file mode 100644 index 00000000..254226c1 --- /dev/null +++ b/lib/workos/directory_user_with_groups.ex @@ -0,0 +1,124 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DirectoryUserWithGroups do + @moduledoc """ + DirectoryUserWithGroups model. + + ## Deprecated fields + + * `:raw_attributes` — The raw attributes received from the directory provider. + * `:groups` — The directory groups the user belongs to. Deprecated: starting May 1, 2026, this field returns an empty array by default for newly created teams. Existing teams currently depending on this field should migrate to the new access pattern for better throughput performance — the field is unbounded by user, so users with many group memberships produce large, slow response payloads. Use the List Directory Groups endpoint with a `user` filter to fetch a user's group memberships. + * `:emails` — A list of email addresses for the user. + * `:job_title` — The job title of the user. + * `:username` — The username of the user. + """ + + defstruct [ + :object, + :id, + :directory_id, + :organization_id, + :idp_id, + :email, + :state, + :raw_attributes, + :custom_attributes, + :created_at, + :updated_at, + :groups, + :first_name, + :last_name, + :name, + :emails, + :job_title, + :username, + :role, + :roles + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + directory_id: String.t(), + organization_id: String.t(), + idp_id: String.t(), + email: String.t() | nil, + state: WorkOS.DirectoryUserWithGroupsState.t(), + raw_attributes: %{optional(String.t()) => term()}, + custom_attributes: %{optional(String.t()) => term()}, + created_at: String.t(), + updated_at: String.t(), + groups: [WorkOS.DirectoryGroup.t()], + first_name: String.t() | nil, + last_name: String.t() | nil, + name: String.t() | nil, + emails: [WorkOS.DirectoryUserWithGroupsEmail.t()] | nil, + job_title: String.t() | nil, + username: String.t() | nil, + role: WorkOS.SlimRole.t() | nil, + roles: [WorkOS.SlimRole.t()] | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + directory_id: map["directory_id"], + organization_id: map["organization_id"], + idp_id: map["idp_id"], + email: map["email"], + state: WorkOS.Cast.enum(map["state"], &WorkOS.DirectoryUserWithGroupsState.cast/1), + raw_attributes: map["raw_attributes"], + custom_attributes: map["custom_attributes"], + created_at: map["created_at"], + updated_at: map["updated_at"], + groups: WorkOS.Cast.list(map["groups"], &WorkOS.DirectoryGroup.from_map/1), + first_name: map["first_name"], + last_name: map["last_name"], + name: map["name"], + emails: WorkOS.Cast.list(map["emails"], &WorkOS.DirectoryUserWithGroupsEmail.from_map/1), + job_title: map["job_title"], + username: map["username"], + role: WorkOS.Cast.nested(map["role"], &WorkOS.SlimRole.from_map/1), + roles: WorkOS.Cast.list(map["roles"], &WorkOS.SlimRole.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "directory_id" => struct.directory_id, + "organization_id" => struct.organization_id, + "idp_id" => struct.idp_id, + "email" => struct.email, + "state" => WorkOS.Cast.enum(struct.state, &WorkOS.DirectoryUserWithGroupsState.dump/1), + "raw_attributes" => struct.raw_attributes, + "custom_attributes" => struct.custom_attributes, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at, + "groups" => + WorkOS.Cast.list(struct.groups, fn item -> + WorkOS.Cast.dump_struct(item, &WorkOS.DirectoryGroup.to_map/1) + end), + "first_name" => struct.first_name, + "last_name" => struct.last_name, + "name" => struct.name, + "emails" => + WorkOS.Cast.list(struct.emails, fn item -> + WorkOS.Cast.dump_struct(item, &WorkOS.DirectoryUserWithGroupsEmail.to_map/1) + end), + "job_title" => struct.job_title, + "username" => struct.username, + "role" => WorkOS.Cast.dump_struct(struct.role, &WorkOS.SlimRole.to_map/1), + "roles" => + WorkOS.Cast.list(struct.roles, fn item -> + WorkOS.Cast.dump_struct(item, &WorkOS.SlimRole.to_map/1) + end) + }) + end +end diff --git a/lib/workos/directory_user_with_groups_email.ex b/lib/workos/directory_user_with_groups_email.ex new file mode 100644 index 00000000..8d339d40 --- /dev/null +++ b/lib/workos/directory_user_with_groups_email.ex @@ -0,0 +1,39 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DirectoryUserWithGroupsEmail do + @moduledoc """ + DirectoryUserWithGroupsEmail model. + """ + + defstruct [ + :primary, + :type, + :value + ] + + @type t :: %__MODULE__{ + primary: boolean() | nil, + type: String.t() | nil, + value: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + primary: map["primary"], + type: map["type"], + value: map["value"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "primary" => struct.primary, + "type" => struct.type, + "value" => struct.value + }) + end +end diff --git a/lib/workos/directory_user_with_groups_state.ex b/lib/workos/directory_user_with_groups_state.ex new file mode 100644 index 00000000..590495e7 --- /dev/null +++ b/lib/workos/directory_user_with_groups_state.ex @@ -0,0 +1,27 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DirectoryUserWithGroupsState do + @moduledoc """ + DirectoryUserWithGroupsState enum. + """ + + @type t :: :active | :suspended | :inactive + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:active, :suspended, :inactive] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("active"), do: :active + def cast("suspended"), do: :suspended + def cast("inactive"), do: :inactive + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:active), do: "active" + def dump(:suspended), do: "suspended" + def dump(:inactive), do: "inactive" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/dsync_activated.ex b/lib/workos/dsync_activated.ex new file mode 100644 index 00000000..7d41a60a --- /dev/null +++ b/lib/workos/dsync_activated.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DsyncActivated do + @moduledoc """ + DsyncActivated model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.DsyncActivatedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.DsyncActivatedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => WorkOS.Cast.dump_struct(struct.data, &WorkOS.DsyncActivatedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/dsync_activated_data.ex b/lib/workos/dsync_activated_data.ex new file mode 100644 index 00000000..64faa71e --- /dev/null +++ b/lib/workos/dsync_activated_data.ex @@ -0,0 +1,70 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DsyncActivatedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :object, + :id, + :type, + :state, + :name, + :created_at, + :updated_at, + :external_key, + :domains, + :organization_id + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + type: WorkOS.DsyncActivatedDataType.t(), + state: WorkOS.DsyncActivatedDataState.t(), + name: String.t(), + created_at: String.t(), + updated_at: String.t(), + external_key: String.t(), + domains: [WorkOS.DsyncActivatedDataDomain.t()], + organization_id: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + type: WorkOS.Cast.enum(map["type"], &WorkOS.DsyncActivatedDataType.cast/1), + state: WorkOS.Cast.enum(map["state"], &WorkOS.DsyncActivatedDataState.cast/1), + name: map["name"], + created_at: map["created_at"], + updated_at: map["updated_at"], + external_key: map["external_key"], + domains: WorkOS.Cast.list(map["domains"], &WorkOS.DsyncActivatedDataDomain.from_map/1), + organization_id: map["organization_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "type" => WorkOS.Cast.enum(struct.type, &WorkOS.DsyncActivatedDataType.dump/1), + "state" => WorkOS.Cast.enum(struct.state, &WorkOS.DsyncActivatedDataState.dump/1), + "name" => struct.name, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at, + "external_key" => struct.external_key, + "domains" => + WorkOS.Cast.list(struct.domains, fn item -> + WorkOS.Cast.dump_struct(item, &WorkOS.DsyncActivatedDataDomain.to_map/1) + end), + "organization_id" => struct.organization_id + }) + end +end diff --git a/lib/workos/dsync_activated_data_domain.ex b/lib/workos/dsync_activated_data_domain.ex new file mode 100644 index 00000000..7763cc5e --- /dev/null +++ b/lib/workos/dsync_activated_data_domain.ex @@ -0,0 +1,39 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DsyncActivatedDataDomain do + @moduledoc """ + DsyncActivatedDataDomain model. + """ + + defstruct [ + :object, + :id, + :domain + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + domain: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + domain: map["domain"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "domain" => struct.domain + }) + end +end diff --git a/lib/workos/dsync_activated_data_state.ex b/lib/workos/dsync_activated_data_state.ex new file mode 100644 index 00000000..6a43f7c5 --- /dev/null +++ b/lib/workos/dsync_activated_data_state.ex @@ -0,0 +1,31 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DsyncActivatedDataState do + @moduledoc """ + DsyncActivatedDataState enum. + """ + + @type t :: :active | :validating | :invalid_credentials | :inactive | :deleting + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:active, :validating, :invalid_credentials, :inactive, :deleting] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("active"), do: :active + def cast("validating"), do: :validating + def cast("invalid_credentials"), do: :invalid_credentials + def cast("inactive"), do: :inactive + def cast("deleting"), do: :deleting + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:active), do: "active" + def dump(:validating), do: "validating" + def dump(:invalid_credentials), do: "invalid_credentials" + def dump(:inactive), do: "inactive" + def dump(:deleting), do: "deleting" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/dsync_activated_data_type.ex b/lib/workos/dsync_activated_data_type.ex new file mode 100644 index 00000000..f851e3da --- /dev/null +++ b/lib/workos/dsync_activated_data_type.ex @@ -0,0 +1,115 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DsyncActivatedDataType do + @moduledoc """ + DsyncActivatedDataType enum. + """ + + @type t :: + :azure_scim_v_2_0 + | :bamboohr + | :breathe_hr + | :cezanne_hr + | :cyberark_scim_v_2_0 + | :fourth_hr + | :generic_scim_v_2_0 + | :gsuite_directory + | :gusto + | :hibob + | :jump_cloud_scim_v_2_0 + | :okta_scim_v_2_0 + | :onelogin_scim_v_2_0 + | :people_hr + | :personio + | :pingfederate_scim_v_2_0 + | :rippling_scim_v_2_0 + | :rippling + | :sailpoint_scim_v_2_0 + | :s_3 + | :sftp + | :sftp_workday + | :workday + + @doc "All known values." + @spec values() :: [t()] + def values, + do: [ + :azure_scim_v_2_0, + :bamboohr, + :breathe_hr, + :cezanne_hr, + :cyberark_scim_v_2_0, + :fourth_hr, + :generic_scim_v_2_0, + :gsuite_directory, + :gusto, + :hibob, + :jump_cloud_scim_v_2_0, + :okta_scim_v_2_0, + :onelogin_scim_v_2_0, + :people_hr, + :personio, + :pingfederate_scim_v_2_0, + :rippling_scim_v_2_0, + :rippling, + :sailpoint_scim_v_2_0, + :s_3, + :sftp, + :sftp_workday, + :workday + ] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("azure scim v2.0"), do: :azure_scim_v_2_0 + def cast("bamboohr"), do: :bamboohr + def cast("breathe hr"), do: :breathe_hr + def cast("cezanne hr"), do: :cezanne_hr + def cast("cyberark scim v2.0"), do: :cyberark_scim_v_2_0 + def cast("fourth hr"), do: :fourth_hr + def cast("generic scim v2.0"), do: :generic_scim_v_2_0 + def cast("gsuite directory"), do: :gsuite_directory + def cast("gusto"), do: :gusto + def cast("hibob"), do: :hibob + def cast("jump cloud scim v2.0"), do: :jump_cloud_scim_v_2_0 + def cast("okta scim v2.0"), do: :okta_scim_v_2_0 + def cast("onelogin scim v2.0"), do: :onelogin_scim_v_2_0 + def cast("people hr"), do: :people_hr + def cast("personio"), do: :personio + def cast("pingfederate scim v2.0"), do: :pingfederate_scim_v_2_0 + def cast("rippling scim v2.0"), do: :rippling_scim_v_2_0 + def cast("rippling"), do: :rippling + def cast("sailpoint scim v2.0"), do: :sailpoint_scim_v_2_0 + def cast("s3"), do: :s_3 + def cast("sftp"), do: :sftp + def cast("sftp workday"), do: :sftp_workday + def cast("workday"), do: :workday + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:azure_scim_v_2_0), do: "azure scim v2.0" + def dump(:bamboohr), do: "bamboohr" + def dump(:breathe_hr), do: "breathe hr" + def dump(:cezanne_hr), do: "cezanne hr" + def dump(:cyberark_scim_v_2_0), do: "cyberark scim v2.0" + def dump(:fourth_hr), do: "fourth hr" + def dump(:generic_scim_v_2_0), do: "generic scim v2.0" + def dump(:gsuite_directory), do: "gsuite directory" + def dump(:gusto), do: "gusto" + def dump(:hibob), do: "hibob" + def dump(:jump_cloud_scim_v_2_0), do: "jump cloud scim v2.0" + def dump(:okta_scim_v_2_0), do: "okta scim v2.0" + def dump(:onelogin_scim_v_2_0), do: "onelogin scim v2.0" + def dump(:people_hr), do: "people hr" + def dump(:personio), do: "personio" + def dump(:pingfederate_scim_v_2_0), do: "pingfederate scim v2.0" + def dump(:rippling_scim_v_2_0), do: "rippling scim v2.0" + def dump(:rippling), do: "rippling" + def dump(:sailpoint_scim_v_2_0), do: "sailpoint scim v2.0" + def dump(:s_3), do: "s3" + def dump(:sftp), do: "sftp" + def dump(:sftp_workday), do: "sftp workday" + def dump(:workday), do: "workday" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/dsync_deleted.ex b/lib/workos/dsync_deleted.ex new file mode 100644 index 00000000..04ff36b8 --- /dev/null +++ b/lib/workos/dsync_deleted.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DsyncDeleted do + @moduledoc """ + DsyncDeleted model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.DsyncDeletedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.DsyncDeletedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => WorkOS.Cast.dump_struct(struct.data, &WorkOS.DsyncDeletedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/dsync_deleted_data.ex b/lib/workos/dsync_deleted_data.ex new file mode 100644 index 00000000..d04a5d6e --- /dev/null +++ b/lib/workos/dsync_deleted_data.ex @@ -0,0 +1,59 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DsyncDeletedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :object, + :id, + :type, + :state, + :name, + :created_at, + :updated_at, + :organization_id + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + type: WorkOS.DsyncDeletedDataType.t(), + state: WorkOS.DsyncDeletedDataState.t(), + name: String.t(), + created_at: String.t(), + updated_at: String.t(), + organization_id: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + type: WorkOS.Cast.enum(map["type"], &WorkOS.DsyncDeletedDataType.cast/1), + state: WorkOS.Cast.enum(map["state"], &WorkOS.DsyncDeletedDataState.cast/1), + name: map["name"], + created_at: map["created_at"], + updated_at: map["updated_at"], + organization_id: map["organization_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "type" => WorkOS.Cast.enum(struct.type, &WorkOS.DsyncDeletedDataType.dump/1), + "state" => WorkOS.Cast.enum(struct.state, &WorkOS.DsyncDeletedDataState.dump/1), + "name" => struct.name, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at, + "organization_id" => struct.organization_id + }) + end +end diff --git a/lib/workos/dsync_deleted_data_state.ex b/lib/workos/dsync_deleted_data_state.ex new file mode 100644 index 00000000..9bc66c03 --- /dev/null +++ b/lib/workos/dsync_deleted_data_state.ex @@ -0,0 +1,31 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DsyncDeletedDataState do + @moduledoc """ + DsyncDeletedDataState enum. + """ + + @type t :: :active | :validating | :invalid_credentials | :inactive | :deleting + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:active, :validating, :invalid_credentials, :inactive, :deleting] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("active"), do: :active + def cast("validating"), do: :validating + def cast("invalid_credentials"), do: :invalid_credentials + def cast("inactive"), do: :inactive + def cast("deleting"), do: :deleting + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:active), do: "active" + def dump(:validating), do: "validating" + def dump(:invalid_credentials), do: "invalid_credentials" + def dump(:inactive), do: "inactive" + def dump(:deleting), do: "deleting" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/dsync_deleted_data_type.ex b/lib/workos/dsync_deleted_data_type.ex new file mode 100644 index 00000000..b51cbc8e --- /dev/null +++ b/lib/workos/dsync_deleted_data_type.ex @@ -0,0 +1,115 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DsyncDeletedDataType do + @moduledoc """ + DsyncDeletedDataType enum. + """ + + @type t :: + :azure_scim_v_2_0 + | :bamboohr + | :breathe_hr + | :cezanne_hr + | :cyberark_scim_v_2_0 + | :fourth_hr + | :generic_scim_v_2_0 + | :gsuite_directory + | :gusto + | :hibob + | :jump_cloud_scim_v_2_0 + | :okta_scim_v_2_0 + | :onelogin_scim_v_2_0 + | :people_hr + | :personio + | :pingfederate_scim_v_2_0 + | :rippling_scim_v_2_0 + | :rippling + | :sailpoint_scim_v_2_0 + | :s_3 + | :sftp + | :sftp_workday + | :workday + + @doc "All known values." + @spec values() :: [t()] + def values, + do: [ + :azure_scim_v_2_0, + :bamboohr, + :breathe_hr, + :cezanne_hr, + :cyberark_scim_v_2_0, + :fourth_hr, + :generic_scim_v_2_0, + :gsuite_directory, + :gusto, + :hibob, + :jump_cloud_scim_v_2_0, + :okta_scim_v_2_0, + :onelogin_scim_v_2_0, + :people_hr, + :personio, + :pingfederate_scim_v_2_0, + :rippling_scim_v_2_0, + :rippling, + :sailpoint_scim_v_2_0, + :s_3, + :sftp, + :sftp_workday, + :workday + ] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("azure scim v2.0"), do: :azure_scim_v_2_0 + def cast("bamboohr"), do: :bamboohr + def cast("breathe hr"), do: :breathe_hr + def cast("cezanne hr"), do: :cezanne_hr + def cast("cyberark scim v2.0"), do: :cyberark_scim_v_2_0 + def cast("fourth hr"), do: :fourth_hr + def cast("generic scim v2.0"), do: :generic_scim_v_2_0 + def cast("gsuite directory"), do: :gsuite_directory + def cast("gusto"), do: :gusto + def cast("hibob"), do: :hibob + def cast("jump cloud scim v2.0"), do: :jump_cloud_scim_v_2_0 + def cast("okta scim v2.0"), do: :okta_scim_v_2_0 + def cast("onelogin scim v2.0"), do: :onelogin_scim_v_2_0 + def cast("people hr"), do: :people_hr + def cast("personio"), do: :personio + def cast("pingfederate scim v2.0"), do: :pingfederate_scim_v_2_0 + def cast("rippling scim v2.0"), do: :rippling_scim_v_2_0 + def cast("rippling"), do: :rippling + def cast("sailpoint scim v2.0"), do: :sailpoint_scim_v_2_0 + def cast("s3"), do: :s_3 + def cast("sftp"), do: :sftp + def cast("sftp workday"), do: :sftp_workday + def cast("workday"), do: :workday + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:azure_scim_v_2_0), do: "azure scim v2.0" + def dump(:bamboohr), do: "bamboohr" + def dump(:breathe_hr), do: "breathe hr" + def dump(:cezanne_hr), do: "cezanne hr" + def dump(:cyberark_scim_v_2_0), do: "cyberark scim v2.0" + def dump(:fourth_hr), do: "fourth hr" + def dump(:generic_scim_v_2_0), do: "generic scim v2.0" + def dump(:gsuite_directory), do: "gsuite directory" + def dump(:gusto), do: "gusto" + def dump(:hibob), do: "hibob" + def dump(:jump_cloud_scim_v_2_0), do: "jump cloud scim v2.0" + def dump(:okta_scim_v_2_0), do: "okta scim v2.0" + def dump(:onelogin_scim_v_2_0), do: "onelogin scim v2.0" + def dump(:people_hr), do: "people hr" + def dump(:personio), do: "personio" + def dump(:pingfederate_scim_v_2_0), do: "pingfederate scim v2.0" + def dump(:rippling_scim_v_2_0), do: "rippling scim v2.0" + def dump(:rippling), do: "rippling" + def dump(:sailpoint_scim_v_2_0), do: "sailpoint scim v2.0" + def dump(:s_3), do: "s3" + def dump(:sftp), do: "sftp" + def dump(:sftp_workday), do: "sftp workday" + def dump(:workday), do: "workday" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/dsync_group_created.ex b/lib/workos/dsync_group_created.ex new file mode 100644 index 00000000..81418fa1 --- /dev/null +++ b/lib/workos/dsync_group_created.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DsyncGroupCreated do + @moduledoc """ + DsyncGroupCreated model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.DirectoryGroup.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.DirectoryGroup.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => WorkOS.Cast.dump_struct(struct.data, &WorkOS.DirectoryGroup.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/dsync_group_deleted.ex b/lib/workos/dsync_group_deleted.ex new file mode 100644 index 00000000..29ffa2a7 --- /dev/null +++ b/lib/workos/dsync_group_deleted.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DsyncGroupDeleted do + @moduledoc """ + DsyncGroupDeleted model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.DirectoryGroup.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.DirectoryGroup.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => WorkOS.Cast.dump_struct(struct.data, &WorkOS.DirectoryGroup.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/dsync_group_updated.ex b/lib/workos/dsync_group_updated.ex new file mode 100644 index 00000000..b1cb40da --- /dev/null +++ b/lib/workos/dsync_group_updated.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DsyncGroupUpdated do + @moduledoc """ + DsyncGroupUpdated model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.DsyncGroupUpdatedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.DsyncGroupUpdatedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => WorkOS.Cast.dump_struct(struct.data, &WorkOS.DsyncGroupUpdatedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/dsync_group_updated_data.ex b/lib/workos/dsync_group_updated_data.ex new file mode 100644 index 00000000..d9b674b0 --- /dev/null +++ b/lib/workos/dsync_group_updated_data.ex @@ -0,0 +1,67 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DsyncGroupUpdatedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :object, + :id, + :idp_id, + :directory_id, + :organization_id, + :name, + :created_at, + :updated_at, + :raw_attributes, + :previous_attributes + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + idp_id: String.t(), + directory_id: String.t(), + organization_id: String.t(), + name: String.t(), + created_at: String.t(), + updated_at: String.t(), + raw_attributes: %{optional(String.t()) => term()} | nil, + previous_attributes: %{optional(String.t()) => term()} | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + idp_id: map["idp_id"], + directory_id: map["directory_id"], + organization_id: map["organization_id"], + name: map["name"], + created_at: map["created_at"], + updated_at: map["updated_at"], + raw_attributes: map["raw_attributes"], + previous_attributes: map["previous_attributes"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "idp_id" => struct.idp_id, + "directory_id" => struct.directory_id, + "organization_id" => struct.organization_id, + "name" => struct.name, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at, + "raw_attributes" => struct.raw_attributes, + "previous_attributes" => struct.previous_attributes + }) + end +end diff --git a/lib/workos/dsync_group_user_added.ex b/lib/workos/dsync_group_user_added.ex new file mode 100644 index 00000000..9671ab79 --- /dev/null +++ b/lib/workos/dsync_group_user_added.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DsyncGroupUserAdded do + @moduledoc """ + DsyncGroupUserAdded model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.DsyncGroupUserAddedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.DsyncGroupUserAddedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => WorkOS.Cast.dump_struct(struct.data, &WorkOS.DsyncGroupUserAddedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/dsync_group_user_added_data.ex b/lib/workos/dsync_group_user_added_data.ex new file mode 100644 index 00000000..3e82e483 --- /dev/null +++ b/lib/workos/dsync_group_user_added_data.ex @@ -0,0 +1,39 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DsyncGroupUserAddedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :directory_id, + :user, + :group + ] + + @type t :: %__MODULE__{ + directory_id: String.t(), + user: WorkOS.DirectoryUser.t(), + group: WorkOS.DirectoryGroup.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + directory_id: map["directory_id"], + user: WorkOS.Cast.nested(map["user"], &WorkOS.DirectoryUser.from_map/1), + group: WorkOS.Cast.nested(map["group"], &WorkOS.DirectoryGroup.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "directory_id" => struct.directory_id, + "user" => WorkOS.Cast.dump_struct(struct.user, &WorkOS.DirectoryUser.to_map/1), + "group" => WorkOS.Cast.dump_struct(struct.group, &WorkOS.DirectoryGroup.to_map/1) + }) + end +end diff --git a/lib/workos/dsync_group_user_removed.ex b/lib/workos/dsync_group_user_removed.ex new file mode 100644 index 00000000..8cefd590 --- /dev/null +++ b/lib/workos/dsync_group_user_removed.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DsyncGroupUserRemoved do + @moduledoc """ + DsyncGroupUserRemoved model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.DsyncGroupUserRemovedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.DsyncGroupUserRemovedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => WorkOS.Cast.dump_struct(struct.data, &WorkOS.DsyncGroupUserRemovedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/dsync_group_user_removed_data.ex b/lib/workos/dsync_group_user_removed_data.ex new file mode 100644 index 00000000..a89c4296 --- /dev/null +++ b/lib/workos/dsync_group_user_removed_data.ex @@ -0,0 +1,39 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DsyncGroupUserRemovedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :directory_id, + :user, + :group + ] + + @type t :: %__MODULE__{ + directory_id: String.t(), + user: WorkOS.DirectoryUser.t(), + group: WorkOS.DirectoryGroup.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + directory_id: map["directory_id"], + user: WorkOS.Cast.nested(map["user"], &WorkOS.DirectoryUser.from_map/1), + group: WorkOS.Cast.nested(map["group"], &WorkOS.DirectoryGroup.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "directory_id" => struct.directory_id, + "user" => WorkOS.Cast.dump_struct(struct.user, &WorkOS.DirectoryUser.to_map/1), + "group" => WorkOS.Cast.dump_struct(struct.group, &WorkOS.DirectoryGroup.to_map/1) + }) + end +end diff --git a/lib/workos/dsync_token_created.ex b/lib/workos/dsync_token_created.ex new file mode 100644 index 00000000..e0b4d859 --- /dev/null +++ b/lib/workos/dsync_token_created.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DsyncTokenCreated do + @moduledoc """ + DsyncTokenCreated model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.DsyncTokenCreatedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.DsyncTokenCreatedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => WorkOS.Cast.dump_struct(struct.data, &WorkOS.DsyncTokenCreatedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/dsync_token_created_data.ex b/lib/workos/dsync_token_created_data.ex new file mode 100644 index 00000000..30f7d14c --- /dev/null +++ b/lib/workos/dsync_token_created_data.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DsyncTokenCreatedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :object, + :id, + :directory_id, + :token_suffix, + :created_at, + :organization_id + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + directory_id: String.t(), + token_suffix: String.t(), + created_at: String.t(), + organization_id: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + directory_id: map["directory_id"], + token_suffix: map["token_suffix"], + created_at: map["created_at"], + organization_id: map["organization_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "directory_id" => struct.directory_id, + "token_suffix" => struct.token_suffix, + "created_at" => struct.created_at, + "organization_id" => struct.organization_id + }) + end +end diff --git a/lib/workos/dsync_token_revoked.ex b/lib/workos/dsync_token_revoked.ex new file mode 100644 index 00000000..63191a76 --- /dev/null +++ b/lib/workos/dsync_token_revoked.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DsyncTokenRevoked do + @moduledoc """ + DsyncTokenRevoked model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.DsyncTokenRevokedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.DsyncTokenRevokedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => WorkOS.Cast.dump_struct(struct.data, &WorkOS.DsyncTokenRevokedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/dsync_token_revoked_data.ex b/lib/workos/dsync_token_revoked_data.ex new file mode 100644 index 00000000..88f04d34 --- /dev/null +++ b/lib/workos/dsync_token_revoked_data.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DsyncTokenRevokedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :object, + :id, + :directory_id, + :token_suffix, + :created_at, + :organization_id + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + directory_id: String.t(), + token_suffix: String.t(), + created_at: String.t(), + organization_id: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + directory_id: map["directory_id"], + token_suffix: map["token_suffix"], + created_at: map["created_at"], + organization_id: map["organization_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "directory_id" => struct.directory_id, + "token_suffix" => struct.token_suffix, + "created_at" => struct.created_at, + "organization_id" => struct.organization_id + }) + end +end diff --git a/lib/workos/dsync_user_created.ex b/lib/workos/dsync_user_created.ex new file mode 100644 index 00000000..d5d75685 --- /dev/null +++ b/lib/workos/dsync_user_created.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DsyncUserCreated do + @moduledoc """ + DsyncUserCreated model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.DirectoryUser.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.DirectoryUser.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => WorkOS.Cast.dump_struct(struct.data, &WorkOS.DirectoryUser.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/dsync_user_deleted.ex b/lib/workos/dsync_user_deleted.ex new file mode 100644 index 00000000..a26f580f --- /dev/null +++ b/lib/workos/dsync_user_deleted.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DsyncUserDeleted do + @moduledoc """ + DsyncUserDeleted model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.DirectoryUser.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.DirectoryUser.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => WorkOS.Cast.dump_struct(struct.data, &WorkOS.DirectoryUser.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/dsync_user_updated.ex b/lib/workos/dsync_user_updated.ex new file mode 100644 index 00000000..9a031c11 --- /dev/null +++ b/lib/workos/dsync_user_updated.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DsyncUserUpdated do + @moduledoc """ + DsyncUserUpdated model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.DsyncUserUpdatedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.DsyncUserUpdatedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => WorkOS.Cast.dump_struct(struct.data, &WorkOS.DsyncUserUpdatedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/dsync_user_updated_data.ex b/lib/workos/dsync_user_updated_data.ex new file mode 100644 index 00000000..f00c7a18 --- /dev/null +++ b/lib/workos/dsync_user_updated_data.ex @@ -0,0 +1,120 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DsyncUserUpdatedData do + @moduledoc """ + The event payload. + + ## Deprecated fields + + * `:raw_attributes` — The raw attributes received from the directory provider. + * `:emails` — A list of email addresses for the user. + * `:job_title` — The job title of the user. + * `:username` — The username of the user. + """ + + defstruct [ + :object, + :id, + :directory_id, + :organization_id, + :idp_id, + :email, + :state, + :raw_attributes, + :custom_attributes, + :created_at, + :updated_at, + :first_name, + :last_name, + :name, + :emails, + :job_title, + :username, + :role, + :roles, + :previous_attributes + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + directory_id: String.t(), + organization_id: String.t(), + idp_id: String.t(), + email: String.t() | nil, + state: WorkOS.DsyncUserUpdatedDataState.t(), + raw_attributes: %{optional(String.t()) => term()}, + custom_attributes: %{optional(String.t()) => term()}, + created_at: String.t(), + updated_at: String.t(), + first_name: String.t() | nil, + last_name: String.t() | nil, + name: String.t() | nil, + emails: [WorkOS.DsyncUserUpdatedDataEmail.t()] | nil, + job_title: String.t() | nil, + username: String.t() | nil, + role: WorkOS.SlimRole.t() | nil, + roles: [WorkOS.SlimRole.t()] | nil, + previous_attributes: %{optional(String.t()) => term()} | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + directory_id: map["directory_id"], + organization_id: map["organization_id"], + idp_id: map["idp_id"], + email: map["email"], + state: WorkOS.Cast.enum(map["state"], &WorkOS.DsyncUserUpdatedDataState.cast/1), + raw_attributes: map["raw_attributes"], + custom_attributes: map["custom_attributes"], + created_at: map["created_at"], + updated_at: map["updated_at"], + first_name: map["first_name"], + last_name: map["last_name"], + name: map["name"], + emails: WorkOS.Cast.list(map["emails"], &WorkOS.DsyncUserUpdatedDataEmail.from_map/1), + job_title: map["job_title"], + username: map["username"], + role: WorkOS.Cast.nested(map["role"], &WorkOS.SlimRole.from_map/1), + roles: WorkOS.Cast.list(map["roles"], &WorkOS.SlimRole.from_map/1), + previous_attributes: map["previous_attributes"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "directory_id" => struct.directory_id, + "organization_id" => struct.organization_id, + "idp_id" => struct.idp_id, + "email" => struct.email, + "state" => WorkOS.Cast.enum(struct.state, &WorkOS.DsyncUserUpdatedDataState.dump/1), + "raw_attributes" => struct.raw_attributes, + "custom_attributes" => struct.custom_attributes, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at, + "first_name" => struct.first_name, + "last_name" => struct.last_name, + "name" => struct.name, + "emails" => + WorkOS.Cast.list(struct.emails, fn item -> + WorkOS.Cast.dump_struct(item, &WorkOS.DsyncUserUpdatedDataEmail.to_map/1) + end), + "job_title" => struct.job_title, + "username" => struct.username, + "role" => WorkOS.Cast.dump_struct(struct.role, &WorkOS.SlimRole.to_map/1), + "roles" => + WorkOS.Cast.list(struct.roles, fn item -> + WorkOS.Cast.dump_struct(item, &WorkOS.SlimRole.to_map/1) + end), + "previous_attributes" => struct.previous_attributes + }) + end +end diff --git a/lib/workos/dsync_user_updated_data_email.ex b/lib/workos/dsync_user_updated_data_email.ex new file mode 100644 index 00000000..a15120e6 --- /dev/null +++ b/lib/workos/dsync_user_updated_data_email.ex @@ -0,0 +1,39 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DsyncUserUpdatedDataEmail do + @moduledoc """ + DsyncUserUpdatedDataEmail model. + """ + + defstruct [ + :primary, + :type, + :value + ] + + @type t :: %__MODULE__{ + primary: boolean() | nil, + type: String.t() | nil, + value: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + primary: map["primary"], + type: map["type"], + value: map["value"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "primary" => struct.primary, + "type" => struct.type, + "value" => struct.value + }) + end +end diff --git a/lib/workos/dsync_user_updated_data_state.ex b/lib/workos/dsync_user_updated_data_state.ex new file mode 100644 index 00000000..7ff11c06 --- /dev/null +++ b/lib/workos/dsync_user_updated_data_state.ex @@ -0,0 +1,27 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DsyncUserUpdatedDataState do + @moduledoc """ + DsyncUserUpdatedDataState enum. + """ + + @type t :: :active | :suspended | :inactive + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:active, :suspended, :inactive] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("active"), do: :active + def cast("suspended"), do: :suspended + def cast("inactive"), do: :inactive + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:active), do: "active" + def dump(:suspended), do: "suspended" + def dump(:inactive), do: "inactive" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/email_change.ex b/lib/workos/email_change.ex new file mode 100644 index 00000000..072c4e23 --- /dev/null +++ b/lib/workos/email_change.ex @@ -0,0 +1,47 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.EmailChange do + @moduledoc """ + EmailChange model. + """ + + defstruct [ + :object, + :user, + :new_email, + :expires_at, + :created_at + ] + + @type t :: %__MODULE__{ + object: String.t(), + user: WorkOS.User.t(), + new_email: String.t(), + expires_at: String.t(), + created_at: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + user: WorkOS.Cast.nested(map["user"], &WorkOS.User.from_map/1), + new_email: map["new_email"], + expires_at: map["expires_at"], + created_at: map["created_at"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "user" => WorkOS.Cast.dump_struct(struct.user, &WorkOS.User.to_map/1), + "new_email" => struct.new_email, + "expires_at" => struct.expires_at, + "created_at" => struct.created_at + }) + end +end diff --git a/lib/workos/email_change_confirmation.ex b/lib/workos/email_change_confirmation.ex new file mode 100644 index 00000000..f0c09321 --- /dev/null +++ b/lib/workos/email_change_confirmation.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.EmailChangeConfirmation do + @moduledoc """ + EmailChangeConfirmation model. + """ + + defstruct [ + :object, + :user + ] + + @type t :: %__MODULE__{ + object: String.t(), + user: WorkOS.EmailChangeConfirmationUser.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + user: WorkOS.Cast.nested(map["user"], &WorkOS.EmailChangeConfirmationUser.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "user" => WorkOS.Cast.dump_struct(struct.user, &WorkOS.EmailChangeConfirmationUser.to_map/1) + }) + end +end diff --git a/lib/workos/email_change_confirmation_user.ex b/lib/workos/email_change_confirmation_user.ex new file mode 100644 index 00000000..5589390e --- /dev/null +++ b/lib/workos/email_change_confirmation_user.ex @@ -0,0 +1,83 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.EmailChangeConfirmationUser do + @moduledoc """ + The user object. + """ + + defstruct [ + :object, + :id, + :first_name, + :last_name, + :profile_picture_url, + :email, + :email_verified, + :external_id, + :last_sign_in_at, + :created_at, + :updated_at, + :name, + :metadata, + :locale + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + first_name: String.t() | nil, + last_name: String.t() | nil, + profile_picture_url: String.t() | nil, + email: String.t(), + email_verified: boolean(), + external_id: String.t() | nil, + last_sign_in_at: String.t() | nil, + created_at: String.t(), + updated_at: String.t(), + name: String.t() | nil, + metadata: %{optional(String.t()) => String.t()} | nil, + locale: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + first_name: map["first_name"], + last_name: map["last_name"], + profile_picture_url: map["profile_picture_url"], + email: map["email"], + email_verified: map["email_verified"], + external_id: map["external_id"], + last_sign_in_at: map["last_sign_in_at"], + created_at: map["created_at"], + updated_at: map["updated_at"], + name: map["name"], + metadata: map["metadata"], + locale: map["locale"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "first_name" => struct.first_name, + "last_name" => struct.last_name, + "profile_picture_url" => struct.profile_picture_url, + "email" => struct.email, + "email_verified" => struct.email_verified, + "external_id" => struct.external_id, + "last_sign_in_at" => struct.last_sign_in_at, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at, + "name" => struct.name, + "metadata" => struct.metadata, + "locale" => struct.locale + }) + end +end diff --git a/lib/workos/email_verification.ex b/lib/workos/email_verification.ex new file mode 100644 index 00000000..b5a46742 --- /dev/null +++ b/lib/workos/email_verification.ex @@ -0,0 +1,59 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.EmailVerification do + @moduledoc """ + EmailVerification model. + """ + + defstruct [ + :object, + :id, + :user_id, + :email, + :expires_at, + :created_at, + :updated_at, + :code + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + user_id: String.t(), + email: String.t(), + expires_at: String.t(), + created_at: String.t(), + updated_at: String.t(), + code: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + user_id: map["user_id"], + email: map["email"], + expires_at: map["expires_at"], + created_at: map["created_at"], + updated_at: map["updated_at"], + code: map["code"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "user_id" => struct.user_id, + "email" => struct.email, + "expires_at" => struct.expires_at, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at, + "code" => struct.code + }) + end +end diff --git a/lib/workos/email_verification_code_session_authenticate_request.ex b/lib/workos/email_verification_code_session_authenticate_request.ex new file mode 100644 index 00000000..8f3e9aab --- /dev/null +++ b/lib/workos/email_verification_code_session_authenticate_request.ex @@ -0,0 +1,59 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.EmailVerificationCodeSessionAuthenticateRequest do + @moduledoc """ + EmailVerificationCodeSessionAuthenticateRequest model. + """ + + defstruct [ + :client_id, + :client_secret, + :grant_type, + :code, + :pending_authentication_token, + :ip_address, + :device_id, + :user_agent + ] + + @type t :: %__MODULE__{ + client_id: String.t(), + client_secret: String.t(), + grant_type: String.t(), + code: String.t(), + pending_authentication_token: String.t(), + ip_address: String.t() | nil, + device_id: String.t() | nil, + user_agent: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + client_id: map["client_id"], + client_secret: map["client_secret"], + grant_type: map["grant_type"], + code: map["code"], + pending_authentication_token: map["pending_authentication_token"], + ip_address: map["ip_address"], + device_id: map["device_id"], + user_agent: map["user_agent"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "client_id" => struct.client_id, + "client_secret" => struct.client_secret, + "grant_type" => struct.grant_type, + "code" => struct.code, + "pending_authentication_token" => struct.pending_authentication_token, + "ip_address" => struct.ip_address, + "device_id" => struct.device_id, + "user_agent" => struct.user_agent + }) + end +end diff --git a/lib/workos/email_verification_created.ex b/lib/workos/email_verification_created.ex new file mode 100644 index 00000000..a666be25 --- /dev/null +++ b/lib/workos/email_verification_created.ex @@ -0,0 +1,52 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.EmailVerificationCreated do + @moduledoc """ + EmailVerificationCreated model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.EmailVerificationCreatedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.EmailVerificationCreatedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => + WorkOS.Cast.dump_struct(struct.data, &WorkOS.EmailVerificationCreatedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/email_verification_created_data.ex b/lib/workos/email_verification_created_data.ex new file mode 100644 index 00000000..89ed22f6 --- /dev/null +++ b/lib/workos/email_verification_created_data.ex @@ -0,0 +1,55 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.EmailVerificationCreatedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :object, + :id, + :user_id, + :email, + :expires_at, + :created_at, + :updated_at + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + user_id: String.t(), + email: String.t(), + expires_at: String.t(), + created_at: String.t(), + updated_at: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + user_id: map["user_id"], + email: map["email"], + expires_at: map["expires_at"], + created_at: map["created_at"], + updated_at: map["updated_at"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "user_id" => struct.user_id, + "email" => struct.email, + "expires_at" => struct.expires_at, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at + }) + end +end diff --git a/lib/workos/empty.ex b/lib/workos/empty.ex deleted file mode 100644 index 6450d1f6..00000000 --- a/lib/workos/empty.ex +++ /dev/null @@ -1,15 +0,0 @@ -defmodule WorkOS.Empty do - @moduledoc """ - Empty response. - """ - - @behaviour WorkOS.Castable - - @type t() :: %__MODULE__{status: String.t()} | :accepted - - defstruct [:status] - - @impl true - def cast(_map), do: %__MODULE__{} - def cast(__MODULE__, "Accepted"), do: %__MODULE__{status: "Accepted"} -end diff --git a/lib/workos/enroll_user_authentication_factor.ex b/lib/workos/enroll_user_authentication_factor.ex new file mode 100644 index 00000000..34c70323 --- /dev/null +++ b/lib/workos/enroll_user_authentication_factor.ex @@ -0,0 +1,43 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.EnrollUserAuthenticationFactor do + @moduledoc """ + EnrollUserAuthenticationFactor model. + """ + + defstruct [ + :type, + :totp_issuer, + :totp_user, + :totp_secret + ] + + @type t :: %__MODULE__{ + type: String.t(), + totp_issuer: String.t() | nil, + totp_user: String.t() | nil, + totp_secret: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + type: map["type"], + totp_issuer: map["totp_issuer"], + totp_user: map["totp_user"], + totp_secret: map["totp_secret"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "type" => struct.type, + "totp_issuer" => struct.totp_issuer, + "totp_user" => struct.totp_user, + "totp_secret" => struct.totp_secret + }) + end +end diff --git a/lib/workos/error.ex b/lib/workos/error.ex deleted file mode 100644 index c6aad658..00000000 --- a/lib/workos/error.ex +++ /dev/null @@ -1,39 +0,0 @@ -defmodule WorkOS.Error do - @moduledoc """ - Castable module for returning structured errors from the WorkOS API. - """ - - @behaviour WorkOS.Castable - - @type unprocessable_entity_error() :: %{ - field: String.t(), - code: String.t() - } - - @type t() :: %__MODULE__{ - code: String.t() | nil, - error: String.t() | nil, - errors: [unprocessable_entity_error()] | nil, - message: String.t(), - error_description: String.t() | nil - } - - defstruct [ - :code, - :error, - :errors, - :message, - :error_description - ] - - @impl true - def cast(error) when is_map(error) do - %__MODULE__{ - code: error["code"], - error: error["error"], - errors: error["errors"], - message: error["message"], - error_description: error["error_description"] - } - end -end diff --git a/lib/workos/error_response.ex b/lib/workos/error_response.ex new file mode 100644 index 00000000..0b94f65d --- /dev/null +++ b/lib/workos/error_response.ex @@ -0,0 +1,31 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ErrorResponse do + @moduledoc """ + Error response body. + """ + + defstruct [ + :error + ] + + @type t :: %__MODULE__{ + error: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + error: map["error"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "error" => struct.error + }) + end +end diff --git a/lib/workos/errors.ex b/lib/workos/errors.ex new file mode 100644 index 00000000..5b254355 --- /dev/null +++ b/lib/workos/errors.ex @@ -0,0 +1,64 @@ +# @oagen-ignore-file + +defmodule WorkOS.Error do + @moduledoc """ + Union of the error values SDK functions can return in `{:error, error}` tuples. + """ + + @type error :: WorkOS.ApiError.t() | WorkOS.TransportError.t() +end + +defmodule WorkOS.ApiError do + @moduledoc """ + A non-2xx response from the API. + + The `:kind` field classifies the failure by status code (e.g. `:not_found`), + so callers can pattern-match without memorizing status numbers. `:param` + carries the offending field name when the API names one. + """ + + defexception [:message, :status, :kind, :request_id, :code, :param, :body] + + @type kind :: + :bad_request + | :authentication + | :authorization + | :not_found + | :conflict + | :unprocessable_entity + | :rate_limit_exceeded + | :server + | :api + + @type t :: %__MODULE__{ + message: String.t(), + status: pos_integer(), + kind: kind(), + request_id: String.t() | nil, + code: String.t() | nil, + param: String.t() | nil, + body: map() | String.t() | nil + } +end + +defmodule WorkOS.TransportError do + @moduledoc """ + A network-level failure (DNS, timeout, connection refused). + """ + + defexception [:message, :reason] + + @type t :: %__MODULE__{message: String.t(), reason: term()} +end + +defmodule WorkOS.ConfigurationError do + @moduledoc """ + Missing or invalid client configuration (e.g. no API key). Raised from + `WorkOS.Client.new/1` — configuration problems are programmer errors, not + runtime failures. + """ + + defexception [:message] + + @type t :: %__MODULE__{message: String.t()} +end diff --git a/lib/workos/errors/api_key_missing.ex b/lib/workos/errors/api_key_missing.ex deleted file mode 100644 index 92e6b6d1..00000000 --- a/lib/workos/errors/api_key_missing.ex +++ /dev/null @@ -1,11 +0,0 @@ -defmodule WorkOS.ApiKeyMissingError do - @moduledoc """ - Exception for when a request is made without an API key. - """ - - defexception message: """ - The api_key setting is required to make requests to WorkOS. - Please configure :api_key in config.exs, set the WORKOS_API_KEY - environment variable, or pass into a new client instance. - """ -end diff --git a/lib/workos/errors/client_id_missing.ex b/lib/workos/errors/client_id_missing.ex deleted file mode 100644 index 4d7e3970..00000000 --- a/lib/workos/errors/client_id_missing.ex +++ /dev/null @@ -1,11 +0,0 @@ -defmodule WorkOS.ClientIdMissingError do - @moduledoc """ - Exception for when a request is made without a client ID. - """ - - defexception message: """ - The client_id setting is required to make requests to WorkOS. - Please configure :client_id in config.exs, set the WORKOS_CLIENT_ID - environment variable, or pass into a new client instance. - """ -end diff --git a/lib/workos/event_context.ex b/lib/workos/event_context.ex new file mode 100644 index 00000000..31dbd95e --- /dev/null +++ b/lib/workos/event_context.ex @@ -0,0 +1,58 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.EventContext do + @moduledoc """ + Additional context about the event. + """ + + defstruct [ + :google_analytics_client_id, + :google_analytics_sessions, + :ajs_anonymous_id, + :client_id, + :actor, + :previous_attributes + ] + + @type t :: %__MODULE__{ + google_analytics_client_id: String.t() | nil, + google_analytics_sessions: [WorkOS.EventContextGoogleAnalyticsSession.t()] | nil, + ajs_anonymous_id: String.t() | nil, + client_id: String.t() | nil, + actor: WorkOS.EventContextActor.t() | nil, + previous_attributes: %{optional(String.t()) => term()} | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + google_analytics_client_id: map["google_analytics_client_id"], + google_analytics_sessions: + WorkOS.Cast.list( + map["google_analytics_sessions"], + &WorkOS.EventContextGoogleAnalyticsSession.from_map/1 + ), + ajs_anonymous_id: map["ajs_anonymous_id"], + client_id: map["client_id"], + actor: WorkOS.Cast.nested(map["actor"], &WorkOS.EventContextActor.from_map/1), + previous_attributes: map["previous_attributes"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "google_analytics_client_id" => struct.google_analytics_client_id, + "google_analytics_sessions" => + WorkOS.Cast.list(struct.google_analytics_sessions, fn item -> + WorkOS.Cast.dump_struct(item, &WorkOS.EventContextGoogleAnalyticsSession.to_map/1) + end), + "ajs_anonymous_id" => struct.ajs_anonymous_id, + "client_id" => struct.client_id, + "actor" => WorkOS.Cast.dump_struct(struct.actor, &WorkOS.EventContextActor.to_map/1), + "previous_attributes" => struct.previous_attributes + }) + end +end diff --git a/lib/workos/event_context_actor.ex b/lib/workos/event_context_actor.ex new file mode 100644 index 00000000..aed7a702 --- /dev/null +++ b/lib/workos/event_context_actor.ex @@ -0,0 +1,39 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.EventContextActor do + @moduledoc """ + The actor who performed the action. + """ + + defstruct [ + :id, + :source, + :name + ] + + @type t :: %__MODULE__{ + id: String.t(), + source: WorkOS.EventContextActorSource.t(), + name: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + id: map["id"], + source: WorkOS.Cast.enum(map["source"], &WorkOS.EventContextActorSource.cast/1), + name: map["name"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "id" => struct.id, + "source" => WorkOS.Cast.enum(struct.source, &WorkOS.EventContextActorSource.dump/1), + "name" => struct.name + }) + end +end diff --git a/lib/workos/event_context_actor_source.ex b/lib/workos/event_context_actor_source.ex new file mode 100644 index 00000000..ea7c41b3 --- /dev/null +++ b/lib/workos/event_context_actor_source.ex @@ -0,0 +1,29 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.EventContextActorSource do + @moduledoc """ + EventContextActorSource enum. + """ + + @type t :: :api | :dashboard | :admin_portal | :system + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:api, :dashboard, :admin_portal, :system] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("api"), do: :api + def cast("dashboard"), do: :dashboard + def cast("admin_portal"), do: :admin_portal + def cast("system"), do: :system + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:api), do: "api" + def dump(:dashboard), do: "dashboard" + def dump(:admin_portal), do: "admin_portal" + def dump(:system), do: "system" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/event_context_google_analytics_session.ex b/lib/workos/event_context_google_analytics_session.ex new file mode 100644 index 00000000..e43b0359 --- /dev/null +++ b/lib/workos/event_context_google_analytics_session.ex @@ -0,0 +1,39 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.EventContextGoogleAnalyticsSession do + @moduledoc """ + EventContextGoogleAnalyticsSession model. + """ + + defstruct [ + :container_id, + :session_id, + :session_number + ] + + @type t :: %__MODULE__{ + container_id: String.t(), + session_id: String.t() | nil, + session_number: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + container_id: map["containerId"], + session_id: map["sessionId"], + session_number: map["sessionNumber"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "containerId" => struct.container_id, + "sessionId" => struct.session_id, + "sessionNumber" => struct.session_number + }) + end +end diff --git a/lib/workos/event_list.ex b/lib/workos/event_list.ex new file mode 100644 index 00000000..ea0f2f81 --- /dev/null +++ b/lib/workos/event_list.ex @@ -0,0 +1,44 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.EventList do + @moduledoc """ + EventList model. + """ + + defstruct [ + :object, + :data, + :list_metadata + ] + + @type t :: %__MODULE__{ + object: String.t(), + data: [WorkOS.EventSchema.t()], + list_metadata: WorkOS.EventListListMetadata.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + data: WorkOS.Cast.list(map["data"], &WorkOS.EventSchema.from_map/1), + list_metadata: + WorkOS.Cast.nested(map["list_metadata"], &WorkOS.EventListListMetadata.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "data" => + WorkOS.Cast.list(struct.data, fn item -> + WorkOS.Cast.dump_struct(item, &WorkOS.EventSchema.to_map/1) + end), + "list_metadata" => + WorkOS.Cast.dump_struct(struct.list_metadata, &WorkOS.EventListListMetadata.to_map/1) + }) + end +end diff --git a/lib/workos/event_list_list_metadata.ex b/lib/workos/event_list_list_metadata.ex new file mode 100644 index 00000000..0addb1bb --- /dev/null +++ b/lib/workos/event_list_list_metadata.ex @@ -0,0 +1,31 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.EventListListMetadata do + @moduledoc """ + Pagination cursor for navigating to the next page of results. + """ + + defstruct [ + :after_ + ] + + @type t :: %__MODULE__{ + after_: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + after_: map["after"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "after" => struct.after_ + }) + end +end diff --git a/lib/workos/event_schema.ex b/lib/workos/event_schema.ex new file mode 100644 index 00000000..e8bf49c5 --- /dev/null +++ b/lib/workos/event_schema.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.EventSchema do + @moduledoc """ + An event emitted by WorkOS. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: %{optional(String.t()) => term()}, + created_at: String.t(), + context: %{optional(String.t()) => term()} | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: map["data"], + created_at: map["created_at"], + context: map["context"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => struct.data, + "created_at" => struct.created_at, + "context" => struct.context + }) + end +end diff --git a/lib/workos/events.ex b/lib/workos/events.ex index d4d38f63..787d38fc 100644 --- a/lib/workos/events.ex +++ b/lib/workos/events.ex @@ -1,49 +1,33 @@ +# This file is auto-generated by oagen. Do not edit. + defmodule WorkOS.Events do @moduledoc """ - Manage Events API in WorkOS. - - @see https://workos.com/docs/events + Operations for the Events API. """ - alias WorkOS.Events.Event - @doc """ - Lists all events. + List events - Parameter options: + List events for the current environment. - * `:events` - Filter to only return events of particular types. - * `:range_start` - Date range start for stream of events. - * `:range_end` - Date range end for stream of events. - * `:limit` - Maximum number of records to return. Accepts values between 1 and 100. Default is 10. - * `:after` - Pagination cursor to receive records after a provided event ID. + ## Parameters + * `params` — query parameters: `:before`, `:after_`, `:limit`, `:order`, `:events`, `:range_start`, `:range_end`, `:organization_id` + * `opts` — per-request options (see `WorkOS.Client.request/5`) """ - @spec list_events(WorkOS.Client.t(), map()) :: - WorkOS.Client.response(WorkOS.List.t(Event.t())) - def list_events(client, opts) do - WorkOS.Client.get(client, WorkOS.List.of(Event), "/events", - query: [ - events: opts[:events], - range_start: opts[:range_start], - range_end: opts[:range_end], - limit: opts[:limit], - after: opts[:after] - ] - ) - end + @spec list_events(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.Page.t(WorkOS.EventList.t())} | {:error, WorkOS.Error.error()} + def list_events(client, params \\ %{}, opts \\ []) do + with {:ok, body} <- WorkOS.Client.request(client, :get, "/events", params, opts) do + fetch_next = fn cursor -> + list_events( + client, + WorkOS.Page.next_params(params, "after", cursor), + opts + ) + end - @spec list_events(map()) :: - WorkOS.Client.response(WorkOS.List.t(Event.t())) - def list_events(opts \\ %{}) do - WorkOS.Client.get(WorkOS.client(), WorkOS.List.of(Event), "/events", - query: [ - events: opts[:events], - range_start: opts[:range_start], - range_end: opts[:range_end], - limit: opts[:limit], - after: opts[:after] - ] - ) + {:ok, WorkOS.Page.from_map(body, "data", &WorkOS.EventList.from_map/1, fetch_next)} + end end end diff --git a/lib/workos/events/event.ex b/lib/workos/events/event.ex deleted file mode 100644 index b800d224..00000000 --- a/lib/workos/events/event.ex +++ /dev/null @@ -1,32 +0,0 @@ -defmodule WorkOS.Events.Event do - @moduledoc """ - WorkOS Event struct. - """ - - @behaviour WorkOS.Castable - - @type t() :: %__MODULE__{ - id: String.t(), - event: String.t(), - data: map(), - created_at: String.t() - } - - @enforce_keys [:id, :event, :created_at] - defstruct [ - :id, - :event, - :data, - :created_at - ] - - @impl true - def cast(map) do - %__MODULE__{ - id: map["id"], - data: map["data"], - event: map["event"], - created_at: map["created_at"] - } - end -end diff --git a/lib/workos/expire_api_key.ex b/lib/workos/expire_api_key.ex new file mode 100644 index 00000000..0390636b --- /dev/null +++ b/lib/workos/expire_api_key.ex @@ -0,0 +1,31 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ExpireApiKey do + @moduledoc """ + ExpireApiKey model. + """ + + defstruct [ + :expires_at + ] + + @type t :: %__MODULE__{ + expires_at: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + expires_at: map["expires_at"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "expires_at" => struct.expires_at + }) + end +end diff --git a/lib/workos/external_auth_complete_response.ex b/lib/workos/external_auth_complete_response.ex new file mode 100644 index 00000000..bc7f0ad9 --- /dev/null +++ b/lib/workos/external_auth_complete_response.ex @@ -0,0 +1,31 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ExternalAuthCompleteResponse do + @moduledoc """ + ExternalAuthCompleteResponse model. + """ + + defstruct [ + :redirect_uri + ] + + @type t :: %__MODULE__{ + redirect_uri: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + redirect_uri: map["redirect_uri"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "redirect_uri" => struct.redirect_uri + }) + end +end diff --git a/lib/workos/feature_flag.ex b/lib/workos/feature_flag.ex new file mode 100644 index 00000000..d5435dc7 --- /dev/null +++ b/lib/workos/feature_flag.ex @@ -0,0 +1,71 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.FeatureFlag do + @moduledoc """ + FeatureFlag model. + """ + + defstruct [ + :object, + :id, + :slug, + :name, + :description, + :owner, + :tags, + :enabled, + :default_value, + :created_at, + :updated_at + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + slug: String.t(), + name: String.t(), + description: String.t() | nil, + owner: WorkOS.FeatureFlagOwner.t() | nil, + tags: [String.t()], + enabled: boolean(), + default_value: boolean(), + created_at: String.t(), + updated_at: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + slug: map["slug"], + name: map["name"], + description: map["description"], + owner: WorkOS.Cast.nested(map["owner"], &WorkOS.FeatureFlagOwner.from_map/1), + tags: map["tags"], + enabled: map["enabled"], + default_value: map["default_value"], + created_at: map["created_at"], + updated_at: map["updated_at"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "slug" => struct.slug, + "name" => struct.name, + "description" => struct.description, + "owner" => WorkOS.Cast.dump_struct(struct.owner, &WorkOS.FeatureFlagOwner.to_map/1), + "tags" => struct.tags, + "enabled" => struct.enabled, + "default_value" => struct.default_value, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at + }) + end +end diff --git a/lib/workos/feature_flag_owner.ex b/lib/workos/feature_flag_owner.ex new file mode 100644 index 00000000..47341daf --- /dev/null +++ b/lib/workos/feature_flag_owner.ex @@ -0,0 +1,39 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.FeatureFlagOwner do + @moduledoc """ + FeatureFlagOwner model. + """ + + defstruct [ + :email, + :first_name, + :last_name + ] + + @type t :: %__MODULE__{ + email: String.t(), + first_name: String.t() | nil, + last_name: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + email: map["email"], + first_name: map["first_name"], + last_name: map["last_name"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "email" => struct.email, + "first_name" => struct.first_name, + "last_name" => struct.last_name + }) + end +end diff --git a/lib/workos/feature_flags.ex b/lib/workos/feature_flags.ex new file mode 100644 index 00000000..b402c176 --- /dev/null +++ b/lib/workos/feature_flags.ex @@ -0,0 +1,224 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.FeatureFlags do + @moduledoc """ + Operations for the FeatureFlags API. + """ + + @doc """ + List feature flags + + Get a list of all of your existing feature flags matching the criteria specified. + + ## Parameters + + * `params` — query parameters: `:before`, `:after_`, `:limit`, `:order` + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec list_feature_flags(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.Page.t(WorkOS.FlagList.t())} | {:error, WorkOS.Error.error()} + def list_feature_flags(client, params \\ %{}, opts \\ []) do + with {:ok, body} <- WorkOS.Client.request(client, :get, "/feature-flags", params, opts) do + fetch_next = fn cursor -> + list_feature_flags( + client, + WorkOS.Page.next_params(params, "after", cursor), + opts + ) + end + + {:ok, WorkOS.Page.from_map(body, "data", &WorkOS.FlagList.from_map/1, fetch_next)} + end + end + + @doc """ + Get a feature flag + + Get the details of an existing feature flag by its slug. + + ## Parameters + + * `slug` — A unique key to reference the Feature Flag. + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec get_feature_flag(WorkOS.Client.t(), String.t(), keyword()) :: + {:ok, WorkOS.Flag.t()} | {:error, WorkOS.Error.error()} + def get_feature_flag(client, slug, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :get, + "/feature-flags/#{URI.encode(slug, &URI.char_unreserved?/1)}", + %{}, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.Flag.from_map/1)} + end + end + + @doc """ + Disable a feature flag + + Disables a feature flag in the current environment. + + ## Parameters + + * `slug` — A unique key to reference the Feature Flag. + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec disable_feature_flag(WorkOS.Client.t(), String.t(), keyword()) :: + {:ok, WorkOS.FeatureFlag.t()} | {:error, WorkOS.Error.error()} + def disable_feature_flag(client, slug, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :put, + "/feature-flags/#{URI.encode(slug, &URI.char_unreserved?/1)}/disable", + %{}, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.FeatureFlag.from_map/1)} + end + end + + @doc """ + Enable a feature flag + + Enables a feature flag in the current environment. + + ## Parameters + + * `slug` — A unique key to reference the Feature Flag. + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec enable_feature_flag(WorkOS.Client.t(), String.t(), keyword()) :: + {:ok, WorkOS.FeatureFlag.t()} | {:error, WorkOS.Error.error()} + def enable_feature_flag(client, slug, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :put, + "/feature-flags/#{URI.encode(slug, &URI.char_unreserved?/1)}/enable", + %{}, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.FeatureFlag.from_map/1)} + end + end + + @doc """ + Add a feature flag target + + Enables a feature flag for a specific target in the current environment. Currently, supported targets include users and organizations. + + ## Parameters + + * `slug` — The unique slug identifier of the feature flag. + * `resource_id` — The resource ID in format "user_" or "org_". + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec add_flag_target(WorkOS.Client.t(), String.t(), String.t(), keyword()) :: + {:ok, term()} | {:error, WorkOS.Error.error()} + def add_flag_target(client, slug, resource_id, opts \\ []) do + WorkOS.Client.request( + client, + :post, + "/feature-flags/#{URI.encode(slug, &URI.char_unreserved?/1)}/targets/#{URI.encode(resource_id, &URI.char_unreserved?/1)}", + %{}, + opts + ) + end + + @doc """ + Remove a feature flag target + + Removes a target from the feature flag's target list in the current environment. Currently, supported targets include users and organizations. + + ## Parameters + + * `slug` — The unique slug identifier of the feature flag. + * `resource_id` — The resource ID in format "user_" or "org_". + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec remove_flag_target(WorkOS.Client.t(), String.t(), String.t(), keyword()) :: + {:ok, term()} | {:error, WorkOS.Error.error()} + def remove_flag_target(client, slug, resource_id, opts \\ []) do + WorkOS.Client.request( + client, + :delete, + "/feature-flags/#{URI.encode(slug, &URI.char_unreserved?/1)}/targets/#{URI.encode(resource_id, &URI.char_unreserved?/1)}", + %{}, + opts + ) + end + + @doc """ + List enabled feature flags for an organization + + Get a list of all enabled feature flags for an organization. + + ## Parameters + + * `organization_id` — Unique identifier of the Organization. + * `params` — query parameters: `:before`, `:after_`, `:limit`, `:order` + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec list_organization_feature_flags(WorkOS.Client.t(), String.t(), map(), keyword()) :: + {:ok, WorkOS.Page.t(WorkOS.FlagList.t())} | {:error, WorkOS.Error.error()} + def list_organization_feature_flags(client, organization_id, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :get, + "/organizations/#{URI.encode(organization_id, &URI.char_unreserved?/1)}/feature-flags", + params, + opts + ) do + fetch_next = fn cursor -> + list_organization_feature_flags( + client, + organization_id, + WorkOS.Page.next_params(params, "after", cursor), + opts + ) + end + + {:ok, WorkOS.Page.from_map(body, "data", &WorkOS.FlagList.from_map/1, fetch_next)} + end + end + + @doc """ + List enabled feature flags for a user + + Get a list of all enabled feature flags for the provided user. This includes feature flags enabled specifically for the user as well as any organizations that the user is a member of. + + ## Parameters + + * `user_id` — The ID of the user. + * `params` — query parameters: `:before`, `:after_`, `:limit`, `:order` + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec list_user_feature_flags(WorkOS.Client.t(), String.t(), map(), keyword()) :: + {:ok, WorkOS.Page.t(WorkOS.FlagList.t())} | {:error, WorkOS.Error.error()} + def list_user_feature_flags(client, user_id, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :get, + "/user_management/users/#{URI.encode(user_id, &URI.char_unreserved?/1)}/feature-flags", + params, + opts + ) do + fetch_next = fn cursor -> + list_user_feature_flags( + client, + user_id, + WorkOS.Page.next_params(params, "after", cursor), + opts + ) + end + + {:ok, WorkOS.Page.from_map(body, "data", &WorkOS.FlagList.from_map/1, fetch_next)} + end + end +end diff --git a/lib/workos/flag.ex b/lib/workos/flag.ex new file mode 100644 index 00000000..5099973a --- /dev/null +++ b/lib/workos/flag.ex @@ -0,0 +1,71 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.Flag do + @moduledoc """ + Flag model. + """ + + defstruct [ + :object, + :id, + :slug, + :name, + :description, + :owner, + :tags, + :enabled, + :default_value, + :created_at, + :updated_at + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + slug: String.t(), + name: String.t(), + description: String.t() | nil, + owner: WorkOS.FlagOwner.t() | nil, + tags: [String.t()], + enabled: boolean(), + default_value: boolean(), + created_at: String.t(), + updated_at: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + slug: map["slug"], + name: map["name"], + description: map["description"], + owner: WorkOS.Cast.nested(map["owner"], &WorkOS.FlagOwner.from_map/1), + tags: map["tags"], + enabled: map["enabled"], + default_value: map["default_value"], + created_at: map["created_at"], + updated_at: map["updated_at"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "slug" => struct.slug, + "name" => struct.name, + "description" => struct.description, + "owner" => WorkOS.Cast.dump_struct(struct.owner, &WorkOS.FlagOwner.to_map/1), + "tags" => struct.tags, + "enabled" => struct.enabled, + "default_value" => struct.default_value, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at + }) + end +end diff --git a/lib/workos/flag_created.ex b/lib/workos/flag_created.ex new file mode 100644 index 00000000..d1fd4327 --- /dev/null +++ b/lib/workos/flag_created.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.FlagCreated do + @moduledoc """ + FlagCreated model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.FlagCreatedData.t(), + created_at: String.t(), + context: WorkOS.FlagCreatedContext.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.FlagCreatedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.FlagCreatedContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => WorkOS.Cast.dump_struct(struct.data, &WorkOS.FlagCreatedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.FlagCreatedContext.to_map/1) + }) + end +end diff --git a/lib/workos/flag_created_context.ex b/lib/workos/flag_created_context.ex new file mode 100644 index 00000000..1eb435da --- /dev/null +++ b/lib/workos/flag_created_context.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.FlagCreatedContext do + @moduledoc """ + Additional context about the event. + """ + + defstruct [ + :client_id, + :actor + ] + + @type t :: %__MODULE__{ + client_id: String.t(), + actor: WorkOS.FlagCreatedContextActor.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + client_id: map["client_id"], + actor: WorkOS.Cast.nested(map["actor"], &WorkOS.FlagCreatedContextActor.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "client_id" => struct.client_id, + "actor" => WorkOS.Cast.dump_struct(struct.actor, &WorkOS.FlagCreatedContextActor.to_map/1) + }) + end +end diff --git a/lib/workos/flag_created_context_actor.ex b/lib/workos/flag_created_context_actor.ex new file mode 100644 index 00000000..6ed7ce73 --- /dev/null +++ b/lib/workos/flag_created_context_actor.ex @@ -0,0 +1,39 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.FlagCreatedContextActor do + @moduledoc """ + The actor who performed the action. + """ + + defstruct [ + :id, + :source, + :name + ] + + @type t :: %__MODULE__{ + id: String.t(), + source: WorkOS.FlagCreatedContextActorSource.t(), + name: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + id: map["id"], + source: WorkOS.Cast.enum(map["source"], &WorkOS.FlagCreatedContextActorSource.cast/1), + name: map["name"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "id" => struct.id, + "source" => WorkOS.Cast.enum(struct.source, &WorkOS.FlagCreatedContextActorSource.dump/1), + "name" => struct.name + }) + end +end diff --git a/lib/workos/flag_created_context_actor_source.ex b/lib/workos/flag_created_context_actor_source.ex new file mode 100644 index 00000000..ccd5d155 --- /dev/null +++ b/lib/workos/flag_created_context_actor_source.ex @@ -0,0 +1,29 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.FlagCreatedContextActorSource do + @moduledoc """ + FlagCreatedContextActorSource enum. + """ + + @type t :: :api | :dashboard | :admin_portal | :system + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:api, :dashboard, :admin_portal, :system] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("api"), do: :api + def cast("dashboard"), do: :dashboard + def cast("admin_portal"), do: :admin_portal + def cast("system"), do: :system + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:api), do: "api" + def dump(:dashboard), do: "dashboard" + def dump(:admin_portal), do: "admin_portal" + def dump(:system), do: "system" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/flag_created_data.ex b/lib/workos/flag_created_data.ex new file mode 100644 index 00000000..25335032 --- /dev/null +++ b/lib/workos/flag_created_data.ex @@ -0,0 +1,75 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.FlagCreatedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :object, + :id, + :environment_id, + :slug, + :name, + :description, + :owner, + :tags, + :enabled, + :default_value, + :created_at, + :updated_at + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + environment_id: String.t(), + slug: String.t(), + name: String.t(), + description: String.t() | nil, + owner: WorkOS.FlagCreatedDataOwner.t() | nil, + tags: [String.t()], + enabled: boolean(), + default_value: boolean(), + created_at: String.t(), + updated_at: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + environment_id: map["environment_id"], + slug: map["slug"], + name: map["name"], + description: map["description"], + owner: WorkOS.Cast.nested(map["owner"], &WorkOS.FlagCreatedDataOwner.from_map/1), + tags: map["tags"], + enabled: map["enabled"], + default_value: map["default_value"], + created_at: map["created_at"], + updated_at: map["updated_at"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "environment_id" => struct.environment_id, + "slug" => struct.slug, + "name" => struct.name, + "description" => struct.description, + "owner" => WorkOS.Cast.dump_struct(struct.owner, &WorkOS.FlagCreatedDataOwner.to_map/1), + "tags" => struct.tags, + "enabled" => struct.enabled, + "default_value" => struct.default_value, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at + }) + end +end diff --git a/lib/workos/flag_created_data_owner.ex b/lib/workos/flag_created_data_owner.ex new file mode 100644 index 00000000..9ae8a791 --- /dev/null +++ b/lib/workos/flag_created_data_owner.ex @@ -0,0 +1,39 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.FlagCreatedDataOwner do + @moduledoc """ + FlagCreatedDataOwner model. + """ + + defstruct [ + :email, + :first_name, + :last_name + ] + + @type t :: %__MODULE__{ + email: String.t(), + first_name: String.t() | nil, + last_name: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + email: map["email"], + first_name: map["first_name"], + last_name: map["last_name"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "email" => struct.email, + "first_name" => struct.first_name, + "last_name" => struct.last_name + }) + end +end diff --git a/lib/workos/flag_deleted.ex b/lib/workos/flag_deleted.ex new file mode 100644 index 00000000..ae48aa0f --- /dev/null +++ b/lib/workos/flag_deleted.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.FlagDeleted do + @moduledoc """ + FlagDeleted model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.FlagDeletedData.t(), + created_at: String.t(), + context: WorkOS.FlagDeletedContext.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.FlagDeletedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.FlagDeletedContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => WorkOS.Cast.dump_struct(struct.data, &WorkOS.FlagDeletedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.FlagDeletedContext.to_map/1) + }) + end +end diff --git a/lib/workos/flag_deleted_context.ex b/lib/workos/flag_deleted_context.ex new file mode 100644 index 00000000..d6328bc2 --- /dev/null +++ b/lib/workos/flag_deleted_context.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.FlagDeletedContext do + @moduledoc """ + Additional context about the event. + """ + + defstruct [ + :client_id, + :actor + ] + + @type t :: %__MODULE__{ + client_id: String.t(), + actor: WorkOS.FlagDeletedContextActor.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + client_id: map["client_id"], + actor: WorkOS.Cast.nested(map["actor"], &WorkOS.FlagDeletedContextActor.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "client_id" => struct.client_id, + "actor" => WorkOS.Cast.dump_struct(struct.actor, &WorkOS.FlagDeletedContextActor.to_map/1) + }) + end +end diff --git a/lib/workos/flag_deleted_context_actor.ex b/lib/workos/flag_deleted_context_actor.ex new file mode 100644 index 00000000..e926fe83 --- /dev/null +++ b/lib/workos/flag_deleted_context_actor.ex @@ -0,0 +1,39 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.FlagDeletedContextActor do + @moduledoc """ + The actor who performed the action. + """ + + defstruct [ + :id, + :source, + :name + ] + + @type t :: %__MODULE__{ + id: String.t(), + source: WorkOS.FlagDeletedContextActorSource.t(), + name: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + id: map["id"], + source: WorkOS.Cast.enum(map["source"], &WorkOS.FlagDeletedContextActorSource.cast/1), + name: map["name"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "id" => struct.id, + "source" => WorkOS.Cast.enum(struct.source, &WorkOS.FlagDeletedContextActorSource.dump/1), + "name" => struct.name + }) + end +end diff --git a/lib/workos/flag_deleted_context_actor_source.ex b/lib/workos/flag_deleted_context_actor_source.ex new file mode 100644 index 00000000..e67b33cd --- /dev/null +++ b/lib/workos/flag_deleted_context_actor_source.ex @@ -0,0 +1,29 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.FlagDeletedContextActorSource do + @moduledoc """ + FlagDeletedContextActorSource enum. + """ + + @type t :: :api | :dashboard | :admin_portal | :system + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:api, :dashboard, :admin_portal, :system] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("api"), do: :api + def cast("dashboard"), do: :dashboard + def cast("admin_portal"), do: :admin_portal + def cast("system"), do: :system + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:api), do: "api" + def dump(:dashboard), do: "dashboard" + def dump(:admin_portal), do: "admin_portal" + def dump(:system), do: "system" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/flag_deleted_data.ex b/lib/workos/flag_deleted_data.ex new file mode 100644 index 00000000..72bf4bc0 --- /dev/null +++ b/lib/workos/flag_deleted_data.ex @@ -0,0 +1,75 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.FlagDeletedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :object, + :id, + :environment_id, + :slug, + :name, + :description, + :owner, + :tags, + :enabled, + :default_value, + :created_at, + :updated_at + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + environment_id: String.t(), + slug: String.t(), + name: String.t(), + description: String.t() | nil, + owner: WorkOS.FlagDeletedDataOwner.t() | nil, + tags: [String.t()], + enabled: boolean(), + default_value: boolean(), + created_at: String.t(), + updated_at: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + environment_id: map["environment_id"], + slug: map["slug"], + name: map["name"], + description: map["description"], + owner: WorkOS.Cast.nested(map["owner"], &WorkOS.FlagDeletedDataOwner.from_map/1), + tags: map["tags"], + enabled: map["enabled"], + default_value: map["default_value"], + created_at: map["created_at"], + updated_at: map["updated_at"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "environment_id" => struct.environment_id, + "slug" => struct.slug, + "name" => struct.name, + "description" => struct.description, + "owner" => WorkOS.Cast.dump_struct(struct.owner, &WorkOS.FlagDeletedDataOwner.to_map/1), + "tags" => struct.tags, + "enabled" => struct.enabled, + "default_value" => struct.default_value, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at + }) + end +end diff --git a/lib/workos/flag_deleted_data_owner.ex b/lib/workos/flag_deleted_data_owner.ex new file mode 100644 index 00000000..050bad3f --- /dev/null +++ b/lib/workos/flag_deleted_data_owner.ex @@ -0,0 +1,39 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.FlagDeletedDataOwner do + @moduledoc """ + FlagDeletedDataOwner model. + """ + + defstruct [ + :email, + :first_name, + :last_name + ] + + @type t :: %__MODULE__{ + email: String.t(), + first_name: String.t() | nil, + last_name: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + email: map["email"], + first_name: map["first_name"], + last_name: map["last_name"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "email" => struct.email, + "first_name" => struct.first_name, + "last_name" => struct.last_name + }) + end +end diff --git a/lib/workos/flag_list.ex b/lib/workos/flag_list.ex new file mode 100644 index 00000000..8081d7fd --- /dev/null +++ b/lib/workos/flag_list.ex @@ -0,0 +1,44 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.FlagList do + @moduledoc """ + FlagList model. + """ + + defstruct [ + :object, + :data, + :list_metadata + ] + + @type t :: %__MODULE__{ + object: String.t(), + data: [WorkOS.Flag.t()], + list_metadata: WorkOS.FlagListListMetadata.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + data: WorkOS.Cast.list(map["data"], &WorkOS.Flag.from_map/1), + list_metadata: + WorkOS.Cast.nested(map["list_metadata"], &WorkOS.FlagListListMetadata.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "data" => + WorkOS.Cast.list(struct.data, fn item -> + WorkOS.Cast.dump_struct(item, &WorkOS.Flag.to_map/1) + end), + "list_metadata" => + WorkOS.Cast.dump_struct(struct.list_metadata, &WorkOS.FlagListListMetadata.to_map/1) + }) + end +end diff --git a/lib/workos/flag_list_list_metadata.ex b/lib/workos/flag_list_list_metadata.ex new file mode 100644 index 00000000..8ef9e3c3 --- /dev/null +++ b/lib/workos/flag_list_list_metadata.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.FlagListListMetadata do + @moduledoc """ + Pagination cursors for navigating between pages of results. + """ + + defstruct [ + :before, + :after_ + ] + + @type t :: %__MODULE__{ + before: String.t() | nil, + after_: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + before: map["before"], + after_: map["after"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "before" => struct.before, + "after" => struct.after_ + }) + end +end diff --git a/lib/workos/flag_owner.ex b/lib/workos/flag_owner.ex new file mode 100644 index 00000000..7762249e --- /dev/null +++ b/lib/workos/flag_owner.ex @@ -0,0 +1,39 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.FlagOwner do + @moduledoc """ + FlagOwner model. + """ + + defstruct [ + :email, + :first_name, + :last_name + ] + + @type t :: %__MODULE__{ + email: String.t(), + first_name: String.t() | nil, + last_name: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + email: map["email"], + first_name: map["first_name"], + last_name: map["last_name"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "email" => struct.email, + "first_name" => struct.first_name, + "last_name" => struct.last_name + }) + end +end diff --git a/lib/workos/flag_rule_updated.ex b/lib/workos/flag_rule_updated.ex new file mode 100644 index 00000000..b2aefbbd --- /dev/null +++ b/lib/workos/flag_rule_updated.ex @@ -0,0 +1,52 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.FlagRuleUpdated do + @moduledoc """ + FlagRuleUpdated model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.FlagRuleUpdatedData.t(), + created_at: String.t(), + context: WorkOS.FlagRuleUpdatedContext.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.FlagRuleUpdatedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.FlagRuleUpdatedContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => WorkOS.Cast.dump_struct(struct.data, &WorkOS.FlagRuleUpdatedData.to_map/1), + "created_at" => struct.created_at, + "context" => + WorkOS.Cast.dump_struct(struct.context, &WorkOS.FlagRuleUpdatedContext.to_map/1) + }) + end +end diff --git a/lib/workos/flag_rule_updated_context.ex b/lib/workos/flag_rule_updated_context.ex new file mode 100644 index 00000000..99fdc4d2 --- /dev/null +++ b/lib/workos/flag_rule_updated_context.ex @@ -0,0 +1,66 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.FlagRuleUpdatedContext do + @moduledoc """ + Additional context about the event. + """ + + defstruct [ + :client_id, + :actor, + :access_type, + :configured_targets, + :previous_attributes + ] + + @type t :: %__MODULE__{ + client_id: String.t(), + actor: WorkOS.FlagRuleUpdatedContextActor.t(), + access_type: WorkOS.FlagRuleUpdatedContextAccessType.t(), + configured_targets: WorkOS.FlagRuleUpdatedContextConfiguredTarget.t(), + previous_attributes: WorkOS.FlagRuleUpdatedContextPreviousAttribute.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + client_id: map["client_id"], + actor: WorkOS.Cast.nested(map["actor"], &WorkOS.FlagRuleUpdatedContextActor.from_map/1), + access_type: + WorkOS.Cast.enum(map["access_type"], &WorkOS.FlagRuleUpdatedContextAccessType.cast/1), + configured_targets: + WorkOS.Cast.nested( + map["configured_targets"], + &WorkOS.FlagRuleUpdatedContextConfiguredTarget.from_map/1 + ), + previous_attributes: + WorkOS.Cast.nested( + map["previous_attributes"], + &WorkOS.FlagRuleUpdatedContextPreviousAttribute.from_map/1 + ) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "client_id" => struct.client_id, + "actor" => + WorkOS.Cast.dump_struct(struct.actor, &WorkOS.FlagRuleUpdatedContextActor.to_map/1), + "access_type" => + WorkOS.Cast.enum(struct.access_type, &WorkOS.FlagRuleUpdatedContextAccessType.dump/1), + "configured_targets" => + WorkOS.Cast.dump_struct( + struct.configured_targets, + &WorkOS.FlagRuleUpdatedContextConfiguredTarget.to_map/1 + ), + "previous_attributes" => + WorkOS.Cast.dump_struct( + struct.previous_attributes, + &WorkOS.FlagRuleUpdatedContextPreviousAttribute.to_map/1 + ) + }) + end +end diff --git a/lib/workos/flag_rule_updated_context_access_type.ex b/lib/workos/flag_rule_updated_context_access_type.ex new file mode 100644 index 00000000..9be4bb31 --- /dev/null +++ b/lib/workos/flag_rule_updated_context_access_type.ex @@ -0,0 +1,27 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.FlagRuleUpdatedContextAccessType do + @moduledoc """ + FlagRuleUpdatedContextAccessType enum. + """ + + @type t :: :none | :some | :all + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:none, :some, :all] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("none"), do: :none + def cast("some"), do: :some + def cast("all"), do: :all + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:none), do: "none" + def dump(:some), do: "some" + def dump(:all), do: "all" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/flag_rule_updated_context_actor.ex b/lib/workos/flag_rule_updated_context_actor.ex new file mode 100644 index 00000000..71c03980 --- /dev/null +++ b/lib/workos/flag_rule_updated_context_actor.ex @@ -0,0 +1,40 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.FlagRuleUpdatedContextActor do + @moduledoc """ + The actor who performed the action. + """ + + defstruct [ + :id, + :source, + :name + ] + + @type t :: %__MODULE__{ + id: String.t(), + source: WorkOS.FlagRuleUpdatedContextActorSource.t(), + name: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + id: map["id"], + source: WorkOS.Cast.enum(map["source"], &WorkOS.FlagRuleUpdatedContextActorSource.cast/1), + name: map["name"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "id" => struct.id, + "source" => + WorkOS.Cast.enum(struct.source, &WorkOS.FlagRuleUpdatedContextActorSource.dump/1), + "name" => struct.name + }) + end +end diff --git a/lib/workos/flag_rule_updated_context_actor_source.ex b/lib/workos/flag_rule_updated_context_actor_source.ex new file mode 100644 index 00000000..f5e43aec --- /dev/null +++ b/lib/workos/flag_rule_updated_context_actor_source.ex @@ -0,0 +1,29 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.FlagRuleUpdatedContextActorSource do + @moduledoc """ + FlagRuleUpdatedContextActorSource enum. + """ + + @type t :: :api | :dashboard | :admin_portal | :system + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:api, :dashboard, :admin_portal, :system] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("api"), do: :api + def cast("dashboard"), do: :dashboard + def cast("admin_portal"), do: :admin_portal + def cast("system"), do: :system + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:api), do: "api" + def dump(:dashboard), do: "dashboard" + def dump(:admin_portal), do: "admin_portal" + def dump(:system), do: "system" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/flag_rule_updated_context_configured_target.ex b/lib/workos/flag_rule_updated_context_configured_target.ex new file mode 100644 index 00000000..3f5d915e --- /dev/null +++ b/lib/workos/flag_rule_updated_context_configured_target.ex @@ -0,0 +1,55 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.FlagRuleUpdatedContextConfiguredTarget do + @moduledoc """ + The configured targets for the flag rule. + """ + + defstruct [ + :organizations, + :users + ] + + @type t :: %__MODULE__{ + organizations: [WorkOS.FlagRuleUpdatedContextConfiguredTargetOrganization.t()], + users: [WorkOS.FlagRuleUpdatedContextConfiguredTargetUser.t()] + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + organizations: + WorkOS.Cast.list( + map["organizations"], + &WorkOS.FlagRuleUpdatedContextConfiguredTargetOrganization.from_map/1 + ), + users: + WorkOS.Cast.list( + map["users"], + &WorkOS.FlagRuleUpdatedContextConfiguredTargetUser.from_map/1 + ) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "organizations" => + WorkOS.Cast.list(struct.organizations, fn item -> + WorkOS.Cast.dump_struct( + item, + &WorkOS.FlagRuleUpdatedContextConfiguredTargetOrganization.to_map/1 + ) + end), + "users" => + WorkOS.Cast.list(struct.users, fn item -> + WorkOS.Cast.dump_struct( + item, + &WorkOS.FlagRuleUpdatedContextConfiguredTargetUser.to_map/1 + ) + end) + }) + end +end diff --git a/lib/workos/flag_rule_updated_context_configured_target_organization.ex b/lib/workos/flag_rule_updated_context_configured_target_organization.ex new file mode 100644 index 00000000..202edf07 --- /dev/null +++ b/lib/workos/flag_rule_updated_context_configured_target_organization.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.FlagRuleUpdatedContextConfiguredTargetOrganization do + @moduledoc """ + FlagRuleUpdatedContextConfiguredTargetOrganization model. + """ + + defstruct [ + :id, + :name + ] + + @type t :: %__MODULE__{ + id: String.t(), + name: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + id: map["id"], + name: map["name"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "id" => struct.id, + "name" => struct.name + }) + end +end diff --git a/lib/workos/flag_rule_updated_context_configured_target_user.ex b/lib/workos/flag_rule_updated_context_configured_target_user.ex new file mode 100644 index 00000000..5f417ff6 --- /dev/null +++ b/lib/workos/flag_rule_updated_context_configured_target_user.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.FlagRuleUpdatedContextConfiguredTargetUser do + @moduledoc """ + FlagRuleUpdatedContextConfiguredTargetUser model. + """ + + defstruct [ + :id, + :email + ] + + @type t :: %__MODULE__{ + id: String.t(), + email: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + id: map["id"], + email: map["email"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "id" => struct.id, + "email" => struct.email + }) + end +end diff --git a/lib/workos/flag_rule_updated_context_previous_attribute.ex b/lib/workos/flag_rule_updated_context_previous_attribute.ex new file mode 100644 index 00000000..1793926f --- /dev/null +++ b/lib/workos/flag_rule_updated_context_previous_attribute.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.FlagRuleUpdatedContextPreviousAttribute do + @moduledoc """ + Attributes that changed from their previous values. + """ + + defstruct [ + :data, + :context + ] + + @type t :: %__MODULE__{ + data: WorkOS.FlagRuleUpdatedContextPreviousAttributeData.t() | nil, + context: WorkOS.FlagRuleUpdatedContextPreviousAttributeContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + data: + WorkOS.Cast.nested( + map["data"], + &WorkOS.FlagRuleUpdatedContextPreviousAttributeData.from_map/1 + ), + context: + WorkOS.Cast.nested( + map["context"], + &WorkOS.FlagRuleUpdatedContextPreviousAttributeContext.from_map/1 + ) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "data" => + WorkOS.Cast.dump_struct( + struct.data, + &WorkOS.FlagRuleUpdatedContextPreviousAttributeData.to_map/1 + ), + "context" => + WorkOS.Cast.dump_struct( + struct.context, + &WorkOS.FlagRuleUpdatedContextPreviousAttributeContext.to_map/1 + ) + }) + end +end diff --git a/lib/workos/flag_rule_updated_context_previous_attribute_context.ex b/lib/workos/flag_rule_updated_context_previous_attribute_context.ex new file mode 100644 index 00000000..7b69636a --- /dev/null +++ b/lib/workos/flag_rule_updated_context_previous_attribute_context.ex @@ -0,0 +1,52 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.FlagRuleUpdatedContextPreviousAttributeContext do + @moduledoc """ + The previous context attributes of the flag rule. + """ + + defstruct [ + :access_type, + :configured_targets + ] + + @type t :: %__MODULE__{ + access_type: WorkOS.FlagRuleUpdatedContextPreviousAttributeContextAccessType.t() | nil, + configured_targets: + WorkOS.FlagRuleUpdatedContextPreviousAttributeContextConfiguredTarget.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + access_type: + WorkOS.Cast.enum( + map["access_type"], + &WorkOS.FlagRuleUpdatedContextPreviousAttributeContextAccessType.cast/1 + ), + configured_targets: + WorkOS.Cast.nested( + map["configured_targets"], + &WorkOS.FlagRuleUpdatedContextPreviousAttributeContextConfiguredTarget.from_map/1 + ) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "access_type" => + WorkOS.Cast.enum( + struct.access_type, + &WorkOS.FlagRuleUpdatedContextPreviousAttributeContextAccessType.dump/1 + ), + "configured_targets" => + WorkOS.Cast.dump_struct( + struct.configured_targets, + &WorkOS.FlagRuleUpdatedContextPreviousAttributeContextConfiguredTarget.to_map/1 + ) + }) + end +end diff --git a/lib/workos/flag_rule_updated_context_previous_attribute_context_access_type.ex b/lib/workos/flag_rule_updated_context_previous_attribute_context_access_type.ex new file mode 100644 index 00000000..d3c008ed --- /dev/null +++ b/lib/workos/flag_rule_updated_context_previous_attribute_context_access_type.ex @@ -0,0 +1,27 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.FlagRuleUpdatedContextPreviousAttributeContextAccessType do + @moduledoc """ + FlagRuleUpdatedContextPreviousAttributeContextAccessType enum. + """ + + @type t :: :none | :some | :all + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:none, :some, :all] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("none"), do: :none + def cast("some"), do: :some + def cast("all"), do: :all + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:none), do: "none" + def dump(:some), do: "some" + def dump(:all), do: "all" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/flag_rule_updated_context_previous_attribute_context_configured_target.ex b/lib/workos/flag_rule_updated_context_previous_attribute_context_configured_target.ex new file mode 100644 index 00000000..fc0bbd9e --- /dev/null +++ b/lib/workos/flag_rule_updated_context_previous_attribute_context_configured_target.ex @@ -0,0 +1,57 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.FlagRuleUpdatedContextPreviousAttributeContextConfiguredTarget do + @moduledoc """ + The previous configured targets for the flag rule. + """ + + defstruct [ + :organizations, + :users + ] + + @type t :: %__MODULE__{ + organizations: [ + WorkOS.FlagRuleUpdatedContextPreviousAttributeContextConfiguredTargetOrganization.t() + ], + users: [WorkOS.FlagRuleUpdatedContextPreviousAttributeContextConfiguredTargetUser.t()] + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + organizations: + WorkOS.Cast.list( + map["organizations"], + &WorkOS.FlagRuleUpdatedContextPreviousAttributeContextConfiguredTargetOrganization.from_map/1 + ), + users: + WorkOS.Cast.list( + map["users"], + &WorkOS.FlagRuleUpdatedContextPreviousAttributeContextConfiguredTargetUser.from_map/1 + ) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "organizations" => + WorkOS.Cast.list(struct.organizations, fn item -> + WorkOS.Cast.dump_struct( + item, + &WorkOS.FlagRuleUpdatedContextPreviousAttributeContextConfiguredTargetOrganization.to_map/1 + ) + end), + "users" => + WorkOS.Cast.list(struct.users, fn item -> + WorkOS.Cast.dump_struct( + item, + &WorkOS.FlagRuleUpdatedContextPreviousAttributeContextConfiguredTargetUser.to_map/1 + ) + end) + }) + end +end diff --git a/lib/workos/flag_rule_updated_context_previous_attribute_context_configured_target_organization.ex b/lib/workos/flag_rule_updated_context_previous_attribute_context_configured_target_organization.ex new file mode 100644 index 00000000..5da5d5e8 --- /dev/null +++ b/lib/workos/flag_rule_updated_context_previous_attribute_context_configured_target_organization.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.FlagRuleUpdatedContextPreviousAttributeContextConfiguredTargetOrganization do + @moduledoc """ + FlagRuleUpdatedContextPreviousAttributeContextConfiguredTargetOrganization model. + """ + + defstruct [ + :id, + :name + ] + + @type t :: %__MODULE__{ + id: String.t(), + name: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + id: map["id"], + name: map["name"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "id" => struct.id, + "name" => struct.name + }) + end +end diff --git a/lib/workos/flag_rule_updated_context_previous_attribute_context_configured_target_user.ex b/lib/workos/flag_rule_updated_context_previous_attribute_context_configured_target_user.ex new file mode 100644 index 00000000..8ccb126e --- /dev/null +++ b/lib/workos/flag_rule_updated_context_previous_attribute_context_configured_target_user.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.FlagRuleUpdatedContextPreviousAttributeContextConfiguredTargetUser do + @moduledoc """ + FlagRuleUpdatedContextPreviousAttributeContextConfiguredTargetUser model. + """ + + defstruct [ + :id, + :email + ] + + @type t :: %__MODULE__{ + id: String.t(), + email: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + id: map["id"], + email: map["email"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "id" => struct.id, + "email" => struct.email + }) + end +end diff --git a/lib/workos/flag_rule_updated_context_previous_attribute_data.ex b/lib/workos/flag_rule_updated_context_previous_attribute_data.ex new file mode 100644 index 00000000..1cd45c3e --- /dev/null +++ b/lib/workos/flag_rule_updated_context_previous_attribute_data.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.FlagRuleUpdatedContextPreviousAttributeData do + @moduledoc """ + The previous data attributes of the flag. + """ + + defstruct [ + :enabled, + :default_value + ] + + @type t :: %__MODULE__{ + enabled: boolean() | nil, + default_value: boolean() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + enabled: map["enabled"], + default_value: map["default_value"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "enabled" => struct.enabled, + "default_value" => struct.default_value + }) + end +end diff --git a/lib/workos/flag_rule_updated_data.ex b/lib/workos/flag_rule_updated_data.ex new file mode 100644 index 00000000..5cb686ee --- /dev/null +++ b/lib/workos/flag_rule_updated_data.ex @@ -0,0 +1,75 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.FlagRuleUpdatedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :object, + :id, + :environment_id, + :slug, + :name, + :description, + :owner, + :tags, + :enabled, + :default_value, + :created_at, + :updated_at + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + environment_id: String.t(), + slug: String.t(), + name: String.t(), + description: String.t() | nil, + owner: WorkOS.FlagRuleUpdatedDataOwner.t() | nil, + tags: [String.t()], + enabled: boolean(), + default_value: boolean(), + created_at: String.t(), + updated_at: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + environment_id: map["environment_id"], + slug: map["slug"], + name: map["name"], + description: map["description"], + owner: WorkOS.Cast.nested(map["owner"], &WorkOS.FlagRuleUpdatedDataOwner.from_map/1), + tags: map["tags"], + enabled: map["enabled"], + default_value: map["default_value"], + created_at: map["created_at"], + updated_at: map["updated_at"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "environment_id" => struct.environment_id, + "slug" => struct.slug, + "name" => struct.name, + "description" => struct.description, + "owner" => WorkOS.Cast.dump_struct(struct.owner, &WorkOS.FlagRuleUpdatedDataOwner.to_map/1), + "tags" => struct.tags, + "enabled" => struct.enabled, + "default_value" => struct.default_value, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at + }) + end +end diff --git a/lib/workos/flag_rule_updated_data_owner.ex b/lib/workos/flag_rule_updated_data_owner.ex new file mode 100644 index 00000000..c0266dea --- /dev/null +++ b/lib/workos/flag_rule_updated_data_owner.ex @@ -0,0 +1,39 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.FlagRuleUpdatedDataOwner do + @moduledoc """ + FlagRuleUpdatedDataOwner model. + """ + + defstruct [ + :email, + :first_name, + :last_name + ] + + @type t :: %__MODULE__{ + email: String.t(), + first_name: String.t() | nil, + last_name: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + email: map["email"], + first_name: map["first_name"], + last_name: map["last_name"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "email" => struct.email, + "first_name" => struct.first_name, + "last_name" => struct.last_name + }) + end +end diff --git a/lib/workos/flag_updated.ex b/lib/workos/flag_updated.ex new file mode 100644 index 00000000..4044c8b6 --- /dev/null +++ b/lib/workos/flag_updated.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.FlagUpdated do + @moduledoc """ + FlagUpdated model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.FlagUpdatedData.t(), + created_at: String.t(), + context: WorkOS.FlagUpdatedContext.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.FlagUpdatedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.FlagUpdatedContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => WorkOS.Cast.dump_struct(struct.data, &WorkOS.FlagUpdatedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.FlagUpdatedContext.to_map/1) + }) + end +end diff --git a/lib/workos/flag_updated_context.ex b/lib/workos/flag_updated_context.ex new file mode 100644 index 00000000..efdcbc67 --- /dev/null +++ b/lib/workos/flag_updated_context.ex @@ -0,0 +1,47 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.FlagUpdatedContext do + @moduledoc """ + Additional context about the event. + """ + + defstruct [ + :client_id, + :actor, + :previous_attributes + ] + + @type t :: %__MODULE__{ + client_id: String.t(), + actor: WorkOS.FlagUpdatedContextActor.t(), + previous_attributes: WorkOS.FlagUpdatedContextPreviousAttribute.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + client_id: map["client_id"], + actor: WorkOS.Cast.nested(map["actor"], &WorkOS.FlagUpdatedContextActor.from_map/1), + previous_attributes: + WorkOS.Cast.nested( + map["previous_attributes"], + &WorkOS.FlagUpdatedContextPreviousAttribute.from_map/1 + ) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "client_id" => struct.client_id, + "actor" => WorkOS.Cast.dump_struct(struct.actor, &WorkOS.FlagUpdatedContextActor.to_map/1), + "previous_attributes" => + WorkOS.Cast.dump_struct( + struct.previous_attributes, + &WorkOS.FlagUpdatedContextPreviousAttribute.to_map/1 + ) + }) + end +end diff --git a/lib/workos/flag_updated_context_actor.ex b/lib/workos/flag_updated_context_actor.ex new file mode 100644 index 00000000..5dbe762a --- /dev/null +++ b/lib/workos/flag_updated_context_actor.ex @@ -0,0 +1,39 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.FlagUpdatedContextActor do + @moduledoc """ + The actor who performed the action. + """ + + defstruct [ + :id, + :source, + :name + ] + + @type t :: %__MODULE__{ + id: String.t(), + source: WorkOS.FlagUpdatedContextActorSource.t(), + name: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + id: map["id"], + source: WorkOS.Cast.enum(map["source"], &WorkOS.FlagUpdatedContextActorSource.cast/1), + name: map["name"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "id" => struct.id, + "source" => WorkOS.Cast.enum(struct.source, &WorkOS.FlagUpdatedContextActorSource.dump/1), + "name" => struct.name + }) + end +end diff --git a/lib/workos/flag_updated_context_actor_source.ex b/lib/workos/flag_updated_context_actor_source.ex new file mode 100644 index 00000000..d8d31fdd --- /dev/null +++ b/lib/workos/flag_updated_context_actor_source.ex @@ -0,0 +1,29 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.FlagUpdatedContextActorSource do + @moduledoc """ + FlagUpdatedContextActorSource enum. + """ + + @type t :: :api | :dashboard | :admin_portal | :system + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:api, :dashboard, :admin_portal, :system] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("api"), do: :api + def cast("dashboard"), do: :dashboard + def cast("admin_portal"), do: :admin_portal + def cast("system"), do: :system + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:api), do: "api" + def dump(:dashboard), do: "dashboard" + def dump(:admin_portal), do: "admin_portal" + def dump(:system), do: "system" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/flag_updated_context_previous_attribute.ex b/lib/workos/flag_updated_context_previous_attribute.ex new file mode 100644 index 00000000..f54ee2a0 --- /dev/null +++ b/lib/workos/flag_updated_context_previous_attribute.ex @@ -0,0 +1,39 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.FlagUpdatedContextPreviousAttribute do + @moduledoc """ + Attributes that changed from their previous values. + """ + + defstruct [ + :data + ] + + @type t :: %__MODULE__{ + data: WorkOS.FlagUpdatedContextPreviousAttributeData.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + data: + WorkOS.Cast.nested( + map["data"], + &WorkOS.FlagUpdatedContextPreviousAttributeData.from_map/1 + ) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "data" => + WorkOS.Cast.dump_struct( + struct.data, + &WorkOS.FlagUpdatedContextPreviousAttributeData.to_map/1 + ) + }) + end +end diff --git a/lib/workos/flag_updated_context_previous_attribute_data.ex b/lib/workos/flag_updated_context_previous_attribute_data.ex new file mode 100644 index 00000000..0a38520c --- /dev/null +++ b/lib/workos/flag_updated_context_previous_attribute_data.ex @@ -0,0 +1,47 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.FlagUpdatedContextPreviousAttributeData do + @moduledoc """ + The previous data attributes of the flag. + """ + + defstruct [ + :name, + :description, + :tags, + :enabled, + :default_value + ] + + @type t :: %__MODULE__{ + name: String.t() | nil, + description: String.t() | nil, + tags: [String.t()] | nil, + enabled: boolean() | nil, + default_value: boolean() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + name: map["name"], + description: map["description"], + tags: map["tags"], + enabled: map["enabled"], + default_value: map["default_value"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "name" => struct.name, + "description" => struct.description, + "tags" => struct.tags, + "enabled" => struct.enabled, + "default_value" => struct.default_value + }) + end +end diff --git a/lib/workos/flag_updated_data.ex b/lib/workos/flag_updated_data.ex new file mode 100644 index 00000000..c53acb48 --- /dev/null +++ b/lib/workos/flag_updated_data.ex @@ -0,0 +1,75 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.FlagUpdatedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :object, + :id, + :environment_id, + :slug, + :name, + :description, + :owner, + :tags, + :enabled, + :default_value, + :created_at, + :updated_at + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + environment_id: String.t(), + slug: String.t(), + name: String.t(), + description: String.t() | nil, + owner: WorkOS.FlagUpdatedDataOwner.t() | nil, + tags: [String.t()], + enabled: boolean(), + default_value: boolean(), + created_at: String.t(), + updated_at: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + environment_id: map["environment_id"], + slug: map["slug"], + name: map["name"], + description: map["description"], + owner: WorkOS.Cast.nested(map["owner"], &WorkOS.FlagUpdatedDataOwner.from_map/1), + tags: map["tags"], + enabled: map["enabled"], + default_value: map["default_value"], + created_at: map["created_at"], + updated_at: map["updated_at"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "environment_id" => struct.environment_id, + "slug" => struct.slug, + "name" => struct.name, + "description" => struct.description, + "owner" => WorkOS.Cast.dump_struct(struct.owner, &WorkOS.FlagUpdatedDataOwner.to_map/1), + "tags" => struct.tags, + "enabled" => struct.enabled, + "default_value" => struct.default_value, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at + }) + end +end diff --git a/lib/workos/flag_updated_data_owner.ex b/lib/workos/flag_updated_data_owner.ex new file mode 100644 index 00000000..24a62896 --- /dev/null +++ b/lib/workos/flag_updated_data_owner.ex @@ -0,0 +1,39 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.FlagUpdatedDataOwner do + @moduledoc """ + FlagUpdatedDataOwner model. + """ + + defstruct [ + :email, + :first_name, + :last_name + ] + + @type t :: %__MODULE__{ + email: String.t(), + first_name: String.t() | nil, + last_name: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + email: map["email"], + first_name: map["first_name"], + last_name: map["last_name"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "email" => struct.email, + "first_name" => struct.first_name, + "last_name" => struct.last_name + }) + end +end diff --git a/lib/workos/generate_link.ex b/lib/workos/generate_link.ex new file mode 100644 index 00000000..8dcdc2fe --- /dev/null +++ b/lib/workos/generate_link.ex @@ -0,0 +1,47 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.GenerateLink do + @moduledoc """ + GenerateLink model. + """ + + defstruct [ + :organization, + :return_url, + :success_url, + :intent, + :it_contact_emails + ] + + @type t :: %__MODULE__{ + organization: String.t(), + return_url: String.t() | nil, + success_url: String.t() | nil, + intent: WorkOS.GenerateLinkIntent.t() | nil, + it_contact_emails: [String.t()] | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + organization: map["organization"], + return_url: map["return_url"], + success_url: map["success_url"], + intent: WorkOS.Cast.enum(map["intent"], &WorkOS.GenerateLinkIntent.cast/1), + it_contact_emails: map["it_contact_emails"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "organization" => struct.organization, + "return_url" => struct.return_url, + "success_url" => struct.success_url, + "intent" => WorkOS.Cast.enum(struct.intent, &WorkOS.GenerateLinkIntent.dump/1), + "it_contact_emails" => struct.it_contact_emails + }) + end +end diff --git a/lib/workos/generate_link_intent.ex b/lib/workos/generate_link_intent.ex new file mode 100644 index 00000000..c6f360bf --- /dev/null +++ b/lib/workos/generate_link_intent.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.GenerateLinkIntent do + @moduledoc """ + GenerateLinkIntent enum. + """ + + @type t :: + :sso + | :dsync + | :audit_logs + | :log_streams + | :domain_verification + | :certificate_renewal + | :bring_your_own_key + + @doc "All known values." + @spec values() :: [t()] + def values, + do: [ + :sso, + :dsync, + :audit_logs, + :log_streams, + :domain_verification, + :certificate_renewal, + :bring_your_own_key + ] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("sso"), do: :sso + def cast("dsync"), do: :dsync + def cast("audit_logs"), do: :audit_logs + def cast("log_streams"), do: :log_streams + def cast("domain_verification"), do: :domain_verification + def cast("certificate_renewal"), do: :certificate_renewal + def cast("bring_your_own_key"), do: :bring_your_own_key + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:sso), do: "sso" + def dump(:dsync), do: "dsync" + def dump(:audit_logs), do: "audit_logs" + def dump(:log_streams), do: "log_streams" + def dump(:domain_verification), do: "domain_verification" + def dump(:certificate_renewal), do: "certificate_renewal" + def dump(:bring_your_own_key), do: "bring_your_own_key" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/group.ex b/lib/workos/group.ex new file mode 100644 index 00000000..7d0f4150 --- /dev/null +++ b/lib/workos/group.ex @@ -0,0 +1,55 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.Group do + @moduledoc """ + Group model. + """ + + defstruct [ + :object, + :id, + :organization_id, + :name, + :description, + :created_at, + :updated_at + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + organization_id: String.t(), + name: String.t(), + description: String.t() | nil, + created_at: String.t(), + updated_at: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + organization_id: map["organization_id"], + name: map["name"], + description: map["description"], + created_at: map["created_at"], + updated_at: map["updated_at"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "organization_id" => struct.organization_id, + "name" => struct.name, + "description" => struct.description, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at + }) + end +end diff --git a/lib/workos/group_created.ex b/lib/workos/group_created.ex new file mode 100644 index 00000000..2305b176 --- /dev/null +++ b/lib/workos/group_created.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.GroupCreated do + @moduledoc """ + GroupCreated model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.Group.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.Group.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => WorkOS.Cast.dump_struct(struct.data, &WorkOS.Group.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/group_deleted.ex b/lib/workos/group_deleted.ex new file mode 100644 index 00000000..915fc950 --- /dev/null +++ b/lib/workos/group_deleted.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.GroupDeleted do + @moduledoc """ + GroupDeleted model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.Group.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.Group.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => WorkOS.Cast.dump_struct(struct.data, &WorkOS.Group.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/group_list.ex b/lib/workos/group_list.ex new file mode 100644 index 00000000..d65c3af7 --- /dev/null +++ b/lib/workos/group_list.ex @@ -0,0 +1,44 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.GroupList do + @moduledoc """ + GroupList model. + """ + + defstruct [ + :object, + :data, + :list_metadata + ] + + @type t :: %__MODULE__{ + object: String.t(), + data: [WorkOS.Group.t()], + list_metadata: WorkOS.GroupListListMetadata.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + data: WorkOS.Cast.list(map["data"], &WorkOS.Group.from_map/1), + list_metadata: + WorkOS.Cast.nested(map["list_metadata"], &WorkOS.GroupListListMetadata.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "data" => + WorkOS.Cast.list(struct.data, fn item -> + WorkOS.Cast.dump_struct(item, &WorkOS.Group.to_map/1) + end), + "list_metadata" => + WorkOS.Cast.dump_struct(struct.list_metadata, &WorkOS.GroupListListMetadata.to_map/1) + }) + end +end diff --git a/lib/workos/group_list_list_metadata.ex b/lib/workos/group_list_list_metadata.ex new file mode 100644 index 00000000..011a5b32 --- /dev/null +++ b/lib/workos/group_list_list_metadata.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.GroupListListMetadata do + @moduledoc """ + Pagination cursors for navigating between pages of results. + """ + + defstruct [ + :before, + :after_ + ] + + @type t :: %__MODULE__{ + before: String.t() | nil, + after_: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + before: map["before"], + after_: map["after"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "before" => struct.before, + "after" => struct.after_ + }) + end +end diff --git a/lib/workos/group_member_added.ex b/lib/workos/group_member_added.ex new file mode 100644 index 00000000..cfbd9aef --- /dev/null +++ b/lib/workos/group_member_added.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.GroupMemberAdded do + @moduledoc """ + GroupMemberAdded model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.GroupMemberAddedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.GroupMemberAddedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => WorkOS.Cast.dump_struct(struct.data, &WorkOS.GroupMemberAddedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/group_member_added_data.ex b/lib/workos/group_member_added_data.ex new file mode 100644 index 00000000..dd3817c8 --- /dev/null +++ b/lib/workos/group_member_added_data.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.GroupMemberAddedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :group_id, + :organization_membership_id + ] + + @type t :: %__MODULE__{ + group_id: String.t(), + organization_membership_id: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + group_id: map["group_id"], + organization_membership_id: map["organization_membership_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "group_id" => struct.group_id, + "organization_membership_id" => struct.organization_membership_id + }) + end +end diff --git a/lib/workos/group_member_removed.ex b/lib/workos/group_member_removed.ex new file mode 100644 index 00000000..806a3488 --- /dev/null +++ b/lib/workos/group_member_removed.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.GroupMemberRemoved do + @moduledoc """ + GroupMemberRemoved model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.GroupMemberRemovedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.GroupMemberRemovedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => WorkOS.Cast.dump_struct(struct.data, &WorkOS.GroupMemberRemovedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/group_member_removed_data.ex b/lib/workos/group_member_removed_data.ex new file mode 100644 index 00000000..b73b9ea6 --- /dev/null +++ b/lib/workos/group_member_removed_data.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.GroupMemberRemovedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :group_id, + :organization_membership_id + ] + + @type t :: %__MODULE__{ + group_id: String.t(), + organization_membership_id: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + group_id: map["group_id"], + organization_membership_id: map["organization_membership_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "group_id" => struct.group_id, + "organization_membership_id" => struct.organization_membership_id + }) + end +end diff --git a/lib/workos/group_role_assignment.ex b/lib/workos/group_role_assignment.ex new file mode 100644 index 00000000..ccf2ab68 --- /dev/null +++ b/lib/workos/group_role_assignment.ex @@ -0,0 +1,57 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.GroupRoleAssignment do + @moduledoc """ + GroupRoleAssignment model. + """ + + defstruct [ + :object, + :id, + :group_id, + :role, + :resource, + :created_at, + :updated_at + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + group_id: String.t(), + role: WorkOS.SlimRole.t(), + resource: WorkOS.GroupRoleAssignmentResource.t(), + created_at: String.t(), + updated_at: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + group_id: map["group_id"], + role: WorkOS.Cast.nested(map["role"], &WorkOS.SlimRole.from_map/1), + resource: + WorkOS.Cast.nested(map["resource"], &WorkOS.GroupRoleAssignmentResource.from_map/1), + created_at: map["created_at"], + updated_at: map["updated_at"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "group_id" => struct.group_id, + "role" => WorkOS.Cast.dump_struct(struct.role, &WorkOS.SlimRole.to_map/1), + "resource" => + WorkOS.Cast.dump_struct(struct.resource, &WorkOS.GroupRoleAssignmentResource.to_map/1), + "created_at" => struct.created_at, + "updated_at" => struct.updated_at + }) + end +end diff --git a/lib/workos/group_role_assignment_list.ex b/lib/workos/group_role_assignment_list.ex new file mode 100644 index 00000000..6275f07d --- /dev/null +++ b/lib/workos/group_role_assignment_list.ex @@ -0,0 +1,43 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.GroupRoleAssignmentList do + @moduledoc """ + GroupRoleAssignmentList model. + """ + + defstruct [ + :object, + :data, + :list_metadata + ] + + @type t :: %__MODULE__{ + object: String.t(), + data: [WorkOS.GroupRoleAssignment.t()], + list_metadata: WorkOS.ListMetadata.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + data: WorkOS.Cast.list(map["data"], &WorkOS.GroupRoleAssignment.from_map/1), + list_metadata: WorkOS.Cast.nested(map["list_metadata"], &WorkOS.ListMetadata.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "data" => + WorkOS.Cast.list(struct.data, fn item -> + WorkOS.Cast.dump_struct(item, &WorkOS.GroupRoleAssignment.to_map/1) + end), + "list_metadata" => + WorkOS.Cast.dump_struct(struct.list_metadata, &WorkOS.ListMetadata.to_map/1) + }) + end +end diff --git a/lib/workos/group_role_assignment_resource.ex b/lib/workos/group_role_assignment_resource.ex new file mode 100644 index 00000000..5b2e3bef --- /dev/null +++ b/lib/workos/group_role_assignment_resource.ex @@ -0,0 +1,39 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.GroupRoleAssignmentResource do + @moduledoc """ + The resource the role is assigned on. + """ + + defstruct [ + :id, + :external_id, + :resource_type_slug + ] + + @type t :: %__MODULE__{ + id: String.t(), + external_id: String.t(), + resource_type_slug: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + id: map["id"], + external_id: map["external_id"], + resource_type_slug: map["resource_type_slug"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "id" => struct.id, + "external_id" => struct.external_id, + "resource_type_slug" => struct.resource_type_slug + }) + end +end diff --git a/lib/workos/group_updated.ex b/lib/workos/group_updated.ex new file mode 100644 index 00000000..d1ee545b --- /dev/null +++ b/lib/workos/group_updated.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.GroupUpdated do + @moduledoc """ + GroupUpdated model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.Group.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.Group.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => WorkOS.Cast.dump_struct(struct.data, &WorkOS.Group.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/groups.ex b/lib/workos/groups.ex new file mode 100644 index 00000000..b1fb7764 --- /dev/null +++ b/lib/workos/groups.ex @@ -0,0 +1,269 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.Groups do + @moduledoc """ + Operations for the Groups API. + """ + + @doc """ + List groups + + Get a paginated list of groups within an organization. + + ## Parameters + + * `organization_id` — The ID of the organization. + * `params` — query parameters: `:before`, `:after_`, `:limit`, `:order` + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec list_organization_groups(WorkOS.Client.t(), String.t(), map(), keyword()) :: + {:ok, WorkOS.Page.t(WorkOS.GroupList.t())} | {:error, WorkOS.Error.error()} + def list_organization_groups(client, organization_id, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :get, + "/organizations/#{URI.encode(organization_id, &URI.char_unreserved?/1)}/groups", + params, + opts + ) do + fetch_next = fn cursor -> + list_organization_groups( + client, + organization_id, + WorkOS.Page.next_params(params, "after", cursor), + opts + ) + end + + {:ok, WorkOS.Page.from_map(body, "data", &WorkOS.GroupList.from_map/1, fetch_next)} + end + end + + @doc """ + Create a group + + Create a new group within an organization. + + ## Parameters + + * `organization_id` — The ID of the organization. + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec create_organization_group(WorkOS.Client.t(), String.t(), map(), keyword()) :: + {:ok, WorkOS.Group.t()} | {:error, WorkOS.Error.error()} + def create_organization_group(client, organization_id, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :post, + "/organizations/#{URI.encode(organization_id, &URI.char_unreserved?/1)}/groups", + params, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.Group.from_map/1)} + end + end + + @doc """ + Get a group + + Retrieve a group by its ID within an organization. + + ## Parameters + + * `organization_id` — The ID of the organization. + * `group_id` — The ID of the group. + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec get_organization_group(WorkOS.Client.t(), String.t(), String.t(), keyword()) :: + {:ok, WorkOS.Group.t()} | {:error, WorkOS.Error.error()} + def get_organization_group(client, organization_id, group_id, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :get, + "/organizations/#{URI.encode(organization_id, &URI.char_unreserved?/1)}/groups/#{URI.encode(group_id, &URI.char_unreserved?/1)}", + %{}, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.Group.from_map/1)} + end + end + + @doc """ + Update a group + + Update an existing group. Only the fields provided in the request body will be updated. + + ## Parameters + + * `organization_id` — The ID of the organization. + * `group_id` — The ID of the group. + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec update_organization_group(WorkOS.Client.t(), String.t(), String.t(), map(), keyword()) :: + {:ok, WorkOS.Group.t()} | {:error, WorkOS.Error.error()} + def update_organization_group(client, organization_id, group_id, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :patch, + "/organizations/#{URI.encode(organization_id, &URI.char_unreserved?/1)}/groups/#{URI.encode(group_id, &URI.char_unreserved?/1)}", + params, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.Group.from_map/1)} + end + end + + @doc """ + Delete a group + + Delete a group from an organization. + + ## Parameters + + * `organization_id` — The ID of the organization. + * `group_id` — The ID of the group. + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec delete_organization_group(WorkOS.Client.t(), String.t(), String.t(), keyword()) :: + {:ok, term()} | {:error, WorkOS.Error.error()} + def delete_organization_group(client, organization_id, group_id, opts \\ []) do + WorkOS.Client.request( + client, + :delete, + "/organizations/#{URI.encode(organization_id, &URI.char_unreserved?/1)}/groups/#{URI.encode(group_id, &URI.char_unreserved?/1)}", + %{}, + opts + ) + end + + @doc """ + List Group members + + Get a list of organization memberships in a group. + + ## Parameters + + * `organization_id` — Unique identifier of the Organization. + * `group_id` — Unique identifier of the Group. + * `params` — query parameters: `:before`, `:after_`, `:limit`, `:order` + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec list_group_organization_memberships( + WorkOS.Client.t(), + String.t(), + String.t(), + map(), + keyword() + ) :: + {:ok, WorkOS.Page.t(WorkOS.UserOrganizationMembershipBaseList.t())} + | {:error, WorkOS.Error.error()} + def list_group_organization_memberships( + client, + organization_id, + group_id, + params \\ %{}, + opts \\ [] + ) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :get, + "/organizations/#{URI.encode(organization_id, &URI.char_unreserved?/1)}/groups/#{URI.encode(group_id, &URI.char_unreserved?/1)}/organization-memberships", + params, + opts + ) do + fetch_next = fn cursor -> + list_group_organization_memberships( + client, + organization_id, + group_id, + WorkOS.Page.next_params(params, "after", cursor), + opts + ) + end + + {:ok, + WorkOS.Page.from_map( + body, + "data", + &WorkOS.UserOrganizationMembershipBaseList.from_map/1, + fetch_next + )} + end + end + + @doc """ + Add a member to a Group + + Add an organization membership to a group. + + ## Parameters + + * `organization_id` — Unique identifier of the Organization. + * `group_id` — Unique identifier of the Group. + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec create_group_organization_membership( + WorkOS.Client.t(), + String.t(), + String.t(), + map(), + keyword() + ) :: + {:ok, WorkOS.Group.t()} | {:error, WorkOS.Error.error()} + def create_group_organization_membership( + client, + organization_id, + group_id, + params \\ %{}, + opts \\ [] + ) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :post, + "/organizations/#{URI.encode(organization_id, &URI.char_unreserved?/1)}/groups/#{URI.encode(group_id, &URI.char_unreserved?/1)}/organization-memberships", + params, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.Group.from_map/1)} + end + end + + @doc """ + Remove a member from a Group + + Remove an organization membership from a group. + + ## Parameters + + * `organization_id` — Unique identifier of the Organization. + * `group_id` — Unique identifier of the Group. + * `om_id` — Unique identifier of the Organization Membership. + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec delete_group_organization_membership( + WorkOS.Client.t(), + String.t(), + String.t(), + String.t(), + keyword() + ) :: + {:ok, term()} | {:error, WorkOS.Error.error()} + def delete_group_organization_membership(client, organization_id, group_id, om_id, opts \\ []) do + WorkOS.Client.request( + client, + :delete, + "/organizations/#{URI.encode(organization_id, &URI.char_unreserved?/1)}/groups/#{URI.encode(group_id, &URI.char_unreserved?/1)}/organization-memberships/#{URI.encode(om_id, &URI.char_unreserved?/1)}", + %{}, + opts + ) + end +end diff --git a/lib/workos/invitation.ex b/lib/workos/invitation.ex new file mode 100644 index 00000000..d166c9fb --- /dev/null +++ b/lib/workos/invitation.ex @@ -0,0 +1,87 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.Invitation do + @moduledoc """ + Invitation model. + """ + + defstruct [ + :object, + :id, + :email, + :state, + :accepted_at, + :revoked_at, + :expires_at, + :organization_id, + :inviter_user_id, + :accepted_user_id, + :role_slug, + :created_at, + :updated_at, + :token, + :accept_invitation_url + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + email: String.t(), + state: WorkOS.InvitationState.t(), + accepted_at: String.t() | nil, + revoked_at: String.t() | nil, + expires_at: String.t(), + organization_id: String.t() | nil, + inviter_user_id: String.t() | nil, + accepted_user_id: String.t() | nil, + role_slug: String.t() | nil, + created_at: String.t(), + updated_at: String.t(), + token: String.t(), + accept_invitation_url: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + email: map["email"], + state: WorkOS.Cast.enum(map["state"], &WorkOS.InvitationState.cast/1), + accepted_at: map["accepted_at"], + revoked_at: map["revoked_at"], + expires_at: map["expires_at"], + organization_id: map["organization_id"], + inviter_user_id: map["inviter_user_id"], + accepted_user_id: map["accepted_user_id"], + role_slug: map["role_slug"], + created_at: map["created_at"], + updated_at: map["updated_at"], + token: map["token"], + accept_invitation_url: map["accept_invitation_url"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "email" => struct.email, + "state" => WorkOS.Cast.enum(struct.state, &WorkOS.InvitationState.dump/1), + "accepted_at" => struct.accepted_at, + "revoked_at" => struct.revoked_at, + "expires_at" => struct.expires_at, + "organization_id" => struct.organization_id, + "inviter_user_id" => struct.inviter_user_id, + "accepted_user_id" => struct.accepted_user_id, + "role_slug" => struct.role_slug, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at, + "token" => struct.token, + "accept_invitation_url" => struct.accept_invitation_url + }) + end +end diff --git a/lib/workos/invitation_accepted.ex b/lib/workos/invitation_accepted.ex new file mode 100644 index 00000000..a722e178 --- /dev/null +++ b/lib/workos/invitation_accepted.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.InvitationAccepted do + @moduledoc """ + InvitationAccepted model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.InvitationAcceptedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.InvitationAcceptedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => WorkOS.Cast.dump_struct(struct.data, &WorkOS.InvitationAcceptedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/invitation_accepted_data.ex b/lib/workos/invitation_accepted_data.ex new file mode 100644 index 00000000..30fbdda1 --- /dev/null +++ b/lib/workos/invitation_accepted_data.ex @@ -0,0 +1,79 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.InvitationAcceptedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :object, + :id, + :email, + :state, + :accepted_at, + :revoked_at, + :expires_at, + :organization_id, + :inviter_user_id, + :accepted_user_id, + :role_slug, + :created_at, + :updated_at + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + email: String.t(), + state: WorkOS.InvitationAcceptedDataState.t(), + accepted_at: String.t() | nil, + revoked_at: String.t() | nil, + expires_at: String.t(), + organization_id: String.t() | nil, + inviter_user_id: String.t() | nil, + accepted_user_id: String.t() | nil, + role_slug: String.t() | nil, + created_at: String.t(), + updated_at: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + email: map["email"], + state: WorkOS.Cast.enum(map["state"], &WorkOS.InvitationAcceptedDataState.cast/1), + accepted_at: map["accepted_at"], + revoked_at: map["revoked_at"], + expires_at: map["expires_at"], + organization_id: map["organization_id"], + inviter_user_id: map["inviter_user_id"], + accepted_user_id: map["accepted_user_id"], + role_slug: map["role_slug"], + created_at: map["created_at"], + updated_at: map["updated_at"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "email" => struct.email, + "state" => WorkOS.Cast.enum(struct.state, &WorkOS.InvitationAcceptedDataState.dump/1), + "accepted_at" => struct.accepted_at, + "revoked_at" => struct.revoked_at, + "expires_at" => struct.expires_at, + "organization_id" => struct.organization_id, + "inviter_user_id" => struct.inviter_user_id, + "accepted_user_id" => struct.accepted_user_id, + "role_slug" => struct.role_slug, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at + }) + end +end diff --git a/lib/workos/invitation_accepted_data_state.ex b/lib/workos/invitation_accepted_data_state.ex new file mode 100644 index 00000000..efd27c25 --- /dev/null +++ b/lib/workos/invitation_accepted_data_state.ex @@ -0,0 +1,29 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.InvitationAcceptedDataState do + @moduledoc """ + InvitationAcceptedDataState enum. + """ + + @type t :: :pending | :accepted | :expired | :revoked + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:pending, :accepted, :expired, :revoked] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("pending"), do: :pending + def cast("accepted"), do: :accepted + def cast("expired"), do: :expired + def cast("revoked"), do: :revoked + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:pending), do: "pending" + def dump(:accepted), do: "accepted" + def dump(:expired), do: "expired" + def dump(:revoked), do: "revoked" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/invitation_created.ex b/lib/workos/invitation_created.ex new file mode 100644 index 00000000..008eab9f --- /dev/null +++ b/lib/workos/invitation_created.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.InvitationCreated do + @moduledoc """ + InvitationCreated model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.InvitationCreatedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.InvitationCreatedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => WorkOS.Cast.dump_struct(struct.data, &WorkOS.InvitationCreatedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/invitation_created_data.ex b/lib/workos/invitation_created_data.ex new file mode 100644 index 00000000..1a81dfd9 --- /dev/null +++ b/lib/workos/invitation_created_data.ex @@ -0,0 +1,79 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.InvitationCreatedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :object, + :id, + :email, + :state, + :accepted_at, + :revoked_at, + :expires_at, + :organization_id, + :inviter_user_id, + :accepted_user_id, + :role_slug, + :created_at, + :updated_at + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + email: String.t(), + state: WorkOS.InvitationCreatedDataState.t(), + accepted_at: String.t() | nil, + revoked_at: String.t() | nil, + expires_at: String.t(), + organization_id: String.t() | nil, + inviter_user_id: String.t() | nil, + accepted_user_id: String.t() | nil, + role_slug: String.t() | nil, + created_at: String.t(), + updated_at: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + email: map["email"], + state: WorkOS.Cast.enum(map["state"], &WorkOS.InvitationCreatedDataState.cast/1), + accepted_at: map["accepted_at"], + revoked_at: map["revoked_at"], + expires_at: map["expires_at"], + organization_id: map["organization_id"], + inviter_user_id: map["inviter_user_id"], + accepted_user_id: map["accepted_user_id"], + role_slug: map["role_slug"], + created_at: map["created_at"], + updated_at: map["updated_at"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "email" => struct.email, + "state" => WorkOS.Cast.enum(struct.state, &WorkOS.InvitationCreatedDataState.dump/1), + "accepted_at" => struct.accepted_at, + "revoked_at" => struct.revoked_at, + "expires_at" => struct.expires_at, + "organization_id" => struct.organization_id, + "inviter_user_id" => struct.inviter_user_id, + "accepted_user_id" => struct.accepted_user_id, + "role_slug" => struct.role_slug, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at + }) + end +end diff --git a/lib/workos/invitation_created_data_state.ex b/lib/workos/invitation_created_data_state.ex new file mode 100644 index 00000000..75701681 --- /dev/null +++ b/lib/workos/invitation_created_data_state.ex @@ -0,0 +1,29 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.InvitationCreatedDataState do + @moduledoc """ + InvitationCreatedDataState enum. + """ + + @type t :: :pending | :accepted | :expired | :revoked + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:pending, :accepted, :expired, :revoked] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("pending"), do: :pending + def cast("accepted"), do: :accepted + def cast("expired"), do: :expired + def cast("revoked"), do: :revoked + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:pending), do: "pending" + def dump(:accepted), do: "accepted" + def dump(:expired), do: "expired" + def dump(:revoked), do: "revoked" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/invitation_resent.ex b/lib/workos/invitation_resent.ex new file mode 100644 index 00000000..f24c3c9a --- /dev/null +++ b/lib/workos/invitation_resent.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.InvitationResent do + @moduledoc """ + InvitationResent model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.InvitationResentData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.InvitationResentData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => WorkOS.Cast.dump_struct(struct.data, &WorkOS.InvitationResentData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/invitation_resent_data.ex b/lib/workos/invitation_resent_data.ex new file mode 100644 index 00000000..ff35c895 --- /dev/null +++ b/lib/workos/invitation_resent_data.ex @@ -0,0 +1,79 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.InvitationResentData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :object, + :id, + :email, + :state, + :accepted_at, + :revoked_at, + :expires_at, + :organization_id, + :inviter_user_id, + :accepted_user_id, + :role_slug, + :created_at, + :updated_at + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + email: String.t(), + state: WorkOS.InvitationResentDataState.t(), + accepted_at: String.t() | nil, + revoked_at: String.t() | nil, + expires_at: String.t(), + organization_id: String.t() | nil, + inviter_user_id: String.t() | nil, + accepted_user_id: String.t() | nil, + role_slug: String.t() | nil, + created_at: String.t(), + updated_at: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + email: map["email"], + state: WorkOS.Cast.enum(map["state"], &WorkOS.InvitationResentDataState.cast/1), + accepted_at: map["accepted_at"], + revoked_at: map["revoked_at"], + expires_at: map["expires_at"], + organization_id: map["organization_id"], + inviter_user_id: map["inviter_user_id"], + accepted_user_id: map["accepted_user_id"], + role_slug: map["role_slug"], + created_at: map["created_at"], + updated_at: map["updated_at"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "email" => struct.email, + "state" => WorkOS.Cast.enum(struct.state, &WorkOS.InvitationResentDataState.dump/1), + "accepted_at" => struct.accepted_at, + "revoked_at" => struct.revoked_at, + "expires_at" => struct.expires_at, + "organization_id" => struct.organization_id, + "inviter_user_id" => struct.inviter_user_id, + "accepted_user_id" => struct.accepted_user_id, + "role_slug" => struct.role_slug, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at + }) + end +end diff --git a/lib/workos/invitation_resent_data_state.ex b/lib/workos/invitation_resent_data_state.ex new file mode 100644 index 00000000..2cdc0e1c --- /dev/null +++ b/lib/workos/invitation_resent_data_state.ex @@ -0,0 +1,29 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.InvitationResentDataState do + @moduledoc """ + InvitationResentDataState enum. + """ + + @type t :: :pending | :accepted | :expired | :revoked + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:pending, :accepted, :expired, :revoked] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("pending"), do: :pending + def cast("accepted"), do: :accepted + def cast("expired"), do: :expired + def cast("revoked"), do: :revoked + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:pending), do: "pending" + def dump(:accepted), do: "accepted" + def dump(:expired), do: "expired" + def dump(:revoked), do: "revoked" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/invitation_revoked.ex b/lib/workos/invitation_revoked.ex new file mode 100644 index 00000000..0303990e --- /dev/null +++ b/lib/workos/invitation_revoked.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.InvitationRevoked do + @moduledoc """ + InvitationRevoked model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.InvitationRevokedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.InvitationRevokedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => WorkOS.Cast.dump_struct(struct.data, &WorkOS.InvitationRevokedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/invitation_revoked_data.ex b/lib/workos/invitation_revoked_data.ex new file mode 100644 index 00000000..12f6f036 --- /dev/null +++ b/lib/workos/invitation_revoked_data.ex @@ -0,0 +1,79 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.InvitationRevokedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :object, + :id, + :email, + :state, + :accepted_at, + :revoked_at, + :expires_at, + :organization_id, + :inviter_user_id, + :accepted_user_id, + :role_slug, + :created_at, + :updated_at + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + email: String.t(), + state: WorkOS.InvitationRevokedDataState.t(), + accepted_at: String.t() | nil, + revoked_at: String.t() | nil, + expires_at: String.t(), + organization_id: String.t() | nil, + inviter_user_id: String.t() | nil, + accepted_user_id: String.t() | nil, + role_slug: String.t() | nil, + created_at: String.t(), + updated_at: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + email: map["email"], + state: WorkOS.Cast.enum(map["state"], &WorkOS.InvitationRevokedDataState.cast/1), + accepted_at: map["accepted_at"], + revoked_at: map["revoked_at"], + expires_at: map["expires_at"], + organization_id: map["organization_id"], + inviter_user_id: map["inviter_user_id"], + accepted_user_id: map["accepted_user_id"], + role_slug: map["role_slug"], + created_at: map["created_at"], + updated_at: map["updated_at"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "email" => struct.email, + "state" => WorkOS.Cast.enum(struct.state, &WorkOS.InvitationRevokedDataState.dump/1), + "accepted_at" => struct.accepted_at, + "revoked_at" => struct.revoked_at, + "expires_at" => struct.expires_at, + "organization_id" => struct.organization_id, + "inviter_user_id" => struct.inviter_user_id, + "accepted_user_id" => struct.accepted_user_id, + "role_slug" => struct.role_slug, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at + }) + end +end diff --git a/lib/workos/invitation_revoked_data_state.ex b/lib/workos/invitation_revoked_data_state.ex new file mode 100644 index 00000000..4be08055 --- /dev/null +++ b/lib/workos/invitation_revoked_data_state.ex @@ -0,0 +1,29 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.InvitationRevokedDataState do + @moduledoc """ + InvitationRevokedDataState enum. + """ + + @type t :: :pending | :accepted | :expired | :revoked + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:pending, :accepted, :expired, :revoked] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("pending"), do: :pending + def cast("accepted"), do: :accepted + def cast("expired"), do: :expired + def cast("revoked"), do: :revoked + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:pending), do: "pending" + def dump(:accepted), do: "accepted" + def dump(:expired), do: "expired" + def dump(:revoked), do: "revoked" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/invitation_state.ex b/lib/workos/invitation_state.ex new file mode 100644 index 00000000..206d29cd --- /dev/null +++ b/lib/workos/invitation_state.ex @@ -0,0 +1,29 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.InvitationState do + @moduledoc """ + InvitationState enum. + """ + + @type t :: :pending | :accepted | :expired | :revoked + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:pending, :accepted, :expired, :revoked] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("pending"), do: :pending + def cast("accepted"), do: :accepted + def cast("expired"), do: :expired + def cast("revoked"), do: :revoked + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:pending), do: "pending" + def dump(:accepted), do: "accepted" + def dump(:expired), do: "expired" + def dump(:revoked), do: "revoked" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/jwks.ex b/lib/workos/jwks.ex new file mode 100644 index 00000000..4e0391ae --- /dev/null +++ b/lib/workos/jwks.ex @@ -0,0 +1,43 @@ +# @oagen-ignore-file — hand-maintained; JWKS convenience surface. + +defmodule WorkOS.JWKS do + @moduledoc """ + JWKS (JSON Web Key Set) helpers for token and session verification. + + WorkOS.JWKS.url(client) + #=> "https://api.workos.com/sso/jwks/client_..." + + {:ok, jwks} = WorkOS.JWKS.fetch(client) + """ + + @doc """ + Builds the JWKS URL for a client ID. Defaults to the client's configured + `client_id`. + """ + @spec url(WorkOS.Client.t(), String.t() | nil) :: String.t() + def url(client, client_id \\ nil) do + client_id = require_client_id(client, client_id) + "#{client.base_url}/sso/jwks/#{URI.encode(client_id, &URI.char_unreserved?/1)}" + end + + @doc """ + Fetches the JWKS for a client ID. Defaults to the client's configured + `client_id`. + """ + @spec fetch(WorkOS.Client.t(), String.t() | nil, keyword()) :: + {:ok, WorkOS.JwksResponse.t()} | {:error, WorkOS.Error.error()} + def fetch(client, client_id \\ nil, opts \\ []) do + WorkOS.UserManagement.get_jwks(client, require_client_id(client, client_id), opts) + end + + defp require_client_id(client, client_id) do + case client_id || client.client_id do + id when is_binary(id) and id != "" -> + id + + _missing -> + raise ArgumentError, + "a client_id is required — pass one explicitly or configure it on WorkOS.Client.new/1" + end + end +end diff --git a/lib/workos/jwks_response.ex b/lib/workos/jwks_response.ex new file mode 100644 index 00000000..17e18580 --- /dev/null +++ b/lib/workos/jwks_response.ex @@ -0,0 +1,34 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.JwksResponse do + @moduledoc """ + JwksResponse model. + """ + + defstruct [ + :keys + ] + + @type t :: %__MODULE__{ + keys: [WorkOS.JwksResponseKeys.t()] + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + keys: WorkOS.Cast.list(map["keys"], &WorkOS.JwksResponseKeys.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "keys" => + WorkOS.Cast.list(struct.keys, fn item -> + WorkOS.Cast.dump_struct(item, &WorkOS.JwksResponseKeys.to_map/1) + end) + }) + end +end diff --git a/lib/workos/jwks_response_keys.ex b/lib/workos/jwks_response_keys.ex new file mode 100644 index 00000000..9f34e065 --- /dev/null +++ b/lib/workos/jwks_response_keys.ex @@ -0,0 +1,59 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.JwksResponseKeys do + @moduledoc """ + JwksResponseKeys model. + """ + + defstruct [ + :alg, + :kty, + :use_, + :x_5_c, + :n, + :e, + :kid, + :x_5_t_s_256 + ] + + @type t :: %__MODULE__{ + alg: String.t(), + kty: String.t(), + use_: String.t(), + x_5_c: [String.t()], + n: String.t(), + e: String.t(), + kid: String.t(), + x_5_t_s_256: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + alg: map["alg"], + kty: map["kty"], + use_: map["use"], + x_5_c: map["x5c"], + n: map["n"], + e: map["e"], + kid: map["kid"], + x_5_t_s_256: map["x5t#S256"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "alg" => struct.alg, + "kty" => struct.kty, + "use" => struct.use_, + "x5c" => struct.x_5_c, + "n" => struct.n, + "e" => struct.e, + "kid" => struct.kid, + "x5t#S256" => struct.x_5_t_s_256 + }) + end +end diff --git a/lib/workos/jwt_template_response.ex b/lib/workos/jwt_template_response.ex new file mode 100644 index 00000000..f81102ac --- /dev/null +++ b/lib/workos/jwt_template_response.ex @@ -0,0 +1,43 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.JWTTemplateResponse do + @moduledoc """ + JWTTemplateResponse model. + """ + + defstruct [ + :object, + :content, + :created_at, + :updated_at + ] + + @type t :: %__MODULE__{ + object: String.t(), + content: String.t(), + created_at: String.t(), + updated_at: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + content: map["content"], + created_at: map["created_at"], + updated_at: map["updated_at"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "content" => struct.content, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at + }) + end +end diff --git a/lib/workos/list.ex b/lib/workos/list.ex deleted file mode 100644 index 16b16673..00000000 --- a/lib/workos/list.ex +++ /dev/null @@ -1,29 +0,0 @@ -defmodule WorkOS.List do - @moduledoc """ - Casts a response to a `%WorkOS.List{}` of structs. - """ - - alias WorkOS.Castable - - @behaviour WorkOS.Castable - - @type t(g) :: %__MODULE__{ - data: list(g), - list_metadata: map() - } - - @enforce_keys [:data, :list_metadata] - defstruct [:data, :list_metadata] - - @impl true - def cast({implementation, map}) do - %__MODULE__{ - data: Castable.cast_list(implementation, map["data"]), - list_metadata: map["list_metadata"] - } - end - - def of(implementation) do - {__MODULE__, implementation} - end -end diff --git a/lib/workos/list_metadata.ex b/lib/workos/list_metadata.ex new file mode 100644 index 00000000..4cdccb23 --- /dev/null +++ b/lib/workos/list_metadata.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ListMetadata do + @moduledoc """ + Cursor-based pagination metadata. + """ + + defstruct [ + :after_, + :before + ] + + @type t :: %__MODULE__{ + after_: String.t() | nil, + before: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + after_: map["after"], + before: map["before"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "after" => struct.after_, + "before" => struct.before + }) + end +end diff --git a/lib/workos/magic_auth.ex b/lib/workos/magic_auth.ex new file mode 100644 index 00000000..e0d5406f --- /dev/null +++ b/lib/workos/magic_auth.ex @@ -0,0 +1,59 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.MagicAuth do + @moduledoc """ + MagicAuth model. + """ + + defstruct [ + :object, + :id, + :user_id, + :email, + :expires_at, + :created_at, + :updated_at, + :code + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + user_id: String.t(), + email: String.t(), + expires_at: String.t(), + created_at: String.t(), + updated_at: String.t(), + code: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + user_id: map["user_id"], + email: map["email"], + expires_at: map["expires_at"], + created_at: map["created_at"], + updated_at: map["updated_at"], + code: map["code"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "user_id" => struct.user_id, + "email" => struct.email, + "expires_at" => struct.expires_at, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at, + "code" => struct.code + }) + end +end diff --git a/lib/workos/magic_auth_code_session_authenticate_request.ex b/lib/workos/magic_auth_code_session_authenticate_request.ex new file mode 100644 index 00000000..c2bf7608 --- /dev/null +++ b/lib/workos/magic_auth_code_session_authenticate_request.ex @@ -0,0 +1,67 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.MagicAuthCodeSessionAuthenticateRequest do + @moduledoc """ + MagicAuthCodeSessionAuthenticateRequest model. + """ + + defstruct [ + :client_id, + :client_secret, + :grant_type, + :code, + :email, + :invitation_token, + :ip_address, + :device_id, + :user_agent, + :radar_auth_attempt_id + ] + + @type t :: %__MODULE__{ + client_id: String.t(), + client_secret: String.t(), + grant_type: String.t(), + code: String.t(), + email: String.t(), + invitation_token: String.t() | nil, + ip_address: String.t() | nil, + device_id: String.t() | nil, + user_agent: String.t() | nil, + radar_auth_attempt_id: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + client_id: map["client_id"], + client_secret: map["client_secret"], + grant_type: map["grant_type"], + code: map["code"], + email: map["email"], + invitation_token: map["invitation_token"], + ip_address: map["ip_address"], + device_id: map["device_id"], + user_agent: map["user_agent"], + radar_auth_attempt_id: map["radar_auth_attempt_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "client_id" => struct.client_id, + "client_secret" => struct.client_secret, + "grant_type" => struct.grant_type, + "code" => struct.code, + "email" => struct.email, + "invitation_token" => struct.invitation_token, + "ip_address" => struct.ip_address, + "device_id" => struct.device_id, + "user_agent" => struct.user_agent, + "radar_auth_attempt_id" => struct.radar_auth_attempt_id + }) + end +end diff --git a/lib/workos/magic_auth_created.ex b/lib/workos/magic_auth_created.ex new file mode 100644 index 00000000..8c84d22e --- /dev/null +++ b/lib/workos/magic_auth_created.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.MagicAuthCreated do + @moduledoc """ + MagicAuthCreated model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.MagicAuthCreatedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.MagicAuthCreatedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => WorkOS.Cast.dump_struct(struct.data, &WorkOS.MagicAuthCreatedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/magic_auth_created_data.ex b/lib/workos/magic_auth_created_data.ex new file mode 100644 index 00000000..d328fbe6 --- /dev/null +++ b/lib/workos/magic_auth_created_data.ex @@ -0,0 +1,55 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.MagicAuthCreatedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :object, + :id, + :user_id, + :email, + :expires_at, + :created_at, + :updated_at + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + user_id: String.t(), + email: String.t(), + expires_at: String.t(), + created_at: String.t(), + updated_at: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + user_id: map["user_id"], + email: map["email"], + expires_at: map["expires_at"], + created_at: map["created_at"], + updated_at: map["updated_at"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "user_id" => struct.user_id, + "email" => struct.email, + "expires_at" => struct.expires_at, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at + }) + end +end diff --git a/lib/workos/magic_auth_send_magic_auth_code_and_return_response.ex b/lib/workos/magic_auth_send_magic_auth_code_and_return_response.ex new file mode 100644 index 00000000..52f9708c --- /dev/null +++ b/lib/workos/magic_auth_send_magic_auth_code_and_return_response.ex @@ -0,0 +1,63 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.MagicAuthSendMagicAuthCodeAndReturnResponse do + @moduledoc """ + MagicAuthSendMagicAuthCodeAndReturnResponse model. + """ + + defstruct [ + :object, + :id, + :user_id, + :email, + :expires_at, + :created_at, + :updated_at, + :code, + :radar_auth_attempt_id + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + user_id: String.t(), + email: String.t(), + expires_at: String.t(), + created_at: String.t(), + updated_at: String.t(), + code: String.t(), + radar_auth_attempt_id: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + user_id: map["user_id"], + email: map["email"], + expires_at: map["expires_at"], + created_at: map["created_at"], + updated_at: map["updated_at"], + code: map["code"], + radar_auth_attempt_id: map["radar_auth_attempt_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "user_id" => struct.user_id, + "email" => struct.email, + "expires_at" => struct.expires_at, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at, + "code" => struct.code, + "radar_auth_attempt_id" => struct.radar_auth_attempt_id + }) + end +end diff --git a/lib/workos/mfa.ex b/lib/workos/mfa.ex deleted file mode 100644 index c409d0ab..00000000 --- a/lib/workos/mfa.ex +++ /dev/null @@ -1,122 +0,0 @@ -defmodule WorkOS.MFA do - @moduledoc """ - This module is deprecated. - """ - - alias WorkOS.Empty - alias WorkOS.MFA.AuthenticationChallenge - alias WorkOS.MFA.AuthenticationFactor - alias WorkOS.MFA.VerifyChallenge - - @doc """ - Enrolls an Authentication Factor. - - Parameter options: - - * `:type` - The type of the factor to enroll. Only option available is `totp`. (required) - * `:totp_issuer` - For `totp` factors. Typically your application or company name, this helps users distinguish between factors in authenticator apps. - * `:totp_user` - For `totp` factors. Used as the account name in authenticator apps. Defaults to the user's email. - * `:phone_number` - A valid phone number for an SMS-enabled device. Required when type is sms. - - """ - @spec enroll_factor(map()) :: WorkOS.Client.response(AuthenticationFactor.t()) - @spec enroll_factor(WorkOS.Client.t(), map()) :: - WorkOS.Client.response(AuthenticationFactor.t()) - def enroll_factor(client \\ WorkOS.client(), opts) when is_map_key(opts, :type) do - WorkOS.Client.post( - client, - AuthenticationFactor, - "/auth/factors/enroll", - %{ - type: opts[:type], - totp_issuer: opts[:totp_issuer], - totp_user: opts[:totp_user], - phone_number: opts[:phone_number] - } - ) - end - - @doc """ - Creates a Challenge for an Authentication Factor. - - Parameter options: - - * `:authentication_factor_id` - The ID of the Authentication Factor. (required) - * `:sms_template` - A valid phone number for an SMS-enabled device. Required when type is sms. - - """ - @spec challenge_factor(map()) :: WorkOS.Client.response(AuthenticationChallenge.t()) - @spec challenge_factor(WorkOS.Client.t(), map()) :: - WorkOS.Client.response(AuthenticationChallenge.t()) - def challenge_factor(client \\ WorkOS.client(), opts) - when is_map_key(opts, :authentication_factor_id) do - WorkOS.Client.post( - client, - AuthenticationChallenge, - "/auth/factors/:id/challenge", - %{ - sms_template: opts[:sms_template] - }, - opts: [ - path_params: [id: opts[:authentication_factor_id]] - ] - ) - end - - @doc """ - Verifies Authentication Challenge. - - Parameter options: - - * `:code` - The 6 digit code to be verified. (required) - - """ - @spec verify_challenge(String.t(), map()) :: WorkOS.Client.response(VerifyChallenge.t()) - @spec verify_challenge(WorkOS.Client.t(), String.t(), map()) :: - WorkOS.Client.response(VerifyChallenge.t()) - def verify_challenge(client \\ WorkOS.client(), authentication_challenge_id, opts) - when is_map_key(opts, :code) do - WorkOS.Client.post( - client, - VerifyChallenge, - "/auth/challenges/:id/verify", - %{ - code: opts[:code] - }, - opts: [ - path_params: [id: authentication_challenge_id] - ] - ) - end - - @doc """ - Gets an Authentication Factor. - """ - @spec get_factor(String.t()) :: - WorkOS.Client.response(AuthenticationFactor.t()) - @spec get_factor(WorkOS.Client.t(), String.t()) :: - WorkOS.Client.response(AuthenticationFactor.t()) - def get_factor(client \\ WorkOS.client(), authentication_factor_id) do - WorkOS.Client.get( - client, - AuthenticationFactor, - "/auth/factors/:id", - opts: [ - path_params: [id: authentication_factor_id] - ] - ) - end - - @doc """ - Deletes an Authentication Factor. - """ - @spec delete_factor(String.t()) :: WorkOS.Client.response(nil) - @spec delete_factor(WorkOS.Client.t(), String.t()) :: WorkOS.Client.response(nil) - def delete_factor(client \\ WorkOS.client(), authentication_factor_id) do - WorkOS.Client.delete(client, Empty, "/auth/factors/:id", %{}, - opts: [ - path_params: [id: authentication_factor_id] - ] - ) - end -end diff --git a/lib/workos/mfa/authentication_challenge.ex b/lib/workos/mfa/authentication_challenge.ex deleted file mode 100644 index a5e3215e..00000000 --- a/lib/workos/mfa/authentication_challenge.ex +++ /dev/null @@ -1,35 +0,0 @@ -defmodule WorkOS.MFA.AuthenticationChallenge do - @moduledoc """ - This response struct is deprecated. Use the User Management Multi-Factor API instead. - """ - - @behaviour WorkOS.Castable - - @type t() :: %__MODULE__{ - id: String.t(), - authentication_factor_id: String.t(), - expires_at: String.t(), - updated_at: String.t(), - created_at: String.t() - } - - @enforce_keys [:id, :authentication_factor_id, :expires_at, :updated_at, :created_at] - defstruct [ - :id, - :authentication_factor_id, - :expires_at, - :updated_at, - :created_at - ] - - @impl true - def cast(map) do - %__MODULE__{ - id: map["id"], - authentication_factor_id: map["authentication_factor_id"], - expires_at: map["expires_at"], - updated_at: map["updated_at"], - created_at: map["created_at"] - } - end -end diff --git a/lib/workos/mfa/authentication_factor.ex b/lib/workos/mfa/authentication_factor.ex deleted file mode 100644 index 59638837..00000000 --- a/lib/workos/mfa/authentication_factor.ex +++ /dev/null @@ -1,41 +0,0 @@ -defmodule WorkOS.MFA.AuthenticationFactor do - @moduledoc """ - This response struct is deprecated. Use the User Management Multi-Factor API instead. - """ - - @behaviour WorkOS.Castable - - alias WorkOS.MFA.SMS - alias WorkOS.MFA.TOTP - - @type t() :: %__MODULE__{ - id: String.t(), - type: String.t(), - sms: SMS.t() | nil, - totp: TOTP.t() | nil, - updated_at: String.t(), - created_at: String.t() - } - - @enforce_keys [:id, :type, :sms, :totp, :updated_at, :created_at] - defstruct [ - :id, - :type, - :sms, - :totp, - :updated_at, - :created_at - ] - - @impl true - def cast(map) do - %__MODULE__{ - id: map["id"], - type: map["type"], - sms: map["sms"], - totp: map["totp"], - updated_at: map["updated_at"], - created_at: map["created_at"] - } - end -end diff --git a/lib/workos/mfa/sms.ex b/lib/workos/mfa/sms.ex deleted file mode 100644 index 967001c3..00000000 --- a/lib/workos/mfa/sms.ex +++ /dev/null @@ -1,25 +0,0 @@ -defmodule WorkOS.MFA.SMS do - @moduledoc """ - This response struct is deprecated. Use the User Management Multi-Factor API instead. - """ - - @behaviour WorkOS.Castable - - @type t() :: %__MODULE__{ - phone_number: String.t() - } - - @enforce_keys [ - :phone_number - ] - defstruct [ - :phone_number - ] - - @impl true - def cast(map) do - %__MODULE__{ - phone_number: map["phone_number"] - } - end -end diff --git a/lib/workos/mfa/totp.ex b/lib/workos/mfa/totp.ex deleted file mode 100644 index 4f33a601..00000000 --- a/lib/workos/mfa/totp.ex +++ /dev/null @@ -1,41 +0,0 @@ -defmodule WorkOS.MFA.TOTP do - @moduledoc """ - This response struct is deprecated. Use the User Management Multi-Factor API instead. - """ - - @behaviour WorkOS.Castable - - @type t() :: %__MODULE__{ - issuer: String.t(), - user: String.t(), - secret: String.t(), - qr_code: String.t(), - uri: String.t() - } - - @enforce_keys [ - :issuer, - :user, - :secret, - :qr_code, - :uri - ] - defstruct [ - :issuer, - :user, - :secret, - :qr_code, - :uri - ] - - @impl true - def cast(map) do - %__MODULE__{ - issuer: map["issuer"], - user: map["user"], - secret: map["secret"], - qr_code: map["qr_code"], - uri: map["uri"] - } - end -end diff --git a/lib/workos/mfa/verify_challenge.ex b/lib/workos/mfa/verify_challenge.ex deleted file mode 100644 index 8a74df7d..00000000 --- a/lib/workos/mfa/verify_challenge.ex +++ /dev/null @@ -1,28 +0,0 @@ -defmodule WorkOS.MFA.VerifyChallenge do - @moduledoc """ - This response struct is deprecated. Use the User Management Multi-Factor API instead. - """ - - @behaviour WorkOS.Castable - - alias WorkOS.MFA.AuthenticationChallenge - - @type t() :: %__MODULE__{ - challenge: AuthenticationChallenge.t(), - valid: boolean() - } - - @enforce_keys [:challenge, :valid] - defstruct [ - :challenge, - :valid - ] - - @impl true - def cast(map) do - %__MODULE__{ - challenge: map["challenge"], - valid: map["valid"] - } - end -end diff --git a/lib/workos/mfa_totp_session_authenticate_request.ex b/lib/workos/mfa_totp_session_authenticate_request.ex new file mode 100644 index 00000000..04c426ca --- /dev/null +++ b/lib/workos/mfa_totp_session_authenticate_request.ex @@ -0,0 +1,63 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.MFATotpSessionAuthenticateRequest do + @moduledoc """ + MFATotpSessionAuthenticateRequest model. + """ + + defstruct [ + :client_id, + :client_secret, + :grant_type, + :code, + :pending_authentication_token, + :authentication_challenge_id, + :ip_address, + :device_id, + :user_agent + ] + + @type t :: %__MODULE__{ + client_id: String.t(), + client_secret: String.t(), + grant_type: String.t(), + code: String.t(), + pending_authentication_token: String.t(), + authentication_challenge_id: String.t(), + ip_address: String.t() | nil, + device_id: String.t() | nil, + user_agent: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + client_id: map["client_id"], + client_secret: map["client_secret"], + grant_type: map["grant_type"], + code: map["code"], + pending_authentication_token: map["pending_authentication_token"], + authentication_challenge_id: map["authentication_challenge_id"], + ip_address: map["ip_address"], + device_id: map["device_id"], + user_agent: map["user_agent"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "client_id" => struct.client_id, + "client_secret" => struct.client_secret, + "grant_type" => struct.grant_type, + "code" => struct.code, + "pending_authentication_token" => struct.pending_authentication_token, + "authentication_challenge_id" => struct.authentication_challenge_id, + "ip_address" => struct.ip_address, + "device_id" => struct.device_id, + "user_agent" => struct.user_agent + }) + end +end diff --git a/lib/workos/multi_factor_auth.ex b/lib/workos/multi_factor_auth.ex new file mode 100644 index 00000000..61fbd08d --- /dev/null +++ b/lib/workos/multi_factor_auth.ex @@ -0,0 +1,193 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.MultiFactorAuth do + @moduledoc """ + Operations for the MultiFactorAuth API. + """ + + @doc """ + Verify Challenge + + Verifies an Authentication Challenge. + + ## Parameters + + * `id` — The unique ID of the Authentication Challenge. + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec verify_challenge(WorkOS.Client.t(), String.t(), map(), keyword()) :: + {:ok, WorkOS.AuthenticationChallengeVerifyResponse.t()} | {:error, WorkOS.Error.error()} + def verify_challenge(client, id, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :post, + "/auth/challenges/#{URI.encode(id, &URI.char_unreserved?/1)}/verify", + params, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.AuthenticationChallengeVerifyResponse.from_map/1)} + end + end + + @doc """ + Enroll Factor + + Enrolls an Authentication Factor to be used as an additional factor of authentication. The returned ID should be used to create an authentication Challenge. + + ## Parameters + + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec enroll_factor(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.AuthenticationFactorEnrolled.t()} | {:error, WorkOS.Error.error()} + def enroll_factor(client, params \\ %{}, opts \\ []) do + with {:ok, body} <- WorkOS.Client.request(client, :post, "/auth/factors/enroll", params, opts) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.AuthenticationFactorEnrolled.from_map/1)} + end + end + + @doc """ + Get Factor + + Gets an Authentication Factor. + + ## Parameters + + * `id` — The unique ID of the Factor. + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec get_factor(WorkOS.Client.t(), String.t(), keyword()) :: + {:ok, WorkOS.AuthenticationFactor.t()} | {:error, WorkOS.Error.error()} + def get_factor(client, id, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :get, + "/auth/factors/#{URI.encode(id, &URI.char_unreserved?/1)}", + %{}, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.AuthenticationFactor.from_map/1)} + end + end + + @doc """ + Delete Factor + + Permanently deletes an Authentication Factor. It cannot be undone. + + ## Parameters + + * `id` — The unique ID of the Factor. + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec delete_factor(WorkOS.Client.t(), String.t(), keyword()) :: + {:ok, term()} | {:error, WorkOS.Error.error()} + def delete_factor(client, id, opts \\ []) do + WorkOS.Client.request( + client, + :delete, + "/auth/factors/#{URI.encode(id, &URI.char_unreserved?/1)}", + %{}, + opts + ) + end + + @doc """ + Challenge Factor + + Creates a Challenge for an Authentication Factor. + + ## Parameters + + * `id` — The unique ID of the Authentication Factor to be challenged. + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec challenge_factor(WorkOS.Client.t(), String.t(), map(), keyword()) :: + {:ok, WorkOS.AuthenticationChallenge.t()} | {:error, WorkOS.Error.error()} + def challenge_factor(client, id, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :post, + "/auth/factors/#{URI.encode(id, &URI.char_unreserved?/1)}/challenge", + params, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.AuthenticationChallenge.from_map/1)} + end + end + + @doc """ + List authentication factors + + Lists the [authentication factors](https://workos.com/docs/reference/authkit/mfa/authentication-factor) for a user. + + ## Parameters + + * `userland_user_id` — The ID of the [user](https://workos.com/docs/reference/authkit/user). + * `params` — query parameters: `:before`, `:after_`, `:limit`, `:order` + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec list_user_auth_factors(WorkOS.Client.t(), String.t(), map(), keyword()) :: + {:ok, WorkOS.Page.t(WorkOS.UserAuthenticationFactorList.t())} + | {:error, WorkOS.Error.error()} + def list_user_auth_factors(client, userland_user_id, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :get, + "/user_management/users/#{URI.encode(userland_user_id, &URI.char_unreserved?/1)}/auth_factors", + params, + opts + ) do + fetch_next = fn cursor -> + list_user_auth_factors( + client, + userland_user_id, + WorkOS.Page.next_params(params, "after", cursor), + opts + ) + end + + {:ok, + WorkOS.Page.from_map( + body, + "data", + &WorkOS.UserAuthenticationFactorList.from_map/1, + fetch_next + )} + end + end + + @doc """ + Enroll an authentication factor + + Enrolls a user in a new [authentication factor](https://workos.com/docs/reference/authkit/mfa/authentication-factor). + + ## Parameters + + * `userland_user_id` — The ID of the [user](https://workos.com/docs/reference/authkit/user). + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec create_user_auth_factor(WorkOS.Client.t(), String.t(), map(), keyword()) :: + {:ok, WorkOS.UserAuthenticationFactorEnrollResponse.t()} + | {:error, WorkOS.Error.error()} + def create_user_auth_factor(client, userland_user_id, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :post, + "/user_management/users/#{URI.encode(userland_user_id, &URI.char_unreserved?/1)}/auth_factors", + params, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.UserAuthenticationFactorEnrollResponse.from_map/1)} + end + end +end diff --git a/lib/workos/new_connect_application_secret.ex b/lib/workos/new_connect_application_secret.ex new file mode 100644 index 00000000..c3788b4e --- /dev/null +++ b/lib/workos/new_connect_application_secret.ex @@ -0,0 +1,55 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.NewConnectApplicationSecret do + @moduledoc """ + NewConnectApplicationSecret model. + """ + + defstruct [ + :object, + :id, + :secret_hint, + :last_used_at, + :created_at, + :updated_at, + :secret + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + secret_hint: String.t(), + last_used_at: String.t() | nil, + created_at: String.t(), + updated_at: String.t(), + secret: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + secret_hint: map["secret_hint"], + last_used_at: map["last_used_at"], + created_at: map["created_at"], + updated_at: map["updated_at"], + secret: map["secret"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "secret_hint" => struct.secret_hint, + "last_used_at" => struct.last_used_at, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at, + "secret" => struct.secret + }) + end +end diff --git a/lib/workos/object_list_response.ex b/lib/workos/object_list_response.ex new file mode 100644 index 00000000..802b791a --- /dev/null +++ b/lib/workos/object_list_response.ex @@ -0,0 +1,39 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ObjectListResponse do + @moduledoc """ + ObjectListResponse model. + """ + + defstruct [ + :data, + :list_metadata + ] + + @type t :: %__MODULE__{ + data: [WorkOS.ObjectSummary.t()], + list_metadata: WorkOS.ListMetadata.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + data: WorkOS.Cast.list(map["data"], &WorkOS.ObjectSummary.from_map/1), + list_metadata: WorkOS.Cast.nested(map["list_metadata"], &WorkOS.ListMetadata.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "data" => + WorkOS.Cast.list(struct.data, fn item -> + WorkOS.Cast.dump_struct(item, &WorkOS.ObjectSummary.to_map/1) + end), + "list_metadata" => + WorkOS.Cast.dump_struct(struct.list_metadata, &WorkOS.ListMetadata.to_map/1) + }) + end +end diff --git a/lib/workos/object_metadata.ex b/lib/workos/object_metadata.ex new file mode 100644 index 00000000..c8a606bc --- /dev/null +++ b/lib/workos/object_metadata.ex @@ -0,0 +1,55 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ObjectMetadata do + @moduledoc """ + Metadata for a stored encrypted object. + """ + + defstruct [ + :context, + :environment_id, + :id, + :key_id, + :updated_at, + :updated_by, + :version_id + ] + + @type t :: %__MODULE__{ + context: %{optional(String.t()) => String.t()}, + environment_id: String.t(), + id: String.t(), + key_id: String.t(), + updated_at: String.t(), + updated_by: WorkOS.Actor.t(), + version_id: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + context: map["context"], + environment_id: map["environment_id"], + id: map["id"], + key_id: map["key_id"], + updated_at: map["updated_at"], + updated_by: WorkOS.Cast.nested(map["updated_by"], &WorkOS.Actor.from_map/1), + version_id: map["version_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "context" => struct.context, + "environment_id" => struct.environment_id, + "id" => struct.id, + "key_id" => struct.key_id, + "updated_at" => struct.updated_at, + "updated_by" => WorkOS.Cast.dump_struct(struct.updated_by, &WorkOS.Actor.to_map/1), + "version_id" => struct.version_id + }) + end +end diff --git a/lib/workos/object_summary.ex b/lib/workos/object_summary.ex new file mode 100644 index 00000000..985e3686 --- /dev/null +++ b/lib/workos/object_summary.ex @@ -0,0 +1,39 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ObjectSummary do + @moduledoc """ + Summary of an encrypted object returned in list responses. + """ + + defstruct [ + :id, + :name, + :updated_at + ] + + @type t :: %__MODULE__{ + id: String.t(), + name: String.t(), + updated_at: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + id: map["id"], + name: map["name"], + updated_at: map["updated_at"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "id" => struct.id, + "name" => struct.name, + "updated_at" => struct.updated_at + }) + end +end diff --git a/lib/workos/object_version.ex b/lib/workos/object_version.ex new file mode 100644 index 00000000..fdd02c85 --- /dev/null +++ b/lib/workos/object_version.ex @@ -0,0 +1,47 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ObjectVersion do + @moduledoc """ + A static snapshot of an encrypted object. + """ + + defstruct [ + :created_at, + :current_version, + :etag, + :id, + :size + ] + + @type t :: %__MODULE__{ + created_at: String.t(), + current_version: boolean(), + etag: String.t(), + id: String.t(), + size: integer() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + created_at: map["created_at"], + current_version: map["current_version"], + etag: map["etag"], + id: map["id"], + size: map["size"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "created_at" => struct.created_at, + "current_version" => struct.current_version, + "etag" => struct.etag, + "id" => struct.id, + "size" => struct.size + }) + end +end diff --git a/lib/workos/object_without_value.ex b/lib/workos/object_without_value.ex new file mode 100644 index 00000000..c74837b8 --- /dev/null +++ b/lib/workos/object_without_value.ex @@ -0,0 +1,39 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ObjectWithoutValue do + @moduledoc """ + An encrypted object's metadata (value excluded). + """ + + defstruct [ + :id, + :metadata, + :name + ] + + @type t :: %__MODULE__{ + id: String.t(), + metadata: WorkOS.ObjectMetadata.t(), + name: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + id: map["id"], + metadata: WorkOS.Cast.nested(map["metadata"], &WorkOS.ObjectMetadata.from_map/1), + name: map["name"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "id" => struct.id, + "metadata" => WorkOS.Cast.dump_struct(struct.metadata, &WorkOS.ObjectMetadata.to_map/1), + "name" => struct.name + }) + end +end diff --git a/lib/workos/organization.ex b/lib/workos/organization.ex new file mode 100644 index 00000000..d47116b7 --- /dev/null +++ b/lib/workos/organization.ex @@ -0,0 +1,74 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.Organization do + @moduledoc """ + Organization model. + + ## Deprecated fields + + * `:allow_profiles_outside_organization` — Whether the Organization allows profiles outside of its managed domains. + """ + + defstruct [ + :object, + :id, + :name, + :domains, + :metadata, + :external_id, + :created_at, + :updated_at, + :stripe_customer_id, + :allow_profiles_outside_organization + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + name: String.t(), + domains: [WorkOS.OrganizationDomain.t()], + metadata: %{optional(String.t()) => String.t()}, + external_id: String.t() | nil, + created_at: String.t(), + updated_at: String.t(), + stripe_customer_id: String.t() | nil, + allow_profiles_outside_organization: boolean() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + name: map["name"], + domains: WorkOS.Cast.list(map["domains"], &WorkOS.OrganizationDomain.from_map/1), + metadata: map["metadata"], + external_id: map["external_id"], + created_at: map["created_at"], + updated_at: map["updated_at"], + stripe_customer_id: map["stripe_customer_id"], + allow_profiles_outside_organization: map["allow_profiles_outside_organization"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "name" => struct.name, + "domains" => + WorkOS.Cast.list(struct.domains, fn item -> + WorkOS.Cast.dump_struct(item, &WorkOS.OrganizationDomain.to_map/1) + end), + "metadata" => struct.metadata, + "external_id" => struct.external_id, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at, + "stripe_customer_id" => struct.stripe_customer_id, + "allow_profiles_outside_organization" => struct.allow_profiles_outside_organization + }) + end +end diff --git a/lib/workos/organization_api_key.ex b/lib/workos/organization_api_key.ex new file mode 100644 index 00000000..6b74974f --- /dev/null +++ b/lib/workos/organization_api_key.ex @@ -0,0 +1,67 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationApiKey do + @moduledoc """ + OrganizationApiKey model. + """ + + defstruct [ + :object, + :id, + :owner, + :name, + :obfuscated_value, + :last_used_at, + :expires_at, + :permissions, + :created_at, + :updated_at + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + owner: WorkOS.OrganizationApiKeyOwner.t(), + name: String.t(), + obfuscated_value: String.t(), + last_used_at: String.t() | nil, + expires_at: String.t() | nil, + permissions: [String.t()], + created_at: String.t(), + updated_at: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + owner: WorkOS.Cast.nested(map["owner"], &WorkOS.OrganizationApiKeyOwner.from_map/1), + name: map["name"], + obfuscated_value: map["obfuscated_value"], + last_used_at: map["last_used_at"], + expires_at: map["expires_at"], + permissions: map["permissions"], + created_at: map["created_at"], + updated_at: map["updated_at"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "owner" => WorkOS.Cast.dump_struct(struct.owner, &WorkOS.OrganizationApiKeyOwner.to_map/1), + "name" => struct.name, + "obfuscated_value" => struct.obfuscated_value, + "last_used_at" => struct.last_used_at, + "expires_at" => struct.expires_at, + "permissions" => struct.permissions, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at + }) + end +end diff --git a/lib/workos/organization_api_key_list.ex b/lib/workos/organization_api_key_list.ex new file mode 100644 index 00000000..9367f622 --- /dev/null +++ b/lib/workos/organization_api_key_list.ex @@ -0,0 +1,50 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationApiKeyList do + @moduledoc """ + OrganizationApiKeyList model. + """ + + defstruct [ + :object, + :data, + :list_metadata + ] + + @type t :: %__MODULE__{ + object: String.t(), + data: [WorkOS.OrganizationApiKey.t()], + list_metadata: WorkOS.OrganizationApiKeyListListMetadata.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + data: WorkOS.Cast.list(map["data"], &WorkOS.OrganizationApiKey.from_map/1), + list_metadata: + WorkOS.Cast.nested( + map["list_metadata"], + &WorkOS.OrganizationApiKeyListListMetadata.from_map/1 + ) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "data" => + WorkOS.Cast.list(struct.data, fn item -> + WorkOS.Cast.dump_struct(item, &WorkOS.OrganizationApiKey.to_map/1) + end), + "list_metadata" => + WorkOS.Cast.dump_struct( + struct.list_metadata, + &WorkOS.OrganizationApiKeyListListMetadata.to_map/1 + ) + }) + end +end diff --git a/lib/workos/organization_api_key_list_list_metadata.ex b/lib/workos/organization_api_key_list_list_metadata.ex new file mode 100644 index 00000000..f53a8d39 --- /dev/null +++ b/lib/workos/organization_api_key_list_list_metadata.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationApiKeyListListMetadata do + @moduledoc """ + Pagination cursors for navigating between pages of results. + """ + + defstruct [ + :before, + :after_ + ] + + @type t :: %__MODULE__{ + before: String.t() | nil, + after_: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + before: map["before"], + after_: map["after"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "before" => struct.before, + "after" => struct.after_ + }) + end +end diff --git a/lib/workos/organization_api_key_owner.ex b/lib/workos/organization_api_key_owner.ex new file mode 100644 index 00000000..2cafcecc --- /dev/null +++ b/lib/workos/organization_api_key_owner.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationApiKeyOwner do + @moduledoc """ + The entity that owns the API Key. + """ + + defstruct [ + :type, + :id + ] + + @type t :: %__MODULE__{ + type: String.t(), + id: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + type: map["type"], + id: map["id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "type" => struct.type, + "id" => struct.id + }) + end +end diff --git a/lib/workos/organization_api_key_with_value.ex b/lib/workos/organization_api_key_with_value.ex new file mode 100644 index 00000000..1a67bfe1 --- /dev/null +++ b/lib/workos/organization_api_key_with_value.ex @@ -0,0 +1,73 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationApiKeyWithValue do + @moduledoc """ + OrganizationApiKeyWithValue model. + """ + + defstruct [ + :object, + :id, + :owner, + :name, + :obfuscated_value, + :last_used_at, + :expires_at, + :permissions, + :created_at, + :updated_at, + :value + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + owner: WorkOS.OrganizationApiKeyWithValueOwner.t(), + name: String.t(), + obfuscated_value: String.t(), + last_used_at: String.t() | nil, + expires_at: String.t() | nil, + permissions: [String.t()], + created_at: String.t(), + updated_at: String.t(), + value: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + owner: + WorkOS.Cast.nested(map["owner"], &WorkOS.OrganizationApiKeyWithValueOwner.from_map/1), + name: map["name"], + obfuscated_value: map["obfuscated_value"], + last_used_at: map["last_used_at"], + expires_at: map["expires_at"], + permissions: map["permissions"], + created_at: map["created_at"], + updated_at: map["updated_at"], + value: map["value"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "owner" => + WorkOS.Cast.dump_struct(struct.owner, &WorkOS.OrganizationApiKeyWithValueOwner.to_map/1), + "name" => struct.name, + "obfuscated_value" => struct.obfuscated_value, + "last_used_at" => struct.last_used_at, + "expires_at" => struct.expires_at, + "permissions" => struct.permissions, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at, + "value" => struct.value + }) + end +end diff --git a/lib/workos/organization_api_key_with_value_owner.ex b/lib/workos/organization_api_key_with_value_owner.ex new file mode 100644 index 00000000..3fafb7f1 --- /dev/null +++ b/lib/workos/organization_api_key_with_value_owner.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationApiKeyWithValueOwner do + @moduledoc """ + The entity that owns the API Key. + """ + + defstruct [ + :type, + :id + ] + + @type t :: %__MODULE__{ + type: String.t(), + id: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + type: map["type"], + id: map["id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "type" => struct.type, + "id" => struct.id + }) + end +end diff --git a/lib/workos/organization_authorized_connect_application_list.ex b/lib/workos/organization_authorized_connect_application_list.ex new file mode 100644 index 00000000..b4779319 --- /dev/null +++ b/lib/workos/organization_authorized_connect_application_list.ex @@ -0,0 +1,57 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationAuthorizedConnectApplicationList do + @moduledoc """ + OrganizationAuthorizedConnectApplicationList model. + """ + + defstruct [ + :object, + :data, + :list_metadata + ] + + @type t :: %__MODULE__{ + object: String.t(), + data: [WorkOS.OrganizationAuthorizedConnectApplicationListData.t()], + list_metadata: WorkOS.OrganizationAuthorizedConnectApplicationListListMetadata.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + data: + WorkOS.Cast.list( + map["data"], + &WorkOS.OrganizationAuthorizedConnectApplicationListData.from_map/1 + ), + list_metadata: + WorkOS.Cast.nested( + map["list_metadata"], + &WorkOS.OrganizationAuthorizedConnectApplicationListListMetadata.from_map/1 + ) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "data" => + WorkOS.Cast.list(struct.data, fn item -> + WorkOS.Cast.dump_struct( + item, + &WorkOS.OrganizationAuthorizedConnectApplicationListData.to_map/1 + ) + end), + "list_metadata" => + WorkOS.Cast.dump_struct( + struct.list_metadata, + &WorkOS.OrganizationAuthorizedConnectApplicationListListMetadata.to_map/1 + ) + }) + end +end diff --git a/lib/workos/organization_authorized_connect_application_list_data.ex b/lib/workos/organization_authorized_connect_application_list_data.ex new file mode 100644 index 00000000..c22eeb15 --- /dev/null +++ b/lib/workos/organization_authorized_connect_application_list_data.ex @@ -0,0 +1,52 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationAuthorizedConnectApplicationListData do + @moduledoc """ + OrganizationAuthorizedConnectApplicationListData model. + """ + + defstruct [ + :object, + :id, + :granted_scopes, + :application, + :user_id, + :oauth_resource + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + granted_scopes: [String.t()], + application: WorkOS.ConnectApplication.t(), + user_id: String.t(), + oauth_resource: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + granted_scopes: map["granted_scopes"], + application: WorkOS.Cast.nested(map["application"], &WorkOS.ConnectApplication.from_map/1), + user_id: map["user_id"], + oauth_resource: map["oauth_resource"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "granted_scopes" => struct.granted_scopes, + "application" => + WorkOS.Cast.dump_struct(struct.application, &WorkOS.ConnectApplication.to_map/1), + "user_id" => struct.user_id, + "oauth_resource" => struct.oauth_resource + }) + end +end diff --git a/lib/workos/organization_authorized_connect_application_list_list_metadata.ex b/lib/workos/organization_authorized_connect_application_list_list_metadata.ex new file mode 100644 index 00000000..842f3a19 --- /dev/null +++ b/lib/workos/organization_authorized_connect_application_list_list_metadata.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationAuthorizedConnectApplicationListListMetadata do + @moduledoc """ + Pagination cursors for navigating between pages of results. + """ + + defstruct [ + :before, + :after_ + ] + + @type t :: %__MODULE__{ + before: String.t() | nil, + after_: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + before: map["before"], + after_: map["after"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "before" => struct.before, + "after" => struct.after_ + }) + end +end diff --git a/lib/workos/organization_created.ex b/lib/workos/organization_created.ex new file mode 100644 index 00000000..eacd06d8 --- /dev/null +++ b/lib/workos/organization_created.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationCreated do + @moduledoc """ + OrganizationCreated model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.OrganizationCreatedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.OrganizationCreatedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => WorkOS.Cast.dump_struct(struct.data, &WorkOS.OrganizationCreatedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/organization_created_data.ex b/lib/workos/organization_created_data.ex new file mode 100644 index 00000000..c308bb9d --- /dev/null +++ b/lib/workos/organization_created_data.ex @@ -0,0 +1,66 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationCreatedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :object, + :id, + :name, + :domains, + :metadata, + :external_id, + :created_at, + :updated_at, + :stripe_customer_id + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + name: String.t(), + domains: [WorkOS.OrganizationCreatedDataDomain.t()], + metadata: %{optional(String.t()) => String.t()}, + external_id: String.t() | nil, + created_at: String.t(), + updated_at: String.t(), + stripe_customer_id: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + name: map["name"], + domains: WorkOS.Cast.list(map["domains"], &WorkOS.OrganizationCreatedDataDomain.from_map/1), + metadata: map["metadata"], + external_id: map["external_id"], + created_at: map["created_at"], + updated_at: map["updated_at"], + stripe_customer_id: map["stripe_customer_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "name" => struct.name, + "domains" => + WorkOS.Cast.list(struct.domains, fn item -> + WorkOS.Cast.dump_struct(item, &WorkOS.OrganizationCreatedDataDomain.to_map/1) + end), + "metadata" => struct.metadata, + "external_id" => struct.external_id, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at, + "stripe_customer_id" => struct.stripe_customer_id + }) + end +end diff --git a/lib/workos/organization_created_data_domain.ex b/lib/workos/organization_created_data_domain.ex new file mode 100644 index 00000000..e2bfce10 --- /dev/null +++ b/lib/workos/organization_created_data_domain.ex @@ -0,0 +1,77 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationCreatedDataDomain do + @moduledoc """ + OrganizationCreatedDataDomain model. + """ + + defstruct [ + :object, + :id, + :organization_id, + :domain, + :created_at, + :updated_at, + :state, + :verification_prefix, + :verification_token, + :verification_strategy + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + organization_id: String.t(), + domain: String.t(), + created_at: String.t(), + updated_at: String.t(), + state: WorkOS.OrganizationCreatedDataDomainState.t() | nil, + verification_prefix: String.t() | nil, + verification_token: String.t() | nil, + verification_strategy: + WorkOS.OrganizationCreatedDataDomainVerificationStrategy.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + organization_id: map["organization_id"], + domain: map["domain"], + created_at: map["created_at"], + updated_at: map["updated_at"], + state: WorkOS.Cast.enum(map["state"], &WorkOS.OrganizationCreatedDataDomainState.cast/1), + verification_prefix: map["verification_prefix"], + verification_token: map["verification_token"], + verification_strategy: + WorkOS.Cast.enum( + map["verification_strategy"], + &WorkOS.OrganizationCreatedDataDomainVerificationStrategy.cast/1 + ) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "organization_id" => struct.organization_id, + "domain" => struct.domain, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at, + "state" => + WorkOS.Cast.enum(struct.state, &WorkOS.OrganizationCreatedDataDomainState.dump/1), + "verification_prefix" => struct.verification_prefix, + "verification_token" => struct.verification_token, + "verification_strategy" => + WorkOS.Cast.enum( + struct.verification_strategy, + &WorkOS.OrganizationCreatedDataDomainVerificationStrategy.dump/1 + ) + }) + end +end diff --git a/lib/workos/organization_created_data_domain_state.ex b/lib/workos/organization_created_data_domain_state.ex new file mode 100644 index 00000000..0f01c9bb --- /dev/null +++ b/lib/workos/organization_created_data_domain_state.ex @@ -0,0 +1,31 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationCreatedDataDomainState do + @moduledoc """ + OrganizationCreatedDataDomainState enum. + """ + + @type t :: :failed | :legacy_verified | :pending | :unverified | :verified + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:failed, :legacy_verified, :pending, :unverified, :verified] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("failed"), do: :failed + def cast("legacy_verified"), do: :legacy_verified + def cast("pending"), do: :pending + def cast("unverified"), do: :unverified + def cast("verified"), do: :verified + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:failed), do: "failed" + def dump(:legacy_verified), do: "legacy_verified" + def dump(:pending), do: "pending" + def dump(:unverified), do: "unverified" + def dump(:verified), do: "verified" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/organization_created_data_domain_verification_strategy.ex b/lib/workos/organization_created_data_domain_verification_strategy.ex new file mode 100644 index 00000000..f11cceaf --- /dev/null +++ b/lib/workos/organization_created_data_domain_verification_strategy.ex @@ -0,0 +1,25 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationCreatedDataDomainVerificationStrategy do + @moduledoc """ + OrganizationCreatedDataDomainVerificationStrategy enum. + """ + + @type t :: :dns | :manual + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:dns, :manual] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("dns"), do: :dns + def cast("manual"), do: :manual + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:dns), do: "dns" + def dump(:manual), do: "manual" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/organization_deleted.ex b/lib/workos/organization_deleted.ex new file mode 100644 index 00000000..edee8eaa --- /dev/null +++ b/lib/workos/organization_deleted.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationDeleted do + @moduledoc """ + OrganizationDeleted model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.OrganizationDeletedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.OrganizationDeletedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => WorkOS.Cast.dump_struct(struct.data, &WorkOS.OrganizationDeletedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/organization_deleted_data.ex b/lib/workos/organization_deleted_data.ex new file mode 100644 index 00000000..678eb732 --- /dev/null +++ b/lib/workos/organization_deleted_data.ex @@ -0,0 +1,66 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationDeletedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :object, + :id, + :name, + :domains, + :metadata, + :external_id, + :created_at, + :updated_at, + :stripe_customer_id + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + name: String.t(), + domains: [WorkOS.OrganizationDeletedDataDomain.t()], + metadata: %{optional(String.t()) => String.t()}, + external_id: String.t() | nil, + created_at: String.t(), + updated_at: String.t(), + stripe_customer_id: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + name: map["name"], + domains: WorkOS.Cast.list(map["domains"], &WorkOS.OrganizationDeletedDataDomain.from_map/1), + metadata: map["metadata"], + external_id: map["external_id"], + created_at: map["created_at"], + updated_at: map["updated_at"], + stripe_customer_id: map["stripe_customer_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "name" => struct.name, + "domains" => + WorkOS.Cast.list(struct.domains, fn item -> + WorkOS.Cast.dump_struct(item, &WorkOS.OrganizationDeletedDataDomain.to_map/1) + end), + "metadata" => struct.metadata, + "external_id" => struct.external_id, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at, + "stripe_customer_id" => struct.stripe_customer_id + }) + end +end diff --git a/lib/workos/organization_deleted_data_domain.ex b/lib/workos/organization_deleted_data_domain.ex new file mode 100644 index 00000000..76423e16 --- /dev/null +++ b/lib/workos/organization_deleted_data_domain.ex @@ -0,0 +1,77 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationDeletedDataDomain do + @moduledoc """ + OrganizationDeletedDataDomain model. + """ + + defstruct [ + :object, + :id, + :organization_id, + :domain, + :created_at, + :updated_at, + :state, + :verification_prefix, + :verification_token, + :verification_strategy + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + organization_id: String.t(), + domain: String.t(), + created_at: String.t(), + updated_at: String.t(), + state: WorkOS.OrganizationDeletedDataDomainState.t() | nil, + verification_prefix: String.t() | nil, + verification_token: String.t() | nil, + verification_strategy: + WorkOS.OrganizationDeletedDataDomainVerificationStrategy.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + organization_id: map["organization_id"], + domain: map["domain"], + created_at: map["created_at"], + updated_at: map["updated_at"], + state: WorkOS.Cast.enum(map["state"], &WorkOS.OrganizationDeletedDataDomainState.cast/1), + verification_prefix: map["verification_prefix"], + verification_token: map["verification_token"], + verification_strategy: + WorkOS.Cast.enum( + map["verification_strategy"], + &WorkOS.OrganizationDeletedDataDomainVerificationStrategy.cast/1 + ) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "organization_id" => struct.organization_id, + "domain" => struct.domain, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at, + "state" => + WorkOS.Cast.enum(struct.state, &WorkOS.OrganizationDeletedDataDomainState.dump/1), + "verification_prefix" => struct.verification_prefix, + "verification_token" => struct.verification_token, + "verification_strategy" => + WorkOS.Cast.enum( + struct.verification_strategy, + &WorkOS.OrganizationDeletedDataDomainVerificationStrategy.dump/1 + ) + }) + end +end diff --git a/lib/workos/organization_deleted_data_domain_state.ex b/lib/workos/organization_deleted_data_domain_state.ex new file mode 100644 index 00000000..195dd519 --- /dev/null +++ b/lib/workos/organization_deleted_data_domain_state.ex @@ -0,0 +1,31 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationDeletedDataDomainState do + @moduledoc """ + OrganizationDeletedDataDomainState enum. + """ + + @type t :: :failed | :legacy_verified | :pending | :unverified | :verified + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:failed, :legacy_verified, :pending, :unverified, :verified] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("failed"), do: :failed + def cast("legacy_verified"), do: :legacy_verified + def cast("pending"), do: :pending + def cast("unverified"), do: :unverified + def cast("verified"), do: :verified + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:failed), do: "failed" + def dump(:legacy_verified), do: "legacy_verified" + def dump(:pending), do: "pending" + def dump(:unverified), do: "unverified" + def dump(:verified), do: "verified" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/organization_deleted_data_domain_verification_strategy.ex b/lib/workos/organization_deleted_data_domain_verification_strategy.ex new file mode 100644 index 00000000..71212574 --- /dev/null +++ b/lib/workos/organization_deleted_data_domain_verification_strategy.ex @@ -0,0 +1,25 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationDeletedDataDomainVerificationStrategy do + @moduledoc """ + OrganizationDeletedDataDomainVerificationStrategy enum. + """ + + @type t :: :dns | :manual + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:dns, :manual] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("dns"), do: :dns + def cast("manual"), do: :manual + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:dns), do: "dns" + def dump(:manual), do: "manual" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/organization_domain.ex b/lib/workos/organization_domain.ex new file mode 100644 index 00000000..27c61b32 --- /dev/null +++ b/lib/workos/organization_domain.ex @@ -0,0 +1,75 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationDomain do + @moduledoc """ + OrganizationDomain model. + """ + + defstruct [ + :object, + :id, + :organization_id, + :domain, + :created_at, + :updated_at, + :state, + :verification_prefix, + :verification_token, + :verification_strategy + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + organization_id: String.t(), + domain: String.t(), + created_at: String.t(), + updated_at: String.t(), + state: WorkOS.OrganizationDomainState.t() | nil, + verification_prefix: String.t() | nil, + verification_token: String.t() | nil, + verification_strategy: WorkOS.OrganizationDomainVerificationStrategy.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + organization_id: map["organization_id"], + domain: map["domain"], + created_at: map["created_at"], + updated_at: map["updated_at"], + state: WorkOS.Cast.enum(map["state"], &WorkOS.OrganizationDomainState.cast/1), + verification_prefix: map["verification_prefix"], + verification_token: map["verification_token"], + verification_strategy: + WorkOS.Cast.enum( + map["verification_strategy"], + &WorkOS.OrganizationDomainVerificationStrategy.cast/1 + ) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "organization_id" => struct.organization_id, + "domain" => struct.domain, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at, + "state" => WorkOS.Cast.enum(struct.state, &WorkOS.OrganizationDomainState.dump/1), + "verification_prefix" => struct.verification_prefix, + "verification_token" => struct.verification_token, + "verification_strategy" => + WorkOS.Cast.enum( + struct.verification_strategy, + &WorkOS.OrganizationDomainVerificationStrategy.dump/1 + ) + }) + end +end diff --git a/lib/workos/organization_domain_created.ex b/lib/workos/organization_domain_created.ex new file mode 100644 index 00000000..5a66b586 --- /dev/null +++ b/lib/workos/organization_domain_created.ex @@ -0,0 +1,52 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationDomainCreated do + @moduledoc """ + OrganizationDomainCreated model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.OrganizationDomainCreatedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.OrganizationDomainCreatedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => + WorkOS.Cast.dump_struct(struct.data, &WorkOS.OrganizationDomainCreatedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/organization_domain_created_data.ex b/lib/workos/organization_domain_created_data.ex new file mode 100644 index 00000000..77642a14 --- /dev/null +++ b/lib/workos/organization_domain_created_data.ex @@ -0,0 +1,77 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationDomainCreatedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :object, + :id, + :organization_id, + :domain, + :created_at, + :updated_at, + :state, + :verification_prefix, + :verification_token, + :verification_strategy + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + organization_id: String.t(), + domain: String.t(), + created_at: String.t(), + updated_at: String.t(), + state: WorkOS.OrganizationDomainCreatedDataState.t() | nil, + verification_prefix: String.t() | nil, + verification_token: String.t() | nil, + verification_strategy: + WorkOS.OrganizationDomainCreatedDataVerificationStrategy.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + organization_id: map["organization_id"], + domain: map["domain"], + created_at: map["created_at"], + updated_at: map["updated_at"], + state: WorkOS.Cast.enum(map["state"], &WorkOS.OrganizationDomainCreatedDataState.cast/1), + verification_prefix: map["verification_prefix"], + verification_token: map["verification_token"], + verification_strategy: + WorkOS.Cast.enum( + map["verification_strategy"], + &WorkOS.OrganizationDomainCreatedDataVerificationStrategy.cast/1 + ) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "organization_id" => struct.organization_id, + "domain" => struct.domain, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at, + "state" => + WorkOS.Cast.enum(struct.state, &WorkOS.OrganizationDomainCreatedDataState.dump/1), + "verification_prefix" => struct.verification_prefix, + "verification_token" => struct.verification_token, + "verification_strategy" => + WorkOS.Cast.enum( + struct.verification_strategy, + &WorkOS.OrganizationDomainCreatedDataVerificationStrategy.dump/1 + ) + }) + end +end diff --git a/lib/workos/organization_domain_created_data_state.ex b/lib/workos/organization_domain_created_data_state.ex new file mode 100644 index 00000000..6ef67cfe --- /dev/null +++ b/lib/workos/organization_domain_created_data_state.ex @@ -0,0 +1,31 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationDomainCreatedDataState do + @moduledoc """ + OrganizationDomainCreatedDataState enum. + """ + + @type t :: :failed | :legacy_verified | :pending | :unverified | :verified + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:failed, :legacy_verified, :pending, :unverified, :verified] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("failed"), do: :failed + def cast("legacy_verified"), do: :legacy_verified + def cast("pending"), do: :pending + def cast("unverified"), do: :unverified + def cast("verified"), do: :verified + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:failed), do: "failed" + def dump(:legacy_verified), do: "legacy_verified" + def dump(:pending), do: "pending" + def dump(:unverified), do: "unverified" + def dump(:verified), do: "verified" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/organization_domain_created_data_verification_strategy.ex b/lib/workos/organization_domain_created_data_verification_strategy.ex new file mode 100644 index 00000000..7bc57364 --- /dev/null +++ b/lib/workos/organization_domain_created_data_verification_strategy.ex @@ -0,0 +1,25 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationDomainCreatedDataVerificationStrategy do + @moduledoc """ + OrganizationDomainCreatedDataVerificationStrategy enum. + """ + + @type t :: :dns | :manual + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:dns, :manual] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("dns"), do: :dns + def cast("manual"), do: :manual + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:dns), do: "dns" + def dump(:manual), do: "manual" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/organization_domain_data.ex b/lib/workos/organization_domain_data.ex new file mode 100644 index 00000000..bd916f5f --- /dev/null +++ b/lib/workos/organization_domain_data.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationDomainData do + @moduledoc """ + OrganizationDomainData model. + """ + + defstruct [ + :domain, + :state + ] + + @type t :: %__MODULE__{ + domain: String.t(), + state: WorkOS.OrganizationDomainDataState.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + domain: map["domain"], + state: WorkOS.Cast.enum(map["state"], &WorkOS.OrganizationDomainDataState.cast/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "domain" => struct.domain, + "state" => WorkOS.Cast.enum(struct.state, &WorkOS.OrganizationDomainDataState.dump/1) + }) + end +end diff --git a/lib/workos/organization_domain_data_state.ex b/lib/workos/organization_domain_data_state.ex new file mode 100644 index 00000000..0f51f489 --- /dev/null +++ b/lib/workos/organization_domain_data_state.ex @@ -0,0 +1,25 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationDomainDataState do + @moduledoc """ + OrganizationDomainDataState enum. + """ + + @type t :: :pending | :verified + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:pending, :verified] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("pending"), do: :pending + def cast("verified"), do: :verified + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:pending), do: "pending" + def dump(:verified), do: "verified" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/organization_domain_deleted.ex b/lib/workos/organization_domain_deleted.ex new file mode 100644 index 00000000..00add8e9 --- /dev/null +++ b/lib/workos/organization_domain_deleted.ex @@ -0,0 +1,52 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationDomainDeleted do + @moduledoc """ + OrganizationDomainDeleted model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.OrganizationDomainDeletedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.OrganizationDomainDeletedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => + WorkOS.Cast.dump_struct(struct.data, &WorkOS.OrganizationDomainDeletedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/organization_domain_deleted_data.ex b/lib/workos/organization_domain_deleted_data.ex new file mode 100644 index 00000000..1ca16fed --- /dev/null +++ b/lib/workos/organization_domain_deleted_data.ex @@ -0,0 +1,77 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationDomainDeletedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :object, + :id, + :organization_id, + :domain, + :created_at, + :updated_at, + :state, + :verification_prefix, + :verification_token, + :verification_strategy + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + organization_id: String.t(), + domain: String.t(), + created_at: String.t(), + updated_at: String.t(), + state: WorkOS.OrganizationDomainDeletedDataState.t() | nil, + verification_prefix: String.t() | nil, + verification_token: String.t() | nil, + verification_strategy: + WorkOS.OrganizationDomainDeletedDataVerificationStrategy.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + organization_id: map["organization_id"], + domain: map["domain"], + created_at: map["created_at"], + updated_at: map["updated_at"], + state: WorkOS.Cast.enum(map["state"], &WorkOS.OrganizationDomainDeletedDataState.cast/1), + verification_prefix: map["verification_prefix"], + verification_token: map["verification_token"], + verification_strategy: + WorkOS.Cast.enum( + map["verification_strategy"], + &WorkOS.OrganizationDomainDeletedDataVerificationStrategy.cast/1 + ) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "organization_id" => struct.organization_id, + "domain" => struct.domain, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at, + "state" => + WorkOS.Cast.enum(struct.state, &WorkOS.OrganizationDomainDeletedDataState.dump/1), + "verification_prefix" => struct.verification_prefix, + "verification_token" => struct.verification_token, + "verification_strategy" => + WorkOS.Cast.enum( + struct.verification_strategy, + &WorkOS.OrganizationDomainDeletedDataVerificationStrategy.dump/1 + ) + }) + end +end diff --git a/lib/workos/organization_domain_deleted_data_state.ex b/lib/workos/organization_domain_deleted_data_state.ex new file mode 100644 index 00000000..198be690 --- /dev/null +++ b/lib/workos/organization_domain_deleted_data_state.ex @@ -0,0 +1,31 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationDomainDeletedDataState do + @moduledoc """ + OrganizationDomainDeletedDataState enum. + """ + + @type t :: :failed | :legacy_verified | :pending | :unverified | :verified + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:failed, :legacy_verified, :pending, :unverified, :verified] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("failed"), do: :failed + def cast("legacy_verified"), do: :legacy_verified + def cast("pending"), do: :pending + def cast("unverified"), do: :unverified + def cast("verified"), do: :verified + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:failed), do: "failed" + def dump(:legacy_verified), do: "legacy_verified" + def dump(:pending), do: "pending" + def dump(:unverified), do: "unverified" + def dump(:verified), do: "verified" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/organization_domain_deleted_data_verification_strategy.ex b/lib/workos/organization_domain_deleted_data_verification_strategy.ex new file mode 100644 index 00000000..ea8c4a71 --- /dev/null +++ b/lib/workos/organization_domain_deleted_data_verification_strategy.ex @@ -0,0 +1,25 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationDomainDeletedDataVerificationStrategy do + @moduledoc """ + OrganizationDomainDeletedDataVerificationStrategy enum. + """ + + @type t :: :dns | :manual + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:dns, :manual] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("dns"), do: :dns + def cast("manual"), do: :manual + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:dns), do: "dns" + def dump(:manual), do: "manual" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/organization_domain_state.ex b/lib/workos/organization_domain_state.ex new file mode 100644 index 00000000..a8614712 --- /dev/null +++ b/lib/workos/organization_domain_state.ex @@ -0,0 +1,31 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationDomainState do + @moduledoc """ + OrganizationDomainState enum. + """ + + @type t :: :failed | :legacy_verified | :pending | :unverified | :verified + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:failed, :legacy_verified, :pending, :unverified, :verified] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("failed"), do: :failed + def cast("legacy_verified"), do: :legacy_verified + def cast("pending"), do: :pending + def cast("unverified"), do: :unverified + def cast("verified"), do: :verified + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:failed), do: "failed" + def dump(:legacy_verified), do: "legacy_verified" + def dump(:pending), do: "pending" + def dump(:unverified), do: "unverified" + def dump(:verified), do: "verified" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/organization_domain_updated.ex b/lib/workos/organization_domain_updated.ex new file mode 100644 index 00000000..73b2d835 --- /dev/null +++ b/lib/workos/organization_domain_updated.ex @@ -0,0 +1,52 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationDomainUpdated do + @moduledoc """ + OrganizationDomainUpdated model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.OrganizationDomainUpdatedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.OrganizationDomainUpdatedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => + WorkOS.Cast.dump_struct(struct.data, &WorkOS.OrganizationDomainUpdatedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/organization_domain_updated_data.ex b/lib/workos/organization_domain_updated_data.ex new file mode 100644 index 00000000..66fcf3ce --- /dev/null +++ b/lib/workos/organization_domain_updated_data.ex @@ -0,0 +1,77 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationDomainUpdatedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :object, + :id, + :organization_id, + :domain, + :created_at, + :updated_at, + :state, + :verification_prefix, + :verification_token, + :verification_strategy + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + organization_id: String.t(), + domain: String.t(), + created_at: String.t(), + updated_at: String.t(), + state: WorkOS.OrganizationDomainUpdatedDataState.t() | nil, + verification_prefix: String.t() | nil, + verification_token: String.t() | nil, + verification_strategy: + WorkOS.OrganizationDomainUpdatedDataVerificationStrategy.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + organization_id: map["organization_id"], + domain: map["domain"], + created_at: map["created_at"], + updated_at: map["updated_at"], + state: WorkOS.Cast.enum(map["state"], &WorkOS.OrganizationDomainUpdatedDataState.cast/1), + verification_prefix: map["verification_prefix"], + verification_token: map["verification_token"], + verification_strategy: + WorkOS.Cast.enum( + map["verification_strategy"], + &WorkOS.OrganizationDomainUpdatedDataVerificationStrategy.cast/1 + ) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "organization_id" => struct.organization_id, + "domain" => struct.domain, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at, + "state" => + WorkOS.Cast.enum(struct.state, &WorkOS.OrganizationDomainUpdatedDataState.dump/1), + "verification_prefix" => struct.verification_prefix, + "verification_token" => struct.verification_token, + "verification_strategy" => + WorkOS.Cast.enum( + struct.verification_strategy, + &WorkOS.OrganizationDomainUpdatedDataVerificationStrategy.dump/1 + ) + }) + end +end diff --git a/lib/workos/organization_domain_updated_data_state.ex b/lib/workos/organization_domain_updated_data_state.ex new file mode 100644 index 00000000..b287c8c8 --- /dev/null +++ b/lib/workos/organization_domain_updated_data_state.ex @@ -0,0 +1,31 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationDomainUpdatedDataState do + @moduledoc """ + OrganizationDomainUpdatedDataState enum. + """ + + @type t :: :failed | :legacy_verified | :pending | :unverified | :verified + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:failed, :legacy_verified, :pending, :unverified, :verified] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("failed"), do: :failed + def cast("legacy_verified"), do: :legacy_verified + def cast("pending"), do: :pending + def cast("unverified"), do: :unverified + def cast("verified"), do: :verified + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:failed), do: "failed" + def dump(:legacy_verified), do: "legacy_verified" + def dump(:pending), do: "pending" + def dump(:unverified), do: "unverified" + def dump(:verified), do: "verified" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/organization_domain_updated_data_verification_strategy.ex b/lib/workos/organization_domain_updated_data_verification_strategy.ex new file mode 100644 index 00000000..acc137ce --- /dev/null +++ b/lib/workos/organization_domain_updated_data_verification_strategy.ex @@ -0,0 +1,25 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationDomainUpdatedDataVerificationStrategy do + @moduledoc """ + OrganizationDomainUpdatedDataVerificationStrategy enum. + """ + + @type t :: :dns | :manual + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:dns, :manual] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("dns"), do: :dns + def cast("manual"), do: :manual + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:dns), do: "dns" + def dump(:manual), do: "manual" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/organization_domain_verification_failed.ex b/lib/workos/organization_domain_verification_failed.ex new file mode 100644 index 00000000..8ed7f7bc --- /dev/null +++ b/lib/workos/organization_domain_verification_failed.ex @@ -0,0 +1,59 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationDomainVerificationFailed do + @moduledoc """ + OrganizationDomainVerificationFailed model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.OrganizationDomainVerificationFailedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: + WorkOS.Cast.nested( + map["data"], + &WorkOS.OrganizationDomainVerificationFailedData.from_map/1 + ), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => + WorkOS.Cast.dump_struct( + struct.data, + &WorkOS.OrganizationDomainVerificationFailedData.to_map/1 + ), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/organization_domain_verification_failed_data.ex b/lib/workos/organization_domain_verification_failed_data.ex new file mode 100644 index 00000000..573b792d --- /dev/null +++ b/lib/workos/organization_domain_verification_failed_data.ex @@ -0,0 +1,52 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationDomainVerificationFailedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :reason, + :organization_domain + ] + + @type t :: %__MODULE__{ + reason: WorkOS.OrganizationDomainVerificationFailedDataReason.t(), + organization_domain: + WorkOS.OrganizationDomainVerificationFailedDataOrganizationDomain.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + reason: + WorkOS.Cast.enum( + map["reason"], + &WorkOS.OrganizationDomainVerificationFailedDataReason.cast/1 + ), + organization_domain: + WorkOS.Cast.nested( + map["organization_domain"], + &WorkOS.OrganizationDomainVerificationFailedDataOrganizationDomain.from_map/1 + ) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "reason" => + WorkOS.Cast.enum( + struct.reason, + &WorkOS.OrganizationDomainVerificationFailedDataReason.dump/1 + ), + "organization_domain" => + WorkOS.Cast.dump_struct( + struct.organization_domain, + &WorkOS.OrganizationDomainVerificationFailedDataOrganizationDomain.to_map/1 + ) + }) + end +end diff --git a/lib/workos/organization_domain_verification_failed_data_organization_domain.ex b/lib/workos/organization_domain_verification_failed_data_organization_domain.ex new file mode 100644 index 00000000..f79907da --- /dev/null +++ b/lib/workos/organization_domain_verification_failed_data_organization_domain.ex @@ -0,0 +1,85 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationDomainVerificationFailedDataOrganizationDomain do + @moduledoc """ + The organization domain that failed verification. + """ + + defstruct [ + :object, + :id, + :organization_id, + :domain, + :created_at, + :updated_at, + :state, + :verification_prefix, + :verification_token, + :verification_strategy + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + organization_id: String.t(), + domain: String.t(), + created_at: String.t(), + updated_at: String.t(), + state: WorkOS.OrganizationDomainVerificationFailedDataOrganizationDomainState.t() | nil, + verification_prefix: String.t() | nil, + verification_token: String.t() | nil, + verification_strategy: + WorkOS.OrganizationDomainVerificationFailedDataOrganizationDomainVerificationStrategy.t() + | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + organization_id: map["organization_id"], + domain: map["domain"], + created_at: map["created_at"], + updated_at: map["updated_at"], + state: + WorkOS.Cast.enum( + map["state"], + &WorkOS.OrganizationDomainVerificationFailedDataOrganizationDomainState.cast/1 + ), + verification_prefix: map["verification_prefix"], + verification_token: map["verification_token"], + verification_strategy: + WorkOS.Cast.enum( + map["verification_strategy"], + &WorkOS.OrganizationDomainVerificationFailedDataOrganizationDomainVerificationStrategy.cast/1 + ) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "organization_id" => struct.organization_id, + "domain" => struct.domain, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at, + "state" => + WorkOS.Cast.enum( + struct.state, + &WorkOS.OrganizationDomainVerificationFailedDataOrganizationDomainState.dump/1 + ), + "verification_prefix" => struct.verification_prefix, + "verification_token" => struct.verification_token, + "verification_strategy" => + WorkOS.Cast.enum( + struct.verification_strategy, + &WorkOS.OrganizationDomainVerificationFailedDataOrganizationDomainVerificationStrategy.dump/1 + ) + }) + end +end diff --git a/lib/workos/organization_domain_verification_failed_data_organization_domain_state.ex b/lib/workos/organization_domain_verification_failed_data_organization_domain_state.ex new file mode 100644 index 00000000..44c081b4 --- /dev/null +++ b/lib/workos/organization_domain_verification_failed_data_organization_domain_state.ex @@ -0,0 +1,31 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationDomainVerificationFailedDataOrganizationDomainState do + @moduledoc """ + OrganizationDomainVerificationFailedDataOrganizationDomainState enum. + """ + + @type t :: :failed | :legacy_verified | :pending | :unverified | :verified + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:failed, :legacy_verified, :pending, :unverified, :verified] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("failed"), do: :failed + def cast("legacy_verified"), do: :legacy_verified + def cast("pending"), do: :pending + def cast("unverified"), do: :unverified + def cast("verified"), do: :verified + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:failed), do: "failed" + def dump(:legacy_verified), do: "legacy_verified" + def dump(:pending), do: "pending" + def dump(:unverified), do: "unverified" + def dump(:verified), do: "verified" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/organization_domain_verification_failed_data_organization_domain_verification_strategy.ex b/lib/workos/organization_domain_verification_failed_data_organization_domain_verification_strategy.ex new file mode 100644 index 00000000..bf364d68 --- /dev/null +++ b/lib/workos/organization_domain_verification_failed_data_organization_domain_verification_strategy.ex @@ -0,0 +1,25 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationDomainVerificationFailedDataOrganizationDomainVerificationStrategy do + @moduledoc """ + OrganizationDomainVerificationFailedDataOrganizationDomainVerificationStrategy enum. + """ + + @type t :: :dns | :manual + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:dns, :manual] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("dns"), do: :dns + def cast("manual"), do: :manual + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:dns), do: "dns" + def dump(:manual), do: "manual" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/organization_domain_verification_failed_data_reason.ex b/lib/workos/organization_domain_verification_failed_data_reason.ex new file mode 100644 index 00000000..49d407a6 --- /dev/null +++ b/lib/workos/organization_domain_verification_failed_data_reason.ex @@ -0,0 +1,25 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationDomainVerificationFailedDataReason do + @moduledoc """ + OrganizationDomainVerificationFailedDataReason enum. + """ + + @type t :: :domain_verification_period_expired | :domain_verified_by_other_organization + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:domain_verification_period_expired, :domain_verified_by_other_organization] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("domain_verification_period_expired"), do: :domain_verification_period_expired + def cast("domain_verified_by_other_organization"), do: :domain_verified_by_other_organization + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:domain_verification_period_expired), do: "domain_verification_period_expired" + def dump(:domain_verified_by_other_organization), do: "domain_verified_by_other_organization" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/organization_domain_verification_strategy.ex b/lib/workos/organization_domain_verification_strategy.ex new file mode 100644 index 00000000..13489c68 --- /dev/null +++ b/lib/workos/organization_domain_verification_strategy.ex @@ -0,0 +1,25 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationDomainVerificationStrategy do + @moduledoc """ + OrganizationDomainVerificationStrategy enum. + """ + + @type t :: :dns | :manual + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:dns, :manual] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("dns"), do: :dns + def cast("manual"), do: :manual + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:dns), do: "dns" + def dump(:manual), do: "manual" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/organization_domain_verified.ex b/lib/workos/organization_domain_verified.ex new file mode 100644 index 00000000..5ec8bef1 --- /dev/null +++ b/lib/workos/organization_domain_verified.ex @@ -0,0 +1,52 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationDomainVerified do + @moduledoc """ + OrganizationDomainVerified model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.OrganizationDomainVerifiedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.OrganizationDomainVerifiedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => + WorkOS.Cast.dump_struct(struct.data, &WorkOS.OrganizationDomainVerifiedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/organization_domain_verified_data.ex b/lib/workos/organization_domain_verified_data.ex new file mode 100644 index 00000000..175fa8fd --- /dev/null +++ b/lib/workos/organization_domain_verified_data.ex @@ -0,0 +1,77 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationDomainVerifiedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :object, + :id, + :organization_id, + :domain, + :created_at, + :updated_at, + :state, + :verification_prefix, + :verification_token, + :verification_strategy + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + organization_id: String.t(), + domain: String.t(), + created_at: String.t(), + updated_at: String.t(), + state: WorkOS.OrganizationDomainVerifiedDataState.t() | nil, + verification_prefix: String.t() | nil, + verification_token: String.t() | nil, + verification_strategy: + WorkOS.OrganizationDomainVerifiedDataVerificationStrategy.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + organization_id: map["organization_id"], + domain: map["domain"], + created_at: map["created_at"], + updated_at: map["updated_at"], + state: WorkOS.Cast.enum(map["state"], &WorkOS.OrganizationDomainVerifiedDataState.cast/1), + verification_prefix: map["verification_prefix"], + verification_token: map["verification_token"], + verification_strategy: + WorkOS.Cast.enum( + map["verification_strategy"], + &WorkOS.OrganizationDomainVerifiedDataVerificationStrategy.cast/1 + ) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "organization_id" => struct.organization_id, + "domain" => struct.domain, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at, + "state" => + WorkOS.Cast.enum(struct.state, &WorkOS.OrganizationDomainVerifiedDataState.dump/1), + "verification_prefix" => struct.verification_prefix, + "verification_token" => struct.verification_token, + "verification_strategy" => + WorkOS.Cast.enum( + struct.verification_strategy, + &WorkOS.OrganizationDomainVerifiedDataVerificationStrategy.dump/1 + ) + }) + end +end diff --git a/lib/workos/organization_domain_verified_data_state.ex b/lib/workos/organization_domain_verified_data_state.ex new file mode 100644 index 00000000..9c1a28e0 --- /dev/null +++ b/lib/workos/organization_domain_verified_data_state.ex @@ -0,0 +1,31 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationDomainVerifiedDataState do + @moduledoc """ + OrganizationDomainVerifiedDataState enum. + """ + + @type t :: :failed | :legacy_verified | :pending | :unverified | :verified + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:failed, :legacy_verified, :pending, :unverified, :verified] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("failed"), do: :failed + def cast("legacy_verified"), do: :legacy_verified + def cast("pending"), do: :pending + def cast("unverified"), do: :unverified + def cast("verified"), do: :verified + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:failed), do: "failed" + def dump(:legacy_verified), do: "legacy_verified" + def dump(:pending), do: "pending" + def dump(:unverified), do: "unverified" + def dump(:verified), do: "verified" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/organization_domain_verified_data_verification_strategy.ex b/lib/workos/organization_domain_verified_data_verification_strategy.ex new file mode 100644 index 00000000..00e061c1 --- /dev/null +++ b/lib/workos/organization_domain_verified_data_verification_strategy.ex @@ -0,0 +1,25 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationDomainVerifiedDataVerificationStrategy do + @moduledoc """ + OrganizationDomainVerifiedDataVerificationStrategy enum. + """ + + @type t :: :dns | :manual + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:dns, :manual] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("dns"), do: :dns + def cast("manual"), do: :manual + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:dns), do: "dns" + def dump(:manual), do: "manual" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/organization_domains.ex b/lib/workos/organization_domains.ex index a053ed55..00b2223f 100644 --- a/lib/workos/organization_domains.ex +++ b/lib/workos/organization_domains.ex @@ -1,62 +1,98 @@ +# This file is auto-generated by oagen. Do not edit. + defmodule WorkOS.OrganizationDomains do @moduledoc """ - Manage Organization Domains in WorkOS. - - @see https://workos.com/docs/reference/domain-verification + Operations for the OrganizationDomains API. """ - alias WorkOS.OrganizationDomains.OrganizationDomain + @doc """ + Create an Organization Domain + + Creates a new Organization Domain. + + ## Parameters + + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec create_organization_domain(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.OrganizationDomain.t()} | {:error, WorkOS.Error.error()} + def create_organization_domain(client, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request(client, :post, "/organization_domains", params, opts) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.OrganizationDomain.from_map/1)} + end + end @doc """ - Gets an organization domain given an ID. + Get an Organization Domain + + Get the details of an existing organization domain. + + ## Parameters + + * `id` — Unique identifier of the organization domain. + * `opts` — per-request options (see `WorkOS.Client.request/5`) """ - @spec get_organization_domain(String.t()) :: WorkOS.Client.response(OrganizationDomain.t()) - @spec get_organization_domain(WorkOS.Client.t(), String.t()) :: - WorkOS.Client.response(OrganizationDomain.t()) - def get_organization_domain(client \\ WorkOS.client(), organization_domain_id) do - WorkOS.Client.get(client, OrganizationDomain, "/organization_domains/:id", - opts: [ - path_params: [id: organization_domain_id] - ] - ) + @spec get_organization_domain(WorkOS.Client.t(), String.t(), keyword()) :: + {:ok, WorkOS.OrganizationDomain.t()} | {:error, WorkOS.Error.error()} + def get_organization_domain(client, id, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :get, + "/organization_domains/#{URI.encode(id, &URI.char_unreserved?/1)}", + %{}, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.OrganizationDomain.from_map/1)} + end end @doc """ - Creates an organization domain. + Delete an Organization Domain - Parameter options: + Permanently deletes an organization domain. It cannot be undone. - * `:organization_id` - ID of the parent Organization. (required) - * `:domain` - Domain for the Organization Domain. (required) + ## Parameters + * `id` — Unique identifier of the organization domain. + * `opts` — per-request options (see `WorkOS.Client.request/5`) """ - @spec create_organization_domain(map()) :: WorkOS.Client.response(OrganizationDomain.t()) - @spec create_organization_domain(WorkOS.Client.t(), map()) :: - WorkOS.Client.response(OrganizationDomain.t()) - def create_organization_domain(client \\ WorkOS.client(), opts) - when is_map_key(opts, :organization_id) and is_map_key(opts, :domain) do - WorkOS.Client.post( + @spec delete_organization_domain(WorkOS.Client.t(), String.t(), keyword()) :: + {:ok, term()} | {:error, WorkOS.Error.error()} + def delete_organization_domain(client, id, opts \\ []) do + WorkOS.Client.request( client, - OrganizationDomain, - "/organization_domains", - %{ - organization_id: opts[:organization_id], - domain: opts[:domain] - } + :delete, + "/organization_domains/#{URI.encode(id, &URI.char_unreserved?/1)}", + %{}, + opts ) end @doc """ - Verifies an organization domain + Verify an Organization Domain + + Initiates verification process for an Organization Domain. + + ## Parameters + + * `id` — Unique identifier of the organization domain. + * `opts` — per-request options (see `WorkOS.Client.request/5`) """ - @spec verify_organization_domain(String.t()) :: WorkOS.Client.response(OrganizationDomain.t()) - @spec verify_organization_domain(WorkOS.Client.t(), String.t()) :: - WorkOS.Client.response(OrganizationDomain.t()) - def verify_organization_domain(client \\ WorkOS.client(), organization_domain_id) do - WorkOS.Client.post(client, OrganizationDomain, "/organization_domains/:id/verify", %{}, - opts: [ - path_params: [id: organization_domain_id] - ] - ) + @spec verify_organization_domain(WorkOS.Client.t(), String.t(), keyword()) :: + {:ok, WorkOS.OrganizationDomain.t()} | {:error, WorkOS.Error.error()} + def verify_organization_domain(client, id, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :post, + "/organization_domains/#{URI.encode(id, &URI.char_unreserved?/1)}/verify", + %{}, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.OrganizationDomain.from_map/1)} + end end end diff --git a/lib/workos/organization_domains/organization_domain.ex b/lib/workos/organization_domains/organization_domain.ex deleted file mode 100644 index 18860fad..00000000 --- a/lib/workos/organization_domains/organization_domain.ex +++ /dev/null @@ -1,45 +0,0 @@ -defmodule WorkOS.OrganizationDomains.OrganizationDomain do - @moduledoc """ - WorkOS Organization Domain struct. - """ - - @behaviour WorkOS.Castable - - @type t() :: %__MODULE__{ - id: String.t(), - organization_id: String.t(), - domain: String.t(), - state: String.t(), - verification_strategy: String.t(), - verification_token: String.t() - } - - @enforce_keys [ - :id, - :organization_id, - :domain, - :state, - :verification_strategy, - :verification_token - ] - defstruct [ - :id, - :organization_id, - :domain, - :state, - :verification_strategy, - :verification_token - ] - - @impl true - def cast(map) do - %__MODULE__{ - id: map["id"], - organization_id: map["organization_id"], - domain: map["domain"], - state: map["state"], - verification_strategy: map["verification_strategy"], - verification_token: map["verification_token"] - } - end -end diff --git a/lib/workos/organization_input.ex b/lib/workos/organization_input.ex new file mode 100644 index 00000000..b973c2cb --- /dev/null +++ b/lib/workos/organization_input.ex @@ -0,0 +1,55 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationInput do + @moduledoc """ + OrganizationInput model. + """ + + defstruct [ + :name, + :allow_profiles_outside_organization, + :domains, + :domain_data, + :metadata, + :external_id + ] + + @type t :: %__MODULE__{ + name: String.t(), + allow_profiles_outside_organization: boolean() | nil, + domains: [String.t()] | nil, + domain_data: [WorkOS.OrganizationDomainData.t()] | nil, + metadata: %{optional(String.t()) => String.t()} | nil, + external_id: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + name: map["name"], + allow_profiles_outside_organization: map["allow_profiles_outside_organization"], + domains: map["domains"], + domain_data: + WorkOS.Cast.list(map["domain_data"], &WorkOS.OrganizationDomainData.from_map/1), + metadata: map["metadata"], + external_id: map["external_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "name" => struct.name, + "allow_profiles_outside_organization" => struct.allow_profiles_outside_organization, + "domains" => struct.domains, + "domain_data" => + WorkOS.Cast.list(struct.domain_data, fn item -> + WorkOS.Cast.dump_struct(item, &WorkOS.OrganizationDomainData.to_map/1) + end), + "metadata" => struct.metadata, + "external_id" => struct.external_id + }) + end +end diff --git a/lib/workos/organization_list.ex b/lib/workos/organization_list.ex new file mode 100644 index 00000000..ecf5b310 --- /dev/null +++ b/lib/workos/organization_list.ex @@ -0,0 +1,47 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationList do + @moduledoc """ + OrganizationList model. + """ + + defstruct [ + :object, + :data, + :list_metadata + ] + + @type t :: %__MODULE__{ + object: String.t(), + data: [WorkOS.Organization.t()], + list_metadata: WorkOS.OrganizationListListMetadata.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + data: WorkOS.Cast.list(map["data"], &WorkOS.Organization.from_map/1), + list_metadata: + WorkOS.Cast.nested(map["list_metadata"], &WorkOS.OrganizationListListMetadata.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "data" => + WorkOS.Cast.list(struct.data, fn item -> + WorkOS.Cast.dump_struct(item, &WorkOS.Organization.to_map/1) + end), + "list_metadata" => + WorkOS.Cast.dump_struct( + struct.list_metadata, + &WorkOS.OrganizationListListMetadata.to_map/1 + ) + }) + end +end diff --git a/lib/workos/organization_list_list_metadata.ex b/lib/workos/organization_list_list_metadata.ex new file mode 100644 index 00000000..eeb95b9f --- /dev/null +++ b/lib/workos/organization_list_list_metadata.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationListListMetadata do + @moduledoc """ + Pagination cursors for navigating between pages of results. + """ + + defstruct [ + :before, + :after_ + ] + + @type t :: %__MODULE__{ + before: String.t() | nil, + after_: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + before: map["before"], + after_: map["after"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "before" => struct.before, + "after" => struct.after_ + }) + end +end diff --git a/lib/workos/organization_membership.ex b/lib/workos/organization_membership.ex new file mode 100644 index 00000000..04aa91a4 --- /dev/null +++ b/lib/workos/organization_membership.ex @@ -0,0 +1,82 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationMembership do + @moduledoc """ + OrganizationMembership model. + """ + + defstruct [ + :object, + :id, + :user_id, + :organization_id, + :status, + :directory_managed, + :created_at, + :updated_at, + :role, + :roles, + :user, + :organization_name, + :custom_attributes + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + user_id: String.t(), + organization_id: String.t(), + status: WorkOS.OrganizationMembershipStatus.t(), + directory_managed: boolean(), + created_at: String.t(), + updated_at: String.t(), + role: WorkOS.SlimRole.t(), + roles: [WorkOS.SlimRole.t()], + user: WorkOS.User.t(), + organization_name: String.t() | nil, + custom_attributes: %{optional(String.t()) => term()} | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + user_id: map["user_id"], + organization_id: map["organization_id"], + status: WorkOS.Cast.enum(map["status"], &WorkOS.OrganizationMembershipStatus.cast/1), + directory_managed: map["directory_managed"], + created_at: map["created_at"], + updated_at: map["updated_at"], + role: WorkOS.Cast.nested(map["role"], &WorkOS.SlimRole.from_map/1), + roles: WorkOS.Cast.list(map["roles"], &WorkOS.SlimRole.from_map/1), + user: WorkOS.Cast.nested(map["user"], &WorkOS.User.from_map/1), + organization_name: map["organization_name"], + custom_attributes: map["custom_attributes"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "user_id" => struct.user_id, + "organization_id" => struct.organization_id, + "status" => WorkOS.Cast.enum(struct.status, &WorkOS.OrganizationMembershipStatus.dump/1), + "directory_managed" => struct.directory_managed, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at, + "role" => WorkOS.Cast.dump_struct(struct.role, &WorkOS.SlimRole.to_map/1), + "roles" => + WorkOS.Cast.list(struct.roles, fn item -> + WorkOS.Cast.dump_struct(item, &WorkOS.SlimRole.to_map/1) + end), + "user" => WorkOS.Cast.dump_struct(struct.user, &WorkOS.User.to_map/1), + "organization_name" => struct.organization_name, + "custom_attributes" => struct.custom_attributes + }) + end +end diff --git a/lib/workos/organization_membership_created.ex b/lib/workos/organization_membership_created.ex new file mode 100644 index 00000000..573988da --- /dev/null +++ b/lib/workos/organization_membership_created.ex @@ -0,0 +1,52 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationMembershipCreated do + @moduledoc """ + OrganizationMembershipCreated model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.OrganizationMembershipCreatedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.OrganizationMembershipCreatedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => + WorkOS.Cast.dump_struct(struct.data, &WorkOS.OrganizationMembershipCreatedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/organization_membership_created_data.ex b/lib/workos/organization_membership_created_data.ex new file mode 100644 index 00000000..e4d09a95 --- /dev/null +++ b/lib/workos/organization_membership_created_data.ex @@ -0,0 +1,76 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationMembershipCreatedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :object, + :id, + :user_id, + :organization_id, + :status, + :role, + :custom_attributes, + :directory_managed, + :created_at, + :updated_at, + :roles + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + user_id: String.t(), + organization_id: String.t(), + status: WorkOS.OrganizationMembershipCreatedDataStatus.t(), + role: WorkOS.SlimRole.t(), + custom_attributes: %{optional(String.t()) => term()}, + directory_managed: boolean(), + created_at: String.t(), + updated_at: String.t(), + roles: [WorkOS.SlimRole.t()] | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + user_id: map["user_id"], + organization_id: map["organization_id"], + status: + WorkOS.Cast.enum(map["status"], &WorkOS.OrganizationMembershipCreatedDataStatus.cast/1), + role: WorkOS.Cast.nested(map["role"], &WorkOS.SlimRole.from_map/1), + custom_attributes: map["custom_attributes"], + directory_managed: map["directory_managed"], + created_at: map["created_at"], + updated_at: map["updated_at"], + roles: WorkOS.Cast.list(map["roles"], &WorkOS.SlimRole.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "user_id" => struct.user_id, + "organization_id" => struct.organization_id, + "status" => + WorkOS.Cast.enum(struct.status, &WorkOS.OrganizationMembershipCreatedDataStatus.dump/1), + "role" => WorkOS.Cast.dump_struct(struct.role, &WorkOS.SlimRole.to_map/1), + "custom_attributes" => struct.custom_attributes, + "directory_managed" => struct.directory_managed, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at, + "roles" => + WorkOS.Cast.list(struct.roles, fn item -> + WorkOS.Cast.dump_struct(item, &WorkOS.SlimRole.to_map/1) + end) + }) + end +end diff --git a/lib/workos/organization_membership_created_data_status.ex b/lib/workos/organization_membership_created_data_status.ex new file mode 100644 index 00000000..90709d2b --- /dev/null +++ b/lib/workos/organization_membership_created_data_status.ex @@ -0,0 +1,27 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationMembershipCreatedDataStatus do + @moduledoc """ + OrganizationMembershipCreatedDataStatus enum. + """ + + @type t :: :active | :inactive | :pending + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:active, :inactive, :pending] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("active"), do: :active + def cast("inactive"), do: :inactive + def cast("pending"), do: :pending + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:active), do: "active" + def dump(:inactive), do: "inactive" + def dump(:pending), do: "pending" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/organization_membership_deleted.ex b/lib/workos/organization_membership_deleted.ex new file mode 100644 index 00000000..0f53de7d --- /dev/null +++ b/lib/workos/organization_membership_deleted.ex @@ -0,0 +1,52 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationMembershipDeleted do + @moduledoc """ + OrganizationMembershipDeleted model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.OrganizationMembershipDeletedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.OrganizationMembershipDeletedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => + WorkOS.Cast.dump_struct(struct.data, &WorkOS.OrganizationMembershipDeletedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/organization_membership_deleted_data.ex b/lib/workos/organization_membership_deleted_data.ex new file mode 100644 index 00000000..c08ba91a --- /dev/null +++ b/lib/workos/organization_membership_deleted_data.ex @@ -0,0 +1,76 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationMembershipDeletedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :object, + :id, + :user_id, + :organization_id, + :status, + :role, + :custom_attributes, + :directory_managed, + :created_at, + :updated_at, + :roles + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + user_id: String.t(), + organization_id: String.t(), + status: WorkOS.OrganizationMembershipDeletedDataStatus.t(), + role: WorkOS.SlimRole.t(), + custom_attributes: %{optional(String.t()) => term()}, + directory_managed: boolean(), + created_at: String.t(), + updated_at: String.t(), + roles: [WorkOS.SlimRole.t()] | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + user_id: map["user_id"], + organization_id: map["organization_id"], + status: + WorkOS.Cast.enum(map["status"], &WorkOS.OrganizationMembershipDeletedDataStatus.cast/1), + role: WorkOS.Cast.nested(map["role"], &WorkOS.SlimRole.from_map/1), + custom_attributes: map["custom_attributes"], + directory_managed: map["directory_managed"], + created_at: map["created_at"], + updated_at: map["updated_at"], + roles: WorkOS.Cast.list(map["roles"], &WorkOS.SlimRole.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "user_id" => struct.user_id, + "organization_id" => struct.organization_id, + "status" => + WorkOS.Cast.enum(struct.status, &WorkOS.OrganizationMembershipDeletedDataStatus.dump/1), + "role" => WorkOS.Cast.dump_struct(struct.role, &WorkOS.SlimRole.to_map/1), + "custom_attributes" => struct.custom_attributes, + "directory_managed" => struct.directory_managed, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at, + "roles" => + WorkOS.Cast.list(struct.roles, fn item -> + WorkOS.Cast.dump_struct(item, &WorkOS.SlimRole.to_map/1) + end) + }) + end +end diff --git a/lib/workos/organization_membership_deleted_data_status.ex b/lib/workos/organization_membership_deleted_data_status.ex new file mode 100644 index 00000000..6f2a810c --- /dev/null +++ b/lib/workos/organization_membership_deleted_data_status.ex @@ -0,0 +1,27 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationMembershipDeletedDataStatus do + @moduledoc """ + OrganizationMembershipDeletedDataStatus enum. + """ + + @type t :: :active | :inactive | :pending + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:active, :inactive, :pending] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("active"), do: :active + def cast("inactive"), do: :inactive + def cast("pending"), do: :pending + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:active), do: "active" + def dump(:inactive), do: "inactive" + def dump(:pending), do: "pending" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/organization_membership_service.ex b/lib/workos/organization_membership_service.ex new file mode 100644 index 00000000..0095e33c --- /dev/null +++ b/lib/workos/organization_membership_service.ex @@ -0,0 +1,242 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationMembershipService do + @moduledoc """ + Operations for the OrganizationMembership API. + """ + + @doc """ + List organization memberships + + Get a list of all organization memberships matching the criteria specified. At least one of `user_id` or `organization_id` must be provided. By default only active memberships are returned. Use the `statuses` parameter to filter by other statuses. + + ## Parameters + + * `params` — query parameters: `:before`, `:after_`, `:limit`, `:order`, `:organization_id`, `:statuses`, `:user_id` + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec list_organization_memberships(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.Page.t(WorkOS.UserOrganizationMembershipList.t())} + | {:error, WorkOS.Error.error()} + def list_organization_memberships(client, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :get, + "/user_management/organization_memberships", + params, + opts + ) do + fetch_next = fn cursor -> + list_organization_memberships( + client, + WorkOS.Page.next_params(params, "after", cursor), + opts + ) + end + + {:ok, + WorkOS.Page.from_map( + body, + "data", + &WorkOS.UserOrganizationMembershipList.from_map/1, + fetch_next + )} + end + end + + @doc """ + Create an organization membership + + Creates a new `active` organization membership for the given organization and user. + + Calling this API with an organization and user that match an `inactive` organization membership will activate the membership with the specified role(s). + + ## Parameters + + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec create_organization_membership(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.OrganizationMembership.t()} | {:error, WorkOS.Error.error()} + def create_organization_membership(client, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :post, + "/user_management/organization_memberships", + params, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.OrganizationMembership.from_map/1)} + end + end + + @doc """ + Get an organization membership + + Get the details of an existing organization membership. + + ## Parameters + + * `id` — The unique ID of the organization membership. + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec get_organization_membership(WorkOS.Client.t(), String.t(), keyword()) :: + {:ok, WorkOS.UserOrganizationMembership.t()} | {:error, WorkOS.Error.error()} + def get_organization_membership(client, id, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :get, + "/user_management/organization_memberships/#{URI.encode(id, &URI.char_unreserved?/1)}", + %{}, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.UserOrganizationMembership.from_map/1)} + end + end + + @doc """ + Update an organization membership + + Update the details of an existing organization membership. + + ## Parameters + + * `id` — The unique ID of the organization membership. + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec update_organization_membership(WorkOS.Client.t(), String.t(), map(), keyword()) :: + {:ok, WorkOS.UserOrganizationMembership.t()} | {:error, WorkOS.Error.error()} + def update_organization_membership(client, id, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :put, + "/user_management/organization_memberships/#{URI.encode(id, &URI.char_unreserved?/1)}", + params, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.UserOrganizationMembership.from_map/1)} + end + end + + @doc """ + Delete an organization membership + + Permanently deletes an existing organization membership. It cannot be undone. + + ## Parameters + + * `id` — The unique ID of the organization membership. + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec delete_organization_membership(WorkOS.Client.t(), String.t(), keyword()) :: + {:ok, term()} | {:error, WorkOS.Error.error()} + def delete_organization_membership(client, id, opts \\ []) do + WorkOS.Client.request( + client, + :delete, + "/user_management/organization_memberships/#{URI.encode(id, &URI.char_unreserved?/1)}", + %{}, + opts + ) + end + + @doc """ + Deactivate an organization membership + + Deactivates an `active` organization membership. Emits an [organization_membership.updated](https://workos.com/docs/events/organization-membership) event upon successful deactivation. + + - Deactivating an `inactive` membership is a no-op and does not emit an event. + - Deactivating a `pending` membership returns an error. This membership should be [deleted](https://workos.com/docs/reference/authkit/organization-membership/delete) instead. + + See the [membership management documentation](https://workos.com/docs/authkit/users-organizations/organizations/membership-management) for additional details. + + ## Parameters + + * `id` — The unique ID of the organization membership. + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec deactivate_organization_membership(WorkOS.Client.t(), String.t(), keyword()) :: + {:ok, WorkOS.OrganizationMembership.t()} | {:error, WorkOS.Error.error()} + def deactivate_organization_membership(client, id, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :put, + "/user_management/organization_memberships/#{URI.encode(id, &URI.char_unreserved?/1)}/deactivate", + %{}, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.OrganizationMembership.from_map/1)} + end + end + + @doc """ + Reactivate an organization membership + + Reactivates an `inactive` organization membership, retaining the pre-existing role(s). Emits an [organization_membership.updated](https://workos.com/docs/events/organization-membership) event upon successful reactivation. + + - Reactivating an `active` membership is a no-op and does not emit an event. + - Reactivating a `pending` membership returns an error. The user needs to [accept the invitation](https://workos.com/docs/authkit/invitations) instead. + + See the [membership management documentation](https://workos.com/docs/authkit/users-organizations/organizations/membership-management) for additional details. + + ## Parameters + + * `id` — The unique ID of the organization membership. + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec reactivate_organization_membership(WorkOS.Client.t(), String.t(), keyword()) :: + {:ok, WorkOS.UserOrganizationMembership.t()} | {:error, WorkOS.Error.error()} + def reactivate_organization_membership(client, id, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :put, + "/user_management/organization_memberships/#{URI.encode(id, &URI.char_unreserved?/1)}/reactivate", + %{}, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.UserOrganizationMembership.from_map/1)} + end + end + + @doc """ + List groups + + Get a list of groups that an organization membership belongs to. + + ## Parameters + + * `om_id` — Unique identifier of the Organization Membership. + * `params` — query parameters: `:before`, `:after_`, `:limit`, `:order` + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec list_organization_membership_groups(WorkOS.Client.t(), String.t(), map(), keyword()) :: + {:ok, WorkOS.Page.t(WorkOS.GroupList.t())} | {:error, WorkOS.Error.error()} + def list_organization_membership_groups(client, om_id, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :get, + "/user_management/organization_memberships/#{URI.encode(om_id, &URI.char_unreserved?/1)}/groups", + params, + opts + ) do + fetch_next = fn cursor -> + list_organization_membership_groups( + client, + om_id, + WorkOS.Page.next_params(params, "after", cursor), + opts + ) + end + + {:ok, WorkOS.Page.from_map(body, "data", &WorkOS.GroupList.from_map/1, fetch_next)} + end + end +end diff --git a/lib/workos/organization_membership_status.ex b/lib/workos/organization_membership_status.ex new file mode 100644 index 00000000..ecd2efae --- /dev/null +++ b/lib/workos/organization_membership_status.ex @@ -0,0 +1,27 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationMembershipStatus do + @moduledoc """ + OrganizationMembershipStatus enum. + """ + + @type t :: :active | :inactive | :pending + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:active, :inactive, :pending] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("active"), do: :active + def cast("inactive"), do: :inactive + def cast("pending"), do: :pending + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:active), do: "active" + def dump(:inactive), do: "inactive" + def dump(:pending), do: "pending" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/organization_membership_updated.ex b/lib/workos/organization_membership_updated.ex new file mode 100644 index 00000000..82dc30ba --- /dev/null +++ b/lib/workos/organization_membership_updated.ex @@ -0,0 +1,52 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationMembershipUpdated do + @moduledoc """ + OrganizationMembershipUpdated model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.OrganizationMembershipUpdatedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.OrganizationMembershipUpdatedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => + WorkOS.Cast.dump_struct(struct.data, &WorkOS.OrganizationMembershipUpdatedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/organization_membership_updated_data.ex b/lib/workos/organization_membership_updated_data.ex new file mode 100644 index 00000000..0abaddc5 --- /dev/null +++ b/lib/workos/organization_membership_updated_data.ex @@ -0,0 +1,76 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationMembershipUpdatedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :object, + :id, + :user_id, + :organization_id, + :status, + :role, + :custom_attributes, + :directory_managed, + :created_at, + :updated_at, + :roles + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + user_id: String.t(), + organization_id: String.t(), + status: WorkOS.OrganizationMembershipUpdatedDataStatus.t(), + role: WorkOS.SlimRole.t(), + custom_attributes: %{optional(String.t()) => term()}, + directory_managed: boolean(), + created_at: String.t(), + updated_at: String.t(), + roles: [WorkOS.SlimRole.t()] | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + user_id: map["user_id"], + organization_id: map["organization_id"], + status: + WorkOS.Cast.enum(map["status"], &WorkOS.OrganizationMembershipUpdatedDataStatus.cast/1), + role: WorkOS.Cast.nested(map["role"], &WorkOS.SlimRole.from_map/1), + custom_attributes: map["custom_attributes"], + directory_managed: map["directory_managed"], + created_at: map["created_at"], + updated_at: map["updated_at"], + roles: WorkOS.Cast.list(map["roles"], &WorkOS.SlimRole.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "user_id" => struct.user_id, + "organization_id" => struct.organization_id, + "status" => + WorkOS.Cast.enum(struct.status, &WorkOS.OrganizationMembershipUpdatedDataStatus.dump/1), + "role" => WorkOS.Cast.dump_struct(struct.role, &WorkOS.SlimRole.to_map/1), + "custom_attributes" => struct.custom_attributes, + "directory_managed" => struct.directory_managed, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at, + "roles" => + WorkOS.Cast.list(struct.roles, fn item -> + WorkOS.Cast.dump_struct(item, &WorkOS.SlimRole.to_map/1) + end) + }) + end +end diff --git a/lib/workos/organization_membership_updated_data_status.ex b/lib/workos/organization_membership_updated_data_status.ex new file mode 100644 index 00000000..38de1362 --- /dev/null +++ b/lib/workos/organization_membership_updated_data_status.ex @@ -0,0 +1,27 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationMembershipUpdatedDataStatus do + @moduledoc """ + OrganizationMembershipUpdatedDataStatus enum. + """ + + @type t :: :active | :inactive | :pending + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:active, :inactive, :pending] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("active"), do: :active + def cast("inactive"), do: :inactive + def cast("pending"), do: :pending + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:active), do: "active" + def dump(:inactive), do: "inactive" + def dump(:pending), do: "pending" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/organization_role_created.ex b/lib/workos/organization_role_created.ex new file mode 100644 index 00000000..648d4479 --- /dev/null +++ b/lib/workos/organization_role_created.ex @@ -0,0 +1,52 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationRoleCreated do + @moduledoc """ + OrganizationRoleCreated model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.OrganizationRoleCreatedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.OrganizationRoleCreatedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => + WorkOS.Cast.dump_struct(struct.data, &WorkOS.OrganizationRoleCreatedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/organization_role_created_data.ex b/lib/workos/organization_role_created_data.ex new file mode 100644 index 00000000..fba41b86 --- /dev/null +++ b/lib/workos/organization_role_created_data.ex @@ -0,0 +1,63 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationRoleCreatedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :object, + :organization_id, + :slug, + :name, + :description, + :resource_type_slug, + :permissions, + :created_at, + :updated_at + ] + + @type t :: %__MODULE__{ + object: String.t(), + organization_id: String.t(), + slug: String.t(), + name: String.t(), + description: String.t() | nil, + resource_type_slug: String.t(), + permissions: [String.t()], + created_at: String.t(), + updated_at: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + organization_id: map["organization_id"], + slug: map["slug"], + name: map["name"], + description: map["description"], + resource_type_slug: map["resource_type_slug"], + permissions: map["permissions"], + created_at: map["created_at"], + updated_at: map["updated_at"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "organization_id" => struct.organization_id, + "slug" => struct.slug, + "name" => struct.name, + "description" => struct.description, + "resource_type_slug" => struct.resource_type_slug, + "permissions" => struct.permissions, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at + }) + end +end diff --git a/lib/workos/organization_role_deleted.ex b/lib/workos/organization_role_deleted.ex new file mode 100644 index 00000000..ad60605f --- /dev/null +++ b/lib/workos/organization_role_deleted.ex @@ -0,0 +1,52 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationRoleDeleted do + @moduledoc """ + OrganizationRoleDeleted model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.OrganizationRoleDeletedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.OrganizationRoleDeletedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => + WorkOS.Cast.dump_struct(struct.data, &WorkOS.OrganizationRoleDeletedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/organization_role_deleted_data.ex b/lib/workos/organization_role_deleted_data.ex new file mode 100644 index 00000000..f380a919 --- /dev/null +++ b/lib/workos/organization_role_deleted_data.ex @@ -0,0 +1,63 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationRoleDeletedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :object, + :organization_id, + :slug, + :name, + :description, + :resource_type_slug, + :permissions, + :created_at, + :updated_at + ] + + @type t :: %__MODULE__{ + object: String.t(), + organization_id: String.t(), + slug: String.t(), + name: String.t(), + description: String.t() | nil, + resource_type_slug: String.t(), + permissions: [String.t()], + created_at: String.t(), + updated_at: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + organization_id: map["organization_id"], + slug: map["slug"], + name: map["name"], + description: map["description"], + resource_type_slug: map["resource_type_slug"], + permissions: map["permissions"], + created_at: map["created_at"], + updated_at: map["updated_at"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "organization_id" => struct.organization_id, + "slug" => struct.slug, + "name" => struct.name, + "description" => struct.description, + "resource_type_slug" => struct.resource_type_slug, + "permissions" => struct.permissions, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at + }) + end +end diff --git a/lib/workos/organization_role_updated.ex b/lib/workos/organization_role_updated.ex new file mode 100644 index 00000000..9bbb0b46 --- /dev/null +++ b/lib/workos/organization_role_updated.ex @@ -0,0 +1,52 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationRoleUpdated do + @moduledoc """ + OrganizationRoleUpdated model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.OrganizationRoleUpdatedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.OrganizationRoleUpdatedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => + WorkOS.Cast.dump_struct(struct.data, &WorkOS.OrganizationRoleUpdatedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/organization_role_updated_data.ex b/lib/workos/organization_role_updated_data.ex new file mode 100644 index 00000000..a0a82761 --- /dev/null +++ b/lib/workos/organization_role_updated_data.ex @@ -0,0 +1,63 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationRoleUpdatedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :object, + :organization_id, + :slug, + :name, + :description, + :resource_type_slug, + :permissions, + :created_at, + :updated_at + ] + + @type t :: %__MODULE__{ + object: String.t(), + organization_id: String.t(), + slug: String.t(), + name: String.t(), + description: String.t() | nil, + resource_type_slug: String.t(), + permissions: [String.t()], + created_at: String.t(), + updated_at: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + organization_id: map["organization_id"], + slug: map["slug"], + name: map["name"], + description: map["description"], + resource_type_slug: map["resource_type_slug"], + permissions: map["permissions"], + created_at: map["created_at"], + updated_at: map["updated_at"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "organization_id" => struct.organization_id, + "slug" => struct.slug, + "name" => struct.name, + "description" => struct.description, + "resource_type_slug" => struct.resource_type_slug, + "permissions" => struct.permissions, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at + }) + end +end diff --git a/lib/workos/organization_selection_session_authenticate_request.ex b/lib/workos/organization_selection_session_authenticate_request.ex new file mode 100644 index 00000000..8b19af92 --- /dev/null +++ b/lib/workos/organization_selection_session_authenticate_request.ex @@ -0,0 +1,59 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationSelectionSessionAuthenticateRequest do + @moduledoc """ + OrganizationSelectionSessionAuthenticateRequest model. + """ + + defstruct [ + :client_id, + :client_secret, + :grant_type, + :pending_authentication_token, + :organization_id, + :ip_address, + :device_id, + :user_agent + ] + + @type t :: %__MODULE__{ + client_id: String.t(), + client_secret: String.t(), + grant_type: String.t(), + pending_authentication_token: String.t(), + organization_id: String.t(), + ip_address: String.t() | nil, + device_id: String.t() | nil, + user_agent: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + client_id: map["client_id"], + client_secret: map["client_secret"], + grant_type: map["grant_type"], + pending_authentication_token: map["pending_authentication_token"], + organization_id: map["organization_id"], + ip_address: map["ip_address"], + device_id: map["device_id"], + user_agent: map["user_agent"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "client_id" => struct.client_id, + "client_secret" => struct.client_secret, + "grant_type" => struct.grant_type, + "pending_authentication_token" => struct.pending_authentication_token, + "organization_id" => struct.organization_id, + "ip_address" => struct.ip_address, + "device_id" => struct.device_id, + "user_agent" => struct.user_agent + }) + end +end diff --git a/lib/workos/organization_updated.ex b/lib/workos/organization_updated.ex new file mode 100644 index 00000000..7811b705 --- /dev/null +++ b/lib/workos/organization_updated.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationUpdated do + @moduledoc """ + OrganizationUpdated model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.OrganizationUpdatedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.OrganizationUpdatedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => WorkOS.Cast.dump_struct(struct.data, &WorkOS.OrganizationUpdatedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/organization_updated_data.ex b/lib/workos/organization_updated_data.ex new file mode 100644 index 00000000..82c0eb4c --- /dev/null +++ b/lib/workos/organization_updated_data.ex @@ -0,0 +1,66 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationUpdatedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :object, + :id, + :name, + :domains, + :metadata, + :external_id, + :created_at, + :updated_at, + :stripe_customer_id + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + name: String.t(), + domains: [WorkOS.OrganizationUpdatedDataDomain.t()], + metadata: %{optional(String.t()) => String.t()}, + external_id: String.t() | nil, + created_at: String.t(), + updated_at: String.t(), + stripe_customer_id: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + name: map["name"], + domains: WorkOS.Cast.list(map["domains"], &WorkOS.OrganizationUpdatedDataDomain.from_map/1), + metadata: map["metadata"], + external_id: map["external_id"], + created_at: map["created_at"], + updated_at: map["updated_at"], + stripe_customer_id: map["stripe_customer_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "name" => struct.name, + "domains" => + WorkOS.Cast.list(struct.domains, fn item -> + WorkOS.Cast.dump_struct(item, &WorkOS.OrganizationUpdatedDataDomain.to_map/1) + end), + "metadata" => struct.metadata, + "external_id" => struct.external_id, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at, + "stripe_customer_id" => struct.stripe_customer_id + }) + end +end diff --git a/lib/workos/organization_updated_data_domain.ex b/lib/workos/organization_updated_data_domain.ex new file mode 100644 index 00000000..ba47a65e --- /dev/null +++ b/lib/workos/organization_updated_data_domain.ex @@ -0,0 +1,77 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationUpdatedDataDomain do + @moduledoc """ + OrganizationUpdatedDataDomain model. + """ + + defstruct [ + :object, + :id, + :organization_id, + :domain, + :created_at, + :updated_at, + :state, + :verification_prefix, + :verification_token, + :verification_strategy + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + organization_id: String.t(), + domain: String.t(), + created_at: String.t(), + updated_at: String.t(), + state: WorkOS.OrganizationUpdatedDataDomainState.t() | nil, + verification_prefix: String.t() | nil, + verification_token: String.t() | nil, + verification_strategy: + WorkOS.OrganizationUpdatedDataDomainVerificationStrategy.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + organization_id: map["organization_id"], + domain: map["domain"], + created_at: map["created_at"], + updated_at: map["updated_at"], + state: WorkOS.Cast.enum(map["state"], &WorkOS.OrganizationUpdatedDataDomainState.cast/1), + verification_prefix: map["verification_prefix"], + verification_token: map["verification_token"], + verification_strategy: + WorkOS.Cast.enum( + map["verification_strategy"], + &WorkOS.OrganizationUpdatedDataDomainVerificationStrategy.cast/1 + ) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "organization_id" => struct.organization_id, + "domain" => struct.domain, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at, + "state" => + WorkOS.Cast.enum(struct.state, &WorkOS.OrganizationUpdatedDataDomainState.dump/1), + "verification_prefix" => struct.verification_prefix, + "verification_token" => struct.verification_token, + "verification_strategy" => + WorkOS.Cast.enum( + struct.verification_strategy, + &WorkOS.OrganizationUpdatedDataDomainVerificationStrategy.dump/1 + ) + }) + end +end diff --git a/lib/workos/organization_updated_data_domain_state.ex b/lib/workos/organization_updated_data_domain_state.ex new file mode 100644 index 00000000..301e17a3 --- /dev/null +++ b/lib/workos/organization_updated_data_domain_state.ex @@ -0,0 +1,31 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationUpdatedDataDomainState do + @moduledoc """ + OrganizationUpdatedDataDomainState enum. + """ + + @type t :: :failed | :legacy_verified | :pending | :unverified | :verified + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:failed, :legacy_verified, :pending, :unverified, :verified] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("failed"), do: :failed + def cast("legacy_verified"), do: :legacy_verified + def cast("pending"), do: :pending + def cast("unverified"), do: :unverified + def cast("verified"), do: :verified + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:failed), do: "failed" + def dump(:legacy_verified), do: "legacy_verified" + def dump(:pending), do: "pending" + def dump(:unverified), do: "unverified" + def dump(:verified), do: "verified" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/organization_updated_data_domain_verification_strategy.ex b/lib/workos/organization_updated_data_domain_verification_strategy.ex new file mode 100644 index 00000000..fb10804c --- /dev/null +++ b/lib/workos/organization_updated_data_domain_verification_strategy.ex @@ -0,0 +1,25 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationUpdatedDataDomainVerificationStrategy do + @moduledoc """ + OrganizationUpdatedDataDomainVerificationStrategy enum. + """ + + @type t :: :dns | :manual + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:dns, :manual] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("dns"), do: :dns + def cast("manual"), do: :manual + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:dns), do: "dns" + def dump(:manual), do: "manual" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/organizations.ex b/lib/workos/organizations.ex index 7fa029ce..1eee841e 100644 --- a/lib/workos/organizations.ex +++ b/lib/workos/organizations.ex @@ -1,152 +1,216 @@ +# This file is auto-generated by oagen. Do not edit. + defmodule WorkOS.Organizations do @moduledoc """ - Manage Organizations in WorkOS. - - @see https://workos.com/docs/reference/organization + Operations for the Organizations API. """ - alias WorkOS.Empty - alias WorkOS.Organizations.Organization - @doc """ - Lists all organizations. + List Organizations - Parameter options: + Get a list of all of your existing organizations matching the criteria specified. - * `:domains` - The domains of an Organization. Any Organization with a matching domain will be returned. - * `:limit` - Maximum number of records to return. Accepts values between 1 and 100. Default is 10. - * `:after` - Pagination cursor to receive records after a provided event ID. - * `:before` - An object ID that defines your place in the list. When the ID is not present, you are at the end of the list. - * `:order` - Order the results by the creation time. Supported values are "asc" and "desc" for showing older and newer records first respectively. + ## Parameters + * `params` — query parameters: `:before`, `:after_`, `:limit`, `:order`, `:domains`, `:search` + * `opts` — per-request options (see `WorkOS.Client.request/5`) """ - @spec list_organizations(WorkOS.Client.t(), map()) :: - WorkOS.Client.response(WorkOS.List.t(Organization.t())) - def list_organizations(client, opts) do - WorkOS.Client.get(client, WorkOS.List.of(Organization), "/organizations", - query: [ - domains: opts[:domains], - limit: opts[:limit], - after: opts[:after], - before: opts[:before], - order: opts[:order] - ] - ) + @spec list_organizations(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.Page.t(WorkOS.OrganizationList.t())} | {:error, WorkOS.Error.error()} + def list_organizations(client, params \\ %{}, opts \\ []) do + with {:ok, body} <- WorkOS.Client.request(client, :get, "/organizations", params, opts) do + fetch_next = fn cursor -> + list_organizations( + client, + WorkOS.Page.next_params(params, "after", cursor), + opts + ) + end + + {:ok, WorkOS.Page.from_map(body, "data", &WorkOS.OrganizationList.from_map/1, fetch_next)} + end end - @spec list_organizations(map()) :: - WorkOS.Client.response(WorkOS.List.t(Organization.t())) - def list_organizations(opts \\ %{}) do - WorkOS.Client.get(WorkOS.client(), WorkOS.List.of(Organization), "/organizations", - query: [ - domains: opts[:domains], - limit: opts[:limit], - after: opts[:after], - before: opts[:before], - order: opts[:order] - ] - ) + @doc """ + Create an Organization + + Creates a new organization in the current environment. + + ## Parameters + + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec create_organization(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.Organization.t()} | {:error, WorkOS.Error.error()} + def create_organization(client, params \\ %{}, opts \\ []) do + with {:ok, body} <- WorkOS.Client.request(client, :post, "/organizations", params, opts) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.Organization.from_map/1)} + end end @doc """ - Deletes an organization. + Get an Organization by External ID + + Get the details of an existing organization by an [external identifier](https://workos.com/docs/authkit/metadata/external-identifiers). + + ## Parameters + + * `external_id` — The external ID of the Organization. + * `opts` — per-request options (see `WorkOS.Client.request/5`) """ - @spec delete_organization(String.t()) :: WorkOS.Client.response(nil) - @spec delete_organization(WorkOS.Client.t(), String.t()) :: WorkOS.Client.response(nil) - def delete_organization(client \\ WorkOS.client(), organization_id) do - WorkOS.Client.delete(client, Empty, "/organizations/:id", %{}, - opts: [ - path_params: [id: organization_id] - ] - ) + @spec get_organization_by_external_id(WorkOS.Client.t(), String.t(), keyword()) :: + {:ok, WorkOS.Organization.t()} | {:error, WorkOS.Error.error()} + def get_organization_by_external_id(client, external_id, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :get, + "/organizations/external_id/#{URI.encode(external_id, &URI.char_unreserved?/1)}", + %{}, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.Organization.from_map/1)} + end end @doc """ - Gets an organization given an ID. + Get an Organization + + Get the details of an existing organization. + + ## Parameters + + * `id` — Unique identifier of the Organization. + * `opts` — per-request options (see `WorkOS.Client.request/5`) """ - @spec get_organization(String.t()) :: WorkOS.Client.response(Organization.t()) - @spec get_organization(WorkOS.Client.t(), String.t()) :: - WorkOS.Client.response(Organization.t()) - def get_organization(client \\ WorkOS.client(), organization_id) do - WorkOS.Client.get(client, Organization, "/organizations/:id", - opts: [ - path_params: [id: organization_id] - ] - ) + @spec get_organization(WorkOS.Client.t(), String.t(), keyword()) :: + {:ok, WorkOS.Organization.t()} | {:error, WorkOS.Error.error()} + def get_organization(client, id, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :get, + "/organizations/#{URI.encode(id, &URI.char_unreserved?/1)}", + %{}, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.Organization.from_map/1)} + end end @doc """ - Gets an organization by external ID. + Update an Organization + + Updates an organization in the current environment. + + ## Parameters + + * `id` — Unique identifier of the Organization. + * `params` — request body map. Deprecated: `:domains` (see `WorkOS.UpdateOrganization`). + * `opts` — per-request options (see `WorkOS.Client.request/5`) """ - @spec get_organization_by_external_id(String.t()) :: WorkOS.Client.response(Organization.t()) - @spec get_organization_by_external_id(WorkOS.Client.t(), String.t()) :: - WorkOS.Client.response(Organization.t()) - def get_organization_by_external_id(client \\ WorkOS.client(), external_id) do - WorkOS.Client.get(client, Organization, "/organizations/external_id/:external_id", - opts: [ - path_params: [external_id: external_id] - ] - ) + @spec update_organization(WorkOS.Client.t(), String.t(), map(), keyword()) :: + {:ok, WorkOS.Organization.t()} | {:error, WorkOS.Error.error()} + def update_organization(client, id, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :put, + "/organizations/#{URI.encode(id, &URI.char_unreserved?/1)}", + params, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.Organization.from_map/1)} + end end @doc """ - Creates an organization. + Delete an Organization - Parameter options: + Permanently deletes an organization in the current environment. It cannot be undone. - * `:name` - A descriptive name for the Organization. This field does not need to be unique. (required) - * `:domain_data` - A list of maps containing domain information composed of the following: - * `:domain` - The domain of the Organization - * `:state` - The verification state of the domain. "pending" | "verified" - * `:allow_profiles_outside_organization` - Whether the Connections within this Organization should allow Profiles that do not have a domain that is present in the set of the Organization's User Email Domains. - * `:idempotency_key` - A unique string as the value. Each subsequent request matching this unique string will return the same response. - * `:external_id` - A unique, external identifier for the Organization. + ## Parameters + * `id` — Unique identifier of the Organization. + * `opts` — per-request options (see `WorkOS.Client.request/5`) """ - @spec create_organization(map()) :: WorkOS.Client.response(Organization.t()) - @spec create_organization(WorkOS.Client.t(), map()) :: - WorkOS.Client.response(Organization.t()) - def create_organization(client \\ WorkOS.client(), opts) when is_map_key(opts, :name) do - WorkOS.Client.post( + @spec delete_organization(WorkOS.Client.t(), String.t(), keyword()) :: + {:ok, term()} | {:error, WorkOS.Error.error()} + def delete_organization(client, id, opts \\ []) do + WorkOS.Client.request( client, - Organization, - "/organizations", - %{ - name: opts[:name], - domain_data: opts[:domain_data], - allow_profiles_outside_organization: opts[:allow_profiles_outside_organization], - external_id: opts[:external_id] - }, - headers: [ - {"Idempotency-Key", opts[:idempotency_key]} - ] + :delete, + "/organizations/#{URI.encode(id, &URI.char_unreserved?/1)}", + %{}, + opts ) end @doc """ - Updates an organization. + Get Audit Log Configuration + + Get the unified view of audit log trail and stream configuration for an organization. + + ## Parameters + + * `id` — Unique identifier of the Organization. + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec get_audit_log_configuration(WorkOS.Client.t(), String.t(), keyword()) :: + {:ok, WorkOS.AuditLogConfiguration.t()} | {:error, WorkOS.Error.error()} + def get_audit_log_configuration(client, id, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :get, + "/organizations/#{URI.encode(id, &URI.char_unreserved?/1)}/audit_log_configuration", + %{}, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.AuditLogConfiguration.from_map/1)} + end + end + + @doc """ + List authorized applications - Parameter options: + Get a list of all Connect applications that users in the organization have authorized. - * `:organization` - Unique identifier of the Organization. (required) - * `:name` - A descriptive name for the Organization. This field does not need to be unique. (required) - * `:domain_data` - A list of maps containing domain information composed of the following: - * `:domain` - The domain of the Organization - * `:state` - The verification state of the domain. "pending" | "verified" - * `:allow_profiles_outside_organization` - Whether the Connections within this Organization should allow Profiles that do not have a domain that is present in the set of the Organization's User Email Domains. - * `:external_id` - A unique, external identifier for the Organization. + ## Parameters + * `organization_id` — The ID of the organization. + * `params` — query parameters: `:before`, `:after_`, `:limit`, `:order` + * `opts` — per-request options (see `WorkOS.Client.request/5`) """ - @spec update_organization(String.t(), map()) :: WorkOS.Client.response(Organization.t()) - @spec update_organization(WorkOS.Client.t(), String.t(), map()) :: - WorkOS.Client.response(Organization.t()) - def update_organization(client \\ WorkOS.client(), organization_id, opts) - when is_map_key(opts, :name) do - WorkOS.Client.put(client, Organization, "/organizations/#{organization_id}", %{ - name: opts[:name], - domain_data: opts[:domain_data], - allow_profiles_outside_organization: !!opts[:allow_profiles_outside_organization], - external_id: opts[:external_id] - }) + @spec list_authorized_applications(WorkOS.Client.t(), String.t(), map(), keyword()) :: + {:ok, WorkOS.Page.t(WorkOS.OrganizationAuthorizedConnectApplicationList.t())} + | {:error, WorkOS.Error.error()} + def list_authorized_applications(client, organization_id, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :get, + "/organizations/#{URI.encode(organization_id, &URI.char_unreserved?/1)}/authorized_applications", + params, + opts + ) do + fetch_next = fn cursor -> + list_authorized_applications( + client, + organization_id, + WorkOS.Page.next_params(params, "after", cursor), + opts + ) + end + + {:ok, + WorkOS.Page.from_map( + body, + "data", + &WorkOS.OrganizationAuthorizedConnectApplicationList.from_map/1, + fetch_next + )} + end end end diff --git a/lib/workos/organizations/organization.ex b/lib/workos/organizations/organization.ex deleted file mode 100644 index 07711f09..00000000 --- a/lib/workos/organizations/organization.ex +++ /dev/null @@ -1,55 +0,0 @@ -defmodule WorkOS.Organizations.Organization do - @moduledoc """ - WorkOS Organization struct. - """ - - alias WorkOS.Castable - alias WorkOS.Organizations.Organization.Domain - - @behaviour WorkOS.Castable - - @type t() :: %__MODULE__{ - id: String.t(), - object: String.t(), - name: String.t(), - allow_profiles_outside_organization: boolean(), - external_id: String.t() | nil, - domains: list(Domain.t()) | nil, - updated_at: String.t(), - created_at: String.t() - } - - @enforce_keys [ - :id, - :object, - :name, - :allow_profiles_outside_organization, - :domains, - :updated_at, - :created_at - ] - defstruct [ - :id, - :object, - :name, - :allow_profiles_outside_organization, - :external_id, - :domains, - :updated_at, - :created_at - ] - - @impl true - def cast(map) do - %__MODULE__{ - id: map["id"], - object: map["object"], - name: map["name"], - domains: Castable.cast_list(Domain, map["domains"]), - allow_profiles_outside_organization: map["allow_profiles_outside_organization"], - external_id: map["external_id"], - updated_at: map["updated_at"], - created_at: map["created_at"] - } - end -end diff --git a/lib/workos/organizations/organization/domain.ex b/lib/workos/organizations/organization/domain.ex deleted file mode 100644 index bf52c3a3..00000000 --- a/lib/workos/organizations/organization/domain.ex +++ /dev/null @@ -1,29 +0,0 @@ -defmodule WorkOS.Organizations.Organization.Domain do - @moduledoc """ - WorkOS Organization Domain struct. - """ - - @behaviour WorkOS.Castable - - @type t() :: %__MODULE__{ - id: String.t(), - object: String.t(), - domain: String.t() - } - - @enforce_keys [:id, :object, :domain] - defstruct [ - :id, - :object, - :domain - ] - - @impl true - def cast(map) do - %__MODULE__{ - id: map["id"], - object: map["object"], - domain: map["domain"] - } - end -end diff --git a/lib/workos/page.ex b/lib/workos/page.ex new file mode 100644 index 00000000..faf95da7 --- /dev/null +++ b/lib/workos/page.ex @@ -0,0 +1,89 @@ +# @oagen-ignore-file + +defmodule WorkOS.Page do + @moduledoc """ + A single page of results with lazy auto-pagination. + + Use `WorkOS.Page.stream/1` to lazily iterate every item across all pages. + """ + + defstruct [:data, :list_metadata, :fetch_next] + + @type t(item) :: %__MODULE__{ + data: [item], + list_metadata: map() | nil, + fetch_next: (String.t() -> {:ok, t(item)} | {:error, term()}) | nil + } + + @doc false + @spec from_map( + map(), + String.t(), + (term() -> term()), + (String.t() -> {:ok, t(term())} | {:error, term()}) | nil + ) :: + t(term()) + def from_map(body, data_key, cast_item, fetch_next) when is_map(body) do + %__MODULE__{ + data: body |> Map.get(data_key, []) |> cast_data(cast_item), + list_metadata: body["list_metadata"] || body["listMetadata"], + fetch_next: fetch_next + } + end + + def from_map(body, _data_key, _cast_item, fetch_next) do + %__MODULE__{data: List.wrap(body), list_metadata: nil, fetch_next: fetch_next} + end + + defp cast_data(values, fun) when is_list(values), do: Enum.map(values, fun) + defp cast_data(_other, _fun), do: [] + + @doc false + @spec next_params(map() | keyword(), String.t(), String.t()) :: map() + def next_params(params, cursor_key, cursor) do + params + |> Map.new(fn {k, v} -> {to_string(k), v} end) + |> Map.put(cursor_key, cursor) + end + + @doc "The cursor for the next page, or nil when this is the last page." + @spec after_cursor(t(term())) :: String.t() | nil + def after_cursor(%__MODULE__{list_metadata: meta}) when is_map(meta), do: meta["after"] + def after_cursor(%__MODULE__{}), do: nil + + @doc "Whether another page is available." + @spec has_more?(t(term())) :: boolean() + def has_more?(%__MODULE__{} = page), do: after_cursor(page) != nil + + @doc """ + Lazily streams every item across all pages, fetching pages on demand. + + Stops if a page fetch fails; use explicit pagination when you need to + distinguish errors from the end of the collection. + """ + @spec stream(t(item)) :: Enumerable.t() when item: term() + def stream(%__MODULE__{} = page) do + Stream.resource( + fn -> page end, + fn + nil -> + {:halt, nil} + + %__MODULE__{} = current -> + {current.data, next_page(current)} + end, + fn _ -> :ok end + ) + end + + defp next_page(%__MODULE__{fetch_next: fetch_next} = page) when is_function(fetch_next, 1) do + with cursor when is_binary(cursor) <- after_cursor(page), + {:ok, %__MODULE__{} = next} <- fetch_next.(cursor) do + next + else + _ -> nil + end + end + + defp next_page(%__MODULE__{}), do: nil +end diff --git a/lib/workos/pagination_order.ex b/lib/workos/pagination_order.ex new file mode 100644 index 00000000..5d55c82d --- /dev/null +++ b/lib/workos/pagination_order.ex @@ -0,0 +1,27 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.PaginationOrder do + @moduledoc """ + PaginationOrder enum. + """ + + @type t :: :normal | :desc | :asc + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:normal, :desc, :asc] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("normal"), do: :normal + def cast("desc"), do: :desc + def cast("asc"), do: :asc + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:normal), do: "normal" + def dump(:desc), do: "desc" + def dump(:asc), do: "asc" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/password_reset.ex b/lib/workos/password_reset.ex new file mode 100644 index 00000000..2956c06c --- /dev/null +++ b/lib/workos/password_reset.ex @@ -0,0 +1,59 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.PasswordReset do + @moduledoc """ + PasswordReset model. + """ + + defstruct [ + :object, + :id, + :user_id, + :email, + :expires_at, + :created_at, + :password_reset_token, + :password_reset_url + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + user_id: String.t(), + email: String.t(), + expires_at: String.t(), + created_at: String.t(), + password_reset_token: String.t(), + password_reset_url: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + user_id: map["user_id"], + email: map["email"], + expires_at: map["expires_at"], + created_at: map["created_at"], + password_reset_token: map["password_reset_token"], + password_reset_url: map["password_reset_url"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "user_id" => struct.user_id, + "email" => struct.email, + "expires_at" => struct.expires_at, + "created_at" => struct.created_at, + "password_reset_token" => struct.password_reset_token, + "password_reset_url" => struct.password_reset_url + }) + end +end diff --git a/lib/workos/password_reset_created.ex b/lib/workos/password_reset_created.ex new file mode 100644 index 00000000..1c8fb66e --- /dev/null +++ b/lib/workos/password_reset_created.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.PasswordResetCreated do + @moduledoc """ + PasswordResetCreated model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.PasswordResetCreatedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.PasswordResetCreatedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => WorkOS.Cast.dump_struct(struct.data, &WorkOS.PasswordResetCreatedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/password_reset_created_data.ex b/lib/workos/password_reset_created_data.ex new file mode 100644 index 00000000..395c50fa --- /dev/null +++ b/lib/workos/password_reset_created_data.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.PasswordResetCreatedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :object, + :id, + :user_id, + :email, + :expires_at, + :created_at + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + user_id: String.t(), + email: String.t(), + expires_at: String.t(), + created_at: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + user_id: map["user_id"], + email: map["email"], + expires_at: map["expires_at"], + created_at: map["created_at"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "user_id" => struct.user_id, + "email" => struct.email, + "expires_at" => struct.expires_at, + "created_at" => struct.created_at + }) + end +end diff --git a/lib/workos/password_reset_succeeded.ex b/lib/workos/password_reset_succeeded.ex new file mode 100644 index 00000000..ea4102f1 --- /dev/null +++ b/lib/workos/password_reset_succeeded.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.PasswordResetSucceeded do + @moduledoc """ + PasswordResetSucceeded model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.PasswordResetSucceededData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.PasswordResetSucceededData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => WorkOS.Cast.dump_struct(struct.data, &WorkOS.PasswordResetSucceededData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/password_reset_succeeded_data.ex b/lib/workos/password_reset_succeeded_data.ex new file mode 100644 index 00000000..a5595bdf --- /dev/null +++ b/lib/workos/password_reset_succeeded_data.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.PasswordResetSucceededData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :object, + :id, + :user_id, + :email, + :expires_at, + :created_at + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + user_id: String.t(), + email: String.t(), + expires_at: String.t(), + created_at: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + user_id: map["user_id"], + email: map["email"], + expires_at: map["expires_at"], + created_at: map["created_at"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "user_id" => struct.user_id, + "email" => struct.email, + "expires_at" => struct.expires_at, + "created_at" => struct.created_at + }) + end +end diff --git a/lib/workos/password_session_authenticate_request.ex b/lib/workos/password_session_authenticate_request.ex new file mode 100644 index 00000000..a27f09b8 --- /dev/null +++ b/lib/workos/password_session_authenticate_request.ex @@ -0,0 +1,71 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.PasswordSessionAuthenticateRequest do + @moduledoc """ + PasswordSessionAuthenticateRequest model. + """ + + defstruct [ + :client_id, + :client_secret, + :grant_type, + :email, + :password, + :invitation_token, + :ip_address, + :device_id, + :user_agent, + :signals_id, + :radar_auth_attempt_id + ] + + @type t :: %__MODULE__{ + client_id: String.t(), + client_secret: String.t(), + grant_type: String.t(), + email: String.t(), + password: String.t(), + invitation_token: String.t() | nil, + ip_address: String.t() | nil, + device_id: String.t() | nil, + user_agent: String.t() | nil, + signals_id: String.t() | nil, + radar_auth_attempt_id: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + client_id: map["client_id"], + client_secret: map["client_secret"], + grant_type: map["grant_type"], + email: map["email"], + password: map["password"], + invitation_token: map["invitation_token"], + ip_address: map["ip_address"], + device_id: map["device_id"], + user_agent: map["user_agent"], + signals_id: map["signals_id"], + radar_auth_attempt_id: map["radar_auth_attempt_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "client_id" => struct.client_id, + "client_secret" => struct.client_secret, + "grant_type" => struct.grant_type, + "email" => struct.email, + "password" => struct.password, + "invitation_token" => struct.invitation_token, + "ip_address" => struct.ip_address, + "device_id" => struct.device_id, + "user_agent" => struct.user_agent, + "signals_id" => struct.signals_id, + "radar_auth_attempt_id" => struct.radar_auth_attempt_id + }) + end +end diff --git a/lib/workos/passwordless.ex b/lib/workos/passwordless.ex index c6ec48a5..1d85baa9 100644 --- a/lib/workos/passwordless.ex +++ b/lib/workos/passwordless.ex @@ -1,60 +1,81 @@ +# @oagen-ignore-file — hand-maintained; these endpoints are not in the OpenAPI spec. + defmodule WorkOS.Passwordless do @moduledoc """ - Manage Magic Link API in WorkOS. + Magic Link passwordless sessions. + + These endpoints are not part of the OpenAPI spec, so this module is + hand-maintained rather than generated. - @see https://workos.com/docs/reference/magic-link + {:ok, session} = + WorkOS.Passwordless.create_session(client, %{ + email: "user@example.com", + type: "MagicLink" + }) + + {:ok, _} = WorkOS.Passwordless.send_session(client, session.id) """ - alias WorkOS.Passwordless.Session - alias WorkOS.Passwordless.Session.Send + defmodule Session do + @moduledoc """ + A passwordless (Magic Link) session. + """ - @doc """ - Creates a Passwordless Session for a Magic Link Connection + defstruct [:id, :email, :expires_at, :link, :object] - Parameter options: + @type t :: %__MODULE__{ + id: String.t(), + email: String.t(), + expires_at: String.t(), + link: String.t(), + object: String.t() + } - * `:type` - The type of Passwordless Session to create. Currently, the only supported value is `MagicLink`. (required) - * `:email` - The email of the user to authenticate. (required) - * `:redirect_uri` - Optional parameter that a developer can choose to include in their authorization URL. - * `:expires_in` - The number of seconds the Passwordless Session should live before expiring. - * `:state` - Optional parameter that a developer can choose to include in their authorization URL. + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + id: map["id"], + email: map["email"], + expires_at: map["expires_at"], + link: map["link"], + object: map["object"] + } + end + end + @doc """ + Creates a passwordless session (`POST /passwordless/sessions`). + + ## Parameters + + * `params` — request body map. Required: `:email`, `:type` (`"MagicLink"`). + Optional: `:redirect_uri`, `:state`, `:expires_in`. + * `opts` — per-request options (see `WorkOS.Client.request/5`) """ - @spec create_session(map()) :: WorkOS.Client.response(Session.t()) - @spec create_session(WorkOS.Client.t(), map()) :: - WorkOS.Client.response(Session.t()) - def create_session(client \\ WorkOS.client(), opts) - when is_map_key(opts, :email) and is_map_key(opts, :type) do - WorkOS.Client.post( - client, - Session, - "/passwordless/sessions", - %{ - email: opts[:email], - type: opts[:type], - redirect_uri: opts[:redirect_uri], - expires_in: opts[:expires_in], - state: opts[:state] - } - ) + @spec create_session(WorkOS.Client.t(), map(), keyword()) :: + {:ok, Session.t()} | {:error, WorkOS.Error.error()} + def create_session(client, params \\ %{}, opts \\ []) do + params = WorkOS.Client.merge_defaults(params, %{"type" => "MagicLink"}) + + with {:ok, body} <- + WorkOS.Client.request(client, :post, "/passwordless/sessions", params, opts) do + {:ok, WorkOS.Cast.nested(body, &Session.from_map/1)} + end end @doc """ - Emails a user the Magic Link confirmation URL, given a Passwordless session ID. + Emails the Magic Link for a session (`POST /passwordless/sessions/:id/send`). """ - @spec send_session(String.t()) :: - WorkOS.Client.response(Send) - @spec send_session(WorkOS.Client.t(), String.t()) :: - WorkOS.Client.response(Send) - def send_session(client \\ WorkOS.client(), session_id) do - WorkOS.Client.post( + @spec send_session(WorkOS.Client.t(), String.t(), keyword()) :: + {:ok, term()} | {:error, WorkOS.Error.error()} + def send_session(client, session_id, opts \\ []) do + WorkOS.Client.request( client, - Send, - "/passwordless/sessions/:id/send", + :post, + "/passwordless/sessions/#{URI.encode(session_id, &URI.char_unreserved?/1)}/send", %{}, - opts: [ - path_params: [id: session_id] - ] + opts ) end end diff --git a/lib/workos/passwordless/session.ex b/lib/workos/passwordless/session.ex deleted file mode 100644 index 91d0abe9..00000000 --- a/lib/workos/passwordless/session.ex +++ /dev/null @@ -1,35 +0,0 @@ -defmodule WorkOS.Passwordless.Session do - @moduledoc """ - WorkOS Passwordless session struct. - """ - - @behaviour WorkOS.Castable - - @type t() :: %__MODULE__{ - id: String.t(), - email: String.t(), - link: String.t(), - object: String.t(), - expires_at: String.t() - } - - @enforce_keys [:id, :email, :link, :object, :expires_at] - defstruct [ - :id, - :email, - :link, - :object, - :expires_at - ] - - @impl true - def cast(map) do - %__MODULE__{ - id: map["id"], - email: map["email"], - link: map["link"], - object: map["object"], - expires_at: map["expires_at"] - } - end -end diff --git a/lib/workos/passwordless/session/send.ex b/lib/workos/passwordless/session/send.ex deleted file mode 100644 index d269e198..00000000 --- a/lib/workos/passwordless/session/send.ex +++ /dev/null @@ -1,23 +0,0 @@ -defmodule WorkOS.Passwordless.Session.Send do - @moduledoc """ - WorkOS Send Passwordless session struct. - """ - - @behaviour WorkOS.Castable - - @type t() :: %__MODULE__{ - success: boolean() - } - - @enforce_keys [:success] - defstruct [ - :success - ] - - @impl true - def cast(map) do - %__MODULE__{ - success: map["success"] - } - end -end diff --git a/lib/workos/permission.ex b/lib/workos/permission.ex new file mode 100644 index 00000000..49a3156c --- /dev/null +++ b/lib/workos/permission.ex @@ -0,0 +1,63 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.Permission do + @moduledoc """ + Permission model. + """ + + defstruct [ + :object, + :id, + :slug, + :name, + :description, + :system, + :resource_type_slug, + :created_at, + :updated_at + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + slug: String.t(), + name: String.t(), + description: String.t() | nil, + system: boolean(), + resource_type_slug: String.t(), + created_at: String.t(), + updated_at: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + slug: map["slug"], + name: map["name"], + description: map["description"], + system: map["system"], + resource_type_slug: map["resource_type_slug"], + created_at: map["created_at"], + updated_at: map["updated_at"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "slug" => struct.slug, + "name" => struct.name, + "description" => struct.description, + "system" => struct.system, + "resource_type_slug" => struct.resource_type_slug, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at + }) + end +end diff --git a/lib/workos/permission_created.ex b/lib/workos/permission_created.ex new file mode 100644 index 00000000..2f074e3d --- /dev/null +++ b/lib/workos/permission_created.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.PermissionCreated do + @moduledoc """ + PermissionCreated model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.PermissionCreatedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.PermissionCreatedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => WorkOS.Cast.dump_struct(struct.data, &WorkOS.PermissionCreatedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/permission_created_data.ex b/lib/workos/permission_created_data.ex new file mode 100644 index 00000000..da063927 --- /dev/null +++ b/lib/workos/permission_created_data.ex @@ -0,0 +1,63 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.PermissionCreatedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :object, + :id, + :slug, + :name, + :description, + :system, + :resource_type_slug, + :created_at, + :updated_at + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + slug: String.t(), + name: String.t(), + description: String.t() | nil, + system: boolean(), + resource_type_slug: String.t(), + created_at: String.t(), + updated_at: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + slug: map["slug"], + name: map["name"], + description: map["description"], + system: map["system"], + resource_type_slug: map["resource_type_slug"], + created_at: map["created_at"], + updated_at: map["updated_at"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "slug" => struct.slug, + "name" => struct.name, + "description" => struct.description, + "system" => struct.system, + "resource_type_slug" => struct.resource_type_slug, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at + }) + end +end diff --git a/lib/workos/permission_deleted.ex b/lib/workos/permission_deleted.ex new file mode 100644 index 00000000..02ec716b --- /dev/null +++ b/lib/workos/permission_deleted.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.PermissionDeleted do + @moduledoc """ + PermissionDeleted model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.PermissionDeletedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.PermissionDeletedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => WorkOS.Cast.dump_struct(struct.data, &WorkOS.PermissionDeletedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/permission_deleted_data.ex b/lib/workos/permission_deleted_data.ex new file mode 100644 index 00000000..6ed7ec83 --- /dev/null +++ b/lib/workos/permission_deleted_data.ex @@ -0,0 +1,63 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.PermissionDeletedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :object, + :id, + :slug, + :name, + :description, + :system, + :resource_type_slug, + :created_at, + :updated_at + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + slug: String.t(), + name: String.t(), + description: String.t() | nil, + system: boolean(), + resource_type_slug: String.t(), + created_at: String.t(), + updated_at: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + slug: map["slug"], + name: map["name"], + description: map["description"], + system: map["system"], + resource_type_slug: map["resource_type_slug"], + created_at: map["created_at"], + updated_at: map["updated_at"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "slug" => struct.slug, + "name" => struct.name, + "description" => struct.description, + "system" => struct.system, + "resource_type_slug" => struct.resource_type_slug, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at + }) + end +end diff --git a/lib/workos/permission_updated.ex b/lib/workos/permission_updated.ex new file mode 100644 index 00000000..d59d9b43 --- /dev/null +++ b/lib/workos/permission_updated.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.PermissionUpdated do + @moduledoc """ + PermissionUpdated model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.PermissionUpdatedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.PermissionUpdatedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => WorkOS.Cast.dump_struct(struct.data, &WorkOS.PermissionUpdatedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/permission_updated_data.ex b/lib/workos/permission_updated_data.ex new file mode 100644 index 00000000..778cad69 --- /dev/null +++ b/lib/workos/permission_updated_data.ex @@ -0,0 +1,63 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.PermissionUpdatedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :object, + :id, + :slug, + :name, + :description, + :system, + :resource_type_slug, + :created_at, + :updated_at + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + slug: String.t(), + name: String.t(), + description: String.t() | nil, + system: boolean(), + resource_type_slug: String.t(), + created_at: String.t(), + updated_at: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + slug: map["slug"], + name: map["name"], + description: map["description"], + system: map["system"], + resource_type_slug: map["resource_type_slug"], + created_at: map["created_at"], + updated_at: map["updated_at"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "slug" => struct.slug, + "name" => struct.name, + "description" => struct.description, + "system" => struct.system, + "resource_type_slug" => struct.resource_type_slug, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at + }) + end +end diff --git a/lib/workos/pipe_connected_account.ex b/lib/workos/pipe_connected_account.ex new file mode 100644 index 00000000..87a49874 --- /dev/null +++ b/lib/workos/pipe_connected_account.ex @@ -0,0 +1,67 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.PipeConnectedAccount do + @moduledoc """ + PipeConnectedAccount model. + """ + + defstruct [ + :object, + :id, + :data_integration_id, + :provider_slug, + :user_id, + :organization_id, + :scopes, + :state, + :created_at, + :updated_at + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + data_integration_id: String.t(), + provider_slug: String.t(), + user_id: String.t() | nil, + organization_id: String.t() | nil, + scopes: [String.t()], + state: WorkOS.PipeConnectedAccountState.t(), + created_at: String.t(), + updated_at: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + data_integration_id: map["data_integration_id"], + provider_slug: map["provider_slug"], + user_id: map["user_id"], + organization_id: map["organization_id"], + scopes: map["scopes"], + state: WorkOS.Cast.enum(map["state"], &WorkOS.PipeConnectedAccountState.cast/1), + created_at: map["created_at"], + updated_at: map["updated_at"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "data_integration_id" => struct.data_integration_id, + "provider_slug" => struct.provider_slug, + "user_id" => struct.user_id, + "organization_id" => struct.organization_id, + "scopes" => struct.scopes, + "state" => WorkOS.Cast.enum(struct.state, &WorkOS.PipeConnectedAccountState.dump/1), + "created_at" => struct.created_at, + "updated_at" => struct.updated_at + }) + end +end diff --git a/lib/workos/pipe_connected_account_state.ex b/lib/workos/pipe_connected_account_state.ex new file mode 100644 index 00000000..5e67fc6b --- /dev/null +++ b/lib/workos/pipe_connected_account_state.ex @@ -0,0 +1,25 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.PipeConnectedAccountState do + @moduledoc """ + PipeConnectedAccountState enum. + """ + + @type t :: :connected | :needs_reauthorization + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:connected, :needs_reauthorization] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("connected"), do: :connected + def cast("needs_reauthorization"), do: :needs_reauthorization + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:connected), do: "connected" + def dump(:needs_reauthorization), do: "needs_reauthorization" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/pipes.ex b/lib/workos/pipes.ex new file mode 100644 index 00000000..f952e2a6 --- /dev/null +++ b/lib/workos/pipes.ex @@ -0,0 +1,360 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.Pipes do + @moduledoc """ + Operations for the Pipes API. + """ + + @doc """ + List data integrations + + Lists the environment's data integrations configured with `custom` or `organization` credentials, including custom providers and API key integrations. + + ## Parameters + + * `params` — query parameters: `:before`, `:after_`, `:limit`, `:order` + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec list_data_integrations(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.Page.t(WorkOS.DataIntegrationList.t())} | {:error, WorkOS.Error.error()} + def list_data_integrations(client, params \\ %{}, opts \\ []) do + with {:ok, body} <- WorkOS.Client.request(client, :get, "/data-integrations", params, opts) do + fetch_next = fn cursor -> + list_data_integrations( + client, + WorkOS.Page.next_params(params, "after", cursor), + opts + ) + end + + {:ok, + WorkOS.Page.from_map(body, "data", &WorkOS.DataIntegrationList.from_map/1, fetch_next)} + end + end + + @doc """ + Create a data integration + + Creates a data integration for a provider. Set `credentials.type` to `custom` to use your own OAuth app credentials or `organization` to have each organization supply its own. Set `auth_methods` to `["api_key"]` to create an API key integration; you may optionally supply an `api_key` block to install a first tenant in the same call. For a built-in provider, pass its slug as `provider`. For a custom provider, pass a new slug plus a `custom_provider` definition. + + ## Parameters + + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec create_data_integration(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.DataIntegration.t()} | {:error, WorkOS.Error.error()} + def create_data_integration(client, params \\ %{}, opts \\ []) do + with {:ok, body} <- WorkOS.Client.request(client, :post, "/data-integrations", params, opts) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.DataIntegration.from_map/1)} + end + end + + @doc """ + Get a data integration + + Retrieves a data integration by its slug. + + ## Parameters + + * `slug` — The slug identifier of the data integration. + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec get_data_integration(WorkOS.Client.t(), String.t(), keyword()) :: + {:ok, WorkOS.DataIntegration.t()} | {:error, WorkOS.Error.error()} + def get_data_integration(client, slug, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :get, + "/data-integrations/#{URI.encode(slug, &URI.char_unreserved?/1)}", + %{}, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.DataIntegration.from_map/1)} + end + end + + @doc """ + Update a data integration + + Updates the description, enabled state, or custom credentials of a data integration. For custom providers, `custom_provider` updates the OAuth definition. + + ## Parameters + + * `slug` — The slug identifier of the data integration. + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec update_data_integration(WorkOS.Client.t(), String.t(), map(), keyword()) :: + {:ok, WorkOS.DataIntegration.t()} | {:error, WorkOS.Error.error()} + def update_data_integration(client, slug, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :put, + "/data-integrations/#{URI.encode(slug, &URI.char_unreserved?/1)}", + params, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.DataIntegration.from_map/1)} + end + end + + @doc """ + Delete a data integration + + Deletes a data integration and all of its connected installations. For a custom provider, also deletes the custom provider definition. + + ## Parameters + + * `slug` — The slug identifier of the data integration. + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec delete_data_integration(WorkOS.Client.t(), String.t(), keyword()) :: + {:ok, term()} | {:error, WorkOS.Error.error()} + def delete_data_integration(client, slug, opts \\ []) do + WorkOS.Client.request( + client, + :delete, + "/data-integrations/#{URI.encode(slug, &URI.char_unreserved?/1)}", + %{}, + opts + ) + end + + @doc """ + Upsert an API key for a connected account + + Creates or updates an API-key-based installation for the specified integration and user. If an installation already exists, the stored API key is rotated to the new value. + + ## Parameters + + * `slug` — The identifier of the integration. + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec update_data_integration_api_key(WorkOS.Client.t(), String.t(), map(), keyword()) :: + {:ok, WorkOS.ConnectedAccount.t()} | {:error, WorkOS.Error.error()} + def update_data_integration_api_key(client, slug, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :put, + "/data-integrations/#{URI.encode(slug, &URI.char_unreserved?/1)}/api-key", + params, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.ConnectedAccount.from_map/1)} + end + end + + @doc """ + Get authorization URL + + Generates an OAuth authorization URL to initiate the connection flow for a user. Redirect the user to the returned URL to begin the OAuth flow with the third-party provider. + + ## Parameters + + * `slug` — The slug identifier of the provider (e.g., `github`, `slack`, `notion`). + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec authorize_data_integration(WorkOS.Client.t(), String.t(), map(), keyword()) :: + {:ok, WorkOS.DataIntegrationAuthorizeUrlResponse.t()} | {:error, WorkOS.Error.error()} + def authorize_data_integration(client, slug, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :post, + "/data-integrations/#{URI.encode(slug, &URI.char_unreserved?/1)}/authorize", + params, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.DataIntegrationAuthorizeUrlResponse.from_map/1)} + end + end + + @doc """ + Vend credentials for a connected account + + Returns credentials for a user's connected account. Branches on the installation's `auth_method`: OAuth installations return an access token (refreshed if needed); API-key installations return the stored secret. + + ## Parameters + + * `slug` — The identifier of the integration. + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec create_data_integration_credential(WorkOS.Client.t(), String.t(), map(), keyword()) :: + {:ok, WorkOS.DataIntegrationCredentialsResponse.t()} | {:error, WorkOS.Error.error()} + def create_data_integration_credential(client, slug, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :post, + "/data-integrations/#{URI.encode(slug, &URI.char_unreserved?/1)}/credentials", + params, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.DataIntegrationCredentialsResponse.from_map/1)} + end + end + + @doc """ + Get an access token for a connected account + + Fetches a valid OAuth access token for a user's connected account. WorkOS automatically handles token refresh, ensuring you always receive a valid, non-expired token. + + ## Parameters + + * `provider` — The identifier of the integration. + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec get_access_token(WorkOS.Client.t(), String.t(), map(), keyword()) :: + {:ok, WorkOS.DataIntegrationAccessTokenResponse.t()} | {:error, WorkOS.Error.error()} + def get_access_token(client, provider, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :post, + "/data-integrations/#{URI.encode(provider, &URI.char_unreserved?/1)}/token", + params, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.DataIntegrationAccessTokenResponse.from_map/1)} + end + end + + @doc """ + Get a connected account + + Retrieves a user's [connected account](https://workos.com/docs/reference/pipes/connected-account) for a specific provider. + + ## Parameters + + * `user_id` — A [User](https://workos.com/docs/reference/authkit/user) identifier. + * `slug` — The slug identifier of the provider (e.g., `github`, `slack`, `notion`). + * `params` — query parameters: `:organization_id` + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec get_user_connected_account(WorkOS.Client.t(), String.t(), String.t(), map(), keyword()) :: + {:ok, WorkOS.ConnectedAccount.t()} | {:error, WorkOS.Error.error()} + def get_user_connected_account(client, user_id, slug, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :get, + "/user_management/users/#{URI.encode(user_id, &URI.char_unreserved?/1)}/connected_accounts/#{URI.encode(slug, &URI.char_unreserved?/1)}", + params, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.ConnectedAccount.from_map/1)} + end + end + + @doc """ + Import a connected account + + Imports a [connected account](https://workos.com/docs/reference/pipes/connected-account) for a user by providing OAuth tokens directly. Use this to migrate existing connections or set up connections without going through the OAuth flow. + + ## Parameters + + * `user_id` — A [User](https://workos.com/docs/reference/authkit/user) identifier. + * `slug` — The slug identifier of the provider (e.g., `github`, `slack`, `notion`). + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec create_user_connected_account(WorkOS.Client.t(), String.t(), String.t(), map(), keyword()) :: + {:ok, WorkOS.ConnectedAccount.t()} | {:error, WorkOS.Error.error()} + def create_user_connected_account(client, user_id, slug, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :post, + "/user_management/users/#{URI.encode(user_id, &URI.char_unreserved?/1)}/connected_accounts/#{URI.encode(slug, &URI.char_unreserved?/1)}", + params, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.ConnectedAccount.from_map/1)} + end + end + + @doc """ + Update a connected account + + Updates a user's [connected account](https://workos.com/docs/reference/pipes/connected-account) tokens, scopes, or state for a specific provider. + + ## Parameters + + * `user_id` — A [User](https://workos.com/docs/reference/authkit/user) identifier. + * `slug` — The slug identifier of the provider (e.g., `github`, `slack`, `notion`). + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec update_user_connected_account(WorkOS.Client.t(), String.t(), String.t(), map(), keyword()) :: + {:ok, WorkOS.ConnectedAccount.t()} | {:error, WorkOS.Error.error()} + def update_user_connected_account(client, user_id, slug, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :put, + "/user_management/users/#{URI.encode(user_id, &URI.char_unreserved?/1)}/connected_accounts/#{URI.encode(slug, &URI.char_unreserved?/1)}", + params, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.ConnectedAccount.from_map/1)} + end + end + + @doc """ + Delete a connected account + + Disconnects WorkOS's account for the user, including removing any stored access and refresh tokens. The user will need to reauthorize if they want to reconnect. This does not revoke access on the provider side. + + ## Parameters + + * `user_id` — A [User](https://workos.com/docs/reference/authkit/user) identifier. + * `slug` — The slug identifier of the provider (e.g., `github`, `slack`, `notion`). + * `params` — query parameters: `:organization_id` + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec delete_user_connected_account(WorkOS.Client.t(), String.t(), String.t(), map(), keyword()) :: + {:ok, term()} | {:error, WorkOS.Error.error()} + def delete_user_connected_account(client, user_id, slug, params \\ %{}, opts \\ []) do + WorkOS.Client.request( + client, + :delete, + "/user_management/users/#{URI.encode(user_id, &URI.char_unreserved?/1)}/connected_accounts/#{URI.encode(slug, &URI.char_unreserved?/1)}", + params, + opts + ) + end + + @doc """ + List providers for a user + + Retrieves a list of available providers and the user's connection status for each. Returns all providers configured for your environment, along with the user's [connected account](https://workos.com/docs/reference/pipes/connected-account) information where applicable. + + ## Parameters + + * `user_id` — A [User](https://workos.com/docs/reference/authkit/user) identifier to list providers and connected accounts for. + * `params` — query parameters: `:organization_id` + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec list_user_data_providers(WorkOS.Client.t(), String.t(), map(), keyword()) :: + {:ok, WorkOS.DataIntegrationsListResponse.t()} | {:error, WorkOS.Error.error()} + def list_user_data_providers(client, user_id, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :get, + "/user_management/users/#{URI.encode(user_id, &URI.char_unreserved?/1)}/data_providers", + params, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.DataIntegrationsListResponse.from_map/1)} + end + end +end diff --git a/lib/workos/pipes_connected_account_connected.ex b/lib/workos/pipes_connected_account_connected.ex new file mode 100644 index 00000000..1c86d75e --- /dev/null +++ b/lib/workos/pipes_connected_account_connected.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.PipesConnectedAccountConnected do + @moduledoc """ + PipesConnectedAccountConnected model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.PipeConnectedAccount.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.PipeConnectedAccount.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => WorkOS.Cast.dump_struct(struct.data, &WorkOS.PipeConnectedAccount.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/pipes_connected_account_connection_failed.ex b/lib/workos/pipes_connected_account_connection_failed.ex new file mode 100644 index 00000000..d97d79d3 --- /dev/null +++ b/lib/workos/pipes_connected_account_connection_failed.ex @@ -0,0 +1,59 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.PipesConnectedAccountConnectionFailed do + @moduledoc """ + PipesConnectedAccountConnectionFailed model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.PipesConnectedAccountConnectionFailedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: + WorkOS.Cast.nested( + map["data"], + &WorkOS.PipesConnectedAccountConnectionFailedData.from_map/1 + ), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => + WorkOS.Cast.dump_struct( + struct.data, + &WorkOS.PipesConnectedAccountConnectionFailedData.to_map/1 + ), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/pipes_connected_account_connection_failed_data.ex b/lib/workos/pipes_connected_account_connection_failed_data.ex new file mode 100644 index 00000000..54f6d947 --- /dev/null +++ b/lib/workos/pipes_connected_account_connection_failed_data.ex @@ -0,0 +1,67 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.PipesConnectedAccountConnectionFailedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :object, + :data_integration_id, + :provider_slug, + :user_id, + :organization_id, + :error_code, + :error_reason, + :provider_error, + :provider_error_description, + :created_at + ] + + @type t :: %__MODULE__{ + object: String.t(), + data_integration_id: String.t(), + provider_slug: String.t(), + user_id: String.t() | nil, + organization_id: String.t() | nil, + error_code: String.t(), + error_reason: String.t() | nil, + provider_error: String.t() | nil, + provider_error_description: String.t() | nil, + created_at: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + data_integration_id: map["data_integration_id"], + provider_slug: map["provider_slug"], + user_id: map["user_id"], + organization_id: map["organization_id"], + error_code: map["error_code"], + error_reason: map["error_reason"], + provider_error: map["provider_error"], + provider_error_description: map["provider_error_description"], + created_at: map["created_at"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "data_integration_id" => struct.data_integration_id, + "provider_slug" => struct.provider_slug, + "user_id" => struct.user_id, + "organization_id" => struct.organization_id, + "error_code" => struct.error_code, + "error_reason" => struct.error_reason, + "provider_error" => struct.provider_error, + "provider_error_description" => struct.provider_error_description, + "created_at" => struct.created_at + }) + end +end diff --git a/lib/workos/pipes_connected_account_disconnected.ex b/lib/workos/pipes_connected_account_disconnected.ex new file mode 100644 index 00000000..bda21c4e --- /dev/null +++ b/lib/workos/pipes_connected_account_disconnected.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.PipesConnectedAccountDisconnected do + @moduledoc """ + PipesConnectedAccountDisconnected model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.PipeConnectedAccount.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.PipeConnectedAccount.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => WorkOS.Cast.dump_struct(struct.data, &WorkOS.PipeConnectedAccount.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/pipes_connected_account_reauthorization_needed.ex b/lib/workos/pipes_connected_account_reauthorization_needed.ex new file mode 100644 index 00000000..bbcaf171 --- /dev/null +++ b/lib/workos/pipes_connected_account_reauthorization_needed.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.PipesConnectedAccountReauthorizationNeeded do + @moduledoc """ + PipesConnectedAccountReauthorizationNeeded model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.PipeConnectedAccount.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.PipeConnectedAccount.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => WorkOS.Cast.dump_struct(struct.data, &WorkOS.PipeConnectedAccount.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/pipes_provider.ex b/lib/workos/pipes_provider.ex new file mode 100644 index 00000000..1b7be6b3 --- /dev/null +++ b/lib/workos/pipes_provider.ex @@ -0,0 +1,76 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.PipesProvider do + @moduledoc """ + Operations for the PipesProvider API. + """ + + @doc """ + List providers for an organization + + Returns a list of all providers available to the specified organization, along with any configured custom OAuth scopes, enabled state, and organization-managed credentials where applicable. + + ## Parameters + + * `organization_id` — An [Organization](https://workos.com/docs/reference/organization) identifier to list provider configurations for. + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec list_organization_data_integration_configurations( + WorkOS.Client.t(), + String.t(), + keyword() + ) :: + {:ok, WorkOS.DataIntegrationConfigurationListResponse.t()} + | {:error, WorkOS.Error.error()} + def list_organization_data_integration_configurations(client, organization_id, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :get, + "/organizations/#{URI.encode(organization_id, &URI.char_unreserved?/1)}/data_integration_configurations", + %{}, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.DataIntegrationConfigurationListResponse.from_map/1)} + end + end + + @doc """ + Configure a provider for an organization + + Creates or updates an organization's provider configuration. Use this endpoint to enable or disable a provider, set custom OAuth scopes, or supply organization-managed OAuth credentials. + + ## Parameters + + * `organization_id` — An [Organization](https://workos.com/docs/reference/organization) identifier to configure the provider for. + * `slug` — The slug identifier of the provider to configure (e.g., `github`, `slack`, `notion`). + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec update_organization_data_integration_configuration( + WorkOS.Client.t(), + String.t(), + String.t(), + map(), + keyword() + ) :: + {:ok, WorkOS.DataIntegrationConfigurationResponse.t()} | {:error, WorkOS.Error.error()} + def update_organization_data_integration_configuration( + client, + organization_id, + slug, + params \\ %{}, + opts \\ [] + ) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :put, + "/organizations/#{URI.encode(organization_id, &URI.char_unreserved?/1)}/data_integration_configurations/#{URI.encode(slug, &URI.char_unreserved?/1)}", + params, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.DataIntegrationConfigurationResponse.from_map/1)} + end + end +end diff --git a/lib/workos/pkce.ex b/lib/workos/pkce.ex new file mode 100644 index 00000000..e6b4ff5d --- /dev/null +++ b/lib/workos/pkce.ex @@ -0,0 +1,75 @@ +# @oagen-ignore-file — hand-maintained; not produced from the OpenAPI spec. + +defmodule WorkOS.PKCE do + @moduledoc """ + PKCE (Proof Key for Code Exchange, [RFC 7636](https://datatracker.ietf.org/doc/html/rfc7636)) + utilities for public-client authentication flows. + + pair = WorkOS.PKCE.generate_pair() + pair.code_verifier + pair.code_challenge + pair.code_challenge_method + #=> "S256" + """ + + @min_length 43 + @max_length 128 + @default_length 43 + + @typedoc "A PKCE code verifier/challenge pair. The challenge method is always `\"S256\"`." + @type pair :: %{ + code_verifier: String.t(), + code_challenge: String.t(), + code_challenge_method: String.t() + } + + @doc """ + Generates a cryptographically random PKCE code verifier. + + `length` must be between #{@min_length} and #{@max_length} characters + (default #{@default_length}), per RFC 7636. + """ + @spec generate_code_verifier(pos_integer()) :: String.t() + def generate_code_verifier(length \\ @default_length) + + def generate_code_verifier(length) when length in @min_length..@max_length do + # base64url yields 4 characters per 3 bytes; generate enough bytes to + # cover `length` characters, then trim. + byte_length = div(length * 3 + 3, 4) + + byte_length + |> :crypto.strong_rand_bytes() + |> Base.url_encode64(padding: false) + |> binary_part(0, length) + end + + def generate_code_verifier(length) do + raise ArgumentError, + "PKCE code verifier length must be between #{@min_length} and #{@max_length}, " <> + "got #{inspect(length)}" + end + + @doc """ + Computes the S256 code challenge for a code verifier. + """ + @spec generate_code_challenge(String.t()) :: String.t() + def generate_code_challenge(code_verifier) when is_binary(code_verifier) do + :sha256 + |> :crypto.hash(code_verifier) + |> Base.url_encode64(padding: false) + end + + @doc """ + Generates a complete PKCE pair (verifier + S256 challenge). + """ + @spec generate_pair() :: pair() + def generate_pair do + code_verifier = generate_code_verifier() + + %{ + code_verifier: code_verifier, + code_challenge: generate_code_challenge(code_verifier), + code_challenge_method: "S256" + } + end +end diff --git a/lib/workos/portal.ex b/lib/workos/portal.ex deleted file mode 100644 index ef855d25..00000000 --- a/lib/workos/portal.ex +++ /dev/null @@ -1,61 +0,0 @@ -defmodule WorkOS.Portal do - @moduledoc """ - Manage Portal in WorkOS. - - @see https://workos.com/docs/reference/admin-portal - """ - - alias WorkOS.Portal.Link - - @generate_portal_link_intent [ - "audit_logs", - "domain_verification", - "dsync", - "log_streams", - "sso" - ] - - @doc """ - Generates a Portal Link - - Parameter options: - - * `:organization` - An Organization identifier. (required) - * `:intent` - The intent of the Admin Portal. (required) - * `:return_url` - The URL to which WorkOS should send users when they click on the link to return to your website. - * `:success_url` - The URL to which WorkOS will redirect users to upon successfully setting up Single Sign-On or Directory Sync. - - """ - def generate_link(client \\ WorkOS.client(), _opts) - - def generate_link(_client, %{intent: intent} = _opts) - when intent not in @generate_portal_link_intent, - do: - raise(ArgumentError, - message: - "Invalid intent, must be one of the following: " <> - Enum.join(@generate_portal_link_intent, ", ") - ) - - @spec generate_link(map()) :: - WorkOS.Client.response(Link.t()) - @spec generate_link(WorkOS.Client.t(), map()) :: - WorkOS.Client.response(Link.t()) - def generate_link(client, opts) - when is_map_key(opts, :organization) and is_map_key(opts, :intent) do - WorkOS.Client.post( - client, - Link, - "/portal/generate_link", - %{ - organization: opts[:organization], - intent: opts[:intent], - return_url: opts[:return_url], - success_url: opts[:success_url] - } - ) - end - - def generate_link(_client, _opts), - do: raise(ArgumentError, message: "Needs both intent and organization.") -end diff --git a/lib/workos/portal/link.ex b/lib/workos/portal/link.ex deleted file mode 100644 index df7a99e4..00000000 --- a/lib/workos/portal/link.ex +++ /dev/null @@ -1,25 +0,0 @@ -defmodule WorkOS.Portal.Link do - @moduledoc """ - WorkOS Portal Link struct. - """ - - @behaviour WorkOS.Castable - - @type t() :: %__MODULE__{ - link: String.t() - } - - @enforce_keys [ - :link - ] - defstruct [ - :link - ] - - @impl true - def cast(map) do - %__MODULE__{ - link: map["link"] - } - end -end diff --git a/lib/workos/portal_link_response.ex b/lib/workos/portal_link_response.ex new file mode 100644 index 00000000..1202a1ae --- /dev/null +++ b/lib/workos/portal_link_response.ex @@ -0,0 +1,31 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.PortalLinkResponse do + @moduledoc """ + PortalLinkResponse model. + """ + + defstruct [ + :link + ] + + @type t :: %__MODULE__{ + link: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + link: map["link"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "link" => struct.link + }) + end +end diff --git a/lib/workos/profile.ex b/lib/workos/profile.ex new file mode 100644 index 00000000..48d0f290 --- /dev/null +++ b/lib/workos/profile.ex @@ -0,0 +1,92 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.Profile do + @moduledoc """ + Profile model. + """ + + defstruct [ + :object, + :id, + :organization_id, + :connection_id, + :connection_type, + :idp_id, + :email, + :first_name, + :last_name, + :name, + :raw_attributes, + :role, + :roles, + :groups, + :custom_attributes + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + organization_id: String.t() | nil, + connection_id: String.t(), + connection_type: WorkOS.ProfileConnectionType.t(), + idp_id: String.t(), + email: String.t(), + first_name: String.t() | nil, + last_name: String.t() | nil, + name: String.t() | nil, + raw_attributes: %{optional(String.t()) => term()}, + role: WorkOS.SlimRole.t() | nil, + roles: [WorkOS.SlimRole.t()] | nil, + groups: [String.t()] | nil, + custom_attributes: %{optional(String.t()) => term()} | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + organization_id: map["organization_id"], + connection_id: map["connection_id"], + connection_type: + WorkOS.Cast.enum(map["connection_type"], &WorkOS.ProfileConnectionType.cast/1), + idp_id: map["idp_id"], + email: map["email"], + first_name: map["first_name"], + last_name: map["last_name"], + name: map["name"], + raw_attributes: map["raw_attributes"], + role: WorkOS.Cast.nested(map["role"], &WorkOS.SlimRole.from_map/1), + roles: WorkOS.Cast.list(map["roles"], &WorkOS.SlimRole.from_map/1), + groups: map["groups"], + custom_attributes: map["custom_attributes"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "organization_id" => struct.organization_id, + "connection_id" => struct.connection_id, + "connection_type" => + WorkOS.Cast.enum(struct.connection_type, &WorkOS.ProfileConnectionType.dump/1), + "idp_id" => struct.idp_id, + "email" => struct.email, + "first_name" => struct.first_name, + "last_name" => struct.last_name, + "name" => struct.name, + "raw_attributes" => struct.raw_attributes, + "role" => WorkOS.Cast.dump_struct(struct.role, &WorkOS.SlimRole.to_map/1), + "roles" => + WorkOS.Cast.list(struct.roles, fn item -> + WorkOS.Cast.dump_struct(item, &WorkOS.SlimRole.to_map/1) + end), + "groups" => struct.groups, + "custom_attributes" => struct.custom_attributes + }) + end +end diff --git a/lib/workos/profile_connection_type.ex b/lib/workos/profile_connection_type.ex new file mode 100644 index 00000000..6809a545 --- /dev/null +++ b/lib/workos/profile_connection_type.ex @@ -0,0 +1,227 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ProfileConnectionType do + @moduledoc """ + ProfileConnectionType enum. + """ + + @type t :: + :pending + | :adfssaml + | :adp_oidc + | :apple_oauth + | :auth_0_migration + | :auth_0_saml + | :azure_saml + | :bitbucket_oauth + | :cas_saml + | :class_link_saml + | :clever_oidc + | :cloudflare_saml + | :cyber_ark_saml + | :discord_oauth + | :duo_saml + | :entra_id_oidc + | :generic_oidc + | :generic_saml + | :git_hub_oauth + | :git_lab_oauth + | :google_oauth + | :google_oidc + | :google_saml + | :intuit_oauth + | :jump_cloud_saml + | :keycloak_saml + | :last_pass_saml + | :linked_in_oauth + | :login_gov_oidc + | :magic_link + | :microsoft_oauth + | :mini_orange_saml + | :net_iq_saml + | :okta_oidc + | :okta_saml + | :one_login_saml + | :oracle_saml + | :ping_federate_saml + | :ping_one_saml + | :rippling_saml + | :salesforce_saml + | :shibboleth_generic_saml + | :shibboleth_saml + | :simple_saml_php_saml + | :salesforce_oauth + | :slack_oauth + | :test_idp + | :vercel_marketplace_oauth + | :vercel_oauth + | :v_mware_saml + | :xero_oauth + + @doc "All known values." + @spec values() :: [t()] + def values, + do: [ + :pending, + :adfssaml, + :adp_oidc, + :apple_oauth, + :auth_0_migration, + :auth_0_saml, + :azure_saml, + :bitbucket_oauth, + :cas_saml, + :class_link_saml, + :clever_oidc, + :cloudflare_saml, + :cyber_ark_saml, + :discord_oauth, + :duo_saml, + :entra_id_oidc, + :generic_oidc, + :generic_saml, + :git_hub_oauth, + :git_lab_oauth, + :google_oauth, + :google_oidc, + :google_saml, + :intuit_oauth, + :jump_cloud_saml, + :keycloak_saml, + :last_pass_saml, + :linked_in_oauth, + :login_gov_oidc, + :magic_link, + :microsoft_oauth, + :mini_orange_saml, + :net_iq_saml, + :okta_oidc, + :okta_saml, + :one_login_saml, + :oracle_saml, + :ping_federate_saml, + :ping_one_saml, + :rippling_saml, + :salesforce_saml, + :shibboleth_generic_saml, + :shibboleth_saml, + :simple_saml_php_saml, + :salesforce_oauth, + :slack_oauth, + :test_idp, + :vercel_marketplace_oauth, + :vercel_oauth, + :v_mware_saml, + :xero_oauth + ] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("Pending"), do: :pending + def cast("ADFSSAML"), do: :adfssaml + def cast("AdpOidc"), do: :adp_oidc + def cast("AppleOAuth"), do: :apple_oauth + def cast("Auth0Migration"), do: :auth_0_migration + def cast("Auth0SAML"), do: :auth_0_saml + def cast("AzureSAML"), do: :azure_saml + def cast("BitbucketOAuth"), do: :bitbucket_oauth + def cast("CasSAML"), do: :cas_saml + def cast("ClassLinkSAML"), do: :class_link_saml + def cast("CleverOIDC"), do: :clever_oidc + def cast("CloudflareSAML"), do: :cloudflare_saml + def cast("CyberArkSAML"), do: :cyber_ark_saml + def cast("DiscordOAuth"), do: :discord_oauth + def cast("DuoSAML"), do: :duo_saml + def cast("EntraIdOIDC"), do: :entra_id_oidc + def cast("GenericOIDC"), do: :generic_oidc + def cast("GenericSAML"), do: :generic_saml + def cast("GitHubOAuth"), do: :git_hub_oauth + def cast("GitLabOAuth"), do: :git_lab_oauth + def cast("GoogleOAuth"), do: :google_oauth + def cast("GoogleOIDC"), do: :google_oidc + def cast("GoogleSAML"), do: :google_saml + def cast("IntuitOAuth"), do: :intuit_oauth + def cast("JumpCloudSAML"), do: :jump_cloud_saml + def cast("KeycloakSAML"), do: :keycloak_saml + def cast("LastPassSAML"), do: :last_pass_saml + def cast("LinkedInOAuth"), do: :linked_in_oauth + def cast("LoginGovOidc"), do: :login_gov_oidc + def cast("MagicLink"), do: :magic_link + def cast("MicrosoftOAuth"), do: :microsoft_oauth + def cast("MiniOrangeSAML"), do: :mini_orange_saml + def cast("NetIqSAML"), do: :net_iq_saml + def cast("OktaOIDC"), do: :okta_oidc + def cast("OktaSAML"), do: :okta_saml + def cast("OneLoginSAML"), do: :one_login_saml + def cast("OracleSAML"), do: :oracle_saml + def cast("PingFederateSAML"), do: :ping_federate_saml + def cast("PingOneSAML"), do: :ping_one_saml + def cast("RipplingSAML"), do: :rippling_saml + def cast("SalesforceSAML"), do: :salesforce_saml + def cast("ShibbolethGenericSAML"), do: :shibboleth_generic_saml + def cast("ShibbolethSAML"), do: :shibboleth_saml + def cast("SimpleSamlPhpSAML"), do: :simple_saml_php_saml + def cast("SalesforceOAuth"), do: :salesforce_oauth + def cast("SlackOAuth"), do: :slack_oauth + def cast("TestIdp"), do: :test_idp + def cast("VercelMarketplaceOAuth"), do: :vercel_marketplace_oauth + def cast("VercelOAuth"), do: :vercel_oauth + def cast("VMwareSAML"), do: :v_mware_saml + def cast("XeroOAuth"), do: :xero_oauth + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:pending), do: "Pending" + def dump(:adfssaml), do: "ADFSSAML" + def dump(:adp_oidc), do: "AdpOidc" + def dump(:apple_oauth), do: "AppleOAuth" + def dump(:auth_0_migration), do: "Auth0Migration" + def dump(:auth_0_saml), do: "Auth0SAML" + def dump(:azure_saml), do: "AzureSAML" + def dump(:bitbucket_oauth), do: "BitbucketOAuth" + def dump(:cas_saml), do: "CasSAML" + def dump(:class_link_saml), do: "ClassLinkSAML" + def dump(:clever_oidc), do: "CleverOIDC" + def dump(:cloudflare_saml), do: "CloudflareSAML" + def dump(:cyber_ark_saml), do: "CyberArkSAML" + def dump(:discord_oauth), do: "DiscordOAuth" + def dump(:duo_saml), do: "DuoSAML" + def dump(:entra_id_oidc), do: "EntraIdOIDC" + def dump(:generic_oidc), do: "GenericOIDC" + def dump(:generic_saml), do: "GenericSAML" + def dump(:git_hub_oauth), do: "GitHubOAuth" + def dump(:git_lab_oauth), do: "GitLabOAuth" + def dump(:google_oauth), do: "GoogleOAuth" + def dump(:google_oidc), do: "GoogleOIDC" + def dump(:google_saml), do: "GoogleSAML" + def dump(:intuit_oauth), do: "IntuitOAuth" + def dump(:jump_cloud_saml), do: "JumpCloudSAML" + def dump(:keycloak_saml), do: "KeycloakSAML" + def dump(:last_pass_saml), do: "LastPassSAML" + def dump(:linked_in_oauth), do: "LinkedInOAuth" + def dump(:login_gov_oidc), do: "LoginGovOidc" + def dump(:magic_link), do: "MagicLink" + def dump(:microsoft_oauth), do: "MicrosoftOAuth" + def dump(:mini_orange_saml), do: "MiniOrangeSAML" + def dump(:net_iq_saml), do: "NetIqSAML" + def dump(:okta_oidc), do: "OktaOIDC" + def dump(:okta_saml), do: "OktaSAML" + def dump(:one_login_saml), do: "OneLoginSAML" + def dump(:oracle_saml), do: "OracleSAML" + def dump(:ping_federate_saml), do: "PingFederateSAML" + def dump(:ping_one_saml), do: "PingOneSAML" + def dump(:rippling_saml), do: "RipplingSAML" + def dump(:salesforce_saml), do: "SalesforceSAML" + def dump(:shibboleth_generic_saml), do: "ShibbolethGenericSAML" + def dump(:shibboleth_saml), do: "ShibbolethSAML" + def dump(:simple_saml_php_saml), do: "SimpleSamlPhpSAML" + def dump(:salesforce_oauth), do: "SalesforceOAuth" + def dump(:slack_oauth), do: "SlackOAuth" + def dump(:test_idp), do: "TestIdp" + def dump(:vercel_marketplace_oauth), do: "VercelMarketplaceOAuth" + def dump(:vercel_oauth), do: "VercelOAuth" + def dump(:v_mware_saml), do: "VMwareSAML" + def dump(:xero_oauth), do: "XeroOAuth" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/public_client.ex b/lib/workos/public_client.ex new file mode 100644 index 00000000..c4dc9474 --- /dev/null +++ b/lib/workos/public_client.ex @@ -0,0 +1,69 @@ +# @oagen-ignore-file — hand-maintained; PKCE-only public-client preset. + +defmodule WorkOS.PublicClient do + @moduledoc """ + A client preset for public (PKCE-only) applications — no API key required. + + Exposes only the helper surface that is safe without a client secret: + authorization URL builders with automatic PKCE. + + public = WorkOS.PublicClient.new("client_123") + + %{url: url, code_verifier: verifier} = + WorkOS.PublicClient.get_authorization_url(public, %{redirect_uri: "..."}) + + Exchange the resulting code with `WorkOS.AuthKit.pkce_code_exchange/3` or + `WorkOS.SSO.PKCE.code_exchange/3` from your backend, or against the token + endpoint directly from the public client's environment. + """ + + alias WorkOS.SSO.PKCE + + defstruct [:client] + + @type t :: %__MODULE__{client: WorkOS.Client.t()} + + @doc """ + Builds a public client from a client ID. No API key is required. + + ## Options + + * `:base_url` — override the API base URL + """ + @spec new(String.t(), keyword()) :: t() + def new(client_id, opts \\ []) do + if !(is_binary(client_id) and client_id != "") do + raise WorkOS.ConfigurationError, message: "client_id is required for WorkOS.PublicClient" + end + + %__MODULE__{ + client: %WorkOS.Client{ + # Public clients have no API key; URL builders never read it. + api_key: "", + client_id: client_id, + base_url: String.trim_trailing(opts[:base_url] || "https://api.workos.com", "/"), + timeout: 60_000, + max_retries: 3, + req_options: [] + } + } + end + + @doc """ + Builds an AuthKit authorization URL with automatically generated PKCE + parameters and state. See `WorkOS.AuthKit.get_pkce_authorization_url/2`. + """ + @spec get_authorization_url(t(), map()) :: WorkOS.AuthKit.pkce_authorization_url() + def get_authorization_url(%__MODULE__{client: client}, params \\ %{}) do + WorkOS.AuthKit.get_pkce_authorization_url(client, params) + end + + @doc """ + Builds an SSO authorization URL with automatically generated PKCE + parameters and state. See `WorkOS.SSO.PKCE.get_authorization_url/2`. + """ + @spec get_sso_authorization_url(t(), map()) :: WorkOS.AuthKit.pkce_authorization_url() + def get_sso_authorization_url(%__MODULE__{client: client}, params \\ %{}) do + PKCE.get_authorization_url(client, params) + end +end diff --git a/lib/workos/radar.ex b/lib/workos/radar.ex new file mode 100644 index 00000000..d0012d47 --- /dev/null +++ b/lib/workos/radar.ex @@ -0,0 +1,99 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.Radar do + @moduledoc """ + Operations for the Radar API. + """ + + @doc """ + Create an attempt + + Assess a request for risk using the Radar engine and receive a verdict. + + ## Parameters + + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec create_attempt(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.RadarStandaloneResponse.t()} | {:error, WorkOS.Error.error()} + def create_attempt(client, params \\ %{}, opts \\ []) do + with {:ok, body} <- WorkOS.Client.request(client, :post, "/radar/attempts", params, opts) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.RadarStandaloneResponse.from_map/1)} + end + end + + @doc """ + Update a Radar attempt + + You may optionally inform Radar that an authentication attempt or challenge was successful using this endpoint. Some Radar controls depend on tracking recent successful attempts, such as impossible travel. + + ## Parameters + + * `id` — The unique identifier of the Radar attempt to update. + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec update_attempt(WorkOS.Client.t(), String.t(), map(), keyword()) :: + {:ok, term()} | {:error, WorkOS.Error.error()} + def update_attempt(client, id, params \\ %{}, opts \\ []) do + WorkOS.Client.request( + client, + :put, + "/radar/attempts/#{URI.encode(id, &URI.char_unreserved?/1)}", + params, + opts + ) + end + + @doc """ + Add an entry to a Radar list + + Add an entry to a Radar list. + + ## Parameters + + * `type` — The type of the Radar list (e.g. ip_address, domain, email). + * `action` — The list action indicating whether to add the entry to the allow or block list. + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec add_list_entry(WorkOS.Client.t(), String.t(), String.t(), map(), keyword()) :: + {:ok, WorkOS.RadarListEntryAlreadyPresentResponse.t()} | {:error, WorkOS.Error.error()} + def add_list_entry(client, type, action, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :post, + "/radar/lists/#{URI.encode(type, &URI.char_unreserved?/1)}/#{URI.encode(action, &URI.char_unreserved?/1)}", + params, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.RadarListEntryAlreadyPresentResponse.from_map/1)} + end + end + + @doc """ + Remove an entry from a Radar list + + Remove an entry from a Radar list. + + ## Parameters + + * `type` — The type of the Radar list (e.g. ip_address, domain, email). + * `action` — The list action indicating whether to remove the entry from the allow or block list. + * `params` — query parameters + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec remove_list_entry(WorkOS.Client.t(), String.t(), String.t(), map(), keyword()) :: + {:ok, term()} | {:error, WorkOS.Error.error()} + def remove_list_entry(client, type, action, params \\ %{}, opts \\ []) do + WorkOS.Client.request( + client, + :delete, + "/radar/lists/#{URI.encode(type, &URI.char_unreserved?/1)}/#{URI.encode(action, &URI.char_unreserved?/1)}", + params, + opts + ) + end +end diff --git a/lib/workos/radar_challenge.ex b/lib/workos/radar_challenge.ex new file mode 100644 index 00000000..bba7e2c3 --- /dev/null +++ b/lib/workos/radar_challenge.ex @@ -0,0 +1,63 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.RadarChallenge do + @moduledoc """ + RadarChallenge model. + """ + + defstruct [ + :object, + :id, + :type, + :user_id, + :email, + :expires_at, + :created_at, + :updated_at, + :code + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + type: String.t(), + user_id: String.t(), + email: String.t(), + expires_at: String.t(), + created_at: String.t(), + updated_at: String.t(), + code: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + type: map["type"], + user_id: map["user_id"], + email: map["email"], + expires_at: map["expires_at"], + created_at: map["created_at"], + updated_at: map["updated_at"], + code: map["code"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "type" => struct.type, + "user_id" => struct.user_id, + "email" => struct.email, + "expires_at" => struct.expires_at, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at, + "code" => struct.code + }) + end +end diff --git a/lib/workos/radar_challenge_created.ex b/lib/workos/radar_challenge_created.ex new file mode 100644 index 00000000..1b8d098e --- /dev/null +++ b/lib/workos/radar_challenge_created.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.RadarChallengeCreated do + @moduledoc """ + RadarChallengeCreated model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.RadarChallengeCreatedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.RadarChallengeCreatedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => WorkOS.Cast.dump_struct(struct.data, &WorkOS.RadarChallengeCreatedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/radar_challenge_created_data.ex b/lib/workos/radar_challenge_created_data.ex new file mode 100644 index 00000000..cdb384ea --- /dev/null +++ b/lib/workos/radar_challenge_created_data.ex @@ -0,0 +1,43 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.RadarChallengeCreatedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :type, + :radar_challenge_id, + :user_id, + :email + ] + + @type t :: %__MODULE__{ + type: String.t(), + radar_challenge_id: String.t(), + user_id: String.t(), + email: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + type: map["type"], + radar_challenge_id: map["radar_challenge_id"], + user_id: map["user_id"], + email: map["email"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "type" => struct.type, + "radar_challenge_id" => struct.radar_challenge_id, + "user_id" => struct.user_id, + "email" => struct.email + }) + end +end diff --git a/lib/workos/radar_email_challenge_code_session_authenticate_request.ex b/lib/workos/radar_email_challenge_code_session_authenticate_request.ex new file mode 100644 index 00000000..f62dcf3b --- /dev/null +++ b/lib/workos/radar_email_challenge_code_session_authenticate_request.ex @@ -0,0 +1,63 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.RadarEmailChallengeCodeSessionAuthenticateRequest do + @moduledoc """ + RadarEmailChallengeCodeSessionAuthenticateRequest model. + """ + + defstruct [ + :client_id, + :client_secret, + :grant_type, + :code, + :radar_challenge_id, + :pending_authentication_token, + :ip_address, + :device_id, + :user_agent + ] + + @type t :: %__MODULE__{ + client_id: String.t(), + client_secret: String.t(), + grant_type: String.t(), + code: String.t(), + radar_challenge_id: String.t(), + pending_authentication_token: String.t(), + ip_address: String.t() | nil, + device_id: String.t() | nil, + user_agent: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + client_id: map["client_id"], + client_secret: map["client_secret"], + grant_type: map["grant_type"], + code: map["code"], + radar_challenge_id: map["radar_challenge_id"], + pending_authentication_token: map["pending_authentication_token"], + ip_address: map["ip_address"], + device_id: map["device_id"], + user_agent: map["user_agent"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "client_id" => struct.client_id, + "client_secret" => struct.client_secret, + "grant_type" => struct.grant_type, + "code" => struct.code, + "radar_challenge_id" => struct.radar_challenge_id, + "pending_authentication_token" => struct.pending_authentication_token, + "ip_address" => struct.ip_address, + "device_id" => struct.device_id, + "user_agent" => struct.user_agent + }) + end +end diff --git a/lib/workos/radar_list_action.ex b/lib/workos/radar_list_action.ex new file mode 100644 index 00000000..7c3af4c3 --- /dev/null +++ b/lib/workos/radar_list_action.ex @@ -0,0 +1,25 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.RadarListAction do + @moduledoc """ + RadarListAction enum. + """ + + @type t :: :block | :allow + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:block, :allow] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("block"), do: :block + def cast("allow"), do: :allow + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:block), do: "block" + def dump(:allow), do: "allow" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/radar_list_entry_already_present_response.ex b/lib/workos/radar_list_entry_already_present_response.ex new file mode 100644 index 00000000..d729e2ea --- /dev/null +++ b/lib/workos/radar_list_entry_already_present_response.ex @@ -0,0 +1,31 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.RadarListEntryAlreadyPresentResponse do + @moduledoc """ + RadarListEntryAlreadyPresentResponse model. + """ + + defstruct [ + :message + ] + + @type t :: %__MODULE__{ + message: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + message: map["message"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "message" => struct.message + }) + end +end diff --git a/lib/workos/radar_list_type.ex b/lib/workos/radar_list_type.ex new file mode 100644 index 00000000..c95d8500 --- /dev/null +++ b/lib/workos/radar_list_type.ex @@ -0,0 +1,37 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.RadarListType do + @moduledoc """ + RadarListType enum. + """ + + @type t :: + :ip_address | :domain | :email | :device | :user_agent | :device_fingerprint | :country + + @doc "All known values." + @spec values() :: [t()] + def values, + do: [:ip_address, :domain, :email, :device, :user_agent, :device_fingerprint, :country] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("ip_address"), do: :ip_address + def cast("domain"), do: :domain + def cast("email"), do: :email + def cast("device"), do: :device + def cast("user_agent"), do: :user_agent + def cast("device_fingerprint"), do: :device_fingerprint + def cast("country"), do: :country + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:ip_address), do: "ip_address" + def dump(:domain), do: "domain" + def dump(:email), do: "email" + def dump(:device), do: "device" + def dump(:user_agent), do: "user_agent" + def dump(:device_fingerprint), do: "device_fingerprint" + def dump(:country), do: "country" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/radar_sms_challenge_code_session_authenticate_request.ex b/lib/workos/radar_sms_challenge_code_session_authenticate_request.ex new file mode 100644 index 00000000..9599e6b5 --- /dev/null +++ b/lib/workos/radar_sms_challenge_code_session_authenticate_request.ex @@ -0,0 +1,67 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.RadarSmsChallengeCodeSessionAuthenticateRequest do + @moduledoc """ + RadarSmsChallengeCodeSessionAuthenticateRequest model. + """ + + defstruct [ + :client_id, + :client_secret, + :grant_type, + :code, + :verification_id, + :phone_number, + :pending_authentication_token, + :ip_address, + :device_id, + :user_agent + ] + + @type t :: %__MODULE__{ + client_id: String.t(), + client_secret: String.t(), + grant_type: String.t(), + code: String.t(), + verification_id: String.t(), + phone_number: String.t(), + pending_authentication_token: String.t(), + ip_address: String.t() | nil, + device_id: String.t() | nil, + user_agent: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + client_id: map["client_id"], + client_secret: map["client_secret"], + grant_type: map["grant_type"], + code: map["code"], + verification_id: map["verification_id"], + phone_number: map["phone_number"], + pending_authentication_token: map["pending_authentication_token"], + ip_address: map["ip_address"], + device_id: map["device_id"], + user_agent: map["user_agent"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "client_id" => struct.client_id, + "client_secret" => struct.client_secret, + "grant_type" => struct.grant_type, + "code" => struct.code, + "verification_id" => struct.verification_id, + "phone_number" => struct.phone_number, + "pending_authentication_token" => struct.pending_authentication_token, + "ip_address" => struct.ip_address, + "device_id" => struct.device_id, + "user_agent" => struct.user_agent + }) + end +end diff --git a/lib/workos/radar_standalone_assess_request.ex b/lib/workos/radar_standalone_assess_request.ex new file mode 100644 index 00000000..84fb0600 --- /dev/null +++ b/lib/workos/radar_standalone_assess_request.ex @@ -0,0 +1,60 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.RadarStandaloneAssessRequest do + @moduledoc """ + RadarStandaloneAssessRequest model. + """ + + defstruct [ + :ip_address, + :user_agent, + :email, + :auth_method, + :action, + :signals_id + ] + + @type t :: %__MODULE__{ + ip_address: String.t(), + user_agent: String.t(), + email: String.t(), + auth_method: WorkOS.RadarStandaloneAssessRequestAuthMethod.t(), + action: WorkOS.RadarStandaloneAssessRequestAction.t(), + signals_id: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + ip_address: map["ip_address"], + user_agent: map["user_agent"], + email: map["email"], + auth_method: + WorkOS.Cast.enum( + map["auth_method"], + &WorkOS.RadarStandaloneAssessRequestAuthMethod.cast/1 + ), + action: WorkOS.Cast.enum(map["action"], &WorkOS.RadarStandaloneAssessRequestAction.cast/1), + signals_id: map["signals_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "ip_address" => struct.ip_address, + "user_agent" => struct.user_agent, + "email" => struct.email, + "auth_method" => + WorkOS.Cast.enum( + struct.auth_method, + &WorkOS.RadarStandaloneAssessRequestAuthMethod.dump/1 + ), + "action" => + WorkOS.Cast.enum(struct.action, &WorkOS.RadarStandaloneAssessRequestAction.dump/1), + "signals_id" => struct.signals_id + }) + end +end diff --git a/lib/workos/radar_standalone_assess_request_action.ex b/lib/workos/radar_standalone_assess_request_action.ex new file mode 100644 index 00000000..1fe90c44 --- /dev/null +++ b/lib/workos/radar_standalone_assess_request_action.ex @@ -0,0 +1,25 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.RadarStandaloneAssessRequestAction do + @moduledoc """ + RadarStandaloneAssessRequestAction enum. + """ + + @type t :: :sign_up | :sign_in + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:sign_up, :sign_in] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("sign-up"), do: :sign_up + def cast("sign-in"), do: :sign_in + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:sign_up), do: "sign-up" + def dump(:sign_in), do: "sign-in" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/radar_standalone_assess_request_auth_method.ex b/lib/workos/radar_standalone_assess_request_auth_method.ex new file mode 100644 index 00000000..4bc1fd96 --- /dev/null +++ b/lib/workos/radar_standalone_assess_request_auth_method.ex @@ -0,0 +1,39 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.RadarStandaloneAssessRequestAuthMethod do + @moduledoc """ + RadarStandaloneAssessRequestAuthMethod enum. + """ + + @type t :: + :password | :passkey | :authenticator | :sms_otp | :email_otp | :social | :sso | :other + + @doc "All known values." + @spec values() :: [t()] + def values, + do: [:password, :passkey, :authenticator, :sms_otp, :email_otp, :social, :sso, :other] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("Password"), do: :password + def cast("Passkey"), do: :passkey + def cast("Authenticator"), do: :authenticator + def cast("SMS_OTP"), do: :sms_otp + def cast("Email_OTP"), do: :email_otp + def cast("Social"), do: :social + def cast("SSO"), do: :sso + def cast("Other"), do: :other + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:password), do: "Password" + def dump(:passkey), do: "Passkey" + def dump(:authenticator), do: "Authenticator" + def dump(:sms_otp), do: "SMS_OTP" + def dump(:email_otp), do: "Email_OTP" + def dump(:social), do: "Social" + def dump(:sso), do: "SSO" + def dump(:other), do: "Other" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/radar_standalone_delete_radar_list_entry_request.ex b/lib/workos/radar_standalone_delete_radar_list_entry_request.ex new file mode 100644 index 00000000..dd0bcf20 --- /dev/null +++ b/lib/workos/radar_standalone_delete_radar_list_entry_request.ex @@ -0,0 +1,31 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.RadarStandaloneDeleteRadarListEntryRequest do + @moduledoc """ + RadarStandaloneDeleteRadarListEntryRequest model. + """ + + defstruct [ + :entry + ] + + @type t :: %__MODULE__{ + entry: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + entry: map["entry"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "entry" => struct.entry + }) + end +end diff --git a/lib/workos/radar_standalone_response.ex b/lib/workos/radar_standalone_response.ex new file mode 100644 index 00000000..2869c00a --- /dev/null +++ b/lib/workos/radar_standalone_response.ex @@ -0,0 +1,57 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.RadarStandaloneResponse do + @moduledoc """ + RadarStandaloneResponse model. + """ + + defstruct [ + :verdict, + :reason, + :attempt_id, + :control, + :blocklist_type + ] + + @type t :: %__MODULE__{ + verdict: WorkOS.RadarStandaloneResponseVerdict.t(), + reason: String.t(), + attempt_id: String.t(), + control: WorkOS.RadarStandaloneResponseControl.t() | nil, + blocklist_type: WorkOS.RadarStandaloneResponseBlocklistType.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + verdict: WorkOS.Cast.enum(map["verdict"], &WorkOS.RadarStandaloneResponseVerdict.cast/1), + reason: map["reason"], + attempt_id: map["attempt_id"], + control: WorkOS.Cast.enum(map["control"], &WorkOS.RadarStandaloneResponseControl.cast/1), + blocklist_type: + WorkOS.Cast.enum( + map["blocklist_type"], + &WorkOS.RadarStandaloneResponseBlocklistType.cast/1 + ) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "verdict" => + WorkOS.Cast.enum(struct.verdict, &WorkOS.RadarStandaloneResponseVerdict.dump/1), + "reason" => struct.reason, + "attempt_id" => struct.attempt_id, + "control" => + WorkOS.Cast.enum(struct.control, &WorkOS.RadarStandaloneResponseControl.dump/1), + "blocklist_type" => + WorkOS.Cast.enum( + struct.blocklist_type, + &WorkOS.RadarStandaloneResponseBlocklistType.dump/1 + ) + }) + end +end diff --git a/lib/workos/radar_standalone_response_blocklist_type.ex b/lib/workos/radar_standalone_response_blocklist_type.ex new file mode 100644 index 00000000..c0403001 --- /dev/null +++ b/lib/workos/radar_standalone_response_blocklist_type.ex @@ -0,0 +1,37 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.RadarStandaloneResponseBlocklistType do + @moduledoc """ + RadarStandaloneResponseBlocklistType enum. + """ + + @type t :: + :ip_address | :domain | :email | :device | :user_agent | :device_fingerprint | :country + + @doc "All known values." + @spec values() :: [t()] + def values, + do: [:ip_address, :domain, :email, :device, :user_agent, :device_fingerprint, :country] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("ip_address"), do: :ip_address + def cast("domain"), do: :domain + def cast("email"), do: :email + def cast("device"), do: :device + def cast("user_agent"), do: :user_agent + def cast("device_fingerprint"), do: :device_fingerprint + def cast("country"), do: :country + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:ip_address), do: "ip_address" + def dump(:domain), do: "domain" + def dump(:email), do: "email" + def dump(:device), do: "device" + def dump(:user_agent), do: "user_agent" + def dump(:device_fingerprint), do: "device_fingerprint" + def dump(:country), do: "country" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/radar_standalone_response_control.ex b/lib/workos/radar_standalone_response_control.ex new file mode 100644 index 00000000..5d163955 --- /dev/null +++ b/lib/workos/radar_standalone_response_control.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.RadarStandaloneResponseControl do + @moduledoc """ + RadarStandaloneResponseControl enum. + """ + + @type t :: + :bot_detection + | :brute_force_attack + | :impossible_travel + | :repeat_sign_up + | :stale_account + | :unrecognized_device + | :restriction + + @doc "All known values." + @spec values() :: [t()] + def values, + do: [ + :bot_detection, + :brute_force_attack, + :impossible_travel, + :repeat_sign_up, + :stale_account, + :unrecognized_device, + :restriction + ] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("bot_detection"), do: :bot_detection + def cast("brute_force_attack"), do: :brute_force_attack + def cast("impossible_travel"), do: :impossible_travel + def cast("repeat_sign_up"), do: :repeat_sign_up + def cast("stale_account"), do: :stale_account + def cast("unrecognized_device"), do: :unrecognized_device + def cast("restriction"), do: :restriction + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:bot_detection), do: "bot_detection" + def dump(:brute_force_attack), do: "brute_force_attack" + def dump(:impossible_travel), do: "impossible_travel" + def dump(:repeat_sign_up), do: "repeat_sign_up" + def dump(:stale_account), do: "stale_account" + def dump(:unrecognized_device), do: "unrecognized_device" + def dump(:restriction), do: "restriction" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/radar_standalone_response_verdict.ex b/lib/workos/radar_standalone_response_verdict.ex new file mode 100644 index 00000000..104cecc5 --- /dev/null +++ b/lib/workos/radar_standalone_response_verdict.ex @@ -0,0 +1,27 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.RadarStandaloneResponseVerdict do + @moduledoc """ + RadarStandaloneResponseVerdict enum. + """ + + @type t :: :allow | :block | :challenge + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:allow, :block, :challenge] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("allow"), do: :allow + def cast("block"), do: :block + def cast("challenge"), do: :challenge + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:allow), do: "allow" + def dump(:block), do: "block" + def dump(:challenge), do: "challenge" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/radar_standalone_update_radar_attempt_request.ex b/lib/workos/radar_standalone_update_radar_attempt_request.ex new file mode 100644 index 00000000..9fccf4f5 --- /dev/null +++ b/lib/workos/radar_standalone_update_radar_attempt_request.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.RadarStandaloneUpdateRadarAttemptRequest do + @moduledoc """ + RadarStandaloneUpdateRadarAttemptRequest model. + """ + + defstruct [ + :challenge_status, + :attempt_status + ] + + @type t :: %__MODULE__{ + challenge_status: String.t() | nil, + attempt_status: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + challenge_status: map["challenge_status"], + attempt_status: map["attempt_status"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "challenge_status" => struct.challenge_status, + "attempt_status" => struct.attempt_status + }) + end +end diff --git a/lib/workos/radar_standalone_update_radar_list_request.ex b/lib/workos/radar_standalone_update_radar_list_request.ex new file mode 100644 index 00000000..854387a2 --- /dev/null +++ b/lib/workos/radar_standalone_update_radar_list_request.ex @@ -0,0 +1,31 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.RadarStandaloneUpdateRadarListRequest do + @moduledoc """ + RadarStandaloneUpdateRadarListRequest model. + """ + + defstruct [ + :entry + ] + + @type t :: %__MODULE__{ + entry: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + entry: map["entry"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "entry" => struct.entry + }) + end +end diff --git a/lib/workos/redirect_uri.ex b/lib/workos/redirect_uri.ex new file mode 100644 index 00000000..c4afe42b --- /dev/null +++ b/lib/workos/redirect_uri.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.RedirectUri do + @moduledoc """ + RedirectUri model. + """ + + defstruct [ + :object, + :id, + :uri, + :default, + :created_at, + :updated_at + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + uri: String.t(), + default: boolean(), + created_at: String.t(), + updated_at: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + uri: map["uri"], + default: map["default"], + created_at: map["created_at"], + updated_at: map["updated_at"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "uri" => struct.uri, + "default" => struct.default, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at + }) + end +end diff --git a/lib/workos/redirect_uri_input.ex b/lib/workos/redirect_uri_input.ex new file mode 100644 index 00000000..d2d21457 --- /dev/null +++ b/lib/workos/redirect_uri_input.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.RedirectUriInput do + @moduledoc """ + RedirectUriInput model. + """ + + defstruct [ + :uri, + :default + ] + + @type t :: %__MODULE__{ + uri: String.t(), + default: boolean() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + uri: map["uri"], + default: map["default"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "uri" => struct.uri, + "default" => struct.default + }) + end +end diff --git a/lib/workos/refresh_token_session_authenticate_request.ex b/lib/workos/refresh_token_session_authenticate_request.ex new file mode 100644 index 00000000..868cf7a8 --- /dev/null +++ b/lib/workos/refresh_token_session_authenticate_request.ex @@ -0,0 +1,59 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.RefreshTokenSessionAuthenticateRequest do + @moduledoc """ + RefreshTokenSessionAuthenticateRequest model. + """ + + defstruct [ + :client_id, + :grant_type, + :refresh_token, + :client_secret, + :organization_id, + :ip_address, + :device_id, + :user_agent + ] + + @type t :: %__MODULE__{ + client_id: String.t(), + grant_type: String.t(), + refresh_token: String.t(), + client_secret: String.t() | nil, + organization_id: String.t() | nil, + ip_address: String.t() | nil, + device_id: String.t() | nil, + user_agent: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + client_id: map["client_id"], + grant_type: map["grant_type"], + refresh_token: map["refresh_token"], + client_secret: map["client_secret"], + organization_id: map["organization_id"], + ip_address: map["ip_address"], + device_id: map["device_id"], + user_agent: map["user_agent"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "client_id" => struct.client_id, + "grant_type" => struct.grant_type, + "refresh_token" => struct.refresh_token, + "client_secret" => struct.client_secret, + "organization_id" => struct.organization_id, + "ip_address" => struct.ip_address, + "device_id" => struct.device_id, + "user_agent" => struct.user_agent + }) + end +end diff --git a/lib/workos/rekey_request.ex b/lib/workos/rekey_request.ex new file mode 100644 index 00000000..03bc156e --- /dev/null +++ b/lib/workos/rekey_request.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.RekeyRequest do + @moduledoc """ + RekeyRequest model. + """ + + defstruct [ + :context, + :encrypted_keys + ] + + @type t :: %__MODULE__{ + context: %{optional(String.t()) => String.t()}, + encrypted_keys: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + context: map["context"], + encrypted_keys: map["encrypted_keys"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "context" => struct.context, + "encrypted_keys" => struct.encrypted_keys + }) + end +end diff --git a/lib/workos/remove_role.ex b/lib/workos/remove_role.ex new file mode 100644 index 00000000..ec0430ba --- /dev/null +++ b/lib/workos/remove_role.ex @@ -0,0 +1,43 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.RemoveRole do + @moduledoc """ + RemoveRole model. + """ + + defstruct [ + :role_slug, + :resource_id, + :resource_external_id, + :resource_type_slug + ] + + @type t :: %__MODULE__{ + role_slug: String.t(), + resource_id: String.t() | nil, + resource_external_id: String.t() | nil, + resource_type_slug: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + role_slug: map["role_slug"], + resource_id: map["resource_id"], + resource_external_id: map["resource_external_id"], + resource_type_slug: map["resource_type_slug"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "role_slug" => struct.role_slug, + "resource_id" => struct.resource_id, + "resource_external_id" => struct.resource_external_id, + "resource_type_slug" => struct.resource_type_slug + }) + end +end diff --git a/lib/workos/replace_group_role_assignment_entry.ex b/lib/workos/replace_group_role_assignment_entry.ex new file mode 100644 index 00000000..ea7660c2 --- /dev/null +++ b/lib/workos/replace_group_role_assignment_entry.ex @@ -0,0 +1,43 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ReplaceGroupRoleAssignmentEntry do + @moduledoc """ + ReplaceGroupRoleAssignmentEntry model. + """ + + defstruct [ + :role_slug, + :resource_id, + :resource_external_id, + :resource_type_slug + ] + + @type t :: %__MODULE__{ + role_slug: String.t(), + resource_id: String.t() | nil, + resource_external_id: String.t() | nil, + resource_type_slug: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + role_slug: map["role_slug"], + resource_id: map["resource_id"], + resource_external_id: map["resource_external_id"], + resource_type_slug: map["resource_type_slug"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "role_slug" => struct.role_slug, + "resource_id" => struct.resource_id, + "resource_external_id" => struct.resource_external_id, + "resource_type_slug" => struct.resource_type_slug + }) + end +end diff --git a/lib/workos/replace_group_role_assignments.ex b/lib/workos/replace_group_role_assignments.ex new file mode 100644 index 00000000..aa3cb2cd --- /dev/null +++ b/lib/workos/replace_group_role_assignments.ex @@ -0,0 +1,38 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ReplaceGroupRoleAssignments do + @moduledoc """ + ReplaceGroupRoleAssignments model. + """ + + defstruct [ + :role_assignments + ] + + @type t :: %__MODULE__{ + role_assignments: [WorkOS.ReplaceGroupRoleAssignmentEntry.t()] + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + role_assignments: + WorkOS.Cast.list( + map["role_assignments"], + &WorkOS.ReplaceGroupRoleAssignmentEntry.from_map/1 + ) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "role_assignments" => + WorkOS.Cast.list(struct.role_assignments, fn item -> + WorkOS.Cast.dump_struct(item, &WorkOS.ReplaceGroupRoleAssignmentEntry.to_map/1) + end) + }) + end +end diff --git a/lib/workos/resend_user_invite_options.ex b/lib/workos/resend_user_invite_options.ex new file mode 100644 index 00000000..7a354549 --- /dev/null +++ b/lib/workos/resend_user_invite_options.ex @@ -0,0 +1,31 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ResendUserInviteOptions do + @moduledoc """ + ResendUserInviteOptions model. + """ + + defstruct [ + :locale + ] + + @type t :: %__MODULE__{ + locale: WorkOS.ResendUserInviteOptionsLocale.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + locale: WorkOS.Cast.enum(map["locale"], &WorkOS.ResendUserInviteOptionsLocale.cast/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "locale" => WorkOS.Cast.enum(struct.locale, &WorkOS.ResendUserInviteOptionsLocale.dump/1) + }) + end +end diff --git a/lib/workos/resend_user_invite_options_locale.ex b/lib/workos/resend_user_invite_options_locale.ex new file mode 100644 index 00000000..9e58946a --- /dev/null +++ b/lib/workos/resend_user_invite_options_locale.ex @@ -0,0 +1,383 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ResendUserInviteOptionsLocale do + @moduledoc """ + ResendUserInviteOptionsLocale enum. + """ + + @type t :: + :af + | :am + | :ar + | :bg + | :bn + | :bs + | :ca + | :cs + | :da + | :de + | :de_de + | :el + | :en + | :en_au + | :en_ca + | :en_gb + | :en_us + | :es + | :es_419 + | :es_es + | :es_us + | :et + | :fa + | :fi + | :fil + | :fr + | :fr_be + | :fr_ca + | :fr_fr + | :fy + | :gl + | :gu + | :ha + | :he + | :hi + | :hr + | :hu + | :hy + | :id + | :is + | :it + | :it_it + | :ja + | :jv + | :ka + | :kk + | :km + | :kn + | :ko + | :lt + | :lv + | :mk + | :ml + | :mn + | :mr + | :ms + | :my + | :nb + | :ne + | :nl + | :nl_be + | :nl_nl + | :nn + | :no + | :pa + | :pl + | :pt + | :pt_br + | :pt_pt + | :ro + | :ru + | :sk + | :sl + | :sq + | :sr + | :sv + | :sw + | :ta + | :te + | :th + | :tr + | :uk + | :ur + | :uz + | :vi + | :zh + | :zh_cn + | :zh_hk + | :zh_tw + | :zu + + @doc "All known values." + @spec values() :: [t()] + def values, + do: [ + :af, + :am, + :ar, + :bg, + :bn, + :bs, + :ca, + :cs, + :da, + :de, + :de_de, + :el, + :en, + :en_au, + :en_ca, + :en_gb, + :en_us, + :es, + :es_419, + :es_es, + :es_us, + :et, + :fa, + :fi, + :fil, + :fr, + :fr_be, + :fr_ca, + :fr_fr, + :fy, + :gl, + :gu, + :ha, + :he, + :hi, + :hr, + :hu, + :hy, + :id, + :is, + :it, + :it_it, + :ja, + :jv, + :ka, + :kk, + :km, + :kn, + :ko, + :lt, + :lv, + :mk, + :ml, + :mn, + :mr, + :ms, + :my, + :nb, + :ne, + :nl, + :nl_be, + :nl_nl, + :nn, + :no, + :pa, + :pl, + :pt, + :pt_br, + :pt_pt, + :ro, + :ru, + :sk, + :sl, + :sq, + :sr, + :sv, + :sw, + :ta, + :te, + :th, + :tr, + :uk, + :ur, + :uz, + :vi, + :zh, + :zh_cn, + :zh_hk, + :zh_tw, + :zu + ] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("af"), do: :af + def cast("am"), do: :am + def cast("ar"), do: :ar + def cast("bg"), do: :bg + def cast("bn"), do: :bn + def cast("bs"), do: :bs + def cast("ca"), do: :ca + def cast("cs"), do: :cs + def cast("da"), do: :da + def cast("de"), do: :de + def cast("de-DE"), do: :de_de + def cast("el"), do: :el + def cast("en"), do: :en + def cast("en-AU"), do: :en_au + def cast("en-CA"), do: :en_ca + def cast("en-GB"), do: :en_gb + def cast("en-US"), do: :en_us + def cast("es"), do: :es + def cast("es-419"), do: :es_419 + def cast("es-ES"), do: :es_es + def cast("es-US"), do: :es_us + def cast("et"), do: :et + def cast("fa"), do: :fa + def cast("fi"), do: :fi + def cast("fil"), do: :fil + def cast("fr"), do: :fr + def cast("fr-BE"), do: :fr_be + def cast("fr-CA"), do: :fr_ca + def cast("fr-FR"), do: :fr_fr + def cast("fy"), do: :fy + def cast("gl"), do: :gl + def cast("gu"), do: :gu + def cast("ha"), do: :ha + def cast("he"), do: :he + def cast("hi"), do: :hi + def cast("hr"), do: :hr + def cast("hu"), do: :hu + def cast("hy"), do: :hy + def cast("id"), do: :id + def cast("is"), do: :is + def cast("it"), do: :it + def cast("it-IT"), do: :it_it + def cast("ja"), do: :ja + def cast("jv"), do: :jv + def cast("ka"), do: :ka + def cast("kk"), do: :kk + def cast("km"), do: :km + def cast("kn"), do: :kn + def cast("ko"), do: :ko + def cast("lt"), do: :lt + def cast("lv"), do: :lv + def cast("mk"), do: :mk + def cast("ml"), do: :ml + def cast("mn"), do: :mn + def cast("mr"), do: :mr + def cast("ms"), do: :ms + def cast("my"), do: :my + def cast("nb"), do: :nb + def cast("ne"), do: :ne + def cast("nl"), do: :nl + def cast("nl-BE"), do: :nl_be + def cast("nl-NL"), do: :nl_nl + def cast("nn"), do: :nn + def cast("no"), do: :no + def cast("pa"), do: :pa + def cast("pl"), do: :pl + def cast("pt"), do: :pt + def cast("pt-BR"), do: :pt_br + def cast("pt-PT"), do: :pt_pt + def cast("ro"), do: :ro + def cast("ru"), do: :ru + def cast("sk"), do: :sk + def cast("sl"), do: :sl + def cast("sq"), do: :sq + def cast("sr"), do: :sr + def cast("sv"), do: :sv + def cast("sw"), do: :sw + def cast("ta"), do: :ta + def cast("te"), do: :te + def cast("th"), do: :th + def cast("tr"), do: :tr + def cast("uk"), do: :uk + def cast("ur"), do: :ur + def cast("uz"), do: :uz + def cast("vi"), do: :vi + def cast("zh"), do: :zh + def cast("zh-CN"), do: :zh_cn + def cast("zh-HK"), do: :zh_hk + def cast("zh-TW"), do: :zh_tw + def cast("zu"), do: :zu + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:af), do: "af" + def dump(:am), do: "am" + def dump(:ar), do: "ar" + def dump(:bg), do: "bg" + def dump(:bn), do: "bn" + def dump(:bs), do: "bs" + def dump(:ca), do: "ca" + def dump(:cs), do: "cs" + def dump(:da), do: "da" + def dump(:de), do: "de" + def dump(:de_de), do: "de-DE" + def dump(:el), do: "el" + def dump(:en), do: "en" + def dump(:en_au), do: "en-AU" + def dump(:en_ca), do: "en-CA" + def dump(:en_gb), do: "en-GB" + def dump(:en_us), do: "en-US" + def dump(:es), do: "es" + def dump(:es_419), do: "es-419" + def dump(:es_es), do: "es-ES" + def dump(:es_us), do: "es-US" + def dump(:et), do: "et" + def dump(:fa), do: "fa" + def dump(:fi), do: "fi" + def dump(:fil), do: "fil" + def dump(:fr), do: "fr" + def dump(:fr_be), do: "fr-BE" + def dump(:fr_ca), do: "fr-CA" + def dump(:fr_fr), do: "fr-FR" + def dump(:fy), do: "fy" + def dump(:gl), do: "gl" + def dump(:gu), do: "gu" + def dump(:ha), do: "ha" + def dump(:he), do: "he" + def dump(:hi), do: "hi" + def dump(:hr), do: "hr" + def dump(:hu), do: "hu" + def dump(:hy), do: "hy" + def dump(:id), do: "id" + def dump(:is), do: "is" + def dump(:it), do: "it" + def dump(:it_it), do: "it-IT" + def dump(:ja), do: "ja" + def dump(:jv), do: "jv" + def dump(:ka), do: "ka" + def dump(:kk), do: "kk" + def dump(:km), do: "km" + def dump(:kn), do: "kn" + def dump(:ko), do: "ko" + def dump(:lt), do: "lt" + def dump(:lv), do: "lv" + def dump(:mk), do: "mk" + def dump(:ml), do: "ml" + def dump(:mn), do: "mn" + def dump(:mr), do: "mr" + def dump(:ms), do: "ms" + def dump(:my), do: "my" + def dump(:nb), do: "nb" + def dump(:ne), do: "ne" + def dump(:nl), do: "nl" + def dump(:nl_be), do: "nl-BE" + def dump(:nl_nl), do: "nl-NL" + def dump(:nn), do: "nn" + def dump(:no), do: "no" + def dump(:pa), do: "pa" + def dump(:pl), do: "pl" + def dump(:pt), do: "pt" + def dump(:pt_br), do: "pt-BR" + def dump(:pt_pt), do: "pt-PT" + def dump(:ro), do: "ro" + def dump(:ru), do: "ru" + def dump(:sk), do: "sk" + def dump(:sl), do: "sl" + def dump(:sq), do: "sq" + def dump(:sr), do: "sr" + def dump(:sv), do: "sv" + def dump(:sw), do: "sw" + def dump(:ta), do: "ta" + def dump(:te), do: "te" + def dump(:th), do: "th" + def dump(:tr), do: "tr" + def dump(:uk), do: "uk" + def dump(:ur), do: "ur" + def dump(:uz), do: "uz" + def dump(:vi), do: "vi" + def dump(:zh), do: "zh" + def dump(:zh_cn), do: "zh-CN" + def dump(:zh_hk), do: "zh-HK" + def dump(:zh_tw), do: "zh-TW" + def dump(:zu), do: "zu" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/reset_password_response.ex b/lib/workos/reset_password_response.ex new file mode 100644 index 00000000..0e0d487a --- /dev/null +++ b/lib/workos/reset_password_response.ex @@ -0,0 +1,31 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ResetPasswordResponse do + @moduledoc """ + ResetPasswordResponse model. + """ + + defstruct [ + :user + ] + + @type t :: %__MODULE__{ + user: WorkOS.User.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + user: WorkOS.Cast.nested(map["user"], &WorkOS.User.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "user" => WorkOS.Cast.dump_struct(struct.user, &WorkOS.User.to_map/1) + }) + end +end diff --git a/lib/workos/revoke_session.ex b/lib/workos/revoke_session.ex new file mode 100644 index 00000000..7660f26a --- /dev/null +++ b/lib/workos/revoke_session.ex @@ -0,0 +1,31 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.RevokeSession do + @moduledoc """ + RevokeSession model. + """ + + defstruct [ + :session_id + ] + + @type t :: %__MODULE__{ + session_id: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + session_id: map["session_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "session_id" => struct.session_id + }) + end +end diff --git a/lib/workos/role.ex b/lib/workos/role.ex new file mode 100644 index 00000000..067b527e --- /dev/null +++ b/lib/workos/role.ex @@ -0,0 +1,67 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.Role do + @moduledoc """ + Role model. + """ + + defstruct [ + :slug, + :object, + :id, + :name, + :description, + :type, + :resource_type_slug, + :permissions, + :created_at, + :updated_at + ] + + @type t :: %__MODULE__{ + slug: String.t(), + object: String.t(), + id: String.t(), + name: String.t(), + description: String.t() | nil, + type: WorkOS.RoleType.t(), + resource_type_slug: String.t(), + permissions: [String.t()], + created_at: String.t(), + updated_at: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + slug: map["slug"], + object: map["object"], + id: map["id"], + name: map["name"], + description: map["description"], + type: WorkOS.Cast.enum(map["type"], &WorkOS.RoleType.cast/1), + resource_type_slug: map["resource_type_slug"], + permissions: map["permissions"], + created_at: map["created_at"], + updated_at: map["updated_at"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "slug" => struct.slug, + "object" => struct.object, + "id" => struct.id, + "name" => struct.name, + "description" => struct.description, + "type" => WorkOS.Cast.enum(struct.type, &WorkOS.RoleType.dump/1), + "resource_type_slug" => struct.resource_type_slug, + "permissions" => struct.permissions, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at + }) + end +end diff --git a/lib/workos/role_created.ex b/lib/workos/role_created.ex new file mode 100644 index 00000000..9e15b617 --- /dev/null +++ b/lib/workos/role_created.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.RoleCreated do + @moduledoc """ + RoleCreated model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.RoleCreatedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.RoleCreatedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => WorkOS.Cast.dump_struct(struct.data, &WorkOS.RoleCreatedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/role_created_data.ex b/lib/workos/role_created_data.ex new file mode 100644 index 00000000..fb348b3b --- /dev/null +++ b/lib/workos/role_created_data.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.RoleCreatedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :object, + :slug, + :resource_type_slug, + :created_at, + :updated_at, + :permissions + ] + + @type t :: %__MODULE__{ + object: String.t(), + slug: String.t(), + resource_type_slug: String.t(), + created_at: String.t(), + updated_at: String.t(), + permissions: [String.t()] | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + slug: map["slug"], + resource_type_slug: map["resource_type_slug"], + created_at: map["created_at"], + updated_at: map["updated_at"], + permissions: map["permissions"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "slug" => struct.slug, + "resource_type_slug" => struct.resource_type_slug, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at, + "permissions" => struct.permissions + }) + end +end diff --git a/lib/workos/role_deleted.ex b/lib/workos/role_deleted.ex new file mode 100644 index 00000000..02e38437 --- /dev/null +++ b/lib/workos/role_deleted.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.RoleDeleted do + @moduledoc """ + RoleDeleted model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.RoleDeletedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.RoleDeletedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => WorkOS.Cast.dump_struct(struct.data, &WorkOS.RoleDeletedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/role_deleted_data.ex b/lib/workos/role_deleted_data.ex new file mode 100644 index 00000000..db5797fe --- /dev/null +++ b/lib/workos/role_deleted_data.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.RoleDeletedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :object, + :slug, + :resource_type_slug, + :created_at, + :updated_at, + :permissions + ] + + @type t :: %__MODULE__{ + object: String.t(), + slug: String.t(), + resource_type_slug: String.t(), + created_at: String.t(), + updated_at: String.t(), + permissions: [String.t()] | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + slug: map["slug"], + resource_type_slug: map["resource_type_slug"], + created_at: map["created_at"], + updated_at: map["updated_at"], + permissions: map["permissions"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "slug" => struct.slug, + "resource_type_slug" => struct.resource_type_slug, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at, + "permissions" => struct.permissions + }) + end +end diff --git a/lib/workos/role_list.ex b/lib/workos/role_list.ex new file mode 100644 index 00000000..e220812e --- /dev/null +++ b/lib/workos/role_list.ex @@ -0,0 +1,38 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.RoleList do + @moduledoc """ + RoleList model. + """ + + defstruct [ + :object, + :data + ] + + @type t :: %__MODULE__{ + object: String.t(), + data: [WorkOS.Role.t()] + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + data: WorkOS.Cast.list(map["data"], &WorkOS.Role.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "data" => + WorkOS.Cast.list(struct.data, fn item -> + WorkOS.Cast.dump_struct(item, &WorkOS.Role.to_map/1) + end) + }) + end +end diff --git a/lib/workos/role_type.ex b/lib/workos/role_type.ex new file mode 100644 index 00000000..719b86a3 --- /dev/null +++ b/lib/workos/role_type.ex @@ -0,0 +1,25 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.RoleType do + @moduledoc """ + RoleType enum. + """ + + @type t :: :environment_role | :organization_role + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:environment_role, :organization_role] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("EnvironmentRole"), do: :environment_role + def cast("OrganizationRole"), do: :organization_role + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:environment_role), do: "EnvironmentRole" + def dump(:organization_role), do: "OrganizationRole" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/role_updated.ex b/lib/workos/role_updated.ex new file mode 100644 index 00000000..0892e3af --- /dev/null +++ b/lib/workos/role_updated.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.RoleUpdated do + @moduledoc """ + RoleUpdated model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.RoleUpdatedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.RoleUpdatedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => WorkOS.Cast.dump_struct(struct.data, &WorkOS.RoleUpdatedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/role_updated_data.ex b/lib/workos/role_updated_data.ex new file mode 100644 index 00000000..3159d20a --- /dev/null +++ b/lib/workos/role_updated_data.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.RoleUpdatedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :object, + :slug, + :resource_type_slug, + :created_at, + :updated_at, + :permissions + ] + + @type t :: %__MODULE__{ + object: String.t(), + slug: String.t(), + resource_type_slug: String.t(), + created_at: String.t(), + updated_at: String.t(), + permissions: [String.t()] | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + slug: map["slug"], + resource_type_slug: map["resource_type_slug"], + created_at: map["created_at"], + updated_at: map["updated_at"], + permissions: map["permissions"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "slug" => struct.slug, + "resource_type_slug" => struct.resource_type_slug, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at, + "permissions" => struct.permissions + }) + end +end diff --git a/lib/workos/send_email_change.ex b/lib/workos/send_email_change.ex new file mode 100644 index 00000000..877e0a5c --- /dev/null +++ b/lib/workos/send_email_change.ex @@ -0,0 +1,31 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.SendEmailChange do + @moduledoc """ + SendEmailChange model. + """ + + defstruct [ + :new_email + ] + + @type t :: %__MODULE__{ + new_email: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + new_email: map["new_email"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "new_email" => struct.new_email + }) + end +end diff --git a/lib/workos/send_radar_sms_challenge.ex b/lib/workos/send_radar_sms_challenge.ex new file mode 100644 index 00000000..1a751818 --- /dev/null +++ b/lib/workos/send_radar_sms_challenge.ex @@ -0,0 +1,47 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.SendRadarSmsChallenge do + @moduledoc """ + SendRadarSmsChallenge model. + """ + + defstruct [ + :user_id, + :pending_authentication_token, + :phone_number, + :ip_address, + :user_agent + ] + + @type t :: %__MODULE__{ + user_id: String.t(), + pending_authentication_token: String.t(), + phone_number: String.t(), + ip_address: String.t() | nil, + user_agent: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + user_id: map["user_id"], + pending_authentication_token: map["pending_authentication_token"], + phone_number: map["phone_number"], + ip_address: map["ip_address"], + user_agent: map["user_agent"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "user_id" => struct.user_id, + "pending_authentication_token" => struct.pending_authentication_token, + "phone_number" => struct.phone_number, + "ip_address" => struct.ip_address, + "user_agent" => struct.user_agent + }) + end +end diff --git a/lib/workos/send_radar_sms_challenge_response.ex b/lib/workos/send_radar_sms_challenge_response.ex new file mode 100644 index 00000000..1be3656f --- /dev/null +++ b/lib/workos/send_radar_sms_challenge_response.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.SendRadarSmsChallengeResponse do + @moduledoc """ + SendRadarSmsChallengeResponse model. + """ + + defstruct [ + :verification_id, + :phone_number + ] + + @type t :: %__MODULE__{ + verification_id: String.t(), + phone_number: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + verification_id: map["verification_id"], + phone_number: map["phone_number"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "verification_id" => struct.verification_id, + "phone_number" => struct.phone_number + }) + end +end diff --git a/lib/workos/send_verification_email_response.ex b/lib/workos/send_verification_email_response.ex new file mode 100644 index 00000000..0c6ef6fa --- /dev/null +++ b/lib/workos/send_verification_email_response.ex @@ -0,0 +1,31 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.SendVerificationEmailResponse do + @moduledoc """ + SendVerificationEmailResponse model. + """ + + defstruct [ + :user + ] + + @type t :: %__MODULE__{ + user: WorkOS.User.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + user: WorkOS.Cast.nested(map["user"], &WorkOS.User.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "user" => WorkOS.Cast.dump_struct(struct.user, &WorkOS.User.to_map/1) + }) + end +end diff --git a/lib/workos/session.ex b/lib/workos/session.ex new file mode 100644 index 00000000..aea37967 --- /dev/null +++ b/lib/workos/session.ex @@ -0,0 +1,416 @@ +# @oagen-ignore-file — hand-maintained; client-side session-cookie management. + +defmodule WorkOS.Session do + @moduledoc """ + Sealed session-cookie management for AuthKit. + + A sealed session is an encrypted (AES-256-GCM) cookie value holding the + access token, refresh token, and user returned by an authentication flow. + + session = WorkOS.Session.new(client, sealed_cookie, cookie_password) + + result = WorkOS.Session.authenticate(session) + result.authenticated + #=> true + + {:ok, refreshed} = WorkOS.Session.refresh(session) + refreshed.sealed_session + + Convenience entry points that skip building the struct: + + * `authenticate/2` — one-shot authentication from a sealed value + * `refresh_session/4` — one-shot refresh from a sealed value + * `seal_session_from_auth_response/2` — seal an `WorkOS.AuthenticateResponse` + * `seal_data/2` / `unseal_data/2` — raw seal/unseal for arbitrary data + + The cookie password should be a hex-encoded 32-byte key (64 hex characters); + any other non-empty value is hashed with SHA-256 to derive the key. + """ + + @default_base_url "https://api.workos.com" + @nonce_size 12 + @tag_size 16 + + defstruct [:client, :sealed_session, :cookie_password] + + @type t :: %__MODULE__{ + client: WorkOS.Client.t() | nil, + sealed_session: String.t() | nil, + cookie_password: String.t() + } + + @typedoc "Session payload carried inside the sealed cookie." + @type session_data :: %{ + access_token: String.t() | nil, + refresh_token: String.t() | nil, + user: WorkOS.User.t() | map() | nil, + impersonator: WorkOS.AuthenticateResponseImpersonator.t() | map() | nil + } + + @typedoc """ + Result of `authenticate/1`. When `authenticated` is `false`, `reason` is one + of `"no_session_cookie_provided"`, `"invalid_session_cookie"`, + `"invalid_jwt"`, or `"session_expired"`. `needs_refresh` is `true` when the + cookie was valid but the access token has expired — refresh the session + before treating the user as unauthenticated. + """ + @type auth_result :: %{ + authenticated: boolean(), + session_id: String.t() | nil, + organization_id: String.t() | nil, + role: String.t() | nil, + permissions: [String.t()] | nil, + entitlements: [String.t()] | nil, + user: WorkOS.User.t() | map() | nil, + impersonator: WorkOS.AuthenticateResponseImpersonator.t() | map() | nil, + needs_refresh: boolean(), + reason: String.t() | nil + } + + @typedoc "Successful result of `refresh/2`." + @type refresh_result :: %{ + authenticated: true, + sealed_session: String.t(), + session: session_data() + } + + @typedoc """ + Failed result of `refresh/2`. `reason` is one of + `"no_session_cookie_provided"`, `"invalid_session_cookie"`, + `"no_refresh_token"`, `"refresh_token_revoked"`, or `"refresh_failed"`; + `error` carries the underlying API error when the refresh call itself failed. + """ + @type refresh_error :: %{ + authenticated: false, + reason: String.t(), + error: WorkOS.Error.error() | nil + } + + @doc """ + Builds a session helper from a sealed cookie value. + + `client` may be `nil` for authenticate-only usage; `refresh/2` requires it. + """ + @spec new(WorkOS.Client.t() | nil, String.t() | nil, String.t()) :: t() + def new(client, sealed_session, cookie_password) do + %__MODULE__{client: client, sealed_session: sealed_session, cookie_password: cookie_password} + end + + @doc """ + Validates the sealed session: unseals the cookie, checks the access token, + and extracts its JWT claims. See `t:auth_result/0`. + + `authenticate/2` is the one-shot variant taking the sealed value and cookie + password directly. + """ + @spec authenticate(t()) :: auth_result() + def authenticate(%__MODULE__{sealed_session: sealed}) when sealed in [nil, ""] do + failed_auth("no_session_cookie_provided") + end + + def authenticate(%__MODULE__{} = session) do + with {:ok, data} <- unseal_session(session.sealed_session, session.cookie_password), + {:ok, claims} <- claims_for(data) do + base = %{ + session_id: claims["sid"], + organization_id: claims["org_id"], + role: claims["role"], + permissions: claims["permissions"], + entitlements: claims["entitlements"], + user: data.user, + impersonator: data.impersonator + } + + if expired?(claims) do + Map.merge(failed_auth("session_expired"), Map.put(base, :needs_refresh, true)) + else + Map.merge(failed_auth(nil), Map.put(base, :authenticated, true)) + end + else + {:error, :invalid_jwt} -> failed_auth("invalid_jwt") + {:error, _reason} -> failed_auth("invalid_session_cookie") + end + end + + @doc """ + One-shot session authentication from a sealed value and cookie password. + No client is required. + """ + @spec authenticate(String.t() | nil, String.t()) :: auth_result() + def authenticate(sealed_session, cookie_password) do + nil |> new(sealed_session, cookie_password) |> authenticate() + end + + @doc """ + Refreshes the session using its refresh token and reseals it. + + Returns `{:ok, refresh_result}` with the new sealed session, or + `{:error, refresh_error}` — see `t:refresh_error/0` for the reasons. + """ + @spec refresh(t(), keyword()) :: {:ok, refresh_result()} | {:error, refresh_error()} + def refresh(session, opts \\ []) + + def refresh(%__MODULE__{sealed_session: sealed}, _opts) when sealed in [nil, ""] do + {:error, failed_refresh("no_session_cookie_provided")} + end + + def refresh(%__MODULE__{client: nil}, _opts) do + raise ArgumentError, "a WorkOS.Client is required for session refresh" + end + + def refresh(%__MODULE__{} = session, opts) do + case unseal_session(session.sealed_session, session.cookie_password) do + {:error, _reason} -> + {:error, failed_refresh("invalid_session_cookie")} + + {:ok, %{refresh_token: refresh_token}} when refresh_token in [nil, ""] -> + {:error, failed_refresh("no_refresh_token")} + + {:ok, data} -> + do_refresh(session, data, opts) + end + end + + @doc """ + One-shot session refresh from a sealed value and cookie password. + """ + @spec refresh_session(WorkOS.Client.t(), String.t() | nil, String.t(), keyword()) :: + {:ok, refresh_result()} | {:error, refresh_error()} + def refresh_session(client, sealed_session, cookie_password, opts \\ []) do + client |> new(sealed_session, cookie_password) |> refresh(opts) + end + + @doc """ + Builds the logout URL for the session. + + The session ID is read from the access token's claims — an expired access + token still yields a usable logout URL. Options: + + * `:return_to` — URL to redirect to after logout + """ + @spec get_logout_url(t(), keyword()) :: {:ok, String.t()} | {:error, String.t()} + def get_logout_url(%__MODULE__{} = session, opts \\ []) do + case authenticate(session) do + %{session_id: session_id} when is_binary(session_id) and session_id != "" -> + base_url = if session.client, do: session.client.base_url, else: @default_base_url + + query = + %{"session_id" => session_id} + |> maybe_put("return_to", opts[:return_to]) + |> URI.encode_query() + + {:ok, "#{base_url}/user_management/sessions/logout?#{query}"} + + %{reason: reason} -> + {:error, reason || "session has no session ID"} + end + end + + @doc """ + Seals session data (or any auth artifact) from a `WorkOS.AuthenticateResponse`, + producing a sealed cookie value directly from a successful auth exchange. + """ + @spec seal_session_from_auth_response(WorkOS.AuthenticateResponse.t(), String.t()) :: + {:ok, String.t()} | {:error, term()} + def seal_session_from_auth_response(%WorkOS.AuthenticateResponse{} = response, cookie_password) do + seal_session( + %{ + access_token: response.access_token, + refresh_token: response.refresh_token, + user: response.user, + impersonator: response.impersonator + }, + cookie_password + ) + end + + @doc """ + Seals a `t:session_data/0` map into a cookie value. + """ + @spec seal_session(session_data(), String.t()) :: {:ok, String.t()} | {:error, term()} + def seal_session(data, cookie_password) do + %{ + "access_token" => data[:access_token], + "refresh_token" => data[:refresh_token], + "user" => dump(data[:user]), + "impersonator" => dump(data[:impersonator]) + } + |> WorkOS.Cast.drop_nils() + |> seal_data(cookie_password) + end + + @doc """ + Seals any JSON-serializable term with AES-256-GCM under the given password. + Returns a base64-encoded string (`nonce || ciphertext || tag`). + """ + @spec seal_data(term(), String.t()) :: {:ok, String.t()} | {:error, term()} + def seal_data(data, password) do + with {:ok, key} <- derive_key(password) do + plaintext = JSON.encode!(data) + nonce = :crypto.strong_rand_bytes(@nonce_size) + + {ciphertext, tag} = + :crypto.crypto_one_time_aead(:aes_256_gcm, key, nonce, plaintext, "", true) + + {:ok, Base.encode64(nonce <> ciphertext <> tag)} + end + end + + @doc """ + Unseals a value produced by `seal_data/2` back into the original term. + """ + @spec unseal_data(String.t(), String.t()) :: {:ok, term()} | {:error, term()} + def unseal_data(sealed, password) do + with {:ok, key} <- derive_key(password), + {:ok, raw} <- decode_sealed(sealed), + {:ok, plaintext} <- decrypt(raw, key) do + case JSON.decode(plaintext) do + {:ok, decoded} -> {:ok, decoded} + {:error, _} -> {:error, :invalid_payload} + end + end + end + + defp dump(%WorkOS.User{} = user), do: WorkOS.User.to_map(user) + + defp dump(%WorkOS.AuthenticateResponseImpersonator{} = impersonator), + do: WorkOS.AuthenticateResponseImpersonator.to_map(impersonator) + + defp dump(other), do: other + + defp decode_sealed(sealed) when is_binary(sealed) do + case Base.decode64(sealed) do + {:ok, raw} when byte_size(raw) >= @nonce_size + @tag_size -> {:ok, raw} + {:ok, _short} -> {:error, :sealed_data_too_short} + :error -> {:error, :invalid_base64} + end + end + + defp decode_sealed(_sealed), do: {:error, :invalid_base64} + + defp decrypt(raw, key) do + ciphertext_size = byte_size(raw) - @nonce_size - @tag_size + + <> = raw + + case :crypto.crypto_one_time_aead(:aes_256_gcm, key, nonce, ciphertext, "", tag, false) do + plaintext when is_binary(plaintext) -> {:ok, plaintext} + :error -> {:error, :decryption_failed} + end + end + + # The password is either a hex-encoded 32-byte key used verbatim, or any + # other non-empty string hashed with SHA-256. Empty passwords are rejected: + # SHA-256("") is publicly known, so accepting one would let anyone forge + # and unseal session cookies. + defp derive_key(password) when is_binary(password) do + case Base.decode16(password, case: :mixed) do + {:ok, <>} -> {:ok, key} + _ when password == "" -> {:error, :empty_cookie_password} + _ -> {:ok, :crypto.hash(:sha256, password)} + end + end + + defp derive_key(_password), do: {:error, :empty_cookie_password} + + defp unseal_session(sealed, password) do + case unseal_data(sealed, password) do + {:ok, data} when is_map(data) -> + {:ok, + %{ + access_token: data["access_token"], + refresh_token: data["refresh_token"], + user: WorkOS.Cast.nested(data["user"], &WorkOS.User.from_map/1), + impersonator: + WorkOS.Cast.nested( + data["impersonator"], + &WorkOS.AuthenticateResponseImpersonator.from_map/1 + ) + }} + + {:ok, _other} -> + {:error, :invalid_payload} + + {:error, reason} -> + {:error, reason} + end + end + + defp claims_for(%{access_token: token}) when token in [nil, ""], do: {:error, :invalid_jwt} + defp claims_for(%{access_token: token}), do: decode_jwt_claims(token) + + # Decodes the payload of a JWT without verifying its signature — the token + # came out of a cookie we sealed, so it is trusted after unsealing. + defp decode_jwt_claims(token) do + with [_header, payload, _signature] <- String.split(token, "."), + {:ok, decoded} <- Base.url_decode64(payload, padding: false), + {:ok, claims} when is_map(claims) <- JSON.decode(decoded) do + {:ok, claims} + else + _ -> {:error, :invalid_jwt} + end + end + + defp expired?(%{"exp" => exp}) when is_integer(exp), + do: System.system_time(:second) >= exp + + defp expired?(_claims), do: false + + defp do_refresh(session, data, opts) do + params = + %{"refresh_token" => data.refresh_token} + |> maybe_put("organization_id", organization_id_from(data)) + + case WorkOS.UserManagement.authenticate_with_refresh_token(session.client, params, opts) do + {:ok, response} -> + new_data = %{ + access_token: response.access_token, + refresh_token: response.refresh_token, + user: response.user, + impersonator: response.impersonator + } + + with {:ok, sealed} <- seal_session(new_data, session.cookie_password) do + {:ok, %{authenticated: true, sealed_session: sealed, session: new_data}} + end + + {:error, %WorkOS.ApiError{status: 401, code: "invalid_grant"} = error} -> + {:error, failed_refresh("refresh_token_revoked", error)} + + {:error, error} -> + {:error, failed_refresh("refresh_failed", error)} + end + end + + defp organization_id_from(%{access_token: token}) when is_binary(token) and token != "" do + case decode_jwt_claims(token) do + {:ok, %{"org_id" => org_id}} when is_binary(org_id) and org_id != "" -> org_id + _ -> nil + end + end + + defp organization_id_from(_data), do: nil + + defp maybe_put(map, _key, nil), do: map + defp maybe_put(map, key, value), do: Map.put(map, key, value) + + defp failed_auth(reason) do + %{ + authenticated: false, + session_id: nil, + organization_id: nil, + role: nil, + permissions: nil, + entitlements: nil, + user: nil, + impersonator: nil, + needs_refresh: false, + reason: reason + } + end + + defp failed_refresh(reason, error \\ nil) do + %{authenticated: false, reason: reason, error: error} + end +end diff --git a/lib/workos/session_created.ex b/lib/workos/session_created.ex new file mode 100644 index 00000000..e6feb4d9 --- /dev/null +++ b/lib/workos/session_created.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.SessionCreated do + @moduledoc """ + SessionCreated model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.SessionCreatedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.SessionCreatedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => WorkOS.Cast.dump_struct(struct.data, &WorkOS.SessionCreatedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/session_created_data.ex b/lib/workos/session_created_data.ex new file mode 100644 index 00000000..a44c9086 --- /dev/null +++ b/lib/workos/session_created_data.ex @@ -0,0 +1,86 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.SessionCreatedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :object, + :id, + :ip_address, + :user_agent, + :user_id, + :auth_method, + :status, + :expires_at, + :ended_at, + :created_at, + :updated_at, + :impersonator, + :organization_id + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + ip_address: String.t() | nil, + user_agent: String.t() | nil, + user_id: String.t(), + auth_method: WorkOS.SessionCreatedDataAuthMethod.t(), + status: WorkOS.SessionCreatedDataStatus.t(), + expires_at: String.t(), + ended_at: String.t() | nil, + created_at: String.t(), + updated_at: String.t(), + impersonator: WorkOS.SessionCreatedDataImpersonator.t() | nil, + organization_id: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + ip_address: map["ip_address"], + user_agent: map["user_agent"], + user_id: map["user_id"], + auth_method: + WorkOS.Cast.enum(map["auth_method"], &WorkOS.SessionCreatedDataAuthMethod.cast/1), + status: WorkOS.Cast.enum(map["status"], &WorkOS.SessionCreatedDataStatus.cast/1), + expires_at: map["expires_at"], + ended_at: map["ended_at"], + created_at: map["created_at"], + updated_at: map["updated_at"], + impersonator: + WorkOS.Cast.nested(map["impersonator"], &WorkOS.SessionCreatedDataImpersonator.from_map/1), + organization_id: map["organization_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "ip_address" => struct.ip_address, + "user_agent" => struct.user_agent, + "user_id" => struct.user_id, + "auth_method" => + WorkOS.Cast.enum(struct.auth_method, &WorkOS.SessionCreatedDataAuthMethod.dump/1), + "status" => WorkOS.Cast.enum(struct.status, &WorkOS.SessionCreatedDataStatus.dump/1), + "expires_at" => struct.expires_at, + "ended_at" => struct.ended_at, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at, + "impersonator" => + WorkOS.Cast.dump_struct( + struct.impersonator, + &WorkOS.SessionCreatedDataImpersonator.to_map/1 + ), + "organization_id" => struct.organization_id + }) + end +end diff --git a/lib/workos/session_created_data_auth_method.ex b/lib/workos/session_created_data_auth_method.ex new file mode 100644 index 00000000..012e2083 --- /dev/null +++ b/lib/workos/session_created_data_auth_method.ex @@ -0,0 +1,63 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.SessionCreatedDataAuthMethod do + @moduledoc """ + SessionCreatedDataAuthMethod enum. + """ + + @type t :: + :cross_app_auth + | :external_auth + | :impersonation + | :magic_code + | :migrated_session + | :oauth + | :passkey + | :password + | :sso + | :unknown + + @doc "All known values." + @spec values() :: [t()] + def values, + do: [ + :cross_app_auth, + :external_auth, + :impersonation, + :magic_code, + :migrated_session, + :oauth, + :passkey, + :password, + :sso, + :unknown + ] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("cross_app_auth"), do: :cross_app_auth + def cast("external_auth"), do: :external_auth + def cast("impersonation"), do: :impersonation + def cast("magic_code"), do: :magic_code + def cast("migrated_session"), do: :migrated_session + def cast("oauth"), do: :oauth + def cast("passkey"), do: :passkey + def cast("password"), do: :password + def cast("sso"), do: :sso + def cast("unknown"), do: :unknown + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:cross_app_auth), do: "cross_app_auth" + def dump(:external_auth), do: "external_auth" + def dump(:impersonation), do: "impersonation" + def dump(:magic_code), do: "magic_code" + def dump(:migrated_session), do: "migrated_session" + def dump(:oauth), do: "oauth" + def dump(:passkey), do: "passkey" + def dump(:password), do: "password" + def dump(:sso), do: "sso" + def dump(:unknown), do: "unknown" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/session_created_data_impersonator.ex b/lib/workos/session_created_data_impersonator.ex new file mode 100644 index 00000000..034d6f99 --- /dev/null +++ b/lib/workos/session_created_data_impersonator.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.SessionCreatedDataImpersonator do + @moduledoc """ + Information about the impersonator if this session was created via impersonation. + """ + + defstruct [ + :email, + :reason + ] + + @type t :: %__MODULE__{ + email: String.t(), + reason: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + email: map["email"], + reason: map["reason"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "email" => struct.email, + "reason" => struct.reason + }) + end +end diff --git a/lib/workos/session_created_data_status.ex b/lib/workos/session_created_data_status.ex new file mode 100644 index 00000000..81c896f1 --- /dev/null +++ b/lib/workos/session_created_data_status.ex @@ -0,0 +1,27 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.SessionCreatedDataStatus do + @moduledoc """ + SessionCreatedDataStatus enum. + """ + + @type t :: :active | :expired | :revoked + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:active, :expired, :revoked] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("active"), do: :active + def cast("expired"), do: :expired + def cast("revoked"), do: :revoked + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:active), do: "active" + def dump(:expired), do: "expired" + def dump(:revoked), do: "revoked" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/session_revoked.ex b/lib/workos/session_revoked.ex new file mode 100644 index 00000000..1fbbdb79 --- /dev/null +++ b/lib/workos/session_revoked.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.SessionRevoked do + @moduledoc """ + SessionRevoked model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.SessionRevokedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.SessionRevokedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => WorkOS.Cast.dump_struct(struct.data, &WorkOS.SessionRevokedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/session_revoked_data.ex b/lib/workos/session_revoked_data.ex new file mode 100644 index 00000000..4ec7e33c --- /dev/null +++ b/lib/workos/session_revoked_data.ex @@ -0,0 +1,86 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.SessionRevokedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :object, + :id, + :ip_address, + :user_agent, + :user_id, + :auth_method, + :status, + :expires_at, + :ended_at, + :created_at, + :updated_at, + :impersonator, + :organization_id + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + ip_address: String.t() | nil, + user_agent: String.t() | nil, + user_id: String.t(), + auth_method: WorkOS.SessionRevokedDataAuthMethod.t(), + status: WorkOS.SessionRevokedDataStatus.t(), + expires_at: String.t(), + ended_at: String.t() | nil, + created_at: String.t(), + updated_at: String.t(), + impersonator: WorkOS.SessionRevokedDataImpersonator.t() | nil, + organization_id: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + ip_address: map["ip_address"], + user_agent: map["user_agent"], + user_id: map["user_id"], + auth_method: + WorkOS.Cast.enum(map["auth_method"], &WorkOS.SessionRevokedDataAuthMethod.cast/1), + status: WorkOS.Cast.enum(map["status"], &WorkOS.SessionRevokedDataStatus.cast/1), + expires_at: map["expires_at"], + ended_at: map["ended_at"], + created_at: map["created_at"], + updated_at: map["updated_at"], + impersonator: + WorkOS.Cast.nested(map["impersonator"], &WorkOS.SessionRevokedDataImpersonator.from_map/1), + organization_id: map["organization_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "ip_address" => struct.ip_address, + "user_agent" => struct.user_agent, + "user_id" => struct.user_id, + "auth_method" => + WorkOS.Cast.enum(struct.auth_method, &WorkOS.SessionRevokedDataAuthMethod.dump/1), + "status" => WorkOS.Cast.enum(struct.status, &WorkOS.SessionRevokedDataStatus.dump/1), + "expires_at" => struct.expires_at, + "ended_at" => struct.ended_at, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at, + "impersonator" => + WorkOS.Cast.dump_struct( + struct.impersonator, + &WorkOS.SessionRevokedDataImpersonator.to_map/1 + ), + "organization_id" => struct.organization_id + }) + end +end diff --git a/lib/workos/session_revoked_data_auth_method.ex b/lib/workos/session_revoked_data_auth_method.ex new file mode 100644 index 00000000..23db4e7c --- /dev/null +++ b/lib/workos/session_revoked_data_auth_method.ex @@ -0,0 +1,63 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.SessionRevokedDataAuthMethod do + @moduledoc """ + SessionRevokedDataAuthMethod enum. + """ + + @type t :: + :cross_app_auth + | :external_auth + | :impersonation + | :magic_code + | :migrated_session + | :oauth + | :passkey + | :password + | :sso + | :unknown + + @doc "All known values." + @spec values() :: [t()] + def values, + do: [ + :cross_app_auth, + :external_auth, + :impersonation, + :magic_code, + :migrated_session, + :oauth, + :passkey, + :password, + :sso, + :unknown + ] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("cross_app_auth"), do: :cross_app_auth + def cast("external_auth"), do: :external_auth + def cast("impersonation"), do: :impersonation + def cast("magic_code"), do: :magic_code + def cast("migrated_session"), do: :migrated_session + def cast("oauth"), do: :oauth + def cast("passkey"), do: :passkey + def cast("password"), do: :password + def cast("sso"), do: :sso + def cast("unknown"), do: :unknown + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:cross_app_auth), do: "cross_app_auth" + def dump(:external_auth), do: "external_auth" + def dump(:impersonation), do: "impersonation" + def dump(:magic_code), do: "magic_code" + def dump(:migrated_session), do: "migrated_session" + def dump(:oauth), do: "oauth" + def dump(:passkey), do: "passkey" + def dump(:password), do: "password" + def dump(:sso), do: "sso" + def dump(:unknown), do: "unknown" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/session_revoked_data_impersonator.ex b/lib/workos/session_revoked_data_impersonator.ex new file mode 100644 index 00000000..600b73ac --- /dev/null +++ b/lib/workos/session_revoked_data_impersonator.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.SessionRevokedDataImpersonator do + @moduledoc """ + Information about the impersonator if this session was created via impersonation. + """ + + defstruct [ + :email, + :reason + ] + + @type t :: %__MODULE__{ + email: String.t(), + reason: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + email: map["email"], + reason: map["reason"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "email" => struct.email, + "reason" => struct.reason + }) + end +end diff --git a/lib/workos/session_revoked_data_status.ex b/lib/workos/session_revoked_data_status.ex new file mode 100644 index 00000000..db36930f --- /dev/null +++ b/lib/workos/session_revoked_data_status.ex @@ -0,0 +1,27 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.SessionRevokedDataStatus do + @moduledoc """ + SessionRevokedDataStatus enum. + """ + + @type t :: :active | :expired | :revoked + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:active, :expired, :revoked] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("active"), do: :active + def cast("expired"), do: :expired + def cast("revoked"), do: :revoked + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:active), do: "active" + def dump(:expired), do: "expired" + def dump(:revoked), do: "revoked" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/set_role_permissions.ex b/lib/workos/set_role_permissions.ex new file mode 100644 index 00000000..ac24446e --- /dev/null +++ b/lib/workos/set_role_permissions.ex @@ -0,0 +1,31 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.SetRolePermissions do + @moduledoc """ + SetRolePermissions model. + """ + + defstruct [ + :permissions + ] + + @type t :: %__MODULE__{ + permissions: [String.t()] + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + permissions: map["permissions"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "permissions" => struct.permissions + }) + end +end diff --git a/lib/workos/slim_role.ex b/lib/workos/slim_role.ex new file mode 100644 index 00000000..e5b2987c --- /dev/null +++ b/lib/workos/slim_role.ex @@ -0,0 +1,31 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.SlimRole do + @moduledoc """ + The primary role assigned to the user. + """ + + defstruct [ + :slug + ] + + @type t :: %__MODULE__{ + slug: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + slug: map["slug"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "slug" => struct.slug + }) + end +end diff --git a/lib/workos/sso.ex b/lib/workos/sso.ex index a12a914d..8bb014f4 100644 --- a/lib/workos/sso.ex +++ b/lib/workos/sso.ex @@ -1,171 +1,187 @@ +# This file is auto-generated by oagen. Do not edit. + defmodule WorkOS.SSO do @moduledoc """ - Manage Single Sign-On (SSO) in WorkOS. - - @see https://docs.workos.com/sso/overview + Operations for the SSO API. """ - alias WorkOS.Empty - alias WorkOS.SSO.Connection - alias WorkOS.SSO.Profile - alias WorkOS.SSO.ProfileAndToken - @doc """ - Lists all connections. + List Connections - Parameter options: + Get a list of all of your existing connections matching the criteria specified. - * `:connection_type` - Filter Connections by their type. - * `:organization_id` - Filter Connections by their associated organization. - * `:domain` - Filter Connections by their associated domain. - * `:limit` - Maximum number of records to return. Accepts values between 1 and 100. Default is 10. - * `:after` - Pagination cursor to receive records after a provided event ID. - * `:before` - An object ID that defines your place in the list. When the ID is not present, you are at the end of the list. - * `:order` - Order the results by the creation time. Supported values are "asc" and "desc" for showing older and newer records first respectively. + ## Parameters + * `params` — query parameters: `:before`, `:after_`, `:limit`, `:order`, `:connection_type`, `:domain`, `:organization_id`, `:search` + * `opts` — per-request options (see `WorkOS.Client.request/5`) """ - @spec list_connections(WorkOS.Client.t(), map()) :: - WorkOS.Client.response(WorkOS.List.t(Connection.t())) - def list_connections(client, opts) do - WorkOS.Client.get(client, WorkOS.List.of(Connection), "/connections", - query: [ - connection_type: opts[:connection_type], - organization_id: opts[:organization_id], - domain: opts[:domain], - limit: opts[:limit], - after: opts[:after], - before: opts[:before], - order: opts[:order] - ] - ) + @spec list_connections(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.Page.t(WorkOS.ConnectionList.t())} | {:error, WorkOS.Error.error()} + def list_connections(client, params \\ %{}, opts \\ []) do + with {:ok, body} <- WorkOS.Client.request(client, :get, "/connections", params, opts) do + fetch_next = fn cursor -> + list_connections( + client, + WorkOS.Page.next_params(params, "after", cursor), + opts + ) + end + + {:ok, WorkOS.Page.from_map(body, "data", &WorkOS.ConnectionList.from_map/1, fetch_next)} + end end - @spec list_connections(map()) :: - WorkOS.Client.response(WorkOS.List.t(Connection.t())) - def list_connections(opts \\ %{}) do - WorkOS.Client.get(WorkOS.client(), WorkOS.List.of(Connection), "/connections", - query: [ - connection_type: opts[:connection_type], - organization_id: opts[:organization_id], - domain: opts[:domain], - limit: opts[:limit], - after: opts[:after], - before: opts[:before], - order: opts[:order] - ] - ) + @doc """ + Get a Connection + + Get the details of an existing connection. + + ## Parameters + + * `id` — Unique identifier for the Connection. + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec get_connection(WorkOS.Client.t(), String.t(), keyword()) :: + {:ok, WorkOS.Connection.t()} | {:error, WorkOS.Error.error()} + def get_connection(client, id, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :get, + "/connections/#{URI.encode(id, &URI.char_unreserved?/1)}", + %{}, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.Connection.from_map/1)} + end end @doc """ - Deletes a connection. + Delete a Connection + + Permanently deletes an existing connection. It cannot be undone. + + ## Parameters + + * `id` — Unique identifier for the Connection. + * `opts` — per-request options (see `WorkOS.Client.request/5`) """ - @spec delete_connection(String.t()) :: WorkOS.Client.response(nil) - @spec delete_connection(WorkOS.Client.t(), String.t()) :: WorkOS.Client.response(nil) - def delete_connection(client \\ WorkOS.client(), connection_id) do - WorkOS.Client.delete(client, Empty, "/connections/:id", %{}, - opts: [ - path_params: [id: connection_id] - ] + @spec delete_connection(WorkOS.Client.t(), String.t(), keyword()) :: + {:ok, term()} | {:error, WorkOS.Error.error()} + def delete_connection(client, id, opts \\ []) do + WorkOS.Client.request( + client, + :delete, + "/connections/#{URI.encode(id, &URI.char_unreserved?/1)}", + %{}, + opts ) end @doc """ - Gets a connection given an ID. + Initiate SSO + + Initiates the single sign-on flow. + + Returns the fully-qualified redirect URL — no HTTP request is made. + + Sets `response_type` (`"code"`) automatically. + + Reads `client_id` from the client configuration unless passed explicitly. + + ## Parameters + + * `params` — query parameters: `:provider_scopes`, `:provider_query_params`, `:domain` (deprecated), `:provider`, `:redirect_uri`, `:state`, `:connection`, `:organization`, `:domain_hint`, `:login_hint`, `:nonce`, `:prompt` """ - @spec get_connection(String.t()) :: WorkOS.Client.response(Connection.t()) - @spec get_connection(WorkOS.Client.t(), String.t()) :: WorkOS.Client.response(Connection.t()) - def get_connection(client \\ WorkOS.client(), connection_id) do - WorkOS.Client.get(client, Connection, "/connections/:id", - opts: [ - path_params: [id: connection_id] - ] - ) + @spec get_authorization_url(WorkOS.Client.t(), map()) :: String.t() + def get_authorization_url(client, params \\ %{}) do + params = + params + |> WorkOS.Client.merge_defaults(%{"response_type" => "code"}) + |> WorkOS.Client.put_inferred("client_id", client.client_id) + + WorkOS.Client.build_url(client, "/sso/authorize", params) end @doc """ - Generates an OAuth 2.0 authorization URL. + Logout Redirect + + Logout allows to sign out a user from your application by triggering the identity provider sign out flow. This `GET` endpoint should be a redirection, since the identity provider user will be identified in the browser session. + + Before redirecting to this endpoint, you need to generate a short-lived logout token using the [Logout Authorize](https://workos.com/docs/reference/sso/logout/authorize) endpoint. - Parameter options: + Returns the fully-qualified redirect URL — no HTTP request is made. - * `:organization` - The organization connection selector is used to initiate SSO for an Organization. - * `:connection` - The connection connection selector is used to initiate SSO for a Connection. - * `:redirect_uri` - A Redirect URI to return an authorized user to. (required) - * `:client_id` - This value can be obtained from the SSO Configuration page in the WorkOS dashboard. - * `:provider` - The provider connection selector is used to initiate SSO using an OAuth provider. - * `:state` - An optional parameter that can be used to encode arbitrary information to help restore application state between redirects. - * `:login_hint` - Can be used to pre-fill the username/email address field of the IdP sign-in page for the user, if you know their username ahead of time. - * `:domain_hint` - Can be used to pre-fill the domain field when initiating authentication with Microsoft OAuth, or with a GoogleSAML connection type. + ## Parameters + * `params` — query parameters: `:token` """ - @spec get_authorization_url(map()) :: {:ok, String.t()} | {:error, String.t()} - def get_authorization_url(params) - when is_map_key(params, :redirect_uri) and - (is_map_key(params, :connection) or is_map_key(params, :organization) or - is_map_key(params, :provider)) do - client_id = - params[:client_id] || WorkOS.client_id() || - raise "Missing required `client_id` parameter." - - defaults = %{ - client_id: client_id, - response_type: "code" - } - - query = - defaults - |> Map.merge(params) - |> Map.take( - [ - :client_id, - :redirect_uri, - :connection, - :organization, - :provider, - :state, - :login_hint, - :domain_hint - ] ++ Map.keys(defaults) - ) - |> URI.encode_query() - - {:ok, "#{WorkOS.base_url()}/sso/authorize?#{query}"} + @spec get_logout_url(WorkOS.Client.t(), map()) :: String.t() + def get_logout_url(client, params \\ %{}) do + WorkOS.Client.build_url(client, "/sso/logout", params) end - def get_authorization_url(_params), - do: - {:error, - "Incomplete arguments. Need to specify either a 'connection', 'organization', or 'provider'."} + @doc """ + Logout Authorize + + You should call this endpoint from your server to generate a logout token which is required for the [Logout Redirect](https://workos.com/docs/reference/sso/logout) endpoint. + + ## Parameters + + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec authorize_logout(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.SSOLogoutAuthorizeResponse.t()} | {:error, WorkOS.Error.error()} + def authorize_logout(client, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request(client, :post, "/sso/logout/authorize", params, opts) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.SSOLogoutAuthorizeResponse.from_map/1)} + end + end @doc """ - Gets an access token along with the user `Profile`. + Get a User Profile - Parameter options: + Exchange an access token for a user's [Profile](https://workos.com/docs/reference/sso/profile). Because this profile is returned in the [Get a Profile and Token endpoint](https://workos.com/docs/reference/sso/profile/get-profile-and-token) your application usually does not need to call this endpoint. It is available for any authentication flows that require an additional endpoint to retrieve a user's profile. - * `:code` - The authorization value which was passed back as a query parameter in the callback to the Redirect URI. (required) + ## Parameters + * `opts` — per-request options (see `WorkOS.Client.request/5`) """ - @spec get_profile_and_token(String.t()) :: WorkOS.Client.response(ProfileAndToken.t()) - @spec get_profile_and_token(WorkOS.Client.t(), String.t()) :: - WorkOS.Client.response(ProfileAndToken.t()) - def get_profile_and_token(client \\ WorkOS.client(), code) do - WorkOS.Client.post(client, ProfileAndToken, "/sso/token", %{ - client_id: WorkOS.client_id(client), - client_secret: WorkOS.api_key(client), - grant_type: "authorization_code", - code: code - }) + @spec get_profile(WorkOS.Client.t(), keyword()) :: + {:ok, WorkOS.Profile.t()} | {:error, WorkOS.Error.error()} + def get_profile(client, opts \\ []) do + with {:ok, body} <- WorkOS.Client.request(client, :get, "/sso/profile", %{}, opts) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.Profile.from_map/1)} + end end @doc """ - Gets a profile given an access token. + Get a Profile and Token + + Get an access token along with the user [Profile](https://workos.com/docs/reference/sso/profile) using the code passed to your [Redirect URI](https://workos.com/docs/reference/sso/get-authorization-url/redirect-uri). + + Sets `grant_type` (`"authorization_code"`) automatically. + + Reads `client_id`/`client_secret` from the client configuration unless passed explicitly. + + ## Parameters + + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) """ - @spec get_profile(String.t()) :: WorkOS.Client.response(Profile.t()) - @spec get_profile(WorkOS.Client.t(), String.t()) :: WorkOS.Client.response(Profile.t()) - def get_profile(client \\ WorkOS.client(), access_token) do - WorkOS.Client.get(client, Profile, "/sso/profile", - opts: [ - access_token: access_token - ] - ) + @spec get_profile_and_token(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.SSOTokenResponse.t()} | {:error, WorkOS.Error.error()} + def get_profile_and_token(client, params \\ %{}, opts \\ []) do + params = + params + |> WorkOS.Client.merge_defaults(%{"grant_type" => "authorization_code"}) + |> WorkOS.Client.put_inferred("client_id", client.client_id) + |> WorkOS.Client.put_inferred("client_secret", client.api_key) + + with {:ok, body} <- WorkOS.Client.request(client, :post, "/sso/token", params, opts) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.SSOTokenResponse.from_map/1)} + end end end diff --git a/lib/workos/sso/connection.ex b/lib/workos/sso/connection.ex deleted file mode 100644 index 061ecfc3..00000000 --- a/lib/workos/sso/connection.ex +++ /dev/null @@ -1,47 +0,0 @@ -defmodule WorkOS.SSO.Connection do - @moduledoc """ - WorkOS Connection struct. - """ - - alias WorkOS.Castable - alias WorkOS.SSO.Connection.Domain - - @behaviour WorkOS.Castable - - @type t() :: %__MODULE__{ - id: String.t(), - name: String.t(), - connection_type: String.t(), - state: String.t(), - domains: list(Domain.t()) | nil, - updated_at: String.t(), - created_at: String.t(), - organization_id: String.t() - } - - @enforce_keys [:id, :name, :connection_type, :state, :updated_at, :created_at, :organization_id] - defstruct [ - :id, - :name, - :connection_type, - :state, - :domains, - :updated_at, - :created_at, - :organization_id - ] - - @impl true - def cast(map) do - %__MODULE__{ - id: map["id"], - name: map["name"], - connection_type: map["connection_type"], - state: map["state"], - domains: Castable.cast_list(Domain, map["domains"]), - updated_at: map["updated_at"], - created_at: map["created_at"], - organization_id: map["organization_id"] - } - end -end diff --git a/lib/workos/sso/connection/domain.ex b/lib/workos/sso/connection/domain.ex deleted file mode 100644 index 1eeb1d6e..00000000 --- a/lib/workos/sso/connection/domain.ex +++ /dev/null @@ -1,29 +0,0 @@ -defmodule WorkOS.SSO.Connection.Domain do - @moduledoc """ - WorkOS Domain Record struct. - """ - - @behaviour WorkOS.Castable - - @type t() :: %__MODULE__{ - id: String.t(), - object: String.t(), - domain: String.t() - } - - @enforce_keys [:id] - defstruct [ - :id, - :object, - :domain - ] - - @impl true - def cast(map) do - %__MODULE__{ - id: map["id"], - object: map["object"], - domain: map["domain"] - } - end -end diff --git a/lib/workos/sso/logout.ex b/lib/workos/sso/logout.ex new file mode 100644 index 00000000..f87a42b6 --- /dev/null +++ b/lib/workos/sso/logout.ex @@ -0,0 +1,39 @@ +# @oagen-ignore-file — hand-maintained; end-to-end SSO logout helper. + +defmodule WorkOS.SSO.Logout do + @moduledoc """ + End-to-end SSO logout: authorizes a short-lived logout token via + `WorkOS.SSO.authorize_logout/3`, then builds the logout redirect URL. + + {:ok, url} = WorkOS.SSO.Logout.get_logout_url(client, %{profile_id: "prof_..."}) + + For the individual pieces, see `WorkOS.SSO.authorize_logout/3` and + `WorkOS.SSO.get_logout_url/2`. + """ + + @doc """ + Runs the logout flow and returns the redirect URL to send the user to. + + ## Parameters + + * `params` — map with `:profile_id` (the profile to log out) and + optionally `:return_to` (post-logout redirect) + """ + @spec get_logout_url(WorkOS.Client.t(), map(), keyword()) :: + {:ok, String.t()} | {:error, WorkOS.Error.error()} + def get_logout_url(client, params, opts \\ []) do + params = Map.new(params, fn {k, v} -> {to_string(k), v} end) + {return_to, authorize_params} = Map.pop(params, "return_to") + + with {:ok, response} <- WorkOS.SSO.authorize_logout(client, authorize_params, opts) do + url = + WorkOS.SSO.get_logout_url( + client, + %{"token" => response.logout_token} + |> then(&if return_to, do: Map.put(&1, "return_to", return_to), else: &1) + ) + + {:ok, url} + end + end +end diff --git a/lib/workos/sso/pkce.ex b/lib/workos/sso/pkce.ex new file mode 100644 index 00000000..c1570ce4 --- /dev/null +++ b/lib/workos/sso/pkce.ex @@ -0,0 +1,47 @@ +# @oagen-ignore-file — hand-maintained; SSO PKCE flow helpers. + +defmodule WorkOS.SSO.PKCE do + @moduledoc """ + PKCE helpers for the SSO authorization-code flow (public clients). + + %{url: url, code_verifier: verifier, state: state} = + WorkOS.SSO.PKCE.get_authorization_url(client, %{redirect_uri: "..."}) + + # after the redirect comes back with a code: + {:ok, token} = + WorkOS.SSO.PKCE.code_exchange(client, %{code: code, code_verifier: verifier}) + """ + + @doc """ + Builds an SSO authorization URL with automatically generated PKCE + parameters, plus a random `state` unless one is passed in `params`. + + Store `code_verifier` securely — it is required for the token exchange. + See `WorkOS.SSO.get_authorization_url/2` for the supported params. + """ + @spec get_authorization_url(WorkOS.Client.t(), map()) :: + WorkOS.AuthKit.pkce_authorization_url() + def get_authorization_url(client, params \\ %{}) do + {params, pair, state} = WorkOS.AuthKit.put_pkce_and_state(params) + + %{ + url: WorkOS.SSO.get_authorization_url(client, params), + code_verifier: pair.code_verifier, + state: state + } + end + + @doc """ + Exchanges an SSO authorization code using a PKCE code verifier + (public-client flow). + + ## Parameters + + * `params` — map with `:code` and `:code_verifier` + """ + @spec code_exchange(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.SSOTokenResponse.t()} | {:error, WorkOS.Error.error()} + def code_exchange(client, params, opts \\ []) do + WorkOS.SSO.get_profile_and_token(client, params, opts) + end +end diff --git a/lib/workos/sso/profile-and-token.ex b/lib/workos/sso/profile-and-token.ex deleted file mode 100644 index 51cb2375..00000000 --- a/lib/workos/sso/profile-and-token.ex +++ /dev/null @@ -1,29 +0,0 @@ -defmodule WorkOS.SSO.ProfileAndToken do - @moduledoc """ - WorkOS Profile and Token struct. - """ - - alias WorkOS.SSO.Profile - - @behaviour WorkOS.Castable - - @type t() :: %__MODULE__{ - access_token: String.t(), - profile: Profile.t() - } - - @enforce_keys [:access_token, :profile] - defstruct [ - :access_token, - :profile - ] - - @impl true - @spec cast(map :: map()) :: t() - def cast(map) do - %__MODULE__{ - access_token: map["access_token"], - profile: Profile.cast(map["profile"]) - } - end -end diff --git a/lib/workos/sso/profile.ex b/lib/workos/sso/profile.ex deleted file mode 100644 index a9f424fe..00000000 --- a/lib/workos/sso/profile.ex +++ /dev/null @@ -1,54 +0,0 @@ -defmodule WorkOS.SSO.Profile do - @moduledoc """ - WorkOS Profile struct. - """ - - @behaviour WorkOS.Castable - - @type t() :: %__MODULE__{ - id: String.t(), - idp_id: String.t(), - organization_id: String.t() | nil, - connection_id: String.t(), - connection_type: String.t(), - email: String.t(), - first_name: String.t() | nil, - last_name: String.t() | nil, - groups: [String.t()] | nil, - raw_attributes: %{String.t() => any()} | nil, - custom_attributes: %{String.t() => any()} | nil - } - - @enforce_keys [:id, :idp_id, :connection_id, :connection_type, :email] - defstruct [ - :id, - :idp_id, - :organization_id, - :connection_id, - :connection_type, - :email, - :first_name, - :last_name, - :groups, - :raw_attributes, - :custom_attributes - ] - - @impl true - @spec cast(map :: map()) :: t() - def cast(map) do - %__MODULE__{ - id: map["id"], - idp_id: map["idp_id"], - organization_id: map["organization_id"], - connection_id: map["connection_id"], - connection_type: map["connection_type"], - email: map["email"], - first_name: map["first_name"], - last_name: map["last_name"], - groups: map["groups"], - raw_attributes: map["raw_attributes"], - custom_attributes: map["custom_attributes"] - } - end -end diff --git a/lib/workos/sso_authorize_url_response.ex b/lib/workos/sso_authorize_url_response.ex new file mode 100644 index 00000000..3e11140d --- /dev/null +++ b/lib/workos/sso_authorize_url_response.ex @@ -0,0 +1,31 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.SSOAuthorizeUrlResponse do + @moduledoc """ + SSOAuthorizeUrlResponse model. + """ + + defstruct [ + :url + ] + + @type t :: %__MODULE__{ + url: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + url: map["url"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "url" => struct.url + }) + end +end diff --git a/lib/workos/sso_device_authorization_request.ex b/lib/workos/sso_device_authorization_request.ex new file mode 100644 index 00000000..82f76f1e --- /dev/null +++ b/lib/workos/sso_device_authorization_request.ex @@ -0,0 +1,31 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.SSODeviceAuthorizationRequest do + @moduledoc """ + SSODeviceAuthorizationRequest model. + """ + + defstruct [ + :client_id + ] + + @type t :: %__MODULE__{ + client_id: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + client_id: map["client_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "client_id" => struct.client_id + }) + end +end diff --git a/lib/workos/sso_logout_authorize_request.ex b/lib/workos/sso_logout_authorize_request.ex new file mode 100644 index 00000000..c9a5fb2a --- /dev/null +++ b/lib/workos/sso_logout_authorize_request.ex @@ -0,0 +1,31 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.SSOLogoutAuthorizeRequest do + @moduledoc """ + SSOLogoutAuthorizeRequest model. + """ + + defstruct [ + :profile_id + ] + + @type t :: %__MODULE__{ + profile_id: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + profile_id: map["profile_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "profile_id" => struct.profile_id + }) + end +end diff --git a/lib/workos/sso_logout_authorize_response.ex b/lib/workos/sso_logout_authorize_response.ex new file mode 100644 index 00000000..050aa79a --- /dev/null +++ b/lib/workos/sso_logout_authorize_response.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.SSOLogoutAuthorizeResponse do + @moduledoc """ + SSOLogoutAuthorizeResponse model. + """ + + defstruct [ + :logout_url, + :logout_token + ] + + @type t :: %__MODULE__{ + logout_url: String.t(), + logout_token: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + logout_url: map["logout_url"], + logout_token: map["logout_token"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "logout_url" => struct.logout_url, + "logout_token" => struct.logout_token + }) + end +end diff --git a/lib/workos/sso_provider.ex b/lib/workos/sso_provider.ex new file mode 100644 index 00000000..205d2aa5 --- /dev/null +++ b/lib/workos/sso_provider.ex @@ -0,0 +1,75 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.SSOProvider do + @moduledoc """ + SSOProvider enum. + """ + + @type t :: + :apple_oauth + | :bitbucket_oauth + | :git_hub_oauth + | :git_lab_oauth + | :google_oauth + | :intuit_oauth + | :linked_in_oauth + | :microsoft_oauth + | :salesforce_oauth + | :slack_oauth + | :vercel_marketplace_oauth + | :vercel_oauth + | :xero_oauth + + @doc "All known values." + @spec values() :: [t()] + def values, + do: [ + :apple_oauth, + :bitbucket_oauth, + :git_hub_oauth, + :git_lab_oauth, + :google_oauth, + :intuit_oauth, + :linked_in_oauth, + :microsoft_oauth, + :salesforce_oauth, + :slack_oauth, + :vercel_marketplace_oauth, + :vercel_oauth, + :xero_oauth + ] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("AppleOAuth"), do: :apple_oauth + def cast("BitbucketOAuth"), do: :bitbucket_oauth + def cast("GitHubOAuth"), do: :git_hub_oauth + def cast("GitLabOAuth"), do: :git_lab_oauth + def cast("GoogleOAuth"), do: :google_oauth + def cast("IntuitOAuth"), do: :intuit_oauth + def cast("LinkedInOAuth"), do: :linked_in_oauth + def cast("MicrosoftOAuth"), do: :microsoft_oauth + def cast("SalesforceOAuth"), do: :salesforce_oauth + def cast("SlackOAuth"), do: :slack_oauth + def cast("VercelMarketplaceOAuth"), do: :vercel_marketplace_oauth + def cast("VercelOAuth"), do: :vercel_oauth + def cast("XeroOAuth"), do: :xero_oauth + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:apple_oauth), do: "AppleOAuth" + def dump(:bitbucket_oauth), do: "BitbucketOAuth" + def dump(:git_hub_oauth), do: "GitHubOAuth" + def dump(:git_lab_oauth), do: "GitLabOAuth" + def dump(:google_oauth), do: "GoogleOAuth" + def dump(:intuit_oauth), do: "IntuitOAuth" + def dump(:linked_in_oauth), do: "LinkedInOAuth" + def dump(:microsoft_oauth), do: "MicrosoftOAuth" + def dump(:salesforce_oauth), do: "SalesforceOAuth" + def dump(:slack_oauth), do: "SlackOAuth" + def dump(:vercel_marketplace_oauth), do: "VercelMarketplaceOAuth" + def dump(:vercel_oauth), do: "VercelOAuth" + def dump(:xero_oauth), do: "XeroOAuth" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/sso_token_response.ex b/lib/workos/sso_token_response.ex new file mode 100644 index 00000000..d3ad4775 --- /dev/null +++ b/lib/workos/sso_token_response.ex @@ -0,0 +1,49 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.SSOTokenResponse do + @moduledoc """ + SSOTokenResponse model. + """ + + defstruct [ + :token_type, + :access_token, + :expires_in, + :profile, + :oauth_tokens + ] + + @type t :: %__MODULE__{ + token_type: String.t(), + access_token: String.t(), + expires_in: integer(), + profile: WorkOS.Profile.t(), + oauth_tokens: WorkOS.SSOTokenResponseOAuthToken.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + token_type: map["token_type"], + access_token: map["access_token"], + expires_in: map["expires_in"], + profile: WorkOS.Cast.nested(map["profile"], &WorkOS.Profile.from_map/1), + oauth_tokens: + WorkOS.Cast.nested(map["oauth_tokens"], &WorkOS.SSOTokenResponseOAuthToken.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "token_type" => struct.token_type, + "access_token" => struct.access_token, + "expires_in" => struct.expires_in, + "profile" => WorkOS.Cast.dump_struct(struct.profile, &WorkOS.Profile.to_map/1), + "oauth_tokens" => + WorkOS.Cast.dump_struct(struct.oauth_tokens, &WorkOS.SSOTokenResponseOAuthToken.to_map/1) + }) + end +end diff --git a/lib/workos/sso_token_response_oauth_token.ex b/lib/workos/sso_token_response_oauth_token.ex new file mode 100644 index 00000000..82c43dfa --- /dev/null +++ b/lib/workos/sso_token_response_oauth_token.ex @@ -0,0 +1,47 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.SSOTokenResponseOAuthToken do + @moduledoc """ + OAuth tokens issued by the identity provider, if available. + """ + + defstruct [ + :provider, + :refresh_token, + :access_token, + :expires_at, + :scopes + ] + + @type t :: %__MODULE__{ + provider: String.t(), + refresh_token: String.t(), + access_token: String.t(), + expires_at: integer(), + scopes: [String.t()] + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + provider: map["provider"], + refresh_token: map["refresh_token"], + access_token: map["access_token"], + expires_at: map["expires_at"], + scopes: map["scopes"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "provider" => struct.provider, + "refresh_token" => struct.refresh_token, + "access_token" => struct.access_token, + "expires_at" => struct.expires_at, + "scopes" => struct.scopes + }) + end +end diff --git a/lib/workos/token_query.ex b/lib/workos/token_query.ex new file mode 100644 index 00000000..5d1cdc31 --- /dev/null +++ b/lib/workos/token_query.ex @@ -0,0 +1,43 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.TokenQuery do + @moduledoc """ + TokenQuery model. + """ + + defstruct [ + :client_id, + :client_secret, + :code, + :grant_type + ] + + @type t :: %__MODULE__{ + client_id: String.t(), + client_secret: String.t(), + code: String.t(), + grant_type: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + client_id: map["client_id"], + client_secret: map["client_secret"], + code: map["code"], + grant_type: map["grant_type"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "client_id" => struct.client_id, + "client_secret" => struct.client_secret, + "code" => struct.code, + "grant_type" => struct.grant_type + }) + end +end diff --git a/lib/workos/update_audit_logs_retention.ex b/lib/workos/update_audit_logs_retention.ex new file mode 100644 index 00000000..6f8a5865 --- /dev/null +++ b/lib/workos/update_audit_logs_retention.ex @@ -0,0 +1,31 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UpdateAuditLogsRetention do + @moduledoc """ + UpdateAuditLogsRetention model. + """ + + defstruct [ + :retention_period_in_days + ] + + @type t :: %__MODULE__{ + retention_period_in_days: integer() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + retention_period_in_days: map["retention_period_in_days"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "retention_period_in_days" => struct.retention_period_in_days + }) + end +end diff --git a/lib/workos/update_authorization_permission.ex b/lib/workos/update_authorization_permission.ex new file mode 100644 index 00000000..db01180a --- /dev/null +++ b/lib/workos/update_authorization_permission.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UpdateAuthorizationPermission do + @moduledoc """ + UpdateAuthorizationPermission model. + """ + + defstruct [ + :name, + :description + ] + + @type t :: %__MODULE__{ + name: String.t() | nil, + description: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + name: map["name"], + description: map["description"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "name" => struct.name, + "description" => struct.description + }) + end +end diff --git a/lib/workos/update_authorization_resource.ex b/lib/workos/update_authorization_resource.ex new file mode 100644 index 00000000..d75f63ec --- /dev/null +++ b/lib/workos/update_authorization_resource.ex @@ -0,0 +1,47 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UpdateAuthorizationResource do + @moduledoc """ + UpdateAuthorizationResource model. + """ + + defstruct [ + :name, + :description, + :parent_resource_id, + :parent_resource_external_id, + :parent_resource_type_slug + ] + + @type t :: %__MODULE__{ + name: String.t() | nil, + description: String.t() | nil, + parent_resource_id: String.t() | nil, + parent_resource_external_id: String.t() | nil, + parent_resource_type_slug: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + name: map["name"], + description: map["description"], + parent_resource_id: map["parent_resource_id"], + parent_resource_external_id: map["parent_resource_external_id"], + parent_resource_type_slug: map["parent_resource_type_slug"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "name" => struct.name, + "description" => struct.description, + "parent_resource_id" => struct.parent_resource_id, + "parent_resource_external_id" => struct.parent_resource_external_id, + "parent_resource_type_slug" => struct.parent_resource_type_slug + }) + end +end diff --git a/lib/workos/update_custom_provider_definition.ex b/lib/workos/update_custom_provider_definition.ex new file mode 100644 index 00000000..1fb260f5 --- /dev/null +++ b/lib/workos/update_custom_provider_definition.ex @@ -0,0 +1,79 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UpdateCustomProviderDefinition do + @moduledoc """ + UpdateCustomProviderDefinition model. + """ + + defstruct [ + :name, + :authorization_url, + :token_url, + :refresh_token_url, + :pkce_enabled, + :request_scope_separator, + :scopes_required, + :client_secret_required, + :additional_authorization_parameters, + :token_body_content_type, + :authenticate_via + ] + + @type t :: %__MODULE__{ + name: String.t() | nil, + authorization_url: String.t() | nil, + token_url: String.t() | nil, + refresh_token_url: String.t() | nil, + pkce_enabled: boolean() | nil, + request_scope_separator: String.t() | nil, + scopes_required: boolean() | nil, + client_secret_required: boolean() | nil, + additional_authorization_parameters: %{optional(String.t()) => String.t()} | nil, + token_body_content_type: String.t() | nil, + authenticate_via: WorkOS.UpdateCustomProviderDefinitionAuthenticateVia.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + name: map["name"], + authorization_url: map["authorization_url"], + token_url: map["token_url"], + refresh_token_url: map["refresh_token_url"], + pkce_enabled: map["pkce_enabled"], + request_scope_separator: map["request_scope_separator"], + scopes_required: map["scopes_required"], + client_secret_required: map["client_secret_required"], + additional_authorization_parameters: map["additional_authorization_parameters"], + token_body_content_type: map["token_body_content_type"], + authenticate_via: + WorkOS.Cast.enum( + map["authenticate_via"], + &WorkOS.UpdateCustomProviderDefinitionAuthenticateVia.cast/1 + ) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "name" => struct.name, + "authorization_url" => struct.authorization_url, + "token_url" => struct.token_url, + "refresh_token_url" => struct.refresh_token_url, + "pkce_enabled" => struct.pkce_enabled, + "request_scope_separator" => struct.request_scope_separator, + "scopes_required" => struct.scopes_required, + "client_secret_required" => struct.client_secret_required, + "additional_authorization_parameters" => struct.additional_authorization_parameters, + "token_body_content_type" => struct.token_body_content_type, + "authenticate_via" => + WorkOS.Cast.enum( + struct.authenticate_via, + &WorkOS.UpdateCustomProviderDefinitionAuthenticateVia.dump/1 + ) + }) + end +end diff --git a/lib/workos/update_custom_provider_definition_authenticate_via.ex b/lib/workos/update_custom_provider_definition_authenticate_via.ex new file mode 100644 index 00000000..720389a9 --- /dev/null +++ b/lib/workos/update_custom_provider_definition_authenticate_via.ex @@ -0,0 +1,25 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UpdateCustomProviderDefinitionAuthenticateVia do + @moduledoc """ + UpdateCustomProviderDefinitionAuthenticateVia enum. + """ + + @type t :: :request_body | :basic_auth_header + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:request_body, :basic_auth_header] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("request_body"), do: :request_body + def cast("basic_auth_header"), do: :basic_auth_header + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:request_body), do: "request_body" + def dump(:basic_auth_header), do: "basic_auth_header" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/update_data_integration.ex b/lib/workos/update_data_integration.ex new file mode 100644 index 00000000..31fe3062 --- /dev/null +++ b/lib/workos/update_data_integration.ex @@ -0,0 +1,64 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UpdateDataIntegration do + @moduledoc """ + UpdateDataIntegration model. + """ + + defstruct [ + :description, + :enabled, + :scopes, + :credentials, + :api_key, + :custom_provider + ] + + @type t :: %__MODULE__{ + description: String.t() | nil, + enabled: boolean() | nil, + scopes: [String.t()] | nil, + credentials: WorkOS.DataIntegrationCredentialsInput.t() | nil, + api_key: WorkOS.ApiKeyInstallation.t() | nil, + custom_provider: WorkOS.UpdateCustomProviderDefinition.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + description: map["description"], + enabled: map["enabled"], + scopes: map["scopes"], + credentials: + WorkOS.Cast.nested(map["credentials"], &WorkOS.DataIntegrationCredentialsInput.from_map/1), + api_key: WorkOS.Cast.nested(map["api_key"], &WorkOS.ApiKeyInstallation.from_map/1), + custom_provider: + WorkOS.Cast.nested( + map["custom_provider"], + &WorkOS.UpdateCustomProviderDefinition.from_map/1 + ) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "description" => struct.description, + "enabled" => struct.enabled, + "scopes" => struct.scopes, + "credentials" => + WorkOS.Cast.dump_struct( + struct.credentials, + &WorkOS.DataIntegrationCredentialsInput.to_map/1 + ), + "api_key" => WorkOS.Cast.dump_struct(struct.api_key, &WorkOS.ApiKeyInstallation.to_map/1), + "custom_provider" => + WorkOS.Cast.dump_struct( + struct.custom_provider, + &WorkOS.UpdateCustomProviderDefinition.to_map/1 + ) + }) + end +end diff --git a/lib/workos/update_group.ex b/lib/workos/update_group.ex new file mode 100644 index 00000000..c8ff84b1 --- /dev/null +++ b/lib/workos/update_group.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UpdateGroup do + @moduledoc """ + UpdateGroup model. + """ + + defstruct [ + :name, + :description + ] + + @type t :: %__MODULE__{ + name: String.t() | nil, + description: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + name: map["name"], + description: map["description"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "name" => struct.name, + "description" => struct.description + }) + end +end diff --git a/lib/workos/update_jwt_template.ex b/lib/workos/update_jwt_template.ex new file mode 100644 index 00000000..e51184c4 --- /dev/null +++ b/lib/workos/update_jwt_template.ex @@ -0,0 +1,31 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UpdateJWTTemplate do + @moduledoc """ + UpdateJWTTemplate model. + """ + + defstruct [ + :content + ] + + @type t :: %__MODULE__{ + content: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + content: map["content"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "content" => struct.content + }) + end +end diff --git a/lib/workos/update_oauth_application.ex b/lib/workos/update_oauth_application.ex new file mode 100644 index 00000000..9e71c21d --- /dev/null +++ b/lib/workos/update_oauth_application.ex @@ -0,0 +1,46 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UpdateOAuthApplication do + @moduledoc """ + UpdateOAuthApplication model. + """ + + defstruct [ + :name, + :description, + :scopes, + :redirect_uris + ] + + @type t :: %__MODULE__{ + name: String.t() | nil, + description: String.t() | nil, + scopes: [String.t()] | nil, + redirect_uris: [WorkOS.RedirectUriInput.t()] | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + name: map["name"], + description: map["description"], + scopes: map["scopes"], + redirect_uris: WorkOS.Cast.list(map["redirect_uris"], &WorkOS.RedirectUriInput.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "name" => struct.name, + "description" => struct.description, + "scopes" => struct.scopes, + "redirect_uris" => + WorkOS.Cast.list(struct.redirect_uris, fn item -> + WorkOS.Cast.dump_struct(item, &WorkOS.RedirectUriInput.to_map/1) + end) + }) + end +end diff --git a/lib/workos/update_object_request.ex b/lib/workos/update_object_request.ex new file mode 100644 index 00000000..4a3ffb07 --- /dev/null +++ b/lib/workos/update_object_request.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UpdateObjectRequest do + @moduledoc """ + UpdateObjectRequest model. + """ + + defstruct [ + :value, + :version_check + ] + + @type t :: %__MODULE__{ + value: String.t(), + version_check: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + value: map["value"], + version_check: map["version_check"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "value" => struct.value, + "version_check" => struct.version_check + }) + end +end diff --git a/lib/workos/update_organization.ex b/lib/workos/update_organization.ex new file mode 100644 index 00000000..5d26f1e8 --- /dev/null +++ b/lib/workos/update_organization.ex @@ -0,0 +1,63 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UpdateOrganization do + @moduledoc """ + UpdateOrganization model. + + ## Deprecated fields + + * `:domains` — The domains associated with the organization. Deprecated in favor of `domain_data`. + """ + + defstruct [ + :name, + :allow_profiles_outside_organization, + :domains, + :domain_data, + :stripe_customer_id, + :metadata, + :external_id + ] + + @type t :: %__MODULE__{ + name: String.t() | nil, + allow_profiles_outside_organization: boolean() | nil, + domains: [String.t()] | nil, + domain_data: [WorkOS.OrganizationDomainData.t()] | nil, + stripe_customer_id: String.t() | nil, + metadata: %{optional(String.t()) => String.t()} | nil, + external_id: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + name: map["name"], + allow_profiles_outside_organization: map["allow_profiles_outside_organization"], + domains: map["domains"], + domain_data: + WorkOS.Cast.list(map["domain_data"], &WorkOS.OrganizationDomainData.from_map/1), + stripe_customer_id: map["stripe_customer_id"], + metadata: map["metadata"], + external_id: map["external_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "name" => struct.name, + "allow_profiles_outside_organization" => struct.allow_profiles_outside_organization, + "domains" => struct.domains, + "domain_data" => + WorkOS.Cast.list(struct.domain_data, fn item -> + WorkOS.Cast.dump_struct(item, &WorkOS.OrganizationDomainData.to_map/1) + end), + "stripe_customer_id" => struct.stripe_customer_id, + "metadata" => struct.metadata, + "external_id" => struct.external_id + }) + end +end diff --git a/lib/workos/update_organization_role.ex b/lib/workos/update_organization_role.ex new file mode 100644 index 00000000..711110fe --- /dev/null +++ b/lib/workos/update_organization_role.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UpdateOrganizationRole do + @moduledoc """ + UpdateOrganizationRole model. + """ + + defstruct [ + :name, + :description + ] + + @type t :: %__MODULE__{ + name: String.t() | nil, + description: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + name: map["name"], + description: map["description"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "name" => struct.name, + "description" => struct.description + }) + end +end diff --git a/lib/workos/update_role.ex b/lib/workos/update_role.ex new file mode 100644 index 00000000..d96a2c6d --- /dev/null +++ b/lib/workos/update_role.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UpdateRole do + @moduledoc """ + UpdateRole model. + """ + + defstruct [ + :name, + :description + ] + + @type t :: %__MODULE__{ + name: String.t() | nil, + description: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + name: map["name"], + description: map["description"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "name" => struct.name, + "description" => struct.description + }) + end +end diff --git a/lib/workos/update_user.ex b/lib/workos/update_user.ex new file mode 100644 index 00000000..965e7b17 --- /dev/null +++ b/lib/workos/update_user.ex @@ -0,0 +1,73 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UpdateUser do + @moduledoc """ + UpdateUser model. + """ + + defstruct [ + :email, + :first_name, + :last_name, + :name, + :email_verified, + :metadata, + :external_id, + :locale, + :password, + :password_hash, + :password_hash_type + ] + + @type t :: %__MODULE__{ + email: String.t() | nil, + first_name: String.t() | nil, + last_name: String.t() | nil, + name: String.t() | nil, + email_verified: boolean() | nil, + metadata: %{optional(String.t()) => String.t()} | nil, + external_id: String.t() | nil, + locale: String.t() | nil, + password: String.t() | nil, + password_hash: String.t() | nil, + password_hash_type: WorkOS.UpdateUserPasswordHashType.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + email: map["email"], + first_name: map["first_name"], + last_name: map["last_name"], + name: map["name"], + email_verified: map["email_verified"], + metadata: map["metadata"], + external_id: map["external_id"], + locale: map["locale"], + password: map["password"], + password_hash: map["password_hash"], + password_hash_type: + WorkOS.Cast.enum(map["password_hash_type"], &WorkOS.UpdateUserPasswordHashType.cast/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "email" => struct.email, + "first_name" => struct.first_name, + "last_name" => struct.last_name, + "name" => struct.name, + "email_verified" => struct.email_verified, + "metadata" => struct.metadata, + "external_id" => struct.external_id, + "locale" => struct.locale, + "password" => struct.password, + "password_hash" => struct.password_hash, + "password_hash_type" => + WorkOS.Cast.enum(struct.password_hash_type, &WorkOS.UpdateUserPasswordHashType.dump/1) + }) + end +end diff --git a/lib/workos/update_user_organization_membership.ex b/lib/workos/update_user_organization_membership.ex new file mode 100644 index 00000000..4c30a9fe --- /dev/null +++ b/lib/workos/update_user_organization_membership.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UpdateUserOrganizationMembership do + @moduledoc """ + UpdateUserOrganizationMembership model. + """ + + defstruct [ + :role_slug, + :role_slugs + ] + + @type t :: %__MODULE__{ + role_slug: String.t() | nil, + role_slugs: [String.t()] | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + role_slug: map["role_slug"], + role_slugs: map["role_slugs"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "role_slug" => struct.role_slug, + "role_slugs" => struct.role_slugs + }) + end +end diff --git a/lib/workos/update_user_password_hash_type.ex b/lib/workos/update_user_password_hash_type.ex new file mode 100644 index 00000000..20638839 --- /dev/null +++ b/lib/workos/update_user_password_hash_type.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UpdateUserPasswordHashType do + @moduledoc """ + UpdateUserPasswordHashType enum. + """ + + @type t :: :bcrypt | :firebase_scrypt | :ssha | :ssha_256 | :scrypt | :pbkdf_2 | :argon_2 + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:bcrypt, :firebase_scrypt, :ssha, :ssha_256, :scrypt, :pbkdf_2, :argon_2] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("bcrypt"), do: :bcrypt + def cast("firebase-scrypt"), do: :firebase_scrypt + def cast("ssha"), do: :ssha + def cast("ssha256"), do: :ssha_256 + def cast("scrypt"), do: :scrypt + def cast("pbkdf2"), do: :pbkdf_2 + def cast("argon2"), do: :argon_2 + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:bcrypt), do: "bcrypt" + def dump(:firebase_scrypt), do: "firebase-scrypt" + def dump(:ssha), do: "ssha" + def dump(:ssha_256), do: "ssha256" + def dump(:scrypt), do: "scrypt" + def dump(:pbkdf_2), do: "pbkdf2" + def dump(:argon_2), do: "argon2" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/update_webhook_endpoint.ex b/lib/workos/update_webhook_endpoint.ex new file mode 100644 index 00000000..59ea112c --- /dev/null +++ b/lib/workos/update_webhook_endpoint.ex @@ -0,0 +1,39 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UpdateWebhookEndpoint do + @moduledoc """ + UpdateWebhookEndpoint model. + """ + + defstruct [ + :endpoint_url, + :status, + :events + ] + + @type t :: %__MODULE__{ + endpoint_url: String.t() | nil, + status: WorkOS.UpdateWebhookEndpointStatus.t() | nil, + events: [WorkOS.UpdateWebhookEndpointEvents.t()] | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + endpoint_url: map["endpoint_url"], + status: WorkOS.Cast.enum(map["status"], &WorkOS.UpdateWebhookEndpointStatus.cast/1), + events: WorkOS.Cast.list(map["events"], &WorkOS.UpdateWebhookEndpointEvents.cast/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "endpoint_url" => struct.endpoint_url, + "status" => WorkOS.Cast.enum(struct.status, &WorkOS.UpdateWebhookEndpointStatus.dump/1), + "events" => WorkOS.Cast.list(struct.events, &WorkOS.UpdateWebhookEndpointEvents.dump/1) + }) + end +end diff --git a/lib/workos/update_webhook_endpoint_events.ex b/lib/workos/update_webhook_endpoint_events.ex new file mode 100644 index 00000000..ad464983 --- /dev/null +++ b/lib/workos/update_webhook_endpoint_events.ex @@ -0,0 +1,439 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UpdateWebhookEndpointEvents do + @moduledoc """ + UpdateWebhookEndpointEvents enum. + """ + + @type t :: + :agent_registration_created + | :agent_registration_claim_attempt_created + | :agent_registration_claim_completed + | :agent_registration_credential_issued + | :agent_registration_deleted + | :agent_registration_expired + | :agent_registration_organization_switched + | :agent_registration_revoked + | :authentication_email_verification_succeeded + | :authentication_magic_auth_failed + | :authentication_magic_auth_succeeded + | :authentication_mfa_succeeded + | :authentication_oauth_failed + | :authentication_oauth_succeeded + | :authentication_password_failed + | :authentication_password_succeeded + | :authentication_passkey_failed + | :authentication_passkey_succeeded + | :authentication_sso_failed + | :authentication_sso_started + | :authentication_sso_succeeded + | :authentication_sso_timed_out + | :radar_challenge_created + | :authentication_radar_risk_detected + | :authentication_reauthentication_succeeded + | :api_key_created + | :api_key_revoked + | :api_key_updated + | :connection_activated + | :connection_deactivated + | :connection_saml_certificate_renewal_required + | :connection_saml_certificate_renewed + | :connection_deleted + | :dsync_activated + | :dsync_deleted + | :dsync_group_created + | :dsync_group_deleted + | :dsync_group_updated + | :dsync_group_user_added + | :dsync_group_user_removed + | :dsync_user_created + | :dsync_user_deleted + | :dsync_user_updated + | :email_verification_created + | :group_created + | :group_deleted + | :group_member_added + | :group_member_removed + | :group_updated + | :flag_created + | :flag_deleted + | :flag_updated + | :flag_rule_updated + | :invitation_accepted + | :invitation_created + | :invitation_resent + | :invitation_revoked + | :magic_auth_created + | :organization_created + | :organization_deleted + | :organization_updated + | :organization_domain_created + | :organization_domain_deleted + | :organization_domain_updated + | :organization_domain_verified + | :organization_domain_verification_failed + | :password_reset_created + | :password_reset_succeeded + | :user_created + | :user_updated + | :user_deleted + | :organization_membership_created + | :organization_membership_deleted + | :organization_membership_updated + | :role_created + | :role_deleted + | :role_updated + | :organization_role_created + | :organization_role_deleted + | :organization_role_updated + | :permission_created + | :permission_deleted + | :permission_updated + | :pipes_connected_account_connected + | :pipes_connected_account_connection_failed + | :pipes_connected_account_disconnected + | :pipes_connected_account_reauthorization_needed + | :session_created + | :session_revoked + | :waitlist_user_approved + | :waitlist_user_created + | :waitlist_user_denied + + @doc "All known values." + @spec values() :: [t()] + def values, + do: [ + :agent_registration_created, + :agent_registration_claim_attempt_created, + :agent_registration_claim_completed, + :agent_registration_credential_issued, + :agent_registration_deleted, + :agent_registration_expired, + :agent_registration_organization_switched, + :agent_registration_revoked, + :authentication_email_verification_succeeded, + :authentication_magic_auth_failed, + :authentication_magic_auth_succeeded, + :authentication_mfa_succeeded, + :authentication_oauth_failed, + :authentication_oauth_succeeded, + :authentication_password_failed, + :authentication_password_succeeded, + :authentication_passkey_failed, + :authentication_passkey_succeeded, + :authentication_sso_failed, + :authentication_sso_started, + :authentication_sso_succeeded, + :authentication_sso_timed_out, + :radar_challenge_created, + :authentication_radar_risk_detected, + :authentication_reauthentication_succeeded, + :api_key_created, + :api_key_revoked, + :api_key_updated, + :connection_activated, + :connection_deactivated, + :connection_saml_certificate_renewal_required, + :connection_saml_certificate_renewed, + :connection_deleted, + :dsync_activated, + :dsync_deleted, + :dsync_group_created, + :dsync_group_deleted, + :dsync_group_updated, + :dsync_group_user_added, + :dsync_group_user_removed, + :dsync_user_created, + :dsync_user_deleted, + :dsync_user_updated, + :email_verification_created, + :group_created, + :group_deleted, + :group_member_added, + :group_member_removed, + :group_updated, + :flag_created, + :flag_deleted, + :flag_updated, + :flag_rule_updated, + :invitation_accepted, + :invitation_created, + :invitation_resent, + :invitation_revoked, + :magic_auth_created, + :organization_created, + :organization_deleted, + :organization_updated, + :organization_domain_created, + :organization_domain_deleted, + :organization_domain_updated, + :organization_domain_verified, + :organization_domain_verification_failed, + :password_reset_created, + :password_reset_succeeded, + :user_created, + :user_updated, + :user_deleted, + :organization_membership_created, + :organization_membership_deleted, + :organization_membership_updated, + :role_created, + :role_deleted, + :role_updated, + :organization_role_created, + :organization_role_deleted, + :organization_role_updated, + :permission_created, + :permission_deleted, + :permission_updated, + :pipes_connected_account_connected, + :pipes_connected_account_connection_failed, + :pipes_connected_account_disconnected, + :pipes_connected_account_reauthorization_needed, + :session_created, + :session_revoked, + :waitlist_user_approved, + :waitlist_user_created, + :waitlist_user_denied + ] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("agent.registration.created"), do: :agent_registration_created + + def cast("agent.registration.claim.attempt.created"), + do: :agent_registration_claim_attempt_created + + def cast("agent.registration.claim.completed"), do: :agent_registration_claim_completed + def cast("agent.registration.credential.issued"), do: :agent_registration_credential_issued + def cast("agent.registration.deleted"), do: :agent_registration_deleted + def cast("agent.registration.expired"), do: :agent_registration_expired + + def cast("agent.registration.organization.switched"), + do: :agent_registration_organization_switched + + def cast("agent.registration.revoked"), do: :agent_registration_revoked + + def cast("authentication.email_verification_succeeded"), + do: :authentication_email_verification_succeeded + + def cast("authentication.magic_auth_failed"), do: :authentication_magic_auth_failed + def cast("authentication.magic_auth_succeeded"), do: :authentication_magic_auth_succeeded + def cast("authentication.mfa_succeeded"), do: :authentication_mfa_succeeded + def cast("authentication.oauth_failed"), do: :authentication_oauth_failed + def cast("authentication.oauth_succeeded"), do: :authentication_oauth_succeeded + def cast("authentication.password_failed"), do: :authentication_password_failed + def cast("authentication.password_succeeded"), do: :authentication_password_succeeded + def cast("authentication.passkey_failed"), do: :authentication_passkey_failed + def cast("authentication.passkey_succeeded"), do: :authentication_passkey_succeeded + def cast("authentication.sso_failed"), do: :authentication_sso_failed + def cast("authentication.sso_started"), do: :authentication_sso_started + def cast("authentication.sso_succeeded"), do: :authentication_sso_succeeded + def cast("authentication.sso_timed_out"), do: :authentication_sso_timed_out + def cast("radar.challenge_created"), do: :radar_challenge_created + def cast("authentication.radar_risk_detected"), do: :authentication_radar_risk_detected + + def cast("authentication.reauthentication_succeeded"), + do: :authentication_reauthentication_succeeded + + def cast("api_key.created"), do: :api_key_created + def cast("api_key.revoked"), do: :api_key_revoked + def cast("api_key.updated"), do: :api_key_updated + def cast("connection.activated"), do: :connection_activated + def cast("connection.deactivated"), do: :connection_deactivated + + def cast("connection.saml_certificate_renewal_required"), + do: :connection_saml_certificate_renewal_required + + def cast("connection.saml_certificate_renewed"), do: :connection_saml_certificate_renewed + def cast("connection.deleted"), do: :connection_deleted + def cast("dsync.activated"), do: :dsync_activated + def cast("dsync.deleted"), do: :dsync_deleted + def cast("dsync.group.created"), do: :dsync_group_created + def cast("dsync.group.deleted"), do: :dsync_group_deleted + def cast("dsync.group.updated"), do: :dsync_group_updated + def cast("dsync.group.user_added"), do: :dsync_group_user_added + def cast("dsync.group.user_removed"), do: :dsync_group_user_removed + def cast("dsync.user.created"), do: :dsync_user_created + def cast("dsync.user.deleted"), do: :dsync_user_deleted + def cast("dsync.user.updated"), do: :dsync_user_updated + def cast("email_verification.created"), do: :email_verification_created + def cast("group.created"), do: :group_created + def cast("group.deleted"), do: :group_deleted + def cast("group.member_added"), do: :group_member_added + def cast("group.member_removed"), do: :group_member_removed + def cast("group.updated"), do: :group_updated + def cast("flag.created"), do: :flag_created + def cast("flag.deleted"), do: :flag_deleted + def cast("flag.updated"), do: :flag_updated + def cast("flag.rule_updated"), do: :flag_rule_updated + def cast("invitation.accepted"), do: :invitation_accepted + def cast("invitation.created"), do: :invitation_created + def cast("invitation.resent"), do: :invitation_resent + def cast("invitation.revoked"), do: :invitation_revoked + def cast("magic_auth.created"), do: :magic_auth_created + def cast("organization.created"), do: :organization_created + def cast("organization.deleted"), do: :organization_deleted + def cast("organization.updated"), do: :organization_updated + def cast("organization_domain.created"), do: :organization_domain_created + def cast("organization_domain.deleted"), do: :organization_domain_deleted + def cast("organization_domain.updated"), do: :organization_domain_updated + def cast("organization_domain.verified"), do: :organization_domain_verified + + def cast("organization_domain.verification_failed"), + do: :organization_domain_verification_failed + + def cast("password_reset.created"), do: :password_reset_created + def cast("password_reset.succeeded"), do: :password_reset_succeeded + def cast("user.created"), do: :user_created + def cast("user.updated"), do: :user_updated + def cast("user.deleted"), do: :user_deleted + def cast("organization_membership.created"), do: :organization_membership_created + def cast("organization_membership.deleted"), do: :organization_membership_deleted + def cast("organization_membership.updated"), do: :organization_membership_updated + def cast("role.created"), do: :role_created + def cast("role.deleted"), do: :role_deleted + def cast("role.updated"), do: :role_updated + def cast("organization_role.created"), do: :organization_role_created + def cast("organization_role.deleted"), do: :organization_role_deleted + def cast("organization_role.updated"), do: :organization_role_updated + def cast("permission.created"), do: :permission_created + def cast("permission.deleted"), do: :permission_deleted + def cast("permission.updated"), do: :permission_updated + def cast("pipes.connected_account.connected"), do: :pipes_connected_account_connected + + def cast("pipes.connected_account.connection_failed"), + do: :pipes_connected_account_connection_failed + + def cast("pipes.connected_account.disconnected"), do: :pipes_connected_account_disconnected + + def cast("pipes.connected_account.reauthorization_needed"), + do: :pipes_connected_account_reauthorization_needed + + def cast("session.created"), do: :session_created + def cast("session.revoked"), do: :session_revoked + def cast("waitlist_user.approved"), do: :waitlist_user_approved + def cast("waitlist_user.created"), do: :waitlist_user_created + def cast("waitlist_user.denied"), do: :waitlist_user_denied + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:agent_registration_created), do: "agent.registration.created" + + def dump(:agent_registration_claim_attempt_created), + do: "agent.registration.claim.attempt.created" + + def dump(:agent_registration_claim_completed), do: "agent.registration.claim.completed" + def dump(:agent_registration_credential_issued), do: "agent.registration.credential.issued" + def dump(:agent_registration_deleted), do: "agent.registration.deleted" + def dump(:agent_registration_expired), do: "agent.registration.expired" + + def dump(:agent_registration_organization_switched), + do: "agent.registration.organization.switched" + + def dump(:agent_registration_revoked), do: "agent.registration.revoked" + + def dump(:authentication_email_verification_succeeded), + do: "authentication.email_verification_succeeded" + + def dump(:authentication_magic_auth_failed), do: "authentication.magic_auth_failed" + def dump(:authentication_magic_auth_succeeded), do: "authentication.magic_auth_succeeded" + def dump(:authentication_mfa_succeeded), do: "authentication.mfa_succeeded" + def dump(:authentication_oauth_failed), do: "authentication.oauth_failed" + def dump(:authentication_oauth_succeeded), do: "authentication.oauth_succeeded" + def dump(:authentication_password_failed), do: "authentication.password_failed" + def dump(:authentication_password_succeeded), do: "authentication.password_succeeded" + def dump(:authentication_passkey_failed), do: "authentication.passkey_failed" + def dump(:authentication_passkey_succeeded), do: "authentication.passkey_succeeded" + def dump(:authentication_sso_failed), do: "authentication.sso_failed" + def dump(:authentication_sso_started), do: "authentication.sso_started" + def dump(:authentication_sso_succeeded), do: "authentication.sso_succeeded" + def dump(:authentication_sso_timed_out), do: "authentication.sso_timed_out" + def dump(:radar_challenge_created), do: "radar.challenge_created" + def dump(:authentication_radar_risk_detected), do: "authentication.radar_risk_detected" + + def dump(:authentication_reauthentication_succeeded), + do: "authentication.reauthentication_succeeded" + + def dump(:api_key_created), do: "api_key.created" + def dump(:api_key_revoked), do: "api_key.revoked" + def dump(:api_key_updated), do: "api_key.updated" + def dump(:connection_activated), do: "connection.activated" + def dump(:connection_deactivated), do: "connection.deactivated" + + def dump(:connection_saml_certificate_renewal_required), + do: "connection.saml_certificate_renewal_required" + + def dump(:connection_saml_certificate_renewed), do: "connection.saml_certificate_renewed" + def dump(:connection_deleted), do: "connection.deleted" + def dump(:dsync_activated), do: "dsync.activated" + def dump(:dsync_deleted), do: "dsync.deleted" + def dump(:dsync_group_created), do: "dsync.group.created" + def dump(:dsync_group_deleted), do: "dsync.group.deleted" + def dump(:dsync_group_updated), do: "dsync.group.updated" + def dump(:dsync_group_user_added), do: "dsync.group.user_added" + def dump(:dsync_group_user_removed), do: "dsync.group.user_removed" + def dump(:dsync_user_created), do: "dsync.user.created" + def dump(:dsync_user_deleted), do: "dsync.user.deleted" + def dump(:dsync_user_updated), do: "dsync.user.updated" + def dump(:email_verification_created), do: "email_verification.created" + def dump(:group_created), do: "group.created" + def dump(:group_deleted), do: "group.deleted" + def dump(:group_member_added), do: "group.member_added" + def dump(:group_member_removed), do: "group.member_removed" + def dump(:group_updated), do: "group.updated" + def dump(:flag_created), do: "flag.created" + def dump(:flag_deleted), do: "flag.deleted" + def dump(:flag_updated), do: "flag.updated" + def dump(:flag_rule_updated), do: "flag.rule_updated" + def dump(:invitation_accepted), do: "invitation.accepted" + def dump(:invitation_created), do: "invitation.created" + def dump(:invitation_resent), do: "invitation.resent" + def dump(:invitation_revoked), do: "invitation.revoked" + def dump(:magic_auth_created), do: "magic_auth.created" + def dump(:organization_created), do: "organization.created" + def dump(:organization_deleted), do: "organization.deleted" + def dump(:organization_updated), do: "organization.updated" + def dump(:organization_domain_created), do: "organization_domain.created" + def dump(:organization_domain_deleted), do: "organization_domain.deleted" + def dump(:organization_domain_updated), do: "organization_domain.updated" + def dump(:organization_domain_verified), do: "organization_domain.verified" + + def dump(:organization_domain_verification_failed), + do: "organization_domain.verification_failed" + + def dump(:password_reset_created), do: "password_reset.created" + def dump(:password_reset_succeeded), do: "password_reset.succeeded" + def dump(:user_created), do: "user.created" + def dump(:user_updated), do: "user.updated" + def dump(:user_deleted), do: "user.deleted" + def dump(:organization_membership_created), do: "organization_membership.created" + def dump(:organization_membership_deleted), do: "organization_membership.deleted" + def dump(:organization_membership_updated), do: "organization_membership.updated" + def dump(:role_created), do: "role.created" + def dump(:role_deleted), do: "role.deleted" + def dump(:role_updated), do: "role.updated" + def dump(:organization_role_created), do: "organization_role.created" + def dump(:organization_role_deleted), do: "organization_role.deleted" + def dump(:organization_role_updated), do: "organization_role.updated" + def dump(:permission_created), do: "permission.created" + def dump(:permission_deleted), do: "permission.deleted" + def dump(:permission_updated), do: "permission.updated" + def dump(:pipes_connected_account_connected), do: "pipes.connected_account.connected" + + def dump(:pipes_connected_account_connection_failed), + do: "pipes.connected_account.connection_failed" + + def dump(:pipes_connected_account_disconnected), do: "pipes.connected_account.disconnected" + + def dump(:pipes_connected_account_reauthorization_needed), + do: "pipes.connected_account.reauthorization_needed" + + def dump(:session_created), do: "session.created" + def dump(:session_revoked), do: "session.revoked" + def dump(:waitlist_user_approved), do: "waitlist_user.approved" + def dump(:waitlist_user_created), do: "waitlist_user.created" + def dump(:waitlist_user_denied), do: "waitlist_user.denied" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/update_webhook_endpoint_status.ex b/lib/workos/update_webhook_endpoint_status.ex new file mode 100644 index 00000000..a7ab37dd --- /dev/null +++ b/lib/workos/update_webhook_endpoint_status.ex @@ -0,0 +1,25 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UpdateWebhookEndpointStatus do + @moduledoc """ + UpdateWebhookEndpointStatus enum. + """ + + @type t :: :enabled | :disabled + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:enabled, :disabled] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("enabled"), do: :enabled + def cast("disabled"), do: :disabled + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:enabled), do: "enabled" + def dump(:disabled), do: "disabled" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/user.ex b/lib/workos/user.ex new file mode 100644 index 00000000..55612553 --- /dev/null +++ b/lib/workos/user.ex @@ -0,0 +1,83 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.User do + @moduledoc """ + The user object. + """ + + defstruct [ + :object, + :id, + :first_name, + :last_name, + :profile_picture_url, + :email, + :email_verified, + :external_id, + :last_sign_in_at, + :created_at, + :updated_at, + :name, + :metadata, + :locale + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + first_name: String.t() | nil, + last_name: String.t() | nil, + profile_picture_url: String.t() | nil, + email: String.t(), + email_verified: boolean(), + external_id: String.t() | nil, + last_sign_in_at: String.t() | nil, + created_at: String.t(), + updated_at: String.t(), + name: String.t() | nil, + metadata: %{optional(String.t()) => String.t()} | nil, + locale: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + first_name: map["first_name"], + last_name: map["last_name"], + profile_picture_url: map["profile_picture_url"], + email: map["email"], + email_verified: map["email_verified"], + external_id: map["external_id"], + last_sign_in_at: map["last_sign_in_at"], + created_at: map["created_at"], + updated_at: map["updated_at"], + name: map["name"], + metadata: map["metadata"], + locale: map["locale"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "first_name" => struct.first_name, + "last_name" => struct.last_name, + "profile_picture_url" => struct.profile_picture_url, + "email" => struct.email, + "email_verified" => struct.email_verified, + "external_id" => struct.external_id, + "last_sign_in_at" => struct.last_sign_in_at, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at, + "name" => struct.name, + "metadata" => struct.metadata, + "locale" => struct.locale + }) + end +end diff --git a/lib/workos/user_api_key.ex b/lib/workos/user_api_key.ex new file mode 100644 index 00000000..b00cc636 --- /dev/null +++ b/lib/workos/user_api_key.ex @@ -0,0 +1,67 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UserApiKey do + @moduledoc """ + UserApiKey model. + """ + + defstruct [ + :object, + :id, + :owner, + :name, + :obfuscated_value, + :last_used_at, + :expires_at, + :permissions, + :created_at, + :updated_at + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + owner: WorkOS.UserApiKeyOwner.t(), + name: String.t(), + obfuscated_value: String.t(), + last_used_at: String.t() | nil, + expires_at: String.t() | nil, + permissions: [String.t()], + created_at: String.t(), + updated_at: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + owner: WorkOS.Cast.nested(map["owner"], &WorkOS.UserApiKeyOwner.from_map/1), + name: map["name"], + obfuscated_value: map["obfuscated_value"], + last_used_at: map["last_used_at"], + expires_at: map["expires_at"], + permissions: map["permissions"], + created_at: map["created_at"], + updated_at: map["updated_at"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "owner" => WorkOS.Cast.dump_struct(struct.owner, &WorkOS.UserApiKeyOwner.to_map/1), + "name" => struct.name, + "obfuscated_value" => struct.obfuscated_value, + "last_used_at" => struct.last_used_at, + "expires_at" => struct.expires_at, + "permissions" => struct.permissions, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at + }) + end +end diff --git a/lib/workos/user_api_key_created_data_owner.ex b/lib/workos/user_api_key_created_data_owner.ex new file mode 100644 index 00000000..406aa3e4 --- /dev/null +++ b/lib/workos/user_api_key_created_data_owner.ex @@ -0,0 +1,39 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UserApiKeyCreatedDataOwner do + @moduledoc """ + UserApiKeyCreatedDataOwner model. + """ + + defstruct [ + :type, + :id, + :organization_id + ] + + @type t :: %__MODULE__{ + type: String.t(), + id: String.t(), + organization_id: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + type: map["type"], + id: map["id"], + organization_id: map["organization_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "type" => struct.type, + "id" => struct.id, + "organization_id" => struct.organization_id + }) + end +end diff --git a/lib/workos/user_api_key_list.ex b/lib/workos/user_api_key_list.ex new file mode 100644 index 00000000..405d9366 --- /dev/null +++ b/lib/workos/user_api_key_list.ex @@ -0,0 +1,44 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UserApiKeyList do + @moduledoc """ + UserApiKeyList model. + """ + + defstruct [ + :object, + :data, + :list_metadata + ] + + @type t :: %__MODULE__{ + object: String.t(), + data: [WorkOS.UserApiKey.t()], + list_metadata: WorkOS.UserApiKeyListListMetadata.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + data: WorkOS.Cast.list(map["data"], &WorkOS.UserApiKey.from_map/1), + list_metadata: + WorkOS.Cast.nested(map["list_metadata"], &WorkOS.UserApiKeyListListMetadata.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "data" => + WorkOS.Cast.list(struct.data, fn item -> + WorkOS.Cast.dump_struct(item, &WorkOS.UserApiKey.to_map/1) + end), + "list_metadata" => + WorkOS.Cast.dump_struct(struct.list_metadata, &WorkOS.UserApiKeyListListMetadata.to_map/1) + }) + end +end diff --git a/lib/workos/user_api_key_list_list_metadata.ex b/lib/workos/user_api_key_list_list_metadata.ex new file mode 100644 index 00000000..ee8696a7 --- /dev/null +++ b/lib/workos/user_api_key_list_list_metadata.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UserApiKeyListListMetadata do + @moduledoc """ + Pagination cursors for navigating between pages of results. + """ + + defstruct [ + :before, + :after_ + ] + + @type t :: %__MODULE__{ + before: String.t() | nil, + after_: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + before: map["before"], + after_: map["after"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "before" => struct.before, + "after" => struct.after_ + }) + end +end diff --git a/lib/workos/user_api_key_owner.ex b/lib/workos/user_api_key_owner.ex new file mode 100644 index 00000000..03b73cd1 --- /dev/null +++ b/lib/workos/user_api_key_owner.ex @@ -0,0 +1,39 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UserApiKeyOwner do + @moduledoc """ + The entity that owns the API Key. + """ + + defstruct [ + :type, + :id, + :organization_id + ] + + @type t :: %__MODULE__{ + type: String.t(), + id: String.t(), + organization_id: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + type: map["type"], + id: map["id"], + organization_id: map["organization_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "type" => struct.type, + "id" => struct.id, + "organization_id" => struct.organization_id + }) + end +end diff --git a/lib/workos/user_api_key_revoked_data_owner.ex b/lib/workos/user_api_key_revoked_data_owner.ex new file mode 100644 index 00000000..1d25eb60 --- /dev/null +++ b/lib/workos/user_api_key_revoked_data_owner.ex @@ -0,0 +1,39 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UserApiKeyRevokedDataOwner do + @moduledoc """ + UserApiKeyRevokedDataOwner model. + """ + + defstruct [ + :type, + :id, + :organization_id + ] + + @type t :: %__MODULE__{ + type: String.t(), + id: String.t(), + organization_id: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + type: map["type"], + id: map["id"], + organization_id: map["organization_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "type" => struct.type, + "id" => struct.id, + "organization_id" => struct.organization_id + }) + end +end diff --git a/lib/workos/user_api_key_updated_data_owner.ex b/lib/workos/user_api_key_updated_data_owner.ex new file mode 100644 index 00000000..87224585 --- /dev/null +++ b/lib/workos/user_api_key_updated_data_owner.ex @@ -0,0 +1,39 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UserApiKeyUpdatedDataOwner do + @moduledoc """ + UserApiKeyUpdatedDataOwner model. + """ + + defstruct [ + :type, + :id, + :organization_id + ] + + @type t :: %__MODULE__{ + type: String.t(), + id: String.t(), + organization_id: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + type: map["type"], + id: map["id"], + organization_id: map["organization_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "type" => struct.type, + "id" => struct.id, + "organization_id" => struct.organization_id + }) + end +end diff --git a/lib/workos/user_api_key_with_value.ex b/lib/workos/user_api_key_with_value.ex new file mode 100644 index 00000000..101d28b5 --- /dev/null +++ b/lib/workos/user_api_key_with_value.ex @@ -0,0 +1,71 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UserApiKeyWithValue do + @moduledoc """ + UserApiKeyWithValue model. + """ + + defstruct [ + :object, + :id, + :owner, + :name, + :obfuscated_value, + :last_used_at, + :expires_at, + :permissions, + :created_at, + :updated_at, + :value + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + owner: WorkOS.UserApiKeyWithValueOwner.t(), + name: String.t(), + obfuscated_value: String.t(), + last_used_at: String.t() | nil, + expires_at: String.t() | nil, + permissions: [String.t()], + created_at: String.t(), + updated_at: String.t(), + value: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + owner: WorkOS.Cast.nested(map["owner"], &WorkOS.UserApiKeyWithValueOwner.from_map/1), + name: map["name"], + obfuscated_value: map["obfuscated_value"], + last_used_at: map["last_used_at"], + expires_at: map["expires_at"], + permissions: map["permissions"], + created_at: map["created_at"], + updated_at: map["updated_at"], + value: map["value"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "owner" => WorkOS.Cast.dump_struct(struct.owner, &WorkOS.UserApiKeyWithValueOwner.to_map/1), + "name" => struct.name, + "obfuscated_value" => struct.obfuscated_value, + "last_used_at" => struct.last_used_at, + "expires_at" => struct.expires_at, + "permissions" => struct.permissions, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at, + "value" => struct.value + }) + end +end diff --git a/lib/workos/user_api_key_with_value_owner.ex b/lib/workos/user_api_key_with_value_owner.ex new file mode 100644 index 00000000..c73dcce9 --- /dev/null +++ b/lib/workos/user_api_key_with_value_owner.ex @@ -0,0 +1,39 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UserApiKeyWithValueOwner do + @moduledoc """ + The entity that owns the API Key. + """ + + defstruct [ + :type, + :id, + :organization_id + ] + + @type t :: %__MODULE__{ + type: String.t(), + id: String.t(), + organization_id: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + type: map["type"], + id: map["id"], + organization_id: map["organization_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "type" => struct.type, + "id" => struct.id, + "organization_id" => struct.organization_id + }) + end +end diff --git a/lib/workos/user_authentication_factor_enroll_response.ex b/lib/workos/user_authentication_factor_enroll_response.ex new file mode 100644 index 00000000..d53dacf8 --- /dev/null +++ b/lib/workos/user_authentication_factor_enroll_response.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UserAuthenticationFactorEnrollResponse do + @moduledoc """ + UserAuthenticationFactorEnrollResponse model. + """ + + defstruct [ + :authentication_factor, + :authentication_challenge + ] + + @type t :: %__MODULE__{ + authentication_factor: WorkOS.AuthenticationFactorEnrolled.t(), + authentication_challenge: WorkOS.AuthenticationChallenge.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + authentication_factor: + WorkOS.Cast.nested( + map["authentication_factor"], + &WorkOS.AuthenticationFactorEnrolled.from_map/1 + ), + authentication_challenge: + WorkOS.Cast.nested( + map["authentication_challenge"], + &WorkOS.AuthenticationChallenge.from_map/1 + ) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "authentication_factor" => + WorkOS.Cast.dump_struct( + struct.authentication_factor, + &WorkOS.AuthenticationFactorEnrolled.to_map/1 + ), + "authentication_challenge" => + WorkOS.Cast.dump_struct( + struct.authentication_challenge, + &WorkOS.AuthenticationChallenge.to_map/1 + ) + }) + end +end diff --git a/lib/workos/user_authentication_factor_list.ex b/lib/workos/user_authentication_factor_list.ex new file mode 100644 index 00000000..36d534bc --- /dev/null +++ b/lib/workos/user_authentication_factor_list.ex @@ -0,0 +1,50 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UserAuthenticationFactorList do + @moduledoc """ + UserAuthenticationFactorList model. + """ + + defstruct [ + :object, + :data, + :list_metadata + ] + + @type t :: %__MODULE__{ + object: String.t(), + data: [WorkOS.AuthenticationFactor.t()], + list_metadata: WorkOS.UserAuthenticationFactorListListMetadata.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + data: WorkOS.Cast.list(map["data"], &WorkOS.AuthenticationFactor.from_map/1), + list_metadata: + WorkOS.Cast.nested( + map["list_metadata"], + &WorkOS.UserAuthenticationFactorListListMetadata.from_map/1 + ) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "data" => + WorkOS.Cast.list(struct.data, fn item -> + WorkOS.Cast.dump_struct(item, &WorkOS.AuthenticationFactor.to_map/1) + end), + "list_metadata" => + WorkOS.Cast.dump_struct( + struct.list_metadata, + &WorkOS.UserAuthenticationFactorListListMetadata.to_map/1 + ) + }) + end +end diff --git a/lib/workos/user_authentication_factor_list_list_metadata.ex b/lib/workos/user_authentication_factor_list_list_metadata.ex new file mode 100644 index 00000000..9f81a970 --- /dev/null +++ b/lib/workos/user_authentication_factor_list_list_metadata.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UserAuthenticationFactorListListMetadata do + @moduledoc """ + Pagination cursors for navigating between pages of results. + """ + + defstruct [ + :before, + :after_ + ] + + @type t :: %__MODULE__{ + before: String.t() | nil, + after_: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + before: map["before"], + after_: map["after"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "before" => struct.before, + "after" => struct.after_ + }) + end +end diff --git a/lib/workos/user_consent_option.ex b/lib/workos/user_consent_option.ex new file mode 100644 index 00000000..acb0d111 --- /dev/null +++ b/lib/workos/user_consent_option.ex @@ -0,0 +1,46 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UserConsentOption do + @moduledoc """ + UserConsentOption model. + """ + + defstruct [ + :claim, + :type, + :label, + :choices + ] + + @type t :: %__MODULE__{ + claim: String.t(), + type: String.t(), + label: String.t(), + choices: [WorkOS.UserConsentOptionChoice.t()] + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + claim: map["claim"], + type: map["type"], + label: map["label"], + choices: WorkOS.Cast.list(map["choices"], &WorkOS.UserConsentOptionChoice.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "claim" => struct.claim, + "type" => struct.type, + "label" => struct.label, + "choices" => + WorkOS.Cast.list(struct.choices, fn item -> + WorkOS.Cast.dump_struct(item, &WorkOS.UserConsentOptionChoice.to_map/1) + end) + }) + end +end diff --git a/lib/workos/user_consent_option_choice.ex b/lib/workos/user_consent_option_choice.ex new file mode 100644 index 00000000..7925bd8a --- /dev/null +++ b/lib/workos/user_consent_option_choice.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UserConsentOptionChoice do + @moduledoc """ + UserConsentOptionChoice model. + """ + + defstruct [ + :value, + :label + ] + + @type t :: %__MODULE__{ + value: String.t() | nil, + label: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + value: map["value"], + label: map["label"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "value" => struct.value, + "label" => struct.label + }) + end +end diff --git a/lib/workos/user_create_response.ex b/lib/workos/user_create_response.ex new file mode 100644 index 00000000..54d843c8 --- /dev/null +++ b/lib/workos/user_create_response.ex @@ -0,0 +1,87 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UserCreateResponse do + @moduledoc """ + UserCreateResponse model. + """ + + defstruct [ + :object, + :id, + :first_name, + :last_name, + :profile_picture_url, + :email, + :email_verified, + :external_id, + :last_sign_in_at, + :created_at, + :updated_at, + :name, + :metadata, + :locale, + :radar_auth_attempt_id + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + first_name: String.t() | nil, + last_name: String.t() | nil, + profile_picture_url: String.t() | nil, + email: String.t(), + email_verified: boolean(), + external_id: String.t() | nil, + last_sign_in_at: String.t() | nil, + created_at: String.t(), + updated_at: String.t(), + name: String.t() | nil, + metadata: %{optional(String.t()) => String.t()} | nil, + locale: String.t() | nil, + radar_auth_attempt_id: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + first_name: map["first_name"], + last_name: map["last_name"], + profile_picture_url: map["profile_picture_url"], + email: map["email"], + email_verified: map["email_verified"], + external_id: map["external_id"], + last_sign_in_at: map["last_sign_in_at"], + created_at: map["created_at"], + updated_at: map["updated_at"], + name: map["name"], + metadata: map["metadata"], + locale: map["locale"], + radar_auth_attempt_id: map["radar_auth_attempt_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "first_name" => struct.first_name, + "last_name" => struct.last_name, + "profile_picture_url" => struct.profile_picture_url, + "email" => struct.email, + "email_verified" => struct.email_verified, + "external_id" => struct.external_id, + "last_sign_in_at" => struct.last_sign_in_at, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at, + "name" => struct.name, + "metadata" => struct.metadata, + "locale" => struct.locale, + "radar_auth_attempt_id" => struct.radar_auth_attempt_id + }) + end +end diff --git a/lib/workos/user_created.ex b/lib/workos/user_created.ex new file mode 100644 index 00000000..29e4b9fe --- /dev/null +++ b/lib/workos/user_created.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UserCreated do + @moduledoc """ + UserCreated model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.User.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.User.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => WorkOS.Cast.dump_struct(struct.data, &WorkOS.User.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/user_deleted.ex b/lib/workos/user_deleted.ex new file mode 100644 index 00000000..2237db39 --- /dev/null +++ b/lib/workos/user_deleted.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UserDeleted do + @moduledoc """ + UserDeleted model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.User.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.User.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => WorkOS.Cast.dump_struct(struct.data, &WorkOS.User.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/user_identities_get_item.ex b/lib/workos/user_identities_get_item.ex new file mode 100644 index 00000000..968d8472 --- /dev/null +++ b/lib/workos/user_identities_get_item.ex @@ -0,0 +1,40 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UserIdentitiesGetItem do + @moduledoc """ + UserIdentitiesGetItem model. + """ + + defstruct [ + :idp_id, + :type, + :provider + ] + + @type t :: %__MODULE__{ + idp_id: String.t(), + type: String.t(), + provider: WorkOS.UserIdentitiesGetItemProvider.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + idp_id: map["idp_id"], + type: map["type"], + provider: WorkOS.Cast.enum(map["provider"], &WorkOS.UserIdentitiesGetItemProvider.cast/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "idp_id" => struct.idp_id, + "type" => struct.type, + "provider" => + WorkOS.Cast.enum(struct.provider, &WorkOS.UserIdentitiesGetItemProvider.dump/1) + }) + end +end diff --git a/lib/workos/user_identities_get_item_provider.ex b/lib/workos/user_identities_get_item_provider.ex new file mode 100644 index 00000000..52ba531c --- /dev/null +++ b/lib/workos/user_identities_get_item_provider.ex @@ -0,0 +1,79 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UserIdentitiesGetItemProvider do + @moduledoc """ + UserIdentitiesGetItemProvider enum. + """ + + @type t :: + :apple_oauth + | :bitbucket_oauth + | :discord_oauth + | :github_oauth + | :git_lab_oauth + | :google_oauth + | :intuit_oauth + | :linked_in_oauth + | :microsoft_oauth + | :salesforce_oauth + | :slack_oauth + | :vercel_marketplace_oauth + | :vercel_oauth + | :xero_oauth + + @doc "All known values." + @spec values() :: [t()] + def values, + do: [ + :apple_oauth, + :bitbucket_oauth, + :discord_oauth, + :github_oauth, + :git_lab_oauth, + :google_oauth, + :intuit_oauth, + :linked_in_oauth, + :microsoft_oauth, + :salesforce_oauth, + :slack_oauth, + :vercel_marketplace_oauth, + :vercel_oauth, + :xero_oauth + ] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("AppleOAuth"), do: :apple_oauth + def cast("BitbucketOAuth"), do: :bitbucket_oauth + def cast("DiscordOAuth"), do: :discord_oauth + def cast("GithubOAuth"), do: :github_oauth + def cast("GitLabOAuth"), do: :git_lab_oauth + def cast("GoogleOAuth"), do: :google_oauth + def cast("IntuitOAuth"), do: :intuit_oauth + def cast("LinkedInOAuth"), do: :linked_in_oauth + def cast("MicrosoftOAuth"), do: :microsoft_oauth + def cast("SalesforceOAuth"), do: :salesforce_oauth + def cast("SlackOAuth"), do: :slack_oauth + def cast("VercelMarketplaceOAuth"), do: :vercel_marketplace_oauth + def cast("VercelOAuth"), do: :vercel_oauth + def cast("XeroOAuth"), do: :xero_oauth + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:apple_oauth), do: "AppleOAuth" + def dump(:bitbucket_oauth), do: "BitbucketOAuth" + def dump(:discord_oauth), do: "DiscordOAuth" + def dump(:github_oauth), do: "GithubOAuth" + def dump(:git_lab_oauth), do: "GitLabOAuth" + def dump(:google_oauth), do: "GoogleOAuth" + def dump(:intuit_oauth), do: "IntuitOAuth" + def dump(:linked_in_oauth), do: "LinkedInOAuth" + def dump(:microsoft_oauth), do: "MicrosoftOAuth" + def dump(:salesforce_oauth), do: "SalesforceOAuth" + def dump(:slack_oauth), do: "SlackOAuth" + def dump(:vercel_marketplace_oauth), do: "VercelMarketplaceOAuth" + def dump(:vercel_oauth), do: "VercelOAuth" + def dump(:xero_oauth), do: "XeroOAuth" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/user_invite.ex b/lib/workos/user_invite.ex new file mode 100644 index 00000000..4173afb5 --- /dev/null +++ b/lib/workos/user_invite.ex @@ -0,0 +1,87 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UserInvite do + @moduledoc """ + UserInvite model. + """ + + defstruct [ + :object, + :id, + :email, + :state, + :accepted_at, + :revoked_at, + :expires_at, + :organization_id, + :inviter_user_id, + :accepted_user_id, + :role_slug, + :created_at, + :updated_at, + :token, + :accept_invitation_url + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + email: String.t(), + state: WorkOS.UserInviteState.t(), + accepted_at: String.t() | nil, + revoked_at: String.t() | nil, + expires_at: String.t(), + organization_id: String.t() | nil, + inviter_user_id: String.t() | nil, + accepted_user_id: String.t() | nil, + role_slug: String.t() | nil, + created_at: String.t(), + updated_at: String.t(), + token: String.t(), + accept_invitation_url: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + email: map["email"], + state: WorkOS.Cast.enum(map["state"], &WorkOS.UserInviteState.cast/1), + accepted_at: map["accepted_at"], + revoked_at: map["revoked_at"], + expires_at: map["expires_at"], + organization_id: map["organization_id"], + inviter_user_id: map["inviter_user_id"], + accepted_user_id: map["accepted_user_id"], + role_slug: map["role_slug"], + created_at: map["created_at"], + updated_at: map["updated_at"], + token: map["token"], + accept_invitation_url: map["accept_invitation_url"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "email" => struct.email, + "state" => WorkOS.Cast.enum(struct.state, &WorkOS.UserInviteState.dump/1), + "accepted_at" => struct.accepted_at, + "revoked_at" => struct.revoked_at, + "expires_at" => struct.expires_at, + "organization_id" => struct.organization_id, + "inviter_user_id" => struct.inviter_user_id, + "accepted_user_id" => struct.accepted_user_id, + "role_slug" => struct.role_slug, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at, + "token" => struct.token, + "accept_invitation_url" => struct.accept_invitation_url + }) + end +end diff --git a/lib/workos/user_invite_list.ex b/lib/workos/user_invite_list.ex new file mode 100644 index 00000000..3bae1f0b --- /dev/null +++ b/lib/workos/user_invite_list.ex @@ -0,0 +1,44 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UserInviteList do + @moduledoc """ + UserInviteList model. + """ + + defstruct [ + :object, + :data, + :list_metadata + ] + + @type t :: %__MODULE__{ + object: String.t(), + data: [WorkOS.UserInvite.t()], + list_metadata: WorkOS.UserInviteListListMetadata.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + data: WorkOS.Cast.list(map["data"], &WorkOS.UserInvite.from_map/1), + list_metadata: + WorkOS.Cast.nested(map["list_metadata"], &WorkOS.UserInviteListListMetadata.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "data" => + WorkOS.Cast.list(struct.data, fn item -> + WorkOS.Cast.dump_struct(item, &WorkOS.UserInvite.to_map/1) + end), + "list_metadata" => + WorkOS.Cast.dump_struct(struct.list_metadata, &WorkOS.UserInviteListListMetadata.to_map/1) + }) + end +end diff --git a/lib/workos/user_invite_list_list_metadata.ex b/lib/workos/user_invite_list_list_metadata.ex new file mode 100644 index 00000000..443b68cd --- /dev/null +++ b/lib/workos/user_invite_list_list_metadata.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UserInviteListListMetadata do + @moduledoc """ + Pagination cursors for navigating between pages of results. + """ + + defstruct [ + :before, + :after_ + ] + + @type t :: %__MODULE__{ + before: String.t() | nil, + after_: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + before: map["before"], + after_: map["after"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "before" => struct.before, + "after" => struct.after_ + }) + end +end diff --git a/lib/workos/user_invite_state.ex b/lib/workos/user_invite_state.ex new file mode 100644 index 00000000..c5d45f49 --- /dev/null +++ b/lib/workos/user_invite_state.ex @@ -0,0 +1,29 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UserInviteState do + @moduledoc """ + UserInviteState enum. + """ + + @type t :: :pending | :accepted | :expired | :revoked + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:pending, :accepted, :expired, :revoked] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("pending"), do: :pending + def cast("accepted"), do: :accepted + def cast("expired"), do: :expired + def cast("revoked"), do: :revoked + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:pending), do: "pending" + def dump(:accepted), do: "accepted" + def dump(:expired), do: "expired" + def dump(:revoked), do: "revoked" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/user_list.ex b/lib/workos/user_list.ex new file mode 100644 index 00000000..6007309d --- /dev/null +++ b/lib/workos/user_list.ex @@ -0,0 +1,44 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UserList do + @moduledoc """ + UserList model. + """ + + defstruct [ + :object, + :data, + :list_metadata + ] + + @type t :: %__MODULE__{ + object: String.t(), + data: [WorkOS.User.t()], + list_metadata: WorkOS.UserListListMetadata.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + data: WorkOS.Cast.list(map["data"], &WorkOS.User.from_map/1), + list_metadata: + WorkOS.Cast.nested(map["list_metadata"], &WorkOS.UserListListMetadata.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "data" => + WorkOS.Cast.list(struct.data, fn item -> + WorkOS.Cast.dump_struct(item, &WorkOS.User.to_map/1) + end), + "list_metadata" => + WorkOS.Cast.dump_struct(struct.list_metadata, &WorkOS.UserListListMetadata.to_map/1) + }) + end +end diff --git a/lib/workos/user_list_list_metadata.ex b/lib/workos/user_list_list_metadata.ex new file mode 100644 index 00000000..e8e76d2d --- /dev/null +++ b/lib/workos/user_list_list_metadata.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UserListListMetadata do + @moduledoc """ + Pagination cursors for navigating between pages of results. + """ + + defstruct [ + :before, + :after_ + ] + + @type t :: %__MODULE__{ + before: String.t() | nil, + after_: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + before: map["before"], + after_: map["after"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "before" => struct.before, + "after" => struct.after_ + }) + end +end diff --git a/lib/workos/user_management.ex b/lib/workos/user_management.ex index 941aa842..85eed014 100644 --- a/lib/workos/user_management.ex +++ b/lib/workos/user_management.ex @@ -1,805 +1,1370 @@ +# This file is auto-generated by oagen. Do not edit. + defmodule WorkOS.UserManagement do @moduledoc """ - Manage User Management in WorkOS. - - @see https://workos.com/docs/reference/user-management - """ - - alias WorkOS.Empty - alias WorkOS.UserManagement.Authentication - alias WorkOS.UserManagement.EmailVerification.SendVerificationEmail - alias WorkOS.UserManagement.EmailVerification.VerifyEmail - alias WorkOS.UserManagement.Invitation - alias WorkOS.UserManagement.MagicAuth.SendMagicAuthCode - alias WorkOS.UserManagement.MultiFactor.AuthenticationFactor - alias WorkOS.UserManagement.MultiFactor.EnrollAuthFactor - alias WorkOS.UserManagement.OrganizationMembership - alias WorkOS.UserManagement.ResetPassword - alias WorkOS.UserManagement.User - - @doc """ - Generates an OAuth 2.0 authorization URL. - - Parameter options: - - * `:organization_id` - The `organization_id` connection selector is used to initiate SSO for an Organization. - * `:connection_id` - The `connection_id` connection selector is used to initiate SSO for a Connection. - * `:redirect_uri` - A Redirect URI to return an authorized user to. (required) - * `:client_id` - This value can be obtained from the SSO Configuration page in the WorkOS dashboard. - * `:provider` - The `provider` connection selector is used to initiate SSO using an OAuth-compatible provider. - * `:state` - An optional parameter that can be used to encode arbitrary information to help restore application state between redirects. - * `:login_hint` - Can be used to pre-fill the username/email address field of the IdP sign-in page for the user, if you know their username ahead of time. - * `:domain_hint` - Can be used to pre-fill the domain field when initiating authentication with Microsoft OAuth, or with a GoogleSAML connection type. - - """ - @spec get_authorization_url(map()) :: {:ok, String.t()} | {:error, String.t()} - def get_authorization_url(params) - when is_map_key(params, :redirect_uri) and - (is_map_key(params, :connection_id) or is_map_key(params, :organization_id) or - is_map_key(params, :provider)) do - client_id = - params[:client_id] || WorkOS.client_id() || - raise "Missing required `client_id` parameter." - - defaults = %{ - client_id: client_id, - response_type: "code" - } - - query = - defaults - |> Map.merge(params) - |> Map.take( - [ - :client_id, - :redirect_uri, - :connection_id, - :organization_id, - :provider, - :state, - :login_hint, - :domain_hint, - :domain - ] ++ Map.keys(defaults) - ) - |> URI.encode_query() - - {:ok, "#{WorkOS.base_url()}/user_management/authorize?#{query}"} - end - - def get_authorization_url(_params), - do: - {:error, - "Incomplete arguments. Need to specify either a 'connection', 'organization', or 'provider'."} - - @doc """ - Gets a user. - """ - @spec get_user(String.t()) :: WorkOS.Client.response(User.t()) - @spec get_user(WorkOS.Client.t(), String.t()) :: WorkOS.Client.response(User.t()) - def get_user(client \\ WorkOS.client(), user_id) do - WorkOS.Client.get(client, User, "/user_management/users/:id", - opts: [ - path_params: [id: user_id] - ] - ) + Operations for the UserManagement API. + """ + + @doc """ + Get JWKS + + Returns the JSON Web Key Set (JWKS) containing the public keys used for verifying access tokens. + + ## Parameters + + * `client_id` — Identifies the application making the request to the WorkOS server. You can obtain your client ID from the [API Keys](https://dashboard.workos.com/api-keys) page in the dashboard. + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec get_jwks(WorkOS.Client.t(), String.t(), keyword()) :: + {:ok, WorkOS.JwksResponse.t()} | {:error, WorkOS.Error.error()} + def get_jwks(client, client_id, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :get, + "/sso/jwks/#{URI.encode(client_id, &URI.char_unreserved?/1)}", + %{}, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.JwksResponse.from_map/1)} + end end @doc """ - Gets a user by external ID. + Authenticate with password + + Authenticate + + Authenticate a user with a specified [authentication method](https://workos.com/docs/reference/authkit/authentication). + + Sets `grant_type` (`"password"`) automatically. + + Reads `client_id`/`client_secret` from the client configuration unless passed explicitly. + + ## Parameters + + * `params` — request body map. Required: `:email`, `:password`. Optional: `:invitation_token`, `:ip_address`, `:device_id`, `:user_agent`, `:signals_id`, `:radar_auth_attempt_id`. + * `opts` — per-request options (see `WorkOS.Client.request/5`) """ - @spec get_user_by_external_id(String.t()) :: WorkOS.Client.response(User.t()) - @spec get_user_by_external_id(WorkOS.Client.t(), String.t()) :: WorkOS.Client.response(User.t()) - def get_user_by_external_id(client \\ WorkOS.client(), external_id) do - WorkOS.Client.get(client, User, "/user_management/users/external_id/:external_id", - opts: [ - path_params: [external_id: external_id] - ] - ) + @spec authenticate_with_password(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.AuthenticateResponse.t()} | {:error, WorkOS.Error.error()} + def authenticate_with_password(client, params \\ %{}, opts \\ []) do + params = + params + |> WorkOS.Client.merge_defaults(%{"grant_type" => "password"}) + |> WorkOS.Client.put_inferred("client_id", client.client_id) + |> WorkOS.Client.put_inferred("client_secret", client.api_key) + + with {:ok, body} <- + WorkOS.Client.request(client, :post, "/user_management/authenticate", params, opts) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.AuthenticateResponse.from_map/1)} + end end @doc """ - Lists all users. + Authenticate with code + + Authenticate + + Authenticate a user with a specified [authentication method](https://workos.com/docs/reference/authkit/authentication). - Parameter options: + Sets `grant_type` (`"authorization_code"`) automatically. - * `:email` - Filter Users by their email. - * `:organization_id` - Filter Users by the organization they are members of. - * `:limit` - Maximum number of records to return. Accepts values between 1 and 100. Default is 10. - * `:after` - Pagination cursor to receive records after a provided event ID. - * `:before` - An object ID that defines your place in the list. When the ID is not present, you are at the end of the list. - * `:order` - Order the results by the creation time. Supported values are "asc" and "desc" for showing older and newer records first respectively. + Reads `client_id`/`client_secret` from the client configuration unless passed explicitly. + ## Parameters + + * `params` — request body map. Required: `:code`. Optional: `:code_verifier`, `:invitation_token`, `:ip_address`, `:device_id`, `:user_agent`, `:signals_id`. + * `opts` — per-request options (see `WorkOS.Client.request/5`) """ - @spec list_users(WorkOS.Client.t(), map()) :: - WorkOS.Client.response(WorkOS.List.t(User.t())) - def list_users(client, opts) do - WorkOS.Client.get(client, WorkOS.List.of(User), "/user_management/users", - query: [ - email: opts[:email], - organization_id: opts[:organization_id], - limit: opts[:limit], - after: opts[:after], - before: opts[:before], - order: opts[:order] - ] - ) + @spec authenticate_with_code(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.AuthenticateResponse.t()} | {:error, WorkOS.Error.error()} + def authenticate_with_code(client, params \\ %{}, opts \\ []) do + params = + params + |> WorkOS.Client.merge_defaults(%{"grant_type" => "authorization_code"}) + |> WorkOS.Client.put_inferred("client_id", client.client_id) + |> WorkOS.Client.put_inferred("client_secret", client.api_key) + + with {:ok, body} <- + WorkOS.Client.request(client, :post, "/user_management/authenticate", params, opts) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.AuthenticateResponse.from_map/1)} + end end - @spec list_users(map()) :: - WorkOS.Client.response(WorkOS.List.t(User.t())) - def list_users(opts \\ %{}) do - WorkOS.Client.get(WorkOS.client(), WorkOS.List.of(User), "/user_management/users", - query: [ - email: opts[:email], - organization_id: opts[:organization_id], - limit: opts[:limit], - after: opts[:after], - before: opts[:before], - order: opts[:order] - ] - ) + @doc """ + Authenticate with refresh token + + Authenticate + + Authenticate a user with a specified [authentication method](https://workos.com/docs/reference/authkit/authentication). + + Sets `grant_type` (`"refresh_token"`) automatically. + + Reads `client_id`/`client_secret` from the client configuration unless passed explicitly. + + ## Parameters + + * `params` — request body map. Required: `:refresh_token`. Optional: `:organization_id`, `:ip_address`, `:device_id`, `:user_agent`. + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec authenticate_with_refresh_token(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.AuthenticateResponse.t()} | {:error, WorkOS.Error.error()} + def authenticate_with_refresh_token(client, params \\ %{}, opts \\ []) do + params = + params + |> WorkOS.Client.merge_defaults(%{"grant_type" => "refresh_token"}) + |> WorkOS.Client.put_inferred("client_id", client.client_id) + |> WorkOS.Client.put_inferred("client_secret", client.api_key) + + with {:ok, body} <- + WorkOS.Client.request(client, :post, "/user_management/authenticate", params, opts) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.AuthenticateResponse.from_map/1)} + end end @doc """ - Creates a user. - - Parameter options: - - * `:email` - The email address of the user. (required) - * `:password` - The password to set for the user. - * `:password_hash` - The hashed password to set for the user. Mutually exclusive with `password`. - * `:password_hash_type` - The algorithm originally used to hash the password. Valid values are `bcrypt`, `scrypt`, `firebase-scrypt`, `ssha`, `pbkdf2`, and `argon2`. - * `:first_name` - The user's first name. - * `:last_name` - The user's last name. - * `:email_verified` - Whether the user's email address was previously verified. - * `:external_id` - The external identifier of the user. - * `:metadata` - Object containing metadata key/value pairs associated with the user. - - """ - @spec create_user(map()) :: WorkOS.Client.response(User.t()) - @spec create_user(WorkOS.Client.t(), map()) :: - WorkOS.Client.response(User.t()) - def create_user(client \\ WorkOS.client(), opts) when is_map_key(opts, :email) do - body = - Map.take( - opts, - [ - :email, - :password, - :password_hash, - :password_hash_type, - :first_name, - :last_name, - :email_verified, - :external_id, - :metadata - ] - ) - - WorkOS.Client.post(client, User, "/user_management/users", body) - end - - @doc """ - Updates a user. - - Parameter options: - - * `:first_name` - The user's first name. - * `:last_name` - The user's last name. - * `:email` - The user's email address. Changing a user's email will set `email_verified` to false. - * `:email_verified` - Whether the user's email address was previously verified. - * `:password` - The password to set for the user. - * `:password_hash` - The hashed password to set for the user. Mutually exclusive with `password`. - * `:password_hash_type` - The algorithm originally used to hash the password. Valid values are `bcrypt`, `scrypt`, `firebase-scrypt`, `ssha`, `pbkdf2`, and `argon2`. - * `:external_id` - The external identifier of the user. - * `:metadata` - Object containing metadata key/value pairs associated with the user. - - """ - @spec update_user(String.t(), map()) :: WorkOS.Client.response(User.t()) - @spec update_user(WorkOS.Client.t(), String.t(), map()) :: - WorkOS.Client.response(User.t()) - def update_user(client \\ WorkOS.client(), user_id, opts) do - body = - Map.take( - opts, - [ - :first_name, - :last_name, - :email, - :email_verified, - :password, - :password_hash, - :password_hash_type, - :external_id, - :metadata - ] - ) - - WorkOS.Client.put(client, User, "/user_management/users/#{user_id}", body) - end - - @doc """ - Deletes a user. - """ - @spec delete_user(String.t()) :: WorkOS.Client.response(nil) - @spec delete_user(WorkOS.Client.t(), String.t()) :: WorkOS.Client.response(nil) - def delete_user(client \\ WorkOS.client(), user_id) do - WorkOS.Client.delete(client, Empty, "/user_management/users/:id", %{}, - opts: [ - path_params: [id: user_id] - ] - ) + Authenticate with magic auth + + Authenticate + + Authenticate a user with a specified [authentication method](https://workos.com/docs/reference/authkit/authentication). + + Sets `grant_type` (`"urn:workos:oauth:grant-type:magic-auth:code"`) automatically. + + Reads `client_id`/`client_secret` from the client configuration unless passed explicitly. + + ## Parameters + + * `params` — request body map. Required: `:code`, `:email`. Optional: `:invitation_token`, `:ip_address`, `:device_id`, `:user_agent`, `:radar_auth_attempt_id`. + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec authenticate_with_magic_auth(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.AuthenticateResponse.t()} | {:error, WorkOS.Error.error()} + def authenticate_with_magic_auth(client, params \\ %{}, opts \\ []) do + params = + params + |> WorkOS.Client.merge_defaults(%{ + "grant_type" => "urn:workos:oauth:grant-type:magic-auth:code" + }) + |> WorkOS.Client.put_inferred("client_id", client.client_id) + |> WorkOS.Client.put_inferred("client_secret", client.api_key) + + with {:ok, body} <- + WorkOS.Client.request(client, :post, "/user_management/authenticate", params, opts) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.AuthenticateResponse.from_map/1)} + end end @doc """ - Authenticates a user with password. + Authenticate with email verification + + Authenticate - Parameter options: + Authenticate a user with a specified [authentication method](https://workos.com/docs/reference/authkit/authentication). - * `:email` - The email address of the user. (required) - * `:password` - The password of the user. (required) - * `:ip_address` - The IP address of the request from the user who is attempting to authenticate. - * `:user_agent` - The user agent of the request from the user who is attempting to authenticate. This should be the value of the User-Agent header. + Sets `grant_type` (`"urn:workos:oauth:grant-type:email-verification:code"`) automatically. + Reads `client_id`/`client_secret` from the client configuration unless passed explicitly. + + ## Parameters + + * `params` — request body map. Required: `:code`, `:pending_authentication_token`. Optional: `:ip_address`, `:device_id`, `:user_agent`. + * `opts` — per-request options (see `WorkOS.Client.request/5`) """ - @spec authenticate_with_password(map()) :: - WorkOS.Client.response(Authentication.t()) - @spec authenticate_with_password(WorkOS.Client.t(), map()) :: - WorkOS.Client.response(Authentication.t()) - def authenticate_with_password(client \\ WorkOS.client(), opts) - when is_map_key(opts, :email) and - is_map_key(opts, :password) do - WorkOS.Client.post( - client, - Authentication, - "/user_management/authenticate", - %{ - client_id: WorkOS.client_id(client), - client_secret: WorkOS.api_key(client), - grant_type: "password", - email: opts[:email], - password: opts[:password], - ip_address: opts[:ip_address], - user_agent: opts[:user_agent] - } - ) + @spec authenticate_with_email_verification(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.AuthenticateResponse.t()} | {:error, WorkOS.Error.error()} + def authenticate_with_email_verification(client, params \\ %{}, opts \\ []) do + params = + params + |> WorkOS.Client.merge_defaults(%{ + "grant_type" => "urn:workos:oauth:grant-type:email-verification:code" + }) + |> WorkOS.Client.put_inferred("client_id", client.client_id) + |> WorkOS.Client.put_inferred("client_secret", client.api_key) + + with {:ok, body} <- + WorkOS.Client.request(client, :post, "/user_management/authenticate", params, opts) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.AuthenticateResponse.from_map/1)} + end end @doc """ - Authenticates an OAuth or SSO User. + Authenticate with totp + + Authenticate - Parameter options: + Authenticate a user with a specified [authentication method](https://workos.com/docs/reference/authkit/authentication). - * `:code` - The authorization value which was passed back as a query parameter in the callback to the Redirect URI. (required) - * `:ip_address` - The IP address of the request from the user who is attempting to authenticate. - * `:user_agent` - The user agent of the request from the user who is attempting to authenticate. This should be the value of the User-Agent header. + Sets `grant_type` (`"urn:workos:oauth:grant-type:mfa-totp"`) automatically. + Reads `client_id`/`client_secret` from the client configuration unless passed explicitly. + + ## Parameters + + * `params` — request body map. Required: `:code`, `:pending_authentication_token`, `:authentication_challenge_id`. Optional: `:ip_address`, `:device_id`, `:user_agent`. + * `opts` — per-request options (see `WorkOS.Client.request/5`) """ - @spec authenticate_with_code(map()) :: - WorkOS.Client.response(Authentication.t()) - @spec authenticate_with_code(WorkOS.Client.t(), map()) :: - WorkOS.Client.response(Authentication.t()) - def authenticate_with_code(client \\ WorkOS.client(), opts) - when is_map_key(opts, :code) do - WorkOS.Client.post( - client, - Authentication, - "/user_management/authenticate", - %{ - client_id: WorkOS.client_id(client), - client_secret: WorkOS.api_key(client), - grant_type: "authorization_code", - code: opts[:code], - ip_address: opts[:ip_address], - user_agent: opts[:user_agent] - } - ) + @spec authenticate_with_totp(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.AuthenticateResponse.t()} | {:error, WorkOS.Error.error()} + def authenticate_with_totp(client, params \\ %{}, opts \\ []) do + params = + params + |> WorkOS.Client.merge_defaults(%{"grant_type" => "urn:workos:oauth:grant-type:mfa-totp"}) + |> WorkOS.Client.put_inferred("client_id", client.client_id) + |> WorkOS.Client.put_inferred("client_secret", client.api_key) + + with {:ok, body} <- + WorkOS.Client.request(client, :post, "/user_management/authenticate", params, opts) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.AuthenticateResponse.from_map/1)} + end end @doc """ - Authenticates with Magic Auth. + Authenticate with organization selection - Parameter options: + Authenticate - * `:code` - The one-time code that was emailed to the user. (required) - * `:email` - The email the User who will be authenticated. (required) - * `:link_authorization_code` - An authorization code used in a previous authenticate request that resulted in an existing user error response. - * `:ip_address` - The IP address of the request from the user who is attempting to authenticate. - * `:user_agent` - The user agent of the request from the user who is attempting to authenticate. This should be the value of the User-Agent header. + Authenticate a user with a specified [authentication method](https://workos.com/docs/reference/authkit/authentication). + Sets `grant_type` (`"urn:workos:oauth:grant-type:organization-selection"`) automatically. + + Reads `client_id`/`client_secret` from the client configuration unless passed explicitly. + + ## Parameters + + * `params` — request body map. Required: `:pending_authentication_token`, `:organization_id`. Optional: `:ip_address`, `:device_id`, `:user_agent`. + * `opts` — per-request options (see `WorkOS.Client.request/5`) """ - @spec authenticate_with_magic_auth(map()) :: - WorkOS.Client.response(Authentication.t()) - @spec authenticate_with_magic_auth(WorkOS.Client.t(), map()) :: - WorkOS.Client.response(Authentication.t()) - def authenticate_with_magic_auth(client \\ WorkOS.client(), opts) - when is_map_key(opts, :code) and - is_map_key(opts, :email) do - WorkOS.Client.post( - client, - Authentication, - "/user_management/authenticate", - %{ - client_id: WorkOS.client_id(client), - client_secret: WorkOS.api_key(client), - grant_type: "urn:workos:oauth:grant-type:magic-auth:code", - code: opts[:code], - email: opts[:email], - link_authorization_code: opts[:link_authorization_code], - ip_address: opts[:ip_address], - user_agent: opts[:user_agent] - } - ) + @spec authenticate_with_organization_selection(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.AuthenticateResponse.t()} | {:error, WorkOS.Error.error()} + def authenticate_with_organization_selection(client, params \\ %{}, opts \\ []) do + params = + params + |> WorkOS.Client.merge_defaults(%{ + "grant_type" => "urn:workos:oauth:grant-type:organization-selection" + }) + |> WorkOS.Client.put_inferred("client_id", client.client_id) + |> WorkOS.Client.put_inferred("client_secret", client.api_key) + + with {:ok, body} <- + WorkOS.Client.request(client, :post, "/user_management/authenticate", params, opts) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.AuthenticateResponse.from_map/1)} + end end @doc """ - Authenticates with Email Verification Code + Authenticate with device code - Parameter options: + Authenticate - * `:code` - The one-time code that was emailed to the user. (required) - * `:pending_authentication_code` - The pending_authentication_token returned from an authentication attempt due to an unverified email address. (required) - * `:ip_address` - The IP address of the request from the user who is attempting to authenticate. - * `:user_agent` - The user agent of the request from the user who is attempting to authenticate. This should be the value of the User-Agent header. + Authenticate a user with a specified [authentication method](https://workos.com/docs/reference/authkit/authentication). + Sets `grant_type` (`"urn:ietf:params:oauth:grant-type:device_code"`) automatically. + + Reads `client_id` from the client configuration unless passed explicitly. + + ## Parameters + + * `params` — request body map. Required: `:device_code`. Optional: `:ip_address`, `:device_id`, `:user_agent`. + * `opts` — per-request options (see `WorkOS.Client.request/5`) """ - @spec authenticate_with_email_verification(map()) :: - WorkOS.Client.response(Authentication.t()) - @spec authenticate_with_email_verification(WorkOS.Client.t(), map()) :: - WorkOS.Client.response(Authentication.t()) - def authenticate_with_email_verification(client \\ WorkOS.client(), opts) - when is_map_key(opts, :code) and - is_map_key(opts, :pending_authentication_code) do - WorkOS.Client.post( - client, - Authentication, - "/user_management/authenticate", - %{ - client_id: WorkOS.client_id(client), - client_secret: WorkOS.api_key(client), - grant_type: "urn:workos:oauth:grant-type:email-verification:code", - code: opts[:code], - pending_authentication_code: opts[:pending_authentication_code], - ip_address: opts[:ip_address], - user_agent: opts[:user_agent] - } - ) + @spec authenticate_with_device_code(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.AuthenticateResponse.t()} | {:error, WorkOS.Error.error()} + def authenticate_with_device_code(client, params \\ %{}, opts \\ []) do + params = + params + |> WorkOS.Client.merge_defaults(%{ + "grant_type" => "urn:ietf:params:oauth:grant-type:device_code" + }) + |> WorkOS.Client.put_inferred("client_id", client.client_id) + + with {:ok, body} <- + WorkOS.Client.request(client, :post, "/user_management/authenticate", params, opts) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.AuthenticateResponse.from_map/1)} + end end @doc """ - Authenticates with MFA TOTP + Authenticate with radar email challenge + + Authenticate + + Authenticate a user with a specified [authentication method](https://workos.com/docs/reference/authkit/authentication). - Parameter options: + Sets `grant_type` (`"urn:workos:oauth:grant-type:radar-email-challenge:code"`) automatically. - * `:code` - The time-based-one-time-password generated by the Factor that was challenged. (required) - * `:authentication_challenge_id` - The unique ID of the authentication Challenge created for the TOTP Factor for which the user is enrolled. (required) - * `:pending_authentication_code` - The token returned from a failed authentication attempt due to MFA challenge. (required) - * `:ip_address` - The IP address of the request from the user who is attempting to authenticate. - * `:user_agent` - The user agent of the request from the user who is attempting to authenticate. This should be the value of the User-Agent header. + Reads `client_id`/`client_secret` from the client configuration unless passed explicitly. + ## Parameters + + * `params` — request body map. Required: `:code`, `:radar_challenge_id`, `:pending_authentication_token`. Optional: `:ip_address`, `:device_id`, `:user_agent`. + * `opts` — per-request options (see `WorkOS.Client.request/5`) """ - @spec authenticate_with_totp(map()) :: - WorkOS.Client.response(Authentication.t()) - @spec authenticate_with_totp(WorkOS.Client.t(), map()) :: - WorkOS.Client.response(Authentication.t()) - def authenticate_with_totp(client \\ WorkOS.client(), opts) - when is_map_key(opts, :code) and - is_map_key(opts, :authentication_challenge_id) and - is_map_key(opts, :pending_authentication_code) do - WorkOS.Client.post( - client, - Authentication, - "/user_management/authenticate", - %{ - client_id: WorkOS.client_id(client), - client_secret: WorkOS.api_key(client), - grant_type: "urn:workos:oauth:grant-type:mfa-totp", - code: opts[:code], - authentication_challenge_id: opts[:authentication_challenge_id], - pending_authentication_code: opts[:pending_authentication_code], - ip_address: opts[:ip_address], - user_agent: opts[:user_agent] - } - ) + @spec authenticate_with_radar_email_challenge(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.AuthenticateResponse.t()} | {:error, WorkOS.Error.error()} + def authenticate_with_radar_email_challenge(client, params \\ %{}, opts \\ []) do + params = + params + |> WorkOS.Client.merge_defaults(%{ + "grant_type" => "urn:workos:oauth:grant-type:radar-email-challenge:code" + }) + |> WorkOS.Client.put_inferred("client_id", client.client_id) + |> WorkOS.Client.put_inferred("client_secret", client.api_key) + + with {:ok, body} <- + WorkOS.Client.request(client, :post, "/user_management/authenticate", params, opts) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.AuthenticateResponse.from_map/1)} + end end @doc """ - Authenticates with Selected Organization + Authenticate with radar sms challenge + + Authenticate + + Authenticate a user with a specified [authentication method](https://workos.com/docs/reference/authkit/authentication). - Parameter options: + Sets `grant_type` (`"urn:workos:oauth:grant-type:radar-sms-challenge:code"`) automatically. - * `:pending_authentication_code` - The token returned from a failed authentication attempt due to organization selection being required. (required) - * `:organization_id` - The Organization ID the user selected. (required) - * `:ip_address` - The IP address of the request from the user who is attempting to authenticate. - * `:user_agent` - The user agent of the request from the user who is attempting to authenticate. This should be the value of the User-Agent header. + Reads `client_id`/`client_secret` from the client configuration unless passed explicitly. + ## Parameters + + * `params` — request body map. Required: `:code`, `:verification_id`, `:phone_number`, `:pending_authentication_token`. Optional: `:ip_address`, `:device_id`, `:user_agent`. + * `opts` — per-request options (see `WorkOS.Client.request/5`) """ - @spec authenticate_with_selected_organization(map()) :: - WorkOS.Client.response(Authentication.t()) - @spec authenticate_with_selected_organization(WorkOS.Client.t(), map()) :: - WorkOS.Client.response(Authentication.t()) - def authenticate_with_selected_organization(client \\ WorkOS.client(), opts) - when is_map_key(opts, :pending_authentication_code) and - is_map_key(opts, :organization_id) do - WorkOS.Client.post( - client, - Authentication, - "/user_management/authenticate", - %{ - client_id: WorkOS.client_id(client), - client_secret: WorkOS.api_key(client), - grant_type: "urn:workos:oauth:grant-type:organization-selection", - pending_authentication_code: opts[:pending_authentication_code], - organization_id: opts[:organization_id], - ip_address: opts[:ip_address], - user_agent: opts[:user_agent] - } - ) + @spec authenticate_with_radar_sms_challenge(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.AuthenticateResponse.t()} | {:error, WorkOS.Error.error()} + def authenticate_with_radar_sms_challenge(client, params \\ %{}, opts \\ []) do + params = + params + |> WorkOS.Client.merge_defaults(%{ + "grant_type" => "urn:workos:oauth:grant-type:radar-sms-challenge:code" + }) + |> WorkOS.Client.put_inferred("client_id", client.client_id) + |> WorkOS.Client.put_inferred("client_secret", client.api_key) + + with {:ok, body} <- + WorkOS.Client.request(client, :post, "/user_management/authenticate", params, opts) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.AuthenticateResponse.from_map/1)} + end end @doc """ - Creates a one-time Magic Auth code. + Get an authorization URL + + Generates an OAuth 2.0 authorization URL to authenticate a user with AuthKit or SSO. + + Returns the fully-qualified redirect URL — no HTTP request is made. + + Sets `response_type` (`"code"`) automatically. - Parameter options: + Reads `client_id` from the client configuration unless passed explicitly. - * `:email` - The email address the one-time code will be sent to. (required) + ## Parameters + * `params` — query parameters: `:code_challenge_method`, `:code_challenge`, `:domain_hint`, `:connection_id`, `:provider_query_params`, `:provider_scopes`, `:invitation_token`, `:max_age`, `:screen_hint`, `:login_hint`, `:provider`, `:prompt`, `:state`, `:organization_id`, `:redirect_uri` """ - @spec send_magic_auth_code(String.t()) :: WorkOS.Client.response(SendMagicAuthCode.t()) - @spec send_magic_auth_code(WorkOS.Client.t(), String.t()) :: - WorkOS.Client.response(SendMagicAuthCode.t()) - def send_magic_auth_code(client \\ WorkOS.client(), email) do - case WorkOS.Client.post( - client, - Empty, - "/user_management/magic_auth/send", - %{ - email: email - } - ) do - {:ok, _} -> :ok - {:error, reason} -> {:error, reason} + @spec get_authorization_url(WorkOS.Client.t(), map()) :: String.t() + def get_authorization_url(client, params \\ %{}) do + params = + params + |> WorkOS.Client.merge_defaults(%{"response_type" => "code"}) + |> WorkOS.Client.put_inferred("client_id", client.client_id) + + WorkOS.Client.build_url(client, "/user_management/authorize", params) + end + + @doc """ + Get device authorization URL + + Initiates the CLI Auth flow by requesting a device code and verification URLs. This endpoint implements the OAuth 2.0 Device Authorization Flow ([RFC 8628](https://datatracker.ietf.org/doc/html/rfc8628)) and is designed for command-line applications or other devices with limited input capabilities. + + ## Parameters + + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec create_device(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.DeviceAuthorizationResponse.t()} | {:error, WorkOS.Error.error()} + def create_device(client, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request(client, :post, "/user_management/authorize/device", params, opts) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.DeviceAuthorizationResponse.from_map/1)} end end @doc """ - Enrolls a user in a new Factor. + Send a Radar SMS challenge - Parameter options: + Sends a one-time verification code over SMS to a user as part of a Radar challenge. Use the returned `verification_id` to authenticate the user with the `urn:workos:oauth:grant-type:radar-sms-challenge:code` grant type. - * `:type` - The type of the factor to enroll. Only option available is `totp`. (required) - * `:totp_issuer` - For `totp` factors. Typically your application or company name, this helps users distinguish between factors in authenticator apps. - * `:totp_user` - For `totp` factors. Used as the account name in authenticator apps. Defaults to the user's email. + ## Parameters + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) """ - @spec enroll_auth_factor(String.t(), map()) :: WorkOS.Client.response(EnrollAuthFactor.t()) - @spec enroll_auth_factor(WorkOS.Client.t(), String.t(), map()) :: - WorkOS.Client.response(EnrollAuthFactor.t()) - def enroll_auth_factor(client \\ WorkOS.client(), user_id, opts) when is_map_key(opts, :type) do - WorkOS.Client.post( - client, - EnrollAuthFactor, - "/user_management/users/:id/auth_factors", - %{ - type: opts[:type], - totp_issuer: opts[:totp_issuer], - totp_user: opts[:totp_user] - }, - opts: [ - path_params: [id: user_id] - ] - ) + @spec create_radar_challenge(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.SendRadarSmsChallengeResponse.t()} | {:error, WorkOS.Error.error()} + def create_radar_challenge(client, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request(client, :post, "/user_management/radar_challenges", params, opts) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.SendRadarSmsChallengeResponse.from_map/1)} + end end @doc """ - Lists all auth factors of a user. + Get Radar Challenge details + + Get the details of an existing Radar Challenge, including the OTP code. + + ## Parameters + + * `id` — The unique ID of the Radar Challenge. + * `opts` — per-request options (see `WorkOS.Client.request/5`) """ - @spec list_auth_factors(WorkOS.Client.t(), String.t()) :: - WorkOS.Client.response(WorkOS.List.t(AuthenticationFactor.t())) - def list_auth_factors(client \\ WorkOS.client(), user_id) do - WorkOS.Client.get( - client, - WorkOS.List.of(AuthenticationFactor), - "/user_management/users/:id/auth_factors", - opts: [ - path_params: [id: user_id] - ] - ) + @spec get_radar_challenge(WorkOS.Client.t(), String.t(), keyword()) :: + {:ok, WorkOS.RadarChallenge.t()} | {:error, WorkOS.Error.error()} + def get_radar_challenge(client, id, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :get, + "/user_management/radar_challenges/#{URI.encode(id, &URI.char_unreserved?/1)}", + %{}, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.RadarChallenge.from_map/1)} + end end @doc """ - Sends verification email. + Logout + + Logout a user from the current [session](https://workos.com/docs/reference/authkit/session). + + Returns the fully-qualified redirect URL — no HTTP request is made. + + ## Parameters + + * `params` — query parameters: `:session_id`, `:return_to` + """ + @spec get_logout_url(WorkOS.Client.t(), map()) :: String.t() + def get_logout_url(client, params \\ %{}) do + WorkOS.Client.build_url(client, "/user_management/sessions/logout", params) + end + + @doc """ + Revoke Session + + Revoke a [user session](https://workos.com/docs/reference/authkit/session). + + ## Parameters + + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec revoke_session(WorkOS.Client.t(), map(), keyword()) :: + {:ok, term()} | {:error, WorkOS.Error.error()} + def revoke_session(client, params \\ %{}, opts \\ []) do + WorkOS.Client.request(client, :post, "/user_management/sessions/revoke", params, opts) + end + + @doc """ + List CORS origins + + Lists the CORS origins for the current environment. + + ## Parameters + + * `params` — query parameters: `:before`, `:after_`, `:limit`, `:order` + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec list_cors_origins(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.Page.t(WorkOS.CORSOriginResponse.t())} | {:error, WorkOS.Error.error()} + def list_cors_origins(client, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request(client, :get, "/user_management/cors_origins", params, opts) do + fetch_next = fn cursor -> + list_cors_origins( + client, + WorkOS.Page.next_params(params, "after", cursor), + opts + ) + end + + {:ok, WorkOS.Page.from_map(body, "data", &WorkOS.CORSOriginResponse.from_map/1, fetch_next)} + end + end + + @doc """ + Create a CORS origin + + Creates a new CORS origin for the API key's application. CORS origins allow browser-based applications to make requests to the WorkOS API. + + ## Parameters + + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec create_cors_origin(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.CORSOriginResponse.t()} | {:error, WorkOS.Error.error()} + def create_cors_origin(client, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request(client, :post, "/user_management/cors_origins", params, opts) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.CORSOriginResponse.from_map/1)} + end + end + + @doc """ + Get an email verification code + + Get the details of an existing email verification code that can be used to send an email to a user for verification. + + ## Parameters + + * `id` — The ID of the email verification code. + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec get_email_verification(WorkOS.Client.t(), String.t(), keyword()) :: + {:ok, WorkOS.EmailVerification.t()} | {:error, WorkOS.Error.error()} + def get_email_verification(client, id, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :get, + "/user_management/email_verification/#{URI.encode(id, &URI.char_unreserved?/1)}", + %{}, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.EmailVerification.from_map/1)} + end + end + + @doc """ + Create a password reset token + + Creates a one-time token that can be used to reset a user's password. + + ## Parameters + + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec reset_password(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.PasswordReset.t()} | {:error, WorkOS.Error.error()} + def reset_password(client, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request(client, :post, "/user_management/password_reset", params, opts) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.PasswordReset.from_map/1)} + end + end + + @doc """ + Reset the password + + Sets a new password using the `token` query parameter from the link that the user received. Successfully resetting the password will verify a user's email, if it hasn't been verified yet. + + ## Parameters + + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec confirm_password_reset(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.ResetPasswordResponse.t()} | {:error, WorkOS.Error.error()} + def confirm_password_reset(client, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :post, + "/user_management/password_reset/confirm", + params, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.ResetPasswordResponse.from_map/1)} + end + end + + @doc """ + Get a password reset token + + Get the details of an existing password reset token that can be used to reset a user's password. + + ## Parameters + + * `id` — The ID of the password reset token. + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec get_password_reset(WorkOS.Client.t(), String.t(), keyword()) :: + {:ok, WorkOS.PasswordReset.t()} | {:error, WorkOS.Error.error()} + def get_password_reset(client, id, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :get, + "/user_management/password_reset/#{URI.encode(id, &URI.char_unreserved?/1)}", + %{}, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.PasswordReset.from_map/1)} + end + end + + @doc """ + List users + + Get a list of all of your existing users matching the criteria specified. + + ## Parameters + + * `params` — query parameters: `:before`, `:after_`, `:limit`, `:order`, `:organization` (deprecated), `:organization_id`, `:email` + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec list_users(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.Page.t(WorkOS.UserList.t())} | {:error, WorkOS.Error.error()} + def list_users(client, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request(client, :get, "/user_management/users", params, opts) do + fetch_next = fn cursor -> + list_users( + client, + WorkOS.Page.next_params(params, "after", cursor), + opts + ) + end + + {:ok, WorkOS.Page.from_map(body, "data", &WorkOS.UserList.from_map/1, fetch_next)} + end + end + + @doc """ + Create a user + + Create a new user in the current environment. + + ## Parameters + + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) """ - @spec send_verification_email(String.t()) :: WorkOS.Client.response(SendVerificationEmail.t()) - @spec send_verification_email(WorkOS.Client.t(), String.t()) :: - WorkOS.Client.response(SendVerificationEmail.t()) - def send_verification_email(client \\ WorkOS.client(), user_id) do - WorkOS.Client.post( + @spec create_user(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.UserCreateResponse.t()} | {:error, WorkOS.Error.error()} + def create_user(client, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request(client, :post, "/user_management/users", params, opts) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.UserCreateResponse.from_map/1)} + end + end + + @doc """ + Get a user by external ID + + Get the details of an existing user by an [external identifier](https://workos.com/docs/authkit/metadata/external-identifiers). + + ## Parameters + + * `external_id` — The external ID of the user. + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec get_user_by_external_id(WorkOS.Client.t(), String.t(), keyword()) :: + {:ok, WorkOS.User.t()} | {:error, WorkOS.Error.error()} + def get_user_by_external_id(client, external_id, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :get, + "/user_management/users/external_id/#{URI.encode(external_id, &URI.char_unreserved?/1)}", + %{}, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.User.from_map/1)} + end + end + + @doc """ + Get a user + + Get the details of an existing user. + + ## Parameters + + * `id` — The unique ID of the user. + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec get_user(WorkOS.Client.t(), String.t(), keyword()) :: + {:ok, WorkOS.User.t()} | {:error, WorkOS.Error.error()} + def get_user(client, id, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :get, + "/user_management/users/#{URI.encode(id, &URI.char_unreserved?/1)}", + %{}, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.User.from_map/1)} + end + end + + @doc """ + Update a user + + Updates properties of a user. The omitted properties will be left unchanged. + + ## Parameters + + * `id` — The unique ID of the user. + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec update_user(WorkOS.Client.t(), String.t(), map(), keyword()) :: + {:ok, WorkOS.User.t()} | {:error, WorkOS.Error.error()} + def update_user(client, id, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :put, + "/user_management/users/#{URI.encode(id, &URI.char_unreserved?/1)}", + params, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.User.from_map/1)} + end + end + + @doc """ + Delete a user + + Permanently deletes a user in the current environment. It cannot be undone. + + ## Parameters + + * `id` — The unique ID of the user. + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec delete_user(WorkOS.Client.t(), String.t(), keyword()) :: + {:ok, term()} | {:error, WorkOS.Error.error()} + def delete_user(client, id, opts \\ []) do + WorkOS.Client.request( client, - SendVerificationEmail, - "/user_management/users/:id/email_verification/send", + :delete, + "/user_management/users/#{URI.encode(id, &URI.char_unreserved?/1)}", %{}, - opts: [ - path_params: [id: user_id] - ] + opts ) end @doc """ - Verifies user email. + Confirm email change - Parameter options: + Confirms an email change using the one-time code received by the user. - * `:code` - The one-time code emailed to the user. (required) + ## Parameters + * `id` — The unique ID of the user. + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) """ - @spec verify_email(String.t(), map()) :: WorkOS.Client.response(VerifyEmail.t()) - @spec verify_email(WorkOS.Client.t(), String.t(), map()) :: - WorkOS.Client.response(VerifyEmail.t()) - def verify_email(client \\ WorkOS.client(), user_id, opts) when is_map_key(opts, :code) do - WorkOS.Client.post( - client, - VerifyEmail, - "/user_management/users/:id/email_verification/confirm", - %{ - code: opts[:code] - }, - opts: [ - path_params: [id: user_id] - ] - ) + @spec confirm_email_change(WorkOS.Client.t(), String.t(), map(), keyword()) :: + {:ok, WorkOS.EmailChangeConfirmation.t()} | {:error, WorkOS.Error.error()} + def confirm_email_change(client, id, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :post, + "/user_management/users/#{URI.encode(id, &URI.char_unreserved?/1)}/email_change/confirm", + params, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.EmailChangeConfirmation.from_map/1)} + end end @doc """ - Sends a password reset email to a user. + Send email change code - Parameter options: + Sends an email that contains a one-time code used to change a user's email address. - * `:email` - The email of the user that wishes to reset their password. (required) - * `:password_reset_url` - The password to set for the user. (required) + ## Parameters + * `id` — The unique ID of the user. + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) """ - @spec send_password_reset_email(map()) :: WorkOS.Client.response(OrganizationMembership.t()) - @spec send_password_reset_email(WorkOS.Client.t(), map()) :: - WorkOS.Client.response(OrganizationMembership.t()) - def send_password_reset_email(client \\ WorkOS.client(), opts) - when is_map_key(opts, :email) and is_map_key(opts, :password_reset_url) do - case WorkOS.Client.post(client, Empty, "/user_management/password_reset/send", %{ - email: opts[:email], - password_reset_url: opts[:password_reset_url] - }) do - {:ok, _} -> :ok - {:error, reason} -> {:error, reason} + @spec send_email_change(WorkOS.Client.t(), String.t(), map(), keyword()) :: + {:ok, WorkOS.EmailChange.t()} | {:error, WorkOS.Error.error()} + def send_email_change(client, id, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :post, + "/user_management/users/#{URI.encode(id, &URI.char_unreserved?/1)}/email_change/send", + params, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.EmailChange.from_map/1)} end end @doc """ - Resets password. + Verify email - Parameter options: + Verifies an email address using the one-time code received by the user. - * `:token` - The reset token emailed to the user. (required) - * `:new_password` - The new password to be set for the user. (required) + ## Parameters + * `id` — The ID of the user. + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) """ - @spec reset_password(map()) :: WorkOS.Client.response(ResetPassword.t()) - @spec reset_password(WorkOS.Client.t(), map()) :: - WorkOS.Client.response(ResetPassword.t()) - def reset_password(client \\ WorkOS.client(), opts) - when is_map_key(opts, :token) and is_map_key(opts, :new_password) do - WorkOS.Client.post( - client, - ResetPassword, - "/user_management/password_reset/confirm", - %{ - token: opts[:token], - new_password: opts[:new_password] - } - ) + @spec verify_email(WorkOS.Client.t(), String.t(), map(), keyword()) :: + {:ok, WorkOS.VerifyEmailResponse.t()} | {:error, WorkOS.Error.error()} + def verify_email(client, id, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :post, + "/user_management/users/#{URI.encode(id, &URI.char_unreserved?/1)}/email_verification/confirm", + params, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.VerifyEmailResponse.from_map/1)} + end end @doc """ - Gets an organization membership. + Send verification email + + Sends an email that contains a one-time code used to verify a user's email address. + + ## Parameters + + * `id` — The ID of the user. + * `opts` — per-request options (see `WorkOS.Client.request/5`) """ - @spec get_organization_membership(String.t()) :: - WorkOS.Client.response(OrganizationMembership.t()) - @spec get_organization_membership(WorkOS.Client.t(), String.t()) :: - WorkOS.Client.response(OrganizationMembership.t()) - def get_organization_membership(client \\ WorkOS.client(), organization_membership_id) do - WorkOS.Client.get( - client, - OrganizationMembership, - "/user_management/organization_memberships/:id", - opts: [ - path_params: [id: organization_membership_id] - ] - ) + @spec send_verification_email(WorkOS.Client.t(), String.t(), keyword()) :: + {:ok, WorkOS.SendVerificationEmailResponse.t()} | {:error, WorkOS.Error.error()} + def send_verification_email(client, id, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :post, + "/user_management/users/#{URI.encode(id, &URI.char_unreserved?/1)}/email_verification/send", + %{}, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.SendVerificationEmailResponse.from_map/1)} + end end @doc """ - Lists all organization memberships. + Get user identities - Parameter options: + Get a list of identities associated with the user. A user can have multiple associated identities after going through [identity linking](https://workos.com/docs/authkit/identity-linking). Currently only OAuth identities are supported. More provider types may be added in the future. - * `:user_id` - The ID of the User. - * `:organization_id` - The ID of the Organization to which the user belongs to. - * `:limit` - Maximum number of records to return. Accepts values between 1 and 100. Default is 10. - * `:after` - Pagination cursor to receive records after a provided event ID. - * `:before` - An object ID that defines your place in the list. When the ID is not present, you are at the end of the list. - * `:order` - Order the results by the creation time. Supported values are "asc" and "desc" for showing older and newer records first respectively. + ## Parameters + * `id` — The unique ID of the user. + * `opts` — per-request options (see `WorkOS.Client.request/5`) """ - @spec list_organization_memberships(WorkOS.Client.t(), map()) :: - WorkOS.Client.response(WorkOS.List.t(OrganizationMembership.t())) - def list_organization_memberships(client, opts) do - WorkOS.Client.get( - client, - WorkOS.List.of(OrganizationMembership), - "/user_management/organization_memberships", - query: [ - user_id: opts[:user_id], - organization_id: opts[:organization_id], - limit: opts[:limit], - after: opts[:after], - before: opts[:before], - order: opts[:order] - ] - ) + @spec get_user_identities(WorkOS.Client.t(), String.t(), keyword()) :: + {:ok, [WorkOS.UserIdentitiesGetItem.t()]} | {:error, WorkOS.Error.error()} + def get_user_identities(client, id, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :get, + "/user_management/users/#{URI.encode(id, &URI.char_unreserved?/1)}/identities", + %{}, + opts + ) do + {:ok, WorkOS.Cast.list(body, &WorkOS.UserIdentitiesGetItem.from_map/1)} + end end - @spec list_organization_memberships(map()) :: - WorkOS.Client.response(WorkOS.List.t(OrganizationMembership.t())) - def list_organization_memberships(opts \\ %{}) do - WorkOS.Client.get( - WorkOS.client(), - WorkOS.List.of(OrganizationMembership), - "/user_management/organization_memberships", - query: [ - user_id: opts[:user_id], - organization_id: opts[:organization_id], - limit: opts[:limit], - after: opts[:after], - before: opts[:before], - order: opts[:order] - ] - ) + @doc """ + List sessions + + Get a list of all active sessions for a specific user. + + ## Parameters + + * `id` — The ID of the user. + * `params` — query parameters: `:before`, `:after_`, `:limit`, `:order` + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec list_sessions(WorkOS.Client.t(), String.t(), map(), keyword()) :: + {:ok, WorkOS.Page.t(WorkOS.UserSessionsListItem.t())} | {:error, WorkOS.Error.error()} + def list_sessions(client, id, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :get, + "/user_management/users/#{URI.encode(id, &URI.char_unreserved?/1)}/sessions", + params, + opts + ) do + fetch_next = fn cursor -> + list_sessions( + client, + id, + WorkOS.Page.next_params(params, "after", cursor), + opts + ) + end + + {:ok, + WorkOS.Page.from_map(body, "data", &WorkOS.UserSessionsListItem.from_map/1, fetch_next)} + end end @doc """ - Creates an organization membership. + List invitations - Parameter options: + Get a list of all of invitations matching the criteria specified. - * `:user_id` - The ID of the User. (required) - * `:organization_id` - The ID of the Organization to which the user belongs to. (required) + ## Parameters + * `params` — query parameters: `:before`, `:after_`, `:limit`, `:order`, `:organization_id`, `:email` + * `opts` — per-request options (see `WorkOS.Client.request/5`) """ - @spec create_organization_membership(map()) :: - WorkOS.Client.response(OrganizationMembership.t()) - @spec create_organization_membership(WorkOS.Client.t(), map()) :: - WorkOS.Client.response(OrganizationMembership.t()) - def create_organization_membership(client \\ WorkOS.client(), opts) - when is_map_key(opts, :user_id) and is_map_key(opts, :organization_id) do - WorkOS.Client.post( - client, - OrganizationMembership, - "/user_management/organization_memberships", - %{ - user_id: opts[:user_id], - organization_id: opts[:organization_id] - } - ) + @spec list_invitations(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.Page.t(WorkOS.UserInviteList.t())} | {:error, WorkOS.Error.error()} + def list_invitations(client, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request(client, :get, "/user_management/invitations", params, opts) do + fetch_next = fn cursor -> + list_invitations( + client, + WorkOS.Page.next_params(params, "after", cursor), + opts + ) + end + + {:ok, WorkOS.Page.from_map(body, "data", &WorkOS.UserInviteList.from_map/1, fetch_next)} + end end @doc """ - Deletes an organization membership. + Send an invitation + + Sends an invitation email to the recipient. + + ## Parameters + + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) """ - @spec delete_organization_membership(String.t()) :: WorkOS.Client.response(nil) - @spec delete_organization_membership(WorkOS.Client.t(), String.t()) :: - WorkOS.Client.response(nil) - def delete_organization_membership(client \\ WorkOS.client(), organization_membership_id) do - WorkOS.Client.delete(client, Empty, "/user_management/organization_memberships/:id", %{}, - opts: [ - path_params: [id: organization_membership_id] - ] - ) + @spec send_invitation(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.UserInvite.t()} | {:error, WorkOS.Error.error()} + def send_invitation(client, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request(client, :post, "/user_management/invitations", params, opts) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.UserInvite.from_map/1)} + end + end + + @doc """ + Find an invitation by token + + Retrieve an existing invitation using the token. + + ## Parameters + + * `token` — The token used to accept the invitation. + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec find_invitation_by_token(WorkOS.Client.t(), String.t(), keyword()) :: + {:ok, WorkOS.UserInvite.t()} | {:error, WorkOS.Error.error()} + def find_invitation_by_token(client, token, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :get, + "/user_management/invitations/by_token/#{URI.encode(token, &URI.char_unreserved?/1)}", + %{}, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.UserInvite.from_map/1)} + end end @doc """ - Gets an invitation. + Get an invitation + + Get the details of an existing invitation. + + ## Parameters + + * `id` — The unique ID of the invitation. + * `opts` — per-request options (see `WorkOS.Client.request/5`) """ - @spec get_invitation(String.t()) :: WorkOS.Client.response(Invitation.t()) - @spec get_invitation(WorkOS.Client.t(), String.t()) :: WorkOS.Client.response(Invitation.t()) - def get_invitation(client \\ WorkOS.client(), invitation_id) do - WorkOS.Client.get(client, Invitation, "/user_management/invitations/:id", - opts: [ - path_params: [id: invitation_id] - ] - ) + @spec get_invitation(WorkOS.Client.t(), String.t(), keyword()) :: + {:ok, WorkOS.UserInvite.t()} | {:error, WorkOS.Error.error()} + def get_invitation(client, id, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :get, + "/user_management/invitations/#{URI.encode(id, &URI.char_unreserved?/1)}", + %{}, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.UserInvite.from_map/1)} + end end @doc """ - Lists all invitations. + Accept an invitation - Parameter options: + Accepts an invitation and, if linked to an organization, activates the user's membership in that organization. - * `:email` - The email address of a recipient. - * `:organization_id` - The ID of the Organization that the recipient was invited to join. - * `:limit` - Maximum number of records to return. Accepts values between 1 and 100. Default is 10. - * `:after` - Pagination cursor to receive records after a provided event ID. - * `:before` - An object ID that defines your place in the list. When the ID is not present, you are at the end of the list. - * `:order` - Order the results by the creation time. Supported values are "asc" and "desc" for showing older and newer records first respectively. + ## Parameters + * `id` — The unique ID of the invitation. + * `opts` — per-request options (see `WorkOS.Client.request/5`) """ - @spec list_invitations(WorkOS.Client.t(), map()) :: - WorkOS.Client.response(WorkOS.List.t(Invitation.t())) - def list_invitations(client, opts) do - WorkOS.Client.get(client, WorkOS.List.of(Invitation), "/user_management/invitations", - query: [ - email: opts[:email], - organization_id: opts[:organization_id], - limit: opts[:limit], - after: opts[:after], - before: opts[:before], - order: opts[:order] - ] - ) + @spec accept_invitation(WorkOS.Client.t(), String.t(), keyword()) :: + {:ok, WorkOS.Invitation.t()} | {:error, WorkOS.Error.error()} + def accept_invitation(client, id, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :post, + "/user_management/invitations/#{URI.encode(id, &URI.char_unreserved?/1)}/accept", + %{}, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.Invitation.from_map/1)} + end end - @spec list_invitations(map()) :: - WorkOS.Client.response(WorkOS.List.t(Invitation.t())) - def list_invitations(opts \\ %{}) do - WorkOS.Client.get(WorkOS.client(), WorkOS.List.of(Invitation), "/user_management/invitations", - query: [ - email: opts[:email], - organization_id: opts[:organization_id], - limit: opts[:limit], - after: opts[:after], - before: opts[:before], - order: opts[:order] - ] - ) + @doc """ + Resend an invitation + + Resends an invitation email to the recipient. The invitation must be in a pending state. + + ## Parameters + + * `id` — The unique ID of the invitation. + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec resend_invitation(WorkOS.Client.t(), String.t(), map(), keyword()) :: + {:ok, WorkOS.UserInvite.t()} | {:error, WorkOS.Error.error()} + def resend_invitation(client, id, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :post, + "/user_management/invitations/#{URI.encode(id, &URI.char_unreserved?/1)}/resend", + params, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.UserInvite.from_map/1)} + end + end + + @doc """ + Revoke an invitation + + Revokes an existing invitation. + + ## Parameters + + * `id` — The unique ID of the invitation. + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec revoke_invitation(WorkOS.Client.t(), String.t(), keyword()) :: + {:ok, WorkOS.Invitation.t()} | {:error, WorkOS.Error.error()} + def revoke_invitation(client, id, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :post, + "/user_management/invitations/#{URI.encode(id, &URI.char_unreserved?/1)}/revoke", + %{}, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.Invitation.from_map/1)} + end + end + + @doc """ + Get JWT template + + Get the JWT template for the current environment. + + ## Parameters + + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec list_jwt_template(WorkOS.Client.t(), keyword()) :: + {:ok, WorkOS.JWTTemplateResponse.t()} | {:error, WorkOS.Error.error()} + def list_jwt_template(client, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request(client, :get, "/user_management/jwt_template", %{}, opts) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.JWTTemplateResponse.from_map/1)} + end end @doc """ - Sends an invitation. + Update JWT template - Parameter options: + Update the JWT template for the current environment. - * `:email` - The email address of the recipient. (required) - * `:organization_id` - The ID of the Organization to which the recipient is being invited. - * `:expires_in_days` - The number of days the invitations will be valid for. - * `:inviter_user_id` - The ID of the User sending the invitation. + ## Parameters + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) """ - @spec send_invitation(map()) :: WorkOS.Client.response(Invitation.t()) - @spec send_invitation(WorkOS.Client.t(), map()) :: - WorkOS.Client.response(Invitation.t()) - def send_invitation(client \\ WorkOS.client(), opts) when is_map_key(opts, :email) do - WorkOS.Client.post( + @spec update_jwt_template(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.JWTTemplateResponse.t()} | {:error, WorkOS.Error.error()} + def update_jwt_template(client, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request(client, :put, "/user_management/jwt_template", params, opts) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.JWTTemplateResponse.from_map/1)} + end + end + + @doc """ + Create a Magic Auth code + + Creates a one-time authentication code that can be sent to the user's email address. The code expires in 10 minutes. To verify the code, [authenticate the user with Magic Auth](https://workos.com/docs/reference/authkit/authentication/magic-auth). + + ## Parameters + + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec create_magic_auth(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.MagicAuthSendMagicAuthCodeAndReturnResponse.t()} + | {:error, WorkOS.Error.error()} + def create_magic_auth(client, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request(client, :post, "/user_management/magic_auth", params, opts) do + {:ok, + WorkOS.Cast.nested(body, &WorkOS.MagicAuthSendMagicAuthCodeAndReturnResponse.from_map/1)} + end + end + + @doc """ + Get Magic Auth code details + + Get the details of an existing [Magic Auth](https://workos.com/docs/reference/authkit/magic-auth) code that can be used to send an email to a user for authentication. + + ## Parameters + + * `id` — The unique ID of the Magic Auth code. + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec get_magic_auth(WorkOS.Client.t(), String.t(), keyword()) :: + {:ok, WorkOS.MagicAuth.t()} | {:error, WorkOS.Error.error()} + def get_magic_auth(client, id, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :get, + "/user_management/magic_auth/#{URI.encode(id, &URI.char_unreserved?/1)}", + %{}, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.MagicAuth.from_map/1)} + end + end + + @doc """ + List redirect URIs + + Lists the redirect URIs for an environment. + + ## Parameters + + * `params` — query parameters: `:before`, `:after_`, `:limit`, `:order` + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec list_redirect_uris(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.Page.t(WorkOS.RedirectUri.t())} | {:error, WorkOS.Error.error()} + def list_redirect_uris(client, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request(client, :get, "/user_management/redirect_uris", params, opts) do + fetch_next = fn cursor -> + list_redirect_uris( + client, + WorkOS.Page.next_params(params, "after", cursor), + opts + ) + end + + {:ok, WorkOS.Page.from_map(body, "data", &WorkOS.RedirectUri.from_map/1, fetch_next)} + end + end + + @doc """ + Create a redirect URI + + Creates a new redirect URI for an application. + + ## Parameters + + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec create_redirect_uri(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.RedirectUri.t()} | {:error, WorkOS.Error.error()} + def create_redirect_uri(client, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request(client, :post, "/user_management/redirect_uris", params, opts) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.RedirectUri.from_map/1)} + end + end + + @doc """ + Delete a redirect URI + + Deletes a redirect URI from an application. + + ## Parameters + + * `id` — The ID of the redirect URI to delete. + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec delete_redirect_uris(WorkOS.Client.t(), String.t(), keyword()) :: + {:ok, term()} | {:error, WorkOS.Error.error()} + def delete_redirect_uris(client, id, opts \\ []) do + WorkOS.Client.request( client, - Invitation, - "/user_management/invitations", - %{ - email: opts[:email], - organization_id: opts[:organization_id], - expires_in_days: opts[:expires_in_days], - inviter_user_id: opts[:inviter_user_id] - } + :delete, + "/user_management/redirect_uris/#{URI.encode(id, &URI.char_unreserved?/1)}", + %{}, + opts ) end @doc """ - Revokes an invitation. + List authorized applications + + Get a list of all Connect applications that the user has authorized. + + ## Parameters + + * `user_id` — The ID of the user. + * `params` — query parameters: `:before`, `:after_`, `:limit`, `:order` + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec list_user_authorized_applications(WorkOS.Client.t(), String.t(), map(), keyword()) :: + {:ok, WorkOS.Page.t(WorkOS.AuthorizedConnectApplicationList.t())} + | {:error, WorkOS.Error.error()} + def list_user_authorized_applications(client, user_id, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :get, + "/user_management/users/#{URI.encode(user_id, &URI.char_unreserved?/1)}/authorized_applications", + params, + opts + ) do + fetch_next = fn cursor -> + list_user_authorized_applications( + client, + user_id, + WorkOS.Page.next_params(params, "after", cursor), + opts + ) + end + + {:ok, + WorkOS.Page.from_map( + body, + "data", + &WorkOS.AuthorizedConnectApplicationList.from_map/1, + fetch_next + )} + end + end + + @doc """ + Delete an authorized application + + Delete an existing Authorized Connect Application. + + ## Parameters + + * `user_id` — The ID of the user. + * `application_id` — The ID or client ID of the application. + * `opts` — per-request options (see `WorkOS.Client.request/5`) """ - @spec revoke_invitation(String.t()) :: WorkOS.Client.response(Invitation.t()) - @spec revoke_invitation(WorkOS.Client.t(), String.t()) :: WorkOS.Client.response(Invitation.t()) - def revoke_invitation(client \\ WorkOS.client(), invitation_id) do - WorkOS.Client.post(client, Invitation, "/user_management/invitations/:id/revoke", %{}, - opts: [ - path_params: [id: invitation_id] - ] + @spec delete_user_authorized_application(WorkOS.Client.t(), String.t(), String.t(), keyword()) :: + {:ok, term()} | {:error, WorkOS.Error.error()} + def delete_user_authorized_application(client, user_id, application_id, opts \\ []) do + WorkOS.Client.request( + client, + :delete, + "/user_management/users/#{URI.encode(user_id, &URI.char_unreserved?/1)}/authorized_applications/#{URI.encode(application_id, &URI.char_unreserved?/1)}", + %{}, + opts ) end + + @doc """ + List API keys for a user + + Get a list of API keys owned by a specific user. + + ## Parameters + + * `user_id` — Unique identifier of the user. + * `params` — query parameters: `:before`, `:after_`, `:limit`, `:order`, `:organization_id` + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec list_user_api_keys(WorkOS.Client.t(), String.t(), map(), keyword()) :: + {:ok, WorkOS.Page.t(WorkOS.UserApiKeyList.t())} | {:error, WorkOS.Error.error()} + def list_user_api_keys(client, user_id, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :get, + "/user_management/users/#{URI.encode(user_id, &URI.char_unreserved?/1)}/api_keys", + params, + opts + ) do + fetch_next = fn cursor -> + list_user_api_keys( + client, + user_id, + WorkOS.Page.next_params(params, "after", cursor), + opts + ) + end + + {:ok, WorkOS.Page.from_map(body, "data", &WorkOS.UserApiKeyList.from_map/1, fetch_next)} + end + end + + @doc """ + Create an API key for a user + + Create a new API key owned by a user. The user must have an active membership in the specified organization. + + ## Parameters + + * `user_id` — Unique identifier of the user. + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec create_user_api_key(WorkOS.Client.t(), String.t(), map(), keyword()) :: + {:ok, WorkOS.UserApiKeyWithValue.t()} | {:error, WorkOS.Error.error()} + def create_user_api_key(client, user_id, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :post, + "/user_management/users/#{URI.encode(user_id, &URI.char_unreserved?/1)}/api_keys", + params, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.UserApiKeyWithValue.from_map/1)} + end + end end diff --git a/lib/workos/user_management/authentication.ex b/lib/workos/user_management/authentication.ex deleted file mode 100644 index c20e0204..00000000 --- a/lib/workos/user_management/authentication.ex +++ /dev/null @@ -1,43 +0,0 @@ -defmodule WorkOS.UserManagement.Authentication do - @moduledoc """ - WorkOS Authentication struct. - """ - - alias WorkOS.UserManagement.User - - @behaviour WorkOS.Castable - - @type t() :: %__MODULE__{ - user: User.t(), - organization_id: String.t() | nil, - access_token: String.t() | nil, - refresh_token: String.t() | nil, - impersonator: User.t() | nil, - authentication_method: String.t() - } - - @enforce_keys [ - :user, - :authentication_method - ] - defstruct [ - :user, - :organization_id, - :access_token, - :refresh_token, - :impersonator, - :authentication_method - ] - - @impl true - def cast(map) do - %__MODULE__{ - user: map["user"], - organization_id: map["organization_id"], - access_token: map["access_token"], - refresh_token: map["refresh_token"], - impersonator: map["impersonator"], - authentication_method: map["authentication_method"] - } - end -end diff --git a/lib/workos/user_management/email_verification/send_verification_email.ex b/lib/workos/user_management/email_verification/send_verification_email.ex deleted file mode 100644 index 625c451b..00000000 --- a/lib/workos/user_management/email_verification/send_verification_email.ex +++ /dev/null @@ -1,27 +0,0 @@ -defmodule WorkOS.UserManagement.EmailVerification.SendVerificationEmail do - @moduledoc """ - WorkOS Send Email struct. - """ - - alias WorkOS.UserManagement.User - - @behaviour WorkOS.Castable - - @type t() :: %__MODULE__{ - user: User.t() - } - - @enforce_keys [ - :user - ] - defstruct [ - :user - ] - - @impl true - def cast(map) do - %__MODULE__{ - user: map["user"] - } - end -end diff --git a/lib/workos/user_management/email_verification/verify_email.ex b/lib/workos/user_management/email_verification/verify_email.ex deleted file mode 100644 index 604a8e60..00000000 --- a/lib/workos/user_management/email_verification/verify_email.ex +++ /dev/null @@ -1,27 +0,0 @@ -defmodule WorkOS.UserManagement.EmailVerification.VerifyEmail do - @moduledoc """ - WorkOS Verify Email Code struct. - """ - - alias WorkOS.UserManagement.User - - @behaviour WorkOS.Castable - - @type t() :: %__MODULE__{ - user: User.t() - } - - @enforce_keys [ - :user - ] - defstruct [ - :user - ] - - @impl true - def cast(map) do - %__MODULE__{ - user: map["user"] - } - end -end diff --git a/lib/workos/user_management/invitation.ex b/lib/workos/user_management/invitation.ex deleted file mode 100644 index 21a03054..00000000 --- a/lib/workos/user_management/invitation.ex +++ /dev/null @@ -1,54 +0,0 @@ -defmodule WorkOS.UserManagement.Invitation do - @moduledoc """ - WorkOS Invitation struct. - """ - - @behaviour WorkOS.Castable - - @type t() :: %__MODULE__{ - id: String.t(), - email: String.t(), - state: String.t(), - token: String.t(), - organization_id: String.t() | nil, - accepted_at: String.t() | nil, - expires_at: String.t() | nil, - updated_at: String.t(), - created_at: String.t() - } - - @enforce_keys [ - :id, - :email, - :state, - :token, - :updated_at, - :created_at - ] - defstruct [ - :id, - :email, - :state, - :token, - :organization_id, - :accepted_at, - :expires_at, - :updated_at, - :created_at - ] - - @impl true - def cast(map) do - %__MODULE__{ - id: map["id"], - email: map["email"], - state: map["state"], - token: map["token"], - organization_id: map["organization_id"], - accepted_at: map["accepted_at"], - expires_at: map["expires_at"], - updated_at: map["updated_at"], - created_at: map["created_at"] - } - end -end diff --git a/lib/workos/user_management/magic_auth/send_magic_auth_code.ex b/lib/workos/user_management/magic_auth/send_magic_auth_code.ex deleted file mode 100644 index 1d85d139..00000000 --- a/lib/workos/user_management/magic_auth/send_magic_auth_code.ex +++ /dev/null @@ -1,25 +0,0 @@ -defmodule WorkOS.UserManagement.MagicAuth.SendMagicAuthCode do - @moduledoc """ - WorkOS Send Magic Auth Code struct. - """ - - @behaviour WorkOS.Castable - - @type t() :: %__MODULE__{ - email: String.t() - } - - @enforce_keys [ - :email - ] - defstruct [ - :email - ] - - @impl true - def cast(map) do - %__MODULE__{ - email: map["email"] - } - end -end diff --git a/lib/workos/user_management/multi_factor/authentication_challenge.ex b/lib/workos/user_management/multi_factor/authentication_challenge.ex deleted file mode 100644 index 4fcb6b39..00000000 --- a/lib/workos/user_management/multi_factor/authentication_challenge.ex +++ /dev/null @@ -1,43 +0,0 @@ -defmodule WorkOS.UserManagement.MultiFactor.AuthenticationChallenge do - @moduledoc """ - WorkOS Authentication Challenge struct. - """ - - @behaviour WorkOS.Castable - - @type t() :: %__MODULE__{ - id: String.t(), - code: String.t() | nil, - authentication_factor_id: String.t(), - expires_at: String.t() | nil, - updated_at: String.t(), - created_at: String.t() - } - - @enforce_keys [ - :id, - :authentication_factor_id, - :updated_at, - :created_at - ] - defstruct [ - :id, - :code, - :authentication_factor_id, - :expires_at, - :updated_at, - :created_at - ] - - @impl true - def cast(map) do - %__MODULE__{ - id: map["id"], - code: map["code"], - authentication_factor_id: map["authentication_factor_id"], - expires_at: map["expires_at"], - updated_at: map["updated_at"], - created_at: map["created_at"] - } - end -end diff --git a/lib/workos/user_management/multi_factor/authentication_factor.ex b/lib/workos/user_management/multi_factor/authentication_factor.ex deleted file mode 100644 index e12cc7b6..00000000 --- a/lib/workos/user_management/multi_factor/authentication_factor.ex +++ /dev/null @@ -1,49 +0,0 @@ -defmodule WorkOS.UserManagement.MultiFactor.AuthenticationFactor do - @moduledoc """ - WorkOS Authentication Factor struct. - """ - - alias WorkOS.UserManagement.MultiFactor.SMS - alias WorkOS.UserManagement.MultiFactor.TOTP - - @behaviour WorkOS.Castable - - @type t() :: %__MODULE__{ - id: String.t(), - type: String.t(), - user_id: String.t() | nil, - sms: SMS.t() | nil, - totp: TOTP.t() | nil, - updated_at: String.t(), - created_at: String.t() - } - - @enforce_keys [ - :id, - :type, - :updated_at, - :created_at - ] - defstruct [ - :id, - :type, - :user_id, - :sms, - :totp, - :updated_at, - :created_at - ] - - @impl true - def cast(map) do - %__MODULE__{ - id: map["id"], - type: map["type"], - user_id: map["user_id"], - sms: map["sms"], - totp: map["totp"], - updated_at: map["updated_at"], - created_at: map["created_at"] - } - end -end diff --git a/lib/workos/user_management/multi_factor/enroll_auth_factor.ex b/lib/workos/user_management/multi_factor/enroll_auth_factor.ex deleted file mode 100644 index f73a4c81..00000000 --- a/lib/workos/user_management/multi_factor/enroll_auth_factor.ex +++ /dev/null @@ -1,32 +0,0 @@ -defmodule WorkOS.UserManagement.MultiFactor.EnrollAuthFactor do - @moduledoc """ - WorkOS Enroll Auth Factor struct. - """ - - alias WorkOS.UserManagement.MultiFactor.AuthenticationChallenge - alias WorkOS.UserManagement.MultiFactor.AuthenticationFactor - - @behaviour WorkOS.Castable - - @type t() :: %__MODULE__{ - challenge: AuthenticationChallenge.t(), - factor: AuthenticationFactor.t() - } - - @enforce_keys [ - :challenge, - :factor - ] - defstruct [ - :challenge, - :factor - ] - - @impl true - def cast(map) do - %__MODULE__{ - challenge: map["challenge"], - factor: map["factor"] - } - end -end diff --git a/lib/workos/user_management/multi_factor/sms.ex b/lib/workos/user_management/multi_factor/sms.ex deleted file mode 100644 index bf4a6e12..00000000 --- a/lib/workos/user_management/multi_factor/sms.ex +++ /dev/null @@ -1,25 +0,0 @@ -defmodule WorkOS.UserManagement.MultiFactor.SMS do - @moduledoc """ - WorkOS SMS struct. - """ - - @behaviour WorkOS.Castable - - @type t() :: %__MODULE__{ - phone_number: String.t() - } - - @enforce_keys [ - :phone_number - ] - defstruct [ - :phone_number - ] - - @impl true - def cast(map) do - %__MODULE__{ - phone_number: map["phone_number"] - } - end -end diff --git a/lib/workos/user_management/multi_factor/totp.ex b/lib/workos/user_management/multi_factor/totp.ex deleted file mode 100644 index d5c96536..00000000 --- a/lib/workos/user_management/multi_factor/totp.ex +++ /dev/null @@ -1,41 +0,0 @@ -defmodule WorkOS.UserManagement.MultiFactor.TOTP do - @moduledoc """ - WorkOS TOTP struct. - """ - - @behaviour WorkOS.Castable - - @type t() :: %__MODULE__{ - issuer: String.t(), - user: String.t(), - secret: String.t(), - qr_code: String.t(), - uri: String.t() - } - - @enforce_keys [ - :issuer, - :user, - :secret, - :qr_code, - :uri - ] - defstruct [ - :issuer, - :user, - :secret, - :qr_code, - :uri - ] - - @impl true - def cast(map) do - %__MODULE__{ - issuer: map["issuer"], - user: map["user"], - secret: map["secret"], - qr_code: map["qr_code"], - uri: map["uri"] - } - end -end diff --git a/lib/workos/user_management/organization_membership.ex b/lib/workos/user_management/organization_membership.ex deleted file mode 100644 index f0a614a8..00000000 --- a/lib/workos/user_management/organization_membership.ex +++ /dev/null @@ -1,44 +0,0 @@ -defmodule WorkOS.UserManagement.OrganizationMembership do - @moduledoc """ - WorkOS Organization Membership struct. - """ - - @behaviour WorkOS.Castable - - @type t() :: %__MODULE__{ - id: String.t(), - user_id: String.t(), - organization_id: String.t(), - custom_attributes: map(), - updated_at: String.t(), - created_at: String.t() - } - - @enforce_keys [ - :id, - :user_id, - :organization_id, - :updated_at, - :created_at - ] - defstruct [ - :id, - :user_id, - :organization_id, - :custom_attributes, - :updated_at, - :created_at - ] - - @impl true - def cast(map) do - %__MODULE__{ - id: map["id"], - user_id: map["user_id"], - organization_id: map["organization_id"], - custom_attributes: map["custom_attributes"] || %{}, - updated_at: map["updated_at"], - created_at: map["created_at"] - } - end -end diff --git a/lib/workos/user_management/reset_password.ex b/lib/workos/user_management/reset_password.ex deleted file mode 100644 index ec0892bf..00000000 --- a/lib/workos/user_management/reset_password.ex +++ /dev/null @@ -1,27 +0,0 @@ -defmodule WorkOS.UserManagement.ResetPassword do - @moduledoc """ - WorkOS Reset Password struct. - """ - - alias WorkOS.UserManagement.User - - @behaviour WorkOS.Castable - - @type t() :: %__MODULE__{ - user: User.t() - } - - @enforce_keys [ - :user - ] - defstruct [ - :user - ] - - @impl true - def cast(map) do - %__MODULE__{ - user: map["user"] - } - end -end diff --git a/lib/workos/user_management/user.ex b/lib/workos/user_management/user.ex deleted file mode 100644 index 8476e2e5..00000000 --- a/lib/workos/user_management/user.ex +++ /dev/null @@ -1,50 +0,0 @@ -defmodule WorkOS.UserManagement.User do - @moduledoc """ - WorkOS User struct. - """ - - @behaviour WorkOS.Castable - - @type t() :: %__MODULE__{ - id: String.t(), - email: String.t(), - email_verified: boolean(), - first_name: String.t() | nil, - last_name: String.t() | nil, - external_id: String.t() | nil, - updated_at: String.t(), - created_at: String.t() - } - - @enforce_keys [ - :id, - :email, - :email_verified, - :updated_at, - :created_at - ] - defstruct [ - :id, - :email, - :email_verified, - :first_name, - :last_name, - :external_id, - :updated_at, - :created_at - ] - - @impl true - def cast(map) do - %__MODULE__{ - id: map["id"], - email: map["email"], - email_verified: map["email_verified"], - first_name: map["first_name"], - last_name: map["last_name"], - external_id: map["external_id"], - updated_at: map["updated_at"], - created_at: map["created_at"] - } - end -end diff --git a/lib/workos/user_management_authentication_provider.ex b/lib/workos/user_management_authentication_provider.ex new file mode 100644 index 00000000..f5192359 --- /dev/null +++ b/lib/workos/user_management_authentication_provider.ex @@ -0,0 +1,79 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UserManagementAuthenticationProvider do + @moduledoc """ + UserManagementAuthenticationProvider enum. + """ + + @type t :: + :authkit + | :apple_oauth + | :bitbucket_oauth + | :git_hub_oauth + | :git_lab_oauth + | :google_oauth + | :intuit_oauth + | :linked_in_oauth + | :microsoft_oauth + | :salesforce_oauth + | :slack_oauth + | :vercel_marketplace_oauth + | :vercel_oauth + | :xero_oauth + + @doc "All known values." + @spec values() :: [t()] + def values, + do: [ + :authkit, + :apple_oauth, + :bitbucket_oauth, + :git_hub_oauth, + :git_lab_oauth, + :google_oauth, + :intuit_oauth, + :linked_in_oauth, + :microsoft_oauth, + :salesforce_oauth, + :slack_oauth, + :vercel_marketplace_oauth, + :vercel_oauth, + :xero_oauth + ] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("authkit"), do: :authkit + def cast("AppleOAuth"), do: :apple_oauth + def cast("BitbucketOAuth"), do: :bitbucket_oauth + def cast("GitHubOAuth"), do: :git_hub_oauth + def cast("GitLabOAuth"), do: :git_lab_oauth + def cast("GoogleOAuth"), do: :google_oauth + def cast("IntuitOAuth"), do: :intuit_oauth + def cast("LinkedInOAuth"), do: :linked_in_oauth + def cast("MicrosoftOAuth"), do: :microsoft_oauth + def cast("SalesforceOAuth"), do: :salesforce_oauth + def cast("SlackOAuth"), do: :slack_oauth + def cast("VercelMarketplaceOAuth"), do: :vercel_marketplace_oauth + def cast("VercelOAuth"), do: :vercel_oauth + def cast("XeroOAuth"), do: :xero_oauth + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:authkit), do: "authkit" + def dump(:apple_oauth), do: "AppleOAuth" + def dump(:bitbucket_oauth), do: "BitbucketOAuth" + def dump(:git_hub_oauth), do: "GitHubOAuth" + def dump(:git_lab_oauth), do: "GitLabOAuth" + def dump(:google_oauth), do: "GoogleOAuth" + def dump(:intuit_oauth), do: "IntuitOAuth" + def dump(:linked_in_oauth), do: "LinkedInOAuth" + def dump(:microsoft_oauth), do: "MicrosoftOAuth" + def dump(:salesforce_oauth), do: "SalesforceOAuth" + def dump(:slack_oauth), do: "SlackOAuth" + def dump(:vercel_marketplace_oauth), do: "VercelMarketplaceOAuth" + def dump(:vercel_oauth), do: "VercelOAuth" + def dump(:xero_oauth), do: "XeroOAuth" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/user_management_authentication_screen_hint.ex b/lib/workos/user_management_authentication_screen_hint.ex new file mode 100644 index 00000000..88948ab9 --- /dev/null +++ b/lib/workos/user_management_authentication_screen_hint.ex @@ -0,0 +1,25 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UserManagementAuthenticationScreenHint do + @moduledoc """ + UserManagementAuthenticationScreenHint enum. + """ + + @type t :: :sign_up | :sign_in + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:sign_up, :sign_in] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("sign-up"), do: :sign_up + def cast("sign-in"), do: :sign_in + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:sign_up), do: "sign-up" + def dump(:sign_in), do: "sign-in" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/user_management_login_request.ex b/lib/workos/user_management_login_request.ex new file mode 100644 index 00000000..4bf84252 --- /dev/null +++ b/lib/workos/user_management_login_request.ex @@ -0,0 +1,43 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UserManagementLoginRequest do + @moduledoc """ + UserManagementLoginRequest model. + """ + + defstruct [ + :external_auth_id, + :user, + :user_consent_options + ] + + @type t :: %__MODULE__{ + external_auth_id: String.t(), + user: WorkOS.UserObject.t(), + user_consent_options: [WorkOS.UserConsentOption.t()] | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + external_auth_id: map["external_auth_id"], + user: WorkOS.Cast.nested(map["user"], &WorkOS.UserObject.from_map/1), + user_consent_options: + WorkOS.Cast.list(map["user_consent_options"], &WorkOS.UserConsentOption.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "external_auth_id" => struct.external_auth_id, + "user" => WorkOS.Cast.dump_struct(struct.user, &WorkOS.UserObject.to_map/1), + "user_consent_options" => + WorkOS.Cast.list(struct.user_consent_options, fn item -> + WorkOS.Cast.dump_struct(item, &WorkOS.UserConsentOption.to_map/1) + end) + }) + end +end diff --git a/lib/workos/user_management_organization_membership_statuses.ex b/lib/workos/user_management_organization_membership_statuses.ex new file mode 100644 index 00000000..edfaab9b --- /dev/null +++ b/lib/workos/user_management_organization_membership_statuses.ex @@ -0,0 +1,27 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UserManagementOrganizationMembershipStatuses do + @moduledoc """ + UserManagementOrganizationMembershipStatuses enum. + """ + + @type t :: :active | :inactive | :pending + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:active, :inactive, :pending] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("active"), do: :active + def cast("inactive"), do: :inactive + def cast("pending"), do: :pending + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:active), do: "active" + def dump(:inactive), do: "inactive" + def dump(:pending), do: "pending" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/user_object.ex b/lib/workos/user_object.ex new file mode 100644 index 00000000..6169123b --- /dev/null +++ b/lib/workos/user_object.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UserObject do + @moduledoc """ + UserObject model. + """ + + defstruct [ + :id, + :email, + :first_name, + :last_name, + :name, + :metadata + ] + + @type t :: %__MODULE__{ + id: String.t(), + email: String.t(), + first_name: String.t() | nil, + last_name: String.t() | nil, + name: String.t() | nil, + metadata: %{optional(String.t()) => String.t()} | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + id: map["id"], + email: map["email"], + first_name: map["first_name"], + last_name: map["last_name"], + name: map["name"], + metadata: map["metadata"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "id" => struct.id, + "email" => struct.email, + "first_name" => struct.first_name, + "last_name" => struct.last_name, + "name" => struct.name, + "metadata" => struct.metadata + }) + end +end diff --git a/lib/workos/user_organization_membership.ex b/lib/workos/user_organization_membership.ex new file mode 100644 index 00000000..be1f9bfa --- /dev/null +++ b/lib/workos/user_organization_membership.ex @@ -0,0 +1,83 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UserOrganizationMembership do + @moduledoc """ + UserOrganizationMembership model. + """ + + defstruct [ + :object, + :id, + :user_id, + :organization_id, + :status, + :directory_managed, + :created_at, + :updated_at, + :role, + :roles, + :user, + :organization_name, + :custom_attributes + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + user_id: String.t(), + organization_id: String.t(), + status: WorkOS.UserOrganizationMembershipStatus.t(), + directory_managed: boolean(), + created_at: String.t(), + updated_at: String.t(), + role: WorkOS.SlimRole.t(), + roles: [WorkOS.SlimRole.t()], + user: WorkOS.User.t(), + organization_name: String.t() | nil, + custom_attributes: %{optional(String.t()) => term()} | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + user_id: map["user_id"], + organization_id: map["organization_id"], + status: WorkOS.Cast.enum(map["status"], &WorkOS.UserOrganizationMembershipStatus.cast/1), + directory_managed: map["directory_managed"], + created_at: map["created_at"], + updated_at: map["updated_at"], + role: WorkOS.Cast.nested(map["role"], &WorkOS.SlimRole.from_map/1), + roles: WorkOS.Cast.list(map["roles"], &WorkOS.SlimRole.from_map/1), + user: WorkOS.Cast.nested(map["user"], &WorkOS.User.from_map/1), + organization_name: map["organization_name"], + custom_attributes: map["custom_attributes"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "user_id" => struct.user_id, + "organization_id" => struct.organization_id, + "status" => + WorkOS.Cast.enum(struct.status, &WorkOS.UserOrganizationMembershipStatus.dump/1), + "directory_managed" => struct.directory_managed, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at, + "role" => WorkOS.Cast.dump_struct(struct.role, &WorkOS.SlimRole.to_map/1), + "roles" => + WorkOS.Cast.list(struct.roles, fn item -> + WorkOS.Cast.dump_struct(item, &WorkOS.SlimRole.to_map/1) + end), + "user" => WorkOS.Cast.dump_struct(struct.user, &WorkOS.User.to_map/1), + "organization_name" => struct.organization_name, + "custom_attributes" => struct.custom_attributes + }) + end +end diff --git a/lib/workos/user_organization_membership_base_list.ex b/lib/workos/user_organization_membership_base_list.ex new file mode 100644 index 00000000..2f061560 --- /dev/null +++ b/lib/workos/user_organization_membership_base_list.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UserOrganizationMembershipBaseList do + @moduledoc """ + UserOrganizationMembershipBaseList model. + """ + + defstruct [ + :object, + :data, + :list_metadata + ] + + @type t :: %__MODULE__{ + object: String.t(), + data: [WorkOS.UserOrganizationMembershipBaseListData.t()], + list_metadata: WorkOS.UserOrganizationMembershipBaseListListMetadata.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + data: + WorkOS.Cast.list(map["data"], &WorkOS.UserOrganizationMembershipBaseListData.from_map/1), + list_metadata: + WorkOS.Cast.nested( + map["list_metadata"], + &WorkOS.UserOrganizationMembershipBaseListListMetadata.from_map/1 + ) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "data" => + WorkOS.Cast.list(struct.data, fn item -> + WorkOS.Cast.dump_struct(item, &WorkOS.UserOrganizationMembershipBaseListData.to_map/1) + end), + "list_metadata" => + WorkOS.Cast.dump_struct( + struct.list_metadata, + &WorkOS.UserOrganizationMembershipBaseListListMetadata.to_map/1 + ) + }) + end +end diff --git a/lib/workos/user_organization_membership_base_list_data.ex b/lib/workos/user_organization_membership_base_list_data.ex new file mode 100644 index 00000000..8ebd9174 --- /dev/null +++ b/lib/workos/user_organization_membership_base_list_data.ex @@ -0,0 +1,79 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UserOrganizationMembershipBaseListData do + @moduledoc """ + UserOrganizationMembershipBaseListData model. + """ + + defstruct [ + :object, + :id, + :user_id, + :organization_id, + :status, + :directory_managed, + :created_at, + :updated_at, + :user, + :organization_name, + :custom_attributes + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + user_id: String.t(), + organization_id: String.t(), + status: WorkOS.UserOrganizationMembershipBaseListDataStatus.t(), + directory_managed: boolean(), + created_at: String.t(), + updated_at: String.t(), + user: WorkOS.User.t(), + organization_name: String.t() | nil, + custom_attributes: %{optional(String.t()) => term()} | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + user_id: map["user_id"], + organization_id: map["organization_id"], + status: + WorkOS.Cast.enum( + map["status"], + &WorkOS.UserOrganizationMembershipBaseListDataStatus.cast/1 + ), + directory_managed: map["directory_managed"], + created_at: map["created_at"], + updated_at: map["updated_at"], + user: WorkOS.Cast.nested(map["user"], &WorkOS.User.from_map/1), + organization_name: map["organization_name"], + custom_attributes: map["custom_attributes"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "user_id" => struct.user_id, + "organization_id" => struct.organization_id, + "status" => + WorkOS.Cast.enum( + struct.status, + &WorkOS.UserOrganizationMembershipBaseListDataStatus.dump/1 + ), + "directory_managed" => struct.directory_managed, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at, + "user" => WorkOS.Cast.dump_struct(struct.user, &WorkOS.User.to_map/1), + "organization_name" => struct.organization_name, + "custom_attributes" => struct.custom_attributes + }) + end +end diff --git a/lib/workos/user_organization_membership_base_list_data_status.ex b/lib/workos/user_organization_membership_base_list_data_status.ex new file mode 100644 index 00000000..a9ee79a0 --- /dev/null +++ b/lib/workos/user_organization_membership_base_list_data_status.ex @@ -0,0 +1,27 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UserOrganizationMembershipBaseListDataStatus do + @moduledoc """ + UserOrganizationMembershipBaseListDataStatus enum. + """ + + @type t :: :active | :inactive | :pending + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:active, :inactive, :pending] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("active"), do: :active + def cast("inactive"), do: :inactive + def cast("pending"), do: :pending + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:active), do: "active" + def dump(:inactive), do: "inactive" + def dump(:pending), do: "pending" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/user_organization_membership_base_list_list_metadata.ex b/lib/workos/user_organization_membership_base_list_list_metadata.ex new file mode 100644 index 00000000..0a6f64b7 --- /dev/null +++ b/lib/workos/user_organization_membership_base_list_list_metadata.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UserOrganizationMembershipBaseListListMetadata do + @moduledoc """ + Pagination cursors for navigating between pages of results. + """ + + defstruct [ + :before, + :after_ + ] + + @type t :: %__MODULE__{ + before: String.t() | nil, + after_: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + before: map["before"], + after_: map["after"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "before" => struct.before, + "after" => struct.after_ + }) + end +end diff --git a/lib/workos/user_organization_membership_list.ex b/lib/workos/user_organization_membership_list.ex new file mode 100644 index 00000000..146ce3a7 --- /dev/null +++ b/lib/workos/user_organization_membership_list.ex @@ -0,0 +1,50 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UserOrganizationMembershipList do + @moduledoc """ + UserOrganizationMembershipList model. + """ + + defstruct [ + :object, + :data, + :list_metadata + ] + + @type t :: %__MODULE__{ + object: String.t(), + data: [WorkOS.UserOrganizationMembership.t()], + list_metadata: WorkOS.UserOrganizationMembershipListListMetadata.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + data: WorkOS.Cast.list(map["data"], &WorkOS.UserOrganizationMembership.from_map/1), + list_metadata: + WorkOS.Cast.nested( + map["list_metadata"], + &WorkOS.UserOrganizationMembershipListListMetadata.from_map/1 + ) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "data" => + WorkOS.Cast.list(struct.data, fn item -> + WorkOS.Cast.dump_struct(item, &WorkOS.UserOrganizationMembership.to_map/1) + end), + "list_metadata" => + WorkOS.Cast.dump_struct( + struct.list_metadata, + &WorkOS.UserOrganizationMembershipListListMetadata.to_map/1 + ) + }) + end +end diff --git a/lib/workos/user_organization_membership_list_list_metadata.ex b/lib/workos/user_organization_membership_list_list_metadata.ex new file mode 100644 index 00000000..f5b67431 --- /dev/null +++ b/lib/workos/user_organization_membership_list_list_metadata.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UserOrganizationMembershipListListMetadata do + @moduledoc """ + Pagination cursors for navigating between pages of results. + """ + + defstruct [ + :before, + :after_ + ] + + @type t :: %__MODULE__{ + before: String.t() | nil, + after_: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + before: map["before"], + after_: map["after"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "before" => struct.before, + "after" => struct.after_ + }) + end +end diff --git a/lib/workos/user_organization_membership_status.ex b/lib/workos/user_organization_membership_status.ex new file mode 100644 index 00000000..ee53a338 --- /dev/null +++ b/lib/workos/user_organization_membership_status.ex @@ -0,0 +1,27 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UserOrganizationMembershipStatus do + @moduledoc """ + UserOrganizationMembershipStatus enum. + """ + + @type t :: :active | :inactive | :pending + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:active, :inactive, :pending] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("active"), do: :active + def cast("inactive"), do: :inactive + def cast("pending"), do: :pending + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:active), do: "active" + def dump(:inactive), do: "inactive" + def dump(:pending), do: "pending" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/user_role_assignment.ex b/lib/workos/user_role_assignment.ex new file mode 100644 index 00000000..d40c52fe --- /dev/null +++ b/lib/workos/user_role_assignment.ex @@ -0,0 +1,62 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UserRoleAssignment do + @moduledoc """ + UserRoleAssignment model. + """ + + defstruct [ + :object, + :id, + :organization_membership_id, + :role, + :resource, + :source, + :created_at, + :updated_at + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + organization_membership_id: String.t(), + role: WorkOS.SlimRole.t(), + resource: WorkOS.UserRoleAssignmentResource.t(), + source: WorkOS.UserRoleAssignmentSource.t(), + created_at: String.t(), + updated_at: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + organization_membership_id: map["organization_membership_id"], + role: WorkOS.Cast.nested(map["role"], &WorkOS.SlimRole.from_map/1), + resource: + WorkOS.Cast.nested(map["resource"], &WorkOS.UserRoleAssignmentResource.from_map/1), + source: WorkOS.Cast.nested(map["source"], &WorkOS.UserRoleAssignmentSource.from_map/1), + created_at: map["created_at"], + updated_at: map["updated_at"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "organization_membership_id" => struct.organization_membership_id, + "role" => WorkOS.Cast.dump_struct(struct.role, &WorkOS.SlimRole.to_map/1), + "resource" => + WorkOS.Cast.dump_struct(struct.resource, &WorkOS.UserRoleAssignmentResource.to_map/1), + "source" => + WorkOS.Cast.dump_struct(struct.source, &WorkOS.UserRoleAssignmentSource.to_map/1), + "created_at" => struct.created_at, + "updated_at" => struct.updated_at + }) + end +end diff --git a/lib/workos/user_role_assignment_list.ex b/lib/workos/user_role_assignment_list.ex new file mode 100644 index 00000000..d783c6d4 --- /dev/null +++ b/lib/workos/user_role_assignment_list.ex @@ -0,0 +1,50 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UserRoleAssignmentList do + @moduledoc """ + UserRoleAssignmentList model. + """ + + defstruct [ + :object, + :data, + :list_metadata + ] + + @type t :: %__MODULE__{ + object: String.t(), + data: [WorkOS.UserRoleAssignment.t()], + list_metadata: WorkOS.UserRoleAssignmentListListMetadata.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + data: WorkOS.Cast.list(map["data"], &WorkOS.UserRoleAssignment.from_map/1), + list_metadata: + WorkOS.Cast.nested( + map["list_metadata"], + &WorkOS.UserRoleAssignmentListListMetadata.from_map/1 + ) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "data" => + WorkOS.Cast.list(struct.data, fn item -> + WorkOS.Cast.dump_struct(item, &WorkOS.UserRoleAssignment.to_map/1) + end), + "list_metadata" => + WorkOS.Cast.dump_struct( + struct.list_metadata, + &WorkOS.UserRoleAssignmentListListMetadata.to_map/1 + ) + }) + end +end diff --git a/lib/workos/user_role_assignment_list_list_metadata.ex b/lib/workos/user_role_assignment_list_list_metadata.ex new file mode 100644 index 00000000..01358496 --- /dev/null +++ b/lib/workos/user_role_assignment_list_list_metadata.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UserRoleAssignmentListListMetadata do + @moduledoc """ + Pagination cursors for navigating between pages of results. + """ + + defstruct [ + :before, + :after_ + ] + + @type t :: %__MODULE__{ + before: String.t() | nil, + after_: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + before: map["before"], + after_: map["after"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "before" => struct.before, + "after" => struct.after_ + }) + end +end diff --git a/lib/workos/user_role_assignment_resource.ex b/lib/workos/user_role_assignment_resource.ex new file mode 100644 index 00000000..525a9078 --- /dev/null +++ b/lib/workos/user_role_assignment_resource.ex @@ -0,0 +1,39 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UserRoleAssignmentResource do + @moduledoc """ + The resource the role is assigned on. + """ + + defstruct [ + :id, + :external_id, + :resource_type_slug + ] + + @type t :: %__MODULE__{ + id: String.t(), + external_id: String.t(), + resource_type_slug: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + id: map["id"], + external_id: map["external_id"], + resource_type_slug: map["resource_type_slug"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "id" => struct.id, + "external_id" => struct.external_id, + "resource_type_slug" => struct.resource_type_slug + }) + end +end diff --git a/lib/workos/user_role_assignment_source.ex b/lib/workos/user_role_assignment_source.ex new file mode 100644 index 00000000..312bdf39 --- /dev/null +++ b/lib/workos/user_role_assignment_source.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UserRoleAssignmentSource do + @moduledoc """ + The origin of the role assignment. + """ + + defstruct [ + :type, + :group_role_assignment_id + ] + + @type t :: %__MODULE__{ + type: WorkOS.UserRoleAssignmentSourceType.t(), + group_role_assignment_id: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + type: WorkOS.Cast.enum(map["type"], &WorkOS.UserRoleAssignmentSourceType.cast/1), + group_role_assignment_id: map["group_role_assignment_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "type" => WorkOS.Cast.enum(struct.type, &WorkOS.UserRoleAssignmentSourceType.dump/1), + "group_role_assignment_id" => struct.group_role_assignment_id + }) + end +end diff --git a/lib/workos/user_role_assignment_source_type.ex b/lib/workos/user_role_assignment_source_type.ex new file mode 100644 index 00000000..73ae29d1 --- /dev/null +++ b/lib/workos/user_role_assignment_source_type.ex @@ -0,0 +1,25 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UserRoleAssignmentSourceType do + @moduledoc """ + UserRoleAssignmentSourceType enum. + """ + + @type t :: :direct | :group + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:direct, :group] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("direct"), do: :direct + def cast("group"), do: :group + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:direct), do: "direct" + def dump(:group), do: "group" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/user_sessions_auth_method.ex b/lib/workos/user_sessions_auth_method.ex new file mode 100644 index 00000000..3be4a086 --- /dev/null +++ b/lib/workos/user_sessions_auth_method.ex @@ -0,0 +1,63 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UserSessionsAuthMethod do + @moduledoc """ + UserSessionsAuthMethod enum. + """ + + @type t :: + :cross_app_auth + | :external_auth + | :impersonation + | :magic_code + | :migrated_session + | :oauth + | :passkey + | :password + | :sso + | :unknown + + @doc "All known values." + @spec values() :: [t()] + def values, + do: [ + :cross_app_auth, + :external_auth, + :impersonation, + :magic_code, + :migrated_session, + :oauth, + :passkey, + :password, + :sso, + :unknown + ] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("cross_app_auth"), do: :cross_app_auth + def cast("external_auth"), do: :external_auth + def cast("impersonation"), do: :impersonation + def cast("magic_code"), do: :magic_code + def cast("migrated_session"), do: :migrated_session + def cast("oauth"), do: :oauth + def cast("passkey"), do: :passkey + def cast("password"), do: :password + def cast("sso"), do: :sso + def cast("unknown"), do: :unknown + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:cross_app_auth), do: "cross_app_auth" + def dump(:external_auth), do: "external_auth" + def dump(:impersonation), do: "impersonation" + def dump(:magic_code), do: "magic_code" + def dump(:migrated_session), do: "migrated_session" + def dump(:oauth), do: "oauth" + def dump(:passkey), do: "passkey" + def dump(:password), do: "password" + def dump(:sso), do: "sso" + def dump(:unknown), do: "unknown" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/user_sessions_impersonator.ex b/lib/workos/user_sessions_impersonator.ex new file mode 100644 index 00000000..5b62f6ab --- /dev/null +++ b/lib/workos/user_sessions_impersonator.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UserSessionsImpersonator do + @moduledoc """ + Information about the impersonator if this session was created via impersonation. + """ + + defstruct [ + :email, + :reason + ] + + @type t :: %__MODULE__{ + email: String.t(), + reason: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + email: map["email"], + reason: map["reason"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "email" => struct.email, + "reason" => struct.reason + }) + end +end diff --git a/lib/workos/user_sessions_list_item.ex b/lib/workos/user_sessions_list_item.ex new file mode 100644 index 00000000..f914c9b8 --- /dev/null +++ b/lib/workos/user_sessions_list_item.ex @@ -0,0 +1,82 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UserSessionsListItem do + @moduledoc """ + UserSessionsListItem model. + """ + + defstruct [ + :object, + :id, + :ip_address, + :user_agent, + :user_id, + :auth_method, + :status, + :expires_at, + :ended_at, + :created_at, + :updated_at, + :impersonator, + :organization_id + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + ip_address: String.t() | nil, + user_agent: String.t() | nil, + user_id: String.t(), + auth_method: WorkOS.UserSessionsAuthMethod.t(), + status: WorkOS.UserSessionsStatus.t(), + expires_at: String.t(), + ended_at: String.t() | nil, + created_at: String.t(), + updated_at: String.t(), + impersonator: WorkOS.UserSessionsImpersonator.t() | nil, + organization_id: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + ip_address: map["ip_address"], + user_agent: map["user_agent"], + user_id: map["user_id"], + auth_method: WorkOS.Cast.enum(map["auth_method"], &WorkOS.UserSessionsAuthMethod.cast/1), + status: WorkOS.Cast.enum(map["status"], &WorkOS.UserSessionsStatus.cast/1), + expires_at: map["expires_at"], + ended_at: map["ended_at"], + created_at: map["created_at"], + updated_at: map["updated_at"], + impersonator: + WorkOS.Cast.nested(map["impersonator"], &WorkOS.UserSessionsImpersonator.from_map/1), + organization_id: map["organization_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "ip_address" => struct.ip_address, + "user_agent" => struct.user_agent, + "user_id" => struct.user_id, + "auth_method" => + WorkOS.Cast.enum(struct.auth_method, &WorkOS.UserSessionsAuthMethod.dump/1), + "status" => WorkOS.Cast.enum(struct.status, &WorkOS.UserSessionsStatus.dump/1), + "expires_at" => struct.expires_at, + "ended_at" => struct.ended_at, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at, + "impersonator" => + WorkOS.Cast.dump_struct(struct.impersonator, &WorkOS.UserSessionsImpersonator.to_map/1), + "organization_id" => struct.organization_id + }) + end +end diff --git a/lib/workos/user_sessions_status.ex b/lib/workos/user_sessions_status.ex new file mode 100644 index 00000000..b5febf86 --- /dev/null +++ b/lib/workos/user_sessions_status.ex @@ -0,0 +1,27 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UserSessionsStatus do + @moduledoc """ + UserSessionsStatus enum. + """ + + @type t :: :active | :expired | :revoked + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:active, :expired, :revoked] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("active"), do: :active + def cast("expired"), do: :expired + def cast("revoked"), do: :revoked + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:active), do: "active" + def dump(:expired), do: "expired" + def dump(:revoked), do: "revoked" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/user_updated.ex b/lib/workos/user_updated.ex new file mode 100644 index 00000000..9751223a --- /dev/null +++ b/lib/workos/user_updated.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UserUpdated do + @moduledoc """ + UserUpdated model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.User.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.User.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => WorkOS.Cast.dump_struct(struct.data, &WorkOS.User.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/validate_api_key.ex b/lib/workos/validate_api_key.ex new file mode 100644 index 00000000..9e308e9b --- /dev/null +++ b/lib/workos/validate_api_key.ex @@ -0,0 +1,31 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ValidateApiKey do + @moduledoc """ + ValidateApiKey model. + """ + + defstruct [ + :value + ] + + @type t :: %__MODULE__{ + value: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + value: map["value"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "value" => struct.value + }) + end +end diff --git a/lib/workos/vault.ex b/lib/workos/vault.ex new file mode 100644 index 00000000..30702450 --- /dev/null +++ b/lib/workos/vault.ex @@ -0,0 +1,259 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.Vault do + @moduledoc """ + Operations for the Vault API. + """ + + @doc """ + Create a data key + + Generate an isolated encryption key for local encryption operations. + + ## Parameters + + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec create_data_key(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.CreateDataKeyResponse.t()} | {:error, WorkOS.Error.error()} + def create_data_key(client, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request(client, :post, "/vault/v1/keys/data-key", params, opts) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.CreateDataKeyResponse.from_map/1)} + end + end + + @doc """ + Decrypt a data key + + Decrypt a previously encrypted data key from WorkOS Vault. + + ## Parameters + + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec create_decrypt(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.DecryptResponse.t()} | {:error, WorkOS.Error.error()} + def create_decrypt(client, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request(client, :post, "/vault/v1/keys/decrypt", params, opts) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.DecryptResponse.from_map/1)} + end + end + + @doc """ + Re-encrypt a data key + + Decrypt an existing data key and re-encrypt it under a new key context. + + ## Parameters + + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec create_rekey(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.CreateDataKeyResponse.t()} | {:error, WorkOS.Error.error()} + def create_rekey(client, params \\ %{}, opts \\ []) do + with {:ok, body} <- WorkOS.Client.request(client, :post, "/vault/v1/keys/rekey", params, opts) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.CreateDataKeyResponse.from_map/1)} + end + end + + @doc """ + List objects + + List all encrypted objects with cursor-based pagination. + + ## Parameters + + * `params` — query parameters: `:limit`, `:before`, `:after_`, `:order`, `:search`, `:updated_after` + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec list_kv(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.Page.t(WorkOS.ObjectListResponse.t())} | {:error, WorkOS.Error.error()} + def list_kv(client, params \\ %{}, opts \\ []) do + with {:ok, body} <- WorkOS.Client.request(client, :get, "/vault/v1/kv", params, opts) do + fetch_next = fn cursor -> + list_kv( + client, + WorkOS.Page.next_params(params, "after", cursor), + opts + ) + end + + {:ok, WorkOS.Page.from_map(body, "data", &WorkOS.ObjectListResponse.from_map/1, fetch_next)} + end + end + + @doc """ + Create an object + + Encrypt and store a new key-value object. + + ## Parameters + + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec create_kv(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.ObjectMetadata.t()} | {:error, WorkOS.Error.error()} + def create_kv(client, params \\ %{}, opts \\ []) do + with {:ok, body} <- WorkOS.Client.request(client, :post, "/vault/v1/kv", params, opts) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.ObjectMetadata.from_map/1)} + end + end + + @doc """ + Read an object by name + + Fetch and decrypt an object by its unique name. + + ## Parameters + + * `name` — Unique name of the object. + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec get_name(WorkOS.Client.t(), String.t(), keyword()) :: + {:ok, WorkOS.VaultObject.t()} | {:error, WorkOS.Error.error()} + def get_name(client, name, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :get, + "/vault/v1/kv/name/#{URI.encode(name, &URI.char_unreserved?/1)}", + %{}, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.VaultObject.from_map/1)} + end + end + + @doc """ + Read an object by ID + + Fetch and decrypt an object by its unique identifier. + + ## Parameters + + * `id` — Unique identifier of the object. + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec get_kv(WorkOS.Client.t(), String.t(), keyword()) :: + {:ok, WorkOS.VaultObject.t()} | {:error, WorkOS.Error.error()} + def get_kv(client, id, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :get, + "/vault/v1/kv/#{URI.encode(id, &URI.char_unreserved?/1)}", + %{}, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.VaultObject.from_map/1)} + end + end + + @doc """ + Update an object + + Update the value of an existing encrypted object. + + ## Parameters + + * `id` — Unique identifier of the object. + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec update_kv(WorkOS.Client.t(), String.t(), map(), keyword()) :: + {:ok, WorkOS.ObjectWithoutValue.t()} | {:error, WorkOS.Error.error()} + def update_kv(client, id, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :put, + "/vault/v1/kv/#{URI.encode(id, &URI.char_unreserved?/1)}", + params, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.ObjectWithoutValue.from_map/1)} + end + end + + @doc """ + Delete an object + + Delete an encrypted object. + + ## Parameters + + * `id` — Unique identifier of the object. + * `params` — query parameters: `:version_check` + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec delete_kv(WorkOS.Client.t(), String.t(), map(), keyword()) :: + {:ok, WorkOS.DeleteObjectResponse.t()} | {:error, WorkOS.Error.error()} + def delete_kv(client, id, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :delete, + "/vault/v1/kv/#{URI.encode(id, &URI.char_unreserved?/1)}", + params, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.DeleteObjectResponse.from_map/1)} + end + end + + @doc """ + Describe an object + + Fetch metadata for an object without decrypting it. + + ## Parameters + + * `id` — Unique identifier of the object. + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec list_kv_metadata(WorkOS.Client.t(), String.t(), keyword()) :: + {:ok, WorkOS.ObjectWithoutValue.t()} | {:error, WorkOS.Error.error()} + def list_kv_metadata(client, id, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :get, + "/vault/v1/kv/#{URI.encode(id, &URI.char_unreserved?/1)}/metadata", + %{}, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.ObjectWithoutValue.from_map/1)} + end + end + + @doc """ + List object versions + + Retrieve all versions for a specific object. + + ## Parameters + + * `id` — Unique identifier of the object. + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec list_kv_versions(WorkOS.Client.t(), String.t(), keyword()) :: + {:ok, WorkOS.VersionListResponse.t()} | {:error, WorkOS.Error.error()} + def list_kv_versions(client, id, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :get, + "/vault/v1/kv/#{URI.encode(id, &URI.char_unreserved?/1)}/versions", + %{}, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.VersionListResponse.from_map/1)} + end + end +end diff --git a/lib/workos/vault/crypto.ex b/lib/workos/vault/crypto.ex new file mode 100644 index 00000000..29bf3395 --- /dev/null +++ b/lib/workos/vault/crypto.ex @@ -0,0 +1,188 @@ +# @oagen-ignore-file — hand-maintained; client-side AES-GCM cryptography. + +defmodule WorkOS.Vault.Crypto do + @moduledoc """ + Client-side Vault encryption and decryption, layered on the WorkOS data-key + API (`WorkOS.Vault.create_data_key/3` and `WorkOS.Vault.create_decrypt/3`). + + {:ok, result} = + WorkOS.Vault.Crypto.encrypt(client, "my secret", %{"org" => "org_123"}) + + {:ok, "my secret"} = + WorkOS.Vault.Crypto.decrypt(client, result.encrypted_data) + + Data is encrypted locally with AES-256-GCM; only the data key is exchanged + with the API. The wire format (before base64) is + `LEB128(byte_size(encrypted_keys)) || encrypted_keys || nonce(12) || ciphertext || tag(16)`, + interoperable with the other WorkOS SDKs. + """ + + @nonce_size 12 + @tag_size 16 + + @typedoc "Result of `encrypt/5`." + @type encrypt_result :: %{ + encrypted_data: String.t(), + key_context: %{optional(String.t()) => String.t()}, + encrypted_keys: String.t() + } + + @doc """ + Generates a data key for `key_context` and encrypts `data` locally. + + `associated_data` is optional AES-GCM additional authenticated data — the + same value must be passed to `decrypt/4`. + """ + @spec encrypt(WorkOS.Client.t(), String.t(), map(), String.t() | nil, keyword()) :: + {:ok, encrypt_result()} | {:error, WorkOS.Error.error() | term()} + def encrypt(client, data, key_context, associated_data \\ nil, opts \\ []) do + with {:ok, key_pair} <- + WorkOS.Vault.create_data_key(client, %{"context" => key_context}, opts), + {:ok, encrypted_data} <- local_encrypt(data, key_pair, associated_data) do + {:ok, + %{ + encrypted_data: encrypted_data, + key_context: key_pair.context, + encrypted_keys: key_pair.encrypted_keys + }} + end + end + + @doc """ + Decrypts data produced by `encrypt/5` by first decrypting the embedded data + key via the API. + """ + @spec decrypt(WorkOS.Client.t(), String.t(), String.t() | nil, keyword()) :: + {:ok, String.t()} | {:error, WorkOS.Error.error() | term()} + def decrypt(client, encrypted_data, associated_data \\ nil, opts \\ []) do + with {:ok, encrypted_keys} <- extract_encrypted_keys(encrypted_data), + {:ok, data_key} <- + WorkOS.Vault.create_decrypt(client, %{"keys" => encrypted_keys}, opts) do + local_decrypt(encrypted_data, data_key, associated_data) + end + end + + @doc """ + Encrypts `data` with AES-256-GCM using a pre-fetched data key pair + (`WorkOS.CreateDataKeyResponse`). No HTTP request is made. + """ + @spec local_encrypt(String.t(), WorkOS.CreateDataKeyResponse.t(), String.t() | nil) :: + {:ok, String.t()} | {:error, term()} + def local_encrypt(data, key_pair, associated_data \\ nil) do + with {:ok, key} <- decode_key(key_pair.data_key), + {:ok, encrypted_keys} <- decode_base64(key_pair.encrypted_keys, :invalid_encrypted_keys) do + nonce = :crypto.strong_rand_bytes(@nonce_size) + + {ciphertext, tag} = + :crypto.crypto_one_time_aead(:aes_256_gcm, key, nonce, data, associated_data || "", true) + + payload = + encode_leb128(byte_size(encrypted_keys)) <> encrypted_keys <> nonce <> ciphertext <> tag + + {:ok, Base.encode64(payload)} + end + end + + @doc """ + Decrypts data with AES-256-GCM using a pre-fetched data key + (`WorkOS.DecryptResponse`). No HTTP request is made. + """ + @spec local_decrypt(String.t(), WorkOS.DecryptResponse.t(), String.t() | nil) :: + {:ok, String.t()} | {:error, term()} + def local_decrypt(encrypted_data, data_key, associated_data \\ nil) do + with {:ok, raw} <- decode_base64(encrypted_data, :invalid_base64), + {:ok, keys_length, rest} <- decode_leb128(raw), + {:ok, body} <- skip_encrypted_keys(rest, keys_length), + {:ok, key} <- decode_key(data_key.data_key), + {:ok, nonce, ciphertext, tag} <- split_payload(body) do + open(key, nonce, ciphertext, tag, associated_data || "") + end + end + + defp split_payload(<>) + when byte_size(payload) >= @tag_size do + ciphertext_size = byte_size(payload) - @tag_size + <> = payload + {:ok, nonce, ciphertext, tag} + end + + defp split_payload(_body), do: {:error, :encrypted_data_too_short} + + defp open(key, nonce, ciphertext, tag, associated_data) do + case :crypto.crypto_one_time_aead( + :aes_256_gcm, + key, + nonce, + ciphertext, + associated_data, + tag, + false + ) do + plaintext when is_binary(plaintext) -> {:ok, plaintext} + :error -> {:error, :decryption_failed} + end + end + + defp extract_encrypted_keys(encrypted_data) do + with {:ok, raw} <- decode_base64(encrypted_data, :invalid_base64), + {:ok, keys_length, rest} <- decode_leb128(raw) do + case rest do + <> -> + {:ok, Base.encode64(encrypted_keys)} + + _too_short -> + {:error, :encrypted_data_too_short} + end + end + end + + defp skip_encrypted_keys(rest, keys_length) do + case rest do + <<_keys::binary-size(^keys_length), body::binary>> -> {:ok, body} + _too_short -> {:error, :encrypted_data_too_short} + end + end + + defp decode_key(encoded) do + case Base.decode64(to_string(encoded)) do + {:ok, <>} -> {:ok, key} + _ -> {:error, :invalid_data_key} + end + end + + defp decode_base64(encoded, error) do + case Base.decode64(to_string(encoded)) do + {:ok, decoded} -> {:ok, decoded} + :error -> {:error, error} + end + end + + # Unsigned LEB128, used to frame the encrypted-keys blob. + defp encode_leb128(0), do: <<0>> + + defp encode_leb128(n) when n > 0 do + rest = Bitwise.bsr(n, 7) + byte = Bitwise.band(n, 0x7F) + + if rest > 0 do + <> <> encode_leb128(rest) + else + <> + end + end + + defp decode_leb128(binary), do: decode_leb128(binary, 0, 0) + + defp decode_leb128(_binary, shift, _acc) when shift >= 35, do: {:error, :leb128_overflow} + defp decode_leb128(<<>>, _shift, _acc), do: {:error, :leb128_truncated} + + defp decode_leb128(<>, shift, acc) do + acc = Bitwise.bor(acc, Bitwise.bsl(Bitwise.band(byte, 0x7F), shift)) + + if Bitwise.band(byte, 0x80) == 0 do + {:ok, acc, rest} + else + decode_leb128(rest, shift + 7, acc) + end + end +end diff --git a/lib/workos/vault_byok_key_deleted.ex b/lib/workos/vault_byok_key_deleted.ex new file mode 100644 index 00000000..5d0ecadb --- /dev/null +++ b/lib/workos/vault_byok_key_deleted.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.VaultByokKeyDeleted do + @moduledoc """ + VaultByokKeyDeleted model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.VaultByokKeyDeletedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.VaultByokKeyDeletedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => WorkOS.Cast.dump_struct(struct.data, &WorkOS.VaultByokKeyDeletedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/vault_byok_key_deleted_data.ex b/lib/workos/vault_byok_key_deleted_data.ex new file mode 100644 index 00000000..b62a11ce --- /dev/null +++ b/lib/workos/vault_byok_key_deleted_data.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.VaultByokKeyDeletedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :organization_id, + :key_provider + ] + + @type t :: %__MODULE__{ + organization_id: String.t(), + key_provider: WorkOS.VaultByokKeyProvider.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + organization_id: map["organization_id"], + key_provider: WorkOS.Cast.enum(map["key_provider"], &WorkOS.VaultByokKeyProvider.cast/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "organization_id" => struct.organization_id, + "key_provider" => WorkOS.Cast.enum(struct.key_provider, &WorkOS.VaultByokKeyProvider.dump/1) + }) + end +end diff --git a/lib/workos/vault_byok_key_provider.ex b/lib/workos/vault_byok_key_provider.ex new file mode 100644 index 00000000..ab3a3872 --- /dev/null +++ b/lib/workos/vault_byok_key_provider.ex @@ -0,0 +1,27 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.VaultByokKeyProvider do + @moduledoc """ + VaultByokKeyProvider enum. + """ + + @type t :: :aws_kms | :gcp_kms | :azure_key_vault + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:aws_kms, :gcp_kms, :azure_key_vault] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("AWS_KMS"), do: :aws_kms + def cast("GCP_KMS"), do: :gcp_kms + def cast("AZURE_KEY_VAULT"), do: :azure_key_vault + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:aws_kms), do: "AWS_KMS" + def dump(:gcp_kms), do: "GCP_KMS" + def dump(:azure_key_vault), do: "AZURE_KEY_VAULT" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/vault_byok_key_verification_completed.ex b/lib/workos/vault_byok_key_verification_completed.ex new file mode 100644 index 00000000..2aad5d18 --- /dev/null +++ b/lib/workos/vault_byok_key_verification_completed.ex @@ -0,0 +1,56 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.VaultByokKeyVerificationCompleted do + @moduledoc """ + VaultByokKeyVerificationCompleted model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.VaultByokKeyVerificationCompletedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: + WorkOS.Cast.nested(map["data"], &WorkOS.VaultByokKeyVerificationCompletedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => + WorkOS.Cast.dump_struct( + struct.data, + &WorkOS.VaultByokKeyVerificationCompletedData.to_map/1 + ), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/vault_byok_key_verification_completed_data.ex b/lib/workos/vault_byok_key_verification_completed_data.ex new file mode 100644 index 00000000..55f16a1f --- /dev/null +++ b/lib/workos/vault_byok_key_verification_completed_data.ex @@ -0,0 +1,40 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.VaultByokKeyVerificationCompletedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :organization_id, + :key_provider, + :verified + ] + + @type t :: %__MODULE__{ + organization_id: String.t(), + key_provider: WorkOS.VaultByokKeyProvider.t(), + verified: boolean() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + organization_id: map["organization_id"], + key_provider: WorkOS.Cast.enum(map["key_provider"], &WorkOS.VaultByokKeyProvider.cast/1), + verified: map["verified"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "organization_id" => struct.organization_id, + "key_provider" => + WorkOS.Cast.enum(struct.key_provider, &WorkOS.VaultByokKeyProvider.dump/1), + "verified" => struct.verified + }) + end +end diff --git a/lib/workos/vault_data_created.ex b/lib/workos/vault_data_created.ex new file mode 100644 index 00000000..fc2422f8 --- /dev/null +++ b/lib/workos/vault_data_created.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.VaultDataCreated do + @moduledoc """ + VaultDataCreated model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.VaultDataCreatedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.VaultDataCreatedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => WorkOS.Cast.dump_struct(struct.data, &WorkOS.VaultDataCreatedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/vault_data_created_data.ex b/lib/workos/vault_data_created_data.ex new file mode 100644 index 00000000..eae94cc5 --- /dev/null +++ b/lib/workos/vault_data_created_data.ex @@ -0,0 +1,53 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.VaultDataCreatedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :actor_id, + :actor_source, + :actor_name, + :kv_name, + :key_id, + :key_context + ] + + @type t :: %__MODULE__{ + actor_id: String.t(), + actor_source: WorkOS.VaultDataCreatedDataActorSource.t(), + actor_name: String.t(), + kv_name: String.t(), + key_id: String.t(), + key_context: %{optional(String.t()) => String.t()} + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + actor_id: map["actor_id"], + actor_source: + WorkOS.Cast.enum(map["actor_source"], &WorkOS.VaultDataCreatedDataActorSource.cast/1), + actor_name: map["actor_name"], + kv_name: map["kv_name"], + key_id: map["key_id"], + key_context: map["key_context"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "actor_id" => struct.actor_id, + "actor_source" => + WorkOS.Cast.enum(struct.actor_source, &WorkOS.VaultDataCreatedDataActorSource.dump/1), + "actor_name" => struct.actor_name, + "kv_name" => struct.kv_name, + "key_id" => struct.key_id, + "key_context" => struct.key_context + }) + end +end diff --git a/lib/workos/vault_data_created_data_actor_source.ex b/lib/workos/vault_data_created_data_actor_source.ex new file mode 100644 index 00000000..4e06120f --- /dev/null +++ b/lib/workos/vault_data_created_data_actor_source.ex @@ -0,0 +1,25 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.VaultDataCreatedDataActorSource do + @moduledoc """ + VaultDataCreatedDataActorSource enum. + """ + + @type t :: :api | :dashboard + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:api, :dashboard] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("api"), do: :api + def cast("dashboard"), do: :dashboard + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:api), do: "api" + def dump(:dashboard), do: "dashboard" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/vault_data_deleted.ex b/lib/workos/vault_data_deleted.ex new file mode 100644 index 00000000..5523b1c3 --- /dev/null +++ b/lib/workos/vault_data_deleted.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.VaultDataDeleted do + @moduledoc """ + VaultDataDeleted model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.VaultDataDeletedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.VaultDataDeletedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => WorkOS.Cast.dump_struct(struct.data, &WorkOS.VaultDataDeletedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/vault_data_deleted_data.ex b/lib/workos/vault_data_deleted_data.ex new file mode 100644 index 00000000..5c0b8d1b --- /dev/null +++ b/lib/workos/vault_data_deleted_data.ex @@ -0,0 +1,45 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.VaultDataDeletedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :actor_id, + :actor_source, + :actor_name, + :kv_name + ] + + @type t :: %__MODULE__{ + actor_id: String.t(), + actor_source: WorkOS.VaultDataDeletedDataActorSource.t(), + actor_name: String.t(), + kv_name: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + actor_id: map["actor_id"], + actor_source: + WorkOS.Cast.enum(map["actor_source"], &WorkOS.VaultDataDeletedDataActorSource.cast/1), + actor_name: map["actor_name"], + kv_name: map["kv_name"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "actor_id" => struct.actor_id, + "actor_source" => + WorkOS.Cast.enum(struct.actor_source, &WorkOS.VaultDataDeletedDataActorSource.dump/1), + "actor_name" => struct.actor_name, + "kv_name" => struct.kv_name + }) + end +end diff --git a/lib/workos/vault_data_deleted_data_actor_source.ex b/lib/workos/vault_data_deleted_data_actor_source.ex new file mode 100644 index 00000000..2a6f3f94 --- /dev/null +++ b/lib/workos/vault_data_deleted_data_actor_source.ex @@ -0,0 +1,25 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.VaultDataDeletedDataActorSource do + @moduledoc """ + VaultDataDeletedDataActorSource enum. + """ + + @type t :: :api | :dashboard + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:api, :dashboard] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("api"), do: :api + def cast("dashboard"), do: :dashboard + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:api), do: "api" + def dump(:dashboard), do: "dashboard" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/vault_data_read.ex b/lib/workos/vault_data_read.ex new file mode 100644 index 00000000..3d367244 --- /dev/null +++ b/lib/workos/vault_data_read.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.VaultDataRead do + @moduledoc """ + VaultDataRead model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.VaultDataReadData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.VaultDataReadData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => WorkOS.Cast.dump_struct(struct.data, &WorkOS.VaultDataReadData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/vault_data_read_data.ex b/lib/workos/vault_data_read_data.ex new file mode 100644 index 00000000..b2a08195 --- /dev/null +++ b/lib/workos/vault_data_read_data.ex @@ -0,0 +1,49 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.VaultDataReadData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :actor_id, + :actor_source, + :actor_name, + :kv_name, + :key_id + ] + + @type t :: %__MODULE__{ + actor_id: String.t(), + actor_source: WorkOS.VaultDataReadDataActorSource.t(), + actor_name: String.t(), + kv_name: String.t(), + key_id: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + actor_id: map["actor_id"], + actor_source: + WorkOS.Cast.enum(map["actor_source"], &WorkOS.VaultDataReadDataActorSource.cast/1), + actor_name: map["actor_name"], + kv_name: map["kv_name"], + key_id: map["key_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "actor_id" => struct.actor_id, + "actor_source" => + WorkOS.Cast.enum(struct.actor_source, &WorkOS.VaultDataReadDataActorSource.dump/1), + "actor_name" => struct.actor_name, + "kv_name" => struct.kv_name, + "key_id" => struct.key_id + }) + end +end diff --git a/lib/workos/vault_data_read_data_actor_source.ex b/lib/workos/vault_data_read_data_actor_source.ex new file mode 100644 index 00000000..902f95b1 --- /dev/null +++ b/lib/workos/vault_data_read_data_actor_source.ex @@ -0,0 +1,25 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.VaultDataReadDataActorSource do + @moduledoc """ + VaultDataReadDataActorSource enum. + """ + + @type t :: :api | :dashboard + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:api, :dashboard] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("api"), do: :api + def cast("dashboard"), do: :dashboard + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:api), do: "api" + def dump(:dashboard), do: "dashboard" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/vault_data_updated.ex b/lib/workos/vault_data_updated.ex new file mode 100644 index 00000000..97ee3786 --- /dev/null +++ b/lib/workos/vault_data_updated.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.VaultDataUpdated do + @moduledoc """ + VaultDataUpdated model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.VaultDataUpdatedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.VaultDataUpdatedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => WorkOS.Cast.dump_struct(struct.data, &WorkOS.VaultDataUpdatedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/vault_data_updated_data.ex b/lib/workos/vault_data_updated_data.ex new file mode 100644 index 00000000..6a5c6e44 --- /dev/null +++ b/lib/workos/vault_data_updated_data.ex @@ -0,0 +1,53 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.VaultDataUpdatedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :actor_id, + :actor_source, + :actor_name, + :kv_name, + :key_id, + :key_context + ] + + @type t :: %__MODULE__{ + actor_id: String.t(), + actor_source: WorkOS.VaultDataUpdatedDataActorSource.t(), + actor_name: String.t(), + kv_name: String.t(), + key_id: String.t(), + key_context: %{optional(String.t()) => String.t()} + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + actor_id: map["actor_id"], + actor_source: + WorkOS.Cast.enum(map["actor_source"], &WorkOS.VaultDataUpdatedDataActorSource.cast/1), + actor_name: map["actor_name"], + kv_name: map["kv_name"], + key_id: map["key_id"], + key_context: map["key_context"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "actor_id" => struct.actor_id, + "actor_source" => + WorkOS.Cast.enum(struct.actor_source, &WorkOS.VaultDataUpdatedDataActorSource.dump/1), + "actor_name" => struct.actor_name, + "kv_name" => struct.kv_name, + "key_id" => struct.key_id, + "key_context" => struct.key_context + }) + end +end diff --git a/lib/workos/vault_data_updated_data_actor_source.ex b/lib/workos/vault_data_updated_data_actor_source.ex new file mode 100644 index 00000000..c9e7f795 --- /dev/null +++ b/lib/workos/vault_data_updated_data_actor_source.ex @@ -0,0 +1,25 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.VaultDataUpdatedDataActorSource do + @moduledoc """ + VaultDataUpdatedDataActorSource enum. + """ + + @type t :: :api | :dashboard + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:api, :dashboard] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("api"), do: :api + def cast("dashboard"), do: :dashboard + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:api), do: "api" + def dump(:dashboard), do: "dashboard" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/vault_dek_decrypted.ex b/lib/workos/vault_dek_decrypted.ex new file mode 100644 index 00000000..c6e8584b --- /dev/null +++ b/lib/workos/vault_dek_decrypted.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.VaultDekDecrypted do + @moduledoc """ + VaultDekDecrypted model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.VaultDekDecryptedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.VaultDekDecryptedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => WorkOS.Cast.dump_struct(struct.data, &WorkOS.VaultDekDecryptedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/vault_dek_decrypted_data.ex b/lib/workos/vault_dek_decrypted_data.ex new file mode 100644 index 00000000..544a7c24 --- /dev/null +++ b/lib/workos/vault_dek_decrypted_data.ex @@ -0,0 +1,45 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.VaultDekDecryptedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :actor_id, + :actor_source, + :actor_name, + :key_id + ] + + @type t :: %__MODULE__{ + actor_id: String.t(), + actor_source: WorkOS.VaultDekDecryptedDataActorSource.t(), + actor_name: String.t(), + key_id: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + actor_id: map["actor_id"], + actor_source: + WorkOS.Cast.enum(map["actor_source"], &WorkOS.VaultDekDecryptedDataActorSource.cast/1), + actor_name: map["actor_name"], + key_id: map["key_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "actor_id" => struct.actor_id, + "actor_source" => + WorkOS.Cast.enum(struct.actor_source, &WorkOS.VaultDekDecryptedDataActorSource.dump/1), + "actor_name" => struct.actor_name, + "key_id" => struct.key_id + }) + end +end diff --git a/lib/workos/vault_dek_decrypted_data_actor_source.ex b/lib/workos/vault_dek_decrypted_data_actor_source.ex new file mode 100644 index 00000000..7af3af35 --- /dev/null +++ b/lib/workos/vault_dek_decrypted_data_actor_source.ex @@ -0,0 +1,25 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.VaultDekDecryptedDataActorSource do + @moduledoc """ + VaultDekDecryptedDataActorSource enum. + """ + + @type t :: :api | :dashboard + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:api, :dashboard] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("api"), do: :api + def cast("dashboard"), do: :dashboard + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:api), do: "api" + def dump(:dashboard), do: "dashboard" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/vault_dek_read.ex b/lib/workos/vault_dek_read.ex new file mode 100644 index 00000000..8a4bb7b0 --- /dev/null +++ b/lib/workos/vault_dek_read.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.VaultDekRead do + @moduledoc """ + VaultDekRead model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.VaultDekReadData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.VaultDekReadData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => WorkOS.Cast.dump_struct(struct.data, &WorkOS.VaultDekReadData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/vault_dek_read_data.ex b/lib/workos/vault_dek_read_data.ex new file mode 100644 index 00000000..59b4180d --- /dev/null +++ b/lib/workos/vault_dek_read_data.ex @@ -0,0 +1,49 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.VaultDekReadData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :actor_id, + :actor_source, + :actor_name, + :key_ids, + :key_context + ] + + @type t :: %__MODULE__{ + actor_id: String.t(), + actor_source: WorkOS.VaultDekReadDataActorSource.t(), + actor_name: String.t(), + key_ids: [String.t()], + key_context: %{optional(String.t()) => String.t()} + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + actor_id: map["actor_id"], + actor_source: + WorkOS.Cast.enum(map["actor_source"], &WorkOS.VaultDekReadDataActorSource.cast/1), + actor_name: map["actor_name"], + key_ids: map["key_ids"], + key_context: map["key_context"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "actor_id" => struct.actor_id, + "actor_source" => + WorkOS.Cast.enum(struct.actor_source, &WorkOS.VaultDekReadDataActorSource.dump/1), + "actor_name" => struct.actor_name, + "key_ids" => struct.key_ids, + "key_context" => struct.key_context + }) + end +end diff --git a/lib/workos/vault_dek_read_data_actor_source.ex b/lib/workos/vault_dek_read_data_actor_source.ex new file mode 100644 index 00000000..3d5f6a5c --- /dev/null +++ b/lib/workos/vault_dek_read_data_actor_source.ex @@ -0,0 +1,25 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.VaultDekReadDataActorSource do + @moduledoc """ + VaultDekReadDataActorSource enum. + """ + + @type t :: :api | :dashboard + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:api, :dashboard] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("api"), do: :api + def cast("dashboard"), do: :dashboard + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:api), do: "api" + def dump(:dashboard), do: "dashboard" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/vault_kek_created.ex b/lib/workos/vault_kek_created.ex new file mode 100644 index 00000000..fc755734 --- /dev/null +++ b/lib/workos/vault_kek_created.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.VaultKekCreated do + @moduledoc """ + VaultKekCreated model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.VaultKekCreatedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.VaultKekCreatedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => WorkOS.Cast.dump_struct(struct.data, &WorkOS.VaultKekCreatedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/vault_kek_created_data.ex b/lib/workos/vault_kek_created_data.ex new file mode 100644 index 00000000..b47d89a4 --- /dev/null +++ b/lib/workos/vault_kek_created_data.ex @@ -0,0 +1,49 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.VaultKekCreatedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :actor_id, + :actor_source, + :actor_name, + :key_name, + :key_id + ] + + @type t :: %__MODULE__{ + actor_id: String.t(), + actor_source: WorkOS.VaultKekCreatedDataActorSource.t(), + actor_name: String.t(), + key_name: String.t(), + key_id: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + actor_id: map["actor_id"], + actor_source: + WorkOS.Cast.enum(map["actor_source"], &WorkOS.VaultKekCreatedDataActorSource.cast/1), + actor_name: map["actor_name"], + key_name: map["key_name"], + key_id: map["key_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "actor_id" => struct.actor_id, + "actor_source" => + WorkOS.Cast.enum(struct.actor_source, &WorkOS.VaultKekCreatedDataActorSource.dump/1), + "actor_name" => struct.actor_name, + "key_name" => struct.key_name, + "key_id" => struct.key_id + }) + end +end diff --git a/lib/workos/vault_kek_created_data_actor_source.ex b/lib/workos/vault_kek_created_data_actor_source.ex new file mode 100644 index 00000000..3ce212e3 --- /dev/null +++ b/lib/workos/vault_kek_created_data_actor_source.ex @@ -0,0 +1,25 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.VaultKekCreatedDataActorSource do + @moduledoc """ + VaultKekCreatedDataActorSource enum. + """ + + @type t :: :api | :dashboard + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:api, :dashboard] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("api"), do: :api + def cast("dashboard"), do: :dashboard + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:api), do: "api" + def dump(:dashboard), do: "dashboard" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/vault_kek_deleted.ex b/lib/workos/vault_kek_deleted.ex new file mode 100644 index 00000000..3f88e8f0 --- /dev/null +++ b/lib/workos/vault_kek_deleted.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.VaultKekDeleted do + @moduledoc """ + VaultKekDeleted model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.VaultKekDeletedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.VaultKekDeletedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => WorkOS.Cast.dump_struct(struct.data, &WorkOS.VaultKekDeletedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/vault_kek_deleted_data.ex b/lib/workos/vault_kek_deleted_data.ex new file mode 100644 index 00000000..18cb2471 --- /dev/null +++ b/lib/workos/vault_kek_deleted_data.ex @@ -0,0 +1,49 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.VaultKekDeletedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :actor_id, + :actor_source, + :actor_name, + :key_name, + :key_id + ] + + @type t :: %__MODULE__{ + actor_id: String.t(), + actor_source: WorkOS.VaultKekDeletedDataActorSource.t(), + actor_name: String.t(), + key_name: String.t(), + key_id: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + actor_id: map["actor_id"], + actor_source: + WorkOS.Cast.enum(map["actor_source"], &WorkOS.VaultKekDeletedDataActorSource.cast/1), + actor_name: map["actor_name"], + key_name: map["key_name"], + key_id: map["key_id"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "actor_id" => struct.actor_id, + "actor_source" => + WorkOS.Cast.enum(struct.actor_source, &WorkOS.VaultKekDeletedDataActorSource.dump/1), + "actor_name" => struct.actor_name, + "key_name" => struct.key_name, + "key_id" => struct.key_id + }) + end +end diff --git a/lib/workos/vault_kek_deleted_data_actor_source.ex b/lib/workos/vault_kek_deleted_data_actor_source.ex new file mode 100644 index 00000000..9c6efba5 --- /dev/null +++ b/lib/workos/vault_kek_deleted_data_actor_source.ex @@ -0,0 +1,25 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.VaultKekDeletedDataActorSource do + @moduledoc """ + VaultKekDeletedDataActorSource enum. + """ + + @type t :: :api | :dashboard + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:api, :dashboard] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("api"), do: :api + def cast("dashboard"), do: :dashboard + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:api), do: "api" + def dump(:dashboard), do: "dashboard" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/vault_metadata_read.ex b/lib/workos/vault_metadata_read.ex new file mode 100644 index 00000000..40004e5d --- /dev/null +++ b/lib/workos/vault_metadata_read.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.VaultMetadataRead do + @moduledoc """ + VaultMetadataRead model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.VaultMetadataReadData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.VaultMetadataReadData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => WorkOS.Cast.dump_struct(struct.data, &WorkOS.VaultMetadataReadData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/vault_metadata_read_data.ex b/lib/workos/vault_metadata_read_data.ex new file mode 100644 index 00000000..9f5aee22 --- /dev/null +++ b/lib/workos/vault_metadata_read_data.ex @@ -0,0 +1,45 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.VaultMetadataReadData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :actor_id, + :actor_source, + :actor_name, + :kv_name + ] + + @type t :: %__MODULE__{ + actor_id: String.t(), + actor_source: WorkOS.VaultMetadataReadDataActorSource.t(), + actor_name: String.t(), + kv_name: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + actor_id: map["actor_id"], + actor_source: + WorkOS.Cast.enum(map["actor_source"], &WorkOS.VaultMetadataReadDataActorSource.cast/1), + actor_name: map["actor_name"], + kv_name: map["kv_name"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "actor_id" => struct.actor_id, + "actor_source" => + WorkOS.Cast.enum(struct.actor_source, &WorkOS.VaultMetadataReadDataActorSource.dump/1), + "actor_name" => struct.actor_name, + "kv_name" => struct.kv_name + }) + end +end diff --git a/lib/workos/vault_metadata_read_data_actor_source.ex b/lib/workos/vault_metadata_read_data_actor_source.ex new file mode 100644 index 00000000..448b68a2 --- /dev/null +++ b/lib/workos/vault_metadata_read_data_actor_source.ex @@ -0,0 +1,25 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.VaultMetadataReadDataActorSource do + @moduledoc """ + VaultMetadataReadDataActorSource enum. + """ + + @type t :: :api | :dashboard + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:api, :dashboard] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("api"), do: :api + def cast("dashboard"), do: :dashboard + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:api), do: "api" + def dump(:dashboard), do: "dashboard" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/vault_names_listed.ex b/lib/workos/vault_names_listed.ex new file mode 100644 index 00000000..7207a2b4 --- /dev/null +++ b/lib/workos/vault_names_listed.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.VaultNamesListed do + @moduledoc """ + VaultNamesListed model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.VaultNamesListedData.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.VaultNamesListedData.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => WorkOS.Cast.dump_struct(struct.data, &WorkOS.VaultNamesListedData.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/vault_names_listed_data.ex b/lib/workos/vault_names_listed_data.ex new file mode 100644 index 00000000..85dfebec --- /dev/null +++ b/lib/workos/vault_names_listed_data.ex @@ -0,0 +1,41 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.VaultNamesListedData do + @moduledoc """ + The event payload. + """ + + defstruct [ + :actor_id, + :actor_source, + :actor_name + ] + + @type t :: %__MODULE__{ + actor_id: String.t(), + actor_source: WorkOS.VaultNamesListedDataActorSource.t(), + actor_name: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + actor_id: map["actor_id"], + actor_source: + WorkOS.Cast.enum(map["actor_source"], &WorkOS.VaultNamesListedDataActorSource.cast/1), + actor_name: map["actor_name"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "actor_id" => struct.actor_id, + "actor_source" => + WorkOS.Cast.enum(struct.actor_source, &WorkOS.VaultNamesListedDataActorSource.dump/1), + "actor_name" => struct.actor_name + }) + end +end diff --git a/lib/workos/vault_names_listed_data_actor_source.ex b/lib/workos/vault_names_listed_data_actor_source.ex new file mode 100644 index 00000000..fd9ae2ec --- /dev/null +++ b/lib/workos/vault_names_listed_data_actor_source.ex @@ -0,0 +1,25 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.VaultNamesListedDataActorSource do + @moduledoc """ + VaultNamesListedDataActorSource enum. + """ + + @type t :: :api | :dashboard + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:api, :dashboard] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("api"), do: :api + def cast("dashboard"), do: :dashboard + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:api), do: "api" + def dump(:dashboard), do: "dashboard" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/vault_object.ex b/lib/workos/vault_object.ex new file mode 100644 index 00000000..337ecee3 --- /dev/null +++ b/lib/workos/vault_object.ex @@ -0,0 +1,43 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.VaultObject do + @moduledoc """ + An encrypted object with its decrypted value and metadata. + """ + + defstruct [ + :id, + :metadata, + :name, + :value + ] + + @type t :: %__MODULE__{ + id: String.t(), + metadata: WorkOS.ObjectMetadata.t(), + name: String.t(), + value: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + id: map["id"], + metadata: WorkOS.Cast.nested(map["metadata"], &WorkOS.ObjectMetadata.from_map/1), + name: map["name"], + value: map["value"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "id" => struct.id, + "metadata" => WorkOS.Cast.dump_struct(struct.metadata, &WorkOS.ObjectMetadata.to_map/1), + "name" => struct.name, + "value" => struct.value + }) + end +end diff --git a/lib/workos/vault_order.ex b/lib/workos/vault_order.ex new file mode 100644 index 00000000..5e39323f --- /dev/null +++ b/lib/workos/vault_order.ex @@ -0,0 +1,25 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.VaultOrder do + @moduledoc """ + VaultOrder enum. + """ + + @type t :: :asc | :desc + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:asc, :desc] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("asc"), do: :asc + def cast("desc"), do: :desc + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:asc), do: "asc" + def dump(:desc), do: "desc" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/verify_email_address.ex b/lib/workos/verify_email_address.ex new file mode 100644 index 00000000..3beb4be9 --- /dev/null +++ b/lib/workos/verify_email_address.ex @@ -0,0 +1,31 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.VerifyEmailAddress do + @moduledoc """ + VerifyEmailAddress model. + """ + + defstruct [ + :code + ] + + @type t :: %__MODULE__{ + code: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + code: map["code"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "code" => struct.code + }) + end +end diff --git a/lib/workos/verify_email_response.ex b/lib/workos/verify_email_response.ex new file mode 100644 index 00000000..3f43451b --- /dev/null +++ b/lib/workos/verify_email_response.ex @@ -0,0 +1,31 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.VerifyEmailResponse do + @moduledoc """ + VerifyEmailResponse model. + """ + + defstruct [ + :user + ] + + @type t :: %__MODULE__{ + user: WorkOS.User.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + user: WorkOS.Cast.nested(map["user"], &WorkOS.User.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "user" => WorkOS.Cast.dump_struct(struct.user, &WorkOS.User.to_map/1) + }) + end +end diff --git a/lib/workos/version_list_response.ex b/lib/workos/version_list_response.ex new file mode 100644 index 00000000..2106ae0f --- /dev/null +++ b/lib/workos/version_list_response.ex @@ -0,0 +1,39 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.VersionListResponse do + @moduledoc """ + VersionListResponse model. + """ + + defstruct [ + :data, + :list_metadata + ] + + @type t :: %__MODULE__{ + data: [WorkOS.ObjectVersion.t()], + list_metadata: WorkOS.ListMetadata.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + data: WorkOS.Cast.list(map["data"], &WorkOS.ObjectVersion.from_map/1), + list_metadata: WorkOS.Cast.nested(map["list_metadata"], &WorkOS.ListMetadata.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "data" => + WorkOS.Cast.list(struct.data, fn item -> + WorkOS.Cast.dump_struct(item, &WorkOS.ObjectVersion.to_map/1) + end), + "list_metadata" => + WorkOS.Cast.dump_struct(struct.list_metadata, &WorkOS.ListMetadata.to_map/1) + }) + end +end diff --git a/lib/workos/waitlist_user.ex b/lib/workos/waitlist_user.ex new file mode 100644 index 00000000..5393b889 --- /dev/null +++ b/lib/workos/waitlist_user.ex @@ -0,0 +1,55 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.WaitlistUser do + @moduledoc """ + WaitlistUser model. + """ + + defstruct [ + :object, + :id, + :email, + :state, + :approved_at, + :created_at, + :updated_at + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + email: String.t(), + state: WorkOS.WaitlistUserState.t(), + approved_at: String.t() | nil, + created_at: String.t(), + updated_at: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + email: map["email"], + state: WorkOS.Cast.enum(map["state"], &WorkOS.WaitlistUserState.cast/1), + approved_at: map["approved_at"], + created_at: map["created_at"], + updated_at: map["updated_at"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "email" => struct.email, + "state" => WorkOS.Cast.enum(struct.state, &WorkOS.WaitlistUserState.dump/1), + "approved_at" => struct.approved_at, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at + }) + end +end diff --git a/lib/workos/waitlist_user_approved.ex b/lib/workos/waitlist_user_approved.ex new file mode 100644 index 00000000..6d7ce02e --- /dev/null +++ b/lib/workos/waitlist_user_approved.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.WaitlistUserApproved do + @moduledoc """ + WaitlistUserApproved model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.WaitlistUser.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.WaitlistUser.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => WorkOS.Cast.dump_struct(struct.data, &WorkOS.WaitlistUser.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/waitlist_user_created.ex b/lib/workos/waitlist_user_created.ex new file mode 100644 index 00000000..0f280545 --- /dev/null +++ b/lib/workos/waitlist_user_created.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.WaitlistUserCreated do + @moduledoc """ + WaitlistUserCreated model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.WaitlistUser.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.WaitlistUser.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => WorkOS.Cast.dump_struct(struct.data, &WorkOS.WaitlistUser.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/waitlist_user_denied.ex b/lib/workos/waitlist_user_denied.ex new file mode 100644 index 00000000..7e691b03 --- /dev/null +++ b/lib/workos/waitlist_user_denied.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.WaitlistUserDenied do + @moduledoc """ + WaitlistUserDenied model. + """ + + defstruct [ + :object, + :id, + :event, + :data, + :created_at, + :context + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + event: String.t(), + data: WorkOS.WaitlistUser.t(), + created_at: String.t(), + context: WorkOS.EventContext.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + event: map["event"], + data: WorkOS.Cast.nested(map["data"], &WorkOS.WaitlistUser.from_map/1), + created_at: map["created_at"], + context: WorkOS.Cast.nested(map["context"], &WorkOS.EventContext.from_map/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "event" => struct.event, + "data" => WorkOS.Cast.dump_struct(struct.data, &WorkOS.WaitlistUser.to_map/1), + "created_at" => struct.created_at, + "context" => WorkOS.Cast.dump_struct(struct.context, &WorkOS.EventContext.to_map/1) + }) + end +end diff --git a/lib/workos/waitlist_user_state.ex b/lib/workos/waitlist_user_state.ex new file mode 100644 index 00000000..13e25b71 --- /dev/null +++ b/lib/workos/waitlist_user_state.ex @@ -0,0 +1,27 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.WaitlistUserState do + @moduledoc """ + WaitlistUserState enum. + """ + + @type t :: :pending | :approved | :denied + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:pending, :approved, :denied] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("pending"), do: :pending + def cast("approved"), do: :approved + def cast("denied"), do: :denied + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:pending), do: "pending" + def dump(:approved), do: "approved" + def dump(:denied), do: "denied" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/webhook_endpoint.ex b/lib/workos/webhook_endpoint.ex new file mode 100644 index 00000000..6f289cb6 --- /dev/null +++ b/lib/workos/webhook_endpoint.ex @@ -0,0 +1,59 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.WebhookEndpoint do + @moduledoc """ + WebhookEndpoint model. + """ + + defstruct [ + :object, + :id, + :endpoint_url, + :secret, + :status, + :events, + :created_at, + :updated_at + ] + + @type t :: %__MODULE__{ + object: String.t(), + id: String.t(), + endpoint_url: String.t(), + secret: String.t(), + status: WorkOS.WebhookEndpointStatus.t(), + events: [String.t()], + created_at: String.t(), + updated_at: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + id: map["id"], + endpoint_url: map["endpoint_url"], + secret: map["secret"], + status: WorkOS.Cast.enum(map["status"], &WorkOS.WebhookEndpointStatus.cast/1), + events: map["events"], + created_at: map["created_at"], + updated_at: map["updated_at"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "id" => struct.id, + "endpoint_url" => struct.endpoint_url, + "secret" => struct.secret, + "status" => WorkOS.Cast.enum(struct.status, &WorkOS.WebhookEndpointStatus.dump/1), + "events" => struct.events, + "created_at" => struct.created_at, + "updated_at" => struct.updated_at + }) + end +end diff --git a/lib/workos/webhook_endpoint_list.ex b/lib/workos/webhook_endpoint_list.ex new file mode 100644 index 00000000..da1696b7 --- /dev/null +++ b/lib/workos/webhook_endpoint_list.ex @@ -0,0 +1,50 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.WebhookEndpointList do + @moduledoc """ + WebhookEndpointList model. + """ + + defstruct [ + :object, + :data, + :list_metadata + ] + + @type t :: %__MODULE__{ + object: String.t(), + data: [WorkOS.WebhookEndpoint.t()], + list_metadata: WorkOS.WebhookEndpointListListMetadata.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + object: map["object"], + data: WorkOS.Cast.list(map["data"], &WorkOS.WebhookEndpoint.from_map/1), + list_metadata: + WorkOS.Cast.nested( + map["list_metadata"], + &WorkOS.WebhookEndpointListListMetadata.from_map/1 + ) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "object" => struct.object, + "data" => + WorkOS.Cast.list(struct.data, fn item -> + WorkOS.Cast.dump_struct(item, &WorkOS.WebhookEndpoint.to_map/1) + end), + "list_metadata" => + WorkOS.Cast.dump_struct( + struct.list_metadata, + &WorkOS.WebhookEndpointListListMetadata.to_map/1 + ) + }) + end +end diff --git a/lib/workos/webhook_endpoint_list_list_metadata.ex b/lib/workos/webhook_endpoint_list_list_metadata.ex new file mode 100644 index 00000000..959b6369 --- /dev/null +++ b/lib/workos/webhook_endpoint_list_list_metadata.ex @@ -0,0 +1,35 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.WebhookEndpointListListMetadata do + @moduledoc """ + Pagination cursors for navigating between pages of results. + """ + + defstruct [ + :before, + :after_ + ] + + @type t :: %__MODULE__{ + before: String.t() | nil, + after_: String.t() | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + before: map["before"], + after_: map["after"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "before" => struct.before, + "after" => struct.after_ + }) + end +end diff --git a/lib/workos/webhook_endpoint_status.ex b/lib/workos/webhook_endpoint_status.ex new file mode 100644 index 00000000..ad6686dd --- /dev/null +++ b/lib/workos/webhook_endpoint_status.ex @@ -0,0 +1,25 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.WebhookEndpointStatus do + @moduledoc """ + WebhookEndpointStatus enum. + """ + + @type t :: :enabled | :disabled + + @doc "All known values." + @spec values() :: [t()] + def values, do: [:enabled, :disabled] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("enabled"), do: :enabled + def cast("disabled"), do: :disabled + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:enabled), do: "enabled" + def dump(:disabled), do: "disabled" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/webhooks.ex b/lib/workos/webhooks.ex index cc73a6b7..65f8a3f8 100644 --- a/lib/workos/webhooks.ex +++ b/lib/workos/webhooks.ex @@ -1,144 +1,100 @@ +# This file is auto-generated by oagen. Do not edit. + defmodule WorkOS.Webhooks do @moduledoc """ - Manage timestamp and signature validation of Webhooks in WorkOS. - - See https://workos.com/docs/webhooks + Operations for the Webhooks API. """ - alias WorkOS.Webhooks.Event - @three_minute_default_tolerance 60 * 3 - @doc """ - Verify webhook payload and return an event. - - `payload` is the raw, unparsed content body sent by WorkOS, which can be - retrieved with `Plug.Conn.read_body/2`, Note that `Plug.Parsers` will read - and discard the body, so you must implement a [custom body reader][1] if the - plug is located earlier in the pipeline. - - `sigHeader` is the value of `workos-signature` header, which can be fetched - with `Plug.Conn.get_req_header/2`, i.e. `Plug.Conn.get_req_header(conn, "workos-signature")`. - - `secret` is your webhook endpoint's secret from the WorkOS Dashboard. - - `tolerance` is the allowed deviation in seconds from the current system time - to the timestamp found in `signature`. Defaults to 180 seconds (3 minutes). + List Webhook Endpoints - WorkOS API reference: - https://workos.com/docs/webhooks/securing-your-webhook-endpoint/validating-events-are-from-workos + Get a list of all of your existing webhook endpoints. - [1]: https://hexdocs.pm/plug/Plug.Parsers.html#module-custom-body-reader + ## Parameters - ## Example plug in your consuming application which places the constructed - event in the conn assigns - - defmodule MyAppWeb.WorkOSWebhooksPlug do - @behaviour Plug - - alias Plug.Conn - - def init(config), do: config - - # Match on any requests from workos, i.e. the Endpoint URL configured in - # the WorkOS Dashboard, adjust @request_path as appropriate - @request_path "/webhooks/workos" - def call(%{request_path: @request_path} = conn, _) do - signing_secret = Application.get_env(:workos, :webhook_signing_secret) - [worksos_signature] = Conn.get_req_header(conn, "workos-signature") - - with {:ok, body, _} <- Conn.read_body(conn), - {:ok, workos_event} <- - WorkOS.Webhooks.construct_event(body, worksos_signature, signing_secret) do - Conn.assign(conn, :workos_event, workos_event) - else - {:error, error} -> - conn - |> Conn.send_resp(:bad_request, error.message) - |> Conn.halt() + * `params` — query parameters: `:before`, `:after_`, `:limit`, `:order` + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec list_webhook_endpoints(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.Page.t(WorkOS.WebhookEndpointList.t())} | {:error, WorkOS.Error.error()} + def list_webhook_endpoints(client, params \\ %{}, opts \\ []) do + with {:ok, body} <- WorkOS.Client.request(client, :get, "/webhook_endpoints", params, opts) do + fetch_next = fn cursor -> + list_webhook_endpoints( + client, + WorkOS.Page.next_params(params, "after", cursor), + opts + ) end - end - def call(conn, _), do: conn + {:ok, + WorkOS.Page.from_map(body, "data", &WorkOS.WebhookEndpointList.from_map/1, fetch_next)} + end end - As per the aforementioned note about `Plug.Parsers` the above plug would need to - precede these in Endpoint.ex ... i.e. - - defmodule MyAppWeb.Endpoint do - ... - ... + @doc """ + Create a Webhook Endpoint - plug Plug.Telemetry, event_prefix: [:phoenix, :endpoint] + Create a new webhook endpoint to receive event notifications. - plug MyAppWeb.WorkOSWebhooksPlug + ## Parameters - plug Plug.Parsers, - parsers: [:urlencoded, :multipart, :json], - pass: ["*/*"], - json_decoder: Phoenix.json_library() - ... - ... + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) """ - @spec construct_event( - payload :: String.t(), - sigHeader :: String.t(), - secret :: String.t(), - tolerance :: pos_integer() - ) :: {:ok, payload :: map()} | {:error, message :: String.t()} - def construct_event(payload, sigHeader, secret, tolerance \\ @three_minute_default_tolerance) do - with {:ok, %{timestamp: timestamp, expected_signature_hash: expected_signature_hash}} <- - get_timestamp_and_expected_signature_hash(sigHeader), - :ok <- verify_time_tolerance(timestamp, tolerance), - {:ok, computed_signature_hash} <- compute_signature(timestamp, payload, secret), - :ok <- compare_signatures(computed_signature_hash, expected_signature_hash) do - {:ok, payload |> Jason.decode!() |> Event.new()} + @spec create_webhook_endpoint(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.WebhookEndpoint.t()} | {:error, WorkOS.Error.error()} + def create_webhook_endpoint(client, params \\ %{}, opts \\ []) do + with {:ok, body} <- WorkOS.Client.request(client, :post, "/webhook_endpoints", params, opts) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.WebhookEndpoint.from_map/1)} end end - defp compare_signatures(computed_signature_hash, expected_signature_hash) do - if Plug.Crypto.secure_compare(computed_signature_hash, expected_signature_hash) do - :ok - else - {:error, "Signature hash does not match the expected signature hash for payload"} - end - end + @doc """ + Update a Webhook Endpoint - defp compute_signature(timestamp, payload, secret) do - unhashed_string = "#{timestamp}.#{payload}" + Update the properties of an existing webhook endpoint. - computed_signature = - :crypto.mac(:hmac, :sha256, secret, unhashed_string) - |> Base.encode16(case: :lower) + ## Parameters - {:ok, computed_signature} + * `id` — Unique identifier of the Webhook Endpoint. + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec update_webhook_endpoint(WorkOS.Client.t(), String.t(), map(), keyword()) :: + {:ok, WorkOS.WebhookEndpoint.t()} | {:error, WorkOS.Error.error()} + def update_webhook_endpoint(client, id, params \\ %{}, opts \\ []) do + with {:ok, body} <- + WorkOS.Client.request( + client, + :patch, + "/webhook_endpoints/#{URI.encode(id, &URI.char_unreserved?/1)}", + params, + opts + ) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.WebhookEndpoint.from_map/1)} + end end - defp verify_time_tolerance(timestamp, tolerance) do - timestamp_date = DateTime.from_unix!(timestamp, :millisecond) + @doc """ + Delete a Webhook Endpoint - latest_allowed_date = DateTime.utc_now() |> DateTime.add(tolerance * -1) + Delete an existing webhook endpoint. - if DateTime.compare(timestamp_date, latest_allowed_date) == :gt do - :ok - else - {:error, "Timestamp outside the tolerance zone"} - end - end + ## Parameters - @expected_scheme "v1" - defp get_timestamp_and_expected_signature_hash(signature) do - parsed = - for pair <- String.split(signature, ","), - destructure([key, value], String.split(pair, "=", parts: 2)), - do: {key |> String.trim(), value}, - into: %{} - - with %{"t" => timestamp, @expected_scheme => signature_hash} <- parsed, - {timestamp, ""} <- Integer.parse(timestamp), - true <- String.length(signature_hash) > 0 do - {:ok, %{timestamp: timestamp, expected_signature_hash: signature_hash}} - else - _ -> {:error, "Signature or timestamp missing"} - end + * `id` — Unique identifier of the Webhook Endpoint. + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec delete_webhook_endpoint(WorkOS.Client.t(), String.t(), keyword()) :: + {:ok, term()} | {:error, WorkOS.Error.error()} + def delete_webhook_endpoint(client, id, opts \\ []) do + WorkOS.Client.request( + client, + :delete, + "/webhook_endpoints/#{URI.encode(id, &URI.char_unreserved?/1)}", + %{}, + opts + ) end end diff --git a/lib/workos/webhooks/event.ex b/lib/workos/webhooks/event.ex deleted file mode 100644 index b3875d5f..00000000 --- a/lib/workos/webhooks/event.ex +++ /dev/null @@ -1,32 +0,0 @@ -defmodule WorkOS.Webhooks.Event do - @moduledoc """ - Module to represent a webhook event - """ - - defstruct [:id, :event, :data] - - @spec new(map) :: %__MODULE__{} - def new(payload) do - processed_map = - [:id, :event, :data] - |> Enum.reduce(%{}, fn key, acc -> - string_key = to_string(key) - converted_value = Map.get(payload, string_key) |> convert_value() - Map.put(acc, key, converted_value) - end) - - struct(%__MODULE__{}, processed_map) - end - - defp convert_value(value) when is_map(value), do: convert_map(value) - defp convert_value(value) when is_list(value), do: convert_list(value) - defp convert_value(value), do: value - - defp convert_map(value) do - Enum.reduce(value, %{}, fn {key, value}, acc -> - Map.put(acc, String.to_atom(key), convert_value(value)) - end) - end - - defp convert_list(list), do: list |> Enum.map(&convert_value/1) -end diff --git a/lib/workos/webhooks/signature.ex b/lib/workos/webhooks/signature.ex new file mode 100644 index 00000000..b5a37213 --- /dev/null +++ b/lib/workos/webhooks/signature.ex @@ -0,0 +1,141 @@ +# @oagen-ignore-file — hand-maintained; client-side signature verification. + +defmodule WorkOS.Webhooks.Signature do + @moduledoc """ + WorkOS webhook signature verification. + + Verifies the `WorkOS-Signature` header (`"t=, v1="`) + against the raw request body and deserializes the payload into a + `WorkOS.EventSchema`. + + {:ok, event} = + WorkOS.Webhooks.Signature.construct_event(sig_header, raw_body, secret) + + Lower-level primitives (`parse_signature_header/1`, `compute_signature/3`, + `verify_payload/4`) are public for callers that need custom handling. + """ + + @default_tolerance_seconds 180 + + @typedoc "Reasons signature verification can fail." + @type verification_error :: + :not_signed + | :invalid_header + | :invalid_timestamp + | :outside_tolerance + | :no_valid_signature + | :invalid_json + + @typedoc """ + Verification options. + + * `:tolerance` — maximum age of the signature timestamp, in seconds + (default #{@default_tolerance_seconds}) + * `:now_ms` — current Unix time in milliseconds (defaults to the system + clock; injectable for tests) + """ + @type option :: {:tolerance, non_neg_integer()} | {:now_ms, integer()} + + @doc """ + Verifies the signature header and returns the deserialized event. + """ + @spec construct_event(String.t(), String.t(), String.t(), [option()]) :: + {:ok, WorkOS.EventSchema.t()} | {:error, verification_error()} + def construct_event(sig_header, body, secret, opts \\ []) do + with {:ok, verified} <- verify_payload(sig_header, body, secret, opts) do + case JSON.decode(verified) do + {:ok, decoded} when is_map(decoded) -> {:ok, WorkOS.EventSchema.from_map(decoded)} + _ -> {:error, :invalid_json} + end + end + end + + @doc """ + Verifies a signature header against the raw body and returns the verified + body on success. + """ + @spec verify_payload(String.t(), String.t(), String.t(), [option()]) :: + {:ok, String.t()} | {:error, verification_error()} + def verify_payload(sig_header, body, secret, opts \\ []) do + tolerance_ms = Keyword.get(opts, :tolerance, @default_tolerance_seconds) * 1000 + now_ms = Keyword.get_lazy(opts, :now_ms, fn -> System.system_time(:millisecond) end) + + with {:ok, timestamp, signature} <- parse_signature_header(sig_header), + {:ok, signed_at_ms} <- parse_timestamp(timestamp), + :ok <- check_tolerance(now_ms, signed_at_ms, tolerance_ms), + :ok <- check_signature(secret, timestamp, body, signature) do + {:ok, body} + end + end + + @doc """ + Computes the hex-encoded HMAC-SHA256 signature of `"."`. + """ + @spec compute_signature(String.t(), String.t(), String.t()) :: String.t() + def compute_signature(secret, timestamp, body) do + :hmac + |> :crypto.mac(:sha256, secret, "#{timestamp}.#{body}") + |> Base.encode16(case: :lower) + end + + @doc """ + Parses a `"t=, v1="` header into its parts. + """ + @spec parse_signature_header(String.t() | nil) :: + {:ok, String.t(), String.t()} | {:error, :not_signed | :invalid_header} + def parse_signature_header(header) when header in [nil, ""], do: {:error, :not_signed} + + def parse_signature_header(header) when is_binary(header) do + parts = + header + |> String.split(",") + |> Enum.map(fn part -> + case String.split(String.trim(part), "=", parts: 2) do + [key, value] -> {String.trim(key), String.trim(value)} + _ -> :invalid + end + end) + + if :invalid in parts do + {:error, :invalid_header} + else + pairs = Map.new(parts) + + case {pairs["t"], pairs["v1"]} do + {t, v1} when t in [nil, ""] or v1 in [nil, ""] -> {:error, :invalid_header} + {t, v1} -> {:ok, t, v1} + end + end + end + + defp parse_timestamp(timestamp) do + case Integer.parse(timestamp) do + {ms, ""} -> {:ok, ms} + _ -> {:error, :invalid_timestamp} + end + end + + defp check_tolerance(now_ms, signed_at_ms, tolerance_ms) do + if abs(now_ms - signed_at_ms) > tolerance_ms do + {:error, :outside_tolerance} + else + :ok + end + end + + defp check_signature(secret, timestamp, body, signature) do + expected = compute_signature(secret, timestamp, body) + + if secure_compare(expected, signature) do + :ok + else + {:error, :no_valid_signature} + end + end + + # Constant-time comparison to prevent timing attacks. + defp secure_compare(a, b) when byte_size(a) == byte_size(b), + do: :crypto.hash_equals(a, b) + + defp secure_compare(_a, _b), do: false +end diff --git a/lib/workos/widget_session_token.ex b/lib/workos/widget_session_token.ex new file mode 100644 index 00000000..f3058be2 --- /dev/null +++ b/lib/workos/widget_session_token.ex @@ -0,0 +1,39 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.WidgetSessionToken do + @moduledoc """ + WidgetSessionToken model. + """ + + defstruct [ + :organization_id, + :user_id, + :scopes + ] + + @type t :: %__MODULE__{ + organization_id: String.t() | nil, + user_id: String.t() | nil, + scopes: [WorkOS.WidgetSessionTokenScopes.t()] | nil + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + organization_id: map["organization_id"], + user_id: map["user_id"], + scopes: WorkOS.Cast.list(map["scopes"], &WorkOS.WidgetSessionTokenScopes.cast/1) + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "organization_id" => struct.organization_id, + "user_id" => struct.user_id, + "scopes" => WorkOS.Cast.list(struct.scopes, &WorkOS.WidgetSessionTokenScopes.dump/1) + }) + end +end diff --git a/lib/workos/widget_session_token_response.ex b/lib/workos/widget_session_token_response.ex new file mode 100644 index 00000000..2b1acad5 --- /dev/null +++ b/lib/workos/widget_session_token_response.ex @@ -0,0 +1,31 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.WidgetSessionTokenResponse do + @moduledoc """ + WidgetSessionTokenResponse model. + """ + + defstruct [ + :token + ] + + @type t :: %__MODULE__{ + token: String.t() + } + + @doc false + @spec from_map(map()) :: t() + def from_map(map) when is_map(map) do + %__MODULE__{ + token: map["token"] + } + end + + @doc false + @spec to_map(t()) :: map() + def to_map(%__MODULE__{} = struct) do + WorkOS.Cast.drop_nils(%{ + "token" => struct.token + }) + end +end diff --git a/lib/workos/widget_session_token_scopes.ex b/lib/workos/widget_session_token_scopes.ex new file mode 100644 index 00000000..1e6e6089 --- /dev/null +++ b/lib/workos/widget_session_token_scopes.ex @@ -0,0 +1,51 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.WidgetSessionTokenScopes do + @moduledoc """ + WidgetSessionTokenScopes enum. + """ + + @type t :: + :widgets_users_table_manage + | :widgets_domain_verification_manage + | :widgets_sso_manage + | :widgets_api_keys_manage + | :widgets_dsync_manage + | :widgets_audit_log_streaming_manage + | :widgets_pipes_manage + + @doc "All known values." + @spec values() :: [t()] + def values, + do: [ + :widgets_users_table_manage, + :widgets_domain_verification_manage, + :widgets_sso_manage, + :widgets_api_keys_manage, + :widgets_dsync_manage, + :widgets_audit_log_streaming_manage, + :widgets_pipes_manage + ] + + @doc "Casts a wire string to its atom; unknown values pass through unchanged." + @spec cast(String.t() | nil) :: t() | String.t() | nil + def cast("widgets:users-table:manage"), do: :widgets_users_table_manage + def cast("widgets:domain-verification:manage"), do: :widgets_domain_verification_manage + def cast("widgets:sso:manage"), do: :widgets_sso_manage + def cast("widgets:api-keys:manage"), do: :widgets_api_keys_manage + def cast("widgets:dsync:manage"), do: :widgets_dsync_manage + def cast("widgets:audit-log-streaming:manage"), do: :widgets_audit_log_streaming_manage + def cast("widgets:pipes:manage"), do: :widgets_pipes_manage + def cast(other), do: other + + @doc "Dumps an atom back to its wire string." + @spec dump(t() | String.t()) :: String.t() + def dump(:widgets_users_table_manage), do: "widgets:users-table:manage" + def dump(:widgets_domain_verification_manage), do: "widgets:domain-verification:manage" + def dump(:widgets_sso_manage), do: "widgets:sso:manage" + def dump(:widgets_api_keys_manage), do: "widgets:api-keys:manage" + def dump(:widgets_dsync_manage), do: "widgets:dsync:manage" + def dump(:widgets_audit_log_streaming_manage), do: "widgets:audit-log-streaming:manage" + def dump(:widgets_pipes_manage), do: "widgets:pipes:manage" + def dump(other) when is_binary(other), do: other +end diff --git a/lib/workos/widgets.ex b/lib/workos/widgets.ex new file mode 100644 index 00000000..836f5f54 --- /dev/null +++ b/lib/workos/widgets.ex @@ -0,0 +1,25 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.Widgets do + @moduledoc """ + Operations for the Widgets API. + """ + + @doc """ + Generate a widget token + + Generate a widget token for a user, optionally scoped to an organization. When an organization is specified, org-scoped widgets are enabled; omitting it issues a user-only token for widgets like `UserProfile` and `UserSecurity`. + + ## Parameters + + * `params` — request body map + * `opts` — per-request options (see `WorkOS.Client.request/5`) + """ + @spec create_token(WorkOS.Client.t(), map(), keyword()) :: + {:ok, WorkOS.WidgetSessionTokenResponse.t()} | {:error, WorkOS.Error.error()} + def create_token(client, params \\ %{}, opts \\ []) do + with {:ok, body} <- WorkOS.Client.request(client, :post, "/widgets/token", params, opts) do + {:ok, WorkOS.Cast.nested(body, &WorkOS.WidgetSessionTokenResponse.from_map/1)} + end + end +end diff --git a/mix.exs b/mix.exs old mode 100755 new mode 100644 index 23f8ac72..43c53cb3 --- a/mix.exs +++ b/mix.exs @@ -9,14 +9,13 @@ defmodule WorkOS.MixProject do app: :workos, version: @version, name: "WorkOS SDK for Elixir", - elixir: "~> 1.16", + elixir: "~> 1.18", elixirc_paths: elixirc_paths(Mix.env()), start_permanent: Mix.env() == :prod, description: description(), package: package(), docs: docs(), deps: deps(), - source_ref: "#{@version}", dialyzer: [ flags: [:unmatched_returns, :error_handling, :extra_return], plt_file: {:no_warn, "plts/dialyzer.plt"}, @@ -33,7 +32,7 @@ defmodule WorkOS.MixProject do """ end - defp package() do + defp package do [ description: description(), licenses: ["MIT"], @@ -51,96 +50,31 @@ defmodule WorkOS.MixProject do ] end - # Run "mix help compile.app" to learn about applications. def application do - [ - extra_applications: [:logger] - ] + [extra_applications: [:logger, :crypto]] end - # Specifies which paths to compile per environment. defp elixirc_paths(:test), do: ["lib", "test/support"] defp elixirc_paths(_), do: ["lib"] - # Run "mix help deps" to learn about dependencies. defp deps do [ - {:tesla, "~> 1.4"}, - {:jason, "~> 1.4.1"}, - # hackney is an optional Tesla adapter (the SDK never wires it up; Tesla - # defaults to :httpc). Require >= 4.0.2 — the 1.x line has no security backport. - {:hackney, ">= 4.0.2", optional: true}, - {:plug_crypto, "~> 2.0"}, - {:ex_doc, "~> 0.23", only: :dev, runtime: false}, + {:req, "~> 0.5"}, + {:plug, "~> 1.16", only: :test}, + {:ex_doc, "~> 0.34", only: :dev, runtime: false}, {:credo, "~> 1.7", only: [:dev, :test], runtime: false}, - {:dialyxir, "~> 1.4", only: [:test, :dev], runtime: false} + {:dialyxir, "~> 1.4", only: [:dev, :test], runtime: false} ] end - defp docs() do + defp docs do [ extras: [ "README.md": [title: "Overview"] ], main: "readme", source_url: @source_url, - source_ref: "v#{@version}", - groups_for_modules: groups_for_modules() - ] - end - - defp groups_for_modules() do - [ - "Core API": [ - WorkOS.AuditLogs, - WorkOS.DirectorySync, - WorkOS.Events, - WorkOS.OrganizationDomains, - WorkOS.Organizations, - WorkOS.Passwordless, - WorkOS.Portal, - WorkOS.SSO, - WorkOS.UserManagement, - WorkOS.Webhooks - ], - "Response Structs": [ - WorkOS.AuditLogs.Export, - WorkOS.DirectorySync.Directory, - WorkOS.DirectorySync.Directory.Group, - WorkOS.DirectorySync.Directory.User, - WorkOS.Events.Event, - WorkOS.Organizations.Organization, - WorkOS.Organizations.Organization.Domain, - WorkOS.OrganizationDomains.OrganizationDomain, - WorkOS.Passwordless.Session, - WorkOS.Passwordless.Session.Send, - WorkOS.Portal.Link, - WorkOS.SSO.Connection, - WorkOS.SSO.Connection.Domain, - WorkOS.SSO.Profile, - WorkOS.SSO.ProfileAndToken, - WorkOS.UserManagement.Authentication, - WorkOS.UserManagement.EmailVerification.SendVerificationEmail, - WorkOS.UserManagement.EmailVerification.VerifyEmail, - WorkOS.UserManagement.EnrollAuthFactor, - WorkOS.UserManagement.Invitation, - WorkOS.UserManagement.MagicAuth.SendMagicAuthCode, - WorkOS.UserManagement.MultiFactor.AuthenticationChallenge, - WorkOS.UserManagement.MultiFactor.AuthenticationFactor, - WorkOS.UserManagement.MultiFactor.EnrollAuthFactor, - WorkOS.UserManagement.MultiFactor.SMS, - WorkOS.UserManagement.MultiFactor.TOTP, - WorkOS.UserManagement.OrganizationMembership, - WorkOS.UserManagement.ResetPassword, - WorkOS.Webhooks.Event, - WorkOS.Empty, - WorkOS.Error, - WorkOS.List - ], - "API Client": [ - WorkOS.Client, - WorkOS.Client.TeslaClient - ] + source_ref: "v#{@version}" ] end end diff --git a/mix.lock b/mix.lock index c685b9ad..25ddf12d 100644 --- a/mix.lock +++ b/mix.lock @@ -1,26 +1,24 @@ %{ "bunt": {:hex, :bunt, "1.0.0", "081c2c665f086849e6d57900292b3a161727ab40431219529f13c4ddcf3e7a44", [:mix], [], "hexpm", "dc5f86aa08a5f6fa6b8096f0735c4e76d54ae5c9fa2c143e5a1fc7c1cd9bb6b5"}, - "certifi": {:hex, :certifi, "2.17.0", "835748414307e15e05b17d0e518190228ce648b08d569a5cc93a85a40f3e5c9b", [:rebar3], [], "hexpm", "8122798a17f0293c80daada25d0f81c7f4d708c73fef782c7c9b1950e26e4d21"}, "credo": {:hex, :credo, "1.7.19", "cc52129665fc7c15143d47838fda0f9cd6dac9ceced7bf4da6f85fcbfe64b12a", [:mix], [{:bunt, "~> 0.2.1 or ~> 1.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2 or ~> 1.0", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "2d8bc95d5a7bb99dd2613621d4f08c6a3575c3fd4b62e6a2b48a100352a557b8"}, "dialyxir": {:hex, :dialyxir, "1.4.7", "dda948fcee52962e4b6c5b4b16b2d8fa7d50d8645bbae8b8685c3f9ecb7f5f4d", [:mix], [{:erlex, ">= 0.2.8", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "b34527202e6eb8cee198efec110996c25c5898f43a4094df157f8d28f27d9efe"}, - "earmark_parser": {:hex, :earmark_parser, "1.4.39", "424642f8335b05bb9eb611aa1564c148a8ee35c9c8a8bba6e129d51a3e3c6769", [:mix], [], "hexpm", "06553a88d1f1846da9ef066b87b57c6f605552cfbe40d20bd8d59cc6bde41944"}, + "earmark_parser": {:hex, :earmark_parser, "1.4.46", "67607a0532e810c6f630a515c548d0b24949643f168cc556303bee4cf96105c7", [:mix], [], "hexpm", "9c44636e8a1c68c62f526b2dcd85d941dbbcee7ab82cf64ba06ce28bef8e89f5"}, "erlex": {:hex, :erlex, "0.2.9", "7debbbaa9f4f368b8cd648983e0f1d7963028508e9c59e9d4ed504e94ef52a55", [:mix], [], "hexpm", "8cfffc0ec7159e6d73de2ab28a588064de80f88b2798d5cbe4482cbbc200178b"}, - "ex_doc": {:hex, :ex_doc, "0.30.9", "d691453495c47434c0f2052b08dd91cc32bc4e1a218f86884563448ee2502dd2", [:mix], [{:earmark_parser, "~> 1.4.31", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "d7aaaf21e95dc5cddabf89063327e96867d00013963eadf2c6ad135506a8bc10"}, + "ex_doc": {:hex, :ex_doc, "0.40.3", "4a972ffe64bc07dc605af487e98fc19b72a4185f55ca031b94c0552d6071c1d9", [:mix], [{:earmark_parser, "~> 1.4.44", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_c, ">= 0.1.0", [hex: :makeup_c, repo: "hexpm", optional: true]}, {:makeup_elixir, "~> 0.14 or ~> 1.0", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1 or ~> 1.0", [hex: :makeup_erlang, repo: "hexpm", optional: false]}, {:makeup_html, ">= 0.1.0", [hex: :makeup_html, repo: "hexpm", optional: true]}], "hexpm", "2756e357742fecd9749b489b85d67c9ce99c465f2e75728d9e6dc8d704b973de"}, "file_system": {:hex, :file_system, "1.1.1", "31864f4685b0148f25bd3fbef2b1228457c0c89024ad67f7a81a3ffbc0bbad3a", [:mix], [], "hexpm", "7a15ff97dfe526aeefb090a7a9d3d03aa907e100e262a0f8f7746b78f8f87a5d"}, - "h2": {:hex, :h2, "0.10.2", "ea0146b9c8b5f3b5de16045765f5684db38ef1e66f1c60444890948cb1003e47", [:rebar3], [], "hexpm", "497a899f338b42e6a0b292524e635b0ce6f9379fa39395c8e38d06351cd9b9cf"}, - "hackney": {:hex, :hackney, "4.4.5", "a908f620525bb886a16613532324762e5166287f8c00c9888a762edee11a30c0", [:rebar3], [{:certifi, "~> 2.17.0", [hex: :certifi, repo: "hexpm", optional: false]}, {:h2, "~> 0.10.1", [hex: :h2, repo: "hexpm", optional: false]}, {:idna, "~> 7.1.0", [hex: :idna, repo: "hexpm", optional: false]}, {:mimerl, "~> 1.4", [hex: :mimerl, repo: "hexpm", optional: false]}, {:parse_trans, "3.4.2", [hex: :parse_trans, repo: "hexpm", optional: false]}, {:quic, "~> 1.6.5", [hex: :quic, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "~> 1.1.0", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}, {:webtransport, "~> 0.4.1", [hex: :webtransport, repo: "hexpm", optional: false]}], "hexpm", "6d72bef4e135e94c522c271e11fbb6933efb0006ef235a3933807d0be73b71ec"}, - "idna": {:hex, :idna, "7.1.0", "1067a13043538129602d2f2ce6899d8713125c7d19734aa557ce2e3ea55bd4f1", [:rebar3], [], "hexpm", "6ae959a025bf36df61a8cab8508d9654891b5426a84c44d82deaffd6ddf8c71f"}, + "finch": {:hex, :finch, "0.23.0", "e3f9287ac25a8832f848b144c2b57346aac65b205e2e0629a52adfe6507fd837", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.8", [hex: :mint, repo: "hexpm", optional: false]}, {:nimble_options, "~> 0.4 or ~> 1.0", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:nimble_pool, "~> 1.1", [hex: :nimble_pool, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "80e58d3f936f57e3fdf404f83a3642897ae6d9fb642934e46da4d8fe761b99d5"}, + "hpax": {:hex, :hpax, "1.0.4", "777de5d433b0fbdc7c418159c8055910faa8047ffdb3d6b31098d2a46cd7685c", [:mix], [], "hexpm", "afc7cb142ebcc2d01ce7816190b98ce5dd49e799111b24249f3443d730f377ca"}, "jason": {:hex, :jason, "1.4.5", "2e3a008590b0b8d7388c20293e9dcc9cf3e5d642fd2a114e4cbbb52e595d940a", [:mix], [{:decimal, "~> 1.0 or ~> 2.0 or ~> 3.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "b0c823996102bcd0239b3c2444eb00409b72f6a140c1950bc8b457d836b30684"}, - "makeup": {:hex, :makeup, "1.1.1", "fa0bc768698053b2b3869fa8a62616501ff9d11a562f3ce39580d60860c3a55e", [:mix], [{:nimble_parsec, "~> 1.2.2 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "5dc62fbdd0de44de194898b6710692490be74baa02d9d108bc29f007783b0b48"}, - "makeup_elixir": {:hex, :makeup_elixir, "0.16.1", "cc9e3ca312f1cfeccc572b37a09980287e243648108384b97ff2b76e505c3555", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "e127a341ad1b209bd80f7bd1620a15693a9908ed780c3b763bccf7d200c767c6"}, - "makeup_erlang": {:hex, :makeup_erlang, "0.1.3", "d684f4bac8690e70b06eb52dad65d26de2eefa44cd19d64a8095e1417df7c8fd", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "b78dc853d2e670ff6390b605d807263bf606da3c82be37f9d7f68635bd886fc9"}, + "makeup": {:hex, :makeup, "1.2.2", "882d46dc0905e9ff7abf2aab61a7e6b3dcc555533977d8a23b06019e6c89ac94", [:mix], [{:nimble_parsec, "~> 1.4", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "9a1a24e5b343b8ae16abea0822c10a6f75da27af7fa802ada5251f7579bfccfa"}, + "makeup_elixir": {:hex, :makeup_elixir, "1.0.1", "e928a4f984e795e41e3abd27bfc09f51db16ab8ba1aebdba2b3a575437efafc2", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "7284900d412a3e5cfd97fdaed4f5ed389b8f2b4cb49efc0eb3bd10e2febf9507"}, + "makeup_erlang": {:hex, :makeup_erlang, "1.1.0", "835f7e60792e08824cda445639555d7bf1bbbddb1b60b306e33cb6f6db24dc74", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "1cd6780fb1dd1a03979abaed0fe82712b0625118fd5257d3ebbf73f960c73c3c"}, "mime": {:hex, :mime, "2.0.7", "b8d739037be7cd402aee1ba0306edfdef982687ee7e9859bee6198c1e7e2f128", [:mix], [], "hexpm", "6171188e399ee16023ffc5b76ce445eb6d9672e2e241d2df6050f3c771e80ccd"}, - "mimerl": {:hex, :mimerl, "1.5.0", "f35aca6f23242339b3666e0ac0702379e362b469d0aea167f6cc713547e777ed", [:rebar3], [], "hexpm", "db648ce065bae14ea84ca8b5dd123f42f49417cef693541110bf6f9e9be9ecc4"}, - "nimble_parsec": {:hex, :nimble_parsec, "1.4.0", "51f9b613ea62cfa97b25ccc2c1b4216e81df970acd8e16e8d1bdc58fef21370d", [:mix], [], "hexpm", "9c565862810fb383e9838c1dd2d7d2c437b3d13b267414ba6af33e50d2d1cf28"}, - "parse_trans": {:hex, :parse_trans, "3.4.2", "c352ddc1a0d5e54f9b1654d45f9c432eef76f9cea371c55ddff769ef688fdb74", [:rebar3], [], "hexpm", "4c25347de3b7c35732d32e69ab43d1ceee0beae3f3b3ade1b59cbd3dd224d9ca"}, - "plug_crypto": {:hex, :plug_crypto, "2.0.0", "77515cc10af06645abbfb5e6ad7a3e9714f805ae118fa1a70205f80d2d70fe73", [:mix], [], "hexpm", "53695bae57cc4e54566d993eb01074e4d894b65a3766f1c43e2c61a1b0f45ea9"}, - "quic": {:hex, :quic, "1.6.5", "28b7d49c1732b2de3861701bb03ae7798537240552370ac49f0d139d2ea8f621", [:rebar3], [], "hexpm", "de1a88972c33201a50d1a17c8c4a14528bd1d8f25ef705897d680ae312d0aa78"}, - "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.7", "354c321cf377240c7b8716899e182ce4890c5938111a1296add3ec74cf1715df", [:make, :mix, :rebar3], [], "hexpm", "fe4c190e8f37401d30167c8c405eda19469f34577987c76dde613e838bbc67f8"}, - "tesla": {:hex, :tesla, "1.20.0", "922b504e186da2ee82990d44e7422435f41b67403908a00340c3a0b23a17aa90", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:exjsx, ">= 3.0.0", [hex: :exjsx, repo: "hexpm", optional: true]}, {:finch, "~> 0.13", [hex: :finch, repo: "hexpm", optional: true]}, {:fuse, "~> 2.4", [hex: :fuse, repo: "hexpm", optional: true]}, {:gun, ">= 1.0.0", [hex: :gun, repo: "hexpm", optional: true]}, {:hackney, "~> 1.21 or >= 4.0.2 and < 5.0.0-0", [hex: :hackney, repo: "hexpm", optional: true]}, {:ibrowse, "4.4.2", [hex: :ibrowse, repo: "hexpm", optional: true]}, {:jason, ">= 1.0.0", [hex: :jason, repo: "hexpm", optional: true]}, {:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.0", [hex: :mint, repo: "hexpm", optional: true]}, {:mox, "~> 1.0", [hex: :mox, repo: "hexpm", optional: true]}, {:msgpax, "~> 2.3", [hex: :msgpax, repo: "hexpm", optional: true]}, {:opentelemetry_semantic_conventions, "~> 1.27", [hex: :opentelemetry_semantic_conventions, repo: "hexpm", optional: true]}, {:poison, ">= 1.0.0", [hex: :poison, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: true]}], "hexpm", "3ecb41cb458772332752c3acdfe983e23abb991f5a43cfd69a64e9ea3f4b0061"}, - "webtransport": {:hex, :webtransport, "0.4.1", "60ef6cd99282b5964c8172d674519239e31e357d934bde028bec70da34636fe5", [:rebar3], [{:h2, "~> 0.10.1", [hex: :h2, repo: "hexpm", optional: false]}, {:quic, "~> 1.6.5", [hex: :quic, repo: "hexpm", optional: false]}], "hexpm", "006e4e52a8f03b69201d4637c85b424a4ddccc1909f32c5742fed8d495a75174"}, + "mint": {:hex, :mint, "1.9.3", "3337184d69179695c7a9f1714d92c11e629d36c8c037a21cf490131d3d150554", [:mix], [{:castore, "~> 0.1.0 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:hpax, "~> 0.1.1 or ~> 0.2.0 or ~> 1.0", [hex: :hpax, repo: "hexpm", optional: false]}], "hexpm", "5f7c9342480c069dbbc4eeac3490303c9e01870ff01a7f1d29b6107054fc1e74"}, + "nimble_options": {:hex, :nimble_options, "1.1.1", "e3a492d54d85fc3fd7c5baf411d9d2852922f66e69476317787a7b2bb000a61b", [:mix], [], "hexpm", "821b2470ca9442c4b6984882fe9bb0389371b8ddec4d45a9504f00a66f650b44"}, + "nimble_parsec": {:hex, :nimble_parsec, "1.4.2", "8efba0122db06df95bfaa78f791344a89352ba04baedd3849593bfce4d0dc1c6", [:mix], [], "hexpm", "4b21398942dda052b403bbe1da991ccd03a053668d147d53fb8c4e0efe09c973"}, + "nimble_pool": {:hex, :nimble_pool, "1.1.0", "bf9c29fbdcba3564a8b800d1eeb5a3c58f36e1e11d7b7fb2e084a643f645f06b", [:mix], [], "hexpm", "af2e4e6b34197db81f7aad230c1118eac993acc0dae6bc83bac0126d4ae0813a"}, + "plug": {:hex, :plug, "1.20.3", "56c480c633ec2ce10140e236e15233bf576e1d323887d7c96711bd02ab5160db", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "be266aee1b8536ef6409d58cf39a3121319f0ec47cfa1b24024485aa0e76ad76"}, + "plug_crypto": {:hex, :plug_crypto, "2.1.1", "19bda8184399cb24afa10be734f84a16ea0a2bc65054e23a62bb10f06bc89491", [:mix], [], "hexpm", "6470bce6ffe41c8bd497612ffde1a7e4af67f36a15eea5f921af71cf3e11247c"}, + "req": {:hex, :req, "0.6.3", "7fe5e68792ff0546e45d5919104fa1764a13694cfe3e48c8a0f32ad051ae77e4", [:mix], [{:brotli, "~> 0.3.1", [hex: :brotli, repo: "hexpm", optional: true]}, {:ezstd, "~> 1.0", [hex: :ezstd, repo: "hexpm", optional: true]}, {:finch, "~> 0.21", [hex: :finch, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mime, "~> 2.0.6 or ~> 2.1", [hex: :mime, repo: "hexpm", optional: false]}, {:nimble_csv, "~> 1.0", [hex: :nimble_csv, repo: "hexpm", optional: true]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "e85b5c6c990e6c3f52bbba68e6f099118f2b8252825f96c7c3636b97a3de307d"}, + "telemetry": {:hex, :telemetry, "1.4.2", "a0cb522801dffb1c49fe6e30561badffc7b6d0e180db1300df759faa22062855", [:rebar3], [], "hexpm", "928f6495066506077862c0d1646609eed891a4326bee3126ba54b60af61febb1"}, } diff --git a/script/ci b/script/ci new file mode 100755 index 00000000..1850a606 --- /dev/null +++ b/script/ci @@ -0,0 +1,30 @@ +#!/usr/bin/env bash +set -euo pipefail + +cd "$(dirname "$0")/.." + +# CI sets MIX_ENV=test for every job (see .github/workflows/{main,lint}.yml). +# Compiling in dev here would skip test/support and miss warnings CI catches. +export MIX_ENV=test + +echo "==> Fetching dependencies..." +mix deps.get + +echo "==> Compiling (warnings as errors)..." +mix compile --warnings-as-errors + +echo "==> Checking formatting..." +mix format --check-formatted + +echo "==> credo (lint)..." +# Must match lint.yml — --strict enables the low-priority design and +# readability checks that plain --all skips, and CI fails on them. +mix credo --strict -a + +echo "==> dialyzer (typecheck)..." +mix dialyzer + +echo "==> Running tests..." +mix test + +echo "==> All checks passed." diff --git a/test/support/audit_logs_client_mock.ex b/test/support/audit_logs_client_mock.ex deleted file mode 100644 index a6567dbf..00000000 --- a/test/support/audit_logs_client_mock.ex +++ /dev/null @@ -1,86 +0,0 @@ -defmodule WorkOS.AuditLogs.ClientMock do - @moduledoc false - - import ExUnit.Assertions, only: [assert: 1] - - def create_event(context, opts \\ []) do - Tesla.Mock.mock(fn request -> - %{api_key: api_key} = context - - assert request.method == :post - assert request.url == "#{WorkOS.base_url()}/audit_logs/events" - - assert Enum.find(request.headers, &(elem(&1, 0) == "Authorization")) == - {"Authorization", "Bearer #{api_key}"} - - assert Enum.find(request.headers, fn {header, _} -> header == "Idempotency-Key" end) != nil - - body = Jason.decode!(request.body) - - for {field, value} <- - Keyword.get(opts, :assert_fields, []) |> Keyword.delete(:idempotency_key) do - assert body[to_string(field)] == value - end - - {status, body} = Keyword.get(opts, :respond_with, {200, %{}}) - %Tesla.Env{status: status, body: body} - end) - end - - def create_export(context, opts \\ []) do - Tesla.Mock.mock(fn request -> - %{api_key: api_key} = context - - assert request.method == :post - assert request.url == "#{WorkOS.base_url()}/audit_logs/exports" - - assert Enum.find(request.headers, &(elem(&1, 0) == "Authorization")) == - {"Authorization", "Bearer #{api_key}"} - - body = Jason.decode!(request.body) - - for {field, value} <- Keyword.get(opts, :assert_fields, []) do - assert body[to_string(field)] == value - end - - success_body = %{ - "object" => "audit_log_export", - "id" => "audit_log_export_1234", - "state" => "pending", - "url" => nil, - "created_at" => "2022-02-15T15:26:53.274Z", - "updated_at" => "2022-02-15T15:26:53.274Z" - } - - {status, body} = Keyword.get(opts, :respond_with, {200, success_body}) - %Tesla.Env{status: status, body: body} - end) - end - - def get_export(context, opts \\ []) do - Tesla.Mock.mock(fn request -> - %{api_key: api_key} = context - - audit_log_export_id = - opts |> Keyword.get(:assert_fields) |> Keyword.get(:audit_log_export_id) - - assert request.method == :get - assert request.url == "#{WorkOS.base_url()}/audit_logs/exports/#{audit_log_export_id}" - - assert Enum.find(request.headers, &(elem(&1, 0) == "Authorization")) == - {"Authorization", "Bearer #{api_key}"} - - success_body = %{ - "id" => audit_log_export_id, - "object" => "audit_logo_export", - "state" => "pending", - "url" => nil, - "created_at" => "2023-07-17T20:07:20.055Z", - "updated_at" => "2023-07-17T20:07:20.055Z" - } - - {status, body} = Keyword.get(opts, :respond_with, {200, success_body}) - %Tesla.Env{status: status, body: body} - end) - end -end diff --git a/test/support/directory_sync_client_mock.ex b/test/support/directory_sync_client_mock.ex deleted file mode 100644 index 35de0ddc..00000000 --- a/test/support/directory_sync_client_mock.ex +++ /dev/null @@ -1,209 +0,0 @@ -defmodule WorkOS.DirectorySync.ClientMock do - @moduledoc false - - import ExUnit.Assertions, only: [assert: 1] - - @directory_group_response %{ - "id" => "dir_grp_123", - "object" => "directory_group", - "idp_id" => "123", - "directory_id" => "dir_123", - "organization_id" => "org_123", - "name" => "Foo Group", - "created_at" => "2021-10-27 15:21:50.640958", - "updated_at" => "2021-12-13 12:15:45.531847", - "raw_attributes" => %{ - "foo" => "bar" - } - } - - @directory_user_response %{ - "id" => "user_123", - "object" => "directory_user", - "custom_attributes" => %{ - "custom" => true - }, - "directory_id" => "dir_123", - "organization_id" => "org_123", - "emails" => [ - %{ - "primary" => true, - "type" => "type", - "value" => "jonsnow@workos.com" - } - ], - "first_name" => "Jon", - "groups" => [@directory_group_response], - "idp_id" => "idp_foo", - "last_name" => "Snow", - "job_title" => "Knight of the Watch", - "raw_attributes" => %{}, - "state" => "active", - "username" => "jonsnow", - "created_at" => "2023-07-17T20:07:20.055Z", - "updated_at" => "2023-07-17T20:07:20.055Z" - } - - def get_directory(context, opts \\ []) do - Tesla.Mock.mock(fn request -> - %{api_key: api_key} = context - - directory_id = opts |> Keyword.get(:assert_fields) |> Keyword.get(:directory_id) - assert request.method == :get - assert request.url == "#{WorkOS.base_url()}/directories/#{directory_id}" - - assert Enum.find(request.headers, &(elem(&1, 0) == "Authorization")) == - {"Authorization", "Bearer #{api_key}"} - - success_body = %{ - "id" => directory_id, - "organization_id" => "org_123", - "name" => "Foo", - "domain" => "foo-corp.com", - "object" => "directory", - "state" => "linked", - "external_key" => "9asBRBV", - "type" => "okta scim v1.1", - "created_at" => "2023-07-17T20:07:20.055Z", - "updated_at" => "2023-07-17T20:07:20.055Z" - } - - {status, body} = Keyword.get(opts, :respond_with, {200, success_body}) - %Tesla.Env{status: status, body: body} - end) - end - - def list_directories(context, opts \\ []) do - Tesla.Mock.mock(fn request -> - %{api_key: api_key} = context - - assert request.method == :get - assert request.url == "#{WorkOS.base_url()}/directories" - - assert Enum.find(request.headers, &(elem(&1, 0) == "Authorization")) == - {"Authorization", "Bearer #{api_key}"} - - success_body = %{ - "data" => [ - %{ - "id" => "directory_123", - "organization_id" => "org_123", - "name" => "Foo", - "domain" => "foo-corp.com", - "object" => "directory", - "state" => "linked", - "external_key" => "9asBRBV", - "type" => "okta scim v1.1", - "created_at" => "2023-07-17T20:07:20.055Z", - "updated_at" => "2023-07-17T20:07:20.055Z" - } - ], - "list_metadata" => %{ - "before" => "before-id", - "after" => "after-id" - } - } - - {status, body} = Keyword.get(opts, :respond_with, {200, success_body}) - %Tesla.Env{status: status, body: body} - end) - end - - def delete_directory(context, opts \\ []) do - Tesla.Mock.mock(fn request -> - %{api_key: api_key} = context - - directory_id = opts |> Keyword.get(:assert_fields) |> Keyword.get(:directory_id) - assert request.method == :delete - assert request.url == "#{WorkOS.base_url()}/directories/#{directory_id}" - - assert Enum.find(request.headers, &(elem(&1, 0) == "Authorization")) == - {"Authorization", "Bearer #{api_key}"} - - {status, body} = Keyword.get(opts, :respond_with, {204, %{}}) - %Tesla.Env{status: status, body: body} - end) - end - - def get_user(context, opts \\ []) do - Tesla.Mock.mock(fn request -> - %{api_key: api_key} = context - - directory_user_id = opts |> Keyword.get(:assert_fields) |> Keyword.get(:directory_user_id) - assert request.method == :get - assert request.url == "#{WorkOS.base_url()}/directory_users/#{directory_user_id}" - - assert Enum.find(request.headers, &(elem(&1, 0) == "Authorization")) == - {"Authorization", "Bearer #{api_key}"} - - {status, body} = Keyword.get(opts, :respond_with, {200, @directory_user_response}) - %Tesla.Env{status: status, body: body} - end) - end - - def list_users(context, opts \\ []) do - Tesla.Mock.mock(fn request -> - %{api_key: api_key} = context - - assert request.method == :get - assert request.url == "#{WorkOS.base_url()}/directory_users" - - assert Enum.find(request.headers, &(elem(&1, 0) == "Authorization")) == - {"Authorization", "Bearer #{api_key}"} - - success_body = %{ - "data" => [ - @directory_user_response - ], - "list_metadata" => %{ - "before" => "before-id", - "after" => "after-id" - } - } - - {status, body} = Keyword.get(opts, :respond_with, {200, success_body}) - %Tesla.Env{status: status, body: body} - end) - end - - def get_group(context, opts \\ []) do - Tesla.Mock.mock(fn request -> - %{api_key: api_key} = context - - directory_group_id = opts |> Keyword.get(:assert_fields) |> Keyword.get(:directory_group_id) - assert request.method == :get - assert request.url == "#{WorkOS.base_url()}/directory_groups/#{directory_group_id}" - - assert Enum.find(request.headers, &(elem(&1, 0) == "Authorization")) == - {"Authorization", "Bearer #{api_key}"} - - {status, body} = Keyword.get(opts, :respond_with, {200, @directory_group_response}) - %Tesla.Env{status: status, body: body} - end) - end - - def list_groups(context, opts \\ []) do - Tesla.Mock.mock(fn request -> - %{api_key: api_key} = context - - assert request.method == :get - assert request.url == "#{WorkOS.base_url()}/directory_groups" - - assert Enum.find(request.headers, &(elem(&1, 0) == "Authorization")) == - {"Authorization", "Bearer #{api_key}"} - - success_body = %{ - "data" => [ - @directory_group_response - ], - "list_metadata" => %{ - "before" => "before-id", - "after" => "after-id" - } - } - - {status, body} = Keyword.get(opts, :respond_with, {200, success_body}) - %Tesla.Env{status: status, body: body} - end) - end -end diff --git a/test/support/events_client_mock.ex b/test/support/events_client_mock.ex deleted file mode 100644 index c1746ba2..00000000 --- a/test/support/events_client_mock.ex +++ /dev/null @@ -1,42 +0,0 @@ -defmodule WorkOS.Events.ClientMock do - @moduledoc false - - import ExUnit.Assertions, only: [assert: 1] - - def list_events(context, opts \\ []) do - Tesla.Mock.mock(fn request -> - %{api_key: api_key} = context - - assert request.method == :get - assert request.url == "#{WorkOS.base_url()}/events" - - assert Enum.find(request.headers, &(elem(&1, 0) == "Authorization")) == - {"Authorization", "Bearer #{api_key}"} - - success_body = %{ - "data" => [ - %{ - "id" => "event_01234ABCD", - "created_at" => "2020-05-06 04:21:48.649164", - "event" => "connection.activated", - "data" => %{ - "object" => "connection", - "id" => "conn_01234ABCD", - "organization_id" => "org_1234", - "name" => "Connection", - "connection_type" => "OktaSAML", - "state" => "active", - "domains" => [], - "created_at" => "2020-05-06 04:21:48.649164", - "updated_at" => "2020-05-06 04:21:48.649164" - } - } - ], - "list_metadata" => %{} - } - - {status, body} = Keyword.get(opts, :respond_with, {200, success_body}) - %Tesla.Env{status: status, body: body} - end) - end -end diff --git a/test/support/fixtures/admin_portal/generate_link.json b/test/support/fixtures/admin_portal/generate_link.json new file mode 100644 index 00000000..8978049d --- /dev/null +++ b/test/support/fixtures/admin_portal/generate_link.json @@ -0,0 +1,3 @@ +{ + "link": "link" +} diff --git a/test/support/fixtures/agents/create_validate.json b/test/support/fixtures/agents/create_validate.json new file mode 100644 index 00000000..b244e78f --- /dev/null +++ b/test/support/fixtures/agents/create_validate.json @@ -0,0 +1,5 @@ +{ + "valid": true, + "registration_id": "registration_id", + "expires_at": "2024-01-01T00:00:00.000Z" +} diff --git a/test/support/fixtures/agents/get_registration.json b/test/support/fixtures/agents/get_registration.json new file mode 100644 index 00000000..af84a9de --- /dev/null +++ b/test/support/fixtures/agents/get_registration.json @@ -0,0 +1,27 @@ +{ + "id": "id", + "agent_identity": { + "id": "id", + "userland_user_id": "userland_user_id", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + }, + "organization_id": "organization_id", + "status": "unverified", + "kind": "anonymous", + "claim": { + "id": "id", + "claim_completion": { + "id": "id", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z", + "expires_at": "2024-01-01T00:00:00.000Z", + "claimed_at": "2024-01-01T00:00:00.000Z" + }, + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z", + "expires_at": "2024-01-01T00:00:00.000Z" + }, + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" +} diff --git a/test/support/fixtures/agents/update_attempts.json b/test/support/fixtures/agents/update_attempts.json new file mode 100644 index 00000000..1d4c02d2 --- /dev/null +++ b/test/support/fixtures/agents/update_attempts.json @@ -0,0 +1,11 @@ +{ + "id": "id", + "status": "unverified", + "user_code": "user_code", + "organizations": [ + { + "id": "id", + "name": "name" + } + ] +} diff --git a/test/support/fixtures/api_keys/create_api_key_expire.json b/test/support/fixtures/api_keys/create_api_key_expire.json new file mode 100644 index 00000000..8ff4cb71 --- /dev/null +++ b/test/support/fixtures/api_keys/create_api_key_expire.json @@ -0,0 +1,17 @@ +{ + "object": "api_key", + "id": "id", + "owner": { + "type": "organization", + "id": "id" + }, + "name": "name", + "obfuscated_value": "obfuscated_value", + "last_used_at": "2024-01-01T00:00:00.000Z", + "expires_at": "2024-01-01T00:00:00.000Z", + "permissions": [ + "permissions" + ], + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" +} diff --git a/test/support/fixtures/api_keys/create_organization_api_key.json b/test/support/fixtures/api_keys/create_organization_api_key.json new file mode 100644 index 00000000..5484a463 --- /dev/null +++ b/test/support/fixtures/api_keys/create_organization_api_key.json @@ -0,0 +1,18 @@ +{ + "object": "api_key", + "id": "id", + "owner": { + "type": "organization", + "id": "id" + }, + "name": "name", + "obfuscated_value": "obfuscated_value", + "last_used_at": "2024-01-01T00:00:00.000Z", + "expires_at": "2024-01-01T00:00:00.000Z", + "permissions": [ + "permissions" + ], + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z", + "value": "value" +} diff --git a/test/support/fixtures/api_keys/create_validation.json b/test/support/fixtures/api_keys/create_validation.json new file mode 100644 index 00000000..a1c554b8 --- /dev/null +++ b/test/support/fixtures/api_keys/create_validation.json @@ -0,0 +1,20 @@ +{ + "api_key": { + "object": "api_key", + "id": "id", + "owner": { + "type": "organization", + "id": "id" + }, + "name": "name", + "obfuscated_value": "obfuscated_value", + "last_used_at": "2024-01-01T00:00:00.000Z", + "expires_at": "2024-01-01T00:00:00.000Z", + "permissions": [ + "permissions" + ], + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + }, + "agent_registration_id": "agent_registration_id" +} diff --git a/test/support/fixtures/api_keys/list_organization_api_keys.json b/test/support/fixtures/api_keys/list_organization_api_keys.json new file mode 100644 index 00000000..9bba8c58 --- /dev/null +++ b/test/support/fixtures/api_keys/list_organization_api_keys.json @@ -0,0 +1,34 @@ +{ + "data": [ + { + "object": "list", + "data": [ + { + "object": "api_key", + "id": "id", + "owner": { + "type": "organization", + "id": "id" + }, + "name": "name", + "obfuscated_value": "obfuscated_value", + "last_used_at": "2024-01-01T00:00:00.000Z", + "expires_at": "2024-01-01T00:00:00.000Z", + "permissions": [ + "permissions" + ], + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + } + ], + "list_metadata": { + "before": "before", + "after": "after" + } + } + ], + "list_metadata": { + "before": null, + "after": null + } +} diff --git a/test/support/fixtures/audit_logs/create_event.json b/test/support/fixtures/audit_logs/create_event.json new file mode 100644 index 00000000..5550c6db --- /dev/null +++ b/test/support/fixtures/audit_logs/create_event.json @@ -0,0 +1,3 @@ +{ + "success": true +} diff --git a/test/support/fixtures/audit_logs/create_export.json b/test/support/fixtures/audit_logs/create_export.json new file mode 100644 index 00000000..be2ba988 --- /dev/null +++ b/test/support/fixtures/audit_logs/create_export.json @@ -0,0 +1,8 @@ +{ + "object": "audit_log_export", + "id": "id", + "state": "pending", + "url": "url", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" +} diff --git a/test/support/fixtures/audit_logs/create_schema.json b/test/support/fixtures/audit_logs/create_schema.json new file mode 100644 index 00000000..5210003e --- /dev/null +++ b/test/support/fixtures/audit_logs/create_schema.json @@ -0,0 +1,15 @@ +{ + "object": "audit_log_schema", + "version": 1, + "actor": { + "metadata": {} + }, + "targets": [ + { + "type": "type", + "metadata": {} + } + ], + "metadata": {}, + "created_at": "2024-01-01T00:00:00.000Z" +} diff --git a/test/support/fixtures/audit_logs/get_export.json b/test/support/fixtures/audit_logs/get_export.json new file mode 100644 index 00000000..be2ba988 --- /dev/null +++ b/test/support/fixtures/audit_logs/get_export.json @@ -0,0 +1,8 @@ +{ + "object": "audit_log_export", + "id": "id", + "state": "pending", + "url": "url", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" +} diff --git a/test/support/fixtures/audit_logs/get_organization_audit_logs_retention.json b/test/support/fixtures/audit_logs/get_organization_audit_logs_retention.json new file mode 100644 index 00000000..be61ebde --- /dev/null +++ b/test/support/fixtures/audit_logs/get_organization_audit_logs_retention.json @@ -0,0 +1,3 @@ +{ + "retention_period_in_days": 1 +} diff --git a/test/support/fixtures/audit_logs/list_action_schemas.json b/test/support/fixtures/audit_logs/list_action_schemas.json new file mode 100644 index 00000000..b77e5528 --- /dev/null +++ b/test/support/fixtures/audit_logs/list_action_schemas.json @@ -0,0 +1,23 @@ +{ + "data": [ + { + "object": "audit_log_schema", + "version": 1, + "actor": { + "metadata": {} + }, + "targets": [ + { + "type": "type", + "metadata": {} + } + ], + "metadata": {}, + "created_at": "2024-01-01T00:00:00.000Z" + } + ], + "list_metadata": { + "before": null, + "after": null + } +} diff --git a/test/support/fixtures/audit_logs/list_actions.json b/test/support/fixtures/audit_logs/list_actions.json new file mode 100644 index 00000000..d4b40895 --- /dev/null +++ b/test/support/fixtures/audit_logs/list_actions.json @@ -0,0 +1,29 @@ +{ + "data": [ + { + "object": "audit_log_action", + "name": "name", + "schema": { + "object": "audit_log_schema", + "version": 1, + "actor": { + "metadata": {} + }, + "targets": [ + { + "type": "type", + "metadata": {} + } + ], + "metadata": {}, + "created_at": "2024-01-01T00:00:00.000Z" + }, + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + } + ], + "list_metadata": { + "before": null, + "after": null + } +} diff --git a/test/support/fixtures/audit_logs/update_organization_audit_logs_retention.json b/test/support/fixtures/audit_logs/update_organization_audit_logs_retention.json new file mode 100644 index 00000000..be61ebde --- /dev/null +++ b/test/support/fixtures/audit_logs/update_organization_audit_logs_retention.json @@ -0,0 +1,3 @@ +{ + "retention_period_in_days": 1 +} diff --git a/test/support/fixtures/authorization/add_environment_role_permission.json b/test/support/fixtures/authorization/add_environment_role_permission.json new file mode 100644 index 00000000..73b5d8e4 --- /dev/null +++ b/test/support/fixtures/authorization/add_environment_role_permission.json @@ -0,0 +1,14 @@ +{ + "slug": "slug", + "object": "role", + "id": "id", + "name": "name", + "description": "description", + "type": "EnvironmentRole", + "resource_type_slug": "resource_type_slug", + "permissions": [ + "permissions" + ], + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" +} diff --git a/test/support/fixtures/authorization/add_organization_role_permission.json b/test/support/fixtures/authorization/add_organization_role_permission.json new file mode 100644 index 00000000..73b5d8e4 --- /dev/null +++ b/test/support/fixtures/authorization/add_organization_role_permission.json @@ -0,0 +1,14 @@ +{ + "slug": "slug", + "object": "role", + "id": "id", + "name": "name", + "description": "description", + "type": "EnvironmentRole", + "resource_type_slug": "resource_type_slug", + "permissions": [ + "permissions" + ], + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" +} diff --git a/test/support/fixtures/authorization/assign_role.json b/test/support/fixtures/authorization/assign_role.json new file mode 100644 index 00000000..c1b0869d --- /dev/null +++ b/test/support/fixtures/authorization/assign_role.json @@ -0,0 +1,19 @@ +{ + "object": "role_assignment", + "id": "id", + "organization_membership_id": "organization_membership_id", + "role": { + "slug": "slug" + }, + "resource": { + "id": "id", + "external_id": "external_id", + "resource_type_slug": "resource_type_slug" + }, + "source": { + "type": "direct", + "group_role_assignment_id": "group_role_assignment_id" + }, + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" +} diff --git a/test/support/fixtures/authorization/check.json b/test/support/fixtures/authorization/check.json new file mode 100644 index 00000000..8a5f5f97 --- /dev/null +++ b/test/support/fixtures/authorization/check.json @@ -0,0 +1,3 @@ +{ + "authorized": true +} diff --git a/test/support/fixtures/authorization/create_environment_role.json b/test/support/fixtures/authorization/create_environment_role.json new file mode 100644 index 00000000..73b5d8e4 --- /dev/null +++ b/test/support/fixtures/authorization/create_environment_role.json @@ -0,0 +1,14 @@ +{ + "slug": "slug", + "object": "role", + "id": "id", + "name": "name", + "description": "description", + "type": "EnvironmentRole", + "resource_type_slug": "resource_type_slug", + "permissions": [ + "permissions" + ], + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" +} diff --git a/test/support/fixtures/authorization/create_group_role_assignment.json b/test/support/fixtures/authorization/create_group_role_assignment.json new file mode 100644 index 00000000..6c9053f6 --- /dev/null +++ b/test/support/fixtures/authorization/create_group_role_assignment.json @@ -0,0 +1,15 @@ +{ + "object": "group_role_assignment", + "id": "id", + "group_id": "group_id", + "role": { + "slug": "slug" + }, + "resource": { + "id": "id", + "external_id": "external_id", + "resource_type_slug": "resource_type_slug" + }, + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" +} diff --git a/test/support/fixtures/authorization/create_organization_role.json b/test/support/fixtures/authorization/create_organization_role.json new file mode 100644 index 00000000..73b5d8e4 --- /dev/null +++ b/test/support/fixtures/authorization/create_organization_role.json @@ -0,0 +1,14 @@ +{ + "slug": "slug", + "object": "role", + "id": "id", + "name": "name", + "description": "description", + "type": "EnvironmentRole", + "resource_type_slug": "resource_type_slug", + "permissions": [ + "permissions" + ], + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" +} diff --git a/test/support/fixtures/authorization/create_permission.json b/test/support/fixtures/authorization/create_permission.json new file mode 100644 index 00000000..f280b1d3 --- /dev/null +++ b/test/support/fixtures/authorization/create_permission.json @@ -0,0 +1,11 @@ +{ + "object": "permission", + "id": "id", + "slug": "slug", + "name": "name", + "description": "description", + "system": true, + "resource_type_slug": "resource_type_slug", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" +} diff --git a/test/support/fixtures/authorization/create_resource.json b/test/support/fixtures/authorization/create_resource.json new file mode 100644 index 00000000..7e40b2f8 --- /dev/null +++ b/test/support/fixtures/authorization/create_resource.json @@ -0,0 +1,12 @@ +{ + "object": "authorization_resource", + "name": "name", + "description": "description", + "organization_id": "organization_id", + "parent_resource_id": "parent_resource_id", + "id": "id", + "external_id": "external_id", + "resource_type_slug": "resource_type_slug", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" +} diff --git a/test/support/fixtures/authorization/get_environment_role.json b/test/support/fixtures/authorization/get_environment_role.json new file mode 100644 index 00000000..73b5d8e4 --- /dev/null +++ b/test/support/fixtures/authorization/get_environment_role.json @@ -0,0 +1,14 @@ +{ + "slug": "slug", + "object": "role", + "id": "id", + "name": "name", + "description": "description", + "type": "EnvironmentRole", + "resource_type_slug": "resource_type_slug", + "permissions": [ + "permissions" + ], + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" +} diff --git a/test/support/fixtures/authorization/get_group_role_assignment.json b/test/support/fixtures/authorization/get_group_role_assignment.json new file mode 100644 index 00000000..6c9053f6 --- /dev/null +++ b/test/support/fixtures/authorization/get_group_role_assignment.json @@ -0,0 +1,15 @@ +{ + "object": "group_role_assignment", + "id": "id", + "group_id": "group_id", + "role": { + "slug": "slug" + }, + "resource": { + "id": "id", + "external_id": "external_id", + "resource_type_slug": "resource_type_slug" + }, + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" +} diff --git a/test/support/fixtures/authorization/get_organization_role.json b/test/support/fixtures/authorization/get_organization_role.json new file mode 100644 index 00000000..73b5d8e4 --- /dev/null +++ b/test/support/fixtures/authorization/get_organization_role.json @@ -0,0 +1,14 @@ +{ + "slug": "slug", + "object": "role", + "id": "id", + "name": "name", + "description": "description", + "type": "EnvironmentRole", + "resource_type_slug": "resource_type_slug", + "permissions": [ + "permissions" + ], + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" +} diff --git a/test/support/fixtures/authorization/get_permission.json b/test/support/fixtures/authorization/get_permission.json new file mode 100644 index 00000000..f280b1d3 --- /dev/null +++ b/test/support/fixtures/authorization/get_permission.json @@ -0,0 +1,11 @@ +{ + "object": "permission", + "id": "id", + "slug": "slug", + "name": "name", + "description": "description", + "system": true, + "resource_type_slug": "resource_type_slug", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" +} diff --git a/test/support/fixtures/authorization/get_resource.json b/test/support/fixtures/authorization/get_resource.json new file mode 100644 index 00000000..7e40b2f8 --- /dev/null +++ b/test/support/fixtures/authorization/get_resource.json @@ -0,0 +1,12 @@ +{ + "object": "authorization_resource", + "name": "name", + "description": "description", + "organization_id": "organization_id", + "parent_resource_id": "parent_resource_id", + "id": "id", + "external_id": "external_id", + "resource_type_slug": "resource_type_slug", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" +} diff --git a/test/support/fixtures/authorization/get_resource_by_external_id.json b/test/support/fixtures/authorization/get_resource_by_external_id.json new file mode 100644 index 00000000..7e40b2f8 --- /dev/null +++ b/test/support/fixtures/authorization/get_resource_by_external_id.json @@ -0,0 +1,12 @@ +{ + "object": "authorization_resource", + "name": "name", + "description": "description", + "organization_id": "organization_id", + "parent_resource_id": "parent_resource_id", + "id": "id", + "external_id": "external_id", + "resource_type_slug": "resource_type_slug", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" +} diff --git a/test/support/fixtures/authorization/list_effective_permissions.json b/test/support/fixtures/authorization/list_effective_permissions.json new file mode 100644 index 00000000..00717f05 --- /dev/null +++ b/test/support/fixtures/authorization/list_effective_permissions.json @@ -0,0 +1,28 @@ +{ + "data": [ + { + "object": "list", + "data": [ + { + "object": "permission", + "id": "id", + "slug": "slug", + "name": "name", + "description": "description", + "system": true, + "resource_type_slug": "resource_type_slug", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + } + ], + "list_metadata": { + "before": "before", + "after": "after" + } + } + ], + "list_metadata": { + "before": null, + "after": null + } +} diff --git a/test/support/fixtures/authorization/list_effective_permissions_by_external_id.json b/test/support/fixtures/authorization/list_effective_permissions_by_external_id.json new file mode 100644 index 00000000..00717f05 --- /dev/null +++ b/test/support/fixtures/authorization/list_effective_permissions_by_external_id.json @@ -0,0 +1,28 @@ +{ + "data": [ + { + "object": "list", + "data": [ + { + "object": "permission", + "id": "id", + "slug": "slug", + "name": "name", + "description": "description", + "system": true, + "resource_type_slug": "resource_type_slug", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + } + ], + "list_metadata": { + "before": "before", + "after": "after" + } + } + ], + "list_metadata": { + "before": null, + "after": null + } +} diff --git a/test/support/fixtures/authorization/list_environment_roles.json b/test/support/fixtures/authorization/list_environment_roles.json new file mode 100644 index 00000000..20574b78 --- /dev/null +++ b/test/support/fixtures/authorization/list_environment_roles.json @@ -0,0 +1,19 @@ +{ + "object": "list", + "data": [ + { + "slug": "slug", + "object": "role", + "id": "id", + "name": "name", + "description": "description", + "type": "EnvironmentRole", + "resource_type_slug": "resource_type_slug", + "permissions": [ + "permissions" + ], + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + } + ] +} diff --git a/test/support/fixtures/authorization/list_group_role_assignments.json b/test/support/fixtures/authorization/list_group_role_assignments.json new file mode 100644 index 00000000..1908760c --- /dev/null +++ b/test/support/fixtures/authorization/list_group_role_assignments.json @@ -0,0 +1,32 @@ +{ + "data": [ + { + "object": "list", + "data": [ + { + "object": "group_role_assignment", + "id": "id", + "group_id": "group_id", + "role": { + "slug": "slug" + }, + "resource": { + "id": "id", + "external_id": "external_id", + "resource_type_slug": "resource_type_slug" + }, + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + } + ], + "list_metadata": { + "after": "after", + "before": "before" + } + } + ], + "list_metadata": { + "before": null, + "after": null + } +} diff --git a/test/support/fixtures/authorization/list_memberships_for_resource.json b/test/support/fixtures/authorization/list_memberships_for_resource.json new file mode 100644 index 00000000..b2b9587e --- /dev/null +++ b/test/support/fixtures/authorization/list_memberships_for_resource.json @@ -0,0 +1,45 @@ +{ + "data": [ + { + "object": "list", + "data": [ + { + "object": "organization_membership", + "id": "id", + "user_id": "user_id", + "organization_id": "organization_id", + "status": "active", + "directory_managed": true, + "organization_name": "organization_name", + "custom_attributes": {}, + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z", + "user": { + "object": "user", + "id": "id", + "first_name": "first_name", + "last_name": "last_name", + "name": "name", + "profile_picture_url": "profile_picture_url", + "email": "email", + "email_verified": true, + "external_id": "external_id", + "metadata": {}, + "last_sign_in_at": "2024-01-01T00:00:00.000Z", + "locale": "locale", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + } + } + ], + "list_metadata": { + "before": "before", + "after": "after" + } + } + ], + "list_metadata": { + "before": null, + "after": null + } +} diff --git a/test/support/fixtures/authorization/list_memberships_for_resource_by_external_id.json b/test/support/fixtures/authorization/list_memberships_for_resource_by_external_id.json new file mode 100644 index 00000000..b2b9587e --- /dev/null +++ b/test/support/fixtures/authorization/list_memberships_for_resource_by_external_id.json @@ -0,0 +1,45 @@ +{ + "data": [ + { + "object": "list", + "data": [ + { + "object": "organization_membership", + "id": "id", + "user_id": "user_id", + "organization_id": "organization_id", + "status": "active", + "directory_managed": true, + "organization_name": "organization_name", + "custom_attributes": {}, + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z", + "user": { + "object": "user", + "id": "id", + "first_name": "first_name", + "last_name": "last_name", + "name": "name", + "profile_picture_url": "profile_picture_url", + "email": "email", + "email_verified": true, + "external_id": "external_id", + "metadata": {}, + "last_sign_in_at": "2024-01-01T00:00:00.000Z", + "locale": "locale", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + } + } + ], + "list_metadata": { + "before": "before", + "after": "after" + } + } + ], + "list_metadata": { + "before": null, + "after": null + } +} diff --git a/test/support/fixtures/authorization/list_organization_roles.json b/test/support/fixtures/authorization/list_organization_roles.json new file mode 100644 index 00000000..20574b78 --- /dev/null +++ b/test/support/fixtures/authorization/list_organization_roles.json @@ -0,0 +1,19 @@ +{ + "object": "list", + "data": [ + { + "slug": "slug", + "object": "role", + "id": "id", + "name": "name", + "description": "description", + "type": "EnvironmentRole", + "resource_type_slug": "resource_type_slug", + "permissions": [ + "permissions" + ], + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + } + ] +} diff --git a/test/support/fixtures/authorization/list_permissions.json b/test/support/fixtures/authorization/list_permissions.json new file mode 100644 index 00000000..00717f05 --- /dev/null +++ b/test/support/fixtures/authorization/list_permissions.json @@ -0,0 +1,28 @@ +{ + "data": [ + { + "object": "list", + "data": [ + { + "object": "permission", + "id": "id", + "slug": "slug", + "name": "name", + "description": "description", + "system": true, + "resource_type_slug": "resource_type_slug", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + } + ], + "list_metadata": { + "before": "before", + "after": "after" + } + } + ], + "list_metadata": { + "before": null, + "after": null + } +} diff --git a/test/support/fixtures/authorization/list_resources.json b/test/support/fixtures/authorization/list_resources.json new file mode 100644 index 00000000..52fbb4c2 --- /dev/null +++ b/test/support/fixtures/authorization/list_resources.json @@ -0,0 +1,29 @@ +{ + "data": [ + { + "object": "list", + "data": [ + { + "object": "authorization_resource", + "name": "name", + "description": "description", + "organization_id": "organization_id", + "parent_resource_id": "parent_resource_id", + "id": "id", + "external_id": "external_id", + "resource_type_slug": "resource_type_slug", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + } + ], + "list_metadata": { + "before": "before", + "after": "after" + } + } + ], + "list_metadata": { + "before": null, + "after": null + } +} diff --git a/test/support/fixtures/authorization/list_resources_for_membership.json b/test/support/fixtures/authorization/list_resources_for_membership.json new file mode 100644 index 00000000..52fbb4c2 --- /dev/null +++ b/test/support/fixtures/authorization/list_resources_for_membership.json @@ -0,0 +1,29 @@ +{ + "data": [ + { + "object": "list", + "data": [ + { + "object": "authorization_resource", + "name": "name", + "description": "description", + "organization_id": "organization_id", + "parent_resource_id": "parent_resource_id", + "id": "id", + "external_id": "external_id", + "resource_type_slug": "resource_type_slug", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + } + ], + "list_metadata": { + "before": "before", + "after": "after" + } + } + ], + "list_metadata": { + "before": null, + "after": null + } +} diff --git a/test/support/fixtures/authorization/list_role_assignments.json b/test/support/fixtures/authorization/list_role_assignments.json new file mode 100644 index 00000000..4b4eefc4 --- /dev/null +++ b/test/support/fixtures/authorization/list_role_assignments.json @@ -0,0 +1,36 @@ +{ + "data": [ + { + "object": "list", + "data": [ + { + "object": "role_assignment", + "id": "id", + "organization_membership_id": "organization_membership_id", + "role": { + "slug": "slug" + }, + "resource": { + "id": "id", + "external_id": "external_id", + "resource_type_slug": "resource_type_slug" + }, + "source": { + "type": "direct", + "group_role_assignment_id": "group_role_assignment_id" + }, + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + } + ], + "list_metadata": { + "before": "before", + "after": "after" + } + } + ], + "list_metadata": { + "before": null, + "after": null + } +} diff --git a/test/support/fixtures/authorization/list_role_assignments_for_resource.json b/test/support/fixtures/authorization/list_role_assignments_for_resource.json new file mode 100644 index 00000000..4b4eefc4 --- /dev/null +++ b/test/support/fixtures/authorization/list_role_assignments_for_resource.json @@ -0,0 +1,36 @@ +{ + "data": [ + { + "object": "list", + "data": [ + { + "object": "role_assignment", + "id": "id", + "organization_membership_id": "organization_membership_id", + "role": { + "slug": "slug" + }, + "resource": { + "id": "id", + "external_id": "external_id", + "resource_type_slug": "resource_type_slug" + }, + "source": { + "type": "direct", + "group_role_assignment_id": "group_role_assignment_id" + }, + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + } + ], + "list_metadata": { + "before": "before", + "after": "after" + } + } + ], + "list_metadata": { + "before": null, + "after": null + } +} diff --git a/test/support/fixtures/authorization/list_role_assignments_for_resource_by_external_id.json b/test/support/fixtures/authorization/list_role_assignments_for_resource_by_external_id.json new file mode 100644 index 00000000..4b4eefc4 --- /dev/null +++ b/test/support/fixtures/authorization/list_role_assignments_for_resource_by_external_id.json @@ -0,0 +1,36 @@ +{ + "data": [ + { + "object": "list", + "data": [ + { + "object": "role_assignment", + "id": "id", + "organization_membership_id": "organization_membership_id", + "role": { + "slug": "slug" + }, + "resource": { + "id": "id", + "external_id": "external_id", + "resource_type_slug": "resource_type_slug" + }, + "source": { + "type": "direct", + "group_role_assignment_id": "group_role_assignment_id" + }, + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + } + ], + "list_metadata": { + "before": "before", + "after": "after" + } + } + ], + "list_metadata": { + "before": null, + "after": null + } +} diff --git a/test/support/fixtures/authorization/remove_organization_role_permission.json b/test/support/fixtures/authorization/remove_organization_role_permission.json new file mode 100644 index 00000000..73b5d8e4 --- /dev/null +++ b/test/support/fixtures/authorization/remove_organization_role_permission.json @@ -0,0 +1,14 @@ +{ + "slug": "slug", + "object": "role", + "id": "id", + "name": "name", + "description": "description", + "type": "EnvironmentRole", + "resource_type_slug": "resource_type_slug", + "permissions": [ + "permissions" + ], + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" +} diff --git a/test/support/fixtures/authorization/set_environment_role_permissions.json b/test/support/fixtures/authorization/set_environment_role_permissions.json new file mode 100644 index 00000000..73b5d8e4 --- /dev/null +++ b/test/support/fixtures/authorization/set_environment_role_permissions.json @@ -0,0 +1,14 @@ +{ + "slug": "slug", + "object": "role", + "id": "id", + "name": "name", + "description": "description", + "type": "EnvironmentRole", + "resource_type_slug": "resource_type_slug", + "permissions": [ + "permissions" + ], + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" +} diff --git a/test/support/fixtures/authorization/set_organization_role_permissions.json b/test/support/fixtures/authorization/set_organization_role_permissions.json new file mode 100644 index 00000000..73b5d8e4 --- /dev/null +++ b/test/support/fixtures/authorization/set_organization_role_permissions.json @@ -0,0 +1,14 @@ +{ + "slug": "slug", + "object": "role", + "id": "id", + "name": "name", + "description": "description", + "type": "EnvironmentRole", + "resource_type_slug": "resource_type_slug", + "permissions": [ + "permissions" + ], + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" +} diff --git a/test/support/fixtures/authorization/update_environment_role.json b/test/support/fixtures/authorization/update_environment_role.json new file mode 100644 index 00000000..73b5d8e4 --- /dev/null +++ b/test/support/fixtures/authorization/update_environment_role.json @@ -0,0 +1,14 @@ +{ + "slug": "slug", + "object": "role", + "id": "id", + "name": "name", + "description": "description", + "type": "EnvironmentRole", + "resource_type_slug": "resource_type_slug", + "permissions": [ + "permissions" + ], + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" +} diff --git a/test/support/fixtures/authorization/update_group_role_assignments.json b/test/support/fixtures/authorization/update_group_role_assignments.json new file mode 100644 index 00000000..714b1b9d --- /dev/null +++ b/test/support/fixtures/authorization/update_group_role_assignments.json @@ -0,0 +1,24 @@ +{ + "object": "list", + "data": [ + { + "object": "group_role_assignment", + "id": "id", + "group_id": "group_id", + "role": { + "slug": "slug" + }, + "resource": { + "id": "id", + "external_id": "external_id", + "resource_type_slug": "resource_type_slug" + }, + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + } + ], + "list_metadata": { + "after": "after", + "before": "before" + } +} diff --git a/test/support/fixtures/authorization/update_organization_role.json b/test/support/fixtures/authorization/update_organization_role.json new file mode 100644 index 00000000..73b5d8e4 --- /dev/null +++ b/test/support/fixtures/authorization/update_organization_role.json @@ -0,0 +1,14 @@ +{ + "slug": "slug", + "object": "role", + "id": "id", + "name": "name", + "description": "description", + "type": "EnvironmentRole", + "resource_type_slug": "resource_type_slug", + "permissions": [ + "permissions" + ], + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" +} diff --git a/test/support/fixtures/authorization/update_permission.json b/test/support/fixtures/authorization/update_permission.json new file mode 100644 index 00000000..f280b1d3 --- /dev/null +++ b/test/support/fixtures/authorization/update_permission.json @@ -0,0 +1,11 @@ +{ + "object": "permission", + "id": "id", + "slug": "slug", + "name": "name", + "description": "description", + "system": true, + "resource_type_slug": "resource_type_slug", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" +} diff --git a/test/support/fixtures/authorization/update_resource.json b/test/support/fixtures/authorization/update_resource.json new file mode 100644 index 00000000..7e40b2f8 --- /dev/null +++ b/test/support/fixtures/authorization/update_resource.json @@ -0,0 +1,12 @@ +{ + "object": "authorization_resource", + "name": "name", + "description": "description", + "organization_id": "organization_id", + "parent_resource_id": "parent_resource_id", + "id": "id", + "external_id": "external_id", + "resource_type_slug": "resource_type_slug", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" +} diff --git a/test/support/fixtures/authorization/update_resource_by_external_id.json b/test/support/fixtures/authorization/update_resource_by_external_id.json new file mode 100644 index 00000000..7e40b2f8 --- /dev/null +++ b/test/support/fixtures/authorization/update_resource_by_external_id.json @@ -0,0 +1,12 @@ +{ + "object": "authorization_resource", + "name": "name", + "description": "description", + "organization_id": "organization_id", + "parent_resource_id": "parent_resource_id", + "id": "id", + "external_id": "external_id", + "resource_type_slug": "resource_type_slug", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" +} diff --git a/test/support/fixtures/client_api/create_token.json b/test/support/fixtures/client_api/create_token.json new file mode 100644 index 00000000..ba6edfe2 --- /dev/null +++ b/test/support/fixtures/client_api/create_token.json @@ -0,0 +1,3 @@ +{ + "token": "token" +} diff --git a/test/support/fixtures/connect/complete_oauth2.json b/test/support/fixtures/connect/complete_oauth2.json new file mode 100644 index 00000000..c2335349 --- /dev/null +++ b/test/support/fixtures/connect/complete_oauth2.json @@ -0,0 +1,3 @@ +{ + "redirect_uri": "redirect_uri" +} diff --git a/test/support/fixtures/connect/create_application.json b/test/support/fixtures/connect/create_application.json new file mode 100644 index 00000000..0cd8202f --- /dev/null +++ b/test/support/fixtures/connect/create_application.json @@ -0,0 +1,12 @@ +{ + "object": "connect_application", + "id": "id", + "client_id": "client_id", + "description": "description", + "name": "name", + "scopes": [ + "scopes" + ], + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" +} diff --git a/test/support/fixtures/connect/create_application_client_secret.json b/test/support/fixtures/connect/create_application_client_secret.json new file mode 100644 index 00000000..eeb8c9b7 --- /dev/null +++ b/test/support/fixtures/connect/create_application_client_secret.json @@ -0,0 +1,9 @@ +{ + "object": "connect_application_secret", + "id": "id", + "secret_hint": "secret_hint", + "last_used_at": "2024-01-01T00:00:00.000Z", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z", + "secret": "secret" +} diff --git a/test/support/fixtures/connect/create_m2m_application.json b/test/support/fixtures/connect/create_m2m_application.json new file mode 100644 index 00000000..0cd8202f --- /dev/null +++ b/test/support/fixtures/connect/create_m2m_application.json @@ -0,0 +1,12 @@ +{ + "object": "connect_application", + "id": "id", + "client_id": "client_id", + "description": "description", + "name": "name", + "scopes": [ + "scopes" + ], + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" +} diff --git a/test/support/fixtures/connect/create_oauth_application.json b/test/support/fixtures/connect/create_oauth_application.json new file mode 100644 index 00000000..0cd8202f --- /dev/null +++ b/test/support/fixtures/connect/create_oauth_application.json @@ -0,0 +1,12 @@ +{ + "object": "connect_application", + "id": "id", + "client_id": "client_id", + "description": "description", + "name": "name", + "scopes": [ + "scopes" + ], + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" +} diff --git a/test/support/fixtures/connect/get_application.json b/test/support/fixtures/connect/get_application.json new file mode 100644 index 00000000..0cd8202f --- /dev/null +++ b/test/support/fixtures/connect/get_application.json @@ -0,0 +1,12 @@ +{ + "object": "connect_application", + "id": "id", + "client_id": "client_id", + "description": "description", + "name": "name", + "scopes": [ + "scopes" + ], + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" +} diff --git a/test/support/fixtures/connect/list_application_client_secrets.json b/test/support/fixtures/connect/list_application_client_secrets.json new file mode 100644 index 00000000..b6963b08 --- /dev/null +++ b/test/support/fixtures/connect/list_application_client_secrets.json @@ -0,0 +1,10 @@ +[ + { + "object": "connect_application_secret", + "id": "id", + "secret_hint": "secret_hint", + "last_used_at": "2024-01-01T00:00:00.000Z", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + } +] diff --git a/test/support/fixtures/connect/list_applications.json b/test/support/fixtures/connect/list_applications.json new file mode 100644 index 00000000..e99676d4 --- /dev/null +++ b/test/support/fixtures/connect/list_applications.json @@ -0,0 +1,29 @@ +{ + "data": [ + { + "object": "list", + "data": [ + { + "object": "connect_application", + "id": "id", + "client_id": "client_id", + "description": "description", + "name": "name", + "scopes": [ + "scopes" + ], + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + } + ], + "list_metadata": { + "before": "before", + "after": "after" + } + } + ], + "list_metadata": { + "before": null, + "after": null + } +} diff --git a/test/support/fixtures/connect/update_application.json b/test/support/fixtures/connect/update_application.json new file mode 100644 index 00000000..0cd8202f --- /dev/null +++ b/test/support/fixtures/connect/update_application.json @@ -0,0 +1,12 @@ +{ + "object": "connect_application", + "id": "id", + "client_id": "client_id", + "description": "description", + "name": "name", + "scopes": [ + "scopes" + ], + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" +} diff --git a/test/support/fixtures/directory_sync/get_directory.json b/test/support/fixtures/directory_sync/get_directory.json new file mode 100644 index 00000000..cc8d1a9f --- /dev/null +++ b/test/support/fixtures/directory_sync/get_directory.json @@ -0,0 +1,19 @@ +{ + "object": "directory", + "id": "id", + "organization_id": "organization_id", + "external_key": "external_key", + "type": "azure scim v2.0", + "state": "linked", + "name": "name", + "domain": "domain", + "metadata": { + "users": { + "active": 1, + "inactive": 1 + }, + "groups": 1 + }, + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" +} diff --git a/test/support/fixtures/directory_sync/get_group.json b/test/support/fixtures/directory_sync/get_group.json new file mode 100644 index 00000000..b85d319c --- /dev/null +++ b/test/support/fixtures/directory_sync/get_group.json @@ -0,0 +1,11 @@ +{ + "object": "directory_group", + "id": "id", + "idp_id": "idp_id", + "directory_id": "directory_id", + "organization_id": "organization_id", + "name": "name", + "raw_attributes": {}, + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" +} diff --git a/test/support/fixtures/directory_sync/get_user.json b/test/support/fixtures/directory_sync/get_user.json new file mode 100644 index 00000000..582ea6c0 --- /dev/null +++ b/test/support/fixtures/directory_sync/get_user.json @@ -0,0 +1,46 @@ +{ + "object": "directory_user", + "id": "id", + "directory_id": "directory_id", + "organization_id": "organization_id", + "idp_id": "idp_id", + "email": "email", + "first_name": "first_name", + "last_name": "last_name", + "name": "name", + "emails": [ + { + "primary": true, + "type": "type", + "value": "value" + } + ], + "job_title": "job_title", + "username": "username", + "state": "active", + "raw_attributes": {}, + "custom_attributes": {}, + "role": { + "slug": "slug" + }, + "roles": [ + { + "slug": "slug" + } + ], + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z", + "groups": [ + { + "object": "directory_group", + "id": "id", + "idp_id": "idp_id", + "directory_id": "directory_id", + "organization_id": "organization_id", + "name": "name", + "raw_attributes": {}, + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + } + ] +} diff --git a/test/support/fixtures/directory_sync/list_directories.json b/test/support/fixtures/directory_sync/list_directories.json new file mode 100644 index 00000000..cf1772f2 --- /dev/null +++ b/test/support/fixtures/directory_sync/list_directories.json @@ -0,0 +1,33 @@ +{ + "data": [ + { + "object": "list", + "data": [ + { + "object": "directory", + "id": "id", + "organization_id": "organization_id", + "external_key": "external_key", + "type": "azure scim v2.0", + "state": "linked", + "name": "name", + "domain": "domain", + "metadata": { + "users": {}, + "groups": 1 + }, + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + } + ], + "list_metadata": { + "before": "before", + "after": "after" + } + } + ], + "list_metadata": { + "before": null, + "after": null + } +} diff --git a/test/support/fixtures/directory_sync/list_groups.json b/test/support/fixtures/directory_sync/list_groups.json new file mode 100644 index 00000000..2b7a1228 --- /dev/null +++ b/test/support/fixtures/directory_sync/list_groups.json @@ -0,0 +1,28 @@ +{ + "data": [ + { + "object": "list", + "data": [ + { + "object": "directory_group", + "id": "id", + "idp_id": "idp_id", + "directory_id": "directory_id", + "organization_id": "organization_id", + "name": "name", + "raw_attributes": {}, + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + } + ], + "list_metadata": { + "before": "before", + "after": "after" + } + } + ], + "list_metadata": { + "before": null, + "after": null + } +} diff --git a/test/support/fixtures/directory_sync/list_users.json b/test/support/fixtures/directory_sync/list_users.json new file mode 100644 index 00000000..1902eadd --- /dev/null +++ b/test/support/fixtures/directory_sync/list_users.json @@ -0,0 +1,47 @@ +{ + "data": [ + { + "object": "list", + "data": [ + { + "object": "directory_user", + "id": "id", + "directory_id": "directory_id", + "organization_id": "organization_id", + "idp_id": "idp_id", + "email": "email", + "first_name": "first_name", + "last_name": "last_name", + "name": "name", + "emails": [ + {} + ], + "job_title": "job_title", + "username": "username", + "state": "active", + "raw_attributes": {}, + "custom_attributes": {}, + "role": { + "slug": "slug" + }, + "roles": [ + {} + ], + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z", + "groups": [ + {} + ] + } + ], + "list_metadata": { + "before": "before", + "after": "after" + } + } + ], + "list_metadata": { + "before": null, + "after": null + } +} diff --git a/test/support/fixtures/events/list_events.json b/test/support/fixtures/events/list_events.json new file mode 100644 index 00000000..4a5faba8 --- /dev/null +++ b/test/support/fixtures/events/list_events.json @@ -0,0 +1,24 @@ +{ + "data": [ + { + "object": "list", + "data": [ + { + "object": "event", + "id": "id", + "event": "event", + "data": {}, + "created_at": "2024-01-01T00:00:00.000Z", + "context": {} + } + ], + "list_metadata": { + "after": "after" + } + } + ], + "list_metadata": { + "before": null, + "after": null + } +} diff --git a/test/support/fixtures/feature_flags/disable_feature_flag.json b/test/support/fixtures/feature_flags/disable_feature_flag.json new file mode 100644 index 00000000..19e284db --- /dev/null +++ b/test/support/fixtures/feature_flags/disable_feature_flag.json @@ -0,0 +1,19 @@ +{ + "object": "feature_flag", + "id": "id", + "slug": "slug", + "name": "name", + "description": "description", + "owner": { + "email": "email", + "first_name": "first_name", + "last_name": "last_name" + }, + "tags": [ + "tags" + ], + "enabled": true, + "default_value": true, + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" +} diff --git a/test/support/fixtures/feature_flags/enable_feature_flag.json b/test/support/fixtures/feature_flags/enable_feature_flag.json new file mode 100644 index 00000000..19e284db --- /dev/null +++ b/test/support/fixtures/feature_flags/enable_feature_flag.json @@ -0,0 +1,19 @@ +{ + "object": "feature_flag", + "id": "id", + "slug": "slug", + "name": "name", + "description": "description", + "owner": { + "email": "email", + "first_name": "first_name", + "last_name": "last_name" + }, + "tags": [ + "tags" + ], + "enabled": true, + "default_value": true, + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" +} diff --git a/test/support/fixtures/feature_flags/get_feature_flag.json b/test/support/fixtures/feature_flags/get_feature_flag.json new file mode 100644 index 00000000..19e284db --- /dev/null +++ b/test/support/fixtures/feature_flags/get_feature_flag.json @@ -0,0 +1,19 @@ +{ + "object": "feature_flag", + "id": "id", + "slug": "slug", + "name": "name", + "description": "description", + "owner": { + "email": "email", + "first_name": "first_name", + "last_name": "last_name" + }, + "tags": [ + "tags" + ], + "enabled": true, + "default_value": true, + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" +} diff --git a/test/support/fixtures/feature_flags/list_feature_flags.json b/test/support/fixtures/feature_flags/list_feature_flags.json new file mode 100644 index 00000000..14b5f92e --- /dev/null +++ b/test/support/fixtures/feature_flags/list_feature_flags.json @@ -0,0 +1,36 @@ +{ + "data": [ + { + "object": "list", + "data": [ + { + "object": "feature_flag", + "id": "id", + "slug": "slug", + "name": "name", + "description": "description", + "owner": { + "email": "email", + "first_name": "first_name", + "last_name": "last_name" + }, + "tags": [ + "tags" + ], + "enabled": true, + "default_value": true, + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + } + ], + "list_metadata": { + "before": "before", + "after": "after" + } + } + ], + "list_metadata": { + "before": null, + "after": null + } +} diff --git a/test/support/fixtures/feature_flags/list_organization_feature_flags.json b/test/support/fixtures/feature_flags/list_organization_feature_flags.json new file mode 100644 index 00000000..14b5f92e --- /dev/null +++ b/test/support/fixtures/feature_flags/list_organization_feature_flags.json @@ -0,0 +1,36 @@ +{ + "data": [ + { + "object": "list", + "data": [ + { + "object": "feature_flag", + "id": "id", + "slug": "slug", + "name": "name", + "description": "description", + "owner": { + "email": "email", + "first_name": "first_name", + "last_name": "last_name" + }, + "tags": [ + "tags" + ], + "enabled": true, + "default_value": true, + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + } + ], + "list_metadata": { + "before": "before", + "after": "after" + } + } + ], + "list_metadata": { + "before": null, + "after": null + } +} diff --git a/test/support/fixtures/feature_flags/list_user_feature_flags.json b/test/support/fixtures/feature_flags/list_user_feature_flags.json new file mode 100644 index 00000000..14b5f92e --- /dev/null +++ b/test/support/fixtures/feature_flags/list_user_feature_flags.json @@ -0,0 +1,36 @@ +{ + "data": [ + { + "object": "list", + "data": [ + { + "object": "feature_flag", + "id": "id", + "slug": "slug", + "name": "name", + "description": "description", + "owner": { + "email": "email", + "first_name": "first_name", + "last_name": "last_name" + }, + "tags": [ + "tags" + ], + "enabled": true, + "default_value": true, + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + } + ], + "list_metadata": { + "before": "before", + "after": "after" + } + } + ], + "list_metadata": { + "before": null, + "after": null + } +} diff --git a/test/support/fixtures/groups/create_group_organization_membership.json b/test/support/fixtures/groups/create_group_organization_membership.json new file mode 100644 index 00000000..1ed21a8f --- /dev/null +++ b/test/support/fixtures/groups/create_group_organization_membership.json @@ -0,0 +1,9 @@ +{ + "object": "group", + "id": "id", + "organization_id": "organization_id", + "name": "name", + "description": "description", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" +} diff --git a/test/support/fixtures/groups/create_organization_group.json b/test/support/fixtures/groups/create_organization_group.json new file mode 100644 index 00000000..1ed21a8f --- /dev/null +++ b/test/support/fixtures/groups/create_organization_group.json @@ -0,0 +1,9 @@ +{ + "object": "group", + "id": "id", + "organization_id": "organization_id", + "name": "name", + "description": "description", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" +} diff --git a/test/support/fixtures/groups/get_organization_group.json b/test/support/fixtures/groups/get_organization_group.json new file mode 100644 index 00000000..1ed21a8f --- /dev/null +++ b/test/support/fixtures/groups/get_organization_group.json @@ -0,0 +1,9 @@ +{ + "object": "group", + "id": "id", + "organization_id": "organization_id", + "name": "name", + "description": "description", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" +} diff --git a/test/support/fixtures/groups/list_group_organization_memberships.json b/test/support/fixtures/groups/list_group_organization_memberships.json new file mode 100644 index 00000000..b2b9587e --- /dev/null +++ b/test/support/fixtures/groups/list_group_organization_memberships.json @@ -0,0 +1,45 @@ +{ + "data": [ + { + "object": "list", + "data": [ + { + "object": "organization_membership", + "id": "id", + "user_id": "user_id", + "organization_id": "organization_id", + "status": "active", + "directory_managed": true, + "organization_name": "organization_name", + "custom_attributes": {}, + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z", + "user": { + "object": "user", + "id": "id", + "first_name": "first_name", + "last_name": "last_name", + "name": "name", + "profile_picture_url": "profile_picture_url", + "email": "email", + "email_verified": true, + "external_id": "external_id", + "metadata": {}, + "last_sign_in_at": "2024-01-01T00:00:00.000Z", + "locale": "locale", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + } + } + ], + "list_metadata": { + "before": "before", + "after": "after" + } + } + ], + "list_metadata": { + "before": null, + "after": null + } +} diff --git a/test/support/fixtures/groups/list_organization_groups.json b/test/support/fixtures/groups/list_organization_groups.json new file mode 100644 index 00000000..a39e2a73 --- /dev/null +++ b/test/support/fixtures/groups/list_organization_groups.json @@ -0,0 +1,26 @@ +{ + "data": [ + { + "object": "list", + "data": [ + { + "object": "group", + "id": "id", + "organization_id": "organization_id", + "name": "name", + "description": "description", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + } + ], + "list_metadata": { + "before": "before", + "after": "after" + } + } + ], + "list_metadata": { + "before": null, + "after": null + } +} diff --git a/test/support/fixtures/groups/update_organization_group.json b/test/support/fixtures/groups/update_organization_group.json new file mode 100644 index 00000000..1ed21a8f --- /dev/null +++ b/test/support/fixtures/groups/update_organization_group.json @@ -0,0 +1,9 @@ +{ + "object": "group", + "id": "id", + "organization_id": "organization_id", + "name": "name", + "description": "description", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" +} diff --git a/test/support/fixtures/multi_factor_auth/challenge_factor.json b/test/support/fixtures/multi_factor_auth/challenge_factor.json new file mode 100644 index 00000000..e9173941 --- /dev/null +++ b/test/support/fixtures/multi_factor_auth/challenge_factor.json @@ -0,0 +1,9 @@ +{ + "object": "authentication_challenge", + "id": "id", + "expires_at": "2024-01-01T00:00:00.000Z", + "code": "code", + "authentication_factor_id": "authentication_factor_id", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" +} diff --git a/test/support/fixtures/multi_factor_auth/create_user_auth_factor.json b/test/support/fixtures/multi_factor_auth/create_user_auth_factor.json new file mode 100644 index 00000000..e76421f6 --- /dev/null +++ b/test/support/fixtures/multi_factor_auth/create_user_auth_factor.json @@ -0,0 +1,29 @@ +{ + "authentication_factor": { + "object": "authentication_factor", + "id": "id", + "type": "generic_otp", + "user_id": "user_id", + "sms": { + "phone_number": "phone_number" + }, + "totp": { + "issuer": "issuer", + "user": "user", + "secret": "secret", + "qr_code": "qr_code", + "uri": "uri" + }, + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + }, + "authentication_challenge": { + "object": "authentication_challenge", + "id": "id", + "expires_at": "2024-01-01T00:00:00.000Z", + "code": "code", + "authentication_factor_id": "authentication_factor_id", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + } +} diff --git a/test/support/fixtures/multi_factor_auth/enroll_factor.json b/test/support/fixtures/multi_factor_auth/enroll_factor.json new file mode 100644 index 00000000..b90f003f --- /dev/null +++ b/test/support/fixtures/multi_factor_auth/enroll_factor.json @@ -0,0 +1,18 @@ +{ + "object": "authentication_factor", + "id": "id", + "type": "generic_otp", + "user_id": "user_id", + "sms": { + "phone_number": "phone_number" + }, + "totp": { + "issuer": "issuer", + "user": "user", + "secret": "secret", + "qr_code": "qr_code", + "uri": "uri" + }, + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" +} diff --git a/test/support/fixtures/multi_factor_auth/get_factor.json b/test/support/fixtures/multi_factor_auth/get_factor.json new file mode 100644 index 00000000..7d9b5f1e --- /dev/null +++ b/test/support/fixtures/multi_factor_auth/get_factor.json @@ -0,0 +1,15 @@ +{ + "object": "authentication_factor", + "id": "id", + "type": "generic_otp", + "user_id": "user_id", + "sms": { + "phone_number": "phone_number" + }, + "totp": { + "issuer": "issuer", + "user": "user" + }, + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" +} diff --git a/test/support/fixtures/multi_factor_auth/list_user_auth_factors.json b/test/support/fixtures/multi_factor_auth/list_user_auth_factors.json new file mode 100644 index 00000000..e3c48867 --- /dev/null +++ b/test/support/fixtures/multi_factor_auth/list_user_auth_factors.json @@ -0,0 +1,32 @@ +{ + "data": [ + { + "object": "list", + "data": [ + { + "object": "authentication_factor", + "id": "id", + "type": "generic_otp", + "user_id": "user_id", + "sms": { + "phone_number": "phone_number" + }, + "totp": { + "issuer": "issuer", + "user": "user" + }, + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + } + ], + "list_metadata": { + "before": "before", + "after": "after" + } + } + ], + "list_metadata": { + "before": null, + "after": null + } +} diff --git a/test/support/fixtures/multi_factor_auth/verify_challenge.json b/test/support/fixtures/multi_factor_auth/verify_challenge.json new file mode 100644 index 00000000..8511b1e6 --- /dev/null +++ b/test/support/fixtures/multi_factor_auth/verify_challenge.json @@ -0,0 +1,12 @@ +{ + "challenge": { + "object": "authentication_challenge", + "id": "id", + "expires_at": "2024-01-01T00:00:00.000Z", + "code": "code", + "authentication_factor_id": "authentication_factor_id", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + }, + "valid": true +} diff --git a/test/support/fixtures/organization_domains/create_organization_domain.json b/test/support/fixtures/organization_domains/create_organization_domain.json new file mode 100644 index 00000000..7c2a2e41 --- /dev/null +++ b/test/support/fixtures/organization_domains/create_organization_domain.json @@ -0,0 +1,12 @@ +{ + "object": "organization_domain", + "id": "id", + "organization_id": "organization_id", + "domain": "domain", + "state": "failed", + "verification_prefix": "verification_prefix", + "verification_token": "verification_token", + "verification_strategy": "dns", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" +} diff --git a/test/support/fixtures/organization_domains/get_organization_domain.json b/test/support/fixtures/organization_domains/get_organization_domain.json new file mode 100644 index 00000000..7c2a2e41 --- /dev/null +++ b/test/support/fixtures/organization_domains/get_organization_domain.json @@ -0,0 +1,12 @@ +{ + "object": "organization_domain", + "id": "id", + "organization_id": "organization_id", + "domain": "domain", + "state": "failed", + "verification_prefix": "verification_prefix", + "verification_token": "verification_token", + "verification_strategy": "dns", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" +} diff --git a/test/support/fixtures/organization_domains/verify_organization_domain.json b/test/support/fixtures/organization_domains/verify_organization_domain.json new file mode 100644 index 00000000..7c2a2e41 --- /dev/null +++ b/test/support/fixtures/organization_domains/verify_organization_domain.json @@ -0,0 +1,12 @@ +{ + "object": "organization_domain", + "id": "id", + "organization_id": "organization_id", + "domain": "domain", + "state": "failed", + "verification_prefix": "verification_prefix", + "verification_token": "verification_token", + "verification_strategy": "dns", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" +} diff --git a/test/support/fixtures/organization_membership/create_organization_membership.json b/test/support/fixtures/organization_membership/create_organization_membership.json new file mode 100644 index 00000000..853749e7 --- /dev/null +++ b/test/support/fixtures/organization_membership/create_organization_membership.json @@ -0,0 +1,36 @@ +{ + "object": "organization_membership", + "id": "id", + "user_id": "user_id", + "organization_id": "organization_id", + "status": "active", + "directory_managed": true, + "organization_name": "organization_name", + "custom_attributes": {}, + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z", + "role": { + "slug": "slug" + }, + "roles": [ + { + "slug": "slug" + } + ], + "user": { + "object": "user", + "id": "id", + "first_name": "first_name", + "last_name": "last_name", + "name": "name", + "profile_picture_url": "profile_picture_url", + "email": "email", + "email_verified": true, + "external_id": "external_id", + "metadata": {}, + "last_sign_in_at": "2024-01-01T00:00:00.000Z", + "locale": "locale", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + } +} diff --git a/test/support/fixtures/organization_membership/deactivate_organization_membership.json b/test/support/fixtures/organization_membership/deactivate_organization_membership.json new file mode 100644 index 00000000..853749e7 --- /dev/null +++ b/test/support/fixtures/organization_membership/deactivate_organization_membership.json @@ -0,0 +1,36 @@ +{ + "object": "organization_membership", + "id": "id", + "user_id": "user_id", + "organization_id": "organization_id", + "status": "active", + "directory_managed": true, + "organization_name": "organization_name", + "custom_attributes": {}, + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z", + "role": { + "slug": "slug" + }, + "roles": [ + { + "slug": "slug" + } + ], + "user": { + "object": "user", + "id": "id", + "first_name": "first_name", + "last_name": "last_name", + "name": "name", + "profile_picture_url": "profile_picture_url", + "email": "email", + "email_verified": true, + "external_id": "external_id", + "metadata": {}, + "last_sign_in_at": "2024-01-01T00:00:00.000Z", + "locale": "locale", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + } +} diff --git a/test/support/fixtures/organization_membership/get_organization_membership.json b/test/support/fixtures/organization_membership/get_organization_membership.json new file mode 100644 index 00000000..853749e7 --- /dev/null +++ b/test/support/fixtures/organization_membership/get_organization_membership.json @@ -0,0 +1,36 @@ +{ + "object": "organization_membership", + "id": "id", + "user_id": "user_id", + "organization_id": "organization_id", + "status": "active", + "directory_managed": true, + "organization_name": "organization_name", + "custom_attributes": {}, + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z", + "role": { + "slug": "slug" + }, + "roles": [ + { + "slug": "slug" + } + ], + "user": { + "object": "user", + "id": "id", + "first_name": "first_name", + "last_name": "last_name", + "name": "name", + "profile_picture_url": "profile_picture_url", + "email": "email", + "email_verified": true, + "external_id": "external_id", + "metadata": {}, + "last_sign_in_at": "2024-01-01T00:00:00.000Z", + "locale": "locale", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + } +} diff --git a/test/support/fixtures/organization_membership/list_organization_membership_groups.json b/test/support/fixtures/organization_membership/list_organization_membership_groups.json new file mode 100644 index 00000000..a39e2a73 --- /dev/null +++ b/test/support/fixtures/organization_membership/list_organization_membership_groups.json @@ -0,0 +1,26 @@ +{ + "data": [ + { + "object": "list", + "data": [ + { + "object": "group", + "id": "id", + "organization_id": "organization_id", + "name": "name", + "description": "description", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + } + ], + "list_metadata": { + "before": "before", + "after": "after" + } + } + ], + "list_metadata": { + "before": null, + "after": null + } +} diff --git a/test/support/fixtures/organization_membership/list_organization_memberships.json b/test/support/fixtures/organization_membership/list_organization_memberships.json new file mode 100644 index 00000000..f511700a --- /dev/null +++ b/test/support/fixtures/organization_membership/list_organization_memberships.json @@ -0,0 +1,51 @@ +{ + "data": [ + { + "object": "list", + "data": [ + { + "object": "organization_membership", + "id": "id", + "user_id": "user_id", + "organization_id": "organization_id", + "status": "active", + "directory_managed": true, + "organization_name": "organization_name", + "custom_attributes": {}, + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z", + "role": { + "slug": "slug" + }, + "roles": [ + {} + ], + "user": { + "object": "user", + "id": "id", + "first_name": "first_name", + "last_name": "last_name", + "name": "name", + "profile_picture_url": "profile_picture_url", + "email": "email", + "email_verified": true, + "external_id": "external_id", + "metadata": {}, + "last_sign_in_at": "2024-01-01T00:00:00.000Z", + "locale": "locale", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + } + } + ], + "list_metadata": { + "before": "before", + "after": "after" + } + } + ], + "list_metadata": { + "before": null, + "after": null + } +} diff --git a/test/support/fixtures/organization_membership/reactivate_organization_membership.json b/test/support/fixtures/organization_membership/reactivate_organization_membership.json new file mode 100644 index 00000000..853749e7 --- /dev/null +++ b/test/support/fixtures/organization_membership/reactivate_organization_membership.json @@ -0,0 +1,36 @@ +{ + "object": "organization_membership", + "id": "id", + "user_id": "user_id", + "organization_id": "organization_id", + "status": "active", + "directory_managed": true, + "organization_name": "organization_name", + "custom_attributes": {}, + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z", + "role": { + "slug": "slug" + }, + "roles": [ + { + "slug": "slug" + } + ], + "user": { + "object": "user", + "id": "id", + "first_name": "first_name", + "last_name": "last_name", + "name": "name", + "profile_picture_url": "profile_picture_url", + "email": "email", + "email_verified": true, + "external_id": "external_id", + "metadata": {}, + "last_sign_in_at": "2024-01-01T00:00:00.000Z", + "locale": "locale", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + } +} diff --git a/test/support/fixtures/organization_membership/update_organization_membership.json b/test/support/fixtures/organization_membership/update_organization_membership.json new file mode 100644 index 00000000..853749e7 --- /dev/null +++ b/test/support/fixtures/organization_membership/update_organization_membership.json @@ -0,0 +1,36 @@ +{ + "object": "organization_membership", + "id": "id", + "user_id": "user_id", + "organization_id": "organization_id", + "status": "active", + "directory_managed": true, + "organization_name": "organization_name", + "custom_attributes": {}, + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z", + "role": { + "slug": "slug" + }, + "roles": [ + { + "slug": "slug" + } + ], + "user": { + "object": "user", + "id": "id", + "first_name": "first_name", + "last_name": "last_name", + "name": "name", + "profile_picture_url": "profile_picture_url", + "email": "email", + "email_verified": true, + "external_id": "external_id", + "metadata": {}, + "last_sign_in_at": "2024-01-01T00:00:00.000Z", + "locale": "locale", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + } +} diff --git a/test/support/fixtures/organizations/create_organization.json b/test/support/fixtures/organizations/create_organization.json new file mode 100644 index 00000000..bdbda955 --- /dev/null +++ b/test/support/fixtures/organizations/create_organization.json @@ -0,0 +1,25 @@ +{ + "object": "organization", + "id": "id", + "name": "name", + "domains": [ + { + "object": "organization_domain", + "id": "id", + "organization_id": "organization_id", + "domain": "domain", + "state": "failed", + "verification_prefix": "verification_prefix", + "verification_token": "verification_token", + "verification_strategy": "dns", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + } + ], + "metadata": {}, + "external_id": "external_id", + "stripe_customer_id": "stripe_customer_id", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z", + "allow_profiles_outside_organization": true +} diff --git a/test/support/fixtures/organizations/get_audit_log_configuration.json b/test/support/fixtures/organizations/get_audit_log_configuration.json new file mode 100644 index 00000000..ff391d66 --- /dev/null +++ b/test/support/fixtures/organizations/get_audit_log_configuration.json @@ -0,0 +1,12 @@ +{ + "organization_id": "organization_id", + "retention_period_in_days": 1, + "state": "active", + "log_stream": { + "id": "id", + "type": "AzureSentinel", + "state": "active", + "last_synced_at": "last_synced_at", + "created_at": "2024-01-01T00:00:00.000Z" + } +} diff --git a/test/support/fixtures/organizations/get_organization.json b/test/support/fixtures/organizations/get_organization.json new file mode 100644 index 00000000..bdbda955 --- /dev/null +++ b/test/support/fixtures/organizations/get_organization.json @@ -0,0 +1,25 @@ +{ + "object": "organization", + "id": "id", + "name": "name", + "domains": [ + { + "object": "organization_domain", + "id": "id", + "organization_id": "organization_id", + "domain": "domain", + "state": "failed", + "verification_prefix": "verification_prefix", + "verification_token": "verification_token", + "verification_strategy": "dns", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + } + ], + "metadata": {}, + "external_id": "external_id", + "stripe_customer_id": "stripe_customer_id", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z", + "allow_profiles_outside_organization": true +} diff --git a/test/support/fixtures/organizations/get_organization_by_external_id.json b/test/support/fixtures/organizations/get_organization_by_external_id.json new file mode 100644 index 00000000..bdbda955 --- /dev/null +++ b/test/support/fixtures/organizations/get_organization_by_external_id.json @@ -0,0 +1,25 @@ +{ + "object": "organization", + "id": "id", + "name": "name", + "domains": [ + { + "object": "organization_domain", + "id": "id", + "organization_id": "organization_id", + "domain": "domain", + "state": "failed", + "verification_prefix": "verification_prefix", + "verification_token": "verification_token", + "verification_strategy": "dns", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + } + ], + "metadata": {}, + "external_id": "external_id", + "stripe_customer_id": "stripe_customer_id", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z", + "allow_profiles_outside_organization": true +} diff --git a/test/support/fixtures/organizations/list_authorized_applications.json b/test/support/fixtures/organizations/list_authorized_applications.json new file mode 100644 index 00000000..0a9615b3 --- /dev/null +++ b/test/support/fixtures/organizations/list_authorized_applications.json @@ -0,0 +1,36 @@ +{ + "data": [ + { + "object": "list", + "data": [ + { + "object": "authorized_connect_application", + "id": "id", + "granted_scopes": [ + "granted_scopes" + ], + "oauth_resource": "oauth_resource", + "application": { + "object": "connect_application", + "id": "id", + "client_id": "client_id", + "description": "description", + "name": "name", + "scopes": [], + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + }, + "user_id": "user_id" + } + ], + "list_metadata": { + "before": "before", + "after": "after" + } + } + ], + "list_metadata": { + "before": null, + "after": null + } +} diff --git a/test/support/fixtures/organizations/list_organizations.json b/test/support/fixtures/organizations/list_organizations.json new file mode 100644 index 00000000..bb5a196f --- /dev/null +++ b/test/support/fixtures/organizations/list_organizations.json @@ -0,0 +1,31 @@ +{ + "data": [ + { + "object": "list", + "data": [ + { + "object": "organization", + "id": "id", + "name": "name", + "domains": [ + {} + ], + "metadata": {}, + "external_id": "external_id", + "stripe_customer_id": "stripe_customer_id", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z", + "allow_profiles_outside_organization": true + } + ], + "list_metadata": { + "before": "before", + "after": "after" + } + } + ], + "list_metadata": { + "before": null, + "after": null + } +} diff --git a/test/support/fixtures/organizations/update_organization.json b/test/support/fixtures/organizations/update_organization.json new file mode 100644 index 00000000..bdbda955 --- /dev/null +++ b/test/support/fixtures/organizations/update_organization.json @@ -0,0 +1,25 @@ +{ + "object": "organization", + "id": "id", + "name": "name", + "domains": [ + { + "object": "organization_domain", + "id": "id", + "organization_id": "organization_id", + "domain": "domain", + "state": "failed", + "verification_prefix": "verification_prefix", + "verification_token": "verification_token", + "verification_strategy": "dns", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + } + ], + "metadata": {}, + "external_id": "external_id", + "stripe_customer_id": "stripe_customer_id", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z", + "allow_profiles_outside_organization": true +} diff --git a/test/support/fixtures/pipes/authorize_data_integration.json b/test/support/fixtures/pipes/authorize_data_integration.json new file mode 100644 index 00000000..6895e9af --- /dev/null +++ b/test/support/fixtures/pipes/authorize_data_integration.json @@ -0,0 +1,3 @@ +{ + "url": "url" +} diff --git a/test/support/fixtures/pipes/create_data_integration.json b/test/support/fixtures/pipes/create_data_integration.json new file mode 100644 index 00000000..aff2a03e --- /dev/null +++ b/test/support/fixtures/pipes/create_data_integration.json @@ -0,0 +1,43 @@ +{ + "object": "data_integration", + "id": "id", + "slug": "slug", + "integration_type": "integration_type", + "description": "description", + "enabled": true, + "state": "valid", + "scopes": [ + "scopes" + ], + "redirect_uri": "redirect_uri", + "auth_methods": [ + "oauth" + ], + "credentials": { + "type": "custom", + "client_id": "client_id", + "redacted_client_secret": "redacted_client_secret" + }, + "installation": { + "id": "id", + "user_id": "user_id", + "organization_id": "organization_id", + "api_key_last_4": "api_key_last_4" + }, + "config": {}, + "custom_provider": { + "name": "name", + "authorization_url": "authorization_url", + "token_url": "token_url", + "refresh_token_url": "refresh_token_url", + "pkce_enabled": true, + "request_scope_separator": "request_scope_separator", + "scopes_required": true, + "client_secret_required": true, + "additional_authorization_parameters": {}, + "token_body_content_type": "token_body_content_type", + "authenticate_via": "request_body" + }, + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" +} diff --git a/test/support/fixtures/pipes/create_data_integration_credential.json b/test/support/fixtures/pipes/create_data_integration_credential.json new file mode 100644 index 00000000..3e26dbdd --- /dev/null +++ b/test/support/fixtures/pipes/create_data_integration_credential.json @@ -0,0 +1,16 @@ +{ + "active": true, + "credential": { + "object": "credential", + "auth_method": "oauth", + "value": "value", + "expires_at": "expires_at", + "scopes": [ + "scopes" + ], + "missing_scopes": [ + "missing_scopes" + ] + }, + "error": "not_installed" +} diff --git a/test/support/fixtures/pipes/create_user_connected_account.json b/test/support/fixtures/pipes/create_user_connected_account.json new file mode 100644 index 00000000..84713edf --- /dev/null +++ b/test/support/fixtures/pipes/create_user_connected_account.json @@ -0,0 +1,14 @@ +{ + "object": "connected_account", + "id": "id", + "user_id": "user_id", + "organization_id": "organization_id", + "scopes": [ + "scopes" + ], + "auth_method": "oauth", + "api_key_last_4": "api_key_last_4", + "state": "connected", + "created_at": "created_at", + "updated_at": "updated_at" +} diff --git a/test/support/fixtures/pipes/get_access_token.json b/test/support/fixtures/pipes/get_access_token.json new file mode 100644 index 00000000..401869d1 --- /dev/null +++ b/test/support/fixtures/pipes/get_access_token.json @@ -0,0 +1,15 @@ +{ + "active": true, + "access_token": { + "object": "access_token", + "access_token": "access_token", + "expires_at": "2024-01-01T00:00:00.000Z", + "scopes": [ + "scopes" + ], + "missing_scopes": [ + "missing_scopes" + ] + }, + "error": "not_installed" +} diff --git a/test/support/fixtures/pipes/get_data_integration.json b/test/support/fixtures/pipes/get_data_integration.json new file mode 100644 index 00000000..aff2a03e --- /dev/null +++ b/test/support/fixtures/pipes/get_data_integration.json @@ -0,0 +1,43 @@ +{ + "object": "data_integration", + "id": "id", + "slug": "slug", + "integration_type": "integration_type", + "description": "description", + "enabled": true, + "state": "valid", + "scopes": [ + "scopes" + ], + "redirect_uri": "redirect_uri", + "auth_methods": [ + "oauth" + ], + "credentials": { + "type": "custom", + "client_id": "client_id", + "redacted_client_secret": "redacted_client_secret" + }, + "installation": { + "id": "id", + "user_id": "user_id", + "organization_id": "organization_id", + "api_key_last_4": "api_key_last_4" + }, + "config": {}, + "custom_provider": { + "name": "name", + "authorization_url": "authorization_url", + "token_url": "token_url", + "refresh_token_url": "refresh_token_url", + "pkce_enabled": true, + "request_scope_separator": "request_scope_separator", + "scopes_required": true, + "client_secret_required": true, + "additional_authorization_parameters": {}, + "token_body_content_type": "token_body_content_type", + "authenticate_via": "request_body" + }, + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" +} diff --git a/test/support/fixtures/pipes/get_user_connected_account.json b/test/support/fixtures/pipes/get_user_connected_account.json new file mode 100644 index 00000000..84713edf --- /dev/null +++ b/test/support/fixtures/pipes/get_user_connected_account.json @@ -0,0 +1,14 @@ +{ + "object": "connected_account", + "id": "id", + "user_id": "user_id", + "organization_id": "organization_id", + "scopes": [ + "scopes" + ], + "auth_method": "oauth", + "api_key_last_4": "api_key_last_4", + "state": "connected", + "created_at": "created_at", + "updated_at": "updated_at" +} diff --git a/test/support/fixtures/pipes/list_data_integrations.json b/test/support/fixtures/pipes/list_data_integrations.json new file mode 100644 index 00000000..902539f4 --- /dev/null +++ b/test/support/fixtures/pipes/list_data_integrations.json @@ -0,0 +1,60 @@ +{ + "data": [ + { + "object": "list", + "data": [ + { + "object": "data_integration", + "id": "id", + "slug": "slug", + "integration_type": "integration_type", + "description": "description", + "enabled": true, + "state": "valid", + "scopes": [ + "scopes" + ], + "redirect_uri": "redirect_uri", + "auth_methods": [ + "oauth" + ], + "credentials": { + "type": "custom", + "client_id": "client_id", + "redacted_client_secret": "redacted_client_secret" + }, + "installation": { + "id": "id", + "user_id": "user_id", + "organization_id": "organization_id", + "api_key_last_4": "api_key_last_4" + }, + "config": {}, + "custom_provider": { + "name": "name", + "authorization_url": "authorization_url", + "token_url": "token_url", + "refresh_token_url": "refresh_token_url", + "pkce_enabled": true, + "request_scope_separator": "request_scope_separator", + "scopes_required": true, + "client_secret_required": true, + "additional_authorization_parameters": {}, + "token_body_content_type": "token_body_content_type", + "authenticate_via": "request_body" + }, + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + } + ], + "list_metadata": { + "before": "before", + "after": "after" + } + } + ], + "list_metadata": { + "before": null, + "after": null + } +} diff --git a/test/support/fixtures/pipes/list_user_data_providers.json b/test/support/fixtures/pipes/list_user_data_providers.json new file mode 100644 index 00000000..fdab76d8 --- /dev/null +++ b/test/support/fixtures/pipes/list_user_data_providers.json @@ -0,0 +1,43 @@ +{ + "object": "list", + "data": [ + { + "object": "data_provider", + "id": "id", + "name": "name", + "description": "description", + "slug": "slug", + "integration_type": "integration_type", + "credentials_type": "credentials_type", + "scopes": [ + "scopes" + ], + "auth_methods": [ + "oauth" + ], + "ownership": "userland_user", + "created_at": "created_at", + "updated_at": "updated_at", + "integrationType": "integrationType", + "credentialsType": "credentialsType", + "createdAt": "createdAt", + "updatedAt": "updatedAt", + "connected_account": { + "object": "connected_account", + "id": "id", + "user_id": "user_id", + "organization_id": "organization_id", + "scopes": [], + "auth_method": "oauth", + "api_key_last_4": "api_key_last_4", + "state": "connected", + "created_at": "created_at", + "updated_at": "updated_at", + "userlandUserId": "userlandUserId", + "organizationId": "organizationId", + "createdAt": "createdAt", + "updatedAt": "updatedAt" + } + } + ] +} diff --git a/test/support/fixtures/pipes/update_data_integration.json b/test/support/fixtures/pipes/update_data_integration.json new file mode 100644 index 00000000..aff2a03e --- /dev/null +++ b/test/support/fixtures/pipes/update_data_integration.json @@ -0,0 +1,43 @@ +{ + "object": "data_integration", + "id": "id", + "slug": "slug", + "integration_type": "integration_type", + "description": "description", + "enabled": true, + "state": "valid", + "scopes": [ + "scopes" + ], + "redirect_uri": "redirect_uri", + "auth_methods": [ + "oauth" + ], + "credentials": { + "type": "custom", + "client_id": "client_id", + "redacted_client_secret": "redacted_client_secret" + }, + "installation": { + "id": "id", + "user_id": "user_id", + "organization_id": "organization_id", + "api_key_last_4": "api_key_last_4" + }, + "config": {}, + "custom_provider": { + "name": "name", + "authorization_url": "authorization_url", + "token_url": "token_url", + "refresh_token_url": "refresh_token_url", + "pkce_enabled": true, + "request_scope_separator": "request_scope_separator", + "scopes_required": true, + "client_secret_required": true, + "additional_authorization_parameters": {}, + "token_body_content_type": "token_body_content_type", + "authenticate_via": "request_body" + }, + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" +} diff --git a/test/support/fixtures/pipes/update_data_integration_api_key.json b/test/support/fixtures/pipes/update_data_integration_api_key.json new file mode 100644 index 00000000..84713edf --- /dev/null +++ b/test/support/fixtures/pipes/update_data_integration_api_key.json @@ -0,0 +1,14 @@ +{ + "object": "connected_account", + "id": "id", + "user_id": "user_id", + "organization_id": "organization_id", + "scopes": [ + "scopes" + ], + "auth_method": "oauth", + "api_key_last_4": "api_key_last_4", + "state": "connected", + "created_at": "created_at", + "updated_at": "updated_at" +} diff --git a/test/support/fixtures/pipes/update_user_connected_account.json b/test/support/fixtures/pipes/update_user_connected_account.json new file mode 100644 index 00000000..84713edf --- /dev/null +++ b/test/support/fixtures/pipes/update_user_connected_account.json @@ -0,0 +1,14 @@ +{ + "object": "connected_account", + "id": "id", + "user_id": "user_id", + "organization_id": "organization_id", + "scopes": [ + "scopes" + ], + "auth_method": "oauth", + "api_key_last_4": "api_key_last_4", + "state": "connected", + "created_at": "created_at", + "updated_at": "updated_at" +} diff --git a/test/support/fixtures/pipes_provider/list_organization_data_integration_configurations.json b/test/support/fixtures/pipes_provider/list_organization_data_integration_configurations.json new file mode 100644 index 00000000..2adf5825 --- /dev/null +++ b/test/support/fixtures/pipes_provider/list_organization_data_integration_configurations.json @@ -0,0 +1,26 @@ +{ + "object": "list", + "data": [ + { + "object": "data_integration_configuration", + "id": "id", + "organization_id": "organization_id", + "slug": "slug", + "name": "name", + "enabled": true, + "scopes": [ + "scopes" + ], + "config": {}, + "created_at": "created_at", + "updated_at": "updated_at", + "credentials": { + "credentials_type": "shared", + "has_credentials": true, + "client_id": "client_id", + "client_secret_last_four": "client_secret_last_four", + "redirect_uri": "redirect_uri" + } + } + ] +} diff --git a/test/support/fixtures/pipes_provider/update_organization_data_integration_configuration.json b/test/support/fixtures/pipes_provider/update_organization_data_integration_configuration.json new file mode 100644 index 00000000..1716ec86 --- /dev/null +++ b/test/support/fixtures/pipes_provider/update_organization_data_integration_configuration.json @@ -0,0 +1,21 @@ +{ + "object": "data_integration_configuration", + "id": "id", + "organization_id": "organization_id", + "slug": "slug", + "name": "name", + "enabled": true, + "scopes": [ + "scopes" + ], + "config": {}, + "created_at": "created_at", + "updated_at": "updated_at", + "credentials": { + "credentials_type": "shared", + "has_credentials": true, + "client_id": "client_id", + "client_secret_last_four": "client_secret_last_four", + "redirect_uri": "redirect_uri" + } +} diff --git a/test/support/fixtures/radar/add_list_entry.json b/test/support/fixtures/radar/add_list_entry.json new file mode 100644 index 00000000..51cfcb27 --- /dev/null +++ b/test/support/fixtures/radar/add_list_entry.json @@ -0,0 +1,3 @@ +{ + "message": "message" +} diff --git a/test/support/fixtures/radar/create_attempt.json b/test/support/fixtures/radar/create_attempt.json new file mode 100644 index 00000000..c1bb0006 --- /dev/null +++ b/test/support/fixtures/radar/create_attempt.json @@ -0,0 +1,7 @@ +{ + "verdict": "allow", + "reason": "reason", + "attempt_id": "attempt_id", + "control": "bot_detection", + "blocklist_type": "ip_address" +} diff --git a/test/support/fixtures/sso/authorize_logout.json b/test/support/fixtures/sso/authorize_logout.json new file mode 100644 index 00000000..d754805c --- /dev/null +++ b/test/support/fixtures/sso/authorize_logout.json @@ -0,0 +1,4 @@ +{ + "logout_url": "logout_url", + "logout_token": "logout_token" +} diff --git a/test/support/fixtures/sso/get_connection.json b/test/support/fixtures/sso/get_connection.json new file mode 100644 index 00000000..76a83f5f --- /dev/null +++ b/test/support/fixtures/sso/get_connection.json @@ -0,0 +1,18 @@ +{ + "object": "connection", + "id": "id", + "organization_id": "organization_id", + "connection_type": "Pending", + "name": "name", + "state": "requires_type", + "status": "linked", + "domains": [ + { + "id": "id", + "object": "connection_domain", + "domain": "domain" + } + ], + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" +} diff --git a/test/support/fixtures/sso/get_profile.json b/test/support/fixtures/sso/get_profile.json new file mode 100644 index 00000000..acbc9026 --- /dev/null +++ b/test/support/fixtures/sso/get_profile.json @@ -0,0 +1,25 @@ +{ + "object": "profile", + "id": "id", + "organization_id": "organization_id", + "connection_id": "connection_id", + "connection_type": "Pending", + "idp_id": "idp_id", + "email": "email", + "first_name": "first_name", + "last_name": "last_name", + "name": "name", + "role": { + "slug": "slug" + }, + "roles": [ + { + "slug": "slug" + } + ], + "groups": [ + "groups" + ], + "custom_attributes": {}, + "raw_attributes": {} +} diff --git a/test/support/fixtures/sso/get_profile_and_token.json b/test/support/fixtures/sso/get_profile_and_token.json new file mode 100644 index 00000000..2037af22 --- /dev/null +++ b/test/support/fixtures/sso/get_profile_and_token.json @@ -0,0 +1,39 @@ +{ + "token_type": "Bearer", + "access_token": "access_token", + "expires_in": 1, + "profile": { + "object": "profile", + "id": "id", + "organization_id": "organization_id", + "connection_id": "connection_id", + "connection_type": "Pending", + "idp_id": "idp_id", + "email": "email", + "first_name": "first_name", + "last_name": "last_name", + "name": "name", + "role": { + "slug": "slug" + }, + "roles": [ + { + "slug": "slug" + } + ], + "groups": [ + "groups" + ], + "custom_attributes": {}, + "raw_attributes": {} + }, + "oauth_tokens": { + "provider": "provider", + "refresh_token": "refresh_token", + "access_token": "access_token", + "expires_at": 1, + "scopes": [ + "scopes" + ] + } +} diff --git a/test/support/fixtures/sso/list_connections.json b/test/support/fixtures/sso/list_connections.json new file mode 100644 index 00000000..4ac2ed4b --- /dev/null +++ b/test/support/fixtures/sso/list_connections.json @@ -0,0 +1,31 @@ +{ + "data": [ + { + "object": "list", + "data": [ + { + "object": "connection", + "id": "id", + "organization_id": "organization_id", + "connection_type": "Pending", + "name": "name", + "state": "requires_type", + "status": "linked", + "domains": [ + {} + ], + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + } + ], + "list_metadata": { + "before": "before", + "after": "after" + } + } + ], + "list_metadata": { + "before": null, + "after": null + } +} diff --git a/test/support/fixtures/user_management/accept_invitation.json b/test/support/fixtures/user_management/accept_invitation.json new file mode 100644 index 00000000..b5ce97c2 --- /dev/null +++ b/test/support/fixtures/user_management/accept_invitation.json @@ -0,0 +1,17 @@ +{ + "object": "invitation", + "id": "id", + "email": "email", + "state": "pending", + "accepted_at": "2024-01-01T00:00:00.000Z", + "revoked_at": "2024-01-01T00:00:00.000Z", + "expires_at": "2024-01-01T00:00:00.000Z", + "organization_id": "organization_id", + "inviter_user_id": "inviter_user_id", + "accepted_user_id": "accepted_user_id", + "role_slug": "role_slug", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z", + "token": "token", + "accept_invitation_url": "accept_invitation_url" +} diff --git a/test/support/fixtures/user_management/authenticate_with_code.json b/test/support/fixtures/user_management/authenticate_with_code.json new file mode 100644 index 00000000..14bb7fd4 --- /dev/null +++ b/test/support/fixtures/user_management/authenticate_with_code.json @@ -0,0 +1,36 @@ +{ + "user": { + "object": "user", + "id": "id", + "first_name": "first_name", + "last_name": "last_name", + "name": "name", + "profile_picture_url": "profile_picture_url", + "email": "email", + "email_verified": true, + "external_id": "external_id", + "metadata": {}, + "last_sign_in_at": "2024-01-01T00:00:00.000Z", + "locale": "locale", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + }, + "organization_id": "organization_id", + "authkit_authorization_code": "authkit_authorization_code", + "access_token": "access_token", + "refresh_token": "refresh_token", + "authentication_method": "SSO", + "impersonator": { + "email": "email", + "reason": "reason" + }, + "oauth_tokens": { + "provider": "provider", + "refresh_token": "refresh_token", + "access_token": "access_token", + "expires_at": 1, + "scopes": [ + "scopes" + ] + } +} diff --git a/test/support/fixtures/user_management/authenticate_with_device_code.json b/test/support/fixtures/user_management/authenticate_with_device_code.json new file mode 100644 index 00000000..14bb7fd4 --- /dev/null +++ b/test/support/fixtures/user_management/authenticate_with_device_code.json @@ -0,0 +1,36 @@ +{ + "user": { + "object": "user", + "id": "id", + "first_name": "first_name", + "last_name": "last_name", + "name": "name", + "profile_picture_url": "profile_picture_url", + "email": "email", + "email_verified": true, + "external_id": "external_id", + "metadata": {}, + "last_sign_in_at": "2024-01-01T00:00:00.000Z", + "locale": "locale", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + }, + "organization_id": "organization_id", + "authkit_authorization_code": "authkit_authorization_code", + "access_token": "access_token", + "refresh_token": "refresh_token", + "authentication_method": "SSO", + "impersonator": { + "email": "email", + "reason": "reason" + }, + "oauth_tokens": { + "provider": "provider", + "refresh_token": "refresh_token", + "access_token": "access_token", + "expires_at": 1, + "scopes": [ + "scopes" + ] + } +} diff --git a/test/support/fixtures/user_management/authenticate_with_email_verification.json b/test/support/fixtures/user_management/authenticate_with_email_verification.json new file mode 100644 index 00000000..14bb7fd4 --- /dev/null +++ b/test/support/fixtures/user_management/authenticate_with_email_verification.json @@ -0,0 +1,36 @@ +{ + "user": { + "object": "user", + "id": "id", + "first_name": "first_name", + "last_name": "last_name", + "name": "name", + "profile_picture_url": "profile_picture_url", + "email": "email", + "email_verified": true, + "external_id": "external_id", + "metadata": {}, + "last_sign_in_at": "2024-01-01T00:00:00.000Z", + "locale": "locale", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + }, + "organization_id": "organization_id", + "authkit_authorization_code": "authkit_authorization_code", + "access_token": "access_token", + "refresh_token": "refresh_token", + "authentication_method": "SSO", + "impersonator": { + "email": "email", + "reason": "reason" + }, + "oauth_tokens": { + "provider": "provider", + "refresh_token": "refresh_token", + "access_token": "access_token", + "expires_at": 1, + "scopes": [ + "scopes" + ] + } +} diff --git a/test/support/fixtures/user_management/authenticate_with_magic_auth.json b/test/support/fixtures/user_management/authenticate_with_magic_auth.json new file mode 100644 index 00000000..14bb7fd4 --- /dev/null +++ b/test/support/fixtures/user_management/authenticate_with_magic_auth.json @@ -0,0 +1,36 @@ +{ + "user": { + "object": "user", + "id": "id", + "first_name": "first_name", + "last_name": "last_name", + "name": "name", + "profile_picture_url": "profile_picture_url", + "email": "email", + "email_verified": true, + "external_id": "external_id", + "metadata": {}, + "last_sign_in_at": "2024-01-01T00:00:00.000Z", + "locale": "locale", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + }, + "organization_id": "organization_id", + "authkit_authorization_code": "authkit_authorization_code", + "access_token": "access_token", + "refresh_token": "refresh_token", + "authentication_method": "SSO", + "impersonator": { + "email": "email", + "reason": "reason" + }, + "oauth_tokens": { + "provider": "provider", + "refresh_token": "refresh_token", + "access_token": "access_token", + "expires_at": 1, + "scopes": [ + "scopes" + ] + } +} diff --git a/test/support/fixtures/user_management/authenticate_with_organization_selection.json b/test/support/fixtures/user_management/authenticate_with_organization_selection.json new file mode 100644 index 00000000..14bb7fd4 --- /dev/null +++ b/test/support/fixtures/user_management/authenticate_with_organization_selection.json @@ -0,0 +1,36 @@ +{ + "user": { + "object": "user", + "id": "id", + "first_name": "first_name", + "last_name": "last_name", + "name": "name", + "profile_picture_url": "profile_picture_url", + "email": "email", + "email_verified": true, + "external_id": "external_id", + "metadata": {}, + "last_sign_in_at": "2024-01-01T00:00:00.000Z", + "locale": "locale", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + }, + "organization_id": "organization_id", + "authkit_authorization_code": "authkit_authorization_code", + "access_token": "access_token", + "refresh_token": "refresh_token", + "authentication_method": "SSO", + "impersonator": { + "email": "email", + "reason": "reason" + }, + "oauth_tokens": { + "provider": "provider", + "refresh_token": "refresh_token", + "access_token": "access_token", + "expires_at": 1, + "scopes": [ + "scopes" + ] + } +} diff --git a/test/support/fixtures/user_management/authenticate_with_password.json b/test/support/fixtures/user_management/authenticate_with_password.json new file mode 100644 index 00000000..14bb7fd4 --- /dev/null +++ b/test/support/fixtures/user_management/authenticate_with_password.json @@ -0,0 +1,36 @@ +{ + "user": { + "object": "user", + "id": "id", + "first_name": "first_name", + "last_name": "last_name", + "name": "name", + "profile_picture_url": "profile_picture_url", + "email": "email", + "email_verified": true, + "external_id": "external_id", + "metadata": {}, + "last_sign_in_at": "2024-01-01T00:00:00.000Z", + "locale": "locale", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + }, + "organization_id": "organization_id", + "authkit_authorization_code": "authkit_authorization_code", + "access_token": "access_token", + "refresh_token": "refresh_token", + "authentication_method": "SSO", + "impersonator": { + "email": "email", + "reason": "reason" + }, + "oauth_tokens": { + "provider": "provider", + "refresh_token": "refresh_token", + "access_token": "access_token", + "expires_at": 1, + "scopes": [ + "scopes" + ] + } +} diff --git a/test/support/fixtures/user_management/authenticate_with_radar_email_challenge.json b/test/support/fixtures/user_management/authenticate_with_radar_email_challenge.json new file mode 100644 index 00000000..14bb7fd4 --- /dev/null +++ b/test/support/fixtures/user_management/authenticate_with_radar_email_challenge.json @@ -0,0 +1,36 @@ +{ + "user": { + "object": "user", + "id": "id", + "first_name": "first_name", + "last_name": "last_name", + "name": "name", + "profile_picture_url": "profile_picture_url", + "email": "email", + "email_verified": true, + "external_id": "external_id", + "metadata": {}, + "last_sign_in_at": "2024-01-01T00:00:00.000Z", + "locale": "locale", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + }, + "organization_id": "organization_id", + "authkit_authorization_code": "authkit_authorization_code", + "access_token": "access_token", + "refresh_token": "refresh_token", + "authentication_method": "SSO", + "impersonator": { + "email": "email", + "reason": "reason" + }, + "oauth_tokens": { + "provider": "provider", + "refresh_token": "refresh_token", + "access_token": "access_token", + "expires_at": 1, + "scopes": [ + "scopes" + ] + } +} diff --git a/test/support/fixtures/user_management/authenticate_with_radar_sms_challenge.json b/test/support/fixtures/user_management/authenticate_with_radar_sms_challenge.json new file mode 100644 index 00000000..14bb7fd4 --- /dev/null +++ b/test/support/fixtures/user_management/authenticate_with_radar_sms_challenge.json @@ -0,0 +1,36 @@ +{ + "user": { + "object": "user", + "id": "id", + "first_name": "first_name", + "last_name": "last_name", + "name": "name", + "profile_picture_url": "profile_picture_url", + "email": "email", + "email_verified": true, + "external_id": "external_id", + "metadata": {}, + "last_sign_in_at": "2024-01-01T00:00:00.000Z", + "locale": "locale", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + }, + "organization_id": "organization_id", + "authkit_authorization_code": "authkit_authorization_code", + "access_token": "access_token", + "refresh_token": "refresh_token", + "authentication_method": "SSO", + "impersonator": { + "email": "email", + "reason": "reason" + }, + "oauth_tokens": { + "provider": "provider", + "refresh_token": "refresh_token", + "access_token": "access_token", + "expires_at": 1, + "scopes": [ + "scopes" + ] + } +} diff --git a/test/support/fixtures/user_management/authenticate_with_refresh_token.json b/test/support/fixtures/user_management/authenticate_with_refresh_token.json new file mode 100644 index 00000000..14bb7fd4 --- /dev/null +++ b/test/support/fixtures/user_management/authenticate_with_refresh_token.json @@ -0,0 +1,36 @@ +{ + "user": { + "object": "user", + "id": "id", + "first_name": "first_name", + "last_name": "last_name", + "name": "name", + "profile_picture_url": "profile_picture_url", + "email": "email", + "email_verified": true, + "external_id": "external_id", + "metadata": {}, + "last_sign_in_at": "2024-01-01T00:00:00.000Z", + "locale": "locale", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + }, + "organization_id": "organization_id", + "authkit_authorization_code": "authkit_authorization_code", + "access_token": "access_token", + "refresh_token": "refresh_token", + "authentication_method": "SSO", + "impersonator": { + "email": "email", + "reason": "reason" + }, + "oauth_tokens": { + "provider": "provider", + "refresh_token": "refresh_token", + "access_token": "access_token", + "expires_at": 1, + "scopes": [ + "scopes" + ] + } +} diff --git a/test/support/fixtures/user_management/authenticate_with_totp.json b/test/support/fixtures/user_management/authenticate_with_totp.json new file mode 100644 index 00000000..14bb7fd4 --- /dev/null +++ b/test/support/fixtures/user_management/authenticate_with_totp.json @@ -0,0 +1,36 @@ +{ + "user": { + "object": "user", + "id": "id", + "first_name": "first_name", + "last_name": "last_name", + "name": "name", + "profile_picture_url": "profile_picture_url", + "email": "email", + "email_verified": true, + "external_id": "external_id", + "metadata": {}, + "last_sign_in_at": "2024-01-01T00:00:00.000Z", + "locale": "locale", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + }, + "organization_id": "organization_id", + "authkit_authorization_code": "authkit_authorization_code", + "access_token": "access_token", + "refresh_token": "refresh_token", + "authentication_method": "SSO", + "impersonator": { + "email": "email", + "reason": "reason" + }, + "oauth_tokens": { + "provider": "provider", + "refresh_token": "refresh_token", + "access_token": "access_token", + "expires_at": 1, + "scopes": [ + "scopes" + ] + } +} diff --git a/test/support/fixtures/user_management/confirm_email_change.json b/test/support/fixtures/user_management/confirm_email_change.json new file mode 100644 index 00000000..08d38c36 --- /dev/null +++ b/test/support/fixtures/user_management/confirm_email_change.json @@ -0,0 +1,19 @@ +{ + "object": "email_change_confirmation", + "user": { + "object": "user", + "id": "id", + "first_name": "first_name", + "last_name": "last_name", + "name": "name", + "profile_picture_url": "profile_picture_url", + "email": "email", + "email_verified": true, + "external_id": "external_id", + "metadata": {}, + "last_sign_in_at": "2024-01-01T00:00:00.000Z", + "locale": "locale", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + } +} diff --git a/test/support/fixtures/user_management/confirm_password_reset.json b/test/support/fixtures/user_management/confirm_password_reset.json new file mode 100644 index 00000000..6f7f9480 --- /dev/null +++ b/test/support/fixtures/user_management/confirm_password_reset.json @@ -0,0 +1,18 @@ +{ + "user": { + "object": "user", + "id": "id", + "first_name": "first_name", + "last_name": "last_name", + "name": "name", + "profile_picture_url": "profile_picture_url", + "email": "email", + "email_verified": true, + "external_id": "external_id", + "metadata": {}, + "last_sign_in_at": "2024-01-01T00:00:00.000Z", + "locale": "locale", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + } +} diff --git a/test/support/fixtures/user_management/create_authenticate.json b/test/support/fixtures/user_management/create_authenticate.json new file mode 100644 index 00000000..14bb7fd4 --- /dev/null +++ b/test/support/fixtures/user_management/create_authenticate.json @@ -0,0 +1,36 @@ +{ + "user": { + "object": "user", + "id": "id", + "first_name": "first_name", + "last_name": "last_name", + "name": "name", + "profile_picture_url": "profile_picture_url", + "email": "email", + "email_verified": true, + "external_id": "external_id", + "metadata": {}, + "last_sign_in_at": "2024-01-01T00:00:00.000Z", + "locale": "locale", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + }, + "organization_id": "organization_id", + "authkit_authorization_code": "authkit_authorization_code", + "access_token": "access_token", + "refresh_token": "refresh_token", + "authentication_method": "SSO", + "impersonator": { + "email": "email", + "reason": "reason" + }, + "oauth_tokens": { + "provider": "provider", + "refresh_token": "refresh_token", + "access_token": "access_token", + "expires_at": 1, + "scopes": [ + "scopes" + ] + } +} diff --git a/test/support/fixtures/user_management/create_cors_origin.json b/test/support/fixtures/user_management/create_cors_origin.json new file mode 100644 index 00000000..b9b2dd77 --- /dev/null +++ b/test/support/fixtures/user_management/create_cors_origin.json @@ -0,0 +1,7 @@ +{ + "object": "cors_origin", + "id": "id", + "origin": "origin", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" +} diff --git a/test/support/fixtures/user_management/create_device.json b/test/support/fixtures/user_management/create_device.json new file mode 100644 index 00000000..9ff79805 --- /dev/null +++ b/test/support/fixtures/user_management/create_device.json @@ -0,0 +1,8 @@ +{ + "device_code": "device_code", + "user_code": "user_code", + "verification_uri": "verification_uri", + "verification_uri_complete": "verification_uri_complete", + "expires_in": 1, + "interval": 1 +} diff --git a/test/support/fixtures/user_management/create_magic_auth.json b/test/support/fixtures/user_management/create_magic_auth.json new file mode 100644 index 00000000..77d04216 --- /dev/null +++ b/test/support/fixtures/user_management/create_magic_auth.json @@ -0,0 +1,11 @@ +{ + "object": "magic_auth", + "id": "id", + "user_id": "user_id", + "email": "email", + "expires_at": "2024-01-01T00:00:00.000Z", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z", + "code": "code", + "radar_auth_attempt_id": "radar_auth_attempt_id" +} diff --git a/test/support/fixtures/user_management/create_radar_challenge.json b/test/support/fixtures/user_management/create_radar_challenge.json new file mode 100644 index 00000000..b7e62597 --- /dev/null +++ b/test/support/fixtures/user_management/create_radar_challenge.json @@ -0,0 +1,4 @@ +{ + "verification_id": "verification_id", + "phone_number": "phone_number" +} diff --git a/test/support/fixtures/user_management/create_redirect_uri.json b/test/support/fixtures/user_management/create_redirect_uri.json new file mode 100644 index 00000000..b021cc73 --- /dev/null +++ b/test/support/fixtures/user_management/create_redirect_uri.json @@ -0,0 +1,8 @@ +{ + "object": "redirect_uri", + "id": "id", + "uri": "uri", + "default": true, + "created_at": "created_at", + "updated_at": "updated_at" +} diff --git a/test/support/fixtures/user_management/create_user.json b/test/support/fixtures/user_management/create_user.json new file mode 100644 index 00000000..2d1e9a26 --- /dev/null +++ b/test/support/fixtures/user_management/create_user.json @@ -0,0 +1,17 @@ +{ + "object": "user", + "id": "id", + "first_name": "first_name", + "last_name": "last_name", + "name": "name", + "profile_picture_url": "profile_picture_url", + "email": "email", + "email_verified": true, + "external_id": "external_id", + "metadata": {}, + "last_sign_in_at": "2024-01-01T00:00:00.000Z", + "locale": "locale", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z", + "radar_auth_attempt_id": "radar_auth_attempt_id" +} diff --git a/test/support/fixtures/user_management/create_user_api_key.json b/test/support/fixtures/user_management/create_user_api_key.json new file mode 100644 index 00000000..25c743b7 --- /dev/null +++ b/test/support/fixtures/user_management/create_user_api_key.json @@ -0,0 +1,19 @@ +{ + "object": "api_key", + "id": "id", + "owner": { + "type": "user", + "id": "id", + "organization_id": "organization_id" + }, + "name": "name", + "obfuscated_value": "obfuscated_value", + "last_used_at": "2024-01-01T00:00:00.000Z", + "expires_at": "2024-01-01T00:00:00.000Z", + "permissions": [ + "permissions" + ], + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z", + "value": "value" +} diff --git a/test/support/fixtures/user_management/find_invitation_by_token.json b/test/support/fixtures/user_management/find_invitation_by_token.json new file mode 100644 index 00000000..b5ce97c2 --- /dev/null +++ b/test/support/fixtures/user_management/find_invitation_by_token.json @@ -0,0 +1,17 @@ +{ + "object": "invitation", + "id": "id", + "email": "email", + "state": "pending", + "accepted_at": "2024-01-01T00:00:00.000Z", + "revoked_at": "2024-01-01T00:00:00.000Z", + "expires_at": "2024-01-01T00:00:00.000Z", + "organization_id": "organization_id", + "inviter_user_id": "inviter_user_id", + "accepted_user_id": "accepted_user_id", + "role_slug": "role_slug", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z", + "token": "token", + "accept_invitation_url": "accept_invitation_url" +} diff --git a/test/support/fixtures/user_management/get_email_verification.json b/test/support/fixtures/user_management/get_email_verification.json new file mode 100644 index 00000000..2b85610d --- /dev/null +++ b/test/support/fixtures/user_management/get_email_verification.json @@ -0,0 +1,10 @@ +{ + "object": "email_verification", + "id": "id", + "user_id": "user_id", + "email": "email", + "expires_at": "2024-01-01T00:00:00.000Z", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z", + "code": "code" +} diff --git a/test/support/fixtures/user_management/get_invitation.json b/test/support/fixtures/user_management/get_invitation.json new file mode 100644 index 00000000..b5ce97c2 --- /dev/null +++ b/test/support/fixtures/user_management/get_invitation.json @@ -0,0 +1,17 @@ +{ + "object": "invitation", + "id": "id", + "email": "email", + "state": "pending", + "accepted_at": "2024-01-01T00:00:00.000Z", + "revoked_at": "2024-01-01T00:00:00.000Z", + "expires_at": "2024-01-01T00:00:00.000Z", + "organization_id": "organization_id", + "inviter_user_id": "inviter_user_id", + "accepted_user_id": "accepted_user_id", + "role_slug": "role_slug", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z", + "token": "token", + "accept_invitation_url": "accept_invitation_url" +} diff --git a/test/support/fixtures/user_management/get_jwks.json b/test/support/fixtures/user_management/get_jwks.json new file mode 100644 index 00000000..a3c19549 --- /dev/null +++ b/test/support/fixtures/user_management/get_jwks.json @@ -0,0 +1,16 @@ +{ + "keys": [ + { + "alg": "RS256", + "kty": "RSA", + "use": "sig", + "x5c": [ + "x5c" + ], + "n": "n", + "e": "e", + "kid": "kid", + "x5t#S256": "x5t#S256" + } + ] +} diff --git a/test/support/fixtures/user_management/get_magic_auth.json b/test/support/fixtures/user_management/get_magic_auth.json new file mode 100644 index 00000000..d95e89ef --- /dev/null +++ b/test/support/fixtures/user_management/get_magic_auth.json @@ -0,0 +1,10 @@ +{ + "object": "magic_auth", + "id": "id", + "user_id": "user_id", + "email": "email", + "expires_at": "2024-01-01T00:00:00.000Z", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z", + "code": "code" +} diff --git a/test/support/fixtures/user_management/get_password_reset.json b/test/support/fixtures/user_management/get_password_reset.json new file mode 100644 index 00000000..c2a5cae2 --- /dev/null +++ b/test/support/fixtures/user_management/get_password_reset.json @@ -0,0 +1,10 @@ +{ + "object": "password_reset", + "id": "id", + "user_id": "user_id", + "email": "email", + "expires_at": "2024-01-01T00:00:00.000Z", + "created_at": "2024-01-01T00:00:00.000Z", + "password_reset_token": "password_reset_token", + "password_reset_url": "password_reset_url" +} diff --git a/test/support/fixtures/user_management/get_radar_challenge.json b/test/support/fixtures/user_management/get_radar_challenge.json new file mode 100644 index 00000000..dc37bc03 --- /dev/null +++ b/test/support/fixtures/user_management/get_radar_challenge.json @@ -0,0 +1,11 @@ +{ + "object": "radar_challenge", + "id": "id", + "type": "email", + "user_id": "user_id", + "email": "email", + "expires_at": "2024-01-01T00:00:00.000Z", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z", + "code": "code" +} diff --git a/test/support/fixtures/user_management/get_user.json b/test/support/fixtures/user_management/get_user.json new file mode 100644 index 00000000..76693fd3 --- /dev/null +++ b/test/support/fixtures/user_management/get_user.json @@ -0,0 +1,16 @@ +{ + "object": "user", + "id": "id", + "first_name": "first_name", + "last_name": "last_name", + "name": "name", + "profile_picture_url": "profile_picture_url", + "email": "email", + "email_verified": true, + "external_id": "external_id", + "metadata": {}, + "last_sign_in_at": "2024-01-01T00:00:00.000Z", + "locale": "locale", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" +} diff --git a/test/support/fixtures/user_management/get_user_by_external_id.json b/test/support/fixtures/user_management/get_user_by_external_id.json new file mode 100644 index 00000000..76693fd3 --- /dev/null +++ b/test/support/fixtures/user_management/get_user_by_external_id.json @@ -0,0 +1,16 @@ +{ + "object": "user", + "id": "id", + "first_name": "first_name", + "last_name": "last_name", + "name": "name", + "profile_picture_url": "profile_picture_url", + "email": "email", + "email_verified": true, + "external_id": "external_id", + "metadata": {}, + "last_sign_in_at": "2024-01-01T00:00:00.000Z", + "locale": "locale", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" +} diff --git a/test/support/fixtures/user_management/get_user_identities.json b/test/support/fixtures/user_management/get_user_identities.json new file mode 100644 index 00000000..feccd34b --- /dev/null +++ b/test/support/fixtures/user_management/get_user_identities.json @@ -0,0 +1,7 @@ +[ + { + "idp_id": "idp_id", + "type": "OAuth", + "provider": "AppleOAuth" + } +] diff --git a/test/support/fixtures/user_management/list_cors_origins.json b/test/support/fixtures/user_management/list_cors_origins.json new file mode 100644 index 00000000..ac641b02 --- /dev/null +++ b/test/support/fixtures/user_management/list_cors_origins.json @@ -0,0 +1,15 @@ +{ + "data": [ + { + "object": "cors_origin", + "id": "id", + "origin": "origin", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + } + ], + "list_metadata": { + "before": null, + "after": null + } +} diff --git a/test/support/fixtures/user_management/list_invitations.json b/test/support/fixtures/user_management/list_invitations.json new file mode 100644 index 00000000..2939d5b5 --- /dev/null +++ b/test/support/fixtures/user_management/list_invitations.json @@ -0,0 +1,34 @@ +{ + "data": [ + { + "object": "list", + "data": [ + { + "object": "invitation", + "id": "id", + "email": "email", + "state": "pending", + "accepted_at": "2024-01-01T00:00:00.000Z", + "revoked_at": "2024-01-01T00:00:00.000Z", + "expires_at": "2024-01-01T00:00:00.000Z", + "organization_id": "organization_id", + "inviter_user_id": "inviter_user_id", + "accepted_user_id": "accepted_user_id", + "role_slug": "role_slug", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z", + "token": "token", + "accept_invitation_url": "accept_invitation_url" + } + ], + "list_metadata": { + "before": "before", + "after": "after" + } + } + ], + "list_metadata": { + "before": null, + "after": null + } +} diff --git a/test/support/fixtures/user_management/list_jwt_template.json b/test/support/fixtures/user_management/list_jwt_template.json new file mode 100644 index 00000000..44dbb490 --- /dev/null +++ b/test/support/fixtures/user_management/list_jwt_template.json @@ -0,0 +1,6 @@ +{ + "object": "jwt_template", + "content": "content", + "created_at": "created_at", + "updated_at": "updated_at" +} diff --git a/test/support/fixtures/user_management/list_redirect_uris.json b/test/support/fixtures/user_management/list_redirect_uris.json new file mode 100644 index 00000000..a706a9e0 --- /dev/null +++ b/test/support/fixtures/user_management/list_redirect_uris.json @@ -0,0 +1,16 @@ +{ + "data": [ + { + "object": "redirect_uri", + "id": "id", + "uri": "uri", + "default": true, + "created_at": "created_at", + "updated_at": "updated_at" + } + ], + "list_metadata": { + "before": null, + "after": null + } +} diff --git a/test/support/fixtures/user_management/list_sessions.json b/test/support/fixtures/user_management/list_sessions.json new file mode 100644 index 00000000..e88f4914 --- /dev/null +++ b/test/support/fixtures/user_management/list_sessions.json @@ -0,0 +1,26 @@ +{ + "data": [ + { + "object": "session", + "id": "id", + "impersonator": { + "email": "email", + "reason": "reason" + }, + "ip_address": "ip_address", + "organization_id": "organization_id", + "user_agent": "user_agent", + "user_id": "user_id", + "auth_method": "cross_app_auth", + "status": "active", + "expires_at": "2024-01-01T00:00:00.000Z", + "ended_at": "2024-01-01T00:00:00.000Z", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + } + ], + "list_metadata": { + "before": null, + "after": null + } +} diff --git a/test/support/fixtures/user_management/list_user_api_keys.json b/test/support/fixtures/user_management/list_user_api_keys.json new file mode 100644 index 00000000..1e93f724 --- /dev/null +++ b/test/support/fixtures/user_management/list_user_api_keys.json @@ -0,0 +1,35 @@ +{ + "data": [ + { + "object": "list", + "data": [ + { + "object": "api_key", + "id": "id", + "owner": { + "type": "user", + "id": "id", + "organization_id": "organization_id" + }, + "name": "name", + "obfuscated_value": "obfuscated_value", + "last_used_at": "2024-01-01T00:00:00.000Z", + "expires_at": "2024-01-01T00:00:00.000Z", + "permissions": [ + "permissions" + ], + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + } + ], + "list_metadata": { + "before": "before", + "after": "after" + } + } + ], + "list_metadata": { + "before": null, + "after": null + } +} diff --git a/test/support/fixtures/user_management/list_user_authorized_applications.json b/test/support/fixtures/user_management/list_user_authorized_applications.json new file mode 100644 index 00000000..72050f8f --- /dev/null +++ b/test/support/fixtures/user_management/list_user_authorized_applications.json @@ -0,0 +1,35 @@ +{ + "data": [ + { + "object": "list", + "data": [ + { + "object": "authorized_connect_application", + "id": "id", + "granted_scopes": [ + "granted_scopes" + ], + "oauth_resource": "oauth_resource", + "application": { + "object": "connect_application", + "id": "id", + "client_id": "client_id", + "description": "description", + "name": "name", + "scopes": [], + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + } + } + ], + "list_metadata": { + "before": "before", + "after": "after" + } + } + ], + "list_metadata": { + "before": null, + "after": null + } +} diff --git a/test/support/fixtures/user_management/list_users.json b/test/support/fixtures/user_management/list_users.json new file mode 100644 index 00000000..eb72efc3 --- /dev/null +++ b/test/support/fixtures/user_management/list_users.json @@ -0,0 +1,33 @@ +{ + "data": [ + { + "object": "list", + "data": [ + { + "object": "user", + "id": "id", + "first_name": "first_name", + "last_name": "last_name", + "name": "name", + "profile_picture_url": "profile_picture_url", + "email": "email", + "email_verified": true, + "external_id": "external_id", + "metadata": {}, + "last_sign_in_at": "2024-01-01T00:00:00.000Z", + "locale": "locale", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + } + ], + "list_metadata": { + "before": "before", + "after": "after" + } + } + ], + "list_metadata": { + "before": null, + "after": null + } +} diff --git a/test/support/fixtures/user_management/resend_invitation.json b/test/support/fixtures/user_management/resend_invitation.json new file mode 100644 index 00000000..b5ce97c2 --- /dev/null +++ b/test/support/fixtures/user_management/resend_invitation.json @@ -0,0 +1,17 @@ +{ + "object": "invitation", + "id": "id", + "email": "email", + "state": "pending", + "accepted_at": "2024-01-01T00:00:00.000Z", + "revoked_at": "2024-01-01T00:00:00.000Z", + "expires_at": "2024-01-01T00:00:00.000Z", + "organization_id": "organization_id", + "inviter_user_id": "inviter_user_id", + "accepted_user_id": "accepted_user_id", + "role_slug": "role_slug", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z", + "token": "token", + "accept_invitation_url": "accept_invitation_url" +} diff --git a/test/support/fixtures/user_management/reset_password.json b/test/support/fixtures/user_management/reset_password.json new file mode 100644 index 00000000..c2a5cae2 --- /dev/null +++ b/test/support/fixtures/user_management/reset_password.json @@ -0,0 +1,10 @@ +{ + "object": "password_reset", + "id": "id", + "user_id": "user_id", + "email": "email", + "expires_at": "2024-01-01T00:00:00.000Z", + "created_at": "2024-01-01T00:00:00.000Z", + "password_reset_token": "password_reset_token", + "password_reset_url": "password_reset_url" +} diff --git a/test/support/fixtures/user_management/revoke_invitation.json b/test/support/fixtures/user_management/revoke_invitation.json new file mode 100644 index 00000000..b5ce97c2 --- /dev/null +++ b/test/support/fixtures/user_management/revoke_invitation.json @@ -0,0 +1,17 @@ +{ + "object": "invitation", + "id": "id", + "email": "email", + "state": "pending", + "accepted_at": "2024-01-01T00:00:00.000Z", + "revoked_at": "2024-01-01T00:00:00.000Z", + "expires_at": "2024-01-01T00:00:00.000Z", + "organization_id": "organization_id", + "inviter_user_id": "inviter_user_id", + "accepted_user_id": "accepted_user_id", + "role_slug": "role_slug", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z", + "token": "token", + "accept_invitation_url": "accept_invitation_url" +} diff --git a/test/support/fixtures/user_management/send_email_change.json b/test/support/fixtures/user_management/send_email_change.json new file mode 100644 index 00000000..b543121f --- /dev/null +++ b/test/support/fixtures/user_management/send_email_change.json @@ -0,0 +1,22 @@ +{ + "object": "email_change", + "user": { + "object": "user", + "id": "id", + "first_name": "first_name", + "last_name": "last_name", + "name": "name", + "profile_picture_url": "profile_picture_url", + "email": "email", + "email_verified": true, + "external_id": "external_id", + "metadata": {}, + "last_sign_in_at": "2024-01-01T00:00:00.000Z", + "locale": "locale", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + }, + "new_email": "new_email", + "expires_at": "2024-01-01T00:00:00.000Z", + "created_at": "2024-01-01T00:00:00.000Z" +} diff --git a/test/support/fixtures/user_management/send_invitation.json b/test/support/fixtures/user_management/send_invitation.json new file mode 100644 index 00000000..b5ce97c2 --- /dev/null +++ b/test/support/fixtures/user_management/send_invitation.json @@ -0,0 +1,17 @@ +{ + "object": "invitation", + "id": "id", + "email": "email", + "state": "pending", + "accepted_at": "2024-01-01T00:00:00.000Z", + "revoked_at": "2024-01-01T00:00:00.000Z", + "expires_at": "2024-01-01T00:00:00.000Z", + "organization_id": "organization_id", + "inviter_user_id": "inviter_user_id", + "accepted_user_id": "accepted_user_id", + "role_slug": "role_slug", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z", + "token": "token", + "accept_invitation_url": "accept_invitation_url" +} diff --git a/test/support/fixtures/user_management/send_verification_email.json b/test/support/fixtures/user_management/send_verification_email.json new file mode 100644 index 00000000..6f7f9480 --- /dev/null +++ b/test/support/fixtures/user_management/send_verification_email.json @@ -0,0 +1,18 @@ +{ + "user": { + "object": "user", + "id": "id", + "first_name": "first_name", + "last_name": "last_name", + "name": "name", + "profile_picture_url": "profile_picture_url", + "email": "email", + "email_verified": true, + "external_id": "external_id", + "metadata": {}, + "last_sign_in_at": "2024-01-01T00:00:00.000Z", + "locale": "locale", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + } +} diff --git a/test/support/fixtures/user_management/update_jwt_template.json b/test/support/fixtures/user_management/update_jwt_template.json new file mode 100644 index 00000000..44dbb490 --- /dev/null +++ b/test/support/fixtures/user_management/update_jwt_template.json @@ -0,0 +1,6 @@ +{ + "object": "jwt_template", + "content": "content", + "created_at": "created_at", + "updated_at": "updated_at" +} diff --git a/test/support/fixtures/user_management/update_user.json b/test/support/fixtures/user_management/update_user.json new file mode 100644 index 00000000..76693fd3 --- /dev/null +++ b/test/support/fixtures/user_management/update_user.json @@ -0,0 +1,16 @@ +{ + "object": "user", + "id": "id", + "first_name": "first_name", + "last_name": "last_name", + "name": "name", + "profile_picture_url": "profile_picture_url", + "email": "email", + "email_verified": true, + "external_id": "external_id", + "metadata": {}, + "last_sign_in_at": "2024-01-01T00:00:00.000Z", + "locale": "locale", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" +} diff --git a/test/support/fixtures/user_management/verify_email.json b/test/support/fixtures/user_management/verify_email.json new file mode 100644 index 00000000..6f7f9480 --- /dev/null +++ b/test/support/fixtures/user_management/verify_email.json @@ -0,0 +1,18 @@ +{ + "user": { + "object": "user", + "id": "id", + "first_name": "first_name", + "last_name": "last_name", + "name": "name", + "profile_picture_url": "profile_picture_url", + "email": "email", + "email_verified": true, + "external_id": "external_id", + "metadata": {}, + "last_sign_in_at": "2024-01-01T00:00:00.000Z", + "locale": "locale", + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + } +} diff --git a/test/support/fixtures/vault/create_data_key.json b/test/support/fixtures/vault/create_data_key.json new file mode 100644 index 00000000..6f34e0d4 --- /dev/null +++ b/test/support/fixtures/vault/create_data_key.json @@ -0,0 +1,6 @@ +{ + "context": {}, + "data_key": "data_key", + "encrypted_keys": "encrypted_keys", + "id": "id" +} diff --git a/test/support/fixtures/vault/create_decrypt.json b/test/support/fixtures/vault/create_decrypt.json new file mode 100644 index 00000000..0596090b --- /dev/null +++ b/test/support/fixtures/vault/create_decrypt.json @@ -0,0 +1,4 @@ +{ + "data_key": "data_key", + "id": "id" +} diff --git a/test/support/fixtures/vault/create_kv.json b/test/support/fixtures/vault/create_kv.json new file mode 100644 index 00000000..3d5447c4 --- /dev/null +++ b/test/support/fixtures/vault/create_kv.json @@ -0,0 +1,12 @@ +{ + "context": {}, + "environment_id": "environment_id", + "id": "id", + "key_id": "key_id", + "updated_at": "2024-01-01T00:00:00.000Z", + "updated_by": { + "id": "id", + "name": "name" + }, + "version_id": "version_id" +} diff --git a/test/support/fixtures/vault/create_rekey.json b/test/support/fixtures/vault/create_rekey.json new file mode 100644 index 00000000..6f34e0d4 --- /dev/null +++ b/test/support/fixtures/vault/create_rekey.json @@ -0,0 +1,6 @@ +{ + "context": {}, + "data_key": "data_key", + "encrypted_keys": "encrypted_keys", + "id": "id" +} diff --git a/test/support/fixtures/vault/delete_kv.json b/test/support/fixtures/vault/delete_kv.json new file mode 100644 index 00000000..8e22e130 --- /dev/null +++ b/test/support/fixtures/vault/delete_kv.json @@ -0,0 +1,4 @@ +{ + "name": "name", + "success": true +} diff --git a/test/support/fixtures/vault/get_kv.json b/test/support/fixtures/vault/get_kv.json new file mode 100644 index 00000000..390a546e --- /dev/null +++ b/test/support/fixtures/vault/get_kv.json @@ -0,0 +1,17 @@ +{ + "id": "id", + "metadata": { + "context": {}, + "environment_id": "environment_id", + "id": "id", + "key_id": "key_id", + "updated_at": "2024-01-01T00:00:00.000Z", + "updated_by": { + "id": "id", + "name": "name" + }, + "version_id": "version_id" + }, + "name": "name", + "value": "value" +} diff --git a/test/support/fixtures/vault/get_name.json b/test/support/fixtures/vault/get_name.json new file mode 100644 index 00000000..390a546e --- /dev/null +++ b/test/support/fixtures/vault/get_name.json @@ -0,0 +1,17 @@ +{ + "id": "id", + "metadata": { + "context": {}, + "environment_id": "environment_id", + "id": "id", + "key_id": "key_id", + "updated_at": "2024-01-01T00:00:00.000Z", + "updated_by": { + "id": "id", + "name": "name" + }, + "version_id": "version_id" + }, + "name": "name", + "value": "value" +} diff --git a/test/support/fixtures/vault/list_kv.json b/test/support/fixtures/vault/list_kv.json new file mode 100644 index 00000000..2f083c37 --- /dev/null +++ b/test/support/fixtures/vault/list_kv.json @@ -0,0 +1,21 @@ +{ + "data": [ + { + "data": [ + { + "id": "id", + "name": "name", + "updated_at": "2024-01-01T00:00:00.000Z" + } + ], + "list_metadata": { + "after": "after", + "before": "before" + } + } + ], + "list_metadata": { + "before": null, + "after": null + } +} diff --git a/test/support/fixtures/vault/list_kv_metadata.json b/test/support/fixtures/vault/list_kv_metadata.json new file mode 100644 index 00000000..75c340a9 --- /dev/null +++ b/test/support/fixtures/vault/list_kv_metadata.json @@ -0,0 +1,16 @@ +{ + "id": "id", + "metadata": { + "context": {}, + "environment_id": "environment_id", + "id": "id", + "key_id": "key_id", + "updated_at": "2024-01-01T00:00:00.000Z", + "updated_by": { + "id": "id", + "name": "name" + }, + "version_id": "version_id" + }, + "name": "name" +} diff --git a/test/support/fixtures/vault/list_kv_versions.json b/test/support/fixtures/vault/list_kv_versions.json new file mode 100644 index 00000000..61022658 --- /dev/null +++ b/test/support/fixtures/vault/list_kv_versions.json @@ -0,0 +1,15 @@ +{ + "data": [ + { + "created_at": "2024-01-01T00:00:00.000Z", + "current_version": true, + "etag": "etag", + "id": "id", + "size": 1 + } + ], + "list_metadata": { + "after": "after", + "before": "before" + } +} diff --git a/test/support/fixtures/vault/update_kv.json b/test/support/fixtures/vault/update_kv.json new file mode 100644 index 00000000..75c340a9 --- /dev/null +++ b/test/support/fixtures/vault/update_kv.json @@ -0,0 +1,16 @@ +{ + "id": "id", + "metadata": { + "context": {}, + "environment_id": "environment_id", + "id": "id", + "key_id": "key_id", + "updated_at": "2024-01-01T00:00:00.000Z", + "updated_by": { + "id": "id", + "name": "name" + }, + "version_id": "version_id" + }, + "name": "name" +} diff --git a/test/support/fixtures/webhooks/create_webhook_endpoint.json b/test/support/fixtures/webhooks/create_webhook_endpoint.json new file mode 100644 index 00000000..cacbc81f --- /dev/null +++ b/test/support/fixtures/webhooks/create_webhook_endpoint.json @@ -0,0 +1,12 @@ +{ + "object": "webhook_endpoint", + "id": "id", + "endpoint_url": "endpoint_url", + "secret": "secret", + "status": "enabled", + "events": [ + "events" + ], + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" +} diff --git a/test/support/fixtures/webhooks/list_webhook_endpoints.json b/test/support/fixtures/webhooks/list_webhook_endpoints.json new file mode 100644 index 00000000..aac6168c --- /dev/null +++ b/test/support/fixtures/webhooks/list_webhook_endpoints.json @@ -0,0 +1,29 @@ +{ + "data": [ + { + "object": "list", + "data": [ + { + "object": "webhook_endpoint", + "id": "id", + "endpoint_url": "endpoint_url", + "secret": "secret", + "status": "enabled", + "events": [ + "events" + ], + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" + } + ], + "list_metadata": { + "before": "before", + "after": "after" + } + } + ], + "list_metadata": { + "before": null, + "after": null + } +} diff --git a/test/support/fixtures/webhooks/update_webhook_endpoint.json b/test/support/fixtures/webhooks/update_webhook_endpoint.json new file mode 100644 index 00000000..cacbc81f --- /dev/null +++ b/test/support/fixtures/webhooks/update_webhook_endpoint.json @@ -0,0 +1,12 @@ +{ + "object": "webhook_endpoint", + "id": "id", + "endpoint_url": "endpoint_url", + "secret": "secret", + "status": "enabled", + "events": [ + "events" + ], + "created_at": "2024-01-01T00:00:00.000Z", + "updated_at": "2024-01-01T00:00:00.000Z" +} diff --git a/test/support/fixtures/widgets/create_token.json b/test/support/fixtures/widgets/create_token.json new file mode 100644 index 00000000..ba6edfe2 --- /dev/null +++ b/test/support/fixtures/widgets/create_token.json @@ -0,0 +1,3 @@ +{ + "token": "token" +} diff --git a/test/support/mfa_client_mock.ex b/test/support/mfa_client_mock.ex deleted file mode 100644 index 9a7a6f61..00000000 --- a/test/support/mfa_client_mock.ex +++ /dev/null @@ -1,151 +0,0 @@ -defmodule WorkOS.MFA.ClientMock do - @moduledoc false - - import ExUnit.Assertions, only: [assert: 1] - - @authentication_challenge_mock %{ - "object" => "authentication_challenge", - "id" => "auth_challenge_1234", - "created_at" => "2022-03-15T20:39:19.892Z", - "updated_at" => "2022-03-15T20:39:19.892Z", - "expires_at" => "2022-03-15T21:39:19.892Z", - "code" => "12345", - "authentication_factor_id" => "auth_factor_1234" - } - - @authentication_factor_mock %{ - "object" => "authentication_factor", - "id" => "auth_factor_1234", - "created_at" => "2022-03-15T20:39:19.892Z", - "updated_at" => "2022-03-15T20:39:19.892Z", - "type" => "totp", - "totp" => %{ - "issuer" => "WorkOS", - "user" => "some_user" - } - } - - def enroll_factor(context, opts \\ []) do - Tesla.Mock.mock(fn request -> - %{api_key: api_key} = context - - assert request.method == :post - - assert request.url == - "#{WorkOS.base_url()}/auth/factors/enroll" - - assert Enum.find(request.headers, &(elem(&1, 0) == "Authorization")) == - {"Authorization", "Bearer #{api_key}"} - - body = Jason.decode!(request.body) - - for {field, value} <- Keyword.get(opts, :assert_fields, []) do - assert body[to_string(field)] == value - end - - success_body = @authentication_factor_mock - - {status, body} = Keyword.get(opts, :respond_with, {200, success_body}) - %Tesla.Env{status: status, body: body} - end) - end - - def challenge_factor(context, opts \\ []) do - Tesla.Mock.mock(fn request -> - %{api_key: api_key} = context - - authentication_factor_id = - opts |> Keyword.get(:assert_fields) |> Keyword.get(:authentication_factor_id) - - assert request.method == :post - - assert request.url == - "#{WorkOS.base_url()}/auth/factors/#{authentication_factor_id}/challenge" - - assert Enum.find(request.headers, &(elem(&1, 0) == "Authorization")) == - {"Authorization", "Bearer #{api_key}"} - - body = Jason.decode!(request.body) - - for {field, value} <- - Keyword.get(opts, :assert_fields, []) |> Keyword.delete(:authentication_factor_id) do - assert body[to_string(field)] == value - end - - success_body = @authentication_challenge_mock - - {status, body} = Keyword.get(opts, :respond_with, {200, success_body}) - %Tesla.Env{status: status, body: body} - end) - end - - def verify_challenge(context, opts \\ []) do - Tesla.Mock.mock(fn request -> - %{api_key: api_key} = context - - authentication_challenge_id = - opts |> Keyword.get(:assert_fields) |> Keyword.get(:authentication_challenge_id) - - assert request.method == :post - - assert request.url == - "#{WorkOS.base_url()}/auth/challenges/#{authentication_challenge_id}/verify" - - assert Enum.find(request.headers, &(elem(&1, 0) == "Authorization")) == - {"Authorization", "Bearer #{api_key}"} - - body = Jason.decode!(request.body) - - for {field, value} <- - Keyword.get(opts, :assert_fields, []) |> Keyword.delete(:authentication_challenge_id) do - assert body[to_string(field)] == value - end - - success_body = %{ - "challenge" => @authentication_challenge_mock, - "valid" => true - } - - {status, body} = Keyword.get(opts, :respond_with, {200, success_body}) - %Tesla.Env{status: status, body: body} - end) - end - - def get_factor(context, opts \\ []) do - Tesla.Mock.mock(fn request -> - %{api_key: api_key} = context - - authentication_factor_id = - opts |> Keyword.get(:assert_fields) |> Keyword.get(:authentication_factor_id) - - assert request.method == :get - assert request.url == "#{WorkOS.base_url()}/auth/factors/#{authentication_factor_id}" - - assert Enum.find(request.headers, &(elem(&1, 0) == "Authorization")) == - {"Authorization", "Bearer #{api_key}"} - - success_body = @authentication_factor_mock - - {status, body} = Keyword.get(opts, :respond_with, {200, success_body}) - %Tesla.Env{status: status, body: body} - end) - end - - def delete_factor(context, opts \\ []) do - Tesla.Mock.mock(fn request -> - %{api_key: api_key} = context - - authentication_factor_id = - opts |> Keyword.get(:assert_fields) |> Keyword.get(:authentication_factor_id) - - assert request.method == :delete - assert request.url == "#{WorkOS.base_url()}/auth/factors/#{authentication_factor_id}" - - assert Enum.find(request.headers, &(elem(&1, 0) == "Authorization")) == - {"Authorization", "Bearer #{api_key}"} - - {status, body} = Keyword.get(opts, :respond_with, {204, %{}}) - %Tesla.Env{status: status, body: body} - end) - end -end diff --git a/test/support/organization_domains_client_mock.ex b/test/support/organization_domains_client_mock.ex deleted file mode 100644 index 9c12475f..00000000 --- a/test/support/organization_domains_client_mock.ex +++ /dev/null @@ -1,80 +0,0 @@ -defmodule WorkOS.OrganizationDomains.ClientMock do - @moduledoc false - - import ExUnit.Assertions, only: [assert: 1] - - @organization_domain_mock %{ - "object" => "organization_domain", - "id" => "org_domain_01HCZRAP3TPQ0X0DKJHR32TATG", - "domain" => "workos.com", - "state" => "verified", - "verification_token" => nil, - "verification_strategy" => "manual" - } - - def get_organization_domain(context, opts \\ []) do - Tesla.Mock.mock(fn request -> - %{api_key: api_key} = context - - organization_domain_id = - opts |> Keyword.get(:assert_fields) |> Keyword.get(:organization_domain_id) - - assert request.method == :get - assert request.url == "#{WorkOS.base_url()}/organization_domains/#{organization_domain_id}" - - assert Enum.find(request.headers, &(elem(&1, 0) == "Authorization")) == - {"Authorization", "Bearer #{api_key}"} - - success_body = @organization_domain_mock - - {status, body} = Keyword.get(opts, :respond_with, {200, success_body}) - %Tesla.Env{status: status, body: body} - end) - end - - def create_organization_domain(context, opts \\ []) do - Tesla.Mock.mock(fn request -> - %{api_key: api_key} = context - - assert request.method == :post - assert request.url == "#{WorkOS.base_url()}/organization_domains" - - assert Enum.find(request.headers, &(elem(&1, 0) == "Authorization")) == - {"Authorization", "Bearer #{api_key}"} - - body = Jason.decode!(request.body) - - for {field, value} <- - Keyword.get(opts, :assert_fields, []) do - assert body[to_string(field)] == value - end - - success_body = @organization_domain_mock - - {status, body} = Keyword.get(opts, :respond_with, {200, success_body}) - %Tesla.Env{status: status, body: body} - end) - end - - def verify_organization_domain(context, opts \\ []) do - Tesla.Mock.mock(fn request -> - %{api_key: api_key} = context - - organization_domain_id = - opts |> Keyword.get(:assert_fields) |> Keyword.get(:organization_domain_id) - - assert request.method == :post - - assert request.url == - "#{WorkOS.base_url()}/organization_domains/#{organization_domain_id}/verify" - - assert Enum.find(request.headers, &(elem(&1, 0) == "Authorization")) == - {"Authorization", "Bearer #{api_key}"} - - success_body = @organization_domain_mock - - {status, body} = Keyword.get(opts, :respond_with, {200, success_body}) - %Tesla.Env{status: status, body: body} - end) - end -end diff --git a/test/support/organizations_client_mock.ex b/test/support/organizations_client_mock.ex deleted file mode 100644 index cc87765c..00000000 --- a/test/support/organizations_client_mock.ex +++ /dev/null @@ -1,221 +0,0 @@ -defmodule WorkOS.Organizations.ClientMock do - @moduledoc false - - import ExUnit.Assertions, only: [assert: 1] - - def list_organizations(context, opts \\ []) do - Tesla.Mock.mock(fn request -> - %{api_key: api_key} = context - - assert request.method == :get - assert request.url == "#{WorkOS.base_url()}/organizations" - - assert Enum.find(request.headers, &(elem(&1, 0) == "Authorization")) == - {"Authorization", "Bearer #{api_key}"} - - success_body = %{ - "data" => [ - %{ - "id" => "org_01EHT88Z8J8795GZNQ4ZP1J81T", - "object" => "organization", - "name" => "Test Organization 1", - "allow_profiles_outside_organization" => false, - "domains" => [ - %{ - "domain" => "example.com", - "object" => "organization_domain", - "id" => "org_domain_01EHT88Z8WZEFWYPM6EC9BX2R8" - } - ], - "created_at" => "2023-07-17T20:07:20.055Z", - "updated_at" => "2023-07-17T20:07:20.055Z" - }, - %{ - "id" => "org_01EGPJWMT2EQMK7FMPR3TBC861", - "object" => "organization", - "name" => "Test Organization 2", - "allow_profiles_outside_organization" => true, - "domains" => [ - %{ - "domain" => "workos.com", - "object" => "organization_domain", - "id" => "org_domain_01EGPJWMTHRB5FP6MKE14RZ9BQ" - } - ], - "created_at" => "2023-07-17T20:07:20.055Z", - "updated_at" => "2023-07-17T20:07:20.055Z" - } - ], - "list_metadata" => %{ - "before" => "before-id", - "after" => "after-id" - } - } - - {status, body} = Keyword.get(opts, :respond_with, {200, success_body}) - %Tesla.Env{status: status, body: body} - end) - end - - def delete_organization(context, opts \\ []) do - Tesla.Mock.mock(fn request -> - %{api_key: api_key} = context - - organization_id = opts |> Keyword.get(:assert_fields) |> Keyword.get(:organization_id) - assert request.method == :delete - assert request.url == "#{WorkOS.base_url()}/organizations/#{organization_id}" - - assert Enum.find(request.headers, &(elem(&1, 0) == "Authorization")) == - {"Authorization", "Bearer #{api_key}"} - - {status, body} = Keyword.get(opts, :respond_with, {204, %{}}) - %Tesla.Env{status: status, body: body} - end) - end - - def get_organization(context, opts \\ []) do - Tesla.Mock.mock(fn request -> - %{api_key: api_key} = context - - organization_id = opts |> Keyword.get(:assert_fields) |> Keyword.get(:organization_id) - assert request.method == :get - assert request.url == "#{WorkOS.base_url()}/organizations/#{organization_id}" - - assert Enum.find(request.headers, &(elem(&1, 0) == "Authorization")) == - {"Authorization", "Bearer #{api_key}"} - - success_body = %{ - "id" => "org_01EHT88Z8J8795GZNQ4ZP1J81T", - "object" => "organization", - "name" => "Test Organization", - "allow_profiles_outside_organization" => false, - "domains" => [ - %{ - "domain" => "example.com", - "object" => "organization_domain", - "id" => "org_domain_01EHT88Z8WZEFWYPM6EC9BX2R8" - } - ], - "created_at" => "2023-07-17T20:07:20.055Z", - "updated_at" => "2023-07-17T20:07:20.055Z" - } - - {status, body} = Keyword.get(opts, :respond_with, {200, success_body}) - %Tesla.Env{status: status, body: body} - end) - end - - def get_organization_by_external_id(context, opts \\ []) do - Tesla.Mock.mock(fn request -> - %{api_key: api_key} = context - - external_id = opts |> Keyword.get(:assert_fields) |> Keyword.get(:external_id) - assert request.method == :get - assert request.url == "#{WorkOS.base_url()}/organizations/external_id/#{external_id}" - - assert Enum.find(request.headers, &(elem(&1, 0) == "Authorization")) == - {"Authorization", "Bearer #{api_key}"} - - success_body = %{ - "id" => "org_01EHT88Z8J8795GZNQ4ZP1J81T", - "object" => "organization", - "name" => "Test Organization", - "allow_profiles_outside_organization" => false, - "external_id" => external_id, - "domains" => [ - %{ - "domain" => "example.com", - "object" => "organization_domain", - "id" => "org_domain_01EHT88Z8WZEFWYPM6EC9BX2R8" - } - ], - "created_at" => "2023-07-17T20:07:20.055Z", - "updated_at" => "2023-07-17T20:07:20.055Z" - } - - {status, body} = Keyword.get(opts, :respond_with, {200, success_body}) - %Tesla.Env{status: status, body: body} - end) - end - - def create_organization(context, opts \\ []) do - Tesla.Mock.mock(fn request -> - %{api_key: api_key} = context - - assert request.method == :post - assert request.url == "#{WorkOS.base_url()}/organizations" - - assert Enum.find(request.headers, &(elem(&1, 0) == "Authorization")) == - {"Authorization", "Bearer #{api_key}"} - - assert Enum.find(request.headers, fn {header, _} -> header == "Idempotency-Key" end) != nil - - body = Jason.decode!(request.body) - - for {field, value} <- - Keyword.get(opts, :assert_fields, []) |> Keyword.delete(:idempotency_key) do - assert body[to_string(field)] == value - end - - success_body = %{ - "id" => "org_01EHT88Z8J8795GZNQ4ZP1J81T", - "object" => "organization", - "name" => body[:name], - "allow_profiles_outside_organization" => false, - "external_id" => body["external_id"], - "domains" => [ - %{ - "domain" => "example.com", - "object" => "organization_domain", - "id" => "org_domain_01EHT88Z8WZEFWYPM6EC9BX2R8" - } - ], - "created_at" => "2023-07-17T20:07:20.055Z", - "updated_at" => "2023-07-17T20:07:20.055Z" - } - - {status, body} = Keyword.get(opts, :respond_with, {200, success_body}) - %Tesla.Env{status: status, body: body} - end) - end - - def update_organization(context, opts \\ []) do - Tesla.Mock.mock(fn request -> - %{api_key: api_key} = context - - organization_id = opts |> Keyword.get(:assert_fields) |> Keyword.get(:organization_id) - assert request.method == :put - assert request.url == "#{WorkOS.base_url()}/organizations/#{organization_id}" - - assert Enum.find(request.headers, &(elem(&1, 0) == "Authorization")) == - {"Authorization", "Bearer #{api_key}"} - - body = Jason.decode!(request.body) - - for {field, value} <- - Keyword.get(opts, :assert_fields, []) |> Keyword.delete(:organization_id) do - assert body[to_string(field)] == value - end - - success_body = %{ - "id" => "org_01EHT88Z8J8795GZNQ4ZP1J81T", - "object" => "organization", - "name" => body[:name], - "allow_profiles_outside_organization" => false, - "external_id" => body["external_id"], - "domains" => [ - %{ - "domain" => "example.com", - "object" => "organization_domain", - "id" => "org_domain_01EHT88Z8WZEFWYPM6EC9BX2R8" - } - ], - "created_at" => "2023-07-17T20:07:20.055Z", - "updated_at" => "2023-07-17T20:07:20.055Z" - } - - {status, body} = Keyword.get(opts, :respond_with, {200, success_body}) - %Tesla.Env{status: status, body: body} - end) - end -end diff --git a/test/support/passwordless_client_mock.ex b/test/support/passwordless_client_mock.ex deleted file mode 100644 index 95ce0648..00000000 --- a/test/support/passwordless_client_mock.ex +++ /dev/null @@ -1,62 +0,0 @@ -defmodule WorkOS.Passwordless.ClientMock do - @moduledoc false - - import ExUnit.Assertions, only: [assert: 1] - - def create_session(context, opts \\ []) do - Tesla.Mock.mock(fn request -> - %{api_key: api_key} = context - - assert request.method == :post - assert request.url == "#{WorkOS.base_url()}/passwordless/sessions" - - assert Enum.find(request.headers, &(elem(&1, 0) == "Authorization")) == - {"Authorization", "Bearer #{api_key}"} - - body = Jason.decode!(request.body) - - for {field, value} <- - Keyword.get(opts, :assert_fields, []) do - assert body[to_string(field)] == value - end - - success_body = %{ - "id" => "passwordless_session_01EHDAK2BFGWCSZXP9HGZ3VK8C", - "email" => "passwordless_session_email@workos.com", - "expires_at" => "2020-08-13T05:50:00.000Z", - "link" => "https://auth.workos.com/passwordless/token/confirm", - "object" => "passwordless_session" - } - - {status, body} = Keyword.get(opts, :respond_with, {200, success_body}) - %Tesla.Env{status: status, body: body} - end) - end - - def send_session(context, opts \\ []) do - Tesla.Mock.mock(fn request -> - %{api_key: api_key} = context - - session_id = opts |> Keyword.get(:assert_fields) |> Keyword.get(:session_id) - assert request.method == :post - assert request.url == "#{WorkOS.base_url()}/passwordless/sessions/#{session_id}/send" - - assert Enum.find(request.headers, &(elem(&1, 0) == "Authorization")) == - {"Authorization", "Bearer #{api_key}"} - - body = Jason.decode!(request.body) - - for {field, value} <- - Keyword.get(opts, :assert_fields, []) |> Keyword.delete(:session_id) do - assert body[to_string(field)] == value - end - - success_body = %{ - "success" => true - } - - {status, body} = Keyword.get(opts, :respond_with, {200, success_body}) - %Tesla.Env{status: status, body: body} - end) - end -end diff --git a/test/support/portal_client_mock.ex b/test/support/portal_client_mock.ex deleted file mode 100644 index 28bb434e..00000000 --- a/test/support/portal_client_mock.ex +++ /dev/null @@ -1,31 +0,0 @@ -defmodule WorkOS.Portal.ClientMock do - @moduledoc false - - import ExUnit.Assertions, only: [assert: 1] - - def generate_link(context, opts \\ []) do - Tesla.Mock.mock(fn request -> - %{api_key: api_key} = context - - assert request.method == :post - assert request.url == "#{WorkOS.base_url()}/portal/generate_link" - - assert Enum.find(request.headers, &(elem(&1, 0) == "Authorization")) == - {"Authorization", "Bearer #{api_key}"} - - body = Jason.decode!(request.body) - - for {field, value} <- - Keyword.get(opts, :assert_fields, []) do - assert body[to_string(field)] == value - end - - success_body = %{ - "link" => "https://id.workos.com/portal/launch?secret=secret" - } - - {status, body} = Keyword.get(opts, :respond_with, {200, success_body}) - %Tesla.Env{status: status, body: body} - end) - end -end diff --git a/test/support/sso_client_mock.ex b/test/support/sso_client_mock.ex deleted file mode 100644 index 5e8d02db..00000000 --- a/test/support/sso_client_mock.ex +++ /dev/null @@ -1,164 +0,0 @@ -defmodule WorkOS.SSO.ClientMock do - @moduledoc false - - import ExUnit.Assertions, only: [assert: 1] - - def get_profile_and_token(context, opts \\ []) do - Tesla.Mock.mock(fn request -> - %{api_key: api_key} = context - - assert request.method == :post - assert request.url == "#{WorkOS.base_url()}/sso/token" - - assert Enum.find(request.headers, &(elem(&1, 0) == "Authorization")) == - {"Authorization", "Bearer #{api_key}"} - - body = Jason.decode!(request.body) - - for {field, value} <- Keyword.get(opts, :assert_fields, []) do - assert body[to_string(field)] == value - end - - groups = - case Map.get(context, :with_group_attribute, []) do - true -> ["Admins", "Developers"] - _ -> [] - end - - success_body = %{ - "access_token" => "01DMEK0J53CVMC32CK5SE0KZ8Q", - "profile" => %{ - "id" => "prof_123", - "idp_i" => "123", - "organization_id" => "org_123", - "connection_id" => "conn_123", - "connection_type" => "OktaSAML", - "email" => "foo@test.com", - "first_name" => "foo", - "last_name" => "bar", - "groups" => groups, - "raw_attributes" => %{ - "email" => "foo@test.com", - "first_name" => "foo", - "last_name" => "bar", - "groups" => groups - }, - "custom_attributes" => %{ - "sid" => "S-1-5-21-1004336348-1177238915-682003330-512" - } - } - } - - {status, body} = Keyword.get(opts, :respond_with, {200, success_body}) - %Tesla.Env{status: status, body: body} - end) - end - - def get_profile(_context, opts \\ []) do - Tesla.Mock.mock(fn request -> - access_token = Keyword.get(opts, :assert_fields, []) |> Keyword.get(:access_token) - - assert request.method == :get - assert request.url == "#{WorkOS.base_url()}/sso/profile" - - assert Enum.find(request.headers, &(elem(&1, 0) == "Authorization")) == - {"Authorization", "Bearer #{access_token}"} - - success_body = %{ - "id" => "prof_123", - "idp_i" => "123", - "organization_id" => "org_123", - "connection_id" => "conn_123", - "connection_type" => "OktaSAML", - "email" => "foo@test.com", - "first_name" => "foo", - "last_name" => "bar", - "raw_attributes" => %{ - "email" => "foo@test.com", - "first_name" => "foo", - "last_name" => "bar" - }, - "custom_attributes" => %{ - "sid" => "S-1-5-21-1004336348-1177238915-682003330-512" - } - } - - {status, body} = Keyword.get(opts, :respond_with, {200, success_body}) - %Tesla.Env{status: status, body: body} - end) - end - - def get_connection(context, opts \\ []) do - Tesla.Mock.mock(fn request -> - %{api_key: api_key} = context - - connection_id = opts |> Keyword.get(:assert_fields) |> Keyword.get(:connection_id) - assert request.method == :get - assert request.url == "#{WorkOS.base_url()}/connections/#{connection_id}" - - assert Enum.find(request.headers, &(elem(&1, 0) == "Authorization")) == - {"Authorization", "Bearer #{api_key}"} - - success_body = %{ - "id" => connection_id, - "organization_id" => "org_123", - "name" => "Connection", - "connection_type" => "OktaSAML", - "state" => "active", - "domains" => [], - "created_at" => "2023-07-17T20:07:20.055Z", - "updated_at" => "2023-07-17T20:07:20.055Z" - } - - {status, body} = Keyword.get(opts, :respond_with, {200, success_body}) - %Tesla.Env{status: status, body: body} - end) - end - - def list_connections(context, opts \\ []) do - Tesla.Mock.mock(fn request -> - %{api_key: api_key} = context - - assert request.method == :get - assert request.url == "#{WorkOS.base_url()}/connections" - - assert Enum.find(request.headers, &(elem(&1, 0) == "Authorization")) == - {"Authorization", "Bearer #{api_key}"} - - success_body = %{ - "data" => [ - %{ - "id" => "conn_123", - "organization_id" => "org_123", - "name" => "Connection", - "connection_type" => "OktaSAML", - "state" => "active", - "domains" => [], - "created_at" => "2023-07-17T20:07:20.055Z", - "updated_at" => "2023-07-17T20:07:20.055Z" - } - ], - "list_metadata" => %{} - } - - {status, body} = Keyword.get(opts, :respond_with, {200, success_body}) - %Tesla.Env{status: status, body: body} - end) - end - - def delete_connection(context, opts \\ []) do - Tesla.Mock.mock(fn request -> - %{api_key: api_key} = context - - connection_id = opts |> Keyword.get(:assert_fields) |> Keyword.get(:connection_id) - assert request.method == :delete - assert request.url == "#{WorkOS.base_url()}/connections/#{connection_id}" - - assert Enum.find(request.headers, &(elem(&1, 0) == "Authorization")) == - {"Authorization", "Bearer #{api_key}"} - - {status, body} = Keyword.get(opts, :respond_with, {204, %{}}) - %Tesla.Env{status: status, body: body} - end) - end -end diff --git a/test/support/test_case.ex b/test/support/test_case.ex deleted file mode 100644 index 35d12273..00000000 --- a/test/support/test_case.ex +++ /dev/null @@ -1,17 +0,0 @@ -defmodule WorkOS.TestCase do - @moduledoc false - - defmacro __using__(_opts) do - quote do - use ExUnit.Case - import WorkOS.TestCase - end - end - - def setup_env(_context) do - %{ - api_key: System.get_env("WORKOS_API_KEY", "sk_example_123456789"), - client_id: System.get_env("WORKOS_CLIENT_ID", "client_123456789") - } - end -end diff --git a/test/support/test_fixtures.ex b/test/support/test_fixtures.ex new file mode 100644 index 00000000..6587cf55 --- /dev/null +++ b/test/support/test_fixtures.ex @@ -0,0 +1,13 @@ +# @oagen-ignore-file + +defmodule WorkOS.TestFixtures do + @moduledoc false + + @fixtures_dir Path.join(__DIR__, "fixtures") + + @doc "Loads and decodes a JSON fixture by name (without extension)." + @spec fixture(String.t()) :: term() + def fixture(name) do + @fixtures_dir |> Path.join(name <> ".json") |> File.read!() |> JSON.decode!() + end +end diff --git a/test/support/user_management_client_mock.ex b/test/support/user_management_client_mock.ex deleted file mode 100644 index 3b8367ce..00000000 --- a/test/support/user_management_client_mock.ex +++ /dev/null @@ -1,586 +0,0 @@ -defmodule WorkOS.UserManagement.ClientMock do - @moduledoc false - - import ExUnit.Assertions, only: [assert: 1] - - @user_mock %{ - "object" => "user", - "id" => "user_01H5JQDV7R7ATEYZDEG0W5PRYS", - "email" => "test@example.com", - "first_name" => "Test 01", - "last_name" => "User", - "created_at" => "2023-07-18T02:07:19.911Z", - "updated_at" => "2023-07-18T02:07:19.911Z", - "email_verified" => true, - "external_id" => "ext_user_123" - } - - @invitation_mock %{ - "object" => "invitation", - "id" => "invitation_01H5JQDV7R7ATEYZDEG0W5PRYS", - "email" => "test@workos.com", - "state" => "pending", - "accepted_at" => "2023-07-18T02:07:19.911Z", - "revoked_at" => "2023-07-18T02:07:19.911Z", - "expires_at" => "2023-07-18T02:07:19.911Z", - "organization_id" => "org_01H5JQDV7R7ATEYZDEG0W5PRYS", - "token" => "Z1uX3RbwcIl5fIGJJJCXXisdI", - "created_at" => "2023-07-18T02:07:19.911Z", - "updated_at" => "2023-07-18T02:07:19.911Z" - } - - @organization_membership_mock %{ - "object" => "organization_membership", - "id" => "om_01H5JQDV7R7ATEYZDEG0W5PRYS", - "user_id" => "user_01H5JQDV7R7ATEYZDEG0W5PRYS", - "organization_id" => "organization_01H5JQDV7R7ATEYZDEG0W5PRYS", - "custom_attributes" => %{"department" => "Engineering"}, - "created_at" => "2023-07-18T02:07:19.911Z", - "updated_at" => "2023-07-18T02:07:19.911Z" - } - - @authentication_factor_mock %{ - "object" => "authentication_factor", - "id" => "auth_factor_1234", - "created_at" => "2022-03-15T20:39:19.892Z", - "updated_at" => "2022-03-15T20:39:19.892Z", - "type" => "totp", - "totp" => %{ - "issuer" => "WorkOS", - "user" => "some_user" - } - } - - @authentication_challenge_mock %{ - "object" => "authentication_challenge", - "id" => "auth_challenge_1234", - "created_at" => "2022-03-15T20:39:19.892Z", - "updated_at" => "2022-03-15T20:39:19.892Z", - "expires_at" => "2022-03-15T21:39:19.892Z", - "code" => "12345", - "authentication_factor_id" => "auth_factor_1234" - } - - @authentication_mock %{ - "user" => @user_mock, - "organization_id" => "organization_01H5JQDV7R7ATEYZDEG0W5PRYS" - } - - @authentication_code_mock %{ - "user" => @user_mock, - "organization_id" => "organization_01H5JQDV7R7ATEYZDEG0W5PRYS", - "access_token" => "01DMEK0J53CVMC32CK5SE0KZ8Q", - "refresh_token" => "01DMEK0J53CVMC32CK5SE0KZ8Q", - "authentication_method" => "SSO" - } - - def get_user(context, opts \\ []) do - Tesla.Mock.mock(fn request -> - %{api_key: api_key} = context - - user_id = opts |> Keyword.get(:assert_fields) |> Keyword.get(:user_id) - assert request.method == :get - assert request.url == "#{WorkOS.base_url()}/user_management/users/#{user_id}" - - assert Enum.find(request.headers, &(elem(&1, 0) == "Authorization")) == - {"Authorization", "Bearer #{api_key}"} - - success_body = @user_mock - - {status, body} = Keyword.get(opts, :respond_with, {200, success_body}) - %Tesla.Env{status: status, body: body} - end) - end - - def get_user_by_external_id(context, opts \\ []) do - Tesla.Mock.mock(fn request -> - %{api_key: api_key} = context - - external_id = opts |> Keyword.get(:assert_fields) |> Keyword.get(:external_id) - assert request.method == :get - - assert request.url == - "#{WorkOS.base_url()}/user_management/users/external_id/#{external_id}" - - assert Enum.find(request.headers, &(elem(&1, 0) == "Authorization")) == - {"Authorization", "Bearer #{api_key}"} - - success_body = @user_mock - - {status, body} = Keyword.get(opts, :respond_with, {200, success_body}) - %Tesla.Env{status: status, body: body} - end) - end - - def list_users(context, opts \\ []) do - Tesla.Mock.mock(fn request -> - %{api_key: api_key} = context - - assert request.method == :get - assert request.url == "#{WorkOS.base_url()}/user_management/users" - - assert Enum.find(request.headers, &(elem(&1, 0) == "Authorization")) == - {"Authorization", "Bearer #{api_key}"} - - success_body = %{ - "data" => [ - @user_mock - ], - "list_metadata" => %{ - "before" => "before-id", - "after" => "after-id" - } - } - - {status, body} = Keyword.get(opts, :respond_with, {200, success_body}) - %Tesla.Env{status: status, body: body} - end) - end - - def create_user(context, opts \\ []) do - Tesla.Mock.mock(fn request -> - %{api_key: api_key} = context - - assert request.method == :post - assert request.url == "#{WorkOS.base_url()}/user_management/users" - - assert Enum.find(request.headers, &(elem(&1, 0) == "Authorization")) == - {"Authorization", "Bearer #{api_key}"} - - body = Jason.decode!(request.body) - - for {field, value} <- - Keyword.get(opts, :assert_fields, []) do - assert body[to_string(field)] == value - end - - success_body = @user_mock - - {status, body} = Keyword.get(opts, :respond_with, {200, success_body}) - %Tesla.Env{status: status, body: body} - end) - end - - def update_user(context, opts \\ []) do - Tesla.Mock.mock(fn request -> - %{api_key: api_key} = context - - user_id = opts |> Keyword.get(:assert_fields) |> Keyword.get(:user_id) - assert request.method == :put - assert request.url == "#{WorkOS.base_url()}/user_management/users/#{user_id}" - - assert Enum.find(request.headers, &(elem(&1, 0) == "Authorization")) == - {"Authorization", "Bearer #{api_key}"} - - body = Jason.decode!(request.body) - - for {field, value} <- Keyword.get(opts, :assert_fields, []) |> Keyword.delete(:user_id) do - assert body[to_string(field)] == value - end - - success_body = @user_mock - - {status, body} = Keyword.get(opts, :respond_with, {200, success_body}) - %Tesla.Env{status: status, body: body} - end) - end - - def delete_user(context, opts \\ []) do - Tesla.Mock.mock(fn request -> - %{api_key: api_key} = context - - user_id = opts |> Keyword.get(:assert_fields) |> Keyword.get(:user_id) - assert request.method == :delete - assert request.url == "#{WorkOS.base_url()}/user_management/users/#{user_id}" - - assert Enum.find(request.headers, &(elem(&1, 0) == "Authorization")) == - {"Authorization", "Bearer #{api_key}"} - - {status, body} = Keyword.get(opts, :respond_with, {204, %{}}) - %Tesla.Env{status: status, body: body} - end) - end - - def authenticate(context, opts \\ []) do - Tesla.Mock.mock(fn request -> - %{api_key: api_key} = context - - assert request.method == :post - assert request.url == "#{WorkOS.base_url()}/user_management/authenticate" - - assert Enum.find(request.headers, &(elem(&1, 0) == "Authorization")) == - {"Authorization", "Bearer #{api_key}"} - - body = Jason.decode!(request.body) - - for {field, value} <- Keyword.get(opts, :assert_fields, []) do - assert body[to_string(field)] == value - end - - success_body = - case body do - %{"code" => _} -> @authentication_code_mock - _ -> @authentication_mock - end - - {status, body} = Keyword.get(opts, :respond_with, {200, success_body}) - %Tesla.Env{status: status, body: body} - end) - end - - def send_magic_auth_code(context, opts \\ []) do - Tesla.Mock.mock(fn request -> - %{api_key: api_key} = context - - assert request.method == :post - assert request.url == "#{WorkOS.base_url()}/user_management/magic_auth/send" - - assert Enum.find(request.headers, &(elem(&1, 0) == "Authorization")) == - {"Authorization", "Bearer #{api_key}"} - - body = Jason.decode!(request.body) - - for {field, value} <- Keyword.get(opts, :assert_fields, []) do - assert body[to_string(field)] == value - end - - success_body = %{} - - {status, body} = Keyword.get(opts, :respond_with, {200, success_body}) - %Tesla.Env{status: status, body: body} - end) - end - - def enroll_auth_factor(context, opts \\ []) do - Tesla.Mock.mock(fn request -> - %{api_key: api_key} = context - - user_id = opts |> Keyword.get(:assert_fields) |> Keyword.get(:user_id) - assert request.method == :post - - assert request.url == - "#{WorkOS.base_url()}/user_management/users/#{user_id}/auth_factors" - - assert Enum.find(request.headers, &(elem(&1, 0) == "Authorization")) == - {"Authorization", "Bearer #{api_key}"} - - body = Jason.decode!(request.body) - - for {field, value} <- Keyword.get(opts, :assert_fields, []) |> Keyword.delete(:user_id) do - assert body[to_string(field)] == value - end - - success_body = %{ - "challenge" => @authentication_challenge_mock, - "factor" => @authentication_factor_mock - } - - {status, body} = Keyword.get(opts, :respond_with, {200, success_body}) - %Tesla.Env{status: status, body: body} - end) - end - - def send_verification_email(context, opts \\ []) do - Tesla.Mock.mock(fn request -> - %{api_key: api_key} = context - - user_id = opts |> Keyword.get(:assert_fields) |> Keyword.get(:user_id) - assert request.method == :post - - assert request.url == - "#{WorkOS.base_url()}/user_management/users/#{user_id}/email_verification/send" - - assert Enum.find(request.headers, &(elem(&1, 0) == "Authorization")) == - {"Authorization", "Bearer #{api_key}"} - - success_body = %{ - "user" => @user_mock - } - - {status, body} = Keyword.get(opts, :respond_with, {200, success_body}) - %Tesla.Env{status: status, body: body} - end) - end - - def list_auth_factors(context, opts \\ []) do - Tesla.Mock.mock(fn request -> - %{api_key: api_key} = context - - user_id = opts |> Keyword.get(:assert_fields) |> Keyword.get(:user_id) - assert request.method == :get - assert request.url == "#{WorkOS.base_url()}/user_management/users/#{user_id}/auth_factors" - - assert Enum.find(request.headers, &(elem(&1, 0) == "Authorization")) == - {"Authorization", "Bearer #{api_key}"} - - success_body = %{ - "data" => [ - @authentication_factor_mock - ], - "list_metadata" => %{ - "before" => "before-id", - "after" => "after-id" - } - } - - {status, body} = Keyword.get(opts, :respond_with, {200, success_body}) - %Tesla.Env{status: status, body: body} - end) - end - - def verify_email(context, opts \\ []) do - Tesla.Mock.mock(fn request -> - %{api_key: api_key} = context - - user_id = opts |> Keyword.get(:assert_fields) |> Keyword.get(:user_id) - assert request.method == :post - - assert request.url == - "#{WorkOS.base_url()}/user_management/users/#{user_id}/email_verification/confirm" - - assert Enum.find(request.headers, &(elem(&1, 0) == "Authorization")) == - {"Authorization", "Bearer #{api_key}"} - - body = Jason.decode!(request.body) - - for {field, value} <- Keyword.get(opts, :assert_fields, []) |> Keyword.delete(:user_id) do - assert body[to_string(field)] == value - end - - success_body = %{"user" => @user_mock} - - {status, body} = Keyword.get(opts, :respond_with, {200, success_body}) - %Tesla.Env{status: status, body: body} - end) - end - - def send_password_reset_email(context, opts \\ []) do - Tesla.Mock.mock(fn request -> - %{api_key: api_key} = context - - assert request.method == :post - assert request.url == "#{WorkOS.base_url()}/user_management/password_reset/send" - - assert Enum.find(request.headers, &(elem(&1, 0) == "Authorization")) == - {"Authorization", "Bearer #{api_key}"} - - body = Jason.decode!(request.body) - - for {field, value} <- - Keyword.get(opts, :assert_fields, []) do - assert body[to_string(field)] == value - end - - success_body = %{ - user: @user_mock - } - - {status, body} = Keyword.get(opts, :respond_with, {200, success_body}) - %Tesla.Env{status: status, body: body} - end) - end - - def reset_password(context, opts \\ []) do - Tesla.Mock.mock(fn request -> - %{api_key: api_key} = context - - assert request.method == :post - assert request.url == "#{WorkOS.base_url()}/user_management/password_reset/confirm" - - assert Enum.find(request.headers, &(elem(&1, 0) == "Authorization")) == - {"Authorization", "Bearer #{api_key}"} - - body = Jason.decode!(request.body) - - for {field, value} <- - Keyword.get(opts, :assert_fields, []) do - assert body[to_string(field)] == value - end - - success_body = %{ - "user" => @user_mock - } - - {status, body} = Keyword.get(opts, :respond_with, {200, success_body}) - %Tesla.Env{status: status, body: body} - end) - end - - def get_organization_membership(context, opts \\ []) do - Tesla.Mock.mock(fn request -> - %{api_key: api_key} = context - - organization_membership_id = - opts |> Keyword.get(:assert_fields) |> Keyword.get(:organization_membership_id) - - assert request.method == :get - - assert request.url == - "#{WorkOS.base_url()}/user_management/organization_memberships/#{organization_membership_id}" - - assert Enum.find(request.headers, &(elem(&1, 0) == "Authorization")) == - {"Authorization", "Bearer #{api_key}"} - - success_body = @organization_membership_mock - - {status, body} = Keyword.get(opts, :respond_with, {200, success_body}) - %Tesla.Env{status: status, body: body} - end) - end - - def list_organization_memberships(context, opts \\ []) do - Tesla.Mock.mock(fn request -> - %{api_key: api_key} = context - - assert request.method == :get - assert request.url == "#{WorkOS.base_url()}/user_management/organization_memberships" - - assert Enum.find(request.headers, &(elem(&1, 0) == "Authorization")) == - {"Authorization", "Bearer #{api_key}"} - - success_body = %{ - "data" => [ - @organization_membership_mock - ], - "list_metadata" => %{ - "before" => "before-id", - "after" => "after-id" - } - } - - {status, body} = Keyword.get(opts, :respond_with, {200, success_body}) - %Tesla.Env{status: status, body: body} - end) - end - - def create_organization_membership(context, opts \\ []) do - Tesla.Mock.mock(fn request -> - %{api_key: api_key} = context - - assert request.method == :post - assert request.url == "#{WorkOS.base_url()}/user_management/organization_memberships" - - assert Enum.find(request.headers, &(elem(&1, 0) == "Authorization")) == - {"Authorization", "Bearer #{api_key}"} - - body = Jason.decode!(request.body) - - for {field, value} <- - Keyword.get(opts, :assert_fields, []) do - assert body[to_string(field)] == value - end - - success_body = @organization_membership_mock - - {status, body} = Keyword.get(opts, :respond_with, {200, success_body}) - %Tesla.Env{status: status, body: body} - end) - end - - def delete_organization_membership(context, opts \\ []) do - Tesla.Mock.mock(fn request -> - %{api_key: api_key} = context - - organization_membership_id = - opts |> Keyword.get(:assert_fields) |> Keyword.get(:organization_membership_id) - - assert request.method == :delete - - assert request.url == - "#{WorkOS.base_url()}/user_management/organization_memberships/#{organization_membership_id}" - - assert Enum.find(request.headers, &(elem(&1, 0) == "Authorization")) == - {"Authorization", "Bearer #{api_key}"} - - {status, body} = Keyword.get(opts, :respond_with, {204, %{}}) - %Tesla.Env{status: status, body: body} - end) - end - - def get_invitation(context, opts \\ []) do - Tesla.Mock.mock(fn request -> - %{api_key: api_key} = context - - invitation_id = opts |> Keyword.get(:assert_fields) |> Keyword.get(:invitation_id) - assert request.method == :get - assert request.url == "#{WorkOS.base_url()}/user_management/invitations/#{invitation_id}" - - assert Enum.find(request.headers, &(elem(&1, 0) == "Authorization")) == - {"Authorization", "Bearer #{api_key}"} - - success_body = @invitation_mock - - {status, body} = Keyword.get(opts, :respond_with, {200, success_body}) - %Tesla.Env{status: status, body: body} - end) - end - - def list_invitations(context, opts \\ []) do - Tesla.Mock.mock(fn request -> - %{api_key: api_key} = context - - assert request.method == :get - assert request.url == "#{WorkOS.base_url()}/user_management/invitations" - - assert Enum.find(request.headers, &(elem(&1, 0) == "Authorization")) == - {"Authorization", "Bearer #{api_key}"} - - success_body = %{ - "data" => [ - @invitation_mock - ], - "list_metadata" => %{ - "before" => "before-id", - "after" => "after-id" - } - } - - {status, body} = Keyword.get(opts, :respond_with, {200, success_body}) - %Tesla.Env{status: status, body: body} - end) - end - - def send_invitation(context, opts \\ []) do - Tesla.Mock.mock(fn request -> - %{api_key: api_key} = context - - assert request.method == :post - assert request.url == "#{WorkOS.base_url()}/user_management/invitations" - - assert Enum.find(request.headers, &(elem(&1, 0) == "Authorization")) == - {"Authorization", "Bearer #{api_key}"} - - body = Jason.decode!(request.body) - - for {field, value} <- - Keyword.get(opts, :assert_fields, []) do - assert body[to_string(field)] == value - end - - success_body = @invitation_mock - - {status, body} = Keyword.get(opts, :respond_with, {200, success_body}) - %Tesla.Env{status: status, body: body} - end) - end - - def revoke_invitation(context, opts \\ []) do - Tesla.Mock.mock(fn request -> - %{api_key: api_key} = context - - invitation_id = opts |> Keyword.get(:assert_fields) |> Keyword.get(:invitation_id) - assert request.method == :post - - assert request.url == - "#{WorkOS.base_url()}/user_management/invitations/#{invitation_id}/revoke" - - assert Enum.find(request.headers, &(elem(&1, 0) == "Authorization")) == - {"Authorization", "Bearer #{api_key}"} - - success_body = @invitation_mock - - {status, body} = Keyword.get(opts, :respond_with, {200, success_body}) - %Tesla.Env{status: status, body: body} - end) - end -end diff --git a/test/test_helper.exs b/test/test_helper.exs index 869559e7..3416380c 100755 --- a/test/test_helper.exs +++ b/test/test_helper.exs @@ -1 +1,3 @@ +# @oagen-ignore-file + ExUnit.start() diff --git a/test/workos/actions_test.exs b/test/workos/actions_test.exs new file mode 100644 index 00000000..c6f4a16f --- /dev/null +++ b/test/workos/actions_test.exs @@ -0,0 +1,75 @@ +# @oagen-ignore-file — hand-maintained tests for AuthKit Actions helpers. + +defmodule WorkOS.ActionsTest do + use ExUnit.Case, async: true + + alias WorkOS.Webhooks.Signature + + @secret "actions_secret_123" + @payload ~s({"id":"event_123","event":"authentication.action","data":{"user":{"id":"user_123"}},"created_at":"2026-01-01T00:00:00.000Z"}) + + defp signed_header(payload, now_ms) do + timestamp = Integer.to_string(now_ms) + "t=#{timestamp}, v1=#{Signature.compute_signature(@secret, timestamp, payload)}" + end + + test "verify_header accepts a valid signature" do + header = signed_header(@payload, System.system_time(:millisecond)) + + assert :ok = WorkOS.Actions.verify_header(@payload, header, @secret) + end + + test "verify_header rejects a tampered payload" do + header = signed_header(@payload, System.system_time(:millisecond)) + + assert {:error, :no_valid_signature} = + WorkOS.Actions.verify_header(@payload <> "x", header, @secret) + end + + test "verify_header enforces its tighter default tolerance" do + stale_ms = System.system_time(:millisecond) - :timer.minutes(2) + header = signed_header(@payload, stale_ms) + + assert {:error, :outside_tolerance} = + WorkOS.Actions.verify_header(@payload, header, @secret) + + assert :ok = WorkOS.Actions.verify_header(@payload, header, @secret, tolerance: 3600) + end + + test "construct_action verifies and deserializes the request" do + header = signed_header(@payload, System.system_time(:millisecond)) + + assert {:ok, %WorkOS.EventSchema{} = action} = + WorkOS.Actions.construct_action(@payload, header, @secret) + + assert action.event == "authentication.action" + assert action.data["user"]["id"] == "user_123" + end + + test "sign_response produces a payload the verifier accepts" do + assert {:ok, %{payload: payload, sig: sig}} = + WorkOS.Actions.sign_response( + %{type: "authentication", verdict: "Allow"}, + @secret + ) + + decoded = payload |> Base.decode64!() |> JSON.decode!() + assert decoded["type"] == "authentication" + assert decoded["verdict"] == "Allow" + + # The signature is over the base64 payload, in the standard header format. + assert :ok = WorkOS.Actions.verify_header(payload, sig, @secret) + end + + test "sign_response carries a deny error message" do + assert {:ok, %{payload: payload}} = + WorkOS.Actions.sign_response( + %{type: "user_registration", verdict: "Deny", error_message: "Blocked"}, + @secret + ) + + decoded = payload |> Base.decode64!() |> JSON.decode!() + assert decoded["verdict"] == "Deny" + assert decoded["error_message"] == "Blocked" + end +end diff --git a/test/workos/admin_portal_round_trip_test.exs b/test/workos/admin_portal_round_trip_test.exs new file mode 100644 index 00000000..4c2bc604 --- /dev/null +++ b/test/workos/admin_portal_round_trip_test.exs @@ -0,0 +1,18 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AdminPortalRoundTripTest do + use ExUnit.Case, async: true + + test "PortalLinkResponse round-trips between wire and struct" do + data = %{"link" => "link"} + + serialized = + data |> WorkOS.PortalLinkResponse.from_map() |> WorkOS.PortalLinkResponse.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.PortalLinkResponse.from_map() + |> WorkOS.PortalLinkResponse.to_map() == serialized + end +end diff --git a/test/workos/admin_portal_test.exs b/test/workos/admin_portal_test.exs new file mode 100644 index 00000000..02f7d14d --- /dev/null +++ b/test/workos/admin_portal_test.exs @@ -0,0 +1,49 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AdminPortalTest do + use ExUnit.Case, async: true + + setup do + client = + WorkOS.Client.new( + api_key: "sk_test_key", + req_options: [plug: {Req.Test, WorkOS.Client}] + ) + + {:ok, client: client} + end + + test "generate_link succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/portal/generate_link" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("admin_portal/generate_link")) + end) + + assert {:ok, %WorkOS.PortalLinkResponse{link: "link"}} = + WorkOS.AdminPortal.generate_link(client) + end + + test "generate_link honors per-request options", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert Plug.Conn.get_req_header(conn, "x-custom") == ["value"] + assert conn.host == "override.example.com" + Plug.Conn.send_resp(conn, 204, "") + end) + + WorkOS.AdminPortal.generate_link(client, %{}, + headers: [{"x-custom", "value"}], + base_url: "https://override.example.com" + ) + end + + test "surfaces API errors as tagged tuples", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + conn + |> Plug.Conn.put_status(401) + |> Req.Test.json(%{"message" => "Unauthorized"}) + end) + + assert {:error, %WorkOS.ApiError{status: 401}} = WorkOS.AdminPortal.generate_link(client) + end +end diff --git a/test/workos/agents_round_trip_test.exs b/test/workos/agents_round_trip_test.exs new file mode 100644 index 00000000..7655601b --- /dev/null +++ b/test/workos/agents_round_trip_test.exs @@ -0,0 +1,75 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AgentsRoundTripTest do + use ExUnit.Case, async: true + + test "AgentCredentialValidation round-trips between wire and struct" do + data = %{ + "valid" => true, + "registration_id" => "registration_id", + "expires_at" => "2024-01-01T00:00:00.000Z" + } + + serialized = + data + |> WorkOS.AgentCredentialValidation.from_map() + |> WorkOS.AgentCredentialValidation.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.AgentCredentialValidation.from_map() + |> WorkOS.AgentCredentialValidation.to_map() == serialized + end + + test "AgentRegistration round-trips between wire and struct" do + data = %{ + "id" => "id", + "agent_identity" => %{ + "id" => "id", + "userland_user_id" => "userland_user_id", + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z" + }, + "organization_id" => "organization_id", + "status" => "unverified", + "kind" => "anonymous", + "claim" => %{ + "id" => "id", + "claim_completion" => %{ + "id" => "id", + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z", + "expires_at" => "2024-01-01T00:00:00.000Z", + "claimed_at" => "2024-01-01T00:00:00.000Z" + }, + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z", + "expires_at" => "2024-01-01T00:00:00.000Z" + }, + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z" + } + + serialized = data |> WorkOS.AgentRegistration.from_map() |> WorkOS.AgentRegistration.to_map() + assert serialized == data + + assert serialized |> WorkOS.AgentRegistration.from_map() |> WorkOS.AgentRegistration.to_map() == + serialized + end + + test "ClaimViewResponse round-trips between wire and struct" do + data = %{ + "id" => "id", + "status" => "unverified", + "user_code" => "user_code", + "organizations" => [%{"id" => "id", "name" => "name"}] + } + + serialized = data |> WorkOS.ClaimViewResponse.from_map() |> WorkOS.ClaimViewResponse.to_map() + assert serialized == data + + assert serialized |> WorkOS.ClaimViewResponse.from_map() |> WorkOS.ClaimViewResponse.to_map() == + serialized + end +end diff --git a/test/workos/agents_test.exs b/test/workos/agents_test.exs new file mode 100644 index 00000000..5ddbeeef --- /dev/null +++ b/test/workos/agents_test.exs @@ -0,0 +1,72 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AgentsTest do + use ExUnit.Case, async: true + + setup do + client = + WorkOS.Client.new( + api_key: "sk_test_key", + req_options: [plug: {Req.Test, WorkOS.Client}] + ) + + {:ok, client: client} + end + + test "update_attempts succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "PATCH" + assert conn.request_path == "/agents/claims/attempts" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("agents/update_attempts")) + end) + + assert {:ok, %WorkOS.ClaimViewResponse{id: "id", user_code: "user_code"}} = + WorkOS.Agents.update_attempts(client) + end + + test "create_validate succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/agents/credentials/validate" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("agents/create_validate")) + end) + + assert {:ok, + %WorkOS.AgentCredentialValidation{valid: true, registration_id: "registration_id"}} = + WorkOS.Agents.create_validate(client) + end + + test "get_registration succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/agents/registrations/test_id" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("agents/get_registration")) + end) + + assert {:ok, %WorkOS.AgentRegistration{id: "id", organization_id: "organization_id"}} = + WorkOS.Agents.get_registration(client, "test_id") + end + + test "update_attempts honors per-request options", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert Plug.Conn.get_req_header(conn, "x-custom") == ["value"] + assert conn.host == "override.example.com" + Plug.Conn.send_resp(conn, 204, "") + end) + + WorkOS.Agents.update_attempts(client, %{}, + headers: [{"x-custom", "value"}], + base_url: "https://override.example.com" + ) + end + + test "surfaces API errors as tagged tuples", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + conn + |> Plug.Conn.put_status(401) + |> Req.Test.json(%{"message" => "Unauthorized"}) + end) + + assert {:error, %WorkOS.ApiError{status: 401}} = WorkOS.Agents.update_attempts(client) + end +end diff --git a/test/workos/api_keys_round_trip_test.exs b/test/workos/api_keys_round_trip_test.exs new file mode 100644 index 00000000..55162935 --- /dev/null +++ b/test/workos/api_keys_round_trip_test.exs @@ -0,0 +1,109 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ApiKeysRoundTripTest do + use ExUnit.Case, async: true + + test "ApiKey round-trips between wire and struct" do + data = %{ + "object" => "api_key", + "id" => "id", + "name" => "name", + "obfuscated_value" => "obfuscated_value", + "last_used_at" => "2024-01-01T00:00:00.000Z", + "expires_at" => "2024-01-01T00:00:00.000Z", + "permissions" => ["permissions"], + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z" + } + + serialized = data |> WorkOS.ApiKey.from_map() |> WorkOS.ApiKey.to_map() + assert serialized == data + + assert serialized |> WorkOS.ApiKey.from_map() |> WorkOS.ApiKey.to_map() == serialized + end + + test "ApiKeyValidationResponse round-trips between wire and struct" do + data = %{ + "api_key" => %{ + "object" => "api_key", + "id" => "id", + "name" => "name", + "obfuscated_value" => "obfuscated_value", + "last_used_at" => "2024-01-01T00:00:00.000Z", + "expires_at" => "2024-01-01T00:00:00.000Z", + "permissions" => ["permissions"], + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z" + }, + "agent_registration_id" => "agent_registration_id" + } + + serialized = + data + |> WorkOS.ApiKeyValidationResponse.from_map() + |> WorkOS.ApiKeyValidationResponse.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.ApiKeyValidationResponse.from_map() + |> WorkOS.ApiKeyValidationResponse.to_map() == serialized + end + + test "OrganizationApiKeyList round-trips between wire and struct" do + data = %{ + "object" => "list", + "data" => [ + %{ + "object" => "api_key", + "id" => "id", + "owner" => %{"type" => "organization", "id" => "id"}, + "name" => "name", + "obfuscated_value" => "obfuscated_value", + "last_used_at" => "2024-01-01T00:00:00.000Z", + "expires_at" => "2024-01-01T00:00:00.000Z", + "permissions" => ["permissions"], + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z" + } + ], + "list_metadata" => %{"before" => "before", "after" => "after"} + } + + serialized = + data |> WorkOS.OrganizationApiKeyList.from_map() |> WorkOS.OrganizationApiKeyList.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.OrganizationApiKeyList.from_map() + |> WorkOS.OrganizationApiKeyList.to_map() == serialized + end + + test "OrganizationApiKeyWithValue round-trips between wire and struct" do + data = %{ + "object" => "api_key", + "id" => "id", + "owner" => %{"type" => "organization", "id" => "id"}, + "name" => "name", + "obfuscated_value" => "obfuscated_value", + "last_used_at" => "2024-01-01T00:00:00.000Z", + "expires_at" => "2024-01-01T00:00:00.000Z", + "permissions" => ["permissions"], + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z", + "value" => "value" + } + + serialized = + data + |> WorkOS.OrganizationApiKeyWithValue.from_map() + |> WorkOS.OrganizationApiKeyWithValue.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.OrganizationApiKeyWithValue.from_map() + |> WorkOS.OrganizationApiKeyWithValue.to_map() == serialized + end +end diff --git a/test/workos/api_keys_test.exs b/test/workos/api_keys_test.exs new file mode 100644 index 00000000..3698c76b --- /dev/null +++ b/test/workos/api_keys_test.exs @@ -0,0 +1,119 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ApiKeysTest do + use ExUnit.Case, async: true + + setup do + client = + WorkOS.Client.new( + api_key: "sk_test_key", + req_options: [plug: {Req.Test, WorkOS.Client}] + ) + + {:ok, client: client} + end + + test "list_organization_api_keys succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/organizations/test_organization_id/api_keys" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("api_keys/list_organization_api_keys")) + end) + + assert {:ok, %WorkOS.Page{data: [%WorkOS.OrganizationApiKeyList{object: "list"} | _]}} = + WorkOS.ApiKeys.list_organization_api_keys(client, "test_organization_id") + end + + test "list_organization_api_keys handles an empty page", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + Req.Test.json(conn, %{"data" => [], "list_metadata" => %{"after" => nil}}) + end) + + assert {:ok, %WorkOS.Page{data: []} = page} = + WorkOS.ApiKeys.list_organization_api_keys(client, "test_organization_id") + + refute WorkOS.Page.has_more?(page) + assert page |> WorkOS.Page.stream() |> Enum.to_list() == [] + end + + test "create_organization_api_key succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/organizations/test_organization_id/api_keys" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("api_keys/create_organization_api_key")) + end) + + assert {:ok, %WorkOS.OrganizationApiKeyWithValue{object: "api_key", id: "id"}} = + WorkOS.ApiKeys.create_organization_api_key(client, "test_organization_id") + end + + test "create_validation succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/api_keys/validations" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("api_keys/create_validation")) + end) + + assert {:ok, %WorkOS.ApiKeyValidationResponse{agent_registration_id: "agent_registration_id"}} = + WorkOS.ApiKeys.create_validation(client) + end + + test "delete_api_key succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "DELETE" + assert conn.request_path == "/api_keys/test_id" + Plug.Conn.send_resp(conn, 204, "") + end) + + assert {:ok, _} = WorkOS.ApiKeys.delete_api_key(client, "test_id") + end + + test "create_api_key_expire succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/api_keys/test_id/expire" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("api_keys/create_api_key_expire")) + end) + + assert {:ok, %WorkOS.ApiKey{object: "api_key", id: "id"}} = + WorkOS.ApiKeys.create_api_key_expire(client, "test_id") + end + + test "list_organization_api_keys encodes query parameters", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + params = Plug.Conn.fetch_query_params(conn).query_params + assert params["before"] == "hello world&x" + refute Map.has_key?(params, "after") + Req.Test.json(conn, %{"data" => [], "list_metadata" => %{"after" => nil}}) + end) + + assert {:ok, _} = + WorkOS.ApiKeys.list_organization_api_keys(client, "test_organization_id", %{ + before: "hello world&x" + }) + end + + test "list_organization_api_keys honors per-request options", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert Plug.Conn.get_req_header(conn, "x-custom") == ["value"] + assert conn.host == "override.example.com" + Plug.Conn.send_resp(conn, 204, "") + end) + + WorkOS.ApiKeys.list_organization_api_keys(client, "test_organization_id", %{}, + headers: [{"x-custom", "value"}], + base_url: "https://override.example.com" + ) + end + + test "surfaces API errors as tagged tuples", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + conn + |> Plug.Conn.put_status(401) + |> Req.Test.json(%{"message" => "Unauthorized"}) + end) + + assert {:error, %WorkOS.ApiError{status: 401}} = + WorkOS.ApiKeys.list_organization_api_keys(client, "test_organization_id") + end +end diff --git a/test/workos/audit_logs_round_trip_test.exs b/test/workos/audit_logs_round_trip_test.exs new file mode 100644 index 00000000..adfd19e3 --- /dev/null +++ b/test/workos/audit_logs_round_trip_test.exs @@ -0,0 +1,90 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuditLogsRoundTripTest do + use ExUnit.Case, async: true + + test "AuditLogAction round-trips between wire and struct" do + data = %{ + "object" => "audit_log_action", + "name" => "name", + "schema" => %{ + "object" => "audit_log_schema", + "version" => 1, + "actor" => %{"metadata" => %{}}, + "targets" => [%{"type" => "type", "metadata" => %{}}], + "metadata" => %{}, + "created_at" => "2024-01-01T00:00:00.000Z" + }, + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z" + } + + serialized = data |> WorkOS.AuditLogAction.from_map() |> WorkOS.AuditLogAction.to_map() + assert serialized == data + + assert serialized |> WorkOS.AuditLogAction.from_map() |> WorkOS.AuditLogAction.to_map() == + serialized + end + + test "AuditLogEventCreateResponse round-trips between wire and struct" do + data = %{"success" => true} + + serialized = + data + |> WorkOS.AuditLogEventCreateResponse.from_map() + |> WorkOS.AuditLogEventCreateResponse.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.AuditLogEventCreateResponse.from_map() + |> WorkOS.AuditLogEventCreateResponse.to_map() == serialized + end + + test "AuditLogExport round-trips between wire and struct" do + data = %{ + "object" => "audit_log_export", + "id" => "id", + "state" => "pending", + "url" => "url", + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z" + } + + serialized = data |> WorkOS.AuditLogExport.from_map() |> WorkOS.AuditLogExport.to_map() + assert serialized == data + + assert serialized |> WorkOS.AuditLogExport.from_map() |> WorkOS.AuditLogExport.to_map() == + serialized + end + + test "AuditLogSchema round-trips between wire and struct" do + data = %{ + "object" => "audit_log_schema", + "version" => 1, + "actor" => %{"metadata" => %{}}, + "targets" => [%{"type" => "type", "metadata" => %{}}], + "metadata" => %{}, + "created_at" => "2024-01-01T00:00:00.000Z" + } + + serialized = data |> WorkOS.AuditLogSchema.from_map() |> WorkOS.AuditLogSchema.to_map() + assert serialized == data + + assert serialized |> WorkOS.AuditLogSchema.from_map() |> WorkOS.AuditLogSchema.to_map() == + serialized + end + + test "AuditLogsRetention round-trips between wire and struct" do + data = %{"retention_period_in_days" => 1} + + serialized = + data |> WorkOS.AuditLogsRetention.from_map() |> WorkOS.AuditLogsRetention.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.AuditLogsRetention.from_map() + |> WorkOS.AuditLogsRetention.to_map() == serialized + end +end diff --git a/test/workos/audit_logs_test.exs b/test/workos/audit_logs_test.exs index 54d39dff..0b9abc8c 100644 --- a/test/workos/audit_logs_test.exs +++ b/test/workos/audit_logs_test.exs @@ -1,87 +1,172 @@ +# This file is auto-generated by oagen. Do not edit. + defmodule WorkOS.AuditLogsTest do - use WorkOS.TestCase - - alias WorkOS.AuditLogs.ClientMock - - setup :setup_env - - @event_mock %{ - "action" => "document.updated", - "occurred_at" => "2022-09-08T19:46:03.435Z", - "actor" => %{ - "id" => "user_1", - "name" => "Jon Smith", - "type" => "user" - }, - "targets" => [ - %{ - "id" => "document_39127", - "type" => "document" - } - ], - "context" => %{ - "location" => "192.0.0.8", - "user_agent" => "Firefox" - }, - "metadata" => %{ - "successful" => true - } - } - - describe "create_event" do - test "with an idempotency key, includes an idempotency key with request", context do - opts = [ - organization_id: "org_123", - event: @event_mock, - idempotency_key: "the-idempotency-key" - ] - - context |> ClientMock.create_event(assert_fields: opts) - - assert {:ok, %WorkOS.Empty{}} = WorkOS.AuditLogs.create_event(opts |> Enum.into(%{})) - end - - test "with a valid payload, creates an event", context do - opts = [ - organization_id: "org_123", - event: @event_mock - ] - - context |> ClientMock.create_event(assert_fields: opts) - - assert {:ok, %WorkOS.Empty{}} = WorkOS.AuditLogs.create_event(opts |> Enum.into(%{})) - end + use ExUnit.Case, async: true + + setup do + client = + WorkOS.Client.new( + api_key: "sk_test_key", + req_options: [plug: {Req.Test, WorkOS.Client}] + ) + + {:ok, client: client} + end + + test "get_organization_audit_logs_retention succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/organizations/test_id/audit_logs_retention" + + Req.Test.json( + conn, + WorkOS.TestFixtures.fixture("audit_logs/get_organization_audit_logs_retention") + ) + end) + + assert {:ok, %WorkOS.AuditLogsRetention{retention_period_in_days: 1}} = + WorkOS.AuditLogs.get_organization_audit_logs_retention(client, "test_id") + end + + test "update_organization_audit_logs_retention succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "PUT" + assert conn.request_path == "/organizations/test_id/audit_logs_retention" + + Req.Test.json( + conn, + WorkOS.TestFixtures.fixture("audit_logs/update_organization_audit_logs_retention") + ) + end) + + assert {:ok, %WorkOS.AuditLogsRetention{retention_period_in_days: 1}} = + WorkOS.AuditLogs.update_organization_audit_logs_retention(client, "test_id") end - describe "create_export" do - test "with valid payload, creates an audit log export", context do - opts = [ - organization_id: "org_01EHWNCE74X7JSDV0X3SZ3KJNY", - range_start: "2022-06-22T15:04:19.704Z", - range_end: "2022-08-22T15:04:19.704Z", - actions: ["user.signed_in"], - actors: ["Jon Smith"], - targets: ["team"] - ] - - context - |> ClientMock.create_export(assert_fields: opts) - - assert {:ok, %WorkOS.AuditLogs.Export{}} = - opts |> Map.new() |> WorkOS.AuditLogs.create_export() - end + test "list_actions succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/audit_logs/actions" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("audit_logs/list_actions")) + end) + + assert {:ok, + %WorkOS.Page{ + data: [%WorkOS.AuditLogAction{object: "audit_log_action", name: "name"} | _] + }} = WorkOS.AuditLogs.list_actions(client) end - describe "get_export" do - test "requests an audit log export", context do - opts = [audit_log_export_id: "audit_log_export_1234"] + test "list_actions handles an empty page", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + Req.Test.json(conn, %{"data" => [], "list_metadata" => %{"after" => nil}}) + end) - context |> ClientMock.get_export(assert_fields: opts) + assert {:ok, %WorkOS.Page{data: []} = page} = WorkOS.AuditLogs.list_actions(client) + refute WorkOS.Page.has_more?(page) + assert page |> WorkOS.Page.stream() |> Enum.to_list() == [] + end + + test "list_action_schemas succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/audit_logs/actions/test_action_name/schemas" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("audit_logs/list_action_schemas")) + end) + + assert {:ok, + %WorkOS.Page{ + data: [%WorkOS.AuditLogSchema{object: "audit_log_schema", version: 1} | _] + }} = WorkOS.AuditLogs.list_action_schemas(client, "test_action_name") + end + + test "list_action_schemas handles an empty page", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + Req.Test.json(conn, %{"data" => [], "list_metadata" => %{"after" => nil}}) + end) + + assert {:ok, %WorkOS.Page{data: []} = page} = + WorkOS.AuditLogs.list_action_schemas(client, "test_action_name") + + refute WorkOS.Page.has_more?(page) + assert page |> WorkOS.Page.stream() |> Enum.to_list() == [] + end + + test "create_schema succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/audit_logs/actions/test_action_name/schemas" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("audit_logs/create_schema")) + end) + + assert {:ok, %WorkOS.AuditLogSchema{object: "audit_log_schema", version: 1}} = + WorkOS.AuditLogs.create_schema(client, "test_action_name") + end + + test "create_event succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/audit_logs/events" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("audit_logs/create_event")) + end) + + assert {:ok, %WorkOS.AuditLogEventCreateResponse{success: true}} = + WorkOS.AuditLogs.create_event(client) + end + + test "create_export succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/audit_logs/exports" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("audit_logs/create_export")) + end) + + assert {:ok, %WorkOS.AuditLogExport{object: "audit_log_export", id: "id"}} = + WorkOS.AuditLogs.create_export(client) + end + + test "get_export succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/audit_logs/exports/test_audit_log_export_id" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("audit_logs/get_export")) + end) + + assert {:ok, %WorkOS.AuditLogExport{object: "audit_log_export", id: "id"}} = + WorkOS.AuditLogs.get_export(client, "test_audit_log_export_id") + end + + test "list_actions encodes query parameters", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + params = Plug.Conn.fetch_query_params(conn).query_params + assert params["before"] == "hello world&x" + refute Map.has_key?(params, "after") + Req.Test.json(conn, %{"data" => [], "list_metadata" => %{"after" => nil}}) + end) + + assert {:ok, _} = WorkOS.AuditLogs.list_actions(client, %{before: "hello world&x"}) + end + + test "get_organization_audit_logs_retention honors per-request options", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert Plug.Conn.get_req_header(conn, "x-custom") == ["value"] + assert conn.host == "override.example.com" + Plug.Conn.send_resp(conn, 204, "") + end) + + WorkOS.AuditLogs.get_organization_audit_logs_retention(client, "test_id", + headers: [{"x-custom", "value"}], + base_url: "https://override.example.com" + ) + end - assert {:ok, %WorkOS.AuditLogs.Export{id: id}} = - WorkOS.AuditLogs.get_export(opts |> Keyword.get(:audit_log_export_id)) + test "surfaces API errors as tagged tuples", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + conn + |> Plug.Conn.put_status(401) + |> Req.Test.json(%{"message" => "Unauthorized"}) + end) - refute is_nil(id) - end + assert {:error, %WorkOS.ApiError{status: 401}} = + WorkOS.AuditLogs.get_organization_audit_logs_retention(client, "test_id") end end diff --git a/test/workos/authkit_test.exs b/test/workos/authkit_test.exs new file mode 100644 index 00000000..a3ebedba --- /dev/null +++ b/test/workos/authkit_test.exs @@ -0,0 +1,121 @@ +# @oagen-ignore-file — hand-maintained tests for AuthKit flow helpers. + +defmodule WorkOS.AuthKitTest do + use ExUnit.Case, async: true + + setup do + client = + WorkOS.Client.new( + api_key: "sk_test_key", + client_id: "client_123", + req_options: [plug: {Req.Test, WorkOS.Client}] + ) + + {:ok, client: client} + end + + test "get_authorization_url builds an AuthKit URL", %{client: client} do + url = WorkOS.AuthKit.get_authorization_url(client, %{redirect_uri: "https://example.com/cb"}) + + assert url =~ "/user_management/authorize" + assert url =~ "client_id=client_123" + assert url =~ "response_type=code" + assert url =~ URI.encode_www_form("https://example.com/cb") + end + + test "get_pkce_authorization_url generates PKCE and state automatically", %{client: client} do + result = + WorkOS.AuthKit.get_pkce_authorization_url(client, %{redirect_uri: "https://example.com/cb"}) + + assert %{url: url, code_verifier: verifier, state: state} = result + assert is_binary(verifier) and byte_size(verifier) >= 43 + assert is_binary(state) and state != "" + + expected_challenge = WorkOS.PKCE.generate_code_challenge(verifier) + query = url |> URI.parse() |> Map.fetch!(:query) |> URI.decode_query() + + assert query["code_challenge"] == expected_challenge + assert query["code_challenge_method"] == "S256" + assert query["state"] == state + end + + test "get_pkce_authorization_url keeps a caller-provided state", %{client: client} do + result = WorkOS.AuthKit.get_pkce_authorization_url(client, %{state: "my-state"}) + + assert result.state == "my-state" + assert result.url =~ "state=my-state" + end + + test "pkce_code_exchange sends code and code_verifier", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.request_path == "/user_management/authenticate" + + {:ok, req_body, conn} = Plug.Conn.read_body(conn) + req_body = JSON.decode!(req_body) + assert req_body["grant_type"] == "authorization_code" + assert req_body["code"] == "code_123" + assert req_body["code_verifier"] == "verifier_123" + assert req_body["client_id"] == "client_123" + + Req.Test.json(conn, WorkOS.TestFixtures.fixture("user_management/authenticate_with_code")) + end) + + assert {:ok, %WorkOS.AuthenticateResponse{}} = + WorkOS.AuthKit.pkce_code_exchange(client, %{ + code: "code_123", + code_verifier: "verifier_123" + }) + end + + test "start_device_authorization injects the configured client_id", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.request_path == "/user_management/authorize/device" + + {:ok, req_body, conn} = Plug.Conn.read_body(conn) + assert JSON.decode!(req_body)["client_id"] == "client_123" + + Req.Test.json(conn, %{ + "device_code" => "device_code_123", + "user_code" => "ABCD-1234", + "verification_uri" => "https://auth.workos.com/device", + "verification_uri_complete" => "https://auth.workos.com/device?user_code=ABCD-1234", + "expires_in" => 300, + "interval" => 5 + }) + end) + + assert {:ok, %WorkOS.DeviceAuthorizationResponse{device_code: "device_code_123"}} = + WorkOS.AuthKit.start_device_authorization(client) + end + + test "poll_device_code returns once authorization completes", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + {:ok, req_body, conn} = Plug.Conn.read_body(conn) + req_body = JSON.decode!(req_body) + assert req_body["grant_type"] == "urn:ietf:params:oauth:grant-type:device_code" + assert req_body["device_code"] == "device_code_123" + + Req.Test.json( + conn, + WorkOS.TestFixtures.fixture("user_management/authenticate_with_device_code") + ) + end) + + assert {:ok, %WorkOS.AuthenticateResponse{}} = + WorkOS.AuthKit.poll_device_code(client, "device_code_123", interval: 0) + end + + test "poll_device_code keeps polling while authorization is pending", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + conn + |> Plug.Conn.put_status(400) + |> Req.Test.json(%{"code" => "authorization_pending", "message" => "Pending"}) + end) + + assert {:error, %WorkOS.ApiError{code: "authorization_pending"}} = + WorkOS.AuthKit.poll_device_code(client, "device_code_123", + interval: 0, + max_attempts: 3 + ) + end +end diff --git a/test/workos/authorization_round_trip_test.exs b/test/workos/authorization_round_trip_test.exs new file mode 100644 index 00000000..ec5b98fe --- /dev/null +++ b/test/workos/authorization_round_trip_test.exs @@ -0,0 +1,357 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthorizationRoundTripTest do + use ExUnit.Case, async: true + + test "AuthorizationCheck round-trips between wire and struct" do + data = %{"authorized" => true} + + serialized = + data |> WorkOS.AuthorizationCheck.from_map() |> WorkOS.AuthorizationCheck.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.AuthorizationCheck.from_map() + |> WorkOS.AuthorizationCheck.to_map() == serialized + end + + test "AuthorizationPermission round-trips between wire and struct" do + data = %{ + "object" => "permission", + "id" => "id", + "slug" => "slug", + "name" => "name", + "description" => "description", + "system" => true, + "resource_type_slug" => "resource_type_slug", + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z" + } + + serialized = + data |> WorkOS.AuthorizationPermission.from_map() |> WorkOS.AuthorizationPermission.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.AuthorizationPermission.from_map() + |> WorkOS.AuthorizationPermission.to_map() == serialized + end + + test "AuthorizationPermissionList round-trips between wire and struct" do + data = %{ + "object" => "list", + "data" => [ + %{ + "object" => "permission", + "id" => "id", + "slug" => "slug", + "name" => "name", + "description" => "description", + "system" => true, + "resource_type_slug" => "resource_type_slug", + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z" + } + ], + "list_metadata" => %{"before" => "before", "after" => "after"} + } + + serialized = + data + |> WorkOS.AuthorizationPermissionList.from_map() + |> WorkOS.AuthorizationPermissionList.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.AuthorizationPermissionList.from_map() + |> WorkOS.AuthorizationPermissionList.to_map() == serialized + end + + test "AuthorizationResource round-trips between wire and struct" do + data = %{ + "object" => "authorization_resource", + "name" => "name", + "description" => "description", + "organization_id" => "organization_id", + "parent_resource_id" => "parent_resource_id", + "id" => "id", + "external_id" => "external_id", + "resource_type_slug" => "resource_type_slug", + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z" + } + + serialized = + data |> WorkOS.AuthorizationResource.from_map() |> WorkOS.AuthorizationResource.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.AuthorizationResource.from_map() + |> WorkOS.AuthorizationResource.to_map() == serialized + end + + test "AuthorizationResourceList round-trips between wire and struct" do + data = %{ + "object" => "list", + "data" => [ + %{ + "object" => "authorization_resource", + "name" => "name", + "description" => "description", + "organization_id" => "organization_id", + "parent_resource_id" => "parent_resource_id", + "id" => "id", + "external_id" => "external_id", + "resource_type_slug" => "resource_type_slug", + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z" + } + ], + "list_metadata" => %{"before" => "before", "after" => "after"} + } + + serialized = + data + |> WorkOS.AuthorizationResourceList.from_map() + |> WorkOS.AuthorizationResourceList.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.AuthorizationResourceList.from_map() + |> WorkOS.AuthorizationResourceList.to_map() == serialized + end + + test "GroupRoleAssignment round-trips between wire and struct" do + data = %{ + "object" => "group_role_assignment", + "id" => "id", + "group_id" => "group_id", + "role" => %{"slug" => "slug"}, + "resource" => %{ + "id" => "id", + "external_id" => "external_id", + "resource_type_slug" => "resource_type_slug" + }, + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z" + } + + serialized = + data |> WorkOS.GroupRoleAssignment.from_map() |> WorkOS.GroupRoleAssignment.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.GroupRoleAssignment.from_map() + |> WorkOS.GroupRoleAssignment.to_map() == serialized + end + + test "GroupRoleAssignmentList round-trips between wire and struct" do + data = %{ + "object" => "list", + "data" => [ + %{ + "object" => "group_role_assignment", + "id" => "id", + "group_id" => "group_id", + "role" => %{"slug" => "slug"}, + "resource" => %{ + "id" => "id", + "external_id" => "external_id", + "resource_type_slug" => "resource_type_slug" + }, + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z" + } + ], + "list_metadata" => %{"after" => "after", "before" => "before"} + } + + serialized = + data |> WorkOS.GroupRoleAssignmentList.from_map() |> WorkOS.GroupRoleAssignmentList.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.GroupRoleAssignmentList.from_map() + |> WorkOS.GroupRoleAssignmentList.to_map() == serialized + end + + test "Permission round-trips between wire and struct" do + data = %{ + "object" => "permission", + "id" => "id", + "slug" => "slug", + "name" => "name", + "description" => "description", + "system" => true, + "resource_type_slug" => "resource_type_slug", + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z" + } + + serialized = data |> WorkOS.Permission.from_map() |> WorkOS.Permission.to_map() + assert serialized == data + + assert serialized |> WorkOS.Permission.from_map() |> WorkOS.Permission.to_map() == serialized + end + + test "Role round-trips between wire and struct" do + data = %{ + "slug" => "slug", + "object" => "role", + "id" => "id", + "name" => "name", + "description" => "description", + "type" => "EnvironmentRole", + "resource_type_slug" => "resource_type_slug", + "permissions" => ["permissions"], + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z" + } + + serialized = data |> WorkOS.Role.from_map() |> WorkOS.Role.to_map() + assert serialized == data + + assert serialized |> WorkOS.Role.from_map() |> WorkOS.Role.to_map() == serialized + end + + test "RoleList round-trips between wire and struct" do + data = %{ + "object" => "list", + "data" => [ + %{ + "slug" => "slug", + "object" => "role", + "id" => "id", + "name" => "name", + "description" => "description", + "type" => "EnvironmentRole", + "resource_type_slug" => "resource_type_slug", + "permissions" => ["permissions"], + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z" + } + ] + } + + serialized = data |> WorkOS.RoleList.from_map() |> WorkOS.RoleList.to_map() + assert serialized == data + + assert serialized |> WorkOS.RoleList.from_map() |> WorkOS.RoleList.to_map() == serialized + end + + test "UserOrganizationMembershipBaseList round-trips between wire and struct" do + data = %{ + "object" => "list", + "data" => [ + %{ + "object" => "organization_membership", + "id" => "id", + "user_id" => "user_id", + "organization_id" => "organization_id", + "status" => "active", + "directory_managed" => true, + "organization_name" => "organization_name", + "custom_attributes" => %{}, + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z", + "user" => %{ + "object" => "user", + "id" => "id", + "first_name" => "first_name", + "last_name" => "last_name", + "name" => "name", + "profile_picture_url" => "profile_picture_url", + "email" => "email", + "email_verified" => true, + "external_id" => "external_id", + "metadata" => %{}, + "last_sign_in_at" => "2024-01-01T00:00:00.000Z", + "locale" => "locale", + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z" + } + } + ], + "list_metadata" => %{"before" => "before", "after" => "after"} + } + + serialized = + data + |> WorkOS.UserOrganizationMembershipBaseList.from_map() + |> WorkOS.UserOrganizationMembershipBaseList.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.UserOrganizationMembershipBaseList.from_map() + |> WorkOS.UserOrganizationMembershipBaseList.to_map() == serialized + end + + test "UserRoleAssignment round-trips between wire and struct" do + data = %{ + "object" => "role_assignment", + "id" => "id", + "organization_membership_id" => "organization_membership_id", + "role" => %{"slug" => "slug"}, + "resource" => %{ + "id" => "id", + "external_id" => "external_id", + "resource_type_slug" => "resource_type_slug" + }, + "source" => %{"type" => "direct", "group_role_assignment_id" => "group_role_assignment_id"}, + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z" + } + + serialized = + data |> WorkOS.UserRoleAssignment.from_map() |> WorkOS.UserRoleAssignment.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.UserRoleAssignment.from_map() + |> WorkOS.UserRoleAssignment.to_map() == serialized + end + + test "UserRoleAssignmentList round-trips between wire and struct" do + data = %{ + "object" => "list", + "data" => [ + %{ + "object" => "role_assignment", + "id" => "id", + "organization_membership_id" => "organization_membership_id", + "role" => %{"slug" => "slug"}, + "resource" => %{ + "id" => "id", + "external_id" => "external_id", + "resource_type_slug" => "resource_type_slug" + }, + "source" => %{ + "type" => "direct", + "group_role_assignment_id" => "group_role_assignment_id" + }, + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z" + } + ], + "list_metadata" => %{"before" => "before", "after" => "after"} + } + + serialized = + data |> WorkOS.UserRoleAssignmentList.from_map() |> WorkOS.UserRoleAssignmentList.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.UserRoleAssignmentList.from_map() + |> WorkOS.UserRoleAssignmentList.to_map() == serialized + end +end diff --git a/test/workos/authorization_test.exs b/test/workos/authorization_test.exs new file mode 100644 index 00000000..33d734e2 --- /dev/null +++ b/test/workos/authorization_test.exs @@ -0,0 +1,894 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.AuthorizationTest do + use ExUnit.Case, async: true + + setup do + client = + WorkOS.Client.new( + api_key: "sk_test_key", + req_options: [plug: {Req.Test, WorkOS.Client}] + ) + + {:ok, client: client} + end + + test "list_group_role_assignments succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/authorization/groups/test_group_id/role_assignments" + + Req.Test.json( + conn, + WorkOS.TestFixtures.fixture("authorization/list_group_role_assignments") + ) + end) + + assert {:ok, %WorkOS.Page{data: [%WorkOS.GroupRoleAssignmentList{object: "list"} | _]}} = + WorkOS.Authorization.list_group_role_assignments(client, "test_group_id") + end + + test "list_group_role_assignments handles an empty page", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + Req.Test.json(conn, %{"data" => [], "list_metadata" => %{"after" => nil}}) + end) + + assert {:ok, %WorkOS.Page{data: []} = page} = + WorkOS.Authorization.list_group_role_assignments(client, "test_group_id") + + refute WorkOS.Page.has_more?(page) + assert page |> WorkOS.Page.stream() |> Enum.to_list() == [] + end + + test "create_group_role_assignment succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/authorization/groups/test_group_id/role_assignments" + + Req.Test.json( + conn, + WorkOS.TestFixtures.fixture("authorization/create_group_role_assignment") + ) + end) + + assert {:ok, %WorkOS.GroupRoleAssignment{object: "group_role_assignment", id: "id"}} = + WorkOS.Authorization.create_group_role_assignment(client, "test_group_id") + end + + test "update_group_role_assignments succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "PUT" + assert conn.request_path == "/authorization/groups/test_group_id/role_assignments" + + Req.Test.json( + conn, + WorkOS.TestFixtures.fixture("authorization/update_group_role_assignments") + ) + end) + + assert {:ok, %WorkOS.GroupRoleAssignmentList{object: "list"}} = + WorkOS.Authorization.update_group_role_assignments(client, "test_group_id") + end + + test "delete_group_role_assignments succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "DELETE" + assert conn.request_path == "/authorization/groups/test_group_id/role_assignments" + Plug.Conn.send_resp(conn, 204, "") + end) + + assert {:ok, _} = WorkOS.Authorization.delete_group_role_assignments(client, "test_group_id") + end + + test "get_group_role_assignment succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + + assert conn.request_path == + "/authorization/groups/test_group_id/role_assignments/test_role_assignment_id" + + Req.Test.json(conn, WorkOS.TestFixtures.fixture("authorization/get_group_role_assignment")) + end) + + assert {:ok, %WorkOS.GroupRoleAssignment{object: "group_role_assignment", id: "id"}} = + WorkOS.Authorization.get_group_role_assignment( + client, + "test_group_id", + "test_role_assignment_id" + ) + end + + test "delete_group_role_assignment succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "DELETE" + + assert conn.request_path == + "/authorization/groups/test_group_id/role_assignments/test_role_assignment_id" + + Plug.Conn.send_resp(conn, 204, "") + end) + + assert {:ok, _} = + WorkOS.Authorization.delete_group_role_assignment( + client, + "test_group_id", + "test_role_assignment_id" + ) + end + + test "check succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + + assert conn.request_path == + "/authorization/organization_memberships/test_organization_membership_id/check" + + Req.Test.json(conn, WorkOS.TestFixtures.fixture("authorization/check")) + end) + + assert {:ok, %WorkOS.AuthorizationCheck{authorized: true}} = + WorkOS.Authorization.check(client, "test_organization_membership_id") + end + + test "list_resources_for_membership succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + + assert conn.request_path == + "/authorization/organization_memberships/test_organization_membership_id/resources" + + Req.Test.json( + conn, + WorkOS.TestFixtures.fixture("authorization/list_resources_for_membership") + ) + end) + + assert {:ok, %WorkOS.Page{data: [%WorkOS.AuthorizationResourceList{object: "list"} | _]}} = + WorkOS.Authorization.list_resources_for_membership( + client, + "test_organization_membership_id" + ) + end + + test "list_resources_for_membership handles an empty page", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + Req.Test.json(conn, %{"data" => [], "list_metadata" => %{"after" => nil}}) + end) + + assert {:ok, %WorkOS.Page{data: []} = page} = + WorkOS.Authorization.list_resources_for_membership( + client, + "test_organization_membership_id" + ) + + refute WorkOS.Page.has_more?(page) + assert page |> WorkOS.Page.stream() |> Enum.to_list() == [] + end + + test "list_effective_permissions succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + + assert conn.request_path == + "/authorization/organization_memberships/test_organization_membership_id/resources/test_resource_id/permissions" + + Req.Test.json(conn, WorkOS.TestFixtures.fixture("authorization/list_effective_permissions")) + end) + + assert {:ok, %WorkOS.Page{data: [%WorkOS.AuthorizationPermissionList{object: "list"} | _]}} = + WorkOS.Authorization.list_effective_permissions( + client, + "test_organization_membership_id", + "test_resource_id" + ) + end + + test "list_effective_permissions handles an empty page", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + Req.Test.json(conn, %{"data" => [], "list_metadata" => %{"after" => nil}}) + end) + + assert {:ok, %WorkOS.Page{data: []} = page} = + WorkOS.Authorization.list_effective_permissions( + client, + "test_organization_membership_id", + "test_resource_id" + ) + + refute WorkOS.Page.has_more?(page) + assert page |> WorkOS.Page.stream() |> Enum.to_list() == [] + end + + test "list_effective_permissions_by_external_id succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + + assert conn.request_path == + "/authorization/organization_memberships/test_organization_membership_id/resources/test_resource_type_slug/test_external_id/permissions" + + Req.Test.json( + conn, + WorkOS.TestFixtures.fixture("authorization/list_effective_permissions_by_external_id") + ) + end) + + assert {:ok, %WorkOS.Page{data: [%WorkOS.AuthorizationPermissionList{object: "list"} | _]}} = + WorkOS.Authorization.list_effective_permissions_by_external_id( + client, + "test_organization_membership_id", + "test_resource_type_slug", + "test_external_id" + ) + end + + test "list_effective_permissions_by_external_id handles an empty page", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + Req.Test.json(conn, %{"data" => [], "list_metadata" => %{"after" => nil}}) + end) + + assert {:ok, %WorkOS.Page{data: []} = page} = + WorkOS.Authorization.list_effective_permissions_by_external_id( + client, + "test_organization_membership_id", + "test_resource_type_slug", + "test_external_id" + ) + + refute WorkOS.Page.has_more?(page) + assert page |> WorkOS.Page.stream() |> Enum.to_list() == [] + end + + test "list_role_assignments succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + + assert conn.request_path == + "/authorization/organization_memberships/test_organization_membership_id/role_assignments" + + Req.Test.json(conn, WorkOS.TestFixtures.fixture("authorization/list_role_assignments")) + end) + + assert {:ok, %WorkOS.Page{data: [%WorkOS.UserRoleAssignmentList{object: "list"} | _]}} = + WorkOS.Authorization.list_role_assignments(client, "test_organization_membership_id") + end + + test "list_role_assignments handles an empty page", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + Req.Test.json(conn, %{"data" => [], "list_metadata" => %{"after" => nil}}) + end) + + assert {:ok, %WorkOS.Page{data: []} = page} = + WorkOS.Authorization.list_role_assignments(client, "test_organization_membership_id") + + refute WorkOS.Page.has_more?(page) + assert page |> WorkOS.Page.stream() |> Enum.to_list() == [] + end + + test "assign_role succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + + assert conn.request_path == + "/authorization/organization_memberships/test_organization_membership_id/role_assignments" + + Req.Test.json(conn, WorkOS.TestFixtures.fixture("authorization/assign_role")) + end) + + assert {:ok, %WorkOS.UserRoleAssignment{object: "role_assignment", id: "id"}} = + WorkOS.Authorization.assign_role(client, "test_organization_membership_id") + end + + test "remove_role succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "DELETE" + + assert conn.request_path == + "/authorization/organization_memberships/test_organization_membership_id/role_assignments" + + Plug.Conn.send_resp(conn, 204, "") + end) + + assert {:ok, _} = WorkOS.Authorization.remove_role(client, "test_organization_membership_id") + end + + test "remove_role_assignment succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "DELETE" + + assert conn.request_path == + "/authorization/organization_memberships/test_organization_membership_id/role_assignments/test_role_assignment_id" + + Plug.Conn.send_resp(conn, 204, "") + end) + + assert {:ok, _} = + WorkOS.Authorization.remove_role_assignment( + client, + "test_organization_membership_id", + "test_role_assignment_id" + ) + end + + test "list_organization_roles succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/authorization/organizations/test_organization_id/roles" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("authorization/list_organization_roles")) + end) + + assert {:ok, %WorkOS.RoleList{object: "list"}} = + WorkOS.Authorization.list_organization_roles(client, "test_organization_id") + end + + test "create_organization_role succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/authorization/organizations/test_organization_id/roles" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("authorization/create_organization_role")) + end) + + assert {:ok, %WorkOS.Role{slug: "slug", object: "role"}} = + WorkOS.Authorization.create_organization_role(client, "test_organization_id") + end + + test "get_organization_role succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + + assert conn.request_path == + "/authorization/organizations/test_organization_id/roles/test_slug" + + Req.Test.json(conn, WorkOS.TestFixtures.fixture("authorization/get_organization_role")) + end) + + assert {:ok, %WorkOS.Role{slug: "slug", object: "role"}} = + WorkOS.Authorization.get_organization_role( + client, + "test_organization_id", + "test_slug" + ) + end + + test "update_organization_role succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "PATCH" + + assert conn.request_path == + "/authorization/organizations/test_organization_id/roles/test_slug" + + Req.Test.json(conn, WorkOS.TestFixtures.fixture("authorization/update_organization_role")) + end) + + assert {:ok, %WorkOS.Role{slug: "slug", object: "role"}} = + WorkOS.Authorization.update_organization_role( + client, + "test_organization_id", + "test_slug" + ) + end + + test "delete_organization_role succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "DELETE" + + assert conn.request_path == + "/authorization/organizations/test_organization_id/roles/test_slug" + + Plug.Conn.send_resp(conn, 204, "") + end) + + assert {:ok, _} = + WorkOS.Authorization.delete_organization_role( + client, + "test_organization_id", + "test_slug" + ) + end + + test "add_organization_role_permission succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + + assert conn.request_path == + "/authorization/organizations/test_organization_id/roles/test_slug/permissions" + + Req.Test.json( + conn, + WorkOS.TestFixtures.fixture("authorization/add_organization_role_permission") + ) + end) + + assert {:ok, %WorkOS.Role{slug: "slug", object: "role"}} = + WorkOS.Authorization.add_organization_role_permission( + client, + "test_organization_id", + "test_slug" + ) + end + + test "set_organization_role_permissions succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "PUT" + + assert conn.request_path == + "/authorization/organizations/test_organization_id/roles/test_slug/permissions" + + Req.Test.json( + conn, + WorkOS.TestFixtures.fixture("authorization/set_organization_role_permissions") + ) + end) + + assert {:ok, %WorkOS.Role{slug: "slug", object: "role"}} = + WorkOS.Authorization.set_organization_role_permissions( + client, + "test_organization_id", + "test_slug" + ) + end + + test "remove_organization_role_permission succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "DELETE" + + assert conn.request_path == + "/authorization/organizations/test_organization_id/roles/test_slug/permissions/test_permission_slug" + + Req.Test.json( + conn, + WorkOS.TestFixtures.fixture("authorization/remove_organization_role_permission") + ) + end) + + assert {:ok, %WorkOS.Role{slug: "slug", object: "role"}} = + WorkOS.Authorization.remove_organization_role_permission( + client, + "test_organization_id", + "test_slug", + "test_permission_slug" + ) + end + + test "get_resource_by_external_id succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + + assert conn.request_path == + "/authorization/organizations/test_organization_id/resources/test_resource_type_slug/test_external_id" + + Req.Test.json( + conn, + WorkOS.TestFixtures.fixture("authorization/get_resource_by_external_id") + ) + end) + + assert {:ok, %WorkOS.AuthorizationResource{object: "authorization_resource", name: "name"}} = + WorkOS.Authorization.get_resource_by_external_id( + client, + "test_organization_id", + "test_resource_type_slug", + "test_external_id" + ) + end + + test "update_resource_by_external_id succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "PATCH" + + assert conn.request_path == + "/authorization/organizations/test_organization_id/resources/test_resource_type_slug/test_external_id" + + Req.Test.json( + conn, + WorkOS.TestFixtures.fixture("authorization/update_resource_by_external_id") + ) + end) + + assert {:ok, %WorkOS.AuthorizationResource{object: "authorization_resource", name: "name"}} = + WorkOS.Authorization.update_resource_by_external_id( + client, + "test_organization_id", + "test_resource_type_slug", + "test_external_id" + ) + end + + test "delete_resource_by_external_id succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "DELETE" + + assert conn.request_path == + "/authorization/organizations/test_organization_id/resources/test_resource_type_slug/test_external_id" + + Plug.Conn.send_resp(conn, 204, "") + end) + + assert {:ok, _} = + WorkOS.Authorization.delete_resource_by_external_id( + client, + "test_organization_id", + "test_resource_type_slug", + "test_external_id" + ) + end + + test "list_memberships_for_resource_by_external_id succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + + assert conn.request_path == + "/authorization/organizations/test_organization_id/resources/test_resource_type_slug/test_external_id/organization_memberships" + + Req.Test.json( + conn, + WorkOS.TestFixtures.fixture("authorization/list_memberships_for_resource_by_external_id") + ) + end) + + assert {:ok, + %WorkOS.Page{data: [%WorkOS.UserOrganizationMembershipBaseList{object: "list"} | _]}} = + WorkOS.Authorization.list_memberships_for_resource_by_external_id( + client, + "test_organization_id", + "test_resource_type_slug", + "test_external_id" + ) + end + + test "list_memberships_for_resource_by_external_id handles an empty page", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + Req.Test.json(conn, %{"data" => [], "list_metadata" => %{"after" => nil}}) + end) + + assert {:ok, %WorkOS.Page{data: []} = page} = + WorkOS.Authorization.list_memberships_for_resource_by_external_id( + client, + "test_organization_id", + "test_resource_type_slug", + "test_external_id" + ) + + refute WorkOS.Page.has_more?(page) + assert page |> WorkOS.Page.stream() |> Enum.to_list() == [] + end + + test "list_role_assignments_for_resource_by_external_id succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + + assert conn.request_path == + "/authorization/organizations/test_organization_id/resources/test_resource_type_slug/test_external_id/role_assignments" + + Req.Test.json( + conn, + WorkOS.TestFixtures.fixture( + "authorization/list_role_assignments_for_resource_by_external_id" + ) + ) + end) + + assert {:ok, %WorkOS.Page{data: [%WorkOS.UserRoleAssignmentList{object: "list"} | _]}} = + WorkOS.Authorization.list_role_assignments_for_resource_by_external_id( + client, + "test_organization_id", + "test_resource_type_slug", + "test_external_id" + ) + end + + test "list_role_assignments_for_resource_by_external_id handles an empty page", %{ + client: client + } do + Req.Test.stub(WorkOS.Client, fn conn -> + Req.Test.json(conn, %{"data" => [], "list_metadata" => %{"after" => nil}}) + end) + + assert {:ok, %WorkOS.Page{data: []} = page} = + WorkOS.Authorization.list_role_assignments_for_resource_by_external_id( + client, + "test_organization_id", + "test_resource_type_slug", + "test_external_id" + ) + + refute WorkOS.Page.has_more?(page) + assert page |> WorkOS.Page.stream() |> Enum.to_list() == [] + end + + test "list_resources succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/authorization/resources" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("authorization/list_resources")) + end) + + assert {:ok, %WorkOS.Page{data: [%WorkOS.AuthorizationResourceList{object: "list"} | _]}} = + WorkOS.Authorization.list_resources(client) + end + + test "list_resources handles an empty page", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + Req.Test.json(conn, %{"data" => [], "list_metadata" => %{"after" => nil}}) + end) + + assert {:ok, %WorkOS.Page{data: []} = page} = WorkOS.Authorization.list_resources(client) + refute WorkOS.Page.has_more?(page) + assert page |> WorkOS.Page.stream() |> Enum.to_list() == [] + end + + test "create_resource succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/authorization/resources" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("authorization/create_resource")) + end) + + assert {:ok, %WorkOS.AuthorizationResource{object: "authorization_resource", name: "name"}} = + WorkOS.Authorization.create_resource(client) + end + + test "get_resource succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/authorization/resources/test_resource_id" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("authorization/get_resource")) + end) + + assert {:ok, %WorkOS.AuthorizationResource{object: "authorization_resource", name: "name"}} = + WorkOS.Authorization.get_resource(client, "test_resource_id") + end + + test "update_resource succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "PATCH" + assert conn.request_path == "/authorization/resources/test_resource_id" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("authorization/update_resource")) + end) + + assert {:ok, %WorkOS.AuthorizationResource{object: "authorization_resource", name: "name"}} = + WorkOS.Authorization.update_resource(client, "test_resource_id") + end + + test "delete_resource succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "DELETE" + assert conn.request_path == "/authorization/resources/test_resource_id" + Plug.Conn.send_resp(conn, 204, "") + end) + + assert {:ok, _} = WorkOS.Authorization.delete_resource(client, "test_resource_id") + end + + test "list_memberships_for_resource succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + + assert conn.request_path == + "/authorization/resources/test_resource_id/organization_memberships" + + Req.Test.json( + conn, + WorkOS.TestFixtures.fixture("authorization/list_memberships_for_resource") + ) + end) + + assert {:ok, + %WorkOS.Page{data: [%WorkOS.UserOrganizationMembershipBaseList{object: "list"} | _]}} = + WorkOS.Authorization.list_memberships_for_resource(client, "test_resource_id") + end + + test "list_memberships_for_resource handles an empty page", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + Req.Test.json(conn, %{"data" => [], "list_metadata" => %{"after" => nil}}) + end) + + assert {:ok, %WorkOS.Page{data: []} = page} = + WorkOS.Authorization.list_memberships_for_resource(client, "test_resource_id") + + refute WorkOS.Page.has_more?(page) + assert page |> WorkOS.Page.stream() |> Enum.to_list() == [] + end + + test "list_role_assignments_for_resource succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/authorization/resources/test_resource_id/role_assignments" + + Req.Test.json( + conn, + WorkOS.TestFixtures.fixture("authorization/list_role_assignments_for_resource") + ) + end) + + assert {:ok, %WorkOS.Page{data: [%WorkOS.UserRoleAssignmentList{object: "list"} | _]}} = + WorkOS.Authorization.list_role_assignments_for_resource(client, "test_resource_id") + end + + test "list_role_assignments_for_resource handles an empty page", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + Req.Test.json(conn, %{"data" => [], "list_metadata" => %{"after" => nil}}) + end) + + assert {:ok, %WorkOS.Page{data: []} = page} = + WorkOS.Authorization.list_role_assignments_for_resource(client, "test_resource_id") + + refute WorkOS.Page.has_more?(page) + assert page |> WorkOS.Page.stream() |> Enum.to_list() == [] + end + + test "list_environment_roles succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/authorization/roles" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("authorization/list_environment_roles")) + end) + + assert {:ok, %WorkOS.RoleList{object: "list"}} = + WorkOS.Authorization.list_environment_roles(client) + end + + test "create_environment_role succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/authorization/roles" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("authorization/create_environment_role")) + end) + + assert {:ok, %WorkOS.Role{slug: "slug", object: "role"}} = + WorkOS.Authorization.create_environment_role(client) + end + + test "get_environment_role succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/authorization/roles/test_slug" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("authorization/get_environment_role")) + end) + + assert {:ok, %WorkOS.Role{slug: "slug", object: "role"}} = + WorkOS.Authorization.get_environment_role(client, "test_slug") + end + + test "update_environment_role succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "PATCH" + assert conn.request_path == "/authorization/roles/test_slug" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("authorization/update_environment_role")) + end) + + assert {:ok, %WorkOS.Role{slug: "slug", object: "role"}} = + WorkOS.Authorization.update_environment_role(client, "test_slug") + end + + test "add_environment_role_permission succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/authorization/roles/test_slug/permissions" + + Req.Test.json( + conn, + WorkOS.TestFixtures.fixture("authorization/add_environment_role_permission") + ) + end) + + assert {:ok, %WorkOS.Role{slug: "slug", object: "role"}} = + WorkOS.Authorization.add_environment_role_permission(client, "test_slug") + end + + test "set_environment_role_permissions succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "PUT" + assert conn.request_path == "/authorization/roles/test_slug/permissions" + + Req.Test.json( + conn, + WorkOS.TestFixtures.fixture("authorization/set_environment_role_permissions") + ) + end) + + assert {:ok, %WorkOS.Role{slug: "slug", object: "role"}} = + WorkOS.Authorization.set_environment_role_permissions(client, "test_slug") + end + + test "list_permissions succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/authorization/permissions" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("authorization/list_permissions")) + end) + + assert {:ok, %WorkOS.Page{data: [%WorkOS.AuthorizationPermissionList{object: "list"} | _]}} = + WorkOS.Authorization.list_permissions(client) + end + + test "list_permissions handles an empty page", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + Req.Test.json(conn, %{"data" => [], "list_metadata" => %{"after" => nil}}) + end) + + assert {:ok, %WorkOS.Page{data: []} = page} = WorkOS.Authorization.list_permissions(client) + refute WorkOS.Page.has_more?(page) + assert page |> WorkOS.Page.stream() |> Enum.to_list() == [] + end + + test "create_permission succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/authorization/permissions" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("authorization/create_permission")) + end) + + assert {:ok, %WorkOS.Permission{object: "permission", id: "id"}} = + WorkOS.Authorization.create_permission(client) + end + + test "get_permission succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/authorization/permissions/test_slug" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("authorization/get_permission")) + end) + + assert {:ok, %WorkOS.AuthorizationPermission{object: "permission", id: "id"}} = + WorkOS.Authorization.get_permission(client, "test_slug") + end + + test "update_permission succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "PATCH" + assert conn.request_path == "/authorization/permissions/test_slug" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("authorization/update_permission")) + end) + + assert {:ok, %WorkOS.AuthorizationPermission{object: "permission", id: "id"}} = + WorkOS.Authorization.update_permission(client, "test_slug") + end + + test "delete_permission succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "DELETE" + assert conn.request_path == "/authorization/permissions/test_slug" + Plug.Conn.send_resp(conn, 204, "") + end) + + assert {:ok, _} = WorkOS.Authorization.delete_permission(client, "test_slug") + end + + test "list_group_role_assignments encodes query parameters", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + params = Plug.Conn.fetch_query_params(conn).query_params + assert params["before"] == "hello world&x" + refute Map.has_key?(params, "after") + Req.Test.json(conn, %{"data" => [], "list_metadata" => %{"after" => nil}}) + end) + + assert {:ok, _} = + WorkOS.Authorization.list_group_role_assignments(client, "test_group_id", %{ + before: "hello world&x" + }) + end + + test "list_group_role_assignments honors per-request options", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert Plug.Conn.get_req_header(conn, "x-custom") == ["value"] + assert conn.host == "override.example.com" + Plug.Conn.send_resp(conn, 204, "") + end) + + WorkOS.Authorization.list_group_role_assignments(client, "test_group_id", %{}, + headers: [{"x-custom", "value"}], + base_url: "https://override.example.com" + ) + end + + test "surfaces API errors as tagged tuples", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + conn + |> Plug.Conn.put_status(401) + |> Req.Test.json(%{"message" => "Unauthorized"}) + end) + + assert {:error, %WorkOS.ApiError{status: 401}} = + WorkOS.Authorization.list_group_role_assignments(client, "test_group_id") + end +end diff --git a/test/workos/client_api_round_trip_test.exs b/test/workos/client_api_round_trip_test.exs new file mode 100644 index 00000000..b31cf5e3 --- /dev/null +++ b/test/workos/client_api_round_trip_test.exs @@ -0,0 +1,18 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ClientApiRoundTripTest do + use ExUnit.Case, async: true + + test "ClientApiTokenResponse round-trips between wire and struct" do + data = %{"token" => "token"} + + serialized = + data |> WorkOS.ClientApiTokenResponse.from_map() |> WorkOS.ClientApiTokenResponse.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.ClientApiTokenResponse.from_map() + |> WorkOS.ClientApiTokenResponse.to_map() == serialized + end +end diff --git a/test/workos/client_api_test.exs b/test/workos/client_api_test.exs new file mode 100644 index 00000000..146aee1e --- /dev/null +++ b/test/workos/client_api_test.exs @@ -0,0 +1,49 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ClientApiTest do + use ExUnit.Case, async: true + + setup do + client = + WorkOS.Client.new( + api_key: "sk_test_key", + req_options: [plug: {Req.Test, WorkOS.Client}] + ) + + {:ok, client: client} + end + + test "create_token succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/client/token" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("client_api/create_token")) + end) + + assert {:ok, %WorkOS.ClientApiTokenResponse{token: "token"}} = + WorkOS.ClientApi.create_token(client) + end + + test "create_token honors per-request options", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert Plug.Conn.get_req_header(conn, "x-custom") == ["value"] + assert conn.host == "override.example.com" + Plug.Conn.send_resp(conn, 204, "") + end) + + WorkOS.ClientApi.create_token(client, %{}, + headers: [{"x-custom", "value"}], + base_url: "https://override.example.com" + ) + end + + test "surfaces API errors as tagged tuples", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + conn + |> Plug.Conn.put_status(401) + |> Req.Test.json(%{"message" => "Unauthorized"}) + end) + + assert {:error, %WorkOS.ApiError{status: 401}} = WorkOS.ClientApi.create_token(client) + end +end diff --git a/test/workos/client_runtime_test.exs b/test/workos/client_runtime_test.exs new file mode 100644 index 00000000..3177184b --- /dev/null +++ b/test/workos/client_runtime_test.exs @@ -0,0 +1,356 @@ +# @oagen-ignore-file + +defmodule WorkOS.ClientRuntimeTest do + use ExUnit.Case, async: true + + defp build_client(opts \\ []) do + [api_key: "sk_test_key", req_options: [plug: {Req.Test, WorkOS.Client}]] + |> Keyword.merge(opts) + |> WorkOS.Client.new() + end + + test "client configuration is instance-scoped" do + client_a = build_client(api_key: "sk_a") + client_b = build_client(api_key: "sk_b") + + Req.Test.stub(WorkOS.Client, fn conn -> + assert Plug.Conn.get_req_header(conn, "authorization") == ["Bearer sk_a"] + Req.Test.json(conn, %{}) + end) + + assert {:ok, _} = WorkOS.Client.request(client_a, :get, "/instance-scope") + + Req.Test.stub(WorkOS.Client, fn conn -> + assert Plug.Conn.get_req_header(conn, "authorization") == ["Bearer sk_b"] + Req.Test.json(conn, %{}) + end) + + assert {:ok, _} = WorkOS.Client.request(client_b, :get, "/instance-scope") + end + + test "per-request headers and query options are sent on the wire" do + Req.Test.stub(WorkOS.Client, fn conn -> + assert Plug.Conn.get_req_header(conn, "x-request-option") == ["honored"] + assert Plug.Conn.fetch_query_params(conn).query_params["limit"] == "2" + Req.Test.json(conn, %{}) + end) + + assert {:ok, _} = + WorkOS.Client.request(build_client(), :get, "/option-check", %{limit: 2}, + headers: [{"x-request-option", "honored"}] + ) + end + + test "per-request idempotency key is sent on the wire" do + Req.Test.stub(WorkOS.Client, fn conn -> + assert Plug.Conn.get_req_header(conn, "idempotency-key") == ["idem_123"] + Req.Test.json(conn, %{}) + end) + + assert {:ok, _} = + WorkOS.Client.request(build_client(), :post, "/option-check", %{}, + idempotency_key: "idem_123" + ) + end + + test "user agent reports the SDK package version" do + Req.Test.stub(WorkOS.Client, fn conn -> + assert [ua] = Plug.Conn.get_req_header(conn, "user-agent") + assert ua == "workos-elixir/" <> WorkOS.version() + Req.Test.json(conn, %{}) + end) + + assert {:ok, _} = WorkOS.Client.request(build_client(), :get, "/ua-check") + end + + test "transport failures surface as WorkOS.TransportError" do + Req.Test.stub(WorkOS.Client, fn conn -> + Req.Test.transport_error(conn, :econnrefused) + end) + + client = build_client(max_retries: 0) + assert {:error, %WorkOS.TransportError{}} = WorkOS.Client.request(client, :get, "/down") + end + + test "per-request timeout overrides the client's" do + Req.Test.stub(WorkOS.Client, fn conn -> Req.Test.json(conn, %{}) end) + + assert {:ok, _} = + WorkOS.Client.request(build_client(timeout: 60_000), :get, "/timeout", %{}, + timeout: 1_500 + ) + end + + test "per-request base_url overrides the client's" do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.host == "override.example.com" + Req.Test.json(conn, %{}) + end) + + assert {:ok, _} = + WorkOS.Client.request(build_client(), :get, "/base-url", %{}, + base_url: "https://override.example.com/" + ) + end + + test "per-request max_retries overrides the client's" do + # Client allows 3 retries; the per-request ceiling of 0 must win, so the + # single stubbed 500 is surfaced instead of being retried. + Req.Test.expect(WorkOS.Client, 1, fn conn -> + conn |> Plug.Conn.put_status(500) |> Req.Test.json(%{"message" => "boom"}) + end) + + assert {:error, %WorkOS.ApiError{status: 500}} = + WorkOS.Client.request(build_client(max_retries: 3), :get, "/retry-override", %{}, + max_retries: 0 + ) + end + + describe "retry policy" do + test "retries a 429 and honors Retry-After, then succeeds" do + Req.Test.expect(WorkOS.Client, 1, fn conn -> + conn + |> Plug.Conn.put_resp_header("retry-after", "0") + |> Plug.Conn.put_status(429) + |> Req.Test.json(%{"message" => "Slow down"}) + end) + + Req.Test.expect(WorkOS.Client, 1, fn conn -> Req.Test.json(conn, %{"ok" => true}) end) + + assert {:ok, %{"ok" => true}} = + WorkOS.Client.request(build_client(max_retries: 1), :get, "/retry-429") + end + + test "retries a retryable 5xx, then succeeds" do + Req.Test.expect(WorkOS.Client, 1, fn conn -> + conn + |> Plug.Conn.put_resp_header("retry-after", "0") + |> Plug.Conn.put_status(503) + |> Req.Test.json(%{"message" => "unavailable"}) + end) + + Req.Test.expect(WorkOS.Client, 1, fn conn -> Req.Test.json(conn, %{"ok" => true}) end) + + assert {:ok, %{"ok" => true}} = + WorkOS.Client.request(build_client(max_retries: 1), :get, "/retry-503") + end + + test "does not retry a non-retryable status" do + Req.Test.expect(WorkOS.Client, 1, fn conn -> + conn |> Plug.Conn.put_status(404) |> Req.Test.json(%{"message" => "nope"}) + end) + + assert {:error, %WorkOS.ApiError{status: 404}} = + WorkOS.Client.request(build_client(max_retries: 3), :get, "/no-retry") + end + end + + describe "idempotency keys" do + test "a retryable POST is given a generated key when the caller supplies none" do + Req.Test.stub(WorkOS.Client, fn conn -> + assert [key] = Plug.Conn.get_req_header(conn, "idempotency-key") + assert key =~ ~r/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/ + Req.Test.json(conn, %{}) + end) + + assert {:ok, _} = WorkOS.Client.request(build_client(max_retries: 3), :post, "/idem-auto") + end + + test "POST with retries disabled gets no generated key" do + Req.Test.stub(WorkOS.Client, fn conn -> + assert Plug.Conn.get_req_header(conn, "idempotency-key") == [] + Req.Test.json(conn, %{}) + end) + + assert {:ok, _} = WorkOS.Client.request(build_client(max_retries: 0), :post, "/idem-off") + end + + test "spec-driven :idempotency opt-in works even with retries disabled" do + Req.Test.stub(WorkOS.Client, fn conn -> + assert [_key] = Plug.Conn.get_req_header(conn, "idempotency-key") + Req.Test.json(conn, %{}) + end) + + assert {:ok, _} = + WorkOS.Client.request(build_client(max_retries: 0), :post, "/idem-optin", %{}, + idempotency: true + ) + end + + test "GET is never given an idempotency key" do + Req.Test.stub(WorkOS.Client, fn conn -> + assert Plug.Conn.get_req_header(conn, "idempotency-key") == [] + Req.Test.json(conn, %{}) + end) + + assert {:ok, _} = WorkOS.Client.request(build_client(max_retries: 3), :get, "/idem-get") + end + end + + describe "error mapping" do + for {status, kind} <- [ + {400, :bad_request}, + {401, :authentication}, + {403, :authorization}, + {404, :not_found}, + {409, :conflict}, + {422, :unprocessable_entity}, + {429, :rate_limit_exceeded}, + {500, :server}, + {503, :server} + ] do + test "HTTP #{status} maps to WorkOS.ApiError with kind #{inspect(kind)}" do + Req.Test.expect(WorkOS.Client, 1, fn conn -> + conn + |> Plug.Conn.put_resp_header("x-request-id", "req_abc") + |> Plug.Conn.put_status(unquote(status)) + |> Req.Test.json(%{"message" => "failed", "code" => "some_code"}) + end) + + assert {:error, error} = + WorkOS.Client.request(build_client(max_retries: 0), :get, "/err") + + assert %WorkOS.ApiError{ + status: unquote(status), + kind: unquote(kind), + message: "failed", + code: "some_code", + request_id: "req_abc" + } = error + end + end + + test "falls back to an HTTP status message when the body carries none" do + Req.Test.expect(WorkOS.Client, 1, fn conn -> + conn |> Plug.Conn.put_status(418) |> Req.Test.json(%{}) + end) + + assert {:error, %WorkOS.ApiError{message: "HTTP 418", kind: :api}} = + WorkOS.Client.request(build_client(max_retries: 0), :get, "/teapot") + end + + test "reads OAuth-style error_description bodies" do + Req.Test.expect(WorkOS.Client, 1, fn conn -> + conn + |> Plug.Conn.put_status(400) + |> Req.Test.json(%{"error" => "invalid_grant", "error_description" => "bad code"}) + end) + + assert {:error, %WorkOS.ApiError{message: "bad code"}} = + WorkOS.Client.request(build_client(max_retries: 0), :post, "/oauth-err") + end + + test "preserves the offending parameter name from a top-level field" do + Req.Test.expect(WorkOS.Client, 1, fn conn -> + conn + |> Plug.Conn.put_status(422) + |> Req.Test.json(%{"message" => "invalid", "field" => "email"}) + end) + + assert {:error, %WorkOS.ApiError{param: "email"}} = + WorkOS.Client.request(build_client(max_retries: 0), :post, "/param-top") + end + + test "preserves the offending parameter name from an errors list" do + Req.Test.expect(WorkOS.Client, 1, fn conn -> + conn + |> Plug.Conn.put_status(422) + |> Req.Test.json(%{ + "message" => "invalid", + "errors" => [%{"field" => "domain", "code" => "invalid_domain"}] + }) + end) + + assert {:error, %WorkOS.ApiError{param: "domain"}} = + WorkOS.Client.request(build_client(max_retries: 0), :post, "/param-errors") + end + + test "param is nil when the API names no field" do + Req.Test.expect(WorkOS.Client, 1, fn conn -> + conn |> Plug.Conn.put_status(400) |> Req.Test.json(%{"message" => "nope"}) + end) + + assert {:error, %WorkOS.ApiError{param: nil}} = + WorkOS.Client.request(build_client(max_retries: 0), :post, "/param-none") + end + + test "retains the raw parsed body for inspection" do + Req.Test.expect(WorkOS.Client, 1, fn conn -> + conn |> Plug.Conn.put_status(400) |> Req.Test.json(%{"message" => "x", "extra" => "keep"}) + end) + + assert {:error, %WorkOS.ApiError{body: %{"extra" => "keep"}}} = + WorkOS.Client.request(build_client(max_retries: 0), :get, "/raw-body") + end + end + + describe "query encoding" do + test "arrays are comma-joined and maps are JSON-encoded in built URLs" do + url = + WorkOS.Client.build_url(build_client(), "/encode", %{ + scopes: ["a", "b"], + filter: %{"k" => "v"}, + skipped: nil + }) + + assert url =~ "scopes=a%2Cb" + assert url =~ "filter=" <> URI.encode_www_form(~s({"k":"v"})) + refute url =~ "skipped" + end + + test "special characters in query params are percent-encoded on the wire" do + Req.Test.stub(WorkOS.Client, fn conn -> + params = Plug.Conn.fetch_query_params(conn).query_params + assert params["email"] == "a+b@example.com" + assert params["q"] == "hello world&more" + Req.Test.json(conn, %{}) + end) + + assert {:ok, _} = + WorkOS.Client.request(build_client(), :get, "/encode-wire", %{ + email: "a+b@example.com", + q: "hello world&more" + }) + end + + test "optional params that are absent are not sent" do + Req.Test.stub(WorkOS.Client, fn conn -> + params = Plug.Conn.fetch_query_params(conn).query_params + assert params["limit"] == "5" + refute Map.has_key?(params, "before") + Req.Test.json(conn, %{}) + end) + + assert {:ok, _} = WorkOS.Client.request(build_client(), :get, "/encode-omit", %{limit: 5}) + end + end + + test "an empty page yields no items and reports no more pages" do + Req.Test.stub(WorkOS.Client, fn conn -> + Req.Test.json(conn, %{"data" => [], "list_metadata" => %{"after" => nil}}) + end) + + assert {:ok, %WorkOS.Page{data: []} = page} = WorkOS.AuditLogs.list_actions(build_client()) + refute WorkOS.Page.has_more?(page) + assert page |> WorkOS.Page.stream() |> Enum.to_list() == [] + end + + test "auto-pagination streams items across multiple pages" do + base = WorkOS.TestFixtures.fixture("audit_logs/list_actions") + page1 = Map.put(base, "list_metadata", %{"before" => nil, "after" => "cursor_page_2"}) + page2 = Map.put(base, "list_metadata", %{"before" => nil, "after" => nil}) + + Req.Test.stub(WorkOS.Client, fn conn -> + conn = Plug.Conn.fetch_query_params(conn) + + if conn.query_params["after"] == "cursor_page_2" do + Req.Test.json(conn, page2) + else + Req.Test.json(conn, page1) + end + end) + + assert {:ok, %WorkOS.Page{} = page} = WorkOS.AuditLogs.list_actions(build_client()) + assert page |> WorkOS.Page.stream() |> Enum.count() == 2 + end +end diff --git a/test/workos/connect_round_trip_test.exs b/test/workos/connect_round_trip_test.exs new file mode 100644 index 00000000..b5440356 --- /dev/null +++ b/test/workos/connect_round_trip_test.exs @@ -0,0 +1,115 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ConnectRoundTripTest do + use ExUnit.Case, async: true + + test "ApplicationCredentialsListItem round-trips between wire and struct" do + data = %{ + "object" => "connect_application_secret", + "id" => "id", + "secret_hint" => "secret_hint", + "last_used_at" => "2024-01-01T00:00:00.000Z", + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z" + } + + serialized = + data + |> WorkOS.ApplicationCredentialsListItem.from_map() + |> WorkOS.ApplicationCredentialsListItem.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.ApplicationCredentialsListItem.from_map() + |> WorkOS.ApplicationCredentialsListItem.to_map() == serialized + end + + test "ConnectApplication round-trips between wire and struct" do + data = %{ + "object" => "connect_application", + "id" => "id", + "client_id" => "client_id", + "description" => "description", + "name" => "name", + "scopes" => ["scopes"], + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z" + } + + serialized = + data |> WorkOS.ConnectApplication.from_map() |> WorkOS.ConnectApplication.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.ConnectApplication.from_map() + |> WorkOS.ConnectApplication.to_map() == serialized + end + + test "ConnectApplicationList round-trips between wire and struct" do + data = %{ + "object" => "list", + "data" => [ + %{ + "object" => "connect_application", + "id" => "id", + "client_id" => "client_id", + "description" => "description", + "name" => "name", + "scopes" => ["scopes"], + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z" + } + ], + "list_metadata" => %{"before" => "before", "after" => "after"} + } + + serialized = + data |> WorkOS.ConnectApplicationList.from_map() |> WorkOS.ConnectApplicationList.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.ConnectApplicationList.from_map() + |> WorkOS.ConnectApplicationList.to_map() == serialized + end + + test "ExternalAuthCompleteResponse round-trips between wire and struct" do + data = %{"redirect_uri" => "redirect_uri"} + + serialized = + data + |> WorkOS.ExternalAuthCompleteResponse.from_map() + |> WorkOS.ExternalAuthCompleteResponse.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.ExternalAuthCompleteResponse.from_map() + |> WorkOS.ExternalAuthCompleteResponse.to_map() == serialized + end + + test "NewConnectApplicationSecret round-trips between wire and struct" do + data = %{ + "object" => "connect_application_secret", + "id" => "id", + "secret_hint" => "secret_hint", + "last_used_at" => "2024-01-01T00:00:00.000Z", + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z", + "secret" => "secret" + } + + serialized = + data + |> WorkOS.NewConnectApplicationSecret.from_map() + |> WorkOS.NewConnectApplicationSecret.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.NewConnectApplicationSecret.from_map() + |> WorkOS.NewConnectApplicationSecret.to_map() == serialized + end +end diff --git a/test/workos/connect_test.exs b/test/workos/connect_test.exs new file mode 100644 index 00000000..55782832 --- /dev/null +++ b/test/workos/connect_test.exs @@ -0,0 +1,191 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.ConnectTest do + use ExUnit.Case, async: true + + setup do + client = + WorkOS.Client.new( + api_key: "sk_test_key", + req_options: [plug: {Req.Test, WorkOS.Client}] + ) + + {:ok, client: client} + end + + test "complete_oauth2 succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/authkit/oauth2/complete" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("connect/complete_oauth2")) + end) + + assert {:ok, %WorkOS.ExternalAuthCompleteResponse{redirect_uri: "redirect_uri"}} = + WorkOS.Connect.complete_oauth2(client) + end + + test "list_applications succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/connect/applications" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("connect/list_applications")) + end) + + assert {:ok, %WorkOS.Page{data: [%WorkOS.ConnectApplicationList{object: "list"} | _]}} = + WorkOS.Connect.list_applications(client) + end + + test "list_applications handles an empty page", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + Req.Test.json(conn, %{"data" => [], "list_metadata" => %{"after" => nil}}) + end) + + assert {:ok, %WorkOS.Page{data: []} = page} = WorkOS.Connect.list_applications(client) + refute WorkOS.Page.has_more?(page) + assert page |> WorkOS.Page.stream() |> Enum.to_list() == [] + end + + test "create_oauth_application succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/connect/applications" + {:ok, req_body, conn} = Plug.Conn.read_body(conn) + req_body = JSON.decode!(req_body) + assert req_body["application_type"] == "oauth" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("connect/create_oauth_application")) + end) + + assert {:ok, %WorkOS.ConnectApplication{object: "connect_application", id: "id"}} = + WorkOS.Connect.create_oauth_application(client, %{ + name: "test_name", + is_first_party: true + }) + end + + test "create_m2m_application succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/connect/applications" + {:ok, req_body, conn} = Plug.Conn.read_body(conn) + req_body = JSON.decode!(req_body) + assert req_body["application_type"] == "m2m" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("connect/create_m2m_application")) + end) + + assert {:ok, %WorkOS.ConnectApplication{object: "connect_application", id: "id"}} = + WorkOS.Connect.create_m2m_application(client, %{ + name: "test_name", + organization_id: "test_organization_id" + }) + end + + test "get_application succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/connect/applications/test_id" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("connect/get_application")) + end) + + assert {:ok, %WorkOS.ConnectApplication{object: "connect_application", id: "id"}} = + WorkOS.Connect.get_application(client, "test_id") + end + + test "update_application succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "PUT" + assert conn.request_path == "/connect/applications/test_id" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("connect/update_application")) + end) + + assert {:ok, %WorkOS.ConnectApplication{object: "connect_application", id: "id"}} = + WorkOS.Connect.update_application(client, "test_id") + end + + test "delete_application succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "DELETE" + assert conn.request_path == "/connect/applications/test_id" + Plug.Conn.send_resp(conn, 204, "") + end) + + assert {:ok, _} = WorkOS.Connect.delete_application(client, "test_id") + end + + test "list_application_client_secrets succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/connect/applications/test_id/client_secrets" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("connect/list_application_client_secrets")) + end) + + assert {:ok, + [ + %WorkOS.ApplicationCredentialsListItem{ + object: "connect_application_secret", + id: "id" + } + | _ + ]} = WorkOS.Connect.list_application_client_secrets(client, "test_id") + end + + test "create_application_client_secret succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/connect/applications/test_id/client_secrets" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("connect/create_application_client_secret")) + end) + + assert {:ok, + %WorkOS.NewConnectApplicationSecret{object: "connect_application_secret", id: "id"}} = + WorkOS.Connect.create_application_client_secret(client, "test_id") + end + + test "delete_client_secret succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "DELETE" + assert conn.request_path == "/connect/client_secrets/test_id" + Plug.Conn.send_resp(conn, 204, "") + end) + + assert {:ok, _} = WorkOS.Connect.delete_client_secret(client, "test_id") + end + + test "list_applications encodes query parameters", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + params = Plug.Conn.fetch_query_params(conn).query_params + assert params["before"] == "hello world&x" + assert params["registration_types"] == "a,b" + refute Map.has_key?(params, "after") + Req.Test.json(conn, %{"data" => [], "list_metadata" => %{"after" => nil}}) + end) + + assert {:ok, _} = + WorkOS.Connect.list_applications(client, %{ + before: "hello world&x", + registration_types: ["a", "b"] + }) + end + + test "complete_oauth2 honors per-request options", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert Plug.Conn.get_req_header(conn, "x-custom") == ["value"] + assert conn.host == "override.example.com" + Plug.Conn.send_resp(conn, 204, "") + end) + + WorkOS.Connect.complete_oauth2(client, %{}, + headers: [{"x-custom", "value"}], + base_url: "https://override.example.com" + ) + end + + test "surfaces API errors as tagged tuples", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + conn + |> Plug.Conn.put_status(401) + |> Req.Test.json(%{"message" => "Unauthorized"}) + end) + + assert {:error, %WorkOS.ApiError{status: 401}} = WorkOS.Connect.complete_oauth2(client) + end +end diff --git a/test/workos/directory_sync_round_trip_test.exs b/test/workos/directory_sync_round_trip_test.exs new file mode 100644 index 00000000..ed9a87ff --- /dev/null +++ b/test/workos/directory_sync_round_trip_test.exs @@ -0,0 +1,186 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.DirectorySyncRoundTripTest do + use ExUnit.Case, async: true + + test "Directory round-trips between wire and struct" do + data = %{ + "object" => "directory", + "id" => "id", + "organization_id" => "organization_id", + "external_key" => "external_key", + "type" => "azure scim v2.0", + "state" => "linked", + "name" => "name", + "domain" => "domain", + "metadata" => %{"users" => %{"active" => 1, "inactive" => 1}, "groups" => 1}, + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z" + } + + serialized = data |> WorkOS.Directory.from_map() |> WorkOS.Directory.to_map() + assert serialized == data + + assert serialized |> WorkOS.Directory.from_map() |> WorkOS.Directory.to_map() == serialized + end + + test "DirectoryGroup round-trips between wire and struct" do + data = %{ + "object" => "directory_group", + "id" => "id", + "idp_id" => "idp_id", + "directory_id" => "directory_id", + "organization_id" => "organization_id", + "name" => "name", + "raw_attributes" => %{}, + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z" + } + + serialized = data |> WorkOS.DirectoryGroup.from_map() |> WorkOS.DirectoryGroup.to_map() + assert serialized == data + + assert serialized |> WorkOS.DirectoryGroup.from_map() |> WorkOS.DirectoryGroup.to_map() == + serialized + end + + test "DirectoryGroupList round-trips between wire and struct" do + data = %{ + "object" => "list", + "data" => [ + %{ + "object" => "directory_group", + "id" => "id", + "idp_id" => "idp_id", + "directory_id" => "directory_id", + "organization_id" => "organization_id", + "name" => "name", + "raw_attributes" => %{}, + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z" + } + ], + "list_metadata" => %{"before" => "before", "after" => "after"} + } + + serialized = + data |> WorkOS.DirectoryGroupList.from_map() |> WorkOS.DirectoryGroupList.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.DirectoryGroupList.from_map() + |> WorkOS.DirectoryGroupList.to_map() == serialized + end + + test "DirectoryList round-trips between wire and struct" do + data = %{ + "object" => "list", + "data" => [ + %{ + "object" => "directory", + "id" => "id", + "organization_id" => "organization_id", + "external_key" => "external_key", + "type" => "azure scim v2.0", + "state" => "linked", + "name" => "name", + "domain" => "domain", + "metadata" => %{"users" => %{}, "groups" => 1}, + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z" + } + ], + "list_metadata" => %{"before" => "before", "after" => "after"} + } + + serialized = data |> WorkOS.DirectoryList.from_map() |> WorkOS.DirectoryList.to_map() + assert serialized == data + + assert serialized |> WorkOS.DirectoryList.from_map() |> WorkOS.DirectoryList.to_map() == + serialized + end + + test "DirectoryUserList round-trips between wire and struct" do + data = %{ + "object" => "list", + "data" => [ + %{ + "object" => "directory_user", + "id" => "id", + "directory_id" => "directory_id", + "organization_id" => "organization_id", + "idp_id" => "idp_id", + "email" => "email", + "first_name" => "first_name", + "last_name" => "last_name", + "name" => "name", + "emails" => [%{}], + "job_title" => "job_title", + "username" => "username", + "state" => "active", + "raw_attributes" => %{}, + "custom_attributes" => %{}, + "role" => %{"slug" => "slug"}, + "roles" => [%{}], + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z", + "groups" => [%{}] + } + ], + "list_metadata" => %{"before" => "before", "after" => "after"} + } + + serialized = data |> WorkOS.DirectoryUserList.from_map() |> WorkOS.DirectoryUserList.to_map() + assert serialized == data + + assert serialized |> WorkOS.DirectoryUserList.from_map() |> WorkOS.DirectoryUserList.to_map() == + serialized + end + + test "DirectoryUserWithGroups round-trips between wire and struct" do + data = %{ + "object" => "directory_user", + "id" => "id", + "directory_id" => "directory_id", + "organization_id" => "organization_id", + "idp_id" => "idp_id", + "email" => "email", + "first_name" => "first_name", + "last_name" => "last_name", + "name" => "name", + "emails" => [%{"primary" => true, "type" => "type", "value" => "value"}], + "job_title" => "job_title", + "username" => "username", + "state" => "active", + "raw_attributes" => %{}, + "custom_attributes" => %{}, + "role" => %{"slug" => "slug"}, + "roles" => [%{"slug" => "slug"}], + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z", + "groups" => [ + %{ + "object" => "directory_group", + "id" => "id", + "idp_id" => "idp_id", + "directory_id" => "directory_id", + "organization_id" => "organization_id", + "name" => "name", + "raw_attributes" => %{}, + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z" + } + ] + } + + serialized = + data |> WorkOS.DirectoryUserWithGroups.from_map() |> WorkOS.DirectoryUserWithGroups.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.DirectoryUserWithGroups.from_map() + |> WorkOS.DirectoryUserWithGroups.to_map() == serialized + end +end diff --git a/test/workos/directory_sync_test.exs b/test/workos/directory_sync_test.exs index 40834591..41aeed3b 100644 --- a/test/workos/directory_sync_test.exs +++ b/test/workos/directory_sync_test.exs @@ -1,110 +1,155 @@ +# This file is auto-generated by oagen. Do not edit. + defmodule WorkOS.DirectorySyncTest do - use WorkOS.TestCase + use ExUnit.Case, async: true - alias WorkOS.DirectorySync.ClientMock + setup do + client = + WorkOS.Client.new( + api_key: "sk_test_key", + req_options: [plug: {Req.Test, WorkOS.Client}] + ) - setup :setup_env + {:ok, client: client} + end - describe "get_directory" do - test "requests a directory", context do - opts = [directory_id: "directory_123"] + test "list_directories succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/directories" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("directory_sync/list_directories")) + end) - context |> ClientMock.get_directory(assert_fields: opts) + assert {:ok, %WorkOS.Page{data: [%WorkOS.DirectoryList{object: "list"} | _]}} = + WorkOS.DirectorySync.list_directories(client) + end - assert {:ok, %WorkOS.DirectorySync.Directory{id: id}} = - WorkOS.DirectorySync.get_directory(opts |> Keyword.get(:directory_id)) + test "list_directories handles an empty page", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + Req.Test.json(conn, %{"data" => [], "list_metadata" => %{"after" => nil}}) + end) - refute is_nil(id) - end + assert {:ok, %WorkOS.Page{data: []} = page} = WorkOS.DirectorySync.list_directories(client) + refute WorkOS.Page.has_more?(page) + assert page |> WorkOS.Page.stream() |> Enum.to_list() == [] end - describe "list_directories" do - test "requests directories with options", context do - opts = [organization_id: "org_1234"] + test "get_directory succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/directories/test_id" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("directory_sync/get_directory")) + end) - context |> ClientMock.list_directories(assert_fields: opts) - - assert {:ok, %WorkOS.List{data: [%WorkOS.DirectorySync.Directory{}], list_metadata: %{}}} = - WorkOS.DirectorySync.list_directories(opts |> Enum.into(%{})) - end + assert {:ok, %WorkOS.Directory{object: "directory", id: "id"}} = + WorkOS.DirectorySync.get_directory(client, "test_id") end - describe "delete_directory" do - test "sends a request to delete a directory", context do - opts = [directory_id: "conn_123"] - - context |> ClientMock.delete_directory(assert_fields: opts) + test "delete_directory succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "DELETE" + assert conn.request_path == "/directories/test_id" + Plug.Conn.send_resp(conn, 204, "") + end) - assert {:ok, %WorkOS.Empty{}} = - WorkOS.DirectorySync.delete_directory(opts |> Keyword.get(:directory_id)) - end + assert {:ok, _} = WorkOS.DirectorySync.delete_directory(client, "test_id") end - describe "get_user" do - test "requests a directory user", context do - opts = [directory_user_id: "dir_usr_123"] + test "list_groups succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/directory_groups" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("directory_sync/list_groups")) + end) - context |> ClientMock.get_user(assert_fields: opts) + assert {:ok, %WorkOS.Page{data: [%WorkOS.DirectoryGroupList{object: "list"} | _]}} = + WorkOS.DirectorySync.list_groups(client) + end - assert {:ok, %WorkOS.DirectorySync.Directory.User{id: id}} = - WorkOS.DirectorySync.get_user(opts |> Keyword.get(:directory_user_id)) + test "list_groups handles an empty page", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + Req.Test.json(conn, %{"data" => [], "list_metadata" => %{"after" => nil}}) + end) - refute is_nil(id) - end + assert {:ok, %WorkOS.Page{data: []} = page} = WorkOS.DirectorySync.list_groups(client) + refute WorkOS.Page.has_more?(page) + assert page |> WorkOS.Page.stream() |> Enum.to_list() == [] end - describe "list_users" do - test "requests directory users with options", context do - opts = [directory: "directory_123"] + test "get_group succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/directory_groups/test_id" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("directory_sync/get_group")) + end) - context |> ClientMock.list_users(assert_fields: opts) + assert {:ok, %WorkOS.DirectoryGroup{object: "directory_group", id: "id"}} = + WorkOS.DirectorySync.get_group(client, "test_id") + end - assert {:ok, - %WorkOS.List{ - data: [%WorkOS.DirectorySync.Directory.User{custom_attributes: custom_attributes}], - list_metadata: %{} - }} = WorkOS.DirectorySync.list_users(opts |> Enum.into(%{})) + test "list_users succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/directory_users" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("directory_sync/list_users")) + end) - assert %{"custom" => true} = custom_attributes - end + assert {:ok, %WorkOS.Page{data: [%WorkOS.DirectoryUserList{object: "list"} | _]}} = + WorkOS.DirectorySync.list_users(client) end - describe "get_group" do - test "requests a directory group", context do - opts = [directory_group_id: "dir_grp_123"] + test "list_users handles an empty page", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + Req.Test.json(conn, %{"data" => [], "list_metadata" => %{"after" => nil}}) + end) - context |> ClientMock.get_group(assert_fields: opts) + assert {:ok, %WorkOS.Page{data: []} = page} = WorkOS.DirectorySync.list_users(client) + refute WorkOS.Page.has_more?(page) + assert page |> WorkOS.Page.stream() |> Enum.to_list() == [] + end - assert {:ok, %WorkOS.DirectorySync.Directory.Group{id: id}} = - WorkOS.DirectorySync.get_group(opts |> Keyword.get(:directory_group_id)) + test "get_user succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/directory_users/test_id" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("directory_sync/get_user")) + end) - refute is_nil(id) - end + assert {:ok, %WorkOS.DirectoryUserWithGroups{object: "directory_user", id: "id"}} = + WorkOS.DirectorySync.get_user(client, "test_id") end - describe "list_groups" do - test "requests directory groups with `directory` option", context do - opts = [directory: "directory_123"] - - context |> ClientMock.list_groups(assert_fields: opts) + test "list_directories encodes query parameters", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + params = Plug.Conn.fetch_query_params(conn).query_params + assert params["before"] == "hello world&x" + refute Map.has_key?(params, "after") + Req.Test.json(conn, %{"data" => [], "list_metadata" => %{"after" => nil}}) + end) - assert {:ok, - %WorkOS.List{ - data: [%WorkOS.DirectorySync.Directory.Group{}], - list_metadata: %{} - }} = WorkOS.DirectorySync.list_groups(opts |> Enum.into(%{})) - end + assert {:ok, _} = WorkOS.DirectorySync.list_directories(client, %{before: "hello world&x"}) + end - test "requests directory groups with `user` option", context do - opts = [user: "directory_usr_123"] + test "list_directories honors per-request options", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert Plug.Conn.get_req_header(conn, "x-custom") == ["value"] + assert conn.host == "override.example.com" + Plug.Conn.send_resp(conn, 204, "") + end) + + WorkOS.DirectorySync.list_directories(client, %{}, + headers: [{"x-custom", "value"}], + base_url: "https://override.example.com" + ) + end - context |> ClientMock.list_groups(assert_fields: opts) + test "surfaces API errors as tagged tuples", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + conn + |> Plug.Conn.put_status(401) + |> Req.Test.json(%{"message" => "Unauthorized"}) + end) - assert {:ok, - %WorkOS.List{ - data: [%WorkOS.DirectorySync.Directory.Group{}], - list_metadata: %{} - }} = WorkOS.DirectorySync.list_groups(opts |> Enum.into(%{})) - end + assert {:error, %WorkOS.ApiError{status: 401}} = WorkOS.DirectorySync.list_directories(client) end end diff --git a/test/workos/events_round_trip_test.exs b/test/workos/events_round_trip_test.exs new file mode 100644 index 00000000..3cf520b2 --- /dev/null +++ b/test/workos/events_round_trip_test.exs @@ -0,0 +1,27 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.EventsRoundTripTest do + use ExUnit.Case, async: true + + test "EventList round-trips between wire and struct" do + data = %{ + "object" => "list", + "data" => [ + %{ + "object" => "event", + "id" => "id", + "event" => "event", + "data" => %{}, + "created_at" => "2024-01-01T00:00:00.000Z", + "context" => %{} + } + ], + "list_metadata" => %{"after" => "after"} + } + + serialized = data |> WorkOS.EventList.from_map() |> WorkOS.EventList.to_map() + assert serialized == data + + assert serialized |> WorkOS.EventList.from_map() |> WorkOS.EventList.to_map() == serialized + end +end diff --git a/test/workos/events_test.exs b/test/workos/events_test.exs index 38e3d428..aef5a265 100644 --- a/test/workos/events_test.exs +++ b/test/workos/events_test.exs @@ -1,18 +1,72 @@ +# This file is auto-generated by oagen. Do not edit. + defmodule WorkOS.EventsTest do - use WorkOS.TestCase + use ExUnit.Case, async: true + + setup do + client = + WorkOS.Client.new( + api_key: "sk_test_key", + req_options: [plug: {Req.Test, WorkOS.Client}] + ) - alias WorkOS.Events.ClientMock + {:ok, client: client} + end - setup :setup_env + test "list_events succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/events" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("events/list_events")) + end) - describe "list_events" do - test "requests events", context do - opts = [events: ["connection.activated"]] + assert {:ok, %WorkOS.Page{data: [%WorkOS.EventList{object: "list"} | _]}} = + WorkOS.Events.list_events(client) + end + + test "list_events handles an empty page", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + Req.Test.json(conn, %{"data" => [], "list_metadata" => %{"after" => nil}}) + end) + + assert {:ok, %WorkOS.Page{data: []} = page} = WorkOS.Events.list_events(client) + refute WorkOS.Page.has_more?(page) + assert page |> WorkOS.Page.stream() |> Enum.to_list() == [] + end + + test "list_events encodes query parameters", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + params = Plug.Conn.fetch_query_params(conn).query_params + assert params["before"] == "hello world&x" + assert params["events"] == "a,b" + refute Map.has_key?(params, "after") + Req.Test.json(conn, %{"data" => [], "list_metadata" => %{"after" => nil}}) + end) + + assert {:ok, _} = + WorkOS.Events.list_events(client, %{before: "hello world&x", events: ["a", "b"]}) + end + + test "list_events honors per-request options", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert Plug.Conn.get_req_header(conn, "x-custom") == ["value"] + assert conn.host == "override.example.com" + Plug.Conn.send_resp(conn, 204, "") + end) + + WorkOS.Events.list_events(client, %{}, + headers: [{"x-custom", "value"}], + base_url: "https://override.example.com" + ) + end - context |> ClientMock.list_events(assert_fields: opts) + test "surfaces API errors as tagged tuples", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + conn + |> Plug.Conn.put_status(401) + |> Req.Test.json(%{"message" => "Unauthorized"}) + end) - assert {:ok, %WorkOS.List{data: [%WorkOS.Events.Event{}], list_metadata: %{}}} = - WorkOS.Events.list_events(opts |> Enum.into(%{})) - end + assert {:error, %WorkOS.ApiError{status: 401}} = WorkOS.Events.list_events(client) end end diff --git a/test/workos/feature_flags_round_trip_test.exs b/test/workos/feature_flags_round_trip_test.exs new file mode 100644 index 00000000..9e9c7aca --- /dev/null +++ b/test/workos/feature_flags_round_trip_test.exs @@ -0,0 +1,79 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.FeatureFlagsRoundTripTest do + use ExUnit.Case, async: true + + test "FeatureFlag round-trips between wire and struct" do + data = %{ + "object" => "feature_flag", + "id" => "id", + "slug" => "slug", + "name" => "name", + "description" => "description", + "owner" => %{"email" => "email", "first_name" => "first_name", "last_name" => "last_name"}, + "tags" => ["tags"], + "enabled" => true, + "default_value" => true, + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z" + } + + serialized = data |> WorkOS.FeatureFlag.from_map() |> WorkOS.FeatureFlag.to_map() + assert serialized == data + + assert serialized |> WorkOS.FeatureFlag.from_map() |> WorkOS.FeatureFlag.to_map() == + serialized + end + + test "Flag round-trips between wire and struct" do + data = %{ + "object" => "feature_flag", + "id" => "id", + "slug" => "slug", + "name" => "name", + "description" => "description", + "owner" => %{"email" => "email", "first_name" => "first_name", "last_name" => "last_name"}, + "tags" => ["tags"], + "enabled" => true, + "default_value" => true, + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z" + } + + serialized = data |> WorkOS.Flag.from_map() |> WorkOS.Flag.to_map() + assert serialized == data + + assert serialized |> WorkOS.Flag.from_map() |> WorkOS.Flag.to_map() == serialized + end + + test "FlagList round-trips between wire and struct" do + data = %{ + "object" => "list", + "data" => [ + %{ + "object" => "feature_flag", + "id" => "id", + "slug" => "slug", + "name" => "name", + "description" => "description", + "owner" => %{ + "email" => "email", + "first_name" => "first_name", + "last_name" => "last_name" + }, + "tags" => ["tags"], + "enabled" => true, + "default_value" => true, + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z" + } + ], + "list_metadata" => %{"before" => "before", "after" => "after"} + } + + serialized = data |> WorkOS.FlagList.from_map() |> WorkOS.FlagList.to_map() + assert serialized == data + + assert serialized |> WorkOS.FlagList.from_map() |> WorkOS.FlagList.to_map() == serialized + end +end diff --git a/test/workos/feature_flags_test.exs b/test/workos/feature_flags_test.exs new file mode 100644 index 00000000..e4e167d7 --- /dev/null +++ b/test/workos/feature_flags_test.exs @@ -0,0 +1,175 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.FeatureFlagsTest do + use ExUnit.Case, async: true + + setup do + client = + WorkOS.Client.new( + api_key: "sk_test_key", + req_options: [plug: {Req.Test, WorkOS.Client}] + ) + + {:ok, client: client} + end + + test "list_feature_flags succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/feature-flags" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("feature_flags/list_feature_flags")) + end) + + assert {:ok, %WorkOS.Page{data: [%WorkOS.FlagList{object: "list"} | _]}} = + WorkOS.FeatureFlags.list_feature_flags(client) + end + + test "list_feature_flags handles an empty page", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + Req.Test.json(conn, %{"data" => [], "list_metadata" => %{"after" => nil}}) + end) + + assert {:ok, %WorkOS.Page{data: []} = page} = WorkOS.FeatureFlags.list_feature_flags(client) + refute WorkOS.Page.has_more?(page) + assert page |> WorkOS.Page.stream() |> Enum.to_list() == [] + end + + test "get_feature_flag succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/feature-flags/test_slug" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("feature_flags/get_feature_flag")) + end) + + assert {:ok, %WorkOS.Flag{object: "feature_flag", id: "id"}} = + WorkOS.FeatureFlags.get_feature_flag(client, "test_slug") + end + + test "disable_feature_flag succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "PUT" + assert conn.request_path == "/feature-flags/test_slug/disable" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("feature_flags/disable_feature_flag")) + end) + + assert {:ok, %WorkOS.FeatureFlag{object: "feature_flag", id: "id"}} = + WorkOS.FeatureFlags.disable_feature_flag(client, "test_slug") + end + + test "enable_feature_flag succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "PUT" + assert conn.request_path == "/feature-flags/test_slug/enable" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("feature_flags/enable_feature_flag")) + end) + + assert {:ok, %WorkOS.FeatureFlag{object: "feature_flag", id: "id"}} = + WorkOS.FeatureFlags.enable_feature_flag(client, "test_slug") + end + + test "add_flag_target succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/feature-flags/test_slug/targets/test_resource_id" + Plug.Conn.send_resp(conn, 204, "") + end) + + assert {:ok, _} = WorkOS.FeatureFlags.add_flag_target(client, "test_slug", "test_resource_id") + end + + test "remove_flag_target succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "DELETE" + assert conn.request_path == "/feature-flags/test_slug/targets/test_resource_id" + Plug.Conn.send_resp(conn, 204, "") + end) + + assert {:ok, _} = + WorkOS.FeatureFlags.remove_flag_target(client, "test_slug", "test_resource_id") + end + + test "list_organization_feature_flags succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/organizations/test_organization_id/feature-flags" + + Req.Test.json( + conn, + WorkOS.TestFixtures.fixture("feature_flags/list_organization_feature_flags") + ) + end) + + assert {:ok, %WorkOS.Page{data: [%WorkOS.FlagList{object: "list"} | _]}} = + WorkOS.FeatureFlags.list_organization_feature_flags(client, "test_organization_id") + end + + test "list_organization_feature_flags handles an empty page", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + Req.Test.json(conn, %{"data" => [], "list_metadata" => %{"after" => nil}}) + end) + + assert {:ok, %WorkOS.Page{data: []} = page} = + WorkOS.FeatureFlags.list_organization_feature_flags(client, "test_organization_id") + + refute WorkOS.Page.has_more?(page) + assert page |> WorkOS.Page.stream() |> Enum.to_list() == [] + end + + test "list_user_feature_flags succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/user_management/users/test_user_id/feature-flags" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("feature_flags/list_user_feature_flags")) + end) + + assert {:ok, %WorkOS.Page{data: [%WorkOS.FlagList{object: "list"} | _]}} = + WorkOS.FeatureFlags.list_user_feature_flags(client, "test_user_id") + end + + test "list_user_feature_flags handles an empty page", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + Req.Test.json(conn, %{"data" => [], "list_metadata" => %{"after" => nil}}) + end) + + assert {:ok, %WorkOS.Page{data: []} = page} = + WorkOS.FeatureFlags.list_user_feature_flags(client, "test_user_id") + + refute WorkOS.Page.has_more?(page) + assert page |> WorkOS.Page.stream() |> Enum.to_list() == [] + end + + test "list_feature_flags encodes query parameters", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + params = Plug.Conn.fetch_query_params(conn).query_params + assert params["before"] == "hello world&x" + refute Map.has_key?(params, "after") + Req.Test.json(conn, %{"data" => [], "list_metadata" => %{"after" => nil}}) + end) + + assert {:ok, _} = WorkOS.FeatureFlags.list_feature_flags(client, %{before: "hello world&x"}) + end + + test "list_feature_flags honors per-request options", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert Plug.Conn.get_req_header(conn, "x-custom") == ["value"] + assert conn.host == "override.example.com" + Plug.Conn.send_resp(conn, 204, "") + end) + + WorkOS.FeatureFlags.list_feature_flags(client, %{}, + headers: [{"x-custom", "value"}], + base_url: "https://override.example.com" + ) + end + + test "surfaces API errors as tagged tuples", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + conn + |> Plug.Conn.put_status(401) + |> Req.Test.json(%{"message" => "Unauthorized"}) + end) + + assert {:error, %WorkOS.ApiError{status: 401}} = + WorkOS.FeatureFlags.list_feature_flags(client) + end +end diff --git a/test/workos/groups_round_trip_test.exs b/test/workos/groups_round_trip_test.exs new file mode 100644 index 00000000..2082d907 --- /dev/null +++ b/test/workos/groups_round_trip_test.exs @@ -0,0 +1,93 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.GroupsRoundTripTest do + use ExUnit.Case, async: true + + test "Group round-trips between wire and struct" do + data = %{ + "object" => "group", + "id" => "id", + "organization_id" => "organization_id", + "name" => "name", + "description" => "description", + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z" + } + + serialized = data |> WorkOS.Group.from_map() |> WorkOS.Group.to_map() + assert serialized == data + + assert serialized |> WorkOS.Group.from_map() |> WorkOS.Group.to_map() == serialized + end + + test "GroupList round-trips between wire and struct" do + data = %{ + "object" => "list", + "data" => [ + %{ + "object" => "group", + "id" => "id", + "organization_id" => "organization_id", + "name" => "name", + "description" => "description", + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z" + } + ], + "list_metadata" => %{"before" => "before", "after" => "after"} + } + + serialized = data |> WorkOS.GroupList.from_map() |> WorkOS.GroupList.to_map() + assert serialized == data + + assert serialized |> WorkOS.GroupList.from_map() |> WorkOS.GroupList.to_map() == serialized + end + + test "UserOrganizationMembershipBaseList round-trips between wire and struct" do + data = %{ + "object" => "list", + "data" => [ + %{ + "object" => "organization_membership", + "id" => "id", + "user_id" => "user_id", + "organization_id" => "organization_id", + "status" => "active", + "directory_managed" => true, + "organization_name" => "organization_name", + "custom_attributes" => %{}, + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z", + "user" => %{ + "object" => "user", + "id" => "id", + "first_name" => "first_name", + "last_name" => "last_name", + "name" => "name", + "profile_picture_url" => "profile_picture_url", + "email" => "email", + "email_verified" => true, + "external_id" => "external_id", + "metadata" => %{}, + "last_sign_in_at" => "2024-01-01T00:00:00.000Z", + "locale" => "locale", + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z" + } + } + ], + "list_metadata" => %{"before" => "before", "after" => "after"} + } + + serialized = + data + |> WorkOS.UserOrganizationMembershipBaseList.from_map() + |> WorkOS.UserOrganizationMembershipBaseList.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.UserOrganizationMembershipBaseList.from_map() + |> WorkOS.UserOrganizationMembershipBaseList.to_map() == serialized + end +end diff --git a/test/workos/groups_test.exs b/test/workos/groups_test.exs new file mode 100644 index 00000000..c41be4cc --- /dev/null +++ b/test/workos/groups_test.exs @@ -0,0 +1,206 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.GroupsTest do + use ExUnit.Case, async: true + + setup do + client = + WorkOS.Client.new( + api_key: "sk_test_key", + req_options: [plug: {Req.Test, WorkOS.Client}] + ) + + {:ok, client: client} + end + + test "list_organization_groups succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/organizations/test_organization_id/groups" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("groups/list_organization_groups")) + end) + + assert {:ok, %WorkOS.Page{data: [%WorkOS.GroupList{object: "list"} | _]}} = + WorkOS.Groups.list_organization_groups(client, "test_organization_id") + end + + test "list_organization_groups handles an empty page", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + Req.Test.json(conn, %{"data" => [], "list_metadata" => %{"after" => nil}}) + end) + + assert {:ok, %WorkOS.Page{data: []} = page} = + WorkOS.Groups.list_organization_groups(client, "test_organization_id") + + refute WorkOS.Page.has_more?(page) + assert page |> WorkOS.Page.stream() |> Enum.to_list() == [] + end + + test "create_organization_group succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/organizations/test_organization_id/groups" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("groups/create_organization_group")) + end) + + assert {:ok, %WorkOS.Group{object: "group", id: "id"}} = + WorkOS.Groups.create_organization_group(client, "test_organization_id") + end + + test "get_organization_group succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/organizations/test_organization_id/groups/test_group_id" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("groups/get_organization_group")) + end) + + assert {:ok, %WorkOS.Group{object: "group", id: "id"}} = + WorkOS.Groups.get_organization_group(client, "test_organization_id", "test_group_id") + end + + test "update_organization_group succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "PATCH" + assert conn.request_path == "/organizations/test_organization_id/groups/test_group_id" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("groups/update_organization_group")) + end) + + assert {:ok, %WorkOS.Group{object: "group", id: "id"}} = + WorkOS.Groups.update_organization_group( + client, + "test_organization_id", + "test_group_id" + ) + end + + test "delete_organization_group succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "DELETE" + assert conn.request_path == "/organizations/test_organization_id/groups/test_group_id" + Plug.Conn.send_resp(conn, 204, "") + end) + + assert {:ok, _} = + WorkOS.Groups.delete_organization_group( + client, + "test_organization_id", + "test_group_id" + ) + end + + test "list_group_organization_memberships succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + + assert conn.request_path == + "/organizations/test_organization_id/groups/test_group_id/organization-memberships" + + Req.Test.json( + conn, + WorkOS.TestFixtures.fixture("groups/list_group_organization_memberships") + ) + end) + + assert {:ok, + %WorkOS.Page{data: [%WorkOS.UserOrganizationMembershipBaseList{object: "list"} | _]}} = + WorkOS.Groups.list_group_organization_memberships( + client, + "test_organization_id", + "test_group_id" + ) + end + + test "list_group_organization_memberships handles an empty page", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + Req.Test.json(conn, %{"data" => [], "list_metadata" => %{"after" => nil}}) + end) + + assert {:ok, %WorkOS.Page{data: []} = page} = + WorkOS.Groups.list_group_organization_memberships( + client, + "test_organization_id", + "test_group_id" + ) + + refute WorkOS.Page.has_more?(page) + assert page |> WorkOS.Page.stream() |> Enum.to_list() == [] + end + + test "create_group_organization_membership succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + + assert conn.request_path == + "/organizations/test_organization_id/groups/test_group_id/organization-memberships" + + Req.Test.json( + conn, + WorkOS.TestFixtures.fixture("groups/create_group_organization_membership") + ) + end) + + assert {:ok, %WorkOS.Group{object: "group", id: "id"}} = + WorkOS.Groups.create_group_organization_membership( + client, + "test_organization_id", + "test_group_id" + ) + end + + test "delete_group_organization_membership succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "DELETE" + + assert conn.request_path == + "/organizations/test_organization_id/groups/test_group_id/organization-memberships/test_om_id" + + Plug.Conn.send_resp(conn, 204, "") + end) + + assert {:ok, _} = + WorkOS.Groups.delete_group_organization_membership( + client, + "test_organization_id", + "test_group_id", + "test_om_id" + ) + end + + test "list_organization_groups encodes query parameters", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + params = Plug.Conn.fetch_query_params(conn).query_params + assert params["before"] == "hello world&x" + refute Map.has_key?(params, "after") + Req.Test.json(conn, %{"data" => [], "list_metadata" => %{"after" => nil}}) + end) + + assert {:ok, _} = + WorkOS.Groups.list_organization_groups(client, "test_organization_id", %{ + before: "hello world&x" + }) + end + + test "list_organization_groups honors per-request options", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert Plug.Conn.get_req_header(conn, "x-custom") == ["value"] + assert conn.host == "override.example.com" + Plug.Conn.send_resp(conn, 204, "") + end) + + WorkOS.Groups.list_organization_groups(client, "test_organization_id", %{}, + headers: [{"x-custom", "value"}], + base_url: "https://override.example.com" + ) + end + + test "surfaces API errors as tagged tuples", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + conn + |> Plug.Conn.put_status(401) + |> Req.Test.json(%{"message" => "Unauthorized"}) + end) + + assert {:error, %WorkOS.ApiError{status: 401}} = + WorkOS.Groups.list_organization_groups(client, "test_organization_id") + end +end diff --git a/test/workos/jwks_test.exs b/test/workos/jwks_test.exs new file mode 100644 index 00000000..60c90ef8 --- /dev/null +++ b/test/workos/jwks_test.exs @@ -0,0 +1,37 @@ +# @oagen-ignore-file — hand-maintained tests for JWKS helpers. + +defmodule WorkOS.JWKSTest do + use ExUnit.Case, async: true + + setup do + client = + WorkOS.Client.new( + api_key: "sk_test_key", + client_id: "client_123", + req_options: [plug: {Req.Test, WorkOS.Client}] + ) + + {:ok, client: client} + end + + test "url uses the configured client_id", %{client: client} do + assert WorkOS.JWKS.url(client) == "#{client.base_url}/sso/jwks/client_123" + end + + test "url accepts an explicit client_id", %{client: client} do + assert WorkOS.JWKS.url(client, "client_456") == "#{client.base_url}/sso/jwks/client_456" + end + + test "url raises without any client_id", %{client: client} do + assert_raise ArgumentError, fn -> WorkOS.JWKS.url(%{client | client_id: nil}) end + end + + test "fetch retrieves the JWKS", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.request_path == "/sso/jwks/client_123" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("user_management/get_jwks")) + end) + + assert {:ok, %WorkOS.JwksResponse{}} = WorkOS.JWKS.fetch(client) + end +end diff --git a/test/workos/mfa_test.exs b/test/workos/mfa_test.exs deleted file mode 100644 index 537edc2a..00000000 --- a/test/workos/mfa_test.exs +++ /dev/null @@ -1,94 +0,0 @@ -defmodule WorkOS.MFATest do - use WorkOS.TestCase - - alias WorkOS.MFA.ClientMock - - setup :setup_env - - describe "enroll_factor" do - test "with a valid payload, enrolls auth factor", context do - opts = [ - type: "totp" - ] - - context |> ClientMock.enroll_factor(assert_fields: opts) - - assert {:ok, - %WorkOS.MFA.AuthenticationFactor{ - id: id - }} = - WorkOS.MFA.enroll_factor(opts |> Enum.into(%{})) - - refute is_nil(id) - end - end - - describe "challenge_factor" do - test "with a valid payload, challenges factor", context do - opts = [ - authentication_factor_id: "auth_factor_1234", - sms_template: "Your Foo Corp one-time code is {{code}}" - ] - - context |> ClientMock.challenge_factor(assert_fields: opts) - - assert {:ok, - %WorkOS.MFA.AuthenticationChallenge{ - id: id, - authentication_factor_id: authentication_factor_id - }} = - WorkOS.MFA.challenge_factor(opts |> Enum.into(%{})) - - refute is_nil(id) - refute is_nil(authentication_factor_id) - end - end - - describe "verify_challenge" do - test "with a valid payload, verifies challenge", context do - opts = [ - authentication_challenge_id: "auth_factor_1234", - code: "Foo test" - ] - - context |> ClientMock.verify_challenge(assert_fields: opts) - - assert {:ok, - %WorkOS.MFA.VerifyChallenge{ - challenge: challenge, - valid: valid - }} = - WorkOS.MFA.verify_challenge( - opts |> Keyword.get(:authentication_challenge_id), - opts |> Enum.into(%{}) - ) - - refute is_nil(challenge["id"]) - assert valid == true - end - end - - describe "delete_factor" do - test "sends a request to delete a factor", context do - opts = [authentication_factor_id: "auth_factor_1234"] - - context |> ClientMock.delete_factor(assert_fields: opts) - - assert {:ok, %WorkOS.Empty{}} = - WorkOS.MFA.delete_factor(opts |> Keyword.get(:authentication_factor_id)) - end - end - - describe "get_factor" do - test "requests a factor", context do - opts = [authentication_factor_id: "auth_factor_1234"] - - context |> ClientMock.get_factor(assert_fields: opts) - - assert {:ok, %WorkOS.MFA.AuthenticationFactor{id: id}} = - WorkOS.MFA.get_factor(opts |> Keyword.get(:authentication_factor_id)) - - refute is_nil(id) - end - end -end diff --git a/test/workos/multi_factor_auth_round_trip_test.exs b/test/workos/multi_factor_auth_round_trip_test.exs new file mode 100644 index 00000000..f96a8407 --- /dev/null +++ b/test/workos/multi_factor_auth_round_trip_test.exs @@ -0,0 +1,175 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.MultiFactorAuthRoundTripTest do + use ExUnit.Case, async: true + + test "AuthenticationChallenge round-trips between wire and struct" do + data = %{ + "object" => "authentication_challenge", + "id" => "id", + "expires_at" => "2024-01-01T00:00:00.000Z", + "code" => "code", + "authentication_factor_id" => "authentication_factor_id", + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z" + } + + serialized = + data |> WorkOS.AuthenticationChallenge.from_map() |> WorkOS.AuthenticationChallenge.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.AuthenticationChallenge.from_map() + |> WorkOS.AuthenticationChallenge.to_map() == serialized + end + + test "AuthenticationChallengeVerifyResponse round-trips between wire and struct" do + data = %{ + "challenge" => %{ + "object" => "authentication_challenge", + "id" => "id", + "expires_at" => "2024-01-01T00:00:00.000Z", + "code" => "code", + "authentication_factor_id" => "authentication_factor_id", + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z" + }, + "valid" => true + } + + serialized = + data + |> WorkOS.AuthenticationChallengeVerifyResponse.from_map() + |> WorkOS.AuthenticationChallengeVerifyResponse.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.AuthenticationChallengeVerifyResponse.from_map() + |> WorkOS.AuthenticationChallengeVerifyResponse.to_map() == serialized + end + + test "AuthenticationFactor round-trips between wire and struct" do + data = %{ + "object" => "authentication_factor", + "id" => "id", + "type" => "generic_otp", + "user_id" => "user_id", + "sms" => %{"phone_number" => "phone_number"}, + "totp" => %{"issuer" => "issuer", "user" => "user"}, + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z" + } + + serialized = + data |> WorkOS.AuthenticationFactor.from_map() |> WorkOS.AuthenticationFactor.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.AuthenticationFactor.from_map() + |> WorkOS.AuthenticationFactor.to_map() == serialized + end + + test "AuthenticationFactorEnrolled round-trips between wire and struct" do + data = %{ + "object" => "authentication_factor", + "id" => "id", + "type" => "generic_otp", + "user_id" => "user_id", + "sms" => %{"phone_number" => "phone_number"}, + "totp" => %{ + "issuer" => "issuer", + "user" => "user", + "secret" => "secret", + "qr_code" => "qr_code", + "uri" => "uri" + }, + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z" + } + + serialized = + data + |> WorkOS.AuthenticationFactorEnrolled.from_map() + |> WorkOS.AuthenticationFactorEnrolled.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.AuthenticationFactorEnrolled.from_map() + |> WorkOS.AuthenticationFactorEnrolled.to_map() == serialized + end + + test "UserAuthenticationFactorEnrollResponse round-trips between wire and struct" do + data = %{ + "authentication_factor" => %{ + "object" => "authentication_factor", + "id" => "id", + "type" => "generic_otp", + "user_id" => "user_id", + "sms" => %{"phone_number" => "phone_number"}, + "totp" => %{ + "issuer" => "issuer", + "user" => "user", + "secret" => "secret", + "qr_code" => "qr_code", + "uri" => "uri" + }, + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z" + }, + "authentication_challenge" => %{ + "object" => "authentication_challenge", + "id" => "id", + "expires_at" => "2024-01-01T00:00:00.000Z", + "code" => "code", + "authentication_factor_id" => "authentication_factor_id", + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z" + } + } + + serialized = + data + |> WorkOS.UserAuthenticationFactorEnrollResponse.from_map() + |> WorkOS.UserAuthenticationFactorEnrollResponse.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.UserAuthenticationFactorEnrollResponse.from_map() + |> WorkOS.UserAuthenticationFactorEnrollResponse.to_map() == serialized + end + + test "UserAuthenticationFactorList round-trips between wire and struct" do + data = %{ + "object" => "list", + "data" => [ + %{ + "object" => "authentication_factor", + "id" => "id", + "type" => "generic_otp", + "user_id" => "user_id", + "sms" => %{"phone_number" => "phone_number"}, + "totp" => %{"issuer" => "issuer", "user" => "user"}, + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z" + } + ], + "list_metadata" => %{"before" => "before", "after" => "after"} + } + + serialized = + data + |> WorkOS.UserAuthenticationFactorList.from_map() + |> WorkOS.UserAuthenticationFactorList.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.UserAuthenticationFactorList.from_map() + |> WorkOS.UserAuthenticationFactorList.to_map() == serialized + end +end diff --git a/test/workos/multi_factor_auth_test.exs b/test/workos/multi_factor_auth_test.exs new file mode 100644 index 00000000..8c0db65c --- /dev/null +++ b/test/workos/multi_factor_auth_test.exs @@ -0,0 +1,145 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.MultiFactorAuthTest do + use ExUnit.Case, async: true + + setup do + client = + WorkOS.Client.new( + api_key: "sk_test_key", + req_options: [plug: {Req.Test, WorkOS.Client}] + ) + + {:ok, client: client} + end + + test "verify_challenge succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/auth/challenges/test_id/verify" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("multi_factor_auth/verify_challenge")) + end) + + assert {:ok, %WorkOS.AuthenticationChallengeVerifyResponse{valid: true}} = + WorkOS.MultiFactorAuth.verify_challenge(client, "test_id") + end + + test "enroll_factor succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/auth/factors/enroll" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("multi_factor_auth/enroll_factor")) + end) + + assert {:ok, %WorkOS.AuthenticationFactorEnrolled{object: "authentication_factor", id: "id"}} = + WorkOS.MultiFactorAuth.enroll_factor(client) + end + + test "get_factor succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/auth/factors/test_id" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("multi_factor_auth/get_factor")) + end) + + assert {:ok, %WorkOS.AuthenticationFactor{object: "authentication_factor", id: "id"}} = + WorkOS.MultiFactorAuth.get_factor(client, "test_id") + end + + test "delete_factor succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "DELETE" + assert conn.request_path == "/auth/factors/test_id" + Plug.Conn.send_resp(conn, 204, "") + end) + + assert {:ok, _} = WorkOS.MultiFactorAuth.delete_factor(client, "test_id") + end + + test "challenge_factor succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/auth/factors/test_id/challenge" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("multi_factor_auth/challenge_factor")) + end) + + assert {:ok, %WorkOS.AuthenticationChallenge{object: "authentication_challenge", id: "id"}} = + WorkOS.MultiFactorAuth.challenge_factor(client, "test_id") + end + + test "list_user_auth_factors succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/user_management/users/test_userland_user_id/auth_factors" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("multi_factor_auth/list_user_auth_factors")) + end) + + assert {:ok, %WorkOS.Page{data: [%WorkOS.UserAuthenticationFactorList{object: "list"} | _]}} = + WorkOS.MultiFactorAuth.list_user_auth_factors(client, "test_userland_user_id") + end + + test "list_user_auth_factors handles an empty page", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + Req.Test.json(conn, %{"data" => [], "list_metadata" => %{"after" => nil}}) + end) + + assert {:ok, %WorkOS.Page{data: []} = page} = + WorkOS.MultiFactorAuth.list_user_auth_factors(client, "test_userland_user_id") + + refute WorkOS.Page.has_more?(page) + assert page |> WorkOS.Page.stream() |> Enum.to_list() == [] + end + + test "create_user_auth_factor succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/user_management/users/test_userland_user_id/auth_factors" + + Req.Test.json( + conn, + WorkOS.TestFixtures.fixture("multi_factor_auth/create_user_auth_factor") + ) + end) + + assert {:ok, %WorkOS.UserAuthenticationFactorEnrollResponse{}} = + WorkOS.MultiFactorAuth.create_user_auth_factor(client, "test_userland_user_id") + end + + test "list_user_auth_factors encodes query parameters", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + params = Plug.Conn.fetch_query_params(conn).query_params + assert params["before"] == "hello world&x" + refute Map.has_key?(params, "after") + Req.Test.json(conn, %{"data" => [], "list_metadata" => %{"after" => nil}}) + end) + + assert {:ok, _} = + WorkOS.MultiFactorAuth.list_user_auth_factors(client, "test_userland_user_id", %{ + before: "hello world&x" + }) + end + + test "verify_challenge honors per-request options", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert Plug.Conn.get_req_header(conn, "x-custom") == ["value"] + assert conn.host == "override.example.com" + Plug.Conn.send_resp(conn, 204, "") + end) + + WorkOS.MultiFactorAuth.verify_challenge(client, "test_id", %{}, + headers: [{"x-custom", "value"}], + base_url: "https://override.example.com" + ) + end + + test "surfaces API errors as tagged tuples", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + conn + |> Plug.Conn.put_status(401) + |> Req.Test.json(%{"message" => "Unauthorized"}) + end) + + assert {:error, %WorkOS.ApiError{status: 401}} = + WorkOS.MultiFactorAuth.verify_challenge(client, "test_id") + end +end diff --git a/test/workos/organization_domains_round_trip_test.exs b/test/workos/organization_domains_round_trip_test.exs new file mode 100644 index 00000000..923435e2 --- /dev/null +++ b/test/workos/organization_domains_round_trip_test.exs @@ -0,0 +1,29 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationDomainsRoundTripTest do + use ExUnit.Case, async: true + + test "OrganizationDomain round-trips between wire and struct" do + data = %{ + "object" => "organization_domain", + "id" => "id", + "organization_id" => "organization_id", + "domain" => "domain", + "state" => "failed", + "verification_prefix" => "verification_prefix", + "verification_token" => "verification_token", + "verification_strategy" => "dns", + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z" + } + + serialized = + data |> WorkOS.OrganizationDomain.from_map() |> WorkOS.OrganizationDomain.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.OrganizationDomain.from_map() + |> WorkOS.OrganizationDomain.to_map() == serialized + end +end diff --git a/test/workos/organization_domains_test.exs b/test/workos/organization_domains_test.exs index f27089fe..04af16af 100644 --- a/test/workos/organization_domains_test.exs +++ b/test/workos/organization_domains_test.exs @@ -1,52 +1,94 @@ +# This file is auto-generated by oagen. Do not edit. + defmodule WorkOS.OrganizationDomainsTest do - use WorkOS.TestCase + use ExUnit.Case, async: true + + setup do + client = + WorkOS.Client.new( + api_key: "sk_test_key", + req_options: [plug: {Req.Test, WorkOS.Client}] + ) + + {:ok, client: client} + end - alias WorkOS.OrganizationDomains.ClientMock + test "create_organization_domain succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/organization_domains" - setup :setup_env + Req.Test.json( + conn, + WorkOS.TestFixtures.fixture("organization_domains/create_organization_domain") + ) + end) - describe "get_organization_domain" do - test "requests an organization domain", context do - opts = [organization_domain_id: "org_domain_01HCZRAP3TPQ0X0DKJHR32TATG"] + assert {:ok, %WorkOS.OrganizationDomain{object: "organization_domain", id: "id"}} = + WorkOS.OrganizationDomains.create_organization_domain(client) + end - context |> ClientMock.get_organization_domain(assert_fields: opts) + test "get_organization_domain succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/organization_domains/test_id" - assert {:ok, %WorkOS.OrganizationDomains.OrganizationDomain{id: id}} = - WorkOS.OrganizationDomains.get_organization_domain( - opts - |> Keyword.get(:organization_domain_id) - ) + Req.Test.json( + conn, + WorkOS.TestFixtures.fixture("organization_domains/get_organization_domain") + ) + end) - refute is_nil(id) - end + assert {:ok, %WorkOS.OrganizationDomain{object: "organization_domain", id: "id"}} = + WorkOS.OrganizationDomains.get_organization_domain(client, "test_id") end - describe "create_organization_domain" do - test "with a valid payload, creates an organization domain", context do - opts = [organization_id: "org_01HCZRAP3TPQ0X0DKJHR32TATG", domain: "workos.com"] + test "delete_organization_domain succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "DELETE" + assert conn.request_path == "/organization_domains/test_id" + Plug.Conn.send_resp(conn, 204, "") + end) + + assert {:ok, _} = WorkOS.OrganizationDomains.delete_organization_domain(client, "test_id") + end - context |> ClientMock.create_organization_domain(assert_fields: opts) + test "verify_organization_domain succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/organization_domains/test_id/verify" - assert {:ok, %WorkOS.OrganizationDomains.OrganizationDomain{id: id}} = - WorkOS.OrganizationDomains.create_organization_domain(opts |> Enum.into(%{})) + Req.Test.json( + conn, + WorkOS.TestFixtures.fixture("organization_domains/verify_organization_domain") + ) + end) - refute is_nil(id) - end + assert {:ok, %WorkOS.OrganizationDomain{object: "organization_domain", id: "id"}} = + WorkOS.OrganizationDomains.verify_organization_domain(client, "test_id") end - describe "verify_organization_domain" do - test "verifies an organization domain", context do - opts = [organization_domain_id: "org_domain_01HCZRAP3TPQ0X0DKJHR32TATG"] + test "create_organization_domain honors per-request options", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert Plug.Conn.get_req_header(conn, "x-custom") == ["value"] + assert conn.host == "override.example.com" + Plug.Conn.send_resp(conn, 204, "") + end) - context |> ClientMock.verify_organization_domain(assert_fields: opts) + WorkOS.OrganizationDomains.create_organization_domain(client, %{}, + headers: [{"x-custom", "value"}], + base_url: "https://override.example.com" + ) + end - assert {:ok, %WorkOS.OrganizationDomains.OrganizationDomain{id: id}} = - WorkOS.OrganizationDomains.verify_organization_domain( - opts - |> Keyword.get(:organization_domain_id) - ) + test "surfaces API errors as tagged tuples", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + conn + |> Plug.Conn.put_status(401) + |> Req.Test.json(%{"message" => "Unauthorized"}) + end) - refute is_nil(id) - end + assert {:error, %WorkOS.ApiError{status: 401}} = + WorkOS.OrganizationDomains.create_organization_domain(client) end end diff --git a/test/workos/organization_membership_service_round_trip_test.exs b/test/workos/organization_membership_service_round_trip_test.exs new file mode 100644 index 00000000..7485470c --- /dev/null +++ b/test/workos/organization_membership_service_round_trip_test.exs @@ -0,0 +1,164 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationMembershipServiceRoundTripTest do + use ExUnit.Case, async: true + + test "GroupList round-trips between wire and struct" do + data = %{ + "object" => "list", + "data" => [ + %{ + "object" => "group", + "id" => "id", + "organization_id" => "organization_id", + "name" => "name", + "description" => "description", + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z" + } + ], + "list_metadata" => %{"before" => "before", "after" => "after"} + } + + serialized = data |> WorkOS.GroupList.from_map() |> WorkOS.GroupList.to_map() + assert serialized == data + + assert serialized |> WorkOS.GroupList.from_map() |> WorkOS.GroupList.to_map() == serialized + end + + test "OrganizationMembership round-trips between wire and struct" do + data = %{ + "object" => "organization_membership", + "id" => "id", + "user_id" => "user_id", + "organization_id" => "organization_id", + "status" => "active", + "directory_managed" => true, + "organization_name" => "organization_name", + "custom_attributes" => %{}, + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z", + "role" => %{"slug" => "slug"}, + "roles" => [%{"slug" => "slug"}], + "user" => %{ + "object" => "user", + "id" => "id", + "first_name" => "first_name", + "last_name" => "last_name", + "name" => "name", + "profile_picture_url" => "profile_picture_url", + "email" => "email", + "email_verified" => true, + "external_id" => "external_id", + "metadata" => %{}, + "last_sign_in_at" => "2024-01-01T00:00:00.000Z", + "locale" => "locale", + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z" + } + } + + serialized = + data |> WorkOS.OrganizationMembership.from_map() |> WorkOS.OrganizationMembership.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.OrganizationMembership.from_map() + |> WorkOS.OrganizationMembership.to_map() == serialized + end + + test "UserOrganizationMembership round-trips between wire and struct" do + data = %{ + "object" => "organization_membership", + "id" => "id", + "user_id" => "user_id", + "organization_id" => "organization_id", + "status" => "active", + "directory_managed" => true, + "organization_name" => "organization_name", + "custom_attributes" => %{}, + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z", + "role" => %{"slug" => "slug"}, + "roles" => [%{"slug" => "slug"}], + "user" => %{ + "object" => "user", + "id" => "id", + "first_name" => "first_name", + "last_name" => "last_name", + "name" => "name", + "profile_picture_url" => "profile_picture_url", + "email" => "email", + "email_verified" => true, + "external_id" => "external_id", + "metadata" => %{}, + "last_sign_in_at" => "2024-01-01T00:00:00.000Z", + "locale" => "locale", + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z" + } + } + + serialized = + data + |> WorkOS.UserOrganizationMembership.from_map() + |> WorkOS.UserOrganizationMembership.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.UserOrganizationMembership.from_map() + |> WorkOS.UserOrganizationMembership.to_map() == serialized + end + + test "UserOrganizationMembershipList round-trips between wire and struct" do + data = %{ + "object" => "list", + "data" => [ + %{ + "object" => "organization_membership", + "id" => "id", + "user_id" => "user_id", + "organization_id" => "organization_id", + "status" => "active", + "directory_managed" => true, + "organization_name" => "organization_name", + "custom_attributes" => %{}, + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z", + "role" => %{"slug" => "slug"}, + "roles" => [%{}], + "user" => %{ + "object" => "user", + "id" => "id", + "first_name" => "first_name", + "last_name" => "last_name", + "name" => "name", + "profile_picture_url" => "profile_picture_url", + "email" => "email", + "email_verified" => true, + "external_id" => "external_id", + "metadata" => %{}, + "last_sign_in_at" => "2024-01-01T00:00:00.000Z", + "locale" => "locale", + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z" + } + } + ], + "list_metadata" => %{"before" => "before", "after" => "after"} + } + + serialized = + data + |> WorkOS.UserOrganizationMembershipList.from_map() + |> WorkOS.UserOrganizationMembershipList.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.UserOrganizationMembershipList.from_map() + |> WorkOS.UserOrganizationMembershipList.to_map() == serialized + end +end diff --git a/test/workos/organization_membership_service_test.exs b/test/workos/organization_membership_service_test.exs new file mode 100644 index 00000000..59ac8803 --- /dev/null +++ b/test/workos/organization_membership_service_test.exs @@ -0,0 +1,213 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationMembershipServiceTest do + use ExUnit.Case, async: true + + setup do + client = + WorkOS.Client.new( + api_key: "sk_test_key", + req_options: [plug: {Req.Test, WorkOS.Client}] + ) + + {:ok, client: client} + end + + test "list_organization_memberships succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/user_management/organization_memberships" + + Req.Test.json( + conn, + WorkOS.TestFixtures.fixture("organization_membership/list_organization_memberships") + ) + end) + + assert {:ok, %WorkOS.Page{data: [%WorkOS.UserOrganizationMembershipList{object: "list"} | _]}} = + WorkOS.OrganizationMembershipService.list_organization_memberships(client) + end + + test "list_organization_memberships handles an empty page", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + Req.Test.json(conn, %{"data" => [], "list_metadata" => %{"after" => nil}}) + end) + + assert {:ok, %WorkOS.Page{data: []} = page} = + WorkOS.OrganizationMembershipService.list_organization_memberships(client) + + refute WorkOS.Page.has_more?(page) + assert page |> WorkOS.Page.stream() |> Enum.to_list() == [] + end + + test "create_organization_membership succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/user_management/organization_memberships" + + Req.Test.json( + conn, + WorkOS.TestFixtures.fixture("organization_membership/create_organization_membership") + ) + end) + + assert {:ok, %WorkOS.OrganizationMembership{object: "organization_membership", id: "id"}} = + WorkOS.OrganizationMembershipService.create_organization_membership(client) + end + + test "get_organization_membership succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/user_management/organization_memberships/test_id" + + Req.Test.json( + conn, + WorkOS.TestFixtures.fixture("organization_membership/get_organization_membership") + ) + end) + + assert {:ok, %WorkOS.UserOrganizationMembership{object: "organization_membership", id: "id"}} = + WorkOS.OrganizationMembershipService.get_organization_membership(client, "test_id") + end + + test "update_organization_membership succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "PUT" + assert conn.request_path == "/user_management/organization_memberships/test_id" + + Req.Test.json( + conn, + WorkOS.TestFixtures.fixture("organization_membership/update_organization_membership") + ) + end) + + assert {:ok, %WorkOS.UserOrganizationMembership{object: "organization_membership", id: "id"}} = + WorkOS.OrganizationMembershipService.update_organization_membership( + client, + "test_id" + ) + end + + test "delete_organization_membership succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "DELETE" + assert conn.request_path == "/user_management/organization_memberships/test_id" + Plug.Conn.send_resp(conn, 204, "") + end) + + assert {:ok, _} = + WorkOS.OrganizationMembershipService.delete_organization_membership( + client, + "test_id" + ) + end + + test "deactivate_organization_membership succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "PUT" + assert conn.request_path == "/user_management/organization_memberships/test_id/deactivate" + + Req.Test.json( + conn, + WorkOS.TestFixtures.fixture("organization_membership/deactivate_organization_membership") + ) + end) + + assert {:ok, %WorkOS.OrganizationMembership{object: "organization_membership", id: "id"}} = + WorkOS.OrganizationMembershipService.deactivate_organization_membership( + client, + "test_id" + ) + end + + test "reactivate_organization_membership succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "PUT" + assert conn.request_path == "/user_management/organization_memberships/test_id/reactivate" + + Req.Test.json( + conn, + WorkOS.TestFixtures.fixture("organization_membership/reactivate_organization_membership") + ) + end) + + assert {:ok, %WorkOS.UserOrganizationMembership{object: "organization_membership", id: "id"}} = + WorkOS.OrganizationMembershipService.reactivate_organization_membership( + client, + "test_id" + ) + end + + test "list_organization_membership_groups succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/user_management/organization_memberships/test_om_id/groups" + + Req.Test.json( + conn, + WorkOS.TestFixtures.fixture("organization_membership/list_organization_membership_groups") + ) + end) + + assert {:ok, %WorkOS.Page{data: [%WorkOS.GroupList{object: "list"} | _]}} = + WorkOS.OrganizationMembershipService.list_organization_membership_groups( + client, + "test_om_id" + ) + end + + test "list_organization_membership_groups handles an empty page", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + Req.Test.json(conn, %{"data" => [], "list_metadata" => %{"after" => nil}}) + end) + + assert {:ok, %WorkOS.Page{data: []} = page} = + WorkOS.OrganizationMembershipService.list_organization_membership_groups( + client, + "test_om_id" + ) + + refute WorkOS.Page.has_more?(page) + assert page |> WorkOS.Page.stream() |> Enum.to_list() == [] + end + + test "list_organization_memberships encodes query parameters", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + params = Plug.Conn.fetch_query_params(conn).query_params + assert params["before"] == "hello world&x" + assert params["statuses"] == "a,b" + refute Map.has_key?(params, "after") + Req.Test.json(conn, %{"data" => [], "list_metadata" => %{"after" => nil}}) + end) + + assert {:ok, _} = + WorkOS.OrganizationMembershipService.list_organization_memberships(client, %{ + before: "hello world&x", + statuses: ["a", "b"] + }) + end + + test "list_organization_memberships honors per-request options", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert Plug.Conn.get_req_header(conn, "x-custom") == ["value"] + assert conn.host == "override.example.com" + Plug.Conn.send_resp(conn, 204, "") + end) + + WorkOS.OrganizationMembershipService.list_organization_memberships(client, %{}, + headers: [{"x-custom", "value"}], + base_url: "https://override.example.com" + ) + end + + test "surfaces API errors as tagged tuples", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + conn + |> Plug.Conn.put_status(401) + |> Req.Test.json(%{"message" => "Unauthorized"}) + end) + + assert {:error, %WorkOS.ApiError{status: 401}} = + WorkOS.OrganizationMembershipService.list_organization_memberships(client) + end +end diff --git a/test/workos/organizations_round_trip_test.exs b/test/workos/organizations_round_trip_test.exs new file mode 100644 index 00000000..b6142f6e --- /dev/null +++ b/test/workos/organizations_round_trip_test.exs @@ -0,0 +1,127 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.OrganizationsRoundTripTest do + use ExUnit.Case, async: true + + test "AuditLogConfiguration round-trips between wire and struct" do + data = %{ + "organization_id" => "organization_id", + "retention_period_in_days" => 1, + "state" => "active", + "log_stream" => %{ + "id" => "id", + "type" => "AzureSentinel", + "state" => "active", + "last_synced_at" => "last_synced_at", + "created_at" => "2024-01-01T00:00:00.000Z" + } + } + + serialized = + data |> WorkOS.AuditLogConfiguration.from_map() |> WorkOS.AuditLogConfiguration.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.AuditLogConfiguration.from_map() + |> WorkOS.AuditLogConfiguration.to_map() == serialized + end + + test "Organization round-trips between wire and struct" do + data = %{ + "object" => "organization", + "id" => "id", + "name" => "name", + "domains" => [ + %{ + "object" => "organization_domain", + "id" => "id", + "organization_id" => "organization_id", + "domain" => "domain", + "state" => "failed", + "verification_prefix" => "verification_prefix", + "verification_token" => "verification_token", + "verification_strategy" => "dns", + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z" + } + ], + "metadata" => %{}, + "external_id" => "external_id", + "stripe_customer_id" => "stripe_customer_id", + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z", + "allow_profiles_outside_organization" => true + } + + serialized = data |> WorkOS.Organization.from_map() |> WorkOS.Organization.to_map() + assert serialized == data + + assert serialized |> WorkOS.Organization.from_map() |> WorkOS.Organization.to_map() == + serialized + end + + test "OrganizationAuthorizedConnectApplicationList round-trips between wire and struct" do + data = %{ + "object" => "list", + "data" => [ + %{ + "object" => "authorized_connect_application", + "id" => "id", + "granted_scopes" => ["granted_scopes"], + "oauth_resource" => "oauth_resource", + "application" => %{ + "object" => "connect_application", + "id" => "id", + "client_id" => "client_id", + "description" => "description", + "name" => "name", + "scopes" => [], + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z" + }, + "user_id" => "user_id" + } + ], + "list_metadata" => %{"before" => "before", "after" => "after"} + } + + serialized = + data + |> WorkOS.OrganizationAuthorizedConnectApplicationList.from_map() + |> WorkOS.OrganizationAuthorizedConnectApplicationList.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.OrganizationAuthorizedConnectApplicationList.from_map() + |> WorkOS.OrganizationAuthorizedConnectApplicationList.to_map() == serialized + end + + test "OrganizationList round-trips between wire and struct" do + data = %{ + "object" => "list", + "data" => [ + %{ + "object" => "organization", + "id" => "id", + "name" => "name", + "domains" => [%{}], + "metadata" => %{}, + "external_id" => "external_id", + "stripe_customer_id" => "stripe_customer_id", + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z", + "allow_profiles_outside_organization" => true + } + ], + "list_metadata" => %{"before" => "before", "after" => "after"} + } + + serialized = data |> WorkOS.OrganizationList.from_map() |> WorkOS.OrganizationList.to_map() + assert serialized == data + + assert serialized |> WorkOS.OrganizationList.from_map() |> WorkOS.OrganizationList.to_map() == + serialized + end +end diff --git a/test/workos/organizations_test.exs b/test/workos/organizations_test.exs index 0335ca7c..043e57c3 100644 --- a/test/workos/organizations_test.exs +++ b/test/workos/organizations_test.exs @@ -1,160 +1,181 @@ -defmodule WorkOS.OrganizationsTest do - use WorkOS.TestCase +# This file is auto-generated by oagen. Do not edit. - alias WorkOS.Organizations.ClientMock +defmodule WorkOS.OrganizationsTest do + use ExUnit.Case, async: true - setup :setup_env + setup do + client = + WorkOS.Client.new( + api_key: "sk_test_key", + req_options: [plug: {Req.Test, WorkOS.Client}] + ) - describe "list_organizations" do - test "without any options, returns organizations and metadata", context do - context - |> ClientMock.list_organizations() + {:ok, client: client} + end - assert {:ok, - %WorkOS.List{ - data: [%WorkOS.Organizations.Organization{}, %WorkOS.Organizations.Organization{}], - list_metadata: %{} - }} = WorkOS.Organizations.list_organizations() - end + test "list_organizations succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/organizations" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("organizations/list_organizations")) + end) - test "with the domain option, forms the proper request to the API", context do - opts = [domains: ["example.com"]] + assert {:ok, %WorkOS.Page{data: [%WorkOS.OrganizationList{object: "list"} | _]}} = + WorkOS.Organizations.list_organizations(client) + end - context - |> ClientMock.list_organizations(assert_fields: opts) + test "list_organizations handles an empty page", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + Req.Test.json(conn, %{"data" => [], "list_metadata" => %{"after" => nil}}) + end) - assert {:ok, - %WorkOS.List{ - data: [%WorkOS.Organizations.Organization{}, %WorkOS.Organizations.Organization{}], - list_metadata: %{} - }} = WorkOS.Organizations.list_organizations(opts |> Enum.into(%{})) - end + assert {:ok, %WorkOS.Page{data: []} = page} = WorkOS.Organizations.list_organizations(client) + refute WorkOS.Page.has_more?(page) + assert page |> WorkOS.Page.stream() |> Enum.to_list() == [] end - describe "delete_organization" do - test "sends a request to delete an organization", context do - opts = [organization_id: "org_01EHT88Z8J8795GZNQ4ZP1J81T"] + test "create_organization succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/organizations" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("organizations/create_organization")) + end) - context |> ClientMock.delete_organization(assert_fields: opts) - - assert {:ok, %WorkOS.Empty{}} = - WorkOS.Organizations.delete_organization(opts |> Keyword.get(:organization_id)) - end + assert {:ok, %WorkOS.Organization{object: "organization", id: "id"}} = + WorkOS.Organizations.create_organization(client) end - describe "get_organization" do - test "requests an organization", context do - opts = [organization_id: "org_01EHT88Z8J8795GZNQ4ZP1J81T"] - - context |> ClientMock.get_organization(assert_fields: opts) + test "get_organization_by_external_id succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/organizations/external_id/test_external_id" - assert {:ok, %WorkOS.Organizations.Organization{id: id}} = - WorkOS.Organizations.get_organization(opts |> Keyword.get(:organization_id)) + Req.Test.json( + conn, + WorkOS.TestFixtures.fixture("organizations/get_organization_by_external_id") + ) + end) - refute is_nil(id) - end + assert {:ok, %WorkOS.Organization{object: "organization", id: "id"}} = + WorkOS.Organizations.get_organization_by_external_id(client, "test_external_id") end - describe "get_organization_by_external_id" do - test "requests an organization by external_id", context do - opts = [external_id: "ext_org_123"] - context |> ClientMock.get_organization_by_external_id(assert_fields: opts) + test "get_organization succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/organizations/test_id" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("organizations/get_organization")) + end) - assert {:ok, %WorkOS.Organizations.Organization{id: id, external_id: external_id}} = - WorkOS.Organizations.get_organization_by_external_id( - opts - |> Keyword.get(:external_id) - ) - - refute is_nil(id) - assert external_id == "ext_org_123" - end + assert {:ok, %WorkOS.Organization{object: "organization", id: "id"}} = + WorkOS.Organizations.get_organization(client, "test_id") end - describe "create_organization" do - test "with an idempotency key, includes an idempotency key with request", context do - opts = [ - domain_data: [%{"domain" => "example.com", "state" => "pending"}], - name: "Test Organization", - idempotency_key: "the-idempotency-key" - ] - - context |> ClientMock.create_organization(assert_fields: opts) + test "update_organization succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "PUT" + assert conn.request_path == "/organizations/test_id" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("organizations/update_organization")) + end) - assert {:ok, %WorkOS.Organizations.Organization{id: id}} = - WorkOS.Organizations.create_organization(opts |> Enum.into(%{})) + assert {:ok, %WorkOS.Organization{object: "organization", id: "id"}} = + WorkOS.Organizations.update_organization(client, "test_id") + end - refute is_nil(id) - end + test "delete_organization succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "DELETE" + assert conn.request_path == "/organizations/test_id" + Plug.Conn.send_resp(conn, 204, "") + end) - test "with a valid payload, creates an organization", context do - opts = [ - domain_data: [%{"domain" => "example.com", "state" => "pending"}], - name: "Test Organization" - ] + assert {:ok, _} = WorkOS.Organizations.delete_organization(client, "test_id") + end - context |> ClientMock.create_organization(assert_fields: opts) + test "get_audit_log_configuration succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/organizations/test_id/audit_log_configuration" + + Req.Test.json( + conn, + WorkOS.TestFixtures.fixture("organizations/get_audit_log_configuration") + ) + end) + + assert {:ok, + %WorkOS.AuditLogConfiguration{ + organization_id: "organization_id", + retention_period_in_days: 1 + }} = WorkOS.Organizations.get_audit_log_configuration(client, "test_id") + end - assert {:ok, %WorkOS.Organizations.Organization{id: id}} = - WorkOS.Organizations.create_organization(opts |> Enum.into(%{})) + test "list_authorized_applications succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/organizations/test_organization_id/authorized_applications" + + Req.Test.json( + conn, + WorkOS.TestFixtures.fixture("organizations/list_authorized_applications") + ) + end) + + assert {:ok, + %WorkOS.Page{ + data: [%WorkOS.OrganizationAuthorizedConnectApplicationList{object: "list"} | _] + }} = WorkOS.Organizations.list_authorized_applications(client, "test_organization_id") + end - refute is_nil(id) - end + test "list_authorized_applications handles an empty page", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + Req.Test.json(conn, %{"data" => [], "list_metadata" => %{"after" => nil}}) + end) - test "with external_id, creates an organization with external_id", context do - opts = [ - domain_data: [%{"domain" => "example.com", "state" => "pending"}], - name: "Test Organization", - external_id: "ext_org_123" - ] + assert {:ok, %WorkOS.Page{data: []} = page} = + WorkOS.Organizations.list_authorized_applications(client, "test_organization_id") - context |> ClientMock.create_organization(assert_fields: opts) + refute WorkOS.Page.has_more?(page) + assert page |> WorkOS.Page.stream() |> Enum.to_list() == [] + end - assert {:ok, %WorkOS.Organizations.Organization{id: id, external_id: external_id}} = - WorkOS.Organizations.create_organization(opts |> Enum.into(%{})) + test "list_organizations encodes query parameters", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + params = Plug.Conn.fetch_query_params(conn).query_params + assert params["before"] == "hello world&x" + assert params["domains"] == "a,b" + refute Map.has_key?(params, "after") + Req.Test.json(conn, %{"data" => [], "list_metadata" => %{"after" => nil}}) + end) + + assert {:ok, _} = + WorkOS.Organizations.list_organizations(client, %{ + before: "hello world&x", + domains: ["a", "b"] + }) + end - refute is_nil(id) - assert external_id == "ext_org_123" - end + test "list_organizations honors per-request options", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert Plug.Conn.get_req_header(conn, "x-custom") == ["value"] + assert conn.host == "override.example.com" + Plug.Conn.send_resp(conn, 204, "") + end) + + WorkOS.Organizations.list_organizations(client, %{}, + headers: [{"x-custom", "value"}], + base_url: "https://override.example.com" + ) end - describe "update_organization" do - test "with a valid payload, updates an organization", context do - opts = [ - organization_id: "org_01EHT88Z8J8795GZNQ4ZP1J81T", - domain_data: [%{"domain" => "example.com", "state" => "pending"}], - name: "Test Organization 2" - ] - - context |> ClientMock.update_organization(assert_fields: opts) - - assert {:ok, %WorkOS.Organizations.Organization{id: id}} = - WorkOS.Organizations.update_organization( - opts |> Keyword.get(:organization_id), - opts |> Enum.into(%{}) - ) - - refute is_nil(id) - end - - test "with external_id, updates an organization with external_id", context do - opts = [ - organization_id: "org_01EHT88Z8J8795GZNQ4ZP1J81T", - domain_data: [%{"domain" => "example.com", "state" => "pending"}], - name: "Test Organization 2", - external_id: "ext_org_456" - ] - - context |> ClientMock.update_organization(assert_fields: opts) - - assert {:ok, %WorkOS.Organizations.Organization{id: id, external_id: external_id}} = - WorkOS.Organizations.update_organization( - opts |> Keyword.get(:organization_id), - opts |> Enum.into(%{}) - ) - - refute is_nil(id) - assert external_id == "ext_org_456" - end + test "surfaces API errors as tagged tuples", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + conn + |> Plug.Conn.put_status(401) + |> Req.Test.json(%{"message" => "Unauthorized"}) + end) + + assert {:error, %WorkOS.ApiError{status: 401}} = + WorkOS.Organizations.list_organizations(client) end end diff --git a/test/workos/passwordless_test.exs b/test/workos/passwordless_test.exs index 594a8037..8777c313 100644 --- a/test/workos/passwordless_test.exs +++ b/test/workos/passwordless_test.exs @@ -1,37 +1,63 @@ -defmodule WorkOS.PasswordlessTest do - use WorkOS.TestCase - - alias WorkOS.Passwordless.ClientMock - - setup :setup_env +# @oagen-ignore-file — hand-maintained tests for the hand-maintained Passwordless module. - describe "create_session" do - test "with valid options, creates a passwordless session", context do - opts = [ - email: "passwordless-session-email@workos.com", - type: "MagicLink", - redirect_uri: "https://example.com/passwordless/callback" - ] +defmodule WorkOS.PasswordlessTest do + use ExUnit.Case, async: true - context |> ClientMock.create_session(assert_fields: opts) + setup do + client = + WorkOS.Client.new( + api_key: "sk_test_key", + req_options: [plug: {Req.Test, WorkOS.Client}] + ) - assert {:ok, %WorkOS.Passwordless.Session{email: email}} = - WorkOS.Passwordless.create_session(opts |> Enum.into(%{})) + {:ok, client: client} + end - refute is_nil(email) - end + test "create_session posts to /passwordless/sessions and defaults the type", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/passwordless/sessions" + + {:ok, req_body, conn} = Plug.Conn.read_body(conn) + req_body = JSON.decode!(req_body) + assert req_body["email"] == "user@example.com" + assert req_body["type"] == "MagicLink" + + Req.Test.json(conn, %{ + "id" => "passwordless_session_123", + "email" => "user@example.com", + "expires_at" => "2026-01-01T00:00:00.000Z", + "link" => "https://auth.workos.com/passwordless/token/confirm", + "object" => "passwordless_session" + }) + end) + + assert {:ok, %WorkOS.Passwordless.Session{} = session} = + WorkOS.Passwordless.create_session(client, %{email: "user@example.com"}) + + assert session.id == "passwordless_session_123" + assert session.link =~ "workos.com" end - describe "send_session" do - test "with a valid session id, sends a request to send a magic link email", context do - opts = [session_id: "session_123"] + test "send_session posts to /passwordless/sessions/:id/send", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/passwordless/sessions/passwordless_session_123/send" + Req.Test.json(conn, %{"success" => true}) + end) - context |> ClientMock.send_session(assert_fields: opts) + assert {:ok, %{"success" => true}} = + WorkOS.Passwordless.send_session(client, "passwordless_session_123") + end - assert {:ok, %WorkOS.Passwordless.Session.Send{success: success}} = - WorkOS.Passwordless.send_session(opts |> Keyword.get(:session_id)) + test "surfaces API errors as tagged tuples", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + conn + |> Plug.Conn.put_status(422) + |> Req.Test.json(%{"message" => "Email required"}) + end) - assert success == true - end + assert {:error, %WorkOS.ApiError{status: 422}} = + WorkOS.Passwordless.create_session(client, %{}) end end diff --git a/test/workos/pipes_provider_round_trip_test.exs b/test/workos/pipes_provider_round_trip_test.exs new file mode 100644 index 00000000..c06ad7e2 --- /dev/null +++ b/test/workos/pipes_provider_round_trip_test.exs @@ -0,0 +1,76 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.PipesProviderRoundTripTest do + use ExUnit.Case, async: true + + test "DataIntegrationConfigurationListResponse round-trips between wire and struct" do + data = %{ + "object" => "list", + "data" => [ + %{ + "object" => "data_integration_configuration", + "id" => "id", + "organization_id" => "organization_id", + "slug" => "slug", + "name" => "name", + "enabled" => true, + "scopes" => ["scopes"], + "config" => %{}, + "created_at" => "created_at", + "updated_at" => "updated_at", + "credentials" => %{ + "credentials_type" => "shared", + "has_credentials" => true, + "client_id" => "client_id", + "client_secret_last_four" => "client_secret_last_four", + "redirect_uri" => "redirect_uri" + } + } + ] + } + + serialized = + data + |> WorkOS.DataIntegrationConfigurationListResponse.from_map() + |> WorkOS.DataIntegrationConfigurationListResponse.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.DataIntegrationConfigurationListResponse.from_map() + |> WorkOS.DataIntegrationConfigurationListResponse.to_map() == serialized + end + + test "DataIntegrationConfigurationResponse round-trips between wire and struct" do + data = %{ + "object" => "data_integration_configuration", + "id" => "id", + "organization_id" => "organization_id", + "slug" => "slug", + "name" => "name", + "enabled" => true, + "scopes" => ["scopes"], + "config" => %{}, + "created_at" => "created_at", + "updated_at" => "updated_at", + "credentials" => %{ + "credentials_type" => "shared", + "has_credentials" => true, + "client_id" => "client_id", + "client_secret_last_four" => "client_secret_last_four", + "redirect_uri" => "redirect_uri" + } + } + + serialized = + data + |> WorkOS.DataIntegrationConfigurationResponse.from_map() + |> WorkOS.DataIntegrationConfigurationResponse.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.DataIntegrationConfigurationResponse.from_map() + |> WorkOS.DataIntegrationConfigurationResponse.to_map() == serialized + end +end diff --git a/test/workos/pipes_provider_test.exs b/test/workos/pipes_provider_test.exs new file mode 100644 index 00000000..4a63b914 --- /dev/null +++ b/test/workos/pipes_provider_test.exs @@ -0,0 +1,95 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.PipesProviderTest do + use ExUnit.Case, async: true + + setup do + client = + WorkOS.Client.new( + api_key: "sk_test_key", + req_options: [plug: {Req.Test, WorkOS.Client}] + ) + + {:ok, client: client} + end + + test "list_organization_data_integration_configurations succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + + assert conn.request_path == + "/organizations/test_organization_id/data_integration_configurations" + + Req.Test.json( + conn, + WorkOS.TestFixtures.fixture( + "pipes_provider/list_organization_data_integration_configurations" + ) + ) + end) + + assert {:ok, %WorkOS.DataIntegrationConfigurationListResponse{object: "list"}} = + WorkOS.PipesProvider.list_organization_data_integration_configurations( + client, + "test_organization_id" + ) + end + + test "update_organization_data_integration_configuration succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "PUT" + + assert conn.request_path == + "/organizations/test_organization_id/data_integration_configurations/test_slug" + + Req.Test.json( + conn, + WorkOS.TestFixtures.fixture( + "pipes_provider/update_organization_data_integration_configuration" + ) + ) + end) + + assert {:ok, + %WorkOS.DataIntegrationConfigurationResponse{ + object: "data_integration_configuration", + id: "id" + }} = + WorkOS.PipesProvider.update_organization_data_integration_configuration( + client, + "test_organization_id", + "test_slug" + ) + end + + test "list_organization_data_integration_configurations honors per-request options", %{ + client: client + } do + Req.Test.stub(WorkOS.Client, fn conn -> + assert Plug.Conn.get_req_header(conn, "x-custom") == ["value"] + assert conn.host == "override.example.com" + Plug.Conn.send_resp(conn, 204, "") + end) + + WorkOS.PipesProvider.list_organization_data_integration_configurations( + client, + "test_organization_id", + headers: [{"x-custom", "value"}], + base_url: "https://override.example.com" + ) + end + + test "surfaces API errors as tagged tuples", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + conn + |> Plug.Conn.put_status(401) + |> Req.Test.json(%{"message" => "Unauthorized"}) + end) + + assert {:error, %WorkOS.ApiError{status: 401}} = + WorkOS.PipesProvider.list_organization_data_integration_configurations( + client, + "test_organization_id" + ) + end +end diff --git a/test/workos/pipes_round_trip_test.exs b/test/workos/pipes_round_trip_test.exs new file mode 100644 index 00000000..fb06898c --- /dev/null +++ b/test/workos/pipes_round_trip_test.exs @@ -0,0 +1,243 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.PipesRoundTripTest do + use ExUnit.Case, async: true + + test "ConnectedAccount round-trips between wire and struct" do + data = %{ + "object" => "connected_account", + "id" => "id", + "user_id" => "user_id", + "organization_id" => "organization_id", + "scopes" => ["scopes"], + "auth_method" => "oauth", + "api_key_last_4" => "api_key_last_4", + "state" => "connected", + "created_at" => "created_at", + "updated_at" => "updated_at" + } + + serialized = data |> WorkOS.ConnectedAccount.from_map() |> WorkOS.ConnectedAccount.to_map() + assert serialized == data + + assert serialized |> WorkOS.ConnectedAccount.from_map() |> WorkOS.ConnectedAccount.to_map() == + serialized + end + + test "DataIntegration round-trips between wire and struct" do + data = %{ + "object" => "data_integration", + "id" => "id", + "slug" => "slug", + "integration_type" => "integration_type", + "description" => "description", + "enabled" => true, + "state" => "valid", + "scopes" => ["scopes"], + "redirect_uri" => "redirect_uri", + "auth_methods" => ["oauth"], + "credentials" => %{ + "type" => "custom", + "client_id" => "client_id", + "redacted_client_secret" => "redacted_client_secret" + }, + "installation" => %{ + "id" => "id", + "user_id" => "user_id", + "organization_id" => "organization_id", + "api_key_last_4" => "api_key_last_4" + }, + "config" => %{}, + "custom_provider" => %{ + "name" => "name", + "authorization_url" => "authorization_url", + "token_url" => "token_url", + "refresh_token_url" => "refresh_token_url", + "pkce_enabled" => true, + "request_scope_separator" => "request_scope_separator", + "scopes_required" => true, + "client_secret_required" => true, + "additional_authorization_parameters" => %{}, + "token_body_content_type" => "token_body_content_type", + "authenticate_via" => "request_body" + }, + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z" + } + + serialized = data |> WorkOS.DataIntegration.from_map() |> WorkOS.DataIntegration.to_map() + assert serialized == data + + assert serialized |> WorkOS.DataIntegration.from_map() |> WorkOS.DataIntegration.to_map() == + serialized + end + + test "DataIntegrationAccessTokenResponse round-trips between wire and struct" do + data = %{ + "active" => true, + "access_token" => %{ + "object" => "access_token", + "access_token" => "access_token", + "expires_at" => "2024-01-01T00:00:00.000Z", + "scopes" => ["scopes"], + "missing_scopes" => ["missing_scopes"] + }, + "error" => "not_installed" + } + + serialized = + data + |> WorkOS.DataIntegrationAccessTokenResponse.from_map() + |> WorkOS.DataIntegrationAccessTokenResponse.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.DataIntegrationAccessTokenResponse.from_map() + |> WorkOS.DataIntegrationAccessTokenResponse.to_map() == serialized + end + + test "DataIntegrationAuthorizeUrlResponse round-trips between wire and struct" do + data = %{"url" => "url"} + + serialized = + data + |> WorkOS.DataIntegrationAuthorizeUrlResponse.from_map() + |> WorkOS.DataIntegrationAuthorizeUrlResponse.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.DataIntegrationAuthorizeUrlResponse.from_map() + |> WorkOS.DataIntegrationAuthorizeUrlResponse.to_map() == serialized + end + + test "DataIntegrationCredentialsResponse round-trips between wire and struct" do + data = %{ + "active" => true, + "credential" => %{ + "object" => "credential", + "auth_method" => "oauth", + "value" => "value", + "expires_at" => "expires_at", + "scopes" => ["scopes"], + "missing_scopes" => ["missing_scopes"] + }, + "error" => "not_installed" + } + + serialized = + data + |> WorkOS.DataIntegrationCredentialsResponse.from_map() + |> WorkOS.DataIntegrationCredentialsResponse.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.DataIntegrationCredentialsResponse.from_map() + |> WorkOS.DataIntegrationCredentialsResponse.to_map() == serialized + end + + test "DataIntegrationList round-trips between wire and struct" do + data = %{ + "object" => "list", + "data" => [ + %{ + "object" => "data_integration", + "id" => "id", + "slug" => "slug", + "integration_type" => "integration_type", + "description" => "description", + "enabled" => true, + "state" => "valid", + "scopes" => ["scopes"], + "redirect_uri" => "redirect_uri", + "auth_methods" => ["oauth"], + "credentials" => %{ + "type" => "custom", + "client_id" => "client_id", + "redacted_client_secret" => "redacted_client_secret" + }, + "installation" => %{ + "id" => "id", + "user_id" => "user_id", + "organization_id" => "organization_id", + "api_key_last_4" => "api_key_last_4" + }, + "config" => %{}, + "custom_provider" => %{ + "name" => "name", + "authorization_url" => "authorization_url", + "token_url" => "token_url", + "refresh_token_url" => "refresh_token_url", + "pkce_enabled" => true, + "request_scope_separator" => "request_scope_separator", + "scopes_required" => true, + "client_secret_required" => true, + "additional_authorization_parameters" => %{}, + "token_body_content_type" => "token_body_content_type", + "authenticate_via" => "request_body" + }, + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z" + } + ], + "list_metadata" => %{"before" => "before", "after" => "after"} + } + + serialized = + data |> WorkOS.DataIntegrationList.from_map() |> WorkOS.DataIntegrationList.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.DataIntegrationList.from_map() + |> WorkOS.DataIntegrationList.to_map() == serialized + end + + test "DataIntegrationsListResponse round-trips between wire and struct" do + data = %{ + "object" => "list", + "data" => [ + %{ + "object" => "data_provider", + "id" => "id", + "name" => "name", + "description" => "description", + "slug" => "slug", + "integration_type" => "integration_type", + "credentials_type" => "credentials_type", + "scopes" => ["scopes"], + "auth_methods" => ["oauth"], + "ownership" => "userland_user", + "created_at" => "created_at", + "updated_at" => "updated_at", + "connected_account" => %{ + "object" => "connected_account", + "id" => "id", + "user_id" => "user_id", + "organization_id" => "organization_id", + "scopes" => [], + "auth_method" => "oauth", + "api_key_last_4" => "api_key_last_4", + "state" => "connected", + "created_at" => "created_at", + "updated_at" => "updated_at", + "userlandUserId" => "userlandUserId" + } + } + ] + } + + serialized = + data + |> WorkOS.DataIntegrationsListResponse.from_map() + |> WorkOS.DataIntegrationsListResponse.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.DataIntegrationsListResponse.from_map() + |> WorkOS.DataIntegrationsListResponse.to_map() == serialized + end +end diff --git a/test/workos/pipes_test.exs b/test/workos/pipes_test.exs new file mode 100644 index 00000000..049efbd5 --- /dev/null +++ b/test/workos/pipes_test.exs @@ -0,0 +1,224 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.PipesTest do + use ExUnit.Case, async: true + + setup do + client = + WorkOS.Client.new( + api_key: "sk_test_key", + req_options: [plug: {Req.Test, WorkOS.Client}] + ) + + {:ok, client: client} + end + + test "list_data_integrations succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/data-integrations" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("pipes/list_data_integrations")) + end) + + assert {:ok, %WorkOS.Page{data: [%WorkOS.DataIntegrationList{object: "list"} | _]}} = + WorkOS.Pipes.list_data_integrations(client) + end + + test "list_data_integrations handles an empty page", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + Req.Test.json(conn, %{"data" => [], "list_metadata" => %{"after" => nil}}) + end) + + assert {:ok, %WorkOS.Page{data: []} = page} = WorkOS.Pipes.list_data_integrations(client) + refute WorkOS.Page.has_more?(page) + assert page |> WorkOS.Page.stream() |> Enum.to_list() == [] + end + + test "create_data_integration succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/data-integrations" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("pipes/create_data_integration")) + end) + + assert {:ok, %WorkOS.DataIntegration{object: "data_integration", id: "id"}} = + WorkOS.Pipes.create_data_integration(client) + end + + test "get_data_integration succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/data-integrations/test_slug" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("pipes/get_data_integration")) + end) + + assert {:ok, %WorkOS.DataIntegration{object: "data_integration", id: "id"}} = + WorkOS.Pipes.get_data_integration(client, "test_slug") + end + + test "update_data_integration succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "PUT" + assert conn.request_path == "/data-integrations/test_slug" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("pipes/update_data_integration")) + end) + + assert {:ok, %WorkOS.DataIntegration{object: "data_integration", id: "id"}} = + WorkOS.Pipes.update_data_integration(client, "test_slug") + end + + test "delete_data_integration succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "DELETE" + assert conn.request_path == "/data-integrations/test_slug" + Plug.Conn.send_resp(conn, 204, "") + end) + + assert {:ok, _} = WorkOS.Pipes.delete_data_integration(client, "test_slug") + end + + test "update_data_integration_api_key succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "PUT" + assert conn.request_path == "/data-integrations/test_slug/api-key" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("pipes/update_data_integration_api_key")) + end) + + assert {:ok, %WorkOS.ConnectedAccount{object: "connected_account", id: "id"}} = + WorkOS.Pipes.update_data_integration_api_key(client, "test_slug") + end + + test "authorize_data_integration succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/data-integrations/test_slug/authorize" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("pipes/authorize_data_integration")) + end) + + assert {:ok, %WorkOS.DataIntegrationAuthorizeUrlResponse{url: "url"}} = + WorkOS.Pipes.authorize_data_integration(client, "test_slug") + end + + test "create_data_integration_credential succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/data-integrations/test_slug/credentials" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("pipes/create_data_integration_credential")) + end) + + assert {:ok, %WorkOS.DataIntegrationCredentialsResponse{active: true}} = + WorkOS.Pipes.create_data_integration_credential(client, "test_slug") + end + + test "get_access_token succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/data-integrations/test_provider/token" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("pipes/get_access_token")) + end) + + assert {:ok, %WorkOS.DataIntegrationAccessTokenResponse{active: true}} = + WorkOS.Pipes.get_access_token(client, "test_provider") + end + + test "get_user_connected_account succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + + assert conn.request_path == + "/user_management/users/test_user_id/connected_accounts/test_slug" + + Req.Test.json(conn, WorkOS.TestFixtures.fixture("pipes/get_user_connected_account")) + end) + + assert {:ok, %WorkOS.ConnectedAccount{object: "connected_account", id: "id"}} = + WorkOS.Pipes.get_user_connected_account(client, "test_user_id", "test_slug") + end + + test "create_user_connected_account succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + + assert conn.request_path == + "/user_management/users/test_user_id/connected_accounts/test_slug" + + Req.Test.json(conn, WorkOS.TestFixtures.fixture("pipes/create_user_connected_account")) + end) + + assert {:ok, %WorkOS.ConnectedAccount{object: "connected_account", id: "id"}} = + WorkOS.Pipes.create_user_connected_account(client, "test_user_id", "test_slug") + end + + test "update_user_connected_account succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "PUT" + + assert conn.request_path == + "/user_management/users/test_user_id/connected_accounts/test_slug" + + Req.Test.json(conn, WorkOS.TestFixtures.fixture("pipes/update_user_connected_account")) + end) + + assert {:ok, %WorkOS.ConnectedAccount{object: "connected_account", id: "id"}} = + WorkOS.Pipes.update_user_connected_account(client, "test_user_id", "test_slug") + end + + test "delete_user_connected_account succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "DELETE" + + assert conn.request_path == + "/user_management/users/test_user_id/connected_accounts/test_slug" + + Plug.Conn.send_resp(conn, 204, "") + end) + + assert {:ok, _} = + WorkOS.Pipes.delete_user_connected_account(client, "test_user_id", "test_slug") + end + + test "list_user_data_providers succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/user_management/users/test_user_id/data_providers" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("pipes/list_user_data_providers")) + end) + + assert {:ok, %WorkOS.DataIntegrationsListResponse{object: "list"}} = + WorkOS.Pipes.list_user_data_providers(client, "test_user_id") + end + + test "list_data_integrations encodes query parameters", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + params = Plug.Conn.fetch_query_params(conn).query_params + assert params["before"] == "hello world&x" + refute Map.has_key?(params, "after") + Req.Test.json(conn, %{"data" => [], "list_metadata" => %{"after" => nil}}) + end) + + assert {:ok, _} = WorkOS.Pipes.list_data_integrations(client, %{before: "hello world&x"}) + end + + test "list_data_integrations honors per-request options", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert Plug.Conn.get_req_header(conn, "x-custom") == ["value"] + assert conn.host == "override.example.com" + Plug.Conn.send_resp(conn, 204, "") + end) + + WorkOS.Pipes.list_data_integrations(client, %{}, + headers: [{"x-custom", "value"}], + base_url: "https://override.example.com" + ) + end + + test "surfaces API errors as tagged tuples", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + conn + |> Plug.Conn.put_status(401) + |> Req.Test.json(%{"message" => "Unauthorized"}) + end) + + assert {:error, %WorkOS.ApiError{status: 401}} = WorkOS.Pipes.list_data_integrations(client) + end +end diff --git a/test/workos/pkce_test.exs b/test/workos/pkce_test.exs new file mode 100644 index 00000000..722a62bf --- /dev/null +++ b/test/workos/pkce_test.exs @@ -0,0 +1,39 @@ +# @oagen-ignore-file — hand-maintained tests for PKCE utilities. + +defmodule WorkOS.PKCETest do + use ExUnit.Case, async: true + + test "generate_code_verifier defaults to 43 characters" do + verifier = WorkOS.PKCE.generate_code_verifier() + + assert String.length(verifier) == 43 + assert verifier =~ ~r/^[A-Za-z0-9_-]+$/ + end + + test "generate_code_verifier honors a custom length" do + assert String.length(WorkOS.PKCE.generate_code_verifier(128)) == 128 + assert String.length(WorkOS.PKCE.generate_code_verifier(64)) == 64 + end + + test "generate_code_verifier rejects out-of-range lengths" do + assert_raise ArgumentError, fn -> WorkOS.PKCE.generate_code_verifier(42) end + assert_raise ArgumentError, fn -> WorkOS.PKCE.generate_code_verifier(129) end + end + + test "generate_code_challenge matches the RFC 7636 appendix B vector" do + assert WorkOS.PKCE.generate_code_challenge("dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk") == + "E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM" + end + + test "generate_pair returns a consistent verifier/challenge pair" do + pair = WorkOS.PKCE.generate_pair() + + assert pair.code_challenge_method == "S256" + assert pair.code_challenge == WorkOS.PKCE.generate_code_challenge(pair.code_verifier) + end + + test "verifiers are unique" do + verifiers = for _ <- 1..50, do: WorkOS.PKCE.generate_code_verifier() + assert length(Enum.uniq(verifiers)) == 50 + end +end diff --git a/test/workos/portal_test.exs b/test/workos/portal_test.exs deleted file mode 100644 index 44d03edb..00000000 --- a/test/workos/portal_test.exs +++ /dev/null @@ -1,103 +0,0 @@ -defmodule WorkOS.PortalTest do - use WorkOS.TestCase - - alias WorkOS.Portal.ClientMock - - setup :setup_env - - describe "generate_link" do - test "with invalid intent, raises an error", context do - opts = [ - intent: "invalid" - ] - - context |> ClientMock.generate_link(assert_fields: opts) - - assert_raise ArgumentError, fn -> - WorkOS.Portal.generate_link(opts |> Enum.into(%{})) - end - end - - test "with a valid intent and without an organization, raises an error", context do - opts = [ - intent: "sso" - ] - - context |> ClientMock.generate_link(assert_fields: opts) - - assert_raise ArgumentError, fn -> - WorkOS.Portal.generate_link(opts |> Enum.into(%{})) - end - end - - test "with a audit_logs intent, returns portal link", context do - opts = [ - intent: "audit_logs", - organization: "org_01EHQMYV6MBK39QC5PZXHY59C3" - ] - - context |> ClientMock.generate_link(assert_fields: opts) - - assert {:ok, %WorkOS.Portal.Link{link: link}} = - WorkOS.Portal.generate_link(opts |> Enum.into(%{})) - - refute is_nil(link) - end - - test "with a domain_verification intent, returns portal link", context do - opts = [ - intent: "domain_verification", - organization: "org_01EHQMYV6MBK39QC5PZXHY59C3" - ] - - context |> ClientMock.generate_link(assert_fields: opts) - - assert {:ok, %WorkOS.Portal.Link{link: link}} = - WorkOS.Portal.generate_link(opts |> Enum.into(%{})) - - refute is_nil(link) - end - - test "with a dsync intent, returns portal link", context do - opts = [ - intent: "dsync", - organization: "org_01EHQMYV6MBK39QC5PZXHY59C3" - ] - - context |> ClientMock.generate_link(assert_fields: opts) - - assert {:ok, %WorkOS.Portal.Link{link: link}} = - WorkOS.Portal.generate_link(opts |> Enum.into(%{})) - - refute is_nil(link) - end - - test "with a log_streams intent, returns portal link", context do - opts = [ - intent: "log_streams", - organization: "org_01EHQMYV6MBK39QC5PZXHY59C3" - ] - - context |> ClientMock.generate_link(assert_fields: opts) - - assert {:ok, %WorkOS.Portal.Link{link: link}} = - WorkOS.Portal.generate_link(opts |> Enum.into(%{})) - - refute is_nil(link) - end - - test "with a sso intent, returns portal link", context do - opts = [ - intent: "sso", - organization: "org_01EHQMYV6MBK39QC5PZXHY59C3" - ] - - context |> ClientMock.generate_link(assert_fields: opts) - - assert {:ok, %WorkOS.Portal.Link{link: link}} = - WorkOS.Portal.generate_link(opts |> Enum.into(%{})) - - refute is_nil(link) - end - end -end diff --git a/test/workos/public_client_test.exs b/test/workos/public_client_test.exs new file mode 100644 index 00000000..be393b12 --- /dev/null +++ b/test/workos/public_client_test.exs @@ -0,0 +1,51 @@ +# @oagen-ignore-file — hand-maintained tests for the public-client preset. + +defmodule WorkOS.PublicClientTest do + use ExUnit.Case, async: true + + test "new builds a client without an API key" do + public = WorkOS.PublicClient.new("client_123") + + assert %WorkOS.PublicClient{client: %WorkOS.Client{api_key: "", client_id: "client_123"}} = + public + end + + test "new requires a client_id" do + assert_raise WorkOS.ConfigurationError, fn -> WorkOS.PublicClient.new("") end + end + + test "new honors a custom base URL" do + public = WorkOS.PublicClient.new("client_123", base_url: "https://api.example.test/") + + result = WorkOS.PublicClient.get_authorization_url(public, %{redirect_uri: "https://cb"}) + assert String.starts_with?(result.url, "https://api.example.test/user_management/authorize") + end + + test "get_authorization_url returns an AuthKit PKCE URL" do + public = WorkOS.PublicClient.new("client_123") + + assert %{url: url, code_verifier: verifier, state: state} = + WorkOS.PublicClient.get_authorization_url(public, %{ + redirect_uri: "https://example.com/cb" + }) + + query = url |> URI.parse() |> Map.fetch!(:query) |> URI.decode_query() + assert query["client_id"] == "client_123" + assert query["code_challenge"] == WorkOS.PKCE.generate_code_challenge(verifier) + assert query["state"] == state + end + + test "get_sso_authorization_url returns an SSO PKCE URL" do + public = WorkOS.PublicClient.new("client_123") + + assert %{url: url, code_verifier: verifier} = + WorkOS.PublicClient.get_sso_authorization_url(public, %{ + redirect_uri: "https://example.com/cb" + }) + + assert url =~ "/sso/authorize" + + query = url |> URI.parse() |> Map.fetch!(:query) |> URI.decode_query() + assert query["code_challenge"] == WorkOS.PKCE.generate_code_challenge(verifier) + end +end diff --git a/test/workos/radar_round_trip_test.exs b/test/workos/radar_round_trip_test.exs new file mode 100644 index 00000000..33a8de55 --- /dev/null +++ b/test/workos/radar_round_trip_test.exs @@ -0,0 +1,39 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.RadarRoundTripTest do + use ExUnit.Case, async: true + + test "RadarListEntryAlreadyPresentResponse round-trips between wire and struct" do + data = %{"message" => "message"} + + serialized = + data + |> WorkOS.RadarListEntryAlreadyPresentResponse.from_map() + |> WorkOS.RadarListEntryAlreadyPresentResponse.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.RadarListEntryAlreadyPresentResponse.from_map() + |> WorkOS.RadarListEntryAlreadyPresentResponse.to_map() == serialized + end + + test "RadarStandaloneResponse round-trips between wire and struct" do + data = %{ + "verdict" => "allow", + "reason" => "reason", + "attempt_id" => "attempt_id", + "control" => "bot_detection", + "blocklist_type" => "ip_address" + } + + serialized = + data |> WorkOS.RadarStandaloneResponse.from_map() |> WorkOS.RadarStandaloneResponse.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.RadarStandaloneResponse.from_map() + |> WorkOS.RadarStandaloneResponse.to_map() == serialized + end +end diff --git a/test/workos/radar_test.exs b/test/workos/radar_test.exs new file mode 100644 index 00000000..35c85dcf --- /dev/null +++ b/test/workos/radar_test.exs @@ -0,0 +1,80 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.RadarTest do + use ExUnit.Case, async: true + + setup do + client = + WorkOS.Client.new( + api_key: "sk_test_key", + req_options: [plug: {Req.Test, WorkOS.Client}] + ) + + {:ok, client: client} + end + + test "create_attempt succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/radar/attempts" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("radar/create_attempt")) + end) + + assert {:ok, %WorkOS.RadarStandaloneResponse{reason: "reason", attempt_id: "attempt_id"}} = + WorkOS.Radar.create_attempt(client) + end + + test "update_attempt succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "PUT" + assert conn.request_path == "/radar/attempts/test_id" + Plug.Conn.send_resp(conn, 204, "") + end) + + assert {:ok, _} = WorkOS.Radar.update_attempt(client, "test_id") + end + + test "add_list_entry succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/radar/lists/test_type/test_action" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("radar/add_list_entry")) + end) + + assert {:ok, %WorkOS.RadarListEntryAlreadyPresentResponse{message: "message"}} = + WorkOS.Radar.add_list_entry(client, "test_type", "test_action") + end + + test "remove_list_entry succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "DELETE" + assert conn.request_path == "/radar/lists/test_type/test_action" + Plug.Conn.send_resp(conn, 204, "") + end) + + assert {:ok, _} = WorkOS.Radar.remove_list_entry(client, "test_type", "test_action") + end + + test "create_attempt honors per-request options", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert Plug.Conn.get_req_header(conn, "x-custom") == ["value"] + assert conn.host == "override.example.com" + Plug.Conn.send_resp(conn, 204, "") + end) + + WorkOS.Radar.create_attempt(client, %{}, + headers: [{"x-custom", "value"}], + base_url: "https://override.example.com" + ) + end + + test "surfaces API errors as tagged tuples", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + conn + |> Plug.Conn.put_status(401) + |> Req.Test.json(%{"message" => "Unauthorized"}) + end) + + assert {:error, %WorkOS.ApiError{status: 401}} = WorkOS.Radar.create_attempt(client) + end +end diff --git a/test/workos/session_test.exs b/test/workos/session_test.exs new file mode 100644 index 00000000..e4ff256f --- /dev/null +++ b/test/workos/session_test.exs @@ -0,0 +1,228 @@ +# @oagen-ignore-file — hand-maintained tests for sealed session helpers. + +defmodule WorkOS.SessionTest do + use ExUnit.Case, async: true + + @cookie_password Base.encode16(:crypto.strong_rand_bytes(32), case: :lower) + + defp build_client do + WorkOS.Client.new( + api_key: "sk_test_key", + client_id: "client_123", + req_options: [plug: {Req.Test, WorkOS.Client}] + ) + end + + defp jwt(claims) do + header = %{"alg" => "RS256", "typ" => "JWT"} |> JSON.encode!() |> url64() + payload = claims |> JSON.encode!() |> url64() + "#{header}.#{payload}.#{url64("stub-signature")}" + end + + defp url64(data), do: Base.url_encode64(data, padding: false) + + defp claims(overrides \\ %{}) do + Map.merge( + %{ + "sid" => "session_123", + "org_id" => "org_123", + "role" => "admin", + "permissions" => ["posts:read"], + "entitlements" => ["audit-logs"], + "exp" => System.system_time(:second) + 3600 + }, + overrides + ) + end + + defp sealed_session(claim_overrides \\ %{}) do + {:ok, sealed} = + WorkOS.Session.seal_session( + %{ + access_token: jwt(claims(claim_overrides)), + refresh_token: "refresh_token_123", + user: %WorkOS.User{id: "user_123", email: "user@example.com"}, + impersonator: nil + }, + @cookie_password + ) + + sealed + end + + describe "raw seal/unseal" do + test "roundtrips arbitrary data" do + data = %{"hello" => "world", "count" => 3} + + assert {:ok, sealed} = WorkOS.Session.seal_data(data, @cookie_password) + assert {:ok, ^data} = WorkOS.Session.unseal_data(sealed, @cookie_password) + end + + test "derives a key from non-hex passwords" do + assert {:ok, sealed} = WorkOS.Session.seal_data(%{"a" => 1}, "plain passphrase") + assert {:ok, %{"a" => 1}} = WorkOS.Session.unseal_data(sealed, "plain passphrase") + end + + test "fails to unseal with the wrong password" do + assert {:ok, sealed} = WorkOS.Session.seal_data(%{"a" => 1}, @cookie_password) + + assert {:error, :decryption_failed} = + WorkOS.Session.unseal_data(sealed, "wrong password") + end + + test "rejects an empty password" do + assert {:error, :empty_cookie_password} = WorkOS.Session.seal_data(%{}, "") + assert {:error, :empty_cookie_password} = WorkOS.Session.unseal_data("abc", "") + end + + test "rejects garbage sealed input" do + assert {:error, :invalid_base64} = WorkOS.Session.unseal_data("!!!", @cookie_password) + + assert {:error, :sealed_data_too_short} = + WorkOS.Session.unseal_data("YWJj", @cookie_password) + end + end + + describe "authenticate" do + test "authenticates a valid sealed session and extracts claims" do + result = WorkOS.Session.authenticate(sealed_session(), @cookie_password) + + assert result.authenticated + assert result.session_id == "session_123" + assert result.organization_id == "org_123" + assert result.role == "admin" + assert result.permissions == ["posts:read"] + assert result.entitlements == ["audit-logs"] + assert %WorkOS.User{id: "user_123"} = result.user + refute result.needs_refresh + end + + test "flags an expired access token as needing refresh" do + expired = sealed_session(%{"exp" => System.system_time(:second) - 60}) + result = WorkOS.Session.authenticate(expired, @cookie_password) + + refute result.authenticated + assert result.needs_refresh + assert result.reason == "session_expired" + assert result.session_id == "session_123" + end + + test "reports a missing cookie" do + result = WorkOS.Session.authenticate(nil, @cookie_password) + + refute result.authenticated + assert result.reason == "no_session_cookie_provided" + end + + test "reports an invalid cookie" do + result = WorkOS.Session.authenticate("not-a-session", @cookie_password) + + refute result.authenticated + assert result.reason == "invalid_session_cookie" + end + + test "reports a cookie without an access token" do + {:ok, sealed} = WorkOS.Session.seal_session(%{refresh_token: "rt"}, @cookie_password) + result = WorkOS.Session.authenticate(sealed, @cookie_password) + + refute result.authenticated + assert result.reason == "invalid_jwt" + end + end + + describe "refresh" do + test "exchanges the refresh token and reseals the session" do + new_access_token = jwt(claims(%{"sid" => "session_456"})) + + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.request_path == "/user_management/authenticate" + + {:ok, req_body, conn} = Plug.Conn.read_body(conn) + req_body = JSON.decode!(req_body) + assert req_body["grant_type"] == "refresh_token" + assert req_body["refresh_token"] == "refresh_token_123" + assert req_body["organization_id"] == "org_123" + + Req.Test.json(conn, %{ + "access_token" => new_access_token, + "refresh_token" => "refresh_token_456", + "user" => %{"object" => "user", "id" => "user_123", "email" => "user@example.com"} + }) + end) + + session = WorkOS.Session.new(build_client(), sealed_session(), @cookie_password) + + assert {:ok, %{authenticated: true, sealed_session: resealed}} = + WorkOS.Session.refresh(session) + + result = WorkOS.Session.authenticate(resealed, @cookie_password) + assert result.authenticated + assert result.session_id == "session_456" + end + + test "maps a revoked refresh token to its reason" do + Req.Test.stub(WorkOS.Client, fn conn -> + conn + |> Plug.Conn.put_status(401) + |> Req.Test.json(%{"code" => "invalid_grant", "message" => "Revoked"}) + end) + + assert {:error, %{reason: "refresh_token_revoked", error: %WorkOS.ApiError{}}} = + WorkOS.Session.refresh_session( + build_client(), + sealed_session(), + @cookie_password + ) + end + + test "reports structural problems without calling the API" do + assert {:error, %{reason: "no_session_cookie_provided"}} = + WorkOS.Session.refresh_session(build_client(), nil, @cookie_password) + + assert {:error, %{reason: "invalid_session_cookie"}} = + WorkOS.Session.refresh_session(build_client(), "garbage", @cookie_password) + end + end + + describe "get_logout_url" do + test "builds the logout URL from the session ID" do + session = WorkOS.Session.new(build_client(), sealed_session(), @cookie_password) + + assert {:ok, url} = WorkOS.Session.get_logout_url(session) + assert url =~ "/user_management/sessions/logout" + assert url =~ "session_id=session_123" + end + + test "appends return_to when given" do + session = WorkOS.Session.new(build_client(), sealed_session(), @cookie_password) + + assert {:ok, url} = + WorkOS.Session.get_logout_url(session, return_to: "https://example.com/goodbye") + + assert url =~ "return_to=" <> URI.encode_www_form("https://example.com/goodbye") + end + + test "works for an expired session" do + expired = sealed_session(%{"exp" => System.system_time(:second) - 60}) + session = WorkOS.Session.new(build_client(), expired, @cookie_password) + + assert {:ok, url} = WorkOS.Session.get_logout_url(session) + assert url =~ "session_id=session_123" + end + end + + test "seal_session_from_auth_response produces an authenticatable session" do + response = %WorkOS.AuthenticateResponse{ + access_token: jwt(claims()), + refresh_token: "refresh_token_123", + user: %WorkOS.User{id: "user_123", email: "user@example.com"} + } + + assert {:ok, sealed} = + WorkOS.Session.seal_session_from_auth_response(response, @cookie_password) + + result = WorkOS.Session.authenticate(sealed, @cookie_password) + assert result.authenticated + assert %WorkOS.User{id: "user_123"} = result.user + end +end diff --git a/test/workos/sso_helpers_test.exs b/test/workos/sso_helpers_test.exs new file mode 100644 index 00000000..26cbe438 --- /dev/null +++ b/test/workos/sso_helpers_test.exs @@ -0,0 +1,101 @@ +# @oagen-ignore-file — hand-maintained tests for SSO PKCE and logout helpers. + +defmodule WorkOS.SSOHelpersTest do + use ExUnit.Case, async: true + + alias WorkOS.SSO.Logout + + setup do + client = + WorkOS.Client.new( + api_key: "sk_test_key", + client_id: "client_123", + req_options: [plug: {Req.Test, WorkOS.Client}] + ) + + {:ok, client: client} + end + + describe "WorkOS.SSO.PKCE" do + test "get_authorization_url generates PKCE and state automatically", %{client: client} do + result = + WorkOS.SSO.PKCE.get_authorization_url(client, %{redirect_uri: "https://example.com/cb"}) + + assert %{url: url, code_verifier: verifier, state: state} = result + assert url =~ "/sso/authorize" + + query = url |> URI.parse() |> Map.fetch!(:query) |> URI.decode_query() + assert query["client_id"] == "client_123" + assert query["code_challenge"] == WorkOS.PKCE.generate_code_challenge(verifier) + assert query["code_challenge_method"] == "S256" + assert query["state"] == state + end + + test "code_exchange posts the code and verifier to /sso/token", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.request_path == "/sso/token" + + {:ok, req_body, conn} = Plug.Conn.read_body(conn) + req_body = JSON.decode!(req_body) + assert req_body["grant_type"] == "authorization_code" + assert req_body["code"] == "code_123" + assert req_body["code_verifier"] == "verifier_123" + assert req_body["client_id"] == "client_123" + + Req.Test.json(conn, WorkOS.TestFixtures.fixture("sso/get_profile_and_token")) + end) + + assert {:ok, %WorkOS.SSOTokenResponse{}} = + WorkOS.SSO.PKCE.code_exchange(client, %{ + code: "code_123", + code_verifier: "verifier_123" + }) + end + end + + describe "WorkOS.SSO.Logout" do + test "get_logout_url authorizes a logout token then builds the URL", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.request_path == "/sso/logout/authorize" + + {:ok, req_body, conn} = Plug.Conn.read_body(conn) + assert JSON.decode!(req_body)["profile_id"] == "prof_123" + + Req.Test.json(conn, %{ + "logout_url" => "https://api.workos.com/sso/logout?token=logout_token_123", + "logout_token" => "logout_token_123" + }) + end) + + assert {:ok, url} = Logout.get_logout_url(client, %{profile_id: "prof_123"}) + + assert url =~ "/sso/logout" + assert url =~ "token=logout_token_123" + end + + test "get_logout_url appends return_to", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + Req.Test.json(conn, %{"logout_token" => "logout_token_123"}) + end) + + assert {:ok, url} = + Logout.get_logout_url(client, %{ + profile_id: "prof_123", + return_to: "https://example.com/bye" + }) + + assert url =~ "return_to=" <> URI.encode_www_form("https://example.com/bye") + end + + test "get_logout_url surfaces authorize errors", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + conn + |> Plug.Conn.put_status(404) + |> Req.Test.json(%{"message" => "Not found"}) + end) + + assert {:error, %WorkOS.ApiError{status: 404}} = + Logout.get_logout_url(client, %{profile_id: "prof_missing"}) + end + end +end diff --git a/test/workos/sso_round_trip_test.exs b/test/workos/sso_round_trip_test.exs new file mode 100644 index 00000000..028dd056 --- /dev/null +++ b/test/workos/sso_round_trip_test.exs @@ -0,0 +1,143 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.SSORoundTripTest do + use ExUnit.Case, async: true + + test "Connection round-trips between wire and struct" do + data = %{ + "object" => "connection", + "id" => "id", + "organization_id" => "organization_id", + "connection_type" => "Pending", + "name" => "name", + "state" => "requires_type", + "status" => "linked", + "domains" => [%{"id" => "id", "object" => "connection_domain", "domain" => "domain"}], + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z" + } + + serialized = data |> WorkOS.Connection.from_map() |> WorkOS.Connection.to_map() + assert serialized == data + + assert serialized |> WorkOS.Connection.from_map() |> WorkOS.Connection.to_map() == serialized + end + + test "ConnectionList round-trips between wire and struct" do + data = %{ + "object" => "list", + "data" => [ + %{ + "object" => "connection", + "id" => "id", + "organization_id" => "organization_id", + "connection_type" => "Pending", + "name" => "name", + "state" => "requires_type", + "status" => "linked", + "domains" => [%{}], + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z" + } + ], + "list_metadata" => %{"before" => "before", "after" => "after"} + } + + serialized = data |> WorkOS.ConnectionList.from_map() |> WorkOS.ConnectionList.to_map() + assert serialized == data + + assert serialized |> WorkOS.ConnectionList.from_map() |> WorkOS.ConnectionList.to_map() == + serialized + end + + test "Profile round-trips between wire and struct" do + data = %{ + "object" => "profile", + "id" => "id", + "organization_id" => "organization_id", + "connection_id" => "connection_id", + "connection_type" => "Pending", + "idp_id" => "idp_id", + "email" => "email", + "first_name" => "first_name", + "last_name" => "last_name", + "name" => "name", + "role" => %{"slug" => "slug"}, + "roles" => [%{"slug" => "slug"}], + "groups" => ["groups"], + "custom_attributes" => %{}, + "raw_attributes" => %{} + } + + serialized = data |> WorkOS.Profile.from_map() |> WorkOS.Profile.to_map() + assert serialized == data + + assert serialized |> WorkOS.Profile.from_map() |> WorkOS.Profile.to_map() == serialized + end + + test "SSOAuthorizeUrlResponse round-trips between wire and struct" do + data = %{"url" => "url"} + + serialized = + data |> WorkOS.SSOAuthorizeUrlResponse.from_map() |> WorkOS.SSOAuthorizeUrlResponse.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.SSOAuthorizeUrlResponse.from_map() + |> WorkOS.SSOAuthorizeUrlResponse.to_map() == serialized + end + + test "SSOLogoutAuthorizeResponse round-trips between wire and struct" do + data = %{"logout_url" => "logout_url", "logout_token" => "logout_token"} + + serialized = + data + |> WorkOS.SSOLogoutAuthorizeResponse.from_map() + |> WorkOS.SSOLogoutAuthorizeResponse.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.SSOLogoutAuthorizeResponse.from_map() + |> WorkOS.SSOLogoutAuthorizeResponse.to_map() == serialized + end + + test "SSOTokenResponse round-trips between wire and struct" do + data = %{ + "token_type" => "Bearer", + "access_token" => "access_token", + "expires_in" => 1, + "profile" => %{ + "object" => "profile", + "id" => "id", + "organization_id" => "organization_id", + "connection_id" => "connection_id", + "connection_type" => "Pending", + "idp_id" => "idp_id", + "email" => "email", + "first_name" => "first_name", + "last_name" => "last_name", + "name" => "name", + "role" => %{"slug" => "slug"}, + "roles" => [%{"slug" => "slug"}], + "groups" => ["groups"], + "custom_attributes" => %{}, + "raw_attributes" => %{} + }, + "oauth_tokens" => %{ + "provider" => "provider", + "refresh_token" => "refresh_token", + "access_token" => "access_token", + "expires_at" => 1, + "scopes" => ["scopes"] + } + } + + serialized = data |> WorkOS.SSOTokenResponse.from_map() |> WorkOS.SSOTokenResponse.to_map() + assert serialized == data + + assert serialized |> WorkOS.SSOTokenResponse.from_map() |> WorkOS.SSOTokenResponse.to_map() == + serialized + end +end diff --git a/test/workos/sso_test.exs b/test/workos/sso_test.exs index d1e8598f..c0611746 100644 --- a/test/workos/sso_test.exs +++ b/test/workos/sso_test.exs @@ -1,228 +1,143 @@ -defmodule WorkOS.SSOTest do - use WorkOS.TestCase - - alias WorkOS.SSO.ClientMock - - setup :setup_env - - def parse_uri(url) do - uri = URI.parse(url) - %URI{uri | query: URI.query_decoder(uri.query) |> Enum.to_list()} - end - - describe "get_authorization_url" do - test "generates an authorize url with the default `base_url`" do - opts = [connection: "mock-connection-id", redirect_uri: "example.com/sso/workos/callback"] - - assert {:ok, success_url} = opts |> Map.new() |> WorkOS.SSO.get_authorization_url() - - assert WorkOS.base_url() =~ parse_uri(success_url).host - end - - test "with no `domain`, `provider`, `connection` or `organization`, returns error for incomplete arguments" do - opts = [redirect_uri: "example.com/sso/workos/callback"] - - assert {:error, _error_message} = opts |> Map.new() |> WorkOS.SSO.get_authorization_url() - end - - test "with no `redirect_uri`, returns error for incomplete arguments" do - opts = [provider: "GoogleOAuth"] - - assert {:error, _error_message} = opts |> Map.new() |> WorkOS.SSO.get_authorization_url() - end - - test "generates an authorize url with a `provider`" do - opts = [provider: "MicrosoftOAuth", redirect_uri: "example.com/sso/workos/callback"] - - assert {:ok, success_url} = opts |> Map.new() |> WorkOS.SSO.get_authorization_url() +# This file is auto-generated by oagen. Do not edit. - assert {"provider", "MicrosoftOAuth"} in parse_uri(success_url).query - end - - test "generates an authorize url with a `connection`" do - opts = [connection: "mock-connection-id", redirect_uri: "example.com/sso/workos/callback"] - - assert {:ok, success_url} = opts |> Map.new() |> WorkOS.SSO.get_authorization_url() - - assert {"connection", "mock-connection-id"} in parse_uri(success_url).query - end - - test "generates an authorization url with a `organization`" do - opts = [organization: "mock-organization", redirect_uri: "example.com/sso/workos/callback"] - - assert {:ok, success_url} = opts |> Map.new() |> WorkOS.SSO.get_authorization_url() - - assert {"organization", "mock-organization"} in parse_uri(success_url).query - end - - test "generates an authorization url with a custom `base_url` from app config" do - initial_config = Application.get_env(:workos, WorkOS.Client) +defmodule WorkOS.SSOTest do + use ExUnit.Case, async: true - Application.put_env( - :workos, - WorkOS.Client, - Keyword.put(initial_config, :base_url, "https://custom-base-url.com") + setup do + client = + WorkOS.Client.new( + api_key: "sk_test_key", + req_options: [plug: {Req.Test, WorkOS.Client}] ) - opts = [provider: "GoogleOAuth", redirect_uri: "example.com/sso/workos/callback"] - - assert {:ok, success_url} = opts |> Map.new() |> WorkOS.SSO.get_authorization_url() - - assert "custom-base-url.com" == parse_uri(success_url).host - - Application.put_env(:workos, WorkOS.Client, initial_config) - end - - test "generates an authorization url with a `state`" do - opts = [ - provider: "GoogleOAuth", - state: "mock-state", - redirect_uri: "example.com/sso/workos/callback" - ] - - assert {:ok, success_url} = opts |> Map.new() |> WorkOS.SSO.get_authorization_url() - - assert {"state", "mock-state"} in parse_uri(success_url).query - end - - test "generates an authorization url with a given `domain_hint`" do - opts = [ - organization: "mock-organization", - domain_hint: "mock-domain-hint", - redirect_uri: "example.com/sso/workos/callback" - ] - - assert {:ok, success_url} = opts |> Map.new() |> WorkOS.SSO.get_authorization_url() - - assert {"domain_hint", "mock-domain-hint"} in parse_uri(success_url).query - end - - test "generates an authorization url with a given `login_hint`" do - opts = [ - organization: "mock-organization", - login_hint: "mock-login-hint", - redirect_uri: "example.com/sso/workos/callback" - ] - - assert {:ok, success_url} = opts |> Map.new() |> WorkOS.SSO.get_authorization_url() - - assert {"login_hint", "mock-login-hint"} in parse_uri(success_url).query - end - - test "with a invalid selector, returns error" do - opts = [ - redirect_uri: "example.com/sso/workos/callback" - ] - - {:error, _message} = opts |> Map.new() |> WorkOS.UserManagement.get_authorization_url() - end + {:ok, client: client} end - describe "get_profile_and_token" do - test "with all information provided, sends a request to the WorkOS API for a profile", - context do - opts = [code: "authorization_code"] - - context |> ClientMock.get_profile_and_token(assert_fields: opts) - - assert {:ok, %WorkOS.SSO.ProfileAndToken{access_token: access_token, profile: profile}} = - WorkOS.SSO.get_profile_and_token(opts |> Keyword.get(:code)) - - refute is_nil(access_token) - refute is_nil(profile) - end - - test "without a groups attribute, sends a request to the WorkOS API for a profile", context do - opts = [code: "authorization_code"] + test "list_connections succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/connections" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("sso/list_connections")) + end) - context - |> Map.put(:with_group_attribute, false) - |> ClientMock.get_profile_and_token(assert_fields: opts) - - {:ok, %WorkOS.SSO.ProfileAndToken{access_token: access_token, profile: profile}} = - WorkOS.SSO.get_profile_and_token(opts |> Keyword.get(:code)) - - refute is_nil(access_token) - refute is_nil(profile) - end - - test "casts custom_attributes from the profile response", context do - opts = [code: "authorization_code"] - - context |> ClientMock.get_profile_and_token(assert_fields: opts) + assert {:ok, %WorkOS.Page{data: [%WorkOS.ConnectionList{object: "list"} | _]}} = + WorkOS.SSO.list_connections(client) + end - assert {:ok, %WorkOS.SSO.ProfileAndToken{profile: profile}} = - WorkOS.SSO.get_profile_and_token(opts |> Keyword.get(:code)) + test "list_connections handles an empty page", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + Req.Test.json(conn, %{"data" => [], "list_metadata" => %{"after" => nil}}) + end) - assert profile.custom_attributes == %{ - "sid" => "S-1-5-21-1004336348-1177238915-682003330-512" - } - end + assert {:ok, %WorkOS.Page{data: []} = page} = WorkOS.SSO.list_connections(client) + refute WorkOS.Page.has_more?(page) + assert page |> WorkOS.Page.stream() |> Enum.to_list() == [] end - describe "get_profile" do - test "calls the `/sso/profile` endpoint with the provided access token", context do - opts = [access_token: "access_token"] - - context |> ClientMock.get_profile(assert_fields: opts) + test "get_connection succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/connections/test_id" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("sso/get_connection")) + end) - assert {:ok, %WorkOS.SSO.Profile{id: id}} = - WorkOS.SSO.get_profile(opts |> Keyword.get(:access_token)) + assert {:ok, %WorkOS.Connection{object: "connection", id: "id"}} = + WorkOS.SSO.get_connection(client, "test_id") + end - refute is_nil(id) - end + test "delete_connection succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "DELETE" + assert conn.request_path == "/connections/test_id" + Plug.Conn.send_resp(conn, 204, "") + end) - test "casts custom_attributes from the profile response", context do - opts = [access_token: "access_token"] + assert {:ok, _} = WorkOS.SSO.delete_connection(client, "test_id") + end - context |> ClientMock.get_profile(assert_fields: opts) + test "authorize_logout succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/sso/logout/authorize" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("sso/authorize_logout")) + end) + + assert {:ok, + %WorkOS.SSOLogoutAuthorizeResponse{ + logout_url: "logout_url", + logout_token: "logout_token" + }} = WorkOS.SSO.authorize_logout(client) + end - assert {:ok, %WorkOS.SSO.Profile{custom_attributes: custom_attributes}} = - WorkOS.SSO.get_profile(opts |> Keyword.get(:access_token)) + test "get_profile succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/sso/profile" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("sso/get_profile")) + end) - assert custom_attributes == %{"sid" => "S-1-5-21-1004336348-1177238915-682003330-512"} - end + assert {:ok, %WorkOS.Profile{object: "profile", id: "id"}} = WorkOS.SSO.get_profile(client) end - describe "get_connection" do - test "requests a connection", context do - opts = [connection_id: "conn_123"] + test "get_profile_and_token succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/sso/token" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("sso/get_profile_and_token")) + end) - context |> ClientMock.get_connection(assert_fields: opts) + assert {:ok, %WorkOS.SSOTokenResponse{token_type: "Bearer", access_token: "access_token"}} = + WorkOS.SSO.get_profile_and_token(client) + end - assert {:ok, %WorkOS.SSO.Connection{id: id}} = - WorkOS.SSO.get_connection(opts |> Keyword.get(:connection_id)) + test "get_authorization_url builds a redirect URL without an HTTP request", %{client: client} do + url = WorkOS.SSO.get_authorization_url(client) - refute is_nil(id) - end + assert is_binary(url) + assert String.starts_with?(url, client.base_url) + assert url =~ "/sso/authorize" + assert url =~ URI.encode_query(%{"response_type" => "code"}) end - describe "list_connections" do - test "requests a list of connections", context do - opts = [organization_id: "org_1234"] + test "get_logout_url builds a redirect URL without an HTTP request", %{client: client} do + url = WorkOS.SSO.get_logout_url(client) - context |> ClientMock.list_connections(assert_fields: opts) - - assert {:ok, %WorkOS.List{data: [%WorkOS.SSO.Connection{}], list_metadata: %{}}} = - WorkOS.SSO.list_connections(opts |> Enum.into(%{})) - end + assert is_binary(url) + assert String.starts_with?(url, client.base_url) + assert url =~ "/sso/logout" + end - test "without any options, returns connections and metadata", context do - context |> ClientMock.list_connections() + test "list_connections encodes query parameters", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + params = Plug.Conn.fetch_query_params(conn).query_params + assert params["before"] == "hello world&x" + refute Map.has_key?(params, "after") + Req.Test.json(conn, %{"data" => [], "list_metadata" => %{"after" => nil}}) + end) - assert {:ok, %WorkOS.List{data: [%WorkOS.SSO.Connection{}], list_metadata: %{}}} = - WorkOS.SSO.list_connections() - end + assert {:ok, _} = WorkOS.SSO.list_connections(client, %{before: "hello world&x"}) end - describe "delete_connection" do - test "sends a request to delete a connection", context do - opts = [connection_id: "conn_123"] + test "list_connections honors per-request options", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert Plug.Conn.get_req_header(conn, "x-custom") == ["value"] + assert conn.host == "override.example.com" + Plug.Conn.send_resp(conn, 204, "") + end) + + WorkOS.SSO.list_connections(client, %{}, + headers: [{"x-custom", "value"}], + base_url: "https://override.example.com" + ) + end - context |> ClientMock.delete_connection(assert_fields: opts) + test "surfaces API errors as tagged tuples", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + conn + |> Plug.Conn.put_status(401) + |> Req.Test.json(%{"message" => "Unauthorized"}) + end) - assert {:ok, %WorkOS.Empty{}} = - WorkOS.SSO.delete_connection(opts |> Keyword.get(:connection_id)) - end + assert {:error, %WorkOS.ApiError{status: 401}} = WorkOS.SSO.list_connections(client) end end diff --git a/test/workos/user_management_round_trip_test.exs b/test/workos/user_management_round_trip_test.exs new file mode 100644 index 00000000..2d55675f --- /dev/null +++ b/test/workos/user_management_round_trip_test.exs @@ -0,0 +1,710 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.UserManagementRoundTripTest do + use ExUnit.Case, async: true + + test "AuthenticateResponse round-trips between wire and struct" do + data = %{ + "user" => %{ + "object" => "user", + "id" => "id", + "first_name" => "first_name", + "last_name" => "last_name", + "name" => "name", + "profile_picture_url" => "profile_picture_url", + "email" => "email", + "email_verified" => true, + "external_id" => "external_id", + "metadata" => %{}, + "last_sign_in_at" => "2024-01-01T00:00:00.000Z", + "locale" => "locale", + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z" + }, + "organization_id" => "organization_id", + "authkit_authorization_code" => "authkit_authorization_code", + "access_token" => "access_token", + "refresh_token" => "refresh_token", + "authentication_method" => "SSO", + "impersonator" => %{"email" => "email", "reason" => "reason"}, + "oauth_tokens" => %{ + "provider" => "provider", + "refresh_token" => "refresh_token", + "access_token" => "access_token", + "expires_at" => 1, + "scopes" => ["scopes"] + } + } + + serialized = + data |> WorkOS.AuthenticateResponse.from_map() |> WorkOS.AuthenticateResponse.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.AuthenticateResponse.from_map() + |> WorkOS.AuthenticateResponse.to_map() == serialized + end + + test "AuthorizedConnectApplicationList round-trips between wire and struct" do + data = %{ + "object" => "list", + "data" => [ + %{ + "object" => "authorized_connect_application", + "id" => "id", + "granted_scopes" => ["granted_scopes"], + "oauth_resource" => "oauth_resource", + "application" => %{ + "object" => "connect_application", + "id" => "id", + "client_id" => "client_id", + "description" => "description", + "name" => "name", + "scopes" => [], + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z" + } + } + ], + "list_metadata" => %{"before" => "before", "after" => "after"} + } + + serialized = + data + |> WorkOS.AuthorizedConnectApplicationList.from_map() + |> WorkOS.AuthorizedConnectApplicationList.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.AuthorizedConnectApplicationList.from_map() + |> WorkOS.AuthorizedConnectApplicationList.to_map() == serialized + end + + test "CORSOriginResponse round-trips between wire and struct" do + data = %{ + "object" => "cors_origin", + "id" => "id", + "origin" => "origin", + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z" + } + + serialized = + data |> WorkOS.CORSOriginResponse.from_map() |> WorkOS.CORSOriginResponse.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.CORSOriginResponse.from_map() + |> WorkOS.CORSOriginResponse.to_map() == serialized + end + + test "DeviceAuthorizationResponse round-trips between wire and struct" do + data = %{ + "device_code" => "device_code", + "user_code" => "user_code", + "verification_uri" => "verification_uri", + "verification_uri_complete" => "verification_uri_complete", + "expires_in" => 1, + "interval" => 1 + } + + serialized = + data + |> WorkOS.DeviceAuthorizationResponse.from_map() + |> WorkOS.DeviceAuthorizationResponse.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.DeviceAuthorizationResponse.from_map() + |> WorkOS.DeviceAuthorizationResponse.to_map() == serialized + end + + test "EmailChange round-trips between wire and struct" do + data = %{ + "object" => "email_change", + "user" => %{ + "object" => "user", + "id" => "id", + "first_name" => "first_name", + "last_name" => "last_name", + "name" => "name", + "profile_picture_url" => "profile_picture_url", + "email" => "email", + "email_verified" => true, + "external_id" => "external_id", + "metadata" => %{}, + "last_sign_in_at" => "2024-01-01T00:00:00.000Z", + "locale" => "locale", + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z" + }, + "new_email" => "new_email", + "expires_at" => "2024-01-01T00:00:00.000Z", + "created_at" => "2024-01-01T00:00:00.000Z" + } + + serialized = data |> WorkOS.EmailChange.from_map() |> WorkOS.EmailChange.to_map() + assert serialized == data + + assert serialized |> WorkOS.EmailChange.from_map() |> WorkOS.EmailChange.to_map() == + serialized + end + + test "EmailChangeConfirmation round-trips between wire and struct" do + data = %{ + "object" => "email_change_confirmation", + "user" => %{ + "object" => "user", + "id" => "id", + "first_name" => "first_name", + "last_name" => "last_name", + "name" => "name", + "profile_picture_url" => "profile_picture_url", + "email" => "email", + "email_verified" => true, + "external_id" => "external_id", + "metadata" => %{}, + "last_sign_in_at" => "2024-01-01T00:00:00.000Z", + "locale" => "locale", + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z" + } + } + + serialized = + data |> WorkOS.EmailChangeConfirmation.from_map() |> WorkOS.EmailChangeConfirmation.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.EmailChangeConfirmation.from_map() + |> WorkOS.EmailChangeConfirmation.to_map() == serialized + end + + test "EmailVerification round-trips between wire and struct" do + data = %{ + "object" => "email_verification", + "id" => "id", + "user_id" => "user_id", + "email" => "email", + "expires_at" => "2024-01-01T00:00:00.000Z", + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z", + "code" => "code" + } + + serialized = data |> WorkOS.EmailVerification.from_map() |> WorkOS.EmailVerification.to_map() + assert serialized == data + + assert serialized |> WorkOS.EmailVerification.from_map() |> WorkOS.EmailVerification.to_map() == + serialized + end + + test "Invitation round-trips between wire and struct" do + data = %{ + "object" => "invitation", + "id" => "id", + "email" => "email", + "state" => "pending", + "accepted_at" => "2024-01-01T00:00:00.000Z", + "revoked_at" => "2024-01-01T00:00:00.000Z", + "expires_at" => "2024-01-01T00:00:00.000Z", + "organization_id" => "organization_id", + "inviter_user_id" => "inviter_user_id", + "accepted_user_id" => "accepted_user_id", + "role_slug" => "role_slug", + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z", + "token" => "token", + "accept_invitation_url" => "accept_invitation_url" + } + + serialized = data |> WorkOS.Invitation.from_map() |> WorkOS.Invitation.to_map() + assert serialized == data + + assert serialized |> WorkOS.Invitation.from_map() |> WorkOS.Invitation.to_map() == serialized + end + + test "JWTTemplateResponse round-trips between wire and struct" do + data = %{ + "object" => "jwt_template", + "content" => "content", + "created_at" => "created_at", + "updated_at" => "updated_at" + } + + serialized = + data |> WorkOS.JWTTemplateResponse.from_map() |> WorkOS.JWTTemplateResponse.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.JWTTemplateResponse.from_map() + |> WorkOS.JWTTemplateResponse.to_map() == serialized + end + + test "JwksResponse round-trips between wire and struct" do + data = %{ + "keys" => [ + %{ + "alg" => "RS256", + "kty" => "RSA", + "use" => "sig", + "x5c" => ["x5c"], + "n" => "n", + "e" => "e", + "kid" => "kid", + "x5t#S256" => "x5t#S256" + } + ] + } + + serialized = data |> WorkOS.JwksResponse.from_map() |> WorkOS.JwksResponse.to_map() + assert serialized == data + + assert serialized |> WorkOS.JwksResponse.from_map() |> WorkOS.JwksResponse.to_map() == + serialized + end + + test "MagicAuth round-trips between wire and struct" do + data = %{ + "object" => "magic_auth", + "id" => "id", + "user_id" => "user_id", + "email" => "email", + "expires_at" => "2024-01-01T00:00:00.000Z", + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z", + "code" => "code" + } + + serialized = data |> WorkOS.MagicAuth.from_map() |> WorkOS.MagicAuth.to_map() + assert serialized == data + + assert serialized |> WorkOS.MagicAuth.from_map() |> WorkOS.MagicAuth.to_map() == serialized + end + + test "MagicAuthSendMagicAuthCodeAndReturnResponse round-trips between wire and struct" do + data = %{ + "object" => "magic_auth", + "id" => "id", + "user_id" => "user_id", + "email" => "email", + "expires_at" => "2024-01-01T00:00:00.000Z", + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z", + "code" => "code", + "radar_auth_attempt_id" => "radar_auth_attempt_id" + } + + serialized = + data + |> WorkOS.MagicAuthSendMagicAuthCodeAndReturnResponse.from_map() + |> WorkOS.MagicAuthSendMagicAuthCodeAndReturnResponse.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.MagicAuthSendMagicAuthCodeAndReturnResponse.from_map() + |> WorkOS.MagicAuthSendMagicAuthCodeAndReturnResponse.to_map() == serialized + end + + test "PasswordReset round-trips between wire and struct" do + data = %{ + "object" => "password_reset", + "id" => "id", + "user_id" => "user_id", + "email" => "email", + "expires_at" => "2024-01-01T00:00:00.000Z", + "created_at" => "2024-01-01T00:00:00.000Z", + "password_reset_token" => "password_reset_token", + "password_reset_url" => "password_reset_url" + } + + serialized = data |> WorkOS.PasswordReset.from_map() |> WorkOS.PasswordReset.to_map() + assert serialized == data + + assert serialized |> WorkOS.PasswordReset.from_map() |> WorkOS.PasswordReset.to_map() == + serialized + end + + test "RadarChallenge round-trips between wire and struct" do + data = %{ + "object" => "radar_challenge", + "id" => "id", + "type" => "email", + "user_id" => "user_id", + "email" => "email", + "expires_at" => "2024-01-01T00:00:00.000Z", + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z", + "code" => "code" + } + + serialized = data |> WorkOS.RadarChallenge.from_map() |> WorkOS.RadarChallenge.to_map() + assert serialized == data + + assert serialized |> WorkOS.RadarChallenge.from_map() |> WorkOS.RadarChallenge.to_map() == + serialized + end + + test "RedirectUri round-trips between wire and struct" do + data = %{ + "object" => "redirect_uri", + "id" => "id", + "uri" => "uri", + "default" => true, + "created_at" => "created_at", + "updated_at" => "updated_at" + } + + serialized = data |> WorkOS.RedirectUri.from_map() |> WorkOS.RedirectUri.to_map() + assert serialized == data + + assert serialized |> WorkOS.RedirectUri.from_map() |> WorkOS.RedirectUri.to_map() == + serialized + end + + test "ResetPasswordResponse round-trips between wire and struct" do + data = %{ + "user" => %{ + "object" => "user", + "id" => "id", + "first_name" => "first_name", + "last_name" => "last_name", + "name" => "name", + "profile_picture_url" => "profile_picture_url", + "email" => "email", + "email_verified" => true, + "external_id" => "external_id", + "metadata" => %{}, + "last_sign_in_at" => "2024-01-01T00:00:00.000Z", + "locale" => "locale", + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z" + } + } + + serialized = + data |> WorkOS.ResetPasswordResponse.from_map() |> WorkOS.ResetPasswordResponse.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.ResetPasswordResponse.from_map() + |> WorkOS.ResetPasswordResponse.to_map() == serialized + end + + test "SendRadarSmsChallengeResponse round-trips between wire and struct" do + data = %{"verification_id" => "verification_id", "phone_number" => "phone_number"} + + serialized = + data + |> WorkOS.SendRadarSmsChallengeResponse.from_map() + |> WorkOS.SendRadarSmsChallengeResponse.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.SendRadarSmsChallengeResponse.from_map() + |> WorkOS.SendRadarSmsChallengeResponse.to_map() == serialized + end + + test "SendVerificationEmailResponse round-trips between wire and struct" do + data = %{ + "user" => %{ + "object" => "user", + "id" => "id", + "first_name" => "first_name", + "last_name" => "last_name", + "name" => "name", + "profile_picture_url" => "profile_picture_url", + "email" => "email", + "email_verified" => true, + "external_id" => "external_id", + "metadata" => %{}, + "last_sign_in_at" => "2024-01-01T00:00:00.000Z", + "locale" => "locale", + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z" + } + } + + serialized = + data + |> WorkOS.SendVerificationEmailResponse.from_map() + |> WorkOS.SendVerificationEmailResponse.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.SendVerificationEmailResponse.from_map() + |> WorkOS.SendVerificationEmailResponse.to_map() == serialized + end + + test "User round-trips between wire and struct" do + data = %{ + "object" => "user", + "id" => "id", + "first_name" => "first_name", + "last_name" => "last_name", + "name" => "name", + "profile_picture_url" => "profile_picture_url", + "email" => "email", + "email_verified" => true, + "external_id" => "external_id", + "metadata" => %{}, + "last_sign_in_at" => "2024-01-01T00:00:00.000Z", + "locale" => "locale", + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z" + } + + serialized = data |> WorkOS.User.from_map() |> WorkOS.User.to_map() + assert serialized == data + + assert serialized |> WorkOS.User.from_map() |> WorkOS.User.to_map() == serialized + end + + test "UserApiKeyList round-trips between wire and struct" do + data = %{ + "object" => "list", + "data" => [ + %{ + "object" => "api_key", + "id" => "id", + "owner" => %{"type" => "user", "id" => "id", "organization_id" => "organization_id"}, + "name" => "name", + "obfuscated_value" => "obfuscated_value", + "last_used_at" => "2024-01-01T00:00:00.000Z", + "expires_at" => "2024-01-01T00:00:00.000Z", + "permissions" => ["permissions"], + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z" + } + ], + "list_metadata" => %{"before" => "before", "after" => "after"} + } + + serialized = data |> WorkOS.UserApiKeyList.from_map() |> WorkOS.UserApiKeyList.to_map() + assert serialized == data + + assert serialized |> WorkOS.UserApiKeyList.from_map() |> WorkOS.UserApiKeyList.to_map() == + serialized + end + + test "UserApiKeyWithValue round-trips between wire and struct" do + data = %{ + "object" => "api_key", + "id" => "id", + "owner" => %{"type" => "user", "id" => "id", "organization_id" => "organization_id"}, + "name" => "name", + "obfuscated_value" => "obfuscated_value", + "last_used_at" => "2024-01-01T00:00:00.000Z", + "expires_at" => "2024-01-01T00:00:00.000Z", + "permissions" => ["permissions"], + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z", + "value" => "value" + } + + serialized = + data |> WorkOS.UserApiKeyWithValue.from_map() |> WorkOS.UserApiKeyWithValue.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.UserApiKeyWithValue.from_map() + |> WorkOS.UserApiKeyWithValue.to_map() == serialized + end + + test "UserCreateResponse round-trips between wire and struct" do + data = %{ + "object" => "user", + "id" => "id", + "first_name" => "first_name", + "last_name" => "last_name", + "name" => "name", + "profile_picture_url" => "profile_picture_url", + "email" => "email", + "email_verified" => true, + "external_id" => "external_id", + "metadata" => %{}, + "last_sign_in_at" => "2024-01-01T00:00:00.000Z", + "locale" => "locale", + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z", + "radar_auth_attempt_id" => "radar_auth_attempt_id" + } + + serialized = + data |> WorkOS.UserCreateResponse.from_map() |> WorkOS.UserCreateResponse.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.UserCreateResponse.from_map() + |> WorkOS.UserCreateResponse.to_map() == serialized + end + + test "UserIdentitiesGetItem round-trips between wire and struct" do + data = %{"idp_id" => "idp_id", "type" => "OAuth", "provider" => "AppleOAuth"} + + serialized = + data |> WorkOS.UserIdentitiesGetItem.from_map() |> WorkOS.UserIdentitiesGetItem.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.UserIdentitiesGetItem.from_map() + |> WorkOS.UserIdentitiesGetItem.to_map() == serialized + end + + test "UserInvite round-trips between wire and struct" do + data = %{ + "object" => "invitation", + "id" => "id", + "email" => "email", + "state" => "pending", + "accepted_at" => "2024-01-01T00:00:00.000Z", + "revoked_at" => "2024-01-01T00:00:00.000Z", + "expires_at" => "2024-01-01T00:00:00.000Z", + "organization_id" => "organization_id", + "inviter_user_id" => "inviter_user_id", + "accepted_user_id" => "accepted_user_id", + "role_slug" => "role_slug", + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z", + "token" => "token", + "accept_invitation_url" => "accept_invitation_url" + } + + serialized = data |> WorkOS.UserInvite.from_map() |> WorkOS.UserInvite.to_map() + assert serialized == data + + assert serialized |> WorkOS.UserInvite.from_map() |> WorkOS.UserInvite.to_map() == serialized + end + + test "UserInviteList round-trips between wire and struct" do + data = %{ + "object" => "list", + "data" => [ + %{ + "object" => "invitation", + "id" => "id", + "email" => "email", + "state" => "pending", + "accepted_at" => "2024-01-01T00:00:00.000Z", + "revoked_at" => "2024-01-01T00:00:00.000Z", + "expires_at" => "2024-01-01T00:00:00.000Z", + "organization_id" => "organization_id", + "inviter_user_id" => "inviter_user_id", + "accepted_user_id" => "accepted_user_id", + "role_slug" => "role_slug", + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z", + "token" => "token", + "accept_invitation_url" => "accept_invitation_url" + } + ], + "list_metadata" => %{"before" => "before", "after" => "after"} + } + + serialized = data |> WorkOS.UserInviteList.from_map() |> WorkOS.UserInviteList.to_map() + assert serialized == data + + assert serialized |> WorkOS.UserInviteList.from_map() |> WorkOS.UserInviteList.to_map() == + serialized + end + + test "UserList round-trips between wire and struct" do + data = %{ + "object" => "list", + "data" => [ + %{ + "object" => "user", + "id" => "id", + "first_name" => "first_name", + "last_name" => "last_name", + "name" => "name", + "profile_picture_url" => "profile_picture_url", + "email" => "email", + "email_verified" => true, + "external_id" => "external_id", + "metadata" => %{}, + "last_sign_in_at" => "2024-01-01T00:00:00.000Z", + "locale" => "locale", + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z" + } + ], + "list_metadata" => %{"before" => "before", "after" => "after"} + } + + serialized = data |> WorkOS.UserList.from_map() |> WorkOS.UserList.to_map() + assert serialized == data + + assert serialized |> WorkOS.UserList.from_map() |> WorkOS.UserList.to_map() == serialized + end + + test "UserSessionsListItem round-trips between wire and struct" do + data = %{ + "object" => "session", + "id" => "id", + "impersonator" => %{"email" => "email", "reason" => "reason"}, + "ip_address" => "ip_address", + "organization_id" => "organization_id", + "user_agent" => "user_agent", + "user_id" => "user_id", + "auth_method" => "cross_app_auth", + "status" => "active", + "expires_at" => "2024-01-01T00:00:00.000Z", + "ended_at" => "2024-01-01T00:00:00.000Z", + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z" + } + + serialized = + data |> WorkOS.UserSessionsListItem.from_map() |> WorkOS.UserSessionsListItem.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.UserSessionsListItem.from_map() + |> WorkOS.UserSessionsListItem.to_map() == serialized + end + + test "VerifyEmailResponse round-trips between wire and struct" do + data = %{ + "user" => %{ + "object" => "user", + "id" => "id", + "first_name" => "first_name", + "last_name" => "last_name", + "name" => "name", + "profile_picture_url" => "profile_picture_url", + "email" => "email", + "email_verified" => true, + "external_id" => "external_id", + "metadata" => %{}, + "last_sign_in_at" => "2024-01-01T00:00:00.000Z", + "locale" => "locale", + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z" + } + } + + serialized = + data |> WorkOS.VerifyEmailResponse.from_map() |> WorkOS.VerifyEmailResponse.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.VerifyEmailResponse.from_map() + |> WorkOS.VerifyEmailResponse.to_map() == serialized + end +end diff --git a/test/workos/user_management_test.exs b/test/workos/user_management_test.exs index fc0a61d0..46709e03 100644 --- a/test/workos/user_management_test.exs +++ b/test/workos/user_management_test.exs @@ -1,670 +1,852 @@ -defmodule WorkOS.UserManagementTest do - use WorkOS.TestCase +# This file is auto-generated by oagen. Do not edit. - alias WorkOS.UserManagement.ClientMock +defmodule WorkOS.UserManagementTest do + use ExUnit.Case, async: true - setup :setup_env + setup do + client = + WorkOS.Client.new( + api_key: "sk_test_key", + req_options: [plug: {Req.Test, WorkOS.Client}] + ) - def parse_uri(url) do - uri = URI.parse(url) - %URI{uri | query: URI.query_decoder(uri.query) |> Enum.to_list()} + {:ok, client: client} end - describe "get_authorization_url" do - test "generates an authorize url with the default `base_url`" do - opts = [ - connection_id: "mock-connection-id", - redirect_uri: "example.com/sso/workos/callback" - ] - - assert {:ok, success_url} = - opts |> Map.new() |> WorkOS.UserManagement.get_authorization_url() - - assert WorkOS.base_url() =~ parse_uri(success_url).host - end - - test "generates an authorize url with a `provider`" do - opts = [provider: "MicrosoftOAuth", redirect_uri: "example.com/sso/workos/callback"] - - assert {:ok, success_url} = - opts |> Map.new() |> WorkOS.UserManagement.get_authorization_url() - - assert {"provider", "MicrosoftOAuth"} in parse_uri(success_url).query - end - - test "generates an authorize url with a `connection_id`" do - opts = [ - connection_id: "mock-connection-id", - redirect_uri: "example.com/sso/workos/callback" - ] - - assert {:ok, success_url} = - opts |> Map.new() |> WorkOS.UserManagement.get_authorization_url() - - assert {"connection_id", "mock-connection-id"} in parse_uri(success_url).query - end + test "get_jwks succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/sso/jwks/test_client_id" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("user_management/get_jwks")) + end) - test "generates an authorization url with a `organization_id`" do - opts = [ - organization_id: "mock-organization", - redirect_uri: "example.com/sso/workos/callback" - ] - - assert {:ok, success_url} = - opts |> Map.new() |> WorkOS.UserManagement.get_authorization_url() - - assert {"organization_id", "mock-organization"} in parse_uri(success_url).query - end - - test "generates an authorization url with a custom `base_url` from app config" do - initial_config = Application.get_env(:workos, WorkOS.Client) + assert {:ok, %WorkOS.JwksResponse{}} = + WorkOS.UserManagement.get_jwks(client, "test_client_id") + end - Application.put_env( - :workos, - WorkOS.Client, - Keyword.put(initial_config, :base_url, "https://custom-base-url.com") + test "authenticate_with_password succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/user_management/authenticate" + {:ok, req_body, conn} = Plug.Conn.read_body(conn) + req_body = JSON.decode!(req_body) + assert req_body["grant_type"] == "password" + + Req.Test.json( + conn, + WorkOS.TestFixtures.fixture("user_management/authenticate_with_password") ) + end) + + assert {:ok, + %WorkOS.AuthenticateResponse{ + organization_id: "organization_id", + authkit_authorization_code: "authkit_authorization_code" + }} = + WorkOS.UserManagement.authenticate_with_password(client, %{ + email: "test_email", + password: "test_password" + }) + end - opts = [provider: "GoogleOAuth", redirect_uri: "example.com/sso/workos/callback"] - - assert {:ok, success_url} = - opts |> Map.new() |> WorkOS.UserManagement.get_authorization_url() - - assert "custom-base-url.com" == parse_uri(success_url).host - - Application.put_env(:workos, WorkOS.Client, initial_config) - end - - test "generates an authorization url with a `state`" do - opts = [ - provider: "GoogleOAuth", - state: "mock-state", - redirect_uri: "example.com/sso/workos/callback" - ] - - assert {:ok, success_url} = - opts |> Map.new() |> WorkOS.UserManagement.get_authorization_url() - - assert {"state", "mock-state"} in parse_uri(success_url).query - end - - test "generates an authorization url with a given `domain_hint`" do - opts = [ - organization_id: "mock-organization", - domain_hint: "mock-domain-hint", - redirect_uri: "example.com/sso/workos/callback" - ] - - assert {:ok, success_url} = - opts |> Map.new() |> WorkOS.UserManagement.get_authorization_url() - - assert {"domain_hint", "mock-domain-hint"} in parse_uri(success_url).query - end - - test "generates an authorization url with a given `login_hint`" do - opts = [ - organization_id: "mock-organization", - login_hint: "mock-login-hint", - redirect_uri: "example.com/sso/workos/callback" - ] - - assert {:ok, success_url} = - opts |> Map.new() |> WorkOS.UserManagement.get_authorization_url() - - assert {"login_hint", "mock-login-hint"} in parse_uri(success_url).query - end - - test "with a invalid selector, returns error" do - opts = [ - redirect_uri: "example.com/sso/workos/callback" - ] - - {:error, _message} = opts |> Map.new() |> WorkOS.UserManagement.get_authorization_url() - end + test "authenticate_with_code succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/user_management/authenticate" + {:ok, req_body, conn} = Plug.Conn.read_body(conn) + req_body = JSON.decode!(req_body) + assert req_body["grant_type"] == "authorization_code" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("user_management/authenticate_with_code")) + end) + + assert {:ok, + %WorkOS.AuthenticateResponse{ + organization_id: "organization_id", + authkit_authorization_code: "authkit_authorization_code" + }} = WorkOS.UserManagement.authenticate_with_code(client, %{code: "test_code"}) end - describe "get_user" do - test "requests a user", context do - opts = [user_id: "user_01H5JQDV7R7ATEYZDEG0W5PRYS"] + test "authenticate_with_refresh_token succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/user_management/authenticate" + {:ok, req_body, conn} = Plug.Conn.read_body(conn) + req_body = JSON.decode!(req_body) + assert req_body["grant_type"] == "refresh_token" + + Req.Test.json( + conn, + WorkOS.TestFixtures.fixture("user_management/authenticate_with_refresh_token") + ) + end) + + assert {:ok, + %WorkOS.AuthenticateResponse{ + organization_id: "organization_id", + authkit_authorization_code: "authkit_authorization_code" + }} = + WorkOS.UserManagement.authenticate_with_refresh_token(client, %{ + refresh_token: "test_refresh_token" + }) + end - context |> ClientMock.get_user(assert_fields: opts) + test "authenticate_with_magic_auth succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/user_management/authenticate" + {:ok, req_body, conn} = Plug.Conn.read_body(conn) + req_body = JSON.decode!(req_body) + assert req_body["grant_type"] == "urn:workos:oauth:grant-type:magic-auth:code" + + Req.Test.json( + conn, + WorkOS.TestFixtures.fixture("user_management/authenticate_with_magic_auth") + ) + end) + + assert {:ok, + %WorkOS.AuthenticateResponse{ + organization_id: "organization_id", + authkit_authorization_code: "authkit_authorization_code" + }} = + WorkOS.UserManagement.authenticate_with_magic_auth(client, %{ + code: "test_code", + email: "test_email" + }) + end - assert {:ok, %WorkOS.UserManagement.User{id: id}} = - WorkOS.UserManagement.get_user(opts |> Keyword.get(:user_id)) + test "authenticate_with_email_verification succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/user_management/authenticate" + {:ok, req_body, conn} = Plug.Conn.read_body(conn) + req_body = JSON.decode!(req_body) + assert req_body["grant_type"] == "urn:workos:oauth:grant-type:email-verification:code" + + Req.Test.json( + conn, + WorkOS.TestFixtures.fixture("user_management/authenticate_with_email_verification") + ) + end) + + assert {:ok, + %WorkOS.AuthenticateResponse{ + organization_id: "organization_id", + authkit_authorization_code: "authkit_authorization_code" + }} = + WorkOS.UserManagement.authenticate_with_email_verification(client, %{ + code: "test_code", + pending_authentication_token: "test_pending_authentication_token" + }) + end - refute is_nil(id) - end + test "authenticate_with_totp succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/user_management/authenticate" + {:ok, req_body, conn} = Plug.Conn.read_body(conn) + req_body = JSON.decode!(req_body) + assert req_body["grant_type"] == "urn:workos:oauth:grant-type:mfa-totp" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("user_management/authenticate_with_totp")) + end) + + assert {:ok, + %WorkOS.AuthenticateResponse{ + organization_id: "organization_id", + authkit_authorization_code: "authkit_authorization_code" + }} = + WorkOS.UserManagement.authenticate_with_totp(client, %{ + code: "test_code", + pending_authentication_token: "test_pending_authentication_token", + authentication_challenge_id: "test_authentication_challenge_id" + }) end - describe "get_user_by_external_id" do - test "requests a user by external_id", context do - opts = [external_id: "ext_user_123"] - context |> ClientMock.get_user_by_external_id(assert_fields: opts) + test "authenticate_with_organization_selection succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/user_management/authenticate" + {:ok, req_body, conn} = Plug.Conn.read_body(conn) + req_body = JSON.decode!(req_body) + assert req_body["grant_type"] == "urn:workos:oauth:grant-type:organization-selection" + + Req.Test.json( + conn, + WorkOS.TestFixtures.fixture("user_management/authenticate_with_organization_selection") + ) + end) + + assert {:ok, + %WorkOS.AuthenticateResponse{ + organization_id: "organization_id", + authkit_authorization_code: "authkit_authorization_code" + }} = + WorkOS.UserManagement.authenticate_with_organization_selection(client, %{ + pending_authentication_token: "test_pending_authentication_token", + organization_id: "test_organization_id" + }) + end - assert {:ok, %WorkOS.UserManagement.User{id: id, external_id: external_id}} = - WorkOS.UserManagement.get_user_by_external_id(opts |> Keyword.get(:external_id)) + test "authenticate_with_device_code succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/user_management/authenticate" + {:ok, req_body, conn} = Plug.Conn.read_body(conn) + req_body = JSON.decode!(req_body) + assert req_body["grant_type"] == "urn:ietf:params:oauth:grant-type:device_code" + + Req.Test.json( + conn, + WorkOS.TestFixtures.fixture("user_management/authenticate_with_device_code") + ) + end) + + assert {:ok, + %WorkOS.AuthenticateResponse{ + organization_id: "organization_id", + authkit_authorization_code: "authkit_authorization_code" + }} = + WorkOS.UserManagement.authenticate_with_device_code(client, %{ + device_code: "test_device_code" + }) + end - refute is_nil(id) - assert external_id == "ext_user_123" - end + test "authenticate_with_radar_email_challenge succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/user_management/authenticate" + {:ok, req_body, conn} = Plug.Conn.read_body(conn) + req_body = JSON.decode!(req_body) + assert req_body["grant_type"] == "urn:workos:oauth:grant-type:radar-email-challenge:code" + + Req.Test.json( + conn, + WorkOS.TestFixtures.fixture("user_management/authenticate_with_radar_email_challenge") + ) + end) + + assert {:ok, + %WorkOS.AuthenticateResponse{ + organization_id: "organization_id", + authkit_authorization_code: "authkit_authorization_code" + }} = + WorkOS.UserManagement.authenticate_with_radar_email_challenge(client, %{ + code: "test_code", + radar_challenge_id: "test_radar_challenge_id", + pending_authentication_token: "test_pending_authentication_token" + }) end - describe "list_users" do - test "without any options, returns users and metadata", context do - context - |> ClientMock.list_users() + test "authenticate_with_radar_sms_challenge succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/user_management/authenticate" + {:ok, req_body, conn} = Plug.Conn.read_body(conn) + req_body = JSON.decode!(req_body) + assert req_body["grant_type"] == "urn:workos:oauth:grant-type:radar-sms-challenge:code" + + Req.Test.json( + conn, + WorkOS.TestFixtures.fixture("user_management/authenticate_with_radar_sms_challenge") + ) + end) + + assert {:ok, + %WorkOS.AuthenticateResponse{ + organization_id: "organization_id", + authkit_authorization_code: "authkit_authorization_code" + }} = + WorkOS.UserManagement.authenticate_with_radar_sms_challenge(client, %{ + code: "test_code", + verification_id: "test_verification_id", + phone_number: "test_phone_number", + pending_authentication_token: "test_pending_authentication_token" + }) + end - assert {:ok, - %WorkOS.List{ - data: [%WorkOS.UserManagement.User{}], - list_metadata: %{} - }} = WorkOS.UserManagement.list_users() - end + test "create_device succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/user_management/authorize/device" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("user_management/create_device")) + end) + + assert {:ok, + %WorkOS.DeviceAuthorizationResponse{ + device_code: "device_code", + user_code: "user_code" + }} = WorkOS.UserManagement.create_device(client) + end - test "with the email option, forms the proper request to the API", context do - opts = [email: "test@example.com"] + test "create_radar_challenge succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/user_management/radar_challenges" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("user_management/create_radar_challenge")) + end) + + assert {:ok, + %WorkOS.SendRadarSmsChallengeResponse{ + verification_id: "verification_id", + phone_number: "phone_number" + }} = WorkOS.UserManagement.create_radar_challenge(client) + end - context - |> ClientMock.list_users(assert_fields: opts) + test "get_radar_challenge succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/user_management/radar_challenges/test_id" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("user_management/get_radar_challenge")) + end) - assert {:ok, - %WorkOS.List{ - data: [%WorkOS.UserManagement.User{}], - list_metadata: %{} - }} = WorkOS.UserManagement.list_users() - end + assert {:ok, %WorkOS.RadarChallenge{object: "radar_challenge", id: "id"}} = + WorkOS.UserManagement.get_radar_challenge(client, "test_id") end - describe "create_user" do - test "with a valid payload, creates a user", context do - opts = [email: "test@example.com"] + test "revoke_session succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/user_management/sessions/revoke" + Plug.Conn.send_resp(conn, 204, "") + end) - context |> ClientMock.create_user(assert_fields: opts) + assert {:ok, _} = WorkOS.UserManagement.revoke_session(client) + end - assert {:ok, %WorkOS.UserManagement.User{id: id}} = - WorkOS.UserManagement.create_user(opts |> Enum.into(%{})) + test "list_cors_origins succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/user_management/cors_origins" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("user_management/list_cors_origins")) + end) - refute is_nil(id) - end + assert {:ok, + %WorkOS.Page{data: [%WorkOS.CORSOriginResponse{object: "cors_origin", id: "id"} | _]}} = + WorkOS.UserManagement.list_cors_origins(client) + end - test "with password, creates a user", context do - opts = [email: "test@example.com", password: "secure-password-123"] + test "list_cors_origins handles an empty page", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + Req.Test.json(conn, %{"data" => [], "list_metadata" => %{"after" => nil}}) + end) - context |> ClientMock.create_user(assert_fields: opts) + assert {:ok, %WorkOS.Page{data: []} = page} = WorkOS.UserManagement.list_cors_origins(client) + refute WorkOS.Page.has_more?(page) + assert page |> WorkOS.Page.stream() |> Enum.to_list() == [] + end - assert {:ok, %WorkOS.UserManagement.User{id: id}} = - WorkOS.UserManagement.create_user(opts |> Enum.into(%{})) + test "create_cors_origin succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/user_management/cors_origins" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("user_management/create_cors_origin")) + end) - refute is_nil(id) - end + assert {:ok, %WorkOS.CORSOriginResponse{object: "cors_origin", id: "id"}} = + WorkOS.UserManagement.create_cors_origin(client) + end - test "with password_hash, creates a user", context do - opts = [ - email: "test@example.com", - password_hash: "$2a$10$abc123hashedpassword", - password_hash_type: "bcrypt" - ] + test "get_email_verification succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/user_management/email_verification/test_id" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("user_management/get_email_verification")) + end) - context |> ClientMock.create_user(assert_fields: opts) + assert {:ok, %WorkOS.EmailVerification{object: "email_verification", id: "id"}} = + WorkOS.UserManagement.get_email_verification(client, "test_id") + end - assert {:ok, %WorkOS.UserManagement.User{id: id}} = - WorkOS.UserManagement.create_user(opts |> Enum.into(%{})) + test "reset_password succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/user_management/password_reset" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("user_management/reset_password")) + end) - refute is_nil(id) - end + assert {:ok, %WorkOS.PasswordReset{object: "password_reset", id: "id"}} = + WorkOS.UserManagement.reset_password(client) + end - test "with all optional fields, creates a user", context do - opts = [ - email: "test@example.com", - password: "secure-password-123", - first_name: "Test", - last_name: "User", - email_verified: true, - external_id: "ext_123", - metadata: %{"role" => "admin"} - ] + test "confirm_password_reset succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/user_management/password_reset/confirm" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("user_management/confirm_password_reset")) + end) - context |> ClientMock.create_user(assert_fields: opts) + assert {:ok, %WorkOS.ResetPasswordResponse{}} = + WorkOS.UserManagement.confirm_password_reset(client) + end - assert {:ok, %WorkOS.UserManagement.User{id: id}} = - WorkOS.UserManagement.create_user(opts |> Enum.into(%{})) + test "get_password_reset succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/user_management/password_reset/test_id" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("user_management/get_password_reset")) + end) - refute is_nil(id) - end + assert {:ok, %WorkOS.PasswordReset{object: "password_reset", id: "id"}} = + WorkOS.UserManagement.get_password_reset(client, "test_id") end - describe "update_user" do - test "with a valid payload, updates a user", context do - opts = [ - user_id: "user_01H5JQDV7R7ATEYZDEG0W5PRYS", - first_name: "Foo test", - last_name: "Foo test" - ] + test "list_users succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/user_management/users" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("user_management/list_users")) + end) - context |> ClientMock.update_user(assert_fields: opts) + assert {:ok, %WorkOS.Page{data: [%WorkOS.UserList{object: "list"} | _]}} = + WorkOS.UserManagement.list_users(client) + end - assert {:ok, %WorkOS.UserManagement.User{id: id}} = - WorkOS.UserManagement.update_user( - opts |> Keyword.get(:user_id), - opts |> Enum.into(%{}) - ) + test "list_users handles an empty page", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + Req.Test.json(conn, %{"data" => [], "list_metadata" => %{"after" => nil}}) + end) - refute is_nil(id) - end + assert {:ok, %WorkOS.Page{data: []} = page} = WorkOS.UserManagement.list_users(client) + refute WorkOS.Page.has_more?(page) + assert page |> WorkOS.Page.stream() |> Enum.to_list() == [] + end - test "with email, updates a user", context do - opts = [ - user_id: "user_01H5JQDV7R7ATEYZDEG0W5PRYS", - email: "newemail@example.com" - ] + test "create_user succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/user_management/users" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("user_management/create_user")) + end) - context |> ClientMock.update_user(assert_fields: opts) + assert {:ok, %WorkOS.UserCreateResponse{object: "user", id: "id"}} = + WorkOS.UserManagement.create_user(client) + end - assert {:ok, %WorkOS.UserManagement.User{id: id}} = - WorkOS.UserManagement.update_user( - opts |> Keyword.get(:user_id), - opts |> Enum.into(%{}) - ) + test "get_user_by_external_id succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/user_management/users/external_id/test_external_id" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("user_management/get_user_by_external_id")) + end) - refute is_nil(id) - end + assert {:ok, %WorkOS.User{object: "user", id: "id"}} = + WorkOS.UserManagement.get_user_by_external_id(client, "test_external_id") + end - test "with password_hash, updates a user", context do - opts = [ - user_id: "user_01H5JQDV7R7ATEYZDEG0W5PRYS", - password_hash: "$2a$10$abc123hashedpassword", - password_hash_type: "bcrypt" - ] + test "get_user succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/user_management/users/test_id" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("user_management/get_user")) + end) - context |> ClientMock.update_user(assert_fields: opts) + assert {:ok, %WorkOS.User{object: "user", id: "id"}} = + WorkOS.UserManagement.get_user(client, "test_id") + end - assert {:ok, %WorkOS.UserManagement.User{id: id}} = - WorkOS.UserManagement.update_user( - opts |> Keyword.get(:user_id), - opts |> Enum.into(%{}) - ) + test "update_user succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "PUT" + assert conn.request_path == "/user_management/users/test_id" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("user_management/update_user")) + end) - refute is_nil(id) - end + assert {:ok, %WorkOS.User{object: "user", id: "id"}} = + WorkOS.UserManagement.update_user(client, "test_id") + end - test "with all optional fields, updates a user", context do - opts = [ - user_id: "user_01H5JQDV7R7ATEYZDEG0W5PRYS", - first_name: "Test", - last_name: "User", - email: "updated@example.com", - email_verified: true, - password: "new-password-123", - external_id: "ext_456", - metadata: %{"role" => "user"} - ] + test "delete_user succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "DELETE" + assert conn.request_path == "/user_management/users/test_id" + Plug.Conn.send_resp(conn, 204, "") + end) - context |> ClientMock.update_user(assert_fields: opts) + assert {:ok, _} = WorkOS.UserManagement.delete_user(client, "test_id") + end - assert {:ok, %WorkOS.UserManagement.User{id: id}} = - WorkOS.UserManagement.update_user( - opts |> Keyword.get(:user_id), - opts |> Enum.into(%{}) - ) + test "confirm_email_change succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/user_management/users/test_id/email_change/confirm" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("user_management/confirm_email_change")) + end) - refute is_nil(id) - end + assert {:ok, %WorkOS.EmailChangeConfirmation{object: "email_change_confirmation"}} = + WorkOS.UserManagement.confirm_email_change(client, "test_id") end - describe "delete_user" do - test "sends a request to delete a user", context do - opts = [user_id: "user_01H5JQDV7R7ATEYZDEG0W5PRYS"] + test "send_email_change succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/user_management/users/test_id/email_change/send" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("user_management/send_email_change")) + end) - context |> ClientMock.delete_user(assert_fields: opts) - - assert {:ok, %WorkOS.Empty{}} = - WorkOS.UserManagement.delete_user(opts |> Keyword.get(:user_id)) - end + assert {:ok, %WorkOS.EmailChange{object: "email_change", new_email: "new_email"}} = + WorkOS.UserManagement.send_email_change(client, "test_id") end - describe "authenticate_with_password" do - test "with a valid payload, authenticates with password", context do - opts = [email: "test@example.com", password: "foo-bar"] + test "verify_email succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/user_management/users/test_id/email_verification/confirm" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("user_management/verify_email")) + end) - context |> ClientMock.authenticate(assert_fields: opts) + assert {:ok, %WorkOS.VerifyEmailResponse{}} = + WorkOS.UserManagement.verify_email(client, "test_id") + end - assert {:ok, %WorkOS.UserManagement.Authentication{user: user}} = - WorkOS.UserManagement.authenticate_with_password(opts |> Enum.into(%{})) + test "send_verification_email succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/user_management/users/test_id/email_verification/send" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("user_management/send_verification_email")) + end) - refute is_nil(user["id"]) - end + assert {:ok, %WorkOS.SendVerificationEmailResponse{}} = + WorkOS.UserManagement.send_verification_email(client, "test_id") end - describe "authenticate_with_code" do - test "with a valid payload, authenticates with code", context do - opts = [code: "foo-bar"] + test "get_user_identities succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/user_management/users/test_id/identities" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("user_management/get_user_identities")) + end) - context |> ClientMock.authenticate(assert_fields: opts) + assert {:ok, [%WorkOS.UserIdentitiesGetItem{idp_id: "idp_id", type: "OAuth"} | _]} = + WorkOS.UserManagement.get_user_identities(client, "test_id") + end - assert {:ok, auth = %WorkOS.UserManagement.Authentication{}} = - WorkOS.UserManagement.authenticate_with_code(opts |> Enum.into(%{})) + test "list_sessions succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/user_management/users/test_id/sessions" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("user_management/list_sessions")) + end) - refute is_nil(auth.user["id"]) - refute is_nil(auth.access_token) - refute is_nil(auth.refresh_token) - end + assert {:ok, + %WorkOS.Page{data: [%WorkOS.UserSessionsListItem{object: "session", id: "id"} | _]}} = + WorkOS.UserManagement.list_sessions(client, "test_id") end - describe "authenticate_with_magic_auth" do - test "with a valid payload, authenticates with magic auth", context do - opts = [code: "foo-bar", email: "test@example.com"] + test "list_sessions handles an empty page", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + Req.Test.json(conn, %{"data" => [], "list_metadata" => %{"after" => nil}}) + end) - context |> ClientMock.authenticate(assert_fields: opts) + assert {:ok, %WorkOS.Page{data: []} = page} = + WorkOS.UserManagement.list_sessions(client, "test_id") - assert {:ok, %WorkOS.UserManagement.Authentication{user: user}} = - WorkOS.UserManagement.authenticate_with_magic_auth(opts |> Enum.into(%{})) - - refute is_nil(user["id"]) - end + refute WorkOS.Page.has_more?(page) + assert page |> WorkOS.Page.stream() |> Enum.to_list() == [] end - describe "authenticate_with_email_verification" do - test "with a valid payload, authenticates with email verification", context do - opts = [code: "foo-bar", pending_authentication_code: "foo-bar"] - - context |> ClientMock.authenticate(assert_fields: opts) + test "list_invitations succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/user_management/invitations" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("user_management/list_invitations")) + end) - assert {:ok, %WorkOS.UserManagement.Authentication{user: user}} = - WorkOS.UserManagement.authenticate_with_email_verification(opts |> Enum.into(%{})) - - refute is_nil(user["id"]) - end + assert {:ok, %WorkOS.Page{data: [%WorkOS.UserInviteList{object: "list"} | _]}} = + WorkOS.UserManagement.list_invitations(client) end - describe "authenticate_with_totp" do - test "with a valid payload, authenticates with MFA TOTP", context do - opts = [ - code: "foo-bar", - authentication_challenge_id: "auth_challenge_1234", - pending_authentication_code: "foo-bar" - ] + test "list_invitations handles an empty page", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + Req.Test.json(conn, %{"data" => [], "list_metadata" => %{"after" => nil}}) + end) - context |> ClientMock.authenticate(assert_fields: opts) + assert {:ok, %WorkOS.Page{data: []} = page} = WorkOS.UserManagement.list_invitations(client) + refute WorkOS.Page.has_more?(page) + assert page |> WorkOS.Page.stream() |> Enum.to_list() == [] + end - assert {:ok, %WorkOS.UserManagement.Authentication{user: user}} = - WorkOS.UserManagement.authenticate_with_totp(opts |> Enum.into(%{})) + test "send_invitation succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/user_management/invitations" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("user_management/send_invitation")) + end) - refute is_nil(user["id"]) - end + assert {:ok, %WorkOS.UserInvite{object: "invitation", id: "id"}} = + WorkOS.UserManagement.send_invitation(client) end - describe "authenticate_with_selected_organization" do - test "with a valid payload, authenticates with a selected organization", context do - opts = [ - pending_authentication_code: "foo-bar", - organization_id: "organization_01H5JQDV7R7ATEYZDEG0W5PRYS" - ] + test "find_invitation_by_token succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/user_management/invitations/by_token/test_token" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("user_management/find_invitation_by_token")) + end) - context |> ClientMock.authenticate(assert_fields: opts) + assert {:ok, %WorkOS.UserInvite{object: "invitation", id: "id"}} = + WorkOS.UserManagement.find_invitation_by_token(client, "test_token") + end - assert {:ok, %WorkOS.UserManagement.Authentication{user: user}} = - WorkOS.UserManagement.authenticate_with_selected_organization( - opts - |> Enum.into(%{}) - ) + test "get_invitation succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/user_management/invitations/test_id" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("user_management/get_invitation")) + end) - refute is_nil(user["id"]) - end + assert {:ok, %WorkOS.UserInvite{object: "invitation", id: "id"}} = + WorkOS.UserManagement.get_invitation(client, "test_id") end - describe "send_magic_auth_code" do - test "with a valid payload, sends magic auth code email", context do - opts = [ - email: "test@example.com" - ] + test "accept_invitation succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/user_management/invitations/test_id/accept" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("user_management/accept_invitation")) + end) - context |> ClientMock.send_magic_auth_code(assert_fields: opts) - - assert :ok = WorkOS.UserManagement.send_magic_auth_code(opts |> Keyword.get(:email)) - end + assert {:ok, %WorkOS.Invitation{object: "invitation", id: "id"}} = + WorkOS.UserManagement.accept_invitation(client, "test_id") end - describe "enroll_auth_factor" do - test "with a valid payload, enrolls auth factor", context do - opts = [ - type: "totp", - user_id: "user_01H5JQDV7R7ATEYZDEG0W5PRYS" - ] + test "resend_invitation succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/user_management/invitations/test_id/resend" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("user_management/resend_invitation")) + end) - context |> ClientMock.enroll_auth_factor(assert_fields: opts) + assert {:ok, %WorkOS.UserInvite{object: "invitation", id: "id"}} = + WorkOS.UserManagement.resend_invitation(client, "test_id") + end - assert {:ok, - %WorkOS.UserManagement.MultiFactor.EnrollAuthFactor{ - challenge: challenge, - factor: factor - }} = - WorkOS.UserManagement.enroll_auth_factor( - opts |> Keyword.get(:user_id), - opts |> Enum.into(%{}) - ) + test "revoke_invitation succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/user_management/invitations/test_id/revoke" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("user_management/revoke_invitation")) + end) - refute is_nil(challenge["id"]) - refute is_nil(factor["id"]) - end + assert {:ok, %WorkOS.Invitation{object: "invitation", id: "id"}} = + WorkOS.UserManagement.revoke_invitation(client, "test_id") end - describe "list_auth_factors" do - test "without any options, returns auth factors and metadata", context do - opts = [ - user_id: "user_01H5JQDV7R7ATEYZDEG0W5PRYS" - ] - - context - |> ClientMock.list_auth_factors(assert_fields: opts) + test "list_jwt_template succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/user_management/jwt_template" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("user_management/list_jwt_template")) + end) - assert {:ok, - %WorkOS.List{ - data: [%WorkOS.UserManagement.MultiFactor.AuthenticationFactor{}], - list_metadata: %{} - }} = WorkOS.UserManagement.list_auth_factors(opts |> Keyword.get(:user_id)) - end + assert {:ok, %WorkOS.JWTTemplateResponse{object: "jwt_template", content: "content"}} = + WorkOS.UserManagement.list_jwt_template(client) end - describe "send_verification_email" do - test "with a valid payload, revokes an invitation", context do - opts = [user_id: "user_01H5JQDV7R7ATEYZDEG0W5PRYS"] + test "update_jwt_template succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "PUT" + assert conn.request_path == "/user_management/jwt_template" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("user_management/update_jwt_template")) + end) - context |> ClientMock.send_verification_email(assert_fields: opts) + assert {:ok, %WorkOS.JWTTemplateResponse{object: "jwt_template", content: "content"}} = + WorkOS.UserManagement.update_jwt_template(client) + end - assert {:ok, %WorkOS.UserManagement.EmailVerification.SendVerificationEmail{user: user}} = - WorkOS.UserManagement.send_verification_email(opts |> Keyword.get(:user_id)) + test "create_magic_auth succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/user_management/magic_auth" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("user_management/create_magic_auth")) + end) - refute is_nil(user["id"]) - end + assert {:ok, + %WorkOS.MagicAuthSendMagicAuthCodeAndReturnResponse{object: "magic_auth", id: "id"}} = + WorkOS.UserManagement.create_magic_auth(client) end - describe "verify_email" do - test "with a valid payload, verifies user email", context do - opts = [ - user_id: "user_01H5JQDV7R7ATEYZDEG0W5PRYS", - code: "Foo test" - ] + test "get_magic_auth succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/user_management/magic_auth/test_id" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("user_management/get_magic_auth")) + end) - context |> ClientMock.verify_email(assert_fields: opts) + assert {:ok, %WorkOS.MagicAuth{object: "magic_auth", id: "id"}} = + WorkOS.UserManagement.get_magic_auth(client, "test_id") + end - assert {:ok, %WorkOS.UserManagement.EmailVerification.VerifyEmail{user: user}} = - WorkOS.UserManagement.verify_email( - opts |> Keyword.get(:user_id), - opts |> Enum.into(%{}) - ) + test "list_redirect_uris succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/user_management/redirect_uris" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("user_management/list_redirect_uris")) + end) - refute is_nil(user["id"]) - end + assert {:ok, %WorkOS.Page{data: [%WorkOS.RedirectUri{object: "redirect_uri", id: "id"} | _]}} = + WorkOS.UserManagement.list_redirect_uris(client) end - describe "send_password_reset_email" do - test "with a valid payload, sends password reset email", context do - opts = [ - email: "test@example.com", - password_reset_url: "https://reset-password-test.com" - ] - - context |> ClientMock.send_password_reset_email(assert_fields: opts) + test "list_redirect_uris handles an empty page", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + Req.Test.json(conn, %{"data" => [], "list_metadata" => %{"after" => nil}}) + end) - assert :ok = WorkOS.UserManagement.send_password_reset_email(opts |> Enum.into(%{})) - end + assert {:ok, %WorkOS.Page{data: []} = page} = WorkOS.UserManagement.list_redirect_uris(client) + refute WorkOS.Page.has_more?(page) + assert page |> WorkOS.Page.stream() |> Enum.to_list() == [] end - describe "reset_password" do - test "with a valid payload, resets password", context do - opts = [ - token: ~c"test", - new_password: ~c"test" - ] + test "create_redirect_uri succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/user_management/redirect_uris" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("user_management/create_redirect_uri")) + end) - context |> ClientMock.reset_password(assert_fields: opts) + assert {:ok, %WorkOS.RedirectUri{object: "redirect_uri", id: "id"}} = + WorkOS.UserManagement.create_redirect_uri(client) + end - assert {:ok, %WorkOS.UserManagement.ResetPassword{user: user}} = - WorkOS.UserManagement.reset_password(opts |> Enum.into(%{})) + test "delete_redirect_uris succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "DELETE" + assert conn.request_path == "/user_management/redirect_uris/test_id" + Plug.Conn.send_resp(conn, 204, "") + end) - refute is_nil(user["id"]) - end + assert {:ok, _} = WorkOS.UserManagement.delete_redirect_uris(client, "test_id") end - describe "get_organization_membership" do - test "requests an organization membership", context do - opts = [organization_membership_id: "om_01H5JQDV7R7ATEYZDEG0W5PRYS"] - - context |> ClientMock.get_organization_membership(assert_fields: opts) + test "list_user_authorized_applications succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/user_management/users/test_user_id/authorized_applications" - assert {:ok, - %WorkOS.UserManagement.OrganizationMembership{ - id: id, - custom_attributes: custom_attributes - }} = - WorkOS.UserManagement.get_organization_membership( - opts - |> Keyword.get(:organization_membership_id) - ) + Req.Test.json( + conn, + WorkOS.TestFixtures.fixture("user_management/list_user_authorized_applications") + ) + end) - refute is_nil(id) - assert custom_attributes == %{"department" => "Engineering"} - end + assert {:ok, + %WorkOS.Page{data: [%WorkOS.AuthorizedConnectApplicationList{object: "list"} | _]}} = + WorkOS.UserManagement.list_user_authorized_applications(client, "test_user_id") end - describe "list_organization_memberships" do - test "without any options, returns organization memberships and metadata", context do - context - |> ClientMock.list_organization_memberships() - - assert {:ok, - %WorkOS.List{ - data: [%WorkOS.UserManagement.OrganizationMembership{}], - list_metadata: %{} - }} = WorkOS.UserManagement.list_organization_memberships() - end - - test "with the user_id option, forms the proper request to the API", context do - opts = [user_id: "user_01H5JQDV7R7ATEYZDEG0W5PRYS"] + test "list_user_authorized_applications handles an empty page", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + Req.Test.json(conn, %{"data" => [], "list_metadata" => %{"after" => nil}}) + end) - context - |> ClientMock.list_organization_memberships(assert_fields: opts) + assert {:ok, %WorkOS.Page{data: []} = page} = + WorkOS.UserManagement.list_user_authorized_applications(client, "test_user_id") - assert {:ok, - %WorkOS.List{ - data: [%WorkOS.UserManagement.OrganizationMembership{}], - list_metadata: %{} - }} = WorkOS.UserManagement.list_organization_memberships() - end + refute WorkOS.Page.has_more?(page) + assert page |> WorkOS.Page.stream() |> Enum.to_list() == [] end - describe "create_organization_membership" do - test "with a valid payload, creates an organization membership", context do - opts = [ - user_id: "user_01H5JQDV7R7ATEYZDEG0W5PRYS", - organization_id: "org_01EHT88Z8J8795GZNQ4ZP1J81T" - ] + test "delete_user_authorized_application succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "DELETE" - context |> ClientMock.create_organization_membership(assert_fields: opts) + assert conn.request_path == + "/user_management/users/test_user_id/authorized_applications/test_application_id" - assert {:ok, %WorkOS.UserManagement.OrganizationMembership{id: id}} = - WorkOS.UserManagement.create_organization_membership(opts |> Enum.into(%{})) + Plug.Conn.send_resp(conn, 204, "") + end) - refute is_nil(id) - end + assert {:ok, _} = + WorkOS.UserManagement.delete_user_authorized_application( + client, + "test_user_id", + "test_application_id" + ) end - describe "delete_organization_membership" do - test "sends a request to delete an organization membership", context do - opts = [organization_membership_id: "om_01H5JQDV7R7ATEYZDEG0W5PRYS"] + test "list_user_api_keys succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/user_management/users/test_user_id/api_keys" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("user_management/list_user_api_keys")) + end) - context |> ClientMock.delete_organization_membership(assert_fields: opts) - - assert {:ok, %WorkOS.Empty{}} = - WorkOS.UserManagement.delete_organization_membership( - opts - |> Keyword.get(:organization_membership_id) - ) - end + assert {:ok, %WorkOS.Page{data: [%WorkOS.UserApiKeyList{object: "list"} | _]}} = + WorkOS.UserManagement.list_user_api_keys(client, "test_user_id") end - describe "list_invitations" do - test "without any options, returns invitations and metadata", context do - context - |> ClientMock.list_invitations() - - assert {:ok, - %WorkOS.List{ - data: [%WorkOS.UserManagement.Invitation{}], - list_metadata: %{} - }} = WorkOS.UserManagement.list_invitations() - end + test "list_user_api_keys handles an empty page", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + Req.Test.json(conn, %{"data" => [], "list_metadata" => %{"after" => nil}}) + end) - test "with the email option, forms the proper request to the API", context do - opts = [email: "test@example.com"] + assert {:ok, %WorkOS.Page{data: []} = page} = + WorkOS.UserManagement.list_user_api_keys(client, "test_user_id") - context - |> ClientMock.list_invitations(assert_fields: opts) - - assert {:ok, - %WorkOS.List{ - data: [%WorkOS.UserManagement.Invitation{}], - list_metadata: %{} - }} = WorkOS.UserManagement.list_invitations() - end + refute WorkOS.Page.has_more?(page) + assert page |> WorkOS.Page.stream() |> Enum.to_list() == [] end - describe "get_invitation" do - test "requests an invitation", context do - opts = [invitation_id: "invitation_01H5JQDV7R7ATEYZDEG0W5PRYS"] + test "create_user_api_key succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/user_management/users/test_user_id/api_keys" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("user_management/create_user_api_key")) + end) - context |> ClientMock.get_invitation(assert_fields: opts) + assert {:ok, %WorkOS.UserApiKeyWithValue{object: "api_key", id: "id"}} = + WorkOS.UserManagement.create_user_api_key(client, "test_user_id") + end - assert {:ok, %WorkOS.UserManagement.Invitation{id: id}} = - WorkOS.UserManagement.get_invitation(opts |> Keyword.get(:invitation_id)) + test "get_authorization_url builds a redirect URL without an HTTP request", %{client: client} do + url = WorkOS.UserManagement.get_authorization_url(client) - refute is_nil(id) - end + assert is_binary(url) + assert String.starts_with?(url, client.base_url) + assert url =~ "/user_management/authorize" + assert url =~ URI.encode_query(%{"response_type" => "code"}) end - describe "send_invitation" do - test "with a valid payload, creates an invitation", context do - opts = [email: "test@example.com"] + test "get_logout_url builds a redirect URL without an HTTP request", %{client: client} do + url = WorkOS.UserManagement.get_logout_url(client) - context |> ClientMock.send_invitation(assert_fields: opts) + assert is_binary(url) + assert String.starts_with?(url, client.base_url) + assert url =~ "/user_management/sessions/logout" + end - assert {:ok, %WorkOS.UserManagement.Invitation{id: id}} = - WorkOS.UserManagement.send_invitation(opts |> Enum.into(%{})) + test "list_cors_origins encodes query parameters", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + params = Plug.Conn.fetch_query_params(conn).query_params + assert params["before"] == "hello world&x" + refute Map.has_key?(params, "after") + Req.Test.json(conn, %{"data" => [], "list_metadata" => %{"after" => nil}}) + end) - refute is_nil(id) - end + assert {:ok, _} = WorkOS.UserManagement.list_cors_origins(client, %{before: "hello world&x"}) end - describe "revoke_invitation" do - test "with a valid payload, revokes an invitation", context do - opts = [invitation_id: "invitation_01H5JQDV7R7ATEYZDEG0W5PRYS"] - - context |> ClientMock.revoke_invitation(assert_fields: opts) + test "get_jwks honors per-request options", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert Plug.Conn.get_req_header(conn, "x-custom") == ["value"] + assert conn.host == "override.example.com" + Plug.Conn.send_resp(conn, 204, "") + end) + + WorkOS.UserManagement.get_jwks(client, "test_client_id", + headers: [{"x-custom", "value"}], + base_url: "https://override.example.com" + ) + end - assert {:ok, %WorkOS.UserManagement.Invitation{id: id}} = - WorkOS.UserManagement.revoke_invitation(opts |> Keyword.get(:invitation_id)) + test "surfaces API errors as tagged tuples", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + conn + |> Plug.Conn.put_status(401) + |> Req.Test.json(%{"message" => "Unauthorized"}) + end) - refute is_nil(id) - end + assert {:error, %WorkOS.ApiError{status: 401}} = + WorkOS.UserManagement.get_jwks(client, "test_client_id") end end diff --git a/test/workos/vault_crypto_test.exs b/test/workos/vault_crypto_test.exs new file mode 100644 index 00000000..f34e0db1 --- /dev/null +++ b/test/workos/vault_crypto_test.exs @@ -0,0 +1,125 @@ +# @oagen-ignore-file — hand-maintained tests for client-side Vault crypto. + +defmodule WorkOS.Vault.CryptoTest do + use ExUnit.Case, async: true + + alias WorkOS.Vault.Crypto + + @data_key :crypto.strong_rand_bytes(32) + @data_key_b64 Base.encode64(@data_key) + # Over 127 bytes so the LEB128 length prefix takes more than one byte. + @encrypted_keys :crypto.strong_rand_bytes(200) + @encrypted_keys_b64 Base.encode64(@encrypted_keys) + + defp build_client do + WorkOS.Client.new( + api_key: "sk_test_key", + req_options: [plug: {Req.Test, WorkOS.Client}] + ) + end + + defp key_pair do + %WorkOS.CreateDataKeyResponse{ + context: %{"org" => "org_123"}, + data_key: @data_key_b64, + encrypted_keys: @encrypted_keys_b64, + id: "key_123" + } + end + + defp decrypt_key do + %WorkOS.DecryptResponse{data_key: @data_key_b64, id: "key_123"} + end + + describe "local encrypt/decrypt" do + test "roundtrips data without touching the API" do + assert {:ok, encrypted} = Crypto.local_encrypt("my secret", key_pair()) + assert {:ok, "my secret"} = Crypto.local_decrypt(encrypted, decrypt_key()) + end + + test "roundtrips with associated data" do + assert {:ok, encrypted} = + Crypto.local_encrypt("my secret", key_pair(), "aad-123") + + assert {:ok, "my secret"} = + Crypto.local_decrypt(encrypted, decrypt_key(), "aad-123") + end + + test "fails when associated data does not match" do + assert {:ok, encrypted} = + Crypto.local_encrypt("my secret", key_pair(), "aad-123") + + assert {:error, :decryption_failed} = + Crypto.local_decrypt(encrypted, decrypt_key(), "aad-456") + end + + test "fails with the wrong data key" do + assert {:ok, encrypted} = Crypto.local_encrypt("my secret", key_pair()) + + wrong = %WorkOS.DecryptResponse{data_key: Base.encode64(:crypto.strong_rand_bytes(32))} + assert {:error, :decryption_failed} = Crypto.local_decrypt(encrypted, wrong) + end + + test "embeds the encrypted keys ahead of the payload" do + assert {:ok, encrypted} = Crypto.local_encrypt("my secret", key_pair()) + + raw = Base.decode64!(encrypted) + # 200 encodes as two LEB128 bytes: 0xC8 0x01. + assert <<0xC8, 0x01, keys::binary-size(200), _rest::binary>> = raw + assert keys == @encrypted_keys + end + + test "rejects truncated input" do + assert {:error, :encrypted_data_too_short} = + Crypto.local_decrypt(Base.encode64(<<5, 1, 2>>), decrypt_key()) + end + end + + describe "encrypt/decrypt via the data-key API" do + test "encrypt fetches a data key and decrypt round-trips it" do + Req.Test.stub(WorkOS.Client, fn conn -> + {:ok, req_body, conn} = Plug.Conn.read_body(conn) + req_body = JSON.decode!(req_body) + + case conn.request_path do + "/vault/v1/keys/data-key" -> + assert req_body["context"] == %{"org" => "org_123"} + + Req.Test.json(conn, %{ + "id" => "key_123", + "context" => %{"org" => "org_123"}, + "data_key" => @data_key_b64, + "encrypted_keys" => @encrypted_keys_b64 + }) + + "/vault/v1/keys/decrypt" -> + assert req_body["keys"] == @encrypted_keys_b64 + Req.Test.json(conn, %{"id" => "key_123", "data_key" => @data_key_b64}) + end + end) + + client = build_client() + + assert {:ok, result} = + Crypto.encrypt(client, "my secret", %{"org" => "org_123"}) + + assert result.encrypted_keys == @encrypted_keys_b64 + assert result.key_context == %{"org" => "org_123"} + + assert {:ok, "my secret"} = Crypto.decrypt(client, result.encrypted_data) + end + + test "decrypt surfaces API errors from the key exchange" do + Req.Test.stub(WorkOS.Client, fn conn -> + conn + |> Plug.Conn.put_status(403) + |> Req.Test.json(%{"message" => "Forbidden"}) + end) + + {:ok, encrypted} = Crypto.local_encrypt("my secret", key_pair()) + + assert {:error, %WorkOS.ApiError{status: 403}} = + Crypto.decrypt(build_client(), encrypted) + end + end +end diff --git a/test/workos/vault_round_trip_test.exs b/test/workos/vault_round_trip_test.exs new file mode 100644 index 00000000..73234673 --- /dev/null +++ b/test/workos/vault_round_trip_test.exs @@ -0,0 +1,152 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.VaultRoundTripTest do + use ExUnit.Case, async: true + + test "CreateDataKeyResponse round-trips between wire and struct" do + data = %{ + "context" => %{}, + "data_key" => "data_key", + "encrypted_keys" => "encrypted_keys", + "id" => "id" + } + + serialized = + data |> WorkOS.CreateDataKeyResponse.from_map() |> WorkOS.CreateDataKeyResponse.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.CreateDataKeyResponse.from_map() + |> WorkOS.CreateDataKeyResponse.to_map() == serialized + end + + test "DecryptResponse round-trips between wire and struct" do + data = %{"data_key" => "data_key", "id" => "id"} + + serialized = data |> WorkOS.DecryptResponse.from_map() |> WorkOS.DecryptResponse.to_map() + assert serialized == data + + assert serialized |> WorkOS.DecryptResponse.from_map() |> WorkOS.DecryptResponse.to_map() == + serialized + end + + test "DeleteObjectResponse round-trips between wire and struct" do + data = %{"name" => "name", "success" => true} + + serialized = + data |> WorkOS.DeleteObjectResponse.from_map() |> WorkOS.DeleteObjectResponse.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.DeleteObjectResponse.from_map() + |> WorkOS.DeleteObjectResponse.to_map() == serialized + end + + test "ObjectListResponse round-trips between wire and struct" do + data = %{ + "data" => [%{"id" => "id", "name" => "name", "updated_at" => "2024-01-01T00:00:00.000Z"}], + "list_metadata" => %{"after" => "after", "before" => "before"} + } + + serialized = + data |> WorkOS.ObjectListResponse.from_map() |> WorkOS.ObjectListResponse.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.ObjectListResponse.from_map() + |> WorkOS.ObjectListResponse.to_map() == serialized + end + + test "ObjectMetadata round-trips between wire and struct" do + data = %{ + "context" => %{}, + "environment_id" => "environment_id", + "id" => "id", + "key_id" => "key_id", + "updated_at" => "2024-01-01T00:00:00.000Z", + "updated_by" => %{"id" => "id", "name" => "name"}, + "version_id" => "version_id" + } + + serialized = data |> WorkOS.ObjectMetadata.from_map() |> WorkOS.ObjectMetadata.to_map() + assert serialized == data + + assert serialized |> WorkOS.ObjectMetadata.from_map() |> WorkOS.ObjectMetadata.to_map() == + serialized + end + + test "ObjectWithoutValue round-trips between wire and struct" do + data = %{ + "id" => "id", + "metadata" => %{ + "context" => %{}, + "environment_id" => "environment_id", + "id" => "id", + "key_id" => "key_id", + "updated_at" => "2024-01-01T00:00:00.000Z", + "updated_by" => %{"id" => "id", "name" => "name"}, + "version_id" => "version_id" + }, + "name" => "name" + } + + serialized = + data |> WorkOS.ObjectWithoutValue.from_map() |> WorkOS.ObjectWithoutValue.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.ObjectWithoutValue.from_map() + |> WorkOS.ObjectWithoutValue.to_map() == serialized + end + + test "VaultObject round-trips between wire and struct" do + data = %{ + "id" => "id", + "metadata" => %{ + "context" => %{}, + "environment_id" => "environment_id", + "id" => "id", + "key_id" => "key_id", + "updated_at" => "2024-01-01T00:00:00.000Z", + "updated_by" => %{"id" => "id", "name" => "name"}, + "version_id" => "version_id" + }, + "name" => "name", + "value" => "value" + } + + serialized = data |> WorkOS.VaultObject.from_map() |> WorkOS.VaultObject.to_map() + assert serialized == data + + assert serialized |> WorkOS.VaultObject.from_map() |> WorkOS.VaultObject.to_map() == + serialized + end + + test "VersionListResponse round-trips between wire and struct" do + data = %{ + "data" => [ + %{ + "created_at" => "2024-01-01T00:00:00.000Z", + "current_version" => true, + "etag" => "etag", + "id" => "id", + "size" => 1 + } + ], + "list_metadata" => %{"after" => "after", "before" => "before"} + } + + serialized = + data |> WorkOS.VersionListResponse.from_map() |> WorkOS.VersionListResponse.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.VersionListResponse.from_map() + |> WorkOS.VersionListResponse.to_map() == serialized + end +end diff --git a/test/workos/vault_test.exs b/test/workos/vault_test.exs new file mode 100644 index 00000000..e3dedd6a --- /dev/null +++ b/test/workos/vault_test.exs @@ -0,0 +1,181 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.VaultTest do + use ExUnit.Case, async: true + + setup do + client = + WorkOS.Client.new( + api_key: "sk_test_key", + req_options: [plug: {Req.Test, WorkOS.Client}] + ) + + {:ok, client: client} + end + + test "create_data_key succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/vault/v1/keys/data-key" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("vault/create_data_key")) + end) + + assert {:ok, + %WorkOS.CreateDataKeyResponse{data_key: "data_key", encrypted_keys: "encrypted_keys"}} = + WorkOS.Vault.create_data_key(client) + end + + test "create_decrypt succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/vault/v1/keys/decrypt" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("vault/create_decrypt")) + end) + + assert {:ok, %WorkOS.DecryptResponse{data_key: "data_key", id: "id"}} = + WorkOS.Vault.create_decrypt(client) + end + + test "create_rekey succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/vault/v1/keys/rekey" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("vault/create_rekey")) + end) + + assert {:ok, + %WorkOS.CreateDataKeyResponse{data_key: "data_key", encrypted_keys: "encrypted_keys"}} = + WorkOS.Vault.create_rekey(client) + end + + test "list_kv succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/vault/v1/kv" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("vault/list_kv")) + end) + + assert {:ok, %WorkOS.Page{data: [%WorkOS.ObjectListResponse{} | _]}} = + WorkOS.Vault.list_kv(client) + end + + test "list_kv handles an empty page", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + Req.Test.json(conn, %{"data" => [], "list_metadata" => %{"after" => nil}}) + end) + + assert {:ok, %WorkOS.Page{data: []} = page} = WorkOS.Vault.list_kv(client) + refute WorkOS.Page.has_more?(page) + assert page |> WorkOS.Page.stream() |> Enum.to_list() == [] + end + + test "create_kv succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/vault/v1/kv" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("vault/create_kv")) + end) + + assert {:ok, %WorkOS.ObjectMetadata{environment_id: "environment_id", id: "id"}} = + WorkOS.Vault.create_kv(client) + end + + test "get_name succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/vault/v1/kv/name/test_name" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("vault/get_name")) + end) + + assert {:ok, %WorkOS.VaultObject{id: "id", name: "name"}} = + WorkOS.Vault.get_name(client, "test_name") + end + + test "get_kv succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/vault/v1/kv/test_id" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("vault/get_kv")) + end) + + assert {:ok, %WorkOS.VaultObject{id: "id", name: "name"}} = + WorkOS.Vault.get_kv(client, "test_id") + end + + test "update_kv succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "PUT" + assert conn.request_path == "/vault/v1/kv/test_id" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("vault/update_kv")) + end) + + assert {:ok, %WorkOS.ObjectWithoutValue{id: "id", name: "name"}} = + WorkOS.Vault.update_kv(client, "test_id") + end + + test "delete_kv succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "DELETE" + assert conn.request_path == "/vault/v1/kv/test_id" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("vault/delete_kv")) + end) + + assert {:ok, %WorkOS.DeleteObjectResponse{name: "name", success: true}} = + WorkOS.Vault.delete_kv(client, "test_id") + end + + test "list_kv_metadata succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/vault/v1/kv/test_id/metadata" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("vault/list_kv_metadata")) + end) + + assert {:ok, %WorkOS.ObjectWithoutValue{id: "id", name: "name"}} = + WorkOS.Vault.list_kv_metadata(client, "test_id") + end + + test "list_kv_versions succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/vault/v1/kv/test_id/versions" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("vault/list_kv_versions")) + end) + + assert {:ok, %WorkOS.VersionListResponse{}} = WorkOS.Vault.list_kv_versions(client, "test_id") + end + + test "list_kv encodes query parameters", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + params = Plug.Conn.fetch_query_params(conn).query_params + assert params["limit"] == "hello world&x" + refute Map.has_key?(params, "before") + Req.Test.json(conn, %{"data" => [], "list_metadata" => %{"after" => nil}}) + end) + + assert {:ok, _} = WorkOS.Vault.list_kv(client, %{limit: "hello world&x"}) + end + + test "create_data_key honors per-request options", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert Plug.Conn.get_req_header(conn, "x-custom") == ["value"] + assert conn.host == "override.example.com" + Plug.Conn.send_resp(conn, 204, "") + end) + + WorkOS.Vault.create_data_key(client, %{}, + headers: [{"x-custom", "value"}], + base_url: "https://override.example.com" + ) + end + + test "surfaces API errors as tagged tuples", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + conn + |> Plug.Conn.put_status(401) + |> Req.Test.json(%{"message" => "Unauthorized"}) + end) + + assert {:error, %WorkOS.ApiError{status: 401}} = WorkOS.Vault.create_data_key(client) + end +end diff --git a/test/workos/webhook_signature_test.exs b/test/workos/webhook_signature_test.exs new file mode 100644 index 00000000..e3ea1e24 --- /dev/null +++ b/test/workos/webhook_signature_test.exs @@ -0,0 +1,100 @@ +# @oagen-ignore-file — hand-maintained tests for webhook signature verification. + +defmodule WorkOS.Webhooks.SignatureTest do + use ExUnit.Case, async: true + + alias WorkOS.Webhooks.Signature + + @secret "webhook_secret_123" + @body ~s({"id":"event_123","event":"dsync.user.created","data":{"id":"user_123"},"created_at":"2026-01-01T00:00:00.000Z"}) + + defp signed_header(body, now_ms, secret \\ @secret) do + timestamp = Integer.to_string(now_ms) + "t=#{timestamp}, v1=#{Signature.compute_signature(secret, timestamp, body)}" + end + + test "construct_event verifies and deserializes a valid payload" do + now_ms = System.system_time(:millisecond) + header = signed_header(@body, now_ms) + + assert {:ok, %WorkOS.EventSchema{} = event} = + Signature.construct_event(header, @body, @secret) + + assert event.id == "event_123" + assert event.event == "dsync.user.created" + assert event.data["id"] == "user_123" + end + + test "verify_payload returns the verified body" do + now_ms = System.system_time(:millisecond) + header = signed_header(@body, now_ms) + + assert {:ok, @body} = Signature.verify_payload(header, @body, @secret) + end + + test "rejects a tampered body" do + now_ms = System.system_time(:millisecond) + header = signed_header(@body, now_ms) + + assert {:error, :no_valid_signature} = + Signature.verify_payload(header, @body <> "tampered", @secret) + end + + test "rejects the wrong secret" do + now_ms = System.system_time(:millisecond) + header = signed_header(@body, now_ms, "other_secret") + + assert {:error, :no_valid_signature} = Signature.verify_payload(header, @body, @secret) + end + + test "rejects a missing header" do + assert {:error, :not_signed} = Signature.verify_payload("", @body, @secret) + assert {:error, :not_signed} = Signature.verify_payload(nil, @body, @secret) + end + + test "rejects a timestamp outside the tolerance" do + stale_ms = System.system_time(:millisecond) - :timer.minutes(10) + header = signed_header(@body, stale_ms) + + assert {:error, :outside_tolerance} = Signature.verify_payload(header, @body, @secret) + end + + test "accepts an old timestamp within a custom tolerance" do + stale_ms = System.system_time(:millisecond) - :timer.minutes(10) + header = signed_header(@body, stale_ms) + + assert {:ok, @body} = + Signature.verify_payload(header, @body, @secret, tolerance: 3600) + end + + test "parse_signature_header extracts timestamp and signature" do + assert {:ok, "1700000000000", "abc123"} = + Signature.parse_signature_header("t=1700000000000, v1=abc123") + + assert {:ok, "1700000000000", "abc123"} = + Signature.parse_signature_header("t=1700000000000,v1=abc123") + + assert {:error, :invalid_header} = Signature.parse_signature_header("t=17, nonsense") + assert {:error, :invalid_header} = Signature.parse_signature_header("v1=abc123") + assert {:error, :not_signed} = Signature.parse_signature_header("") + end + + test "rejects a non-numeric timestamp" do + assert {:error, :invalid_timestamp} = + Signature.verify_payload("t=soon, v1=abc", @body, @secret) + end + + test "compute_signature produces lowercase hex HMAC-SHA256" do + signature = Signature.compute_signature(@secret, "1700000000000", @body) + + assert String.length(signature) == 64 + assert signature == String.downcase(signature) + + expected = + :hmac + |> :crypto.mac(:sha256, @secret, "1700000000000.#{@body}") + |> Base.encode16(case: :lower) + + assert signature == expected + end +end diff --git a/test/workos/webhooks_round_trip_test.exs b/test/workos/webhooks_round_trip_test.exs new file mode 100644 index 00000000..ccf83cf8 --- /dev/null +++ b/test/workos/webhooks_round_trip_test.exs @@ -0,0 +1,52 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.WebhooksRoundTripTest do + use ExUnit.Case, async: true + + test "WebhookEndpoint round-trips between wire and struct" do + data = %{ + "object" => "webhook_endpoint", + "id" => "id", + "endpoint_url" => "endpoint_url", + "secret" => "secret", + "status" => "enabled", + "events" => ["events"], + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z" + } + + serialized = data |> WorkOS.WebhookEndpoint.from_map() |> WorkOS.WebhookEndpoint.to_map() + assert serialized == data + + assert serialized |> WorkOS.WebhookEndpoint.from_map() |> WorkOS.WebhookEndpoint.to_map() == + serialized + end + + test "WebhookEndpointList round-trips between wire and struct" do + data = %{ + "object" => "list", + "data" => [ + %{ + "object" => "webhook_endpoint", + "id" => "id", + "endpoint_url" => "endpoint_url", + "secret" => "secret", + "status" => "enabled", + "events" => ["events"], + "created_at" => "2024-01-01T00:00:00.000Z", + "updated_at" => "2024-01-01T00:00:00.000Z" + } + ], + "list_metadata" => %{"before" => "before", "after" => "after"} + } + + serialized = + data |> WorkOS.WebhookEndpointList.from_map() |> WorkOS.WebhookEndpointList.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.WebhookEndpointList.from_map() + |> WorkOS.WebhookEndpointList.to_map() == serialized + end +end diff --git a/test/workos/webhooks_test.exs b/test/workos/webhooks_test.exs index 1b582c95..0183b347 100644 --- a/test/workos/webhooks_test.exs +++ b/test/workos/webhooks_test.exs @@ -1,149 +1,103 @@ +# This file is auto-generated by oagen. Do not edit. + defmodule WorkOS.WebhooksTest do - use ExUnit.Case - - alias WorkOS.Webhooks - - @secret "secret" - @timestamp DateTime.utc_now() |> DateTime.add(30) |> DateTime.to_unix(:millisecond) - @payload """ - {"id": "wh_123","data":{"id":"directory_user_01FAEAJCR3ZBZ30D8BD1924TVG","state":"active","emails":[{"type":"work","value":"blair@foo-corp.com","primary":true}],"idp_id":"00u1e8mutl6wlH3lL4x7","object":"directory_user","username":"blair@foo-corp.com","last_name":"Lunchford","first_name":"Blair","job_title":"Software Engineer","directory_id":"directory_01F9M7F68PZP8QXP8G7X5QRHS7","raw_attributes":{"name":{"givenName":"Blair","familyName":"Lunchford","middleName":"Elizabeth","honorificPrefix":"Ms."},"title":"Software Engineer","active":true,"emails":[{"type":"work","value":"blair@foo-corp.com","primary":true}],"groups":[],"locale":"en-US","schemas":["urn:ietf:params:scim:schemas:core:2.0:User","urn:ietf:params:scim:schemas:extension:enterprise:2.0:User"],"userName":"blair@foo-corp.com","addresses":[{"region":"CA","primary":true,"locality":"San Francisco","postalCode":"94016"}],"externalId":"00u1e8mutl6wlH3lL4x7","displayName":"Blair Lunchford","urn:ietf:params:scim:schemas:extension:enterprise:2.0:User":{"manager":{"value":"2","displayName":"Kate Chapman"},"division":"Engineering","department":"Customer Success"}}},"event":"dsync.user.created"} - """ - @unhashed_string "#{@timestamp}.#{@payload}" - @signature_hash :crypto.mac(:hmac, :sha256, @secret, @unhashed_string) - |> Base.encode16(case: :lower) - @expectated_data_map %{ - id: "directory_user_01FAEAJCR3ZBZ30D8BD1924TVG", - state: "active", - emails: [ - %{ - type: "work", - value: "blair@foo-corp.com", - primary: true - } - ], - idp_id: "00u1e8mutl6wlH3lL4x7", - object: "directory_user", - username: "blair@foo-corp.com", - last_name: "Lunchford", - first_name: "Blair", - job_title: "Software Engineer", - directory_id: "directory_01F9M7F68PZP8QXP8G7X5QRHS7", - raw_attributes: %{ - name: %{ - givenName: "Blair", - familyName: "Lunchford", - middleName: "Elizabeth", - honorificPrefix: "Ms." - }, - title: "Software Engineer", - active: true, - emails: [ - %{ - type: "work", - value: "blair@foo-corp.com", - primary: true - } - ], - groups: [], - locale: "en-US", - schemas: [ - "urn:ietf:params:scim:schemas:core:2.0:User", - "urn:ietf:params:scim:schemas:extension:enterprise:2.0:User" - ], - userName: "blair@foo-corp.com", - addresses: [ - %{ - region: "CA", - primary: true, - locality: "San Francisco", - postalCode: "94016" - } - ], - externalId: "00u1e8mutl6wlH3lL4x7", - displayName: "Blair Lunchford", - "urn:ietf:params:scim:schemas:extension:enterprise:2.0:User": %{ - manager: %{ - value: "2", - displayName: "Kate Chapman" - }, - division: "Engineering", - department: "Customer Success" - } - } - } - - describe "construct_event/4 - valid inputs" do - setup do - %{sig_header: "t=#{@timestamp}, v1=#{@signature_hash}"} - end - - test "returns a webhook event with a valid payload, sig_header, and secret", %{ - sig_header: sig_header - } do - {:ok, %WorkOS.Webhooks.Event{} = webhook} = - Webhooks.construct_event(@payload, sig_header, @secret) - - assert webhook.data == @expectated_data_map - assert webhook.event == "dsync.user.created" - assert webhook.id == "wh_123" - end - - test "returns a webhook event with a valid payload, sig_header, secret, and tolerance", %{ - sig_header: sig_header - } do - {:ok, webhook} = Webhooks.construct_event(@payload, sig_header, @secret, 100) - - assert webhook.data == @expectated_data_map - assert webhook.event == "dsync.user.created" - assert webhook.id == "wh_123" - end + use ExUnit.Case, async: true + + setup do + client = + WorkOS.Client.new( + api_key: "sk_test_key", + req_options: [plug: {Req.Test, WorkOS.Client}] + ) + + {:ok, client: client} + end + + test "list_webhook_endpoints succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "GET" + assert conn.request_path == "/webhook_endpoints" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("webhooks/list_webhook_endpoints")) + end) + + assert {:ok, %WorkOS.Page{data: [%WorkOS.WebhookEndpointList{object: "list"} | _]}} = + WorkOS.Webhooks.list_webhook_endpoints(client) end - describe "construct_event/4 - invalid inputs" do - setup do - %{sig_header: "t=#{@timestamp}, v1=#{@signature_hash}"} - end + test "list_webhook_endpoints handles an empty page", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + Req.Test.json(conn, %{"data" => [], "list_metadata" => %{"after" => nil}}) + end) - test "returns an error with an empty header" do - empty_sig_header = "" + assert {:ok, %WorkOS.Page{data: []} = page} = WorkOS.Webhooks.list_webhook_endpoints(client) + refute WorkOS.Page.has_more?(page) + assert page |> WorkOS.Page.stream() |> Enum.to_list() == [] + end - assert {:error, "Signature or timestamp missing"} == - Webhooks.construct_event(@payload, empty_sig_header, @secret) - end + test "create_webhook_endpoint succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/webhook_endpoints" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("webhooks/create_webhook_endpoint")) + end) - test "returns an error with an empty signature hash" do - missing_sig_hash = "t=#{@timestamp}, v1=" + assert {:ok, %WorkOS.WebhookEndpoint{object: "webhook_endpoint", id: "id"}} = + WorkOS.Webhooks.create_webhook_endpoint(client) + end - assert {:error, "Signature or timestamp missing"} == - Webhooks.construct_event(@payload, missing_sig_hash, @secret) - end + test "update_webhook_endpoint succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "PATCH" + assert conn.request_path == "/webhook_endpoints/test_id" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("webhooks/update_webhook_endpoint")) + end) - test "returns an error with an incorrect signature hash" do - incorrect_sig_hash = "t=#{@timestamp}, v1=99999" + assert {:ok, %WorkOS.WebhookEndpoint{object: "webhook_endpoint", id: "id"}} = + WorkOS.Webhooks.update_webhook_endpoint(client, "test_id") + end - assert {:error, "Signature hash does not match the expected signature hash for payload"} == - Webhooks.construct_event(@payload, incorrect_sig_hash, @secret) - end + test "delete_webhook_endpoint succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "DELETE" + assert conn.request_path == "/webhook_endpoints/test_id" + Plug.Conn.send_resp(conn, 204, "") + end) - test "returns an error with an incorrect payload", %{sig_header: sig_header} do - invalid_payload = "invalid" + assert {:ok, _} = WorkOS.Webhooks.delete_webhook_endpoint(client, "test_id") + end - assert {:error, "Signature hash does not match the expected signature hash for payload"} == - Webhooks.construct_event(invalid_payload, sig_header, @secret) - end + test "list_webhook_endpoints encodes query parameters", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + params = Plug.Conn.fetch_query_params(conn).query_params + assert params["before"] == "hello world&x" + refute Map.has_key?(params, "after") + Req.Test.json(conn, %{"data" => [], "list_metadata" => %{"after" => nil}}) + end) - test "returns an error with an incorrect secret", %{sig_header: sig_header} do - invalid_secret = "invalid" + assert {:ok, _} = WorkOS.Webhooks.list_webhook_endpoints(client, %{before: "hello world&x"}) + end - assert {:error, "Signature hash does not match the expected signature hash for payload"} == - Webhooks.construct_event(@payload, sig_header, invalid_secret) - end + test "list_webhook_endpoints honors per-request options", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert Plug.Conn.get_req_header(conn, "x-custom") == ["value"] + assert conn.host == "override.example.com" + Plug.Conn.send_resp(conn, 204, "") + end) + + WorkOS.Webhooks.list_webhook_endpoints(client, %{}, + headers: [{"x-custom", "value"}], + base_url: "https://override.example.com" + ) + end - test "returns an error with a timestamp outside tolerance" do - sig_header = "t=9999, v1=#{@signature_hash}" + test "surfaces API errors as tagged tuples", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + conn + |> Plug.Conn.put_status(401) + |> Req.Test.json(%{"message" => "Unauthorized"}) + end) - assert {:error, "Timestamp outside the tolerance zone"} == - Webhooks.construct_event(@payload, sig_header, @secret) - end + assert {:error, %WorkOS.ApiError{status: 401}} = + WorkOS.Webhooks.list_webhook_endpoints(client) end end diff --git a/test/workos/widgets_round_trip_test.exs b/test/workos/widgets_round_trip_test.exs new file mode 100644 index 00000000..bc7e3f93 --- /dev/null +++ b/test/workos/widgets_round_trip_test.exs @@ -0,0 +1,20 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.WidgetsRoundTripTest do + use ExUnit.Case, async: true + + test "WidgetSessionTokenResponse round-trips between wire and struct" do + data = %{"token" => "token"} + + serialized = + data + |> WorkOS.WidgetSessionTokenResponse.from_map() + |> WorkOS.WidgetSessionTokenResponse.to_map() + + assert serialized == data + + assert serialized + |> WorkOS.WidgetSessionTokenResponse.from_map() + |> WorkOS.WidgetSessionTokenResponse.to_map() == serialized + end +end diff --git a/test/workos/widgets_test.exs b/test/workos/widgets_test.exs new file mode 100644 index 00000000..8af16734 --- /dev/null +++ b/test/workos/widgets_test.exs @@ -0,0 +1,49 @@ +# This file is auto-generated by oagen. Do not edit. + +defmodule WorkOS.WidgetsTest do + use ExUnit.Case, async: true + + setup do + client = + WorkOS.Client.new( + api_key: "sk_test_key", + req_options: [plug: {Req.Test, WorkOS.Client}] + ) + + {:ok, client: client} + end + + test "create_token succeeds", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert conn.method == "POST" + assert conn.request_path == "/widgets/token" + Req.Test.json(conn, WorkOS.TestFixtures.fixture("widgets/create_token")) + end) + + assert {:ok, %WorkOS.WidgetSessionTokenResponse{token: "token"}} = + WorkOS.Widgets.create_token(client) + end + + test "create_token honors per-request options", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + assert Plug.Conn.get_req_header(conn, "x-custom") == ["value"] + assert conn.host == "override.example.com" + Plug.Conn.send_resp(conn, 204, "") + end) + + WorkOS.Widgets.create_token(client, %{}, + headers: [{"x-custom", "value"}], + base_url: "https://override.example.com" + ) + end + + test "surfaces API errors as tagged tuples", %{client: client} do + Req.Test.stub(WorkOS.Client, fn conn -> + conn + |> Plug.Conn.put_status(401) + |> Req.Test.json(%{"message" => "Unauthorized"}) + end) + + assert {:error, %WorkOS.ApiError{status: 401}} = WorkOS.Widgets.create_token(client) + end +end diff --git a/test/workos_test.exs b/test/workos_test.exs deleted file mode 100755 index 1d70be5c..00000000 --- a/test/workos_test.exs +++ /dev/null @@ -1,3 +0,0 @@ -defmodule WorkOSTest do - use ExUnit.Case -end